From 76a62e7fa1336823b8fa7fa06116b62951ee2fd6 Mon Sep 17 00:00:00 2001 From: dodo920306 Date: Tue, 26 Aug 2025 06:29:36 +0800 Subject: [PATCH 1/3] Remove Celery Signed-off-by: dodo920306 --- src/api-engine/api_engine/__init__.py | 10 ---------- src/api-engine/api_engine/celery.py | 17 ----------------- src/api-engine/requirements.txt | 1 - 3 files changed, 28 deletions(-) delete mode 100644 src/api-engine/api_engine/celery.py diff --git a/src/api-engine/api_engine/__init__.py b/src/api-engine/api_engine/__init__.py index acb5342eb..e69de29bb 100644 --- a/src/api-engine/api_engine/__init__.py +++ b/src/api-engine/api_engine/__init__.py @@ -1,10 +0,0 @@ -# -# SPDX-License-Identifier: Apache-2.0 -# -from __future__ import absolute_import, unicode_literals - -# This will make sure the app is always imported when -# Django starts so that shared_task will use this app. -from .celery import app as celery_app - -__all__ = ("celery_app",) diff --git a/src/api-engine/api_engine/celery.py b/src/api-engine/api_engine/celery.py deleted file mode 100644 index cf5bbdb3f..000000000 --- a/src/api-engine/api_engine/celery.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import absolute_import, unicode_literals -import os -from celery import Celery - -# set the default Django settings module for the 'celery' program. -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api_engine.settings") - -app = Celery("api_engine") - -# Using a string here means the worker doesn't have to serialize -# the configuration object to child processes. -# - namespace='CELERY' means all celery-related configuration keys -# should have a `CELERY_` prefix. -app.config_from_object("django.conf:settings", namespace="CELERY") - -# Load task modules from all registered Django app configs. -app.autodiscover_tasks() diff --git a/src/api-engine/requirements.txt b/src/api-engine/requirements.txt index c8945c4eb..bf8e80605 100644 --- a/src/api-engine/requirements.txt +++ b/src/api-engine/requirements.txt @@ -1,7 +1,6 @@ asgiref==3.6.0 attrs==20.3.0 cachetools==4.1.1 -celery==5.2.6 certifi==2024.7.4 chardet==3.0.4 coreapi==2.3.3 From 97fabfa79cd63401fdfd11113245ce662a5cc139 Mon Sep 17 00:00:00 2001 From: dodo920306 Date: Tue, 26 Aug 2025 06:30:13 +0800 Subject: [PATCH 2/3] Remove Celery tasks Signed-off-by: dodo920306 --- src/api-engine/api/tasks/__init__.py | 1 - src/api-engine/api/tasks/agent.py | 123 --------------------------- 2 files changed, 124 deletions(-) delete mode 100644 src/api-engine/api/tasks/__init__.py delete mode 100644 src/api-engine/api/tasks/agent.py diff --git a/src/api-engine/api/tasks/__init__.py b/src/api-engine/api/tasks/__init__.py deleted file mode 100644 index 83335d139..000000000 --- a/src/api-engine/api/tasks/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .agent import operate_node diff --git a/src/api-engine/api/tasks/agent.py b/src/api-engine/api/tasks/agent.py deleted file mode 100644 index 6c07cd7d0..000000000 --- a/src/api-engine/api/tasks/agent.py +++ /dev/null @@ -1,123 +0,0 @@ -# -# SPDX-License-Identifier: Apache-2.0 -# -from __future__ import absolute_import, unicode_literals - -import json -import logging -import os - -import docker -from django.core.exceptions import ObjectDoesNotExist - -from api.models import Node, Port -from api_engine.celery import app - -LOG = logging.getLogger(__name__) -ADMIN_TOKEN = os.getenv("ADMIN_TOKEN") - - -class NodeHandler(object): - def __init__(self, node_id=None, action=None, **kwargs): - self._node_id = node_id - self._action = action - - try: - node = Node.objects.get(id=node_id) - ports = Port.objects.filter(node=node) - ports = {str(item.internal): item.external for item in ports} - except ObjectDoesNotExist: - raise ObjectDoesNotExist("Node Does Not Exist") - - self._node = node - self._network_type = node.network_type - self._network_version = node.network_version - self._node_type = node.type - self._agent_image = node.agent.image - self._agent_id = str(node.agent.id) - self._agent_ip = str(node.agent.ip) - self._service_ports = ports - - self._agent_config_file = kwargs.get("agent_config_file") - self._node_detail_url = kwargs.get("node_detail_url") - self._node_file_upload_api = kwargs.get("node_file_upload_api") - self._node_file_url = kwargs.get("node_file_url") - self._fabric_ca_user = kwargs.get("fabric_ca_user", {}) - self._user_patch_url = kwargs.get("user_patch_url") - self._peer_ca_list = json.loads(kwargs.get("peer_ca_list", "[]")) - - self._agent_environment = { - "DEPLOY_NAME": node.name, - "NETWORK_TYPE": node.network_type, - "NETWORK_VERSION": node.network_version, - "NODE_TYPE": node.type, - "NODE_ID": str(node.id), - "AGENT_ID": str(node.agent.id), - "AGENT_IP": str(node.agent.ip), - "AGENT_CONFIG_FILE": self._agent_config_file, - "NODE_DETAIL_URL": self._node_detail_url, - "NODE_UPLOAD_FILE_URL": self._node_file_upload_api, - # Related files to node - "NODE_FILE_URL": self._node_file_url, - # Token for call update node api - "TOKEN": ADMIN_TOKEN, - "OPERATION": self._action, - "FABRIC_CA_USER": json.dumps(self._fabric_ca_user), - "SERVICE_PORTS": json.dumps(self._service_ports), - "USER_PATCH_URL": self._user_patch_url, - } - - if node.ca: - self._agent_environment.update( - { - "FABRIC_CA_CONFIG": json.dumps( - { - "admin_name": node.ca.admin_name, - "admin_password": node.ca.admin_password, - "hosts": ",".join(node.ca.hosts), - } - ) - } - ) - - if node.peer: - peer = node.peer - peer_config = { - "gossip_use_leader_reflection": peer.gossip_use_leader_reflection, - "gossip_org_leader": peer.gossip_org_leader, - "gossip_skip_handshake": peer.gossip_skip_handshake, - "name": peer.name, - "local_msp_id": peer.local_msp_id, - "ca_list": self._peer_ca_list, - } - self._agent_environment.update( - {"FABRIC_PEER_CONFIG": json.dumps(peer_config)} - ) - - def _launch_agent(self): - client = docker.from_env() - client.containers.run( - self._agent_image, - auto_remove=True, - environment=self._agent_environment, - detach=True, - ) - - def run(self): - self._launch_agent() - - -@app.task(bind=True, default_retry_delay=5, max_retires=3, time_limit=360) -def operate_node(self, node_id=None, action=None, **kwargs): - if node_id is None or action is None: - return False - - try: - node_handler = NodeHandler(node_id=node_id, action=action, **kwargs) - except ObjectDoesNotExist: - return False - - try: - node_handler.run() - except Exception as e: - self.retry(exc=e) From cfecfc3f06af68b08ad36418a3249fade9b7949e Mon Sep 17 00:00:00 2001 From: dodo920306 Date: Mon, 12 Jan 2026 22:59:44 +0800 Subject: [PATCH 3/3] Remove node operate tasks Signed-off-by: dodo920306 --- src/api-engine/api/routes/node/views.py | 68 +------------------------ 1 file changed, 1 insertion(+), 67 deletions(-) diff --git a/src/api-engine/api/routes/node/views.py b/src/api-engine/api/routes/node/views.py index e51e17ae9..7c3499cf3 100644 --- a/src/api-engine/api/routes/node/views.py +++ b/src/api-engine/api/routes/node/views.py @@ -53,7 +53,6 @@ NodeUserListSerializer, NodeConfigFileSerializer, ) -from api.tasks import operate_node from api.utils.common import with_common_response from api.lib.pki import CryptoGen, CryptoConfig from api.utils import zip_dir, zip_file @@ -919,59 +918,6 @@ def block_file(self, request, pk=None): except Exception as e: return Response(err(e.args), status=status.HTTP_400_BAD_REQUEST) - def _register_user(self, request, pk=None): - 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("Users Exist") - except ObjectDoesNotExist: - raise ResourceNotFound("Users Not Found") - - 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) - def _list_user(self, request, pk=None): serializer = NodeUserQuerySerializer(data=request.GET) if serializer.is_valid(raise_exception=True): @@ -997,15 +943,6 @@ def _list_user(self, request, pk=None): ) return Response(ok(response.data), status=status.HTTP_200_OK) - @swagger_auto_schema( - methods=["post"], - operation_description="Register user to node", - operation_summary="Register user to node", - request_body=NodeUserCreateSerializer, - responses=with_common_response( - {status.HTTP_201_CREATED: NodeUserIDSerializer} - ), - ) @swagger_auto_schema( methods=["get"], operation_description="List user of node", @@ -1022,10 +959,7 @@ def _list_user(self, request, pk=None): url_name="users", ) def users(self, request, pk=None): - if request.method == "POST": - return self._register_user(request, pk) - elif request.method == "GET": - return self._list_user(request, pk) + return self._list_user(request, pk) @swagger_auto_schema( methods=["patch"],