2 Utils/mixins related to accessing the stack S3 bucket. 15 """ State and config for a stack. This wraps the single object kept in 16 the stacks S3 bucket. """ 18 default_region =
'us-west-2' 20 def __init__(self, s3_obj):
26 except botocore.exceptions.ClientError
as e:
27 if e.response[
'Error'][
'Code'] !=
"NoSuchKey":
30 for key, val
in data[
'Metadata'].items():
32 setattr(self, key, val)
33 for key, val
in json.loads(data[
'Body'].read().decode()).items():
35 setattr(self, key, val)
42 except AttributeError:
46 def region(self, value):
49 def set(self, key, value, meta=False):
50 """ Use for new object creation to track a key. """ 53 setattr(self, key, value)
55 def unset(self, key, meta=False):
56 '''Use to remove keys from meta and regular keys''' 61 setattr(self, key,
None)
63 def gen_passphrase_hash(self, passphrase):
64 return hashlib.sha256(passphrase.encode()).hexdigest()
66 def save(self, changelog=None, passphrase=None):
68 return self.
_save(changelog)
70 def _save(self, changelog=None):
71 if changelog
is not None:
72 self.changelog.append({
73 "ts": base.localnow().isoformat(),
75 "operator": os.environ[
"OPERATOR_IDENT"]
77 meta = dict((x, getattr(self, x))
for x
in self.
_meta_keys)
78 body = dict((x, getattr(self, x))
for x
in self.
_body_keys)
79 self.
_s3_obj.put(Body=json.dumps(body), Metadata=meta,
80 ContentType=
'application/json')
83 """ Parse old tuple format and newer dict format. """ 89 return [entry
if isinstance(entry, dict)
else to_dict(entry)
90 for entry
in self.changelog]
92 def check_passphrase(self, passphrase=None):
93 if self._passphrase_hash:
94 if passphrase
is None:
95 passphrase = getpass.getpass(
"Passphrase: ")
97 if self._passphrase_hash != passhash:
98 raise SystemExit(
"Invalid Passphrase")
101 def delete(self, passphrase=None):
106 """ A resource is an AWS asset that we need to track. """ 108 raise ValueError(
'Duplicate resource: %s %s' % (kind, ident))
109 self.resources.append({
116 def has_resource(self, kind, ident):
117 for x
in self.resources:
118 if x[
'kind'] == kind
and x[
'ident'] == ident:
122 def update_state(self, state):
129 stacks_bucket =
'homecu.odyssey.stacks' 131 def prerun(self, *args, **kwargs):
132 s3_res = boto3.resource(
's3')
134 super().prerun(*args, **kwargs)
137 """ Load a tracker object from S3. If the file does not exist just 139 stack_obj = self.
stacks.Object(name)
142 except botocore.exceptions.ClientError
as e:
143 if e.response[
'Error'][
'Code'] !=
"404":
def gen_passphrase_hash(self, passphrase)
def _save(self, changelog=None)
def check_passphrase(self, passphrase=None)
def has_resource(self, kind, ident)
def add_resource(self, kind, ident, **options)
def set(self, key, value, meta=False)
def unset(self, key, meta=False)
def get_stack(self, name)