def delete_services(self, request, project_id, cluster_id, namespace, name): username = request.user.username # 检查用户是否有命名空间的使用权限 namespace_id = app_utils.get_namespace_id( request.user.token.access_token, project_id, (cluster_id, namespace), cluster_id=cluster_id ) app_utils.can_use_namespace(request, project_id, namespace_id) flag, project_kind = self.get_project_kind(request, project_id) if not flag: return project_kind # 删除service resp = self.delete_single_service(request, project_id, project_kind, cluster_id, namespace, namespace_id, name) # 添加操作审计 activity_client.ContextActivityLogClient( project_id=project_id, user=username, resource_type="instance", resource=name, resource_id=0, extra=json.dumps({}), description=_("删除Service[{}]命名空间[{}]").format(name, namespace), ).log_modify(activity_status="succeed" if resp.get("code") == ErrorCode.NoError else "failed") # 已经删除的,需要将错误信息翻译一下 message = resp.get('message', '') is_delete_before = True if 'node does not exist' in message or 'not found' in message else False if is_delete_before: message = _("{}[命名空间:{}]已经被删除,请手动刷新数据").format(name, namespace) return Response({"code": resp.get("code"), "message": message, "data": {}})
def get_service_info(self, request, project_id, cluster_id, namespace, name): # noqa """获取单个 service 的信息""" project_kind = request.project.kind access_token = request.user.token.access_token params = { "env": "mesos" if project_kind == MESOS_VALUE else "k8s", "namespace": namespace, "name": name, } if project_kind == MESOS_VALUE: client = mesos.MesosClient(access_token, project_id, cluster_id, env=None) resp = client.get_services(params) # 跳转到模板集页面需要的参数 template_cate = 'mesos' relate_app_cate = 'application' else: client = k8s.K8SClient(access_token, project_id, cluster_id, env=None) resp = client.get_service(params) template_cate = 'k8s' relate_app_cate = 'deployment' if resp.get("code") != ErrorCode.NoError: raise ComponentError(resp.get("message")) resp_data = resp.get("data", []) if not resp_data: return APIResponse({ "code": 400, "message": _("查询不到 Service[{}] 的信息").format(name) }) s_data = resp_data[0].get('data', {}) labels = s_data.get('metadata', {}).get('labels') or {} # 获取命名空间的id namespace_id = app_utils.get_namespace_id(access_token, project_id, (cluster_id, namespace), cluster_id=cluster_id) instance_id = labels.get(LABLE_INSTANCE_ID) # 是否关联LB lb_balance = labels.get('BCSBALANCE') if lb_balance: s_data['isLinkLoadBalance'] = True s_data['metadata']['lb_labels'] = {'BCSBALANCE': lb_balance} else: s_data['isLinkLoadBalance'] = False lb_name = labels.get('BCSGROUP') # 获取模板集信息 template_id = labels.get(LABLE_TEMPLATE_ID) try: lasetest_ver = ShowVersion.objects.filter( template_id=template_id).order_by('-updated').first() show_version_name = lasetest_ver.name version_id = lasetest_ver.real_version_id version_entity = VersionedEntity.objects.get(id=version_id) except Exception: return APIResponse({ "code": 400, "message": _("模板集[id:{}]没有可用的版本,无法更新service").format(template_id) }) entity = version_entity.get_entity() # 获取更新人和创建人 annotations = s_data.get('metadata', {}).get('annotations', {}) creator = annotations.get(ANNOTATIONS_CREATOR, '') updator = annotations.get(ANNOTATIONS_UPDATOR, '') create_time = annotations.get(ANNOTATIONS_CREATE_TIME, '') update_time = annotations.get(ANNOTATIONS_UPDATE_TIME, '') # k8s 更新需要获取版本号 resource_version = s_data.get('metadata', {}).get('resourceVersion') or '' web_cache = annotations.get(ANNOTATIONS_WEB_CACHE) if not web_cache: # 备注中无,则从模板中获取,兼容mesos之前实例化过的模板数据 _services = entity.get('service') if entity else None _services_id_list = _services.split(',') if _services else [] _s = Service.objects.filter(id__in=_services_id_list, name=name).first() try: web_cache = _s.get_config.get('webCache') except Exception: pass else: try: web_cache = json.loads(web_cache) except Exception: pass s_data['webCache'] = web_cache deploy_tag_list = web_cache.get('deploy_tag_list') or [] app_weight = {} if project_kind == MESOS_VALUE: # 处理 mesos 中Service的关联数据 apps = entity.get('application') if entity else None application_id_list = apps.split(',') if apps else [] apps = Application.objects.filter(id__in=application_id_list) if apps: # 关联应用的权重 for key in labels: if key.startswith('BCS-WEIGHT-'): app_name = key[11:] _app = apps.filter(name=app_name).first() if _app: weight = int(labels[key]) app_weight[_app.app_id] = weight else: # 处理 k8s 中Service的关联数据 if not deploy_tag_list: _servs = entity.get('K8sService') if entity else None _serv_id_list = _servs.split(',') if _servs else [] _k8s_s = K8sService.objects.filter(id__in=_serv_id_list, name=name).first() if _k8s_s: deploy_tag_list = _k8s_s.get_deploy_tag_list() # 标签 和 备注 去除后台自动添加的 or_annotations = s_data.get('metadata', {}).get('annotations', {}) or_labels = s_data.get('metadata', {}).get('labels', {}) if or_labels: pub_keys = PUBLIC_LABELS.keys() show_labels = { key: or_labels[key] for key in or_labels if key not in pub_keys } s_data['metadata']['labels'] = show_labels if or_annotations: pub_an_keys = PUBLIC_ANNOTATIONS.keys() show_annotations = { key: or_annotations[key] for key in or_annotations if key not in pub_an_keys } remove_key(show_annotations, ANNOTATIONS_WEB_CACHE) s_data['metadata']['annotations'] = show_annotations return APIResponse({ "data": { 'service': [{ 'name': name, 'app_id': app_weight.keys(), 'app_weight': app_weight, 'deploy_tag_list': deploy_tag_list, 'config': s_data, 'version': version_id, 'lb_name': lb_name, 'instance_id': instance_id, 'namespace_id': namespace_id, 'cluster_id': cluster_id, 'namespace': namespace, 'creator': creator, 'updator': updator, 'create_time': create_time, 'update_time': update_time, 'show_version_name': show_version_name, 'resource_version': resource_version, 'template_id': template_id, 'template_cate': template_cate, 'relate_app_cate': relate_app_cate, }] } })