Beispiel #1
0
    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()
Beispiel #2
0
 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)
Beispiel #3
0
    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
Beispiel #4
0
    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
Beispiel #5
0
    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,
        ]
Beispiel #6
0
 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)