Exemplo n.º 1
0
    def users(self, request, pk=None):
        """
        Register user to node

        Register user to node
        """
        serializer = NodeUserCreateSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            name = serializer.validated_data.get("name")
            secret = serializer.validated_data.get("secret")
            user_type = serializer.validated_data.get("user_type")
            attrs = serializer.validated_data.get("attrs", "")
            try:
                node = Node.objects.get(id=pk,
                                        organization=request.user.organization)
                # Name is unique for each node
                user_count = NodeUser.objects.filter(node=node,
                                                     name=name).count()
                if user_count > 0:
                    raise ResourceExists
            except ObjectDoesNotExist:
                raise ResourceNotFound

            node_user = NodeUser(
                name=name,
                secret=secret,
                user_type=user_type,
                attrs=attrs,
                node=node,
            )
            node_user.save()

            agent_config_file = request.build_absolute_uri(
                node.agent.config_file.url)
            node_file_url = request.build_absolute_uri(node.file.url)
            user_patch_url = self.reverse_action("patch-user",
                                                 kwargs={
                                                     "pk": pk,
                                                     "user_pk": node_user.id
                                                 })
            user_patch_url = request.build_absolute_uri(user_patch_url)
            operate_node.delay(
                str(node.id),
                AgentOperation.FabricCARegister.value,
                agent_config_file=agent_config_file,
                node_file_url=node_file_url,
                user_patch_url=user_patch_url,
                fabric_ca_user={
                    "name": name,
                    "secret": secret,
                    "type": user_type,
                    "attrs": attrs,
                },
            )
            response = NodeUserIDSerializer(node_user)
            return Response(data=response.data, status=status.HTTP_201_CREATED)
Exemplo n.º 2
0
    def destroy(self, request, pk=None):
        """
        Delete Node

        Delete node
        """
        try:
            if request.user.is_superuser:
                node = Node.objects.get(id=pk)
            else:
                node = Node.objects.get(id=pk,
                                        organization=request.user.organization)
        except ObjectDoesNotExist:
            raise ResourceNotFound
        else:
            if node.status != NodeStatus.Deleting.name.lower():
                if node.status not in [
                        NodeStatus.Error.name.lower(),
                        NodeStatus.Deleted.name.lower(),
                ]:
                    node.status = NodeStatus.Deleting.name.lower()
                    node.save()

                    agent_config_file = request.build_absolute_uri(
                        node.agent.config_file.url)
                    node_detail_url = reverse("node-detail", args=[pk])
                    node_detail_url = request.build_absolute_uri(
                        node_detail_url)
                    operate_node.delay(
                        str(node.id),
                        AgentOperation.Delete.value,
                        agent_config_file=agent_config_file,
                        node_detail_url=node_detail_url,
                    )
                else:
                    node.delete()

            return Response(status=status.HTTP_204_NO_CONTENT)
Exemplo n.º 3
0
    def create(self, request):
        """
        Create Node

        Create node
        """
        serializer = NodeCreateBody(data=request.data)
        if serializer.is_valid(raise_exception=True):
            self._validate_organization(request)
            agent_type = serializer.validated_data.get("agent_type")
            network_type = serializer.validated_data.get("network_type")
            network_version = serializer.validated_data.get("network_version")
            agent = serializer.validated_data.get("agent")
            node_type = serializer.validated_data.get("type")
            ca = serializer.validated_data.get("ca", {})
            if agent is None:
                available_agents = (Agent.objects.annotate(
                    network_num=Count("node__network")).annotate(
                        node_num=Count("node")).filter(
                            schedulable=True,
                            type=agent_type,
                            network_num__lt=F("capacity"),
                            node_num__lt=F("node_capacity"),
                            organization=request.user.organization,
                        ).order_by("node_num"))
                if len(available_agents) > 0:
                    agent = available_agents[0]
                else:
                    raise NoResource
            else:
                if not request.user.is_operator:
                    raise PermissionDenied
                node_count = Node.objects.filter(agent=agent).count()
                if node_count >= agent.node_capacity or not agent.schedulable:
                    raise NoResource

            fabric_ca = None
            if node_type == FabricNodeType.Ca.name.lower():
                ca_body = {}
                admin_name = ca.get("admin_name")
                admin_password = ca.get("admin_password")
                # If found tls type ca server under this organization,
                # will cause resource exists error
                ca_server_type = ca.get("type",
                                        FabricCAServerType.Signature.value)
                if ca_server_type == FabricCAServerType.TLS.value:
                    exist_ca_server = Node.objects.filter(
                        organization=request.user.organization,
                        ca__type=FabricCAServerType.TLS.value,
                    ).count()
                    if exist_ca_server > 0:
                        raise ResourceExists
                hosts = ca.get("hosts", [])
                if admin_name:
                    ca_body.update({"admin_name": admin_name})
                if admin_password:
                    ca_body.update({"admin_password": admin_password})
                fabric_ca = FabricCA(**ca_body,
                                     hosts=hosts,
                                     type=ca_server_type)
                fabric_ca.save()
            node = Node(
                network_type=network_type,
                agent=agent,
                network_version=network_version,
                user=request.user,
                organization=request.user.organization,
                type=node_type,
                ca=fabric_ca,
            )
            node.save()
            agent_config_file = request.build_absolute_uri(
                agent.config_file.url)
            node_detail_url = reverse("node-detail", args=[str(node.id)])
            node_detail_url = request.build_absolute_uri(node_detail_url)
            node_file_upload_api = reverse("node-files", args=[str(node.id)])
            node_file_upload_api = request.build_absolute_uri(
                node_file_upload_api)
            operate_node.delay(
                str(node.id),
                AgentOperation.Create.value,
                agent_config_file=agent_config_file,
                node_detail_url=node_detail_url,
                node_file_upload_api=node_file_upload_api,
            )
            response = NodeIDSerializer({"id": str(node.id)})
            return Response(response.data, status=status.HTTP_201_CREATED)
Exemplo n.º 4
0
    def create(self, request):
        """
        Create Node

        Create node
        """
        serializer = NodeCreateBody(data=request.data)
        if serializer.is_valid(raise_exception=True):
            self._validate_organization(request)
            agent_type = serializer.validated_data.get("agent_type")
            network_type = serializer.validated_data.get("network_type")
            network_version = serializer.validated_data.get("network_version")
            agent = serializer.validated_data.get("agent")
            node_type = serializer.validated_data.get("type")
            ca = serializer.validated_data.get("ca")
            peer = serializer.validated_data.get("peer")
            if agent is None:
                available_agents = (Agent.objects.annotate(
                    network_num=Count("node__network")).annotate(
                        node_num=Count("node")).filter(
                            schedulable=True,
                            type=agent_type,
                            network_num__lt=F("capacity"),
                            node_num__lt=F("node_capacity"),
                            organization=request.user.organization,
                        ).order_by("node_num"))
                if len(available_agents) > 0:
                    agent = available_agents[0]
                else:
                    raise NoResource
            else:
                if not request.user.is_operator:
                    raise PermissionDenied
                node_count = Node.objects.filter(agent=agent).count()
                if node_count >= agent.node_capacity or not agent.schedulable:
                    raise NoResource

            fabric_ca = None
            fabric_peer = None
            peer_ca_list = []
            if node_type == FabricNodeType.Ca.name.lower():
                fabric_ca = self._save_fabric_ca(request, ca)
            elif node_type == FabricNodeType.Peer.name.lower():
                fabric_peer, peer_ca_list = self._save_fabric_peer(
                    request, peer)
            node = Node(
                network_type=network_type,
                agent=agent,
                network_version=network_version,
                user=request.user,
                organization=request.user.organization,
                type=node_type,
                ca=fabric_ca,
                peer=fabric_peer,
            )
            node.save()
            agent_config_file = request.build_absolute_uri(
                agent.config_file.url)
            node_detail_url = reverse("node-detail", args=[str(node.id)])
            node_detail_url = request.build_absolute_uri(node_detail_url)
            node_file_upload_api = reverse("node-files", args=[str(node.id)])
            node_file_upload_api = request.build_absolute_uri(
                node_file_upload_api)
            operate_node.delay(
                str(node.id),
                AgentOperation.Create.value,
                agent_config_file=agent_config_file,
                node_detail_url=node_detail_url,
                node_file_upload_api=node_file_upload_api,
                peer_ca_list=json.dumps(peer_ca_list),
            )
            response = NodeIDSerializer({"id": str(node.id)})
            return Response(response.data, status=status.HTTP_201_CREATED)