QNZoneInfo.m 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. //
  2. // QNZoneInfo.m
  3. // QiniuSDK
  4. //
  5. // Created by yangsen on 2020/4/16.
  6. // Copyright © 2020 Qiniu. All rights reserved.
  7. //
  8. #import "QNZoneInfo.h"
  9. static NSString *const zoneNames[] = {@"z0", @"z1", @"z2", @"as0", @"na0", @"unknown"};
  10. @interface QNZoneInfo()
  11. @property (nonatomic, assign) QNZoneInfoType type;
  12. @property (nonatomic, assign) QNZoneRegion zoneRegion;
  13. @property (nonatomic, assign) long ttl;
  14. @property (nonatomic, strong) NSDate *buildDate;
  15. @property (nonatomic, strong) NSMutableArray<NSString *> *upDomainsList;
  16. @property (nonatomic, strong) NSMutableDictionary *upDomainsDic;
  17. @end
  18. @implementation QNZoneInfo
  19. - (instancetype)init:(long)ttl
  20. upDomainsList:(NSMutableArray<NSString *> *)upDomainsList
  21. upDomainsDic:(NSMutableDictionary *)upDomainsDic
  22. zoneRegion:(QNZoneRegion)zoneRegion {
  23. if (self = [super init]) {
  24. _ttl = ttl;
  25. _buildDate = [NSDate date];
  26. _upDomainsList = upDomainsList;
  27. _upDomainsDic = upDomainsDic;
  28. _zoneRegion = zoneRegion;
  29. _type = QNZoneInfoTypeMain;
  30. }
  31. return self;
  32. }
  33. - (QNZoneInfo *)buildInfoFromJson:(NSDictionary *)resp {
  34. long ttl = [[resp objectForKey:@"ttl"] longValue];
  35. NSDictionary *up = [resp objectForKey:@"up"];
  36. NSDictionary *acc = [up objectForKey:@"acc"];
  37. NSDictionary *src = [up objectForKey:@"src"];
  38. NSDictionary *old_acc = [up objectForKey:@"old_acc"];
  39. NSDictionary *old_src = [up objectForKey:@"old_src"];
  40. NSArray *urlDicList = [[NSArray alloc] initWithObjects:acc, src, old_acc, old_src, nil];
  41. NSMutableArray *domainList = [[NSMutableArray alloc] init];
  42. NSMutableDictionary *domainDic = [[NSMutableDictionary alloc] init];
  43. //main
  44. for (int i = 0; i < urlDicList.count; i++) {
  45. if ([[urlDicList[i] allKeys] containsObject:@"main"]) {
  46. NSArray *mainDomainList = urlDicList[i][@"main"];
  47. for (int i = 0; i < mainDomainList.count; i++) {
  48. [domainList addObject:mainDomainList[i]];
  49. [domainDic setObject:[NSDate dateWithTimeIntervalSince1970:0] forKey:mainDomainList[i]];
  50. }
  51. }
  52. }
  53. //backup
  54. for (int i = 0; i < urlDicList.count; i++) {
  55. if ([[urlDicList[i] allKeys] containsObject:@"backup"]) {
  56. NSArray *mainDomainList = urlDicList[i][@"backup"];
  57. for (int i = 0; i < mainDomainList.count; i++) {
  58. [domainList addObject:mainDomainList[i]];
  59. [domainDic setObject:[NSDate dateWithTimeIntervalSince1970:0] forKey:mainDomainList[i]];
  60. }
  61. }
  62. }
  63. // judge zone region via io
  64. NSDictionary *io = [resp objectForKey:@"io"];
  65. NSDictionary *io_src = [io objectForKey:@"src"];
  66. NSArray *io_main = [io_src objectForKey:@"main"];
  67. NSString *io_host = io_main.count > 0 ? io_main[0] : nil;
  68. QNZoneRegion zoneRegion = QNZoneRegion_unknown;
  69. if ([io_host isEqualToString:@"iovip.qbox.me"]) {
  70. zoneRegion = QNZoneRegion_z0;
  71. } else if ([io_host isEqualToString:@"iovip-z1.qbox.me"]) {
  72. zoneRegion = QNZoneRegion_z1;
  73. } else if ([io_host isEqualToString:@"iovip-z2.qbox.me"]) {
  74. zoneRegion = QNZoneRegion_z2;
  75. } else if ([io_host isEqualToString:@"iovip-na0.qbox.me"]) {
  76. zoneRegion = QNZoneRegion_na0;
  77. } else if ([io_host isEqualToString:@"iovip-as0.qbox.me"]) {
  78. zoneRegion = QNZoneRegion_as0;
  79. } else {
  80. zoneRegion = QNZoneRegion_unknown;
  81. }
  82. return [[QNZoneInfo alloc] init:ttl upDomainsList:domainList upDomainsDic:domainDic zoneRegion:zoneRegion];
  83. }
  84. - (void)frozenDomain:(NSString *)domain {
  85. NSTimeInterval secondsFor10min = 10 * 60;
  86. NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow:secondsFor10min];
  87. [self.upDomainsDic setObject:tomorrow forKey:domain];
  88. }
  89. - (BOOL)isValid{
  90. NSDate *currentDate = [NSDate date];
  91. if (self.ttl > [currentDate timeIntervalSinceDate:self.buildDate]) {
  92. return YES;
  93. } else {
  94. return NO;
  95. }
  96. }
  97. @end
  98. @interface QNZonesInfo()
  99. @end
  100. @implementation QNZonesInfo
  101. - (instancetype)initWithZonesInfo:(NSArray<QNZoneInfo *> *)zonesInfo{
  102. self = [super init];
  103. if (self) {
  104. _zonesInfo = zonesInfo;
  105. }
  106. return self;
  107. }
  108. + (instancetype)buildZonesInfoWithResp:(NSDictionary *)resp {
  109. NSMutableArray *zonesInfo = [NSMutableArray array];
  110. NSArray *hosts = resp[@"hosts"];
  111. for (NSInteger i = 0; i < hosts.count; i++) {
  112. QNZoneInfo *zoneInfo = [[[QNZoneInfo alloc] init] buildInfoFromJson:hosts[i]];
  113. zoneInfo.type = i == 0 ? QNZoneInfoTypeMain : QNZoneInfoTypeBackup;
  114. [zonesInfo addObject:zoneInfo];
  115. }
  116. return [[[self class] alloc] initWithZonesInfo:zonesInfo];
  117. }
  118. - (QNZoneInfo *)getZoneInfoWithType:(QNZoneInfoType)type {
  119. QNZoneInfo *zoneInfo = nil;
  120. for (QNZoneInfo *info in _zonesInfo) {
  121. if (info.type == type) {
  122. zoneInfo = info;
  123. break;
  124. }
  125. }
  126. return zoneInfo;
  127. }
  128. - (NSString *)getZoneInfoRegionNameWithType:(QNZoneInfoType)type {
  129. QNZoneInfo *zoneInfo = [self getZoneInfoWithType:type];
  130. return zoneNames[zoneInfo.zoneRegion];
  131. }
  132. - (BOOL)hasBackupZone {
  133. return _zonesInfo.count > 1;
  134. }
  135. @end