def put(self, request, project_id, version_id, resource_name, resource_id): """模板集中有 version 信息时,从 version 版本创建新的版本信息 """ validate_resource_name(resource_name) serializer = serializers_new.VentityWithTemplateSLZ(data=self.kwargs) serializer.is_valid(raise_exception=True) validated_data = serializer.validated_data ventity = validated_data['ventity'] template = validated_data['template'] self.can_edit_template(request, template) data = request.data or {} data.update({ 'version_id': version_id, 'resource_id': resource_id, 'project_id': project_id }) serializer_class = serializers_new.get_slz_class_by_resource_name( resource_name) serializer = serializer_class(data=data) serializer.is_valid(raise_exception=True) update_data = self._compose_update_data(serializer.validated_data) resource_class = get_model_class_by_resource_name(resource_name) if int(resource_id): robj = resource_class.perform_update(resource_id, **update_data) else: robj = resource_class.perform_create(**update_data) new_ventity = VersionedEntity.update_for_new_ventity( ventity.id, resource_name, resource_id, str(robj.id), **{'creator': self.request.user.username}) # model Template updated field need change when update resource template.save(update_fields=['updated']) return Response({ 'id': robj.id, 'version': new_ventity.id, 'resource_data': robj.get_res_config(is_simple=True) })
def delete(self, request, project_id, version_id, resource_name, resource_id): validate_resource_name(resource_name) serializer = VentityWithTemplateSLZ(data=self.kwargs) serializer.is_valid(raise_exception=True) validated_data = serializer.validated_data ventity = validated_data['ventity'] template = validated_data['template'] self.can_edit_template(request, template) # 关联关系检查 can_delete_resource(ventity, resource_name, resource_id) new_ventity = VersionedEntity.update_for_delete_ventity( ventity.id, resource_name, resource_id, **{'creator': self.request.user.username} ) return Response({'id': resource_id, 'version': new_ventity.id})
def delete(self, request, project_id, version_id, resource_name, resource_id): validate_resource_name(resource_name) serializer = serializers_new.VentityWithTemplateSLZ(data=self.kwargs) serializer.is_valid(raise_exception=True) validated_data = serializer.validated_data ventity = validated_data["ventity"] template = validated_data["template"] self.can_edit_template(request, template) # 关联关系检查 serializers_new.can_delete_resource(ventity, resource_name, resource_id) new_ventity = VersionedEntity.update_for_delete_ventity( ventity.id, resource_name, resource_id, **{"creator": self.request.user.username}) return Response({"id": resource_id, "version": new_ventity.id})
def post(self, request, project_id, version_id): version_entity = validate_version_id(project_id, version_id, is_version_entity_retrun=True) project_kind = request.project.kind self.slz = VariableNamespaceSLZ(data=request.data, context={'project_kind': project_kind}) self.slz.is_valid(raise_exception=True) slz_data = self.slz.data if 'instance_entity' not in slz_data: raise ValidationError(_("请选择要实例化的模板")) instance_entity = slz_data['instance_entity'] lb_services = [] key_list = [] for cate in instance_entity: cate_data = instance_entity[cate] cate_id_list = [i.get('id') for i in cate_data if i.get('id')] # 查询这些配置文件的变量名 for _id in cate_id_list: if cate in ['metric']: config = self.get_metric_confg(_id) else: try: resource = MODULE_DICT.get(cate).objects.get(id=_id) except Exception: continue config = resource.config search_list = check_var_by_config(config) key_list.extend(search_list) # mesos Deployment 需要再查询 Application 的配置文件 if cate in ['deployment']: deployment_app = VersionedEntity.get_application_by_deployment_id( version_id, _id) deployment_app_config = deployment_app.config _search_list = check_var_by_config(deployment_app_config) key_list.extend(_search_list) # mesos service 查询需要lb的列表 if project_kind == 2 and cate == 'service': lb_services = version_entity.get_lb_services_by_ids( cate_id_list) key_list = list(set(key_list)) variable_dict = {} if key_list: # 验证变量名是否符合规范,不符合抛出异常,否则后续用 django 模板渲染变量也会抛出异常 var_objects = Variable.objects.filter( Q(project_id=project_id) | Q(project_id=0)) access_token = request.user.token.access_token namespace_res = paas_cc.get_namespace_list(access_token, project_id, limit=ALL_LIMIT) namespace_data = namespace_res.get('data', {}).get('results') or [] namespace_dict = { str(i['id']): i['cluster_id'] for i in namespace_data } ns_list = slz_data['namespaces'].split( ',') if slz_data['namespaces'] else [] for ns_id in ns_list: _v_list = [] for _key in key_list: key_obj = var_objects.filter(key=_key) if key_obj.exists(): _obj = key_obj.first() # 只显示自定义变量 if _obj.category == 'custom': cluster_id = namespace_dict.get(ns_id, 0) _v_list.append({ "key": _obj.key, "name": _obj.name, "value": _obj.get_show_value(cluster_id, ns_id) }) else: _v_list.append({ "key": _key, "name": _key, "value": "" }) variable_dict[ns_id] = _v_list return Response({ "code": 0, "message": "OK", "data": { "lb_services": lb_services, "variable_dict": variable_dict } })