diff --git a/armada/handlers/armada.py b/armada/handlers/armada.py index 4f1cfbce..d744dd71 100644 --- a/armada/handlers/armada.py +++ b/armada/handlers/armada.py @@ -140,15 +140,15 @@ class Armada(object): details=','.join([m.get('message') for m in msg_list])) # Purge known releases that have failed and are in the current yaml - prefix = self.manifest.get(const.KEYWORD_ARMADA).get( - const.KEYWORD_PREFIX) + armada_data = self.manifest.get(const.KEYWORD_ARMADA, {}) + prefix = armada_data.get(const.KEYWORD_PREFIX, '') failed_releases = self.get_releases_by_status(const.STATUS_FAILED) + for release in failed_releases: - for group in self.manifest.get(const.KEYWORD_ARMADA).get( - const.KEYWORD_GROUPS): - for ch in group.get(const.KEYWORD_CHARTS): + for group in armada_data.get(const.KEYWORD_GROUPS, []): + for ch in group.get(const.KEYWORD_CHARTS, []): ch_release_name = release_prefix( - prefix, ch.get('chart').get('chart_name')) + prefix, ch.get('chart', {}).get('chart_name')) if release[0] == ch_release_name: LOG.info('Purging failed release %s ' 'before deployment', release[0]) @@ -159,12 +159,11 @@ class Armada(object): # We only support a git source type right now, which can also # handle git:// local paths as well repos = {} - for group in self.manifest.get(const.KEYWORD_ARMADA).get( - const.KEYWORD_GROUPS): - for ch in group.get(const.KEYWORD_CHARTS): + for group in armada_data.get(const.KEYWORD_GROUPS, []): + for ch in group.get(const.KEYWORD_CHARTS, []): self.tag_cloned_repo(ch, repos) - for dep in ch.get('chart').get('dependencies'): + for dep in ch.get('chart', {}).get('dependencies', []): self.tag_cloned_repo(dep, repos) def tag_cloned_repo(self, ch, repos): @@ -242,9 +241,13 @@ class Armada(object): # extract known charts on tiller right now known_releases = self.tiller.list_charts() - prefix = self.manifest.get(const.KEYWORD_ARMADA).get( - const.KEYWORD_PREFIX) + armada_data = self.manifest.get(const.KEYWORD_ARMADA, {}) + prefix = armada_data.get(const.KEYWORD_PREFIX, '') + # TODO(fmontei): This is a useless exception that is probably never + # thrown as `known_releases` is a list and the proper behavior here + # should be to return early. Fix this once all side effects of + # correcting this are well understood. if known_releases is None: raise armada_exceptions.KnownReleasesException() @@ -252,21 +255,20 @@ class Armada(object): LOG.debug("Release %s, Version %s found on Tiller", release[0], release[1]) - for entry in self.manifest[const.KEYWORD_ARMADA][const.KEYWORD_GROUPS]: - + for group in armada_data.get(const.KEYWORD_GROUPS, []): tiller_should_wait = self.tiller_should_wait tiller_timeout = self.tiller_timeout - desc = entry.get('description', 'A Chart Group') - chart_groups = entry.get(const.KEYWORD_CHARTS, []) - test_charts = entry.get('test_charts', False) + desc = group.get('description', 'A Chart Group') + charts = group.get(const.KEYWORD_CHARTS, []) + test_charts = group.get('test_charts', False) - if entry.get('sequenced', False) or test_charts: + if group.get('sequenced', False) or test_charts: tiller_should_wait = True LOG.info('Deploying: %s', desc) - for chartgroup in chart_groups: - chart = chartgroup.get('chart', {}) + for chart in charts: + chart = chart.get('chart', {}) values = chart.get('values', {}) test_chart = chart.get('test', False) namespace = chart.get('namespace', None) @@ -288,7 +290,7 @@ class Armada(object): # (caution: it always default to 3600, # take care to differentiate user input) if tiller_should_wait and tiller_timeout == DEFAULT_TIMEOUT: - tiller_timeout = chart.get('timeout', tiller_timeout) + tiller_timeout = chart.get('timeout', tiller_timeout) wait_values = chart.get('wait', {}) wait_timeout = wait_values.get('timeout', tiller_timeout) wait_values_labels = wait_values.get('labels', {}) @@ -430,11 +432,14 @@ class Armada(object): Operations to run after deployment process has terminated ''' # Delete temp dirs used for deployment - for group in self.manifest.get(const.KEYWORD_ARMADA).get( - const.KEYWORD_GROUPS): - for ch in group.get(const.KEYWORD_CHARTS): - if ch.get('chart').get('source').get('type') == 'git': - source.source_cleanup(ch.get('chart').get('source_dir')[0]) + for group in self.manifest.get(const.KEYWORD_ARMADA, {}).get( + const.KEYWORD_GROUPS, []): + for ch in group.get(const.KEYWORD_CHARTS, []): + chart = ch.get('chart', {}) + if chart.get('source', {}).get('type') == 'git': + source_dir = chart.get('source_dir') + if isinstance(source_dir, tuple) and source_dir: + source.source_cleanup(source_dir[0]) def show_diff(self, chart, installed_chart, installed_values, target_chart, target_values, msg): diff --git a/armada/handlers/manifest.py b/armada/handlers/manifest.py index 4bdbf6b6..b923d280 100644 --- a/armada/handlers/manifest.py +++ b/armada/handlers/manifest.py @@ -160,13 +160,14 @@ class Manifest(object): """ try: dep = None - for iter, dep in enumerate(chart.get('data').get('dependencies')): + chart_dependencies = chart.get('data', {}).get('dependencies', []) + for iter, dep in enumerate(chart_dependencies): if isinstance(dep, dict): continue chart_dep = self.find_chart_document(dep) self.build_chart_deps(chart_dep) chart['data']['dependencies'][iter] = { - 'chart': chart_dep.get('data') + 'chart': chart_dep.get('data', {}) } except Exception: raise exceptions.ManifestException( @@ -187,13 +188,13 @@ class Manifest(object): """ try: chart = None - for iter, chart in enumerate(chart_group.get('data').get( + for iter, chart in enumerate(chart_group.get('data', {}).get( 'chart_group', [])): if isinstance(chart, dict): continue chart_dep = self.find_chart_document(chart) chart_group['data']['chart_group'][iter] = { - 'chart': chart_dep.get('data') + 'chart': chart_dep.get('data', {}) } except Exception: raise exceptions.ManifestException( @@ -213,15 +214,15 @@ class Manifest(object): """ try: group = None - for iter, group in enumerate(self.manifest.get('data').get( + for iter, group in enumerate(self.manifest.get('data', {}).get( 'chart_groups', [])): if isinstance(group, dict): continue chart_grp = self.find_chart_group_document(group) # Add name to chart group - ch_grp_data = chart_grp.get('data') - ch_grp_data['name'] = chart_grp.get('metadata').get('name') + ch_grp_data = chart_grp.get('data', {}) + ch_grp_data['name'] = chart_grp.get('metadata', {}).get('name') self.manifest['data']['chart_groups'][iter] = ch_grp_data except Exception: @@ -244,5 +245,5 @@ class Manifest(object): self.build_armada_manifest() return { - 'armada': self.manifest.get('data') + 'armada': self.manifest.get('data', {}) } diff --git a/armada/handlers/override.py b/armada/handlers/override.py index 90a048d2..e2c12fbf 100644 --- a/armada/handlers/override.py +++ b/armada/handlers/override.py @@ -61,7 +61,7 @@ class Override(object): def find_manifest_document(self, doc_path): for doc in self.documents: if doc.get('schema') == self.find_document_type( - doc_path[0]) and doc.get('metadata').get( + doc_path[0]) and doc.get('metadata', {}).get( 'name') == doc_path[1]: return doc @@ -104,10 +104,9 @@ class Override(object): def override_manifest_value(self, doc_path, data_path, new_value): document = self.find_manifest_document(doc_path) new_data = self.array_to_dict(data_path, new_value) - self.update(document.get('data'), new_data) + self.update(document.get('data', {}), new_data) def update_document(self, merging_values): - for doc in merging_values: if doc.get('schema') == const.DOCUMENT_CHART: self.update_chart_document(doc) @@ -119,22 +118,25 @@ class Override(object): def update_chart_document(self, ovr): for doc in self.documents: if doc.get('schema') == const.DOCUMENT_CHART and doc.get( - 'metadata').get('name') == ovr.get('metadata').get('name'): - self.update(doc.get('data'), ovr.get('data')) + 'metadata', {}).get('name') == ovr.get('metadata', {}).get( + 'name'): + self.update(doc.get('data', {}), ovr.get('data', {})) return def update_chart_group_document(self, ovr): for doc in self.documents: if doc.get('schema') == const.DOCUMENT_GROUP and doc.get( - 'metadata').get('name') == ovr.get('metadata').get('name'): - self.update(doc.get('data'), ovr.get('data')) + 'metadata', {}).get('name') == ovr.get('metadata', {}).get( + 'name'): + self.update(doc.get('data', {}), ovr.get('data', {})) return def update_armada_manifest(self, ovr): for doc in self.documents: if doc.get('schema') == const.DOCUMENT_MANIFEST and doc.get( - 'metadata').get('name') == ovr.get('metadata').get('name'): - self.update(doc.get('data'), ovr.get('data')) + 'metadata', {}).get('name') == ovr.get('metadata', {}).get( + 'name'): + self.update(doc.get('data', {}), ovr.get('data', {})) return def update_manifests(self):