Index: boto/roboto/awsqueryservice.py |
diff --git a/boto/roboto/awsqueryservice.py b/boto/roboto/awsqueryservice.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0ca78c2d7f9268733d59b7feaf237b14c3d21ed7 |
--- /dev/null |
+++ b/boto/roboto/awsqueryservice.py |
@@ -0,0 +1,121 @@ |
+import os |
+import urlparse |
+import boto |
+import boto.connection |
+import boto.jsonresponse |
+import boto.exception |
+import awsqueryrequest |
+ |
+class NoCredentialsError(boto.exception.BotoClientError): |
+ |
+ def __init__(self): |
+ s = 'Unable to find credentials' |
+ boto.exception.BotoClientError.__init__(self, s) |
+ |
+class AWSQueryService(boto.connection.AWSQueryConnection): |
+ |
+ Name = '' |
+ Description = '' |
+ APIVersion = '' |
+ Authentication = 'sign-v2' |
+ Path = '/' |
+ Port = 443 |
+ Provider = 'aws' |
+ EnvURL = 'AWS_URL' |
+ |
+ Regions = [] |
+ |
+ def __init__(self, **args): |
+ self.args = args |
+ self.check_for_credential_file() |
+ self.check_for_env_url() |
+ if 'host' not in self.args: |
+ if self.Regions: |
+ region_name = self.args.get('region_name', |
+ self.Regions[0]['name']) |
+ for region in self.Regions: |
+ if region['name'] == region_name: |
+ self.args['host'] = region['endpoint'] |
+ if 'path' not in self.args: |
+ self.args['path'] = self.Path |
+ if 'port' not in self.args: |
+ self.args['port'] = self.Port |
+ try: |
+ boto.connection.AWSQueryConnection.__init__(self, **self.args) |
+ self.aws_response = None |
+ except boto.exception.NoAuthHandlerFound: |
+ raise NoCredentialsError() |
+ |
+ def check_for_credential_file(self): |
+ """ |
+ Checks for the existance of an AWS credential file. |
+ If the environment variable AWS_CREDENTIAL_FILE is |
+ set and points to a file, that file will be read and |
+ will be searched credentials. |
+ Note that if credentials have been explicitelypassed |
+ into the class constructor, those values always take |
+ precedence. |
+ """ |
+ if 'AWS_CREDENTIAL_FILE' in os.environ: |
+ path = os.environ['AWS_CREDENTIAL_FILE'] |
+ path = os.path.expanduser(path) |
+ path = os.path.expandvars(path) |
+ if os.path.isfile(path): |
+ fp = open(path) |
+ lines = fp.readlines() |
+ fp.close() |
+ for line in lines: |
+ if line[0] != '#': |
+ if '=' in line: |
+ name, value = line.split('=', 1) |
+ if name.strip() == 'AWSAccessKeyId': |
+ if 'aws_access_key_id' not in self.args: |
+ value = value.strip() |
+ self.args['aws_access_key_id'] = value |
+ elif name.strip() == 'AWSSecretKey': |
+ if 'aws_secret_access_key' not in self.args: |
+ value = value.strip() |
+ self.args['aws_secret_access_key'] = value |
+ else: |
+ print 'Warning: unable to read AWS_CREDENTIAL_FILE' |
+ |
+ def check_for_env_url(self): |
+ """ |
+ First checks to see if a url argument was explicitly passed |
+ in. If so, that will be used. If not, it checks for the |
+ existence of the environment variable specified in ENV_URL. |
+ If this is set, it should contain a fully qualified URL to the |
+ service you want to use. |
+ Note that any values passed explicitly to the class constructor |
+ will take precedence. |
+ """ |
+ url = self.args.get('url', None) |
+ if url: |
+ del self.args['url'] |
+ if not url and self.EnvURL in os.environ: |
+ url = os.environ[self.EnvURL] |
+ if url: |
+ rslt = urlparse.urlparse(url) |
+ if 'is_secure' not in self.args: |
+ if rslt.scheme == 'https': |
+ self.args['is_secure'] = True |
+ else: |
+ self.args['is_secure'] = False |
+ |
+ host = rslt.netloc |
+ port = None |
+ l = host.split(':') |
+ if len(l) > 1: |
+ host = l[0] |
+ port = int(l[1]) |
+ if 'host' not in self.args: |
+ self.args['host'] = host |
+ if port and 'port' not in self.args: |
+ self.args['port'] = port |
+ |
+ if rslt.path and 'path' not in self.args: |
+ self.args['path'] = rslt.path |
+ |
+ def _required_auth_capability(self): |
+ return [self.Authentication] |
+ |