diff --git a/armada/armada.py b/armada/armada.py index 6861e9e1..51e990b5 100644 --- a/armada/armada.py +++ b/armada/armada.py @@ -39,6 +39,8 @@ class Armada(object): # extract known charts on tiller right now known_releases = self.tiller.list_charts() + prefix = self.config.get('armada').get('release_prefix') + for release in known_releases: LOG.debug("Release %s, Version %s found on tiller", release[0], release[1]) @@ -95,12 +97,17 @@ class Armada(object): self.args.dry_run, chart.release_name, chart.namespace, + prefix, values=yaml.safe_dump(values)) LOG.debug("Cleaning up chart source in %s", chartbuilder.source_directory) chartbuilder.source_cleanup() + if self.args.enable_chart_cleanup: + self.tiller.chart_cleanup(prefix, self.config['armada']['charts'], + known_releases) + def show_diff(self, chart, installed_chart, installed_values, target_chart, target_values): ''' diff --git a/armada/tiller.py b/armada/tiller.py index 5bbe7e95..fa53080d 100644 --- a/armada/tiller.py +++ b/armada/tiller.py @@ -1,9 +1,11 @@ from hapi.services.tiller_pb2 import ReleaseServiceStub, ListReleasesRequest, \ - InstallReleaseRequest, UpdateReleaseRequest + InstallReleaseRequest, UpdateReleaseRequest, UninstallReleaseRequest from hapi.chart.config_pb2 import Config -from k8s import K8s import grpc +from logutil import LOG +from k8s import K8s + TILLER_PORT = 44134 TILLER_VERSION = b'2.1.3' TILLER_TIMEOUT = 300 @@ -110,7 +112,8 @@ class Tiller(object): return stub.UpdateRelease(release_request, self.timeout, metadata=self.metadata) - def install_release(self, chart, dry_run, name, namespace, values=None): + def install_release(self, chart, dry_run, name, namespace, prefix, + values=None): ''' Create a Helm Release ''' @@ -126,8 +129,44 @@ class Tiller(object): chart=chart, dry_run=dry_run, values=values, - name=name, + name="{}-{}".format(prefix, name), namespace=namespace) return stub.InstallRelease(release_request, self.timeout, metadata=self.metadata) + + def uninstall_release(self, release, disable_hooks=False, purge=True): + ''' + :params - release - helm chart release name + :params - purge - deep delete of chart + + deletes a helm chart from tiller + ''' + + # build release install request + stub = ReleaseServiceStub(self.channel) + release_request = UninstallReleaseRequest(name=release, + disable_hooks=disable_hooks, + purge=purge) + return stub.UninstallRelease(release_request, + self.timeout, + metadata=self.metadata) + + def chart_cleanup(self, prefix, charts, known_releases): + ''' + :params charts - list of yaml charts + :params known_release - list of releases in tiller + + :result - will remove any chart that is not present in yaml + ''' + def release_prefix(prefix, chart): + return "{}-{}".format(prefix, chart["chart"]["release_name"]) + + valid_charts = [release_prefix(prefix, chart) for chart in charts] + actual_charts = [x.name for x in self.list_releases()] + chart_diff = list(set(actual_charts) - set(valid_charts)) + + for chart in chart_diff: + if chart.startswith(prefix): + LOG.debug("Release: %s will be removed", chart) + self.uninstall_release(chart) diff --git a/scripts/armada b/scripts/armada index 2ae50a7c..e890071e 100755 --- a/scripts/armada +++ b/scripts/armada @@ -14,6 +14,8 @@ def parse_args(): help='Path to YAML File or Directory') ap.add_argument('--debug', action='store_true', default=False, required=False, help='Enable debug logging') + ap.add_argument('--enable-chart-cleanup', action='store_true', + default=False, required=False, help='Clean up enviroment') ap.add_argument('-d', '--dry-run', action='store_true', default=False, required=False, help='Enable dry-run flag on all Tiller' 'Calls')