def destroy_app_task(self, username, access_token): """ destroy app in cluster, then remove record from db """ # operation record log_client = self.record_destroy(username=username, access_token=access_token) try: app_deployer = AppDeployer(app=self, access_token=access_token) if enable_helm_v3(self.cluster_id) and self.enable_helm: app_deployer.uninstall_app_by_helm() else: app_deployer.uninstall_app_by_kubectl() except Exception as e: logger.exception("destroy_app_task unexpected result: %s", e) log_client.update_log(activity_status="failed") self.set_transitioning(False, "uninstall app failed, %s" % e) raise e activity_status = "succeed" if self.transitioning_result else "failed" log_client.update_log(activity_status=activity_status) # FIXME currently implementation is so rough, # it's better to set app's state to deleting before doing real delete if self.transitioning_result is True: self.delete()
def rollback_app_task(self, username, release_id, access_token): # simple make a copy of release, set release type, then install log_client = self.record_rollback_app( username=username, access_token=access_token, release_id=release_id, ) try: release = ChartRelease.objects.get(id=release_id) app_deployer = AppDeployer(app=self, access_token=access_token) if enable_helm_v3(self.cluster_id) and self.enable_helm: # 回滚到先前release对应的revision self.release = release self.save(update_fields=["release"]) app_deployer.rollback_app_by_helm() else: # kubectl的逻辑不变动 self.release = ChartRelease.objects.make_rollback_release( self, release) self.version = self.release.chartVersionSnapshot.version self.save(update_fields=["release"]) app_deployer.install_app_by_kubectl() except Exception as e: logger.exception("rollback_app_task unexpected error: %s", e) self.set_transitioning(self, False, "unexpected error: %s" % e) log_client.update_log(activity_status="failed") else: # no exception case app deployer run kubectl will set transitioning # no exception case doesn't means success, so don't set transitioning here activity_status = "succeed" if self.transitioning_result else "failed" log_client.update_log(activity_status=activity_status)
def upgrade_app_task(self, chart_version_id, answers, customs, updator, access_token, valuefile=None, kubeconfig_content=None, ignore_empty_access_token=None, extra_inject_source=None, sys_variables=None, valuefile_name=DEFAULT_VALUES_FILE_NAME): # make upgrade # `chart_version_id` indicate the target chartverion for app, # it can also use KEEP_TEMPLATE_UNCHANGED to keep app template unchanged. # operation record log_client = self.record_upgrade_app(chart_version_id, answers, customs, updator, access_token, valuefile, sys_variables, valuefile_name) self.release = ChartRelease.objects.make_upgrade_release( self, chart_version_id, answers, customs, valuefile=valuefile, valuefile_name=valuefile_name) self.version = self.release.chartVersionSnapshot.version self.updator = updator if sys_variables: self.sys_variables = sys_variables self.save(update_fields=[ "release", "updator", "updated", "sys_variables", "version" ]) try: app_deployer = AppDeployer( app=self, access_token=access_token, kubeconfig_content=kubeconfig_content, ignore_empty_access_token=ignore_empty_access_token, extra_inject_source=extra_inject_source, ) # 如果开启使用helm功能,并且实例化使用helm,则升级也可以使用helm功能 if enable_helm_v3(self.cluster_id) and self.enable_helm: app_deployer.upgrade_app_by_helm() else: app_deployer.upgrade_app_by_kubectl() except Exception as e: logger.exception("upgrade_task unexpected error: %s" % e) self.set_transitioning(False, "unexpected error: %s" % e) log_client.update_log(activity_status="failed") else: activity_status = "succeed" if self.transitioning_result else "failed" log_client.update_log(activity_status=activity_status) return self
def get_history_releases(self): # 针对helm upgrade的操作,执行成功时,才会有revision,才允许回滚 releases = ChartRelease.objects.filter(app_id=self.id).exclude(id=self.release.id).order_by("-id") if enable_helm_v3(self.cluster_id): releases = releases.exclude(revision=0) releases = [dict(id=item.id, short_name=item.short_name, version=item.chartVersionSnapshot.version, created_at=item.created_at, revision=item.revision ) for item in releases] return releases
def _get_cmd_args_for_template(self, root_dir, app_name, namespace, cluster_id): if enable_helm_v3(cluster_id): return [ settings.HELM3_BIN, "template", app_name, root_dir, "--namespace", namespace ] return [ settings.HELM_BIN, "template", root_dir, "--name", app_name, "--namespace", namespace, ]
def first_deploy_task(self, access_token, activity_log_id, deploy_options): log_client = get_log_client_by_activity_log_id(activity_log_id) try: app_deployer = AppDeployer(app=self, access_token=access_token, **deploy_options) # 启用helm功能,使用helm相关命令 if enable_helm_v3(self.cluster_id): # 针对install操作,标识为使用helm命令 self.enable_helm = True self.save(update_fields=["enable_helm"]) app_deployer.install_app_by_helm() else: app_deployer.install_app_by_kubectl() except Exception as e: logger.exception("first deploy app with unexpected error: %s", e) self.set_transitioning(False, "unexpected error: %s" % e) log_client.update_log(activity_status="failed") else: activity_status = "succeed" if self.transitioning_result else "failed" log_client.update_log(activity_status=activity_status)