From 07898004b087ce07c0756a14f47ce4a7b138dae6 Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 20 Jul 2021 14:48:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=B0=E5=AF=8C=E8=B5=84=E4=BA=A7?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1API=E5=88=9B=E5=BB=BA=EF=BC=9B=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=92=88=E5=AF=B9=E5=A4=9A=E4=B8=AA=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=B8=80=E4=B8=AA=E8=B5=84=E4=BA=A7=E7=9A=84?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E5=92=8C=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/api/asset.py | 45 ++++++++++++++++--- apps/assets/models/asset.py | 7 +++ apps/assets/serializers/asset.py | 17 ++++++- apps/assets/tasks/push_system_user.py | 12 ++++- apps/assets/tasks/system_user_connectivity.py | 7 +++ 5 files changed, 77 insertions(+), 11 deletions(-) diff --git a/apps/assets/api/asset.py b/apps/assets/api/asset.py index b4ed17556..788b91257 100644 --- a/apps/assets/api/asset.py +++ b/apps/assets/api/asset.py @@ -9,10 +9,11 @@ from common.utils import get_logger, get_object_or_none from common.permissions import IsOrgAdmin, IsOrgAdminOrAppUser, IsSuperUser from orgs.mixins.api import OrgBulkModelViewSet from orgs.mixins import generics -from ..models import Asset, Node, Platform +from ..models import Asset, Node, Platform, SystemUser from .. import serializers from ..tasks import ( - update_assets_hardware_info_manual, test_assets_connectivity_manual + update_assets_hardware_info_manual, test_assets_connectivity_manual, + test_system_users_connectivity_a_asset, push_system_users_a_asset ) from ..filters import FilterAssetByNodeFilterBackend, LabelFilterBackend, IpInFilterBackend @@ -94,21 +95,27 @@ class AssetPlatformViewSet(ModelViewSet): class AssetsTaskMixin: + def perform_assets_task(self, serializer): data = serializer.validated_data - assets = data['assets'] action = data['action'] + assets = data.get('assets', []) if action == "refresh": task = update_assets_hardware_info_manual.delay(assets) else: + # action == 'test': task = test_assets_connectivity_manual.delay(assets) + return task + + def perform_create(self, serializer): + task = self.perform_assets_task(serializer) + self.set_task_to_serializer_data(serializer, task) + + def set_task_to_serializer_data(self, serializer, task): data = getattr(serializer, '_data', {}) data["task"] = task.id setattr(serializer, '_data', data) - def perform_create(self, serializer): - self.perform_assets_task(serializer) - class AssetTaskCreateApi(AssetsTaskMixin, generics.CreateAPIView): model = Asset @@ -117,13 +124,37 @@ class AssetTaskCreateApi(AssetsTaskMixin, generics.CreateAPIView): def create(self, request, *args, **kwargs): pk = self.kwargs.get('pk') + request.data['asset'] = pk request.data['assets'] = [pk] return super().create(request, *args, **kwargs) + def perform_asset_task(self, serializer): + data = serializer.validated_data + action = data['action'] + if action not in ['push_system_user', 'test_system_user']: + return + asset = data['asset'] + system_users = data.get('system_users') + if not system_users: + system_users = asset.get_all_systemusers() + if action == 'push_system_user': + task = push_system_users_a_asset.delay(system_users, asset=asset) + elif action == 'test_system_user': + task = test_system_users_connectivity_a_asset.delay(system_users, asset=asset) + else: + task = None + return task + + def perform_create(self, serializer): + task = self.perform_asset_task(serializer) + if not task: + task = self.perform_assets_task(serializer) + self.set_task_to_serializer_data(serializer, task) + class AssetsTaskCreateApi(AssetsTaskMixin, generics.CreateAPIView): model = Asset - serializer_class = serializers.AssetTaskSerializer + serializer_class = serializers.AssetsTaskSerializer permission_classes = (IsOrgAdmin,) diff --git a/apps/assets/models/asset.py b/apps/assets/models/asset.py index 523ef7d07..829c13f75 100644 --- a/apps/assets/models/asset.py +++ b/apps/assets/models/asset.py @@ -345,6 +345,13 @@ class Asset(AbsConnectivity, ProtocolsMixin, NodesRelationMixin, OrgModelMixin): tree_node = TreeNode(**data) return tree_node + def get_all_systemusers(self): + from .user import SystemUser + system_user_ids = SystemUser.assets.through.objects.filter(asset=self)\ + .values_list('systemuser_id', flat=True) + system_users = SystemUser.objects.filter(id__in=system_user_ids) + return system_users + class Meta: unique_together = [('org_id', 'hostname')] verbose_name = _("Asset") diff --git a/apps/assets/serializers/asset.py b/apps/assets/serializers/asset.py index 021610551..3a1245812 100644 --- a/apps/assets/serializers/asset.py +++ b/apps/assets/serializers/asset.py @@ -10,7 +10,7 @@ from ..models import Asset, Node, Platform, SystemUser __all__ = [ 'AssetSerializer', 'AssetSimpleSerializer', 'ProtocolsField', 'PlatformSerializer', - 'AssetTaskSerializer', + 'AssetTaskSerializer', 'AssetsTaskSerializer' ] @@ -183,7 +183,7 @@ class AssetSimpleSerializer(serializers.ModelSerializer): fields = ['id', 'hostname', 'ip', 'port', 'connectivity', 'date_verified'] -class AssetTaskSerializer(serializers.Serializer): +class AssetsTaskSerializer(serializers.Serializer): ACTION_CHOICES = ( ('refresh', 'refresh'), ('test', 'test'), @@ -193,3 +193,16 @@ class AssetTaskSerializer(serializers.Serializer): assets = serializers.PrimaryKeyRelatedField( queryset=Asset.objects, required=False, allow_empty=True, many=True ) + + +class AssetTaskSerializer(AssetsTaskSerializer): + ACTION_CHOICES = tuple(list(AssetsTaskSerializer.ACTION_CHOICES) + [ + ('push_system_user', 'push_system_user'), + ('test_system_user', 'test_system_user') + ]) + asset = serializers.PrimaryKeyRelatedField( + queryset=Asset.objects, required=False, allow_empty=True, many=False + ) + system_users = serializers.PrimaryKeyRelatedField( + queryset=SystemUser.objects, required=False, allow_empty=True, many=True + ) diff --git a/apps/assets/tasks/push_system_user.py b/apps/assets/tasks/push_system_user.py index f640e03a1..7534e5de2 100644 --- a/apps/assets/tasks/push_system_user.py +++ b/apps/assets/tasks/push_system_user.py @@ -17,6 +17,7 @@ logger = get_logger(__file__) __all__ = [ 'push_system_user_util', 'push_system_user_to_assets', 'push_system_user_to_assets_manual', 'push_system_user_a_asset_manual', + 'push_system_users_a_asset' ] @@ -280,14 +281,21 @@ def push_system_user_a_asset_manual(system_user, asset, username=None): """ 将系统用户推送到一个资产上 """ - if username is None: - username = system_user.username + # if username is None: + # username = system_user.username task_name = _("Push system users to asset: {}({}) => {}").format( system_user.name, username, asset ) return push_system_user_util(system_user, [asset], task_name=task_name, username=username) +@shared_task(queue="ansible") +@tmp_to_root_org() +def push_system_users_a_asset(system_users, asset): + for system_user in system_users: + push_system_user_a_asset_manual(system_user, asset) + + @shared_task(queue="ansible") @tmp_to_root_org() def push_system_user_to_assets(system_user_id, asset_ids, username=None): diff --git a/apps/assets/tasks/system_user_connectivity.py b/apps/assets/tasks/system_user_connectivity.py index 5b0cf5845..d7252fa72 100644 --- a/apps/assets/tasks/system_user_connectivity.py +++ b/apps/assets/tasks/system_user_connectivity.py @@ -18,6 +18,7 @@ logger = get_logger(__name__) __all__ = [ 'test_system_user_connectivity_util', 'test_system_user_connectivity_manual', 'test_system_user_connectivity_period', 'test_system_user_connectivity_a_asset', + 'test_system_users_connectivity_a_asset' ] @@ -131,6 +132,12 @@ def test_system_user_connectivity_a_asset(system_user, asset): test_system_user_connectivity_util(system_user, [asset], task_name) +@shared_task(queue="ansible") +def test_system_users_connectivity_a_asset(system_users, asset): + for system_user in system_users: + test_system_user_connectivity_a_asset(system_user, asset) + + @shared_task(queue="ansible") def test_system_user_connectivity_period(): if not const.PERIOD_TASK_ENABLED: