示例#1
0
    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)
示例#2
0
    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)
示例#3
0
 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)
示例#4
0
 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)
示例#5
0
    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)
示例#6
0
    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)
示例#7
0
 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)
示例#8
0
    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)
示例#9
0
    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)
示例#10
0
 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)
示例#11
0
    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)
示例#12
0
    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)
示例#13
0
 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, "更新用户角色成功")
示例#14
0
    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)
示例#15
0
    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)
示例#16
0
 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, "创建成功")
示例#17
0
    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="删除成功.")
示例#18
0
    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)
示例#19
0
 def update(self, request, *args, **kwargs):
     return response.json_api_response(400, None, "请求错误")
示例#20
0
 def multi_delete(self, request, *args, **kwargs):
     return json_api_response(code=-1, data=None, message="Not allowed.")