Example #1
0
    def provide(user, config):
        from backend.bcs_k8s.app.models import App
        from backend.utils.client import get_kubectl_config_context

        if not App.objects.filter(project_id=config.get("project_id"),
                                  cluster_id=config.get("cluster_id"),
                                  id=config.get("app_id")).exists():
            raise PermissionDenied()

        check_cluster_perm(user, config.get("project_id"),
                           config.get("cluster_id"))

        # bke_client = get_bke_client(
        #     project_id=config.get("project_id"),
        #     cluster_id=config.get("cluster_id"),
        #     access_token=user.token.access_token
        # )
        # bke_client.active_admin()

        kubeconfig = get_kubectl_config_context(
            access_token=user.token.access_token,
            project_id=config.get("project_id"),
            cluster_id=config.get("cluster_id"))
        kubeconfig_obj = yaml_load(kubeconfig)
        kubeconfig_obj["users"][0]["user"]["token"] = settings.BKE_ADMIN_TOKEN
        config["kubeconfig"] = yaml_dump(kubeconfig_obj)
        return config
Example #2
0
    def create(self, request, project_id, *args, **kwargs):
        serializer = ClusterKubeConfigSLZ(data=request.data)
        serializer.is_valid(raise_exception=True)

        cluster_id = serializer.data["cluster_id"]

        check_cluster_perm(user=request.user, project_id=project_id, cluster_id=cluster_id, request=request)

        kubeconfig = bcs_utils_client.get_kubectl_config_context(
            access_token=self.access_token, project_id=project_id, cluster_id=cluster_id
        )

        response = HttpResponse(content=kubeconfig, content_type='text/plain; charset=UTF-8')
        response['Content-Disposition'] = 'attachment; filename="bcs-%s-kubeconfig.yaml"' % cluster_id
        return response
Example #3
0
    def retrieve(self, request, app_id, *args, **kwargs):
        app = App.objects.get(id=self.app_id)

        project_code_cache_key = "helm_project_cache_key:%s" % self.project_id
        if project_code_cache_key in cache:
            resp = cache.get(project_code_cache_key)

        else:
            # get_project_name
            resp = paas_cc.get_project(self.access_token, self.project_id)
            if resp.get('code') != 0:
                logger.error(
                    "查询project的信息出错(project_id:{project_id}):{message}".format(
                        project_id=self.project_id,
                        message=resp.get('message')))
                return Response({
                    "code": 500,
                    "message": _("后台接口异常,根据项目ID获取项目英文名失败!")
                })

            cache.set(project_code_cache_key, resp, 60 * 15)

        project_code = resp["data"]["english_name"]

        check_cluster_perm(user=request.user,
                           project_id=app.project_id,
                           cluster_id=app.cluster_id,
                           request=request)

        kubeconfig = bcs_utils_client.get_kubectl_config_context(
            access_token=self.access_token,
            project_id=app.project_id,
            cluster_id=app.cluster_id)

        base_url = get_base_url(request)
        try:
            with tempfile.NamedTemporaryFile("w") as f:
                f.write(kubeconfig)
                f.flush()

                data = collect_resource_status(base_url=base_url,
                                               kubeconfig=f.name,
                                               app=app,
                                               project_code=project_code)
        except DashboardExecutionError as e:
            message = "get helm app status failed, error_no: {error_no}\n{output}".format(
                error_no=e.error_no, output=e.output)
            return Response({
                "code": 400,
                "message": message,
            })
        except DashboardError as e:
            message = "get helm app status failed, dashboard ctl error: {err}".format(
                err=e)
            logger.exception(message)
            return Response({
                "code": 400,
                "message": message,
            })
        except Exception as e:
            message = "get helm app status failed, {err}".format(err=e)
            logger.exception(message)
            return Response({
                "codee": 500,
                "message": message,
            })

        response = {
            "status": data,
            "app": {
                "transitioning_action": app.transitioning_action,
                "transitioning_on": app.transitioning_on,
                "transitioning_result": app.transitioning_result,
                "transitioning_message": app.transitioning_message,
            },
        }
        return Response(response)