/
verify.py
94 lines (77 loc) · 2.88 KB
/
verify.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import boto3
from botocore.exceptions import ClientError
import random
import string
from hub.log import logger
class Verify(object):
def __init__(self, access_key, secret_key):
self.creds = {
'AWS_ACCESS_KEY_ID': access_key,
'AWS_SECRET_ACCESS_KEY': secret_key,
'BUCKET': ''
}
self.client = client = boto3.client(
's3',
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
region_name='us-east-1'
)
self.prefix = 'snark-hub'
def randomString(self, stringLength=6):
"""Generate a random string of fixed length """
letters = string.ascii_lowercase
return ''.join(random.choice(letters) for i in range(stringLength))
def verify_aws(self, bucket):
# check if AWS credentials have access to any snark-hub-... bucket
if not bucket:
bucket = self.lookup_hub_bucket()
bucket_name = bucket.replace(self.prefix, '')
# if still no bucket, then try to create one
if not bucket:
bucket = '{}'.format(self.randomString())
bucket_name = '{}-{}'.format(self.prefix, bucket)
# Create bucket or verify if it exists and have access
success = self.create_bucket(bucket_name)
if success:
self.creds['BUCKET'] = bucket_name
return True, self.creds
return False, None
def lookup_hub_bucket(self):
try:
response = self.client.list_buckets()
for bucket in response['Buckets']:
if 'snark-hub-' in bucket["Name"]:
return bucket["Name"]
except ClientError as e:
logger.error(e)
return None
def exist_bucket(self, bucket):
try:
response = self.client.list_buckets()
except ClientError as e:
logger.error(e)
return
for bucket in response['Buckets']:
if bucket["Name"] == bucket:
return bucket
return ''
def create_bucket(self, bucket_name, region=None):
"""Create an S3 bucket in a specified region
If a region is not specified, the bucket is created in the S3 default
region (us-east-1).
:param bucket_name: Bucket to create
:param region: String region to create bucket in, e.g., 'us-west-2'
:return: True if bucket created, else False
"""
# Create bucket
try:
if region is None:
self.client.create_bucket(Bucket=bucket_name)
else:
location = {'LocationConstraint': region}
self.client.create_bucket(Bucket=bucket_name,
CreateBucketConfiguration=location)
except ClientError as e:
logger.error(e)
return False
return True