def create(self, request, *args, **kwargs): """ 如果 node 不存在时,则添加,否则修改 """ serializer = self.get_serializer(data=request.data) if serializer.is_valid(): self.perform_create(serializer) # headers = self.get_success_headers(serializer.data) return json_api_response(code=0, data=serializer.data, message=None) else: print("data", serializer.data) try: instance = self.queryset.get(node_id=serializer.data['node']) except NodeLinkServer.DoesNotExist: return json_api_response(code=-1, data=None, message=f"not found.") partial = kwargs.pop('partial', True) s = self.get_serializer(instance, data=request.data, partial=partial) s.is_valid(raise_exception=True) instance.cmdbs.add(*serializer.data['cmdbs']) return json_api_response(code=-1, data=serializer.data, message=None)
def create(self, request, *args, **kwargs): """ 如果 node 不存在时,则添加,否则修改 """ serializer = self.get_serializer(data=request.data) if serializer.is_valid(): self.perform_create(serializer) return json_api_response(code=0, data=serializer.data, message=None) print("data", serializer.data) try: instance = self.queryset.get(node_id=serializer.data['node']) except NodeLinkOperaPermission.DoesNotExist: return json_api_response(code=-1, data=None, message="not found.") partial = kwargs.pop('partial', True) s = self.get_serializer(instance, data=request.data, partial=partial) s.is_valid(raise_exception=True) try: instance.read_member.add(*serializer.data['read_member']) instance.write_member.add(*serializer.data['write_member']) except Exception as e: return json_api_response(code=-1, data=e.args, message=None) return json_api_response(code=0, data=s.data, message=None)
def get(self, request, *args, **kwargs): filename = kwargs.get('filename') if filename: result, ok = self.read_file(kwargs['filename']) if not ok: return json_api_response(code=-1, data=None, message=result) else: result, ok = self.list_dir() return json_api_response(code=0, data=result, message=None)
def multi_update(self, request, *args, **kwargs): serializer = self.get_serializer(self.get_queryset(), data=request.data, partial=False, many=True, context={'request': request}) if not serializer.is_valid(): return json_api_response(code=-1, data=None, message="") serializer.is_valid(raise_exception=False) self.perform_update(serializer) return json_api_response(code=0, data=serializer.data, message=None)
def get(self, request, pk, *args, **kwargs): try: node = ServiceTree.objects.get(pk=pk) except ServiceTree.DoesNotExist: return json_api_response(code=-1, data=None, message=f"pk {pk} not found.") s = ServiceTreeListSerializer(node.get_ancestors(ascending=True, include_self=True), many=True) return json_api_response(code=0, data=s.data, message=None)
def delete(self, request, *args, **kwargs): data = request.data node_id = kwargs['pk'] server_ids = data['server_ids'] try: node_link_server = NodeLinkServer.objects.get(node_id=node_id) except NodeLinkServer.DoesNotExist: return json_api_response(code=-1, data=None, message=f"node_id {node_id} not found.") instances = CMDBBase.objects.filter(pk__in=server_ids) node_link_server.cmdbs.remove(*[x.pk for x in instances]) return json_api_response(code=0, data=None, message=None)
def destroy(self, request, *args, **kwargs): ins = self.get_object() # 不允许跨层级删除 if not ins.is_leaf_node(): return json_api_response(code=-1, data=None, message="不允许跨层级删除.") return super(ServiceTreeModelViewSet, self).destroy(request, *args, **kwargs)
def tag_v2(self, request, pk=None, *args, **kwargs): """ 查询节点关联的tag /api/v1/service_tree/<pk>/tag/ - 不需要分页 @param request: @param pk: @return: { "tag": {} "tag_ref": [{},{}] } """ response = {"tag": {}, "tag_ref": []} # 当前节点 node = self.get_object() # 当前节点含当前节点上继承的tag _nodes = node.get_ancestors(ascending=True, include_self=True) for idx, n in enumerate(_nodes): kvs = {info.key: info.value for info in n.nodejointag_set.all()} if idx == 0: response['tag'] = kvs continue if not kvs: continue response['tag_ref'].append(kvs) return json_api_response(code=0, data=response, message=None)
def tag(self, request, pk=None, *args, **kwargs): """ 查询节点关联的tag /api/v1/service_tree/<pk>/tag/ - 不需要分页 { "tag": [] "tag_ref": [[],[]] } """ response = {"tag": [], "tag_ref": []} # 当前节点 node = self.get_object() # 当前节点含当前节点上继承的tag _nodes = node.get_ancestors(ascending=True, include_self=True) for idx, n in enumerate(_nodes): kvs = [{ "key": info.key, "value": info.value, "id": info.pk } for info in n.nodejointag_set.all()] if idx == 0: response['tag'] = kvs continue if not kvs: continue response['tag_ref'].append(kvs) return json_api_response(code=0, data=response, message=None)
def create(self, request, *args, **kwargs): if isinstance(request.data, list): serializer = self.get_serializer(data=request.data, many=True) else: serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) return json_api_response(code=0, data=serializer.data, message=None)
def post(self, request, *args, **kwargs): data = request.data # 验证 """ hosts [] hosts中的ip 必须要在/etc/ansible/hosts文件中注册过才行,否则忽略. """ if not (isinstance(data['hosts'], list) and len(data['hosts']) < 100): # 安全风险考虑 # TODO: 100 to config return json_api_response(code=-1, data=None, message="一次任务要执行的主机数量不能大于100台.") script_name = data["script_name"] if script_name.endswith("yaml"): # exec script task_data = { "playbook": File.get_join_path(settings.ANSIBLE_SCRIPT_PATH, data["script_name"]), "extra_vars": { "host_list": data['hosts'] }, "forks": data.get("forks", 5), } result = playbook_task.delay(**task_data) else: # exec playbook task_data = { "hosts": data['hosts'], "forks": data.get("forks", 5), "module": "script", 'args': File.get_join_path(settings.ANSIBLE_SCRIPT_PATH, data["script_name"]), } result = runner_task.delay(**task_data) return json_api_response(code=0, data=result.id, message=None)
def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) data = self.get_serializer(queryset.filter(parent=None), many=True).data for instance in data: instance['children'] = self.set_children_nodes( instance["id"], queryset) return json_api_response(code=0, data=data, message=None)
def _update(self, request, *args, **kwargs): data = request.data data['user'] = self.get_object().id serializer = serializers.UserRoleBindSerializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.validated_data['user'] with transaction.atomic(): models.RoleBind.objects.filter(user=user).delete() serializer.create(serializer.validated_data) return response.json_api_response(0, None, "更新用户角色成功")
def create(self, request, *args, **kwargs): """ 如果 node 不存在时,则添加,否则修改 """ if 'app_key' in request.data: try: node = self.queryset.get(node__appkey=request.data['app_key']) except NodeLinkServer.DoesNotExist: return json_api_response(code=-1, data=None, message="app_key not found.") request_data = { "node": node.node_id, "cmdbs": request.data['cmdbs'], } else: request_data = request.data serializer = self.get_serializer(data=request_data) if serializer.is_valid(): self.perform_create(serializer) return json_api_response(code=0, data=serializer.data, message=None) else: try: instance = self.queryset.get(node_id=serializer.data['node']) except NodeLinkServer.DoesNotExist: return json_api_response(code=-1, data=None, message="not found.") partial = kwargs.pop('partial', True) s = self.get_serializer(instance, data=request_data, partial=partial) s.is_valid(raise_exception=True) instance.cmdbs.add(*serializer.data['cmdbs']) return json_api_response(code=0, data=serializer.data, message=None)
def server(self, request, pk=None, *args, **kwargs): """ 查询节点下所有叶子节点的机器信息 /api/v1/service_tree/<pk>/server/?page=1&page_size=100 /api/v1/service_tree/<pk>/server/?page=1&page_size=100&hostname=<>&private_ip=<> @param request: @param pk: @return: """ is_pagination = False page = request.query_params.get('page', 1) page_size = request.query_params.get('page_size', 15) if page: is_pagination = True # 当前节点 node = self.get_object() # 当前节点下所有的叶子节点 _nodes = node.get_descendants(include_self=True) _leaf_nodes = [n for n in _nodes if n.is_leaf_node()] # OneToOneField cmdb_pks = [] for leaf_node in _leaf_nodes: try: link_server = leaf_node.nodelinkserver.cmdbs.all() except: pass else: cmdb_pks.extend([s.pk for s in link_server]) # # ForeignKey # node_set = [] # for leaf_node in _leaf_nodes: # node_set.extend(leaf_node.nodelinkserver_set.all()) # cmdb_pks = [] # for s in node_set: # cmdb_pks.extend([_s.pk for _s in s.cmdbs.all()]) qs = CMDBBase.objects.filter(pk__in=cmdb_pks) qs = self.server_filter(qs, request.query_params) count = qs.count() if is_pagination: start = (int(page) - 1) * int(page_size) stop = start + int(page_size) qs = qs[start:stop] response = { "count": count, "results": CMDBBaseModelSerializer(qs, many=True).data } return json_api_response(code=0, data=response, message=None)
def create(self, request, *args, **kwargs): serializer = serializers.UserRoleBindSerializer(data=request.data) serializer.is_valid(raise_exception=True) for role in serializer.validated_data['role']: if len( models.RoleBind.objects.filter( user=serializer.validated_data['user'], role=role)): return response.json_error_response( {'role': ["用户已绑定<{}>角色".format(role.id)]}) serializer.create(serializer.validated_data) return response.json_api_response(0, None, "创建成功")
def destroy(self, request, *args, **kwargs): """ /api/v1/service_tree/opera_permission/<node_id>/ { read_member: [] write_member: [] } """ data = request.data try: node = ServiceTree.objects.get(pk=kwargs['pk']) except ServiceTree.DoesNotExist: return json_api_response(code=-1, data=None, message=f"node {kwargs['pk']} not found") node.nodelinkoperapermission.read_member.remove( *data.get('read_member', [])) node.nodelinkoperapermission.write_member.remove( *data.get('write_member', [])) return json_api_response(code=0, data=None, message="删除成功.")
def opera_permission_member(self, request, pk=None): ret = { "read_member": [], "write_member": [], "read_member_ref": [], # 继承 read "write_member_ref": [] # 继承 write } # 当前节点 node = self.get_object() # 当前节点下所有的叶子节点 _nodes = node.get_ancestors(ascending=True, include_self=True) # OneToOneField for idx, n in enumerate(_nodes): try: read_member_set = n.nodelinkoperapermission.read_member.all() write_member_set = n.nodelinkoperapermission.write_member.all() read_member = [{ 'id': o.pk, 'username': o.username, 'email': o.email, 'name': o.name } for o in read_member_set] write_member = [{ 'id': o.pk, 'username': o.username, 'email': o.email, 'name': o.name } for o in write_member_set] except ServiceTree.nodelinkoperapermission.RelatedObjectDoesNotExist: continue if idx == 0: ret['read_member'] = read_member ret['write_member'] = write_member else: ret['read_member_ref'].extend(read_member) ret['write_member_ref'].extend(write_member) return json_api_response(code=0, data=ret, message=None)
def update(self, request, *args, **kwargs): return response.json_api_response(400, None, "请求错误")
def multi_delete(self, request, *args, **kwargs): return json_api_response(code=-1, data=None, message="Not allowed.")