arq_restore/cocoastack/aws/AWSRegion.m
2014-07-28 14:20:07 -04:00

340 lines
14 KiB
Objective-C

//
// Created by Stefan Reitshamer on 9/23/12.
//
//
#import "AWSRegion.h"
#import "RegexKitLite.h"
@implementation AWSRegion
+ (NSArray *)allRegions {
return [NSArray arrayWithObjects:
[AWSRegion usEast1],
[AWSRegion usWest1],
[AWSRegion usWest2],
[AWSRegion euWest1],
[AWSRegion apSoutheast1],
[AWSRegion apSoutheast2],
[AWSRegion apNortheast1],
[AWSRegion saEast1],
nil];
}
+ (NSArray *)s3Regions {
return [AWSRegion allRegions];
}
+ (NSArray *)glacierRegions {
NSMutableArray *ret = [NSMutableArray array];
for (AWSRegion *region in [AWSRegion allRegions]) {
if ([region supportsGlacier]) {
[ret addObject:region];
}
}
return ret;
}
+ (AWSRegion *)regionWithName:(NSString *)theRegionName {
for (AWSRegion *region in [AWSRegion allRegions]) {
if ([[region regionName] isEqualToString:theRegionName]) {
return region;
}
}
return nil;
}
+ (AWSRegion *)regionWithLocation:(NSString *)theLocation {
if ([theLocation length] == 0) {
return [AWSRegion usEast1];
}
for (AWSRegion *region in [AWSRegion allRegions]) {
for (NSString *constraint in [region s3LocationConstraints]) {
if ([constraint caseInsensitiveCompare:theLocation] == NSOrderedSame) {
return region;
}
}
}
HSLogDebug(@"no AWS region found for location %@", theLocation);
return nil;
}
+ (AWSRegion *)regionWithS3Endpoint:(NSURL *)theEndpoint {
if (![[theEndpoint scheme] isEqualToString:@"https"] && ![[theEndpoint scheme] isEqualToString:@"http"]) {
// HSLogDebug(@"unknown AWSRegion endpoint scheme: %@", theEndpoint);
return nil;
}
for (AWSRegion *region in [AWSRegion allRegions]) {
NSURL *endpoint = [region s3EndpointWithSSL:YES];
if ([[theEndpoint host] isEqualToString:[endpoint host]]) {
return region;
}
}
// HSLogDebug(@"AWSRegion not found for S3 endpoint %@", theEndpoint);
return nil;
}
+ (AWSRegion *)usEast1 {
return [[[AWSRegion alloc] initWithRegionName:@"us-east-1"
s3LocationConstraints:nil
s3Hostname:@"s3.amazonaws.com"
displayName:@"US East (Northern Virginia)"
shortDisplayName:@"N. Virginia"
s3StorageDollarsPerGBMonthStandard:.030
s3StorageDollarsPerGBMonthRRS:.024
s3UploadDollarsPerGB:.005
s3DataTransferOutDollarsPerGB:.12
glacierStorageDollarsPerGBMonth:.01
glacierUploadDollarsPerGB:.05
glacierDataTransferOutDollarsPerGB:.12
supportsGlacier:YES] autorelease];
}
+ (AWSRegion *)usWest1 {
return [[[AWSRegion alloc] initWithRegionName:@"us-west-1"
s3LocationConstraints:[NSArray arrayWithObject:@"us-west-1"]
s3Hostname:@"s3-us-west-1.amazonaws.com"
displayName:@"US West (Northern California)"
shortDisplayName:@"N. California"
s3StorageDollarsPerGBMonthStandard:.033
s3StorageDollarsPerGBMonthRRS:.0264
s3UploadDollarsPerGB:.0055
s3DataTransferOutDollarsPerGB:.12
glacierStorageDollarsPerGBMonth:.011
glacierUploadDollarsPerGB:.055
glacierDataTransferOutDollarsPerGB:.12
supportsGlacier:YES] autorelease];
}
+ (AWSRegion *)usWest2 {
return [[[AWSRegion alloc] initWithRegionName:@"us-west-2"
s3LocationConstraints:[NSArray arrayWithObject:@"us-west-2"]
s3Hostname:@"s3-us-west-2.amazonaws.com"
displayName:@"US West (Oregon)"
shortDisplayName:@"Oregon"
s3StorageDollarsPerGBMonthStandard:.030
s3StorageDollarsPerGBMonthRRS:.024
s3UploadDollarsPerGB:.005
s3DataTransferOutDollarsPerGB:.12
glacierStorageDollarsPerGBMonth:.01
glacierUploadDollarsPerGB:.05
glacierDataTransferOutDollarsPerGB:.12
supportsGlacier:YES] autorelease];
}
+ (AWSRegion *)euWest1 {
return [[[AWSRegion alloc] initWithRegionName:@"eu-west-1"
s3LocationConstraints:[NSArray arrayWithObjects:@"EU", @"eu-west-1", nil]
s3Hostname:@"s3-eu-west-1.amazonaws.com"
displayName:@"EU (Ireland)"
shortDisplayName:@"Ireland"
s3StorageDollarsPerGBMonthStandard:.030
s3StorageDollarsPerGBMonthRRS:.024
s3UploadDollarsPerGB:.005
s3DataTransferOutDollarsPerGB:.12
glacierStorageDollarsPerGBMonth:.011
glacierUploadDollarsPerGB:.055
glacierDataTransferOutDollarsPerGB:.12
supportsGlacier:YES] autorelease];
}
+ (AWSRegion *)apSoutheast1 {
return [[[AWSRegion alloc] initWithRegionName:@"ap-southeast-1"
s3LocationConstraints:[NSArray arrayWithObject:@"ap-southeast-1"]
s3Hostname:@"s3-ap-southeast-1.amazonaws.com"
displayName:@"Asia Pacific (Singapore)"
shortDisplayName:@"Singapore"
s3StorageDollarsPerGBMonthStandard:.030
s3StorageDollarsPerGBMonthRRS:.024
s3UploadDollarsPerGB:.005
s3DataTransferOutDollarsPerGB:.19
glacierStorageDollarsPerGBMonth:0
glacierUploadDollarsPerGB:0
glacierDataTransferOutDollarsPerGB:0
supportsGlacier:NO] autorelease];
}
+ (AWSRegion *)apSoutheast2 {
return [[[AWSRegion alloc] initWithRegionName:@"ap-southeast-2"
s3LocationConstraints:[NSArray arrayWithObject:@"ap-southeast-2"]
s3Hostname:@"s3-ap-southeast-2.amazonaws.com"
displayName:@"Asia Pacific (Sydney)"
shortDisplayName:@"Sydney"
s3StorageDollarsPerGBMonthStandard:.033
s3StorageDollarsPerGBMonthRRS:.0264
s3UploadDollarsPerGB:.0055
s3DataTransferOutDollarsPerGB:.19
glacierStorageDollarsPerGBMonth:.012
glacierUploadDollarsPerGB:.06
glacierDataTransferOutDollarsPerGB:.19
supportsGlacier:YES] autorelease];
}
+ (AWSRegion *)apNortheast1 {
return [[[AWSRegion alloc] initWithRegionName:@"ap-northeast-1"
s3LocationConstraints:[NSArray arrayWithObject:@"ap-northeast-1"]
s3Hostname:@"s3-ap-northeast-1.amazonaws.com"
displayName:@"Asia Pacific (Tokyo)"
shortDisplayName:@"Tokyo"
s3StorageDollarsPerGBMonthStandard:.033
s3StorageDollarsPerGBMonthRRS:.0264
s3UploadDollarsPerGB:.005
s3DataTransferOutDollarsPerGB:.201
glacierStorageDollarsPerGBMonth:.012
glacierUploadDollarsPerGB:.06
glacierDataTransferOutDollarsPerGB:.201
supportsGlacier:YES] autorelease];
}
+ (AWSRegion *)saEast1 {
return [[[AWSRegion alloc] initWithRegionName:@"sa-east-1"
s3LocationConstraints:[NSArray arrayWithObject:@"sa-east-1"]
s3Hostname:@"s3-sa-east-1.amazonaws.com"
displayName:@"South America (Sao Paulo)"
shortDisplayName:@"Sao Paulo"
s3StorageDollarsPerGBMonthStandard:.0408
s3StorageDollarsPerGBMonthRRS:.0326
s3UploadDollarsPerGB:.007
s3DataTransferOutDollarsPerGB:.25
glacierStorageDollarsPerGBMonth:0
glacierUploadDollarsPerGB:0
glacierDataTransferOutDollarsPerGB:0
supportsGlacier:NO] autorelease];
}
- (void)dealloc {
[regionName release];
[s3LocationConstraints release];
[s3Hostname release];
[displayName release];
[shortDisplayName release];
[super dealloc];
}
- (NSString *)regionName {
return regionName;
}
- (NSString *)displayName {
return displayName;
}
- (NSString *)shortDisplayName {
return shortDisplayName;
}
- (NSString *)defaultS3LocationConstraint {
return [s3LocationConstraints lastObject];
}
- (NSArray *)s3LocationConstraints {
return s3LocationConstraints;
}
- (double)s3StorageDollarsPerGBMonthStandard {
return s3StorageDollarsPerGBMonthStandard;
}
- (double)s3StorageDollarsPerGBMonthRRS {
return s3StorageDollarsPerGBMonthRRS;
}
- (double)s3UploadDollarsPerGB {
return s3UploadDollarsPerGB;
}
- (double)s3DataTransferOutDollarsPerGB {
return s3DataTransferOutDollarsPerGB;
}
- (double)glacierStorageDollarsPerGBMonth {
return glacierStorageDollarsPerGBMonth;
}
- (double)glacierUploadDollarsPerGB {
return glacierUploadDollarsPerGB;
}
- (double)glacierDataTransferOutDollarsPerGB {
return glacierDataTransferOutDollarsPerGB;
}
- (NSURL *)s3EndpointWithSSL:(BOOL)useSSL {
return [NSURL URLWithString:[NSString stringWithFormat:@"http%@://%@", (useSSL ? @"s" : @""), s3Hostname]];
}
- (BOOL)supportsGlacier {
return supportsGlacier;
}
- (NSString *)glacierEndpointWithSSL:(BOOL)useSSL {
if (!supportsGlacier) {
return nil;
}
if (getenv("AWS_HOST")) {
return [NSString stringWithFormat:@"%s/aws/glacier", getenv("AWS_HOST")];
}
return [self endpointWithService:@"glacier" useSSL:useSSL];
}
- (NSString *)snsEndpointWithSSL:(BOOL)useSSL {
if (getenv("AWS_HOST")) {
return [NSString stringWithFormat:@"%s/aws/sns", getenv("AWS_HOST")];
}
return [self endpointWithService:@"sns" useSSL:useSSL];
}
- (NSString *)sqsEndpointWithSSL:(BOOL)useSSL {
if (getenv("AWS_HOST")) {
return [NSString stringWithFormat:@"%s/aws/sqs", getenv("AWS_HOST")];
}
return [self endpointWithService:@"sqs" useSSL:useSSL];
}
#pragma mark NSObject
- (NSString *)description {
return [NSString stringWithFormat:@"<AWSRegion %@>", regionName];
}
- (BOOL)isEqual:(id)other {
if (other == self) {
return YES;
}
if (other == nil || ![other isKindOfClass:[self class]]) {
return NO;
}
return [regionName isEqualToString:[(AWSRegion *)other regionName]];
}
- (NSUInteger)hash {
return [regionName hash];
}
#pragma mark NSCopying
- (id)copyWithZone:(NSZone *)zone {
return [[AWSRegion alloc] initWithRegionName:regionName
s3LocationConstraints:s3LocationConstraints
s3Hostname:s3Hostname
displayName:displayName
shortDisplayName:shortDisplayName
s3StorageDollarsPerGBMonthStandard:s3StorageDollarsPerGBMonthStandard
s3StorageDollarsPerGBMonthRRS:s3StorageDollarsPerGBMonthRRS
s3UploadDollarsPerGB:s3UploadDollarsPerGB
s3DataTransferOutDollarsPerGB:s3DataTransferOutDollarsPerGB
glacierStorageDollarsPerGBMonth:glacierStorageDollarsPerGBMonth
glacierUploadDollarsPerGB:glacierUploadDollarsPerGB
glacierDataTransferOutDollarsPerGB:glacierDataTransferOutDollarsPerGB
supportsGlacier:supportsGlacier];
}
#pragma mark internal
- (id)initWithRegionName:(NSString *)theRegionName
s3LocationConstraints:(NSArray *)theS3LocationConstraints
s3Hostname:(NSString *)theS3Hostname
displayName:(NSString *)theDisplayName
shortDisplayName:(NSString *)theShortDisplayName
s3StorageDollarsPerGBMonthStandard:(double)theS3StorageDollarsPerGBMonthStandard
s3StorageDollarsPerGBMonthRRS:(double)theS3StorageDollarsPerGBMonthRRS
s3UploadDollarsPerGB:(double)theS3UploadDollarsPerGB
s3DataTransferOutDollarsPerGB:(double)theS3DataTransferOutDollarsPerGB
glacierStorageDollarsPerGBMonth:(double)theGlacierStorageDollarsPerGBMonth
glacierUploadDollarsPerGB:(double)theGlacierUploadDollarsPerGB
glacierDataTransferOutDollarsPerGB:(double)theGlacierDataTransferOutDollarsPerGB
supportsGlacier:(BOOL)theSupportsGlacier {
if (self = [super init]) {
regionName = [theRegionName retain];
s3LocationConstraints = [theS3LocationConstraints retain];
s3Hostname = [theS3Hostname retain];
displayName = [theDisplayName retain];
shortDisplayName = [theShortDisplayName retain];
s3StorageDollarsPerGBMonthStandard = theS3StorageDollarsPerGBMonthStandard;
s3StorageDollarsPerGBMonthRRS = theS3StorageDollarsPerGBMonthRRS;
s3UploadDollarsPerGB = theS3UploadDollarsPerGB;
s3DataTransferOutDollarsPerGB = theS3DataTransferOutDollarsPerGB;
glacierStorageDollarsPerGBMonth = theGlacierStorageDollarsPerGBMonth;
glacierUploadDollarsPerGB = theGlacierUploadDollarsPerGB;
glacierDataTransferOutDollarsPerGB = theGlacierDataTransferOutDollarsPerGB;
supportsGlacier = theSupportsGlacier;
}
return self;
}
- (NSString *)endpointWithService:(NSString *)theServiceName useSSL:(BOOL)useSSL {
return [NSString stringWithFormat:@"http%@://%@.%@.amazonaws.com", (useSSL ? @"s" : @""), theServiceName, regionName];
}
@end