diff --git a/apps/assets/api/asset/cloud.py b/apps/assets/api/asset/cloud.py index 64ab6b738..96211ab6e 100644 --- a/apps/assets/api/asset/cloud.py +++ b/apps/assets/api/asset/cloud.py @@ -1,4 +1,4 @@ -from assets.models import Cloud +from assets.models import Cloud, Asset from assets.serializers import CloudSerializer from .asset import AssetViewSet @@ -8,6 +8,7 @@ __all__ = ['CloudViewSet'] class CloudViewSet(AssetViewSet): model = Cloud + perm_model = Asset def get_serializer_classes(self): serializer_classes = super().get_serializer_classes() diff --git a/apps/assets/api/asset/database.py b/apps/assets/api/asset/database.py index d4f135cbf..136f82f54 100644 --- a/apps/assets/api/asset/database.py +++ b/apps/assets/api/asset/database.py @@ -1,4 +1,4 @@ -from assets.models import Database +from assets.models import Database, Asset from assets.serializers import DatabaseSerializer from .asset import AssetViewSet @@ -8,6 +8,7 @@ __all__ = ['DatabaseViewSet'] class DatabaseViewSet(AssetViewSet): model = Database + perm_model = Asset def get_serializer_classes(self): serializer_classes = super().get_serializer_classes() diff --git a/apps/assets/api/asset/device.py b/apps/assets/api/asset/device.py index f6a457fe4..a2031ef1a 100644 --- a/apps/assets/api/asset/device.py +++ b/apps/assets/api/asset/device.py @@ -1,6 +1,5 @@ - from assets.serializers import DeviceSerializer -from assets.models import Device +from assets.models import Device, Asset from .asset import AssetViewSet __all__ = ['DeviceViewSet'] @@ -8,6 +7,7 @@ __all__ = ['DeviceViewSet'] class DeviceViewSet(AssetViewSet): model = Device + perm_model = Asset def get_serializer_classes(self): serializer_classes = super().get_serializer_classes() diff --git a/apps/assets/api/asset/host.py b/apps/assets/api/asset/host.py index fbc2e997c..d2ddc954d 100644 --- a/apps/assets/api/asset/host.py +++ b/apps/assets/api/asset/host.py @@ -1,4 +1,4 @@ -from assets.models import Host +from assets.models import Host, Asset from assets.serializers import HostSerializer from .asset import AssetViewSet @@ -7,6 +7,7 @@ __all__ = ['HostViewSet'] class HostViewSet(AssetViewSet): model = Host + perm_model = Asset def get_serializer_classes(self): serializer_classes = super().get_serializer_classes() diff --git a/apps/assets/api/asset/web.py b/apps/assets/api/asset/web.py index 92aaeff9b..363fd5f49 100644 --- a/apps/assets/api/asset/web.py +++ b/apps/assets/api/asset/web.py @@ -1,4 +1,4 @@ -from assets.models import Web +from assets.models import Web, Asset from assets.serializers import WebSerializer from .asset import AssetViewSet @@ -8,6 +8,7 @@ __all__ = ['WebViewSet'] class WebViewSet(AssetViewSet): model = Web + perm_model = Asset def get_serializer_classes(self): serializer_classes = super().get_serializer_classes() diff --git a/apps/ops/api/job.py b/apps/ops/api/job.py index 0f37732bd..0cf8ade0c 100644 --- a/apps/ops/api/job.py +++ b/apps/ops/api/job.py @@ -5,11 +5,12 @@ from rest_framework.response import Response from ops.models import Job, JobExecution from ops.serializers.job import JobSerializer, JobExecutionSerializer -__all__ = ['JobViewSet', 'JobExecutionViewSet', 'JobRunVariableHelpAPIView', 'JobAssetDetail', ] +__all__ = ['JobViewSet', 'JobExecutionViewSet', 'JobRunVariableHelpAPIView', 'JobAssetDetail', 'JobExecutionTaskDetail'] from ops.tasks import run_ops_job_execution from ops.variables import JMS_JOB_VARIABLE_HELP from orgs.mixins.api import OrgBulkModelViewSet +from orgs.utils import tmp_to_org, get_current_org_id, get_current_org def set_task_to_serializer_data(serializer, task): @@ -93,3 +94,20 @@ class JobAssetDetail(APIView): if execution_id: execution = get_object_or_404(JobExecution, id=execution_id) return Response(data=execution.assent_result_detail) + + +class JobExecutionTaskDetail(APIView): + rbac_perms = () + permission_classes = () + + def get(self, request, **kwargs): + org = get_current_org() + task_id = request.query_params.get('task_id') + if task_id: + with tmp_to_org(org): + execution = get_object_or_404(JobExecution, task_id=task_id) + return Response(data={ + 'is_finished': execution.is_finished, + 'is_success': execution.is_success, + 'time_cost': execution.time_cost, + }) diff --git a/apps/ops/urls/api_urls.py b/apps/ops/urls/api_urls.py index 6fad435bf..20f581b1d 100644 --- a/apps/ops/urls/api_urls.py +++ b/apps/ops/urls/api_urls.py @@ -25,6 +25,7 @@ router.register(r'task-executions', api.CeleryTaskExecutionViewSet, 'task-execut urlpatterns = [ path('variables/help/', api.JobRunVariableHelpAPIView.as_view(), name='variable-help'), path('job-execution/asset-detail/', api.JobAssetDetail.as_view(), name='asset-detail'), + path('job-execution/task-detail/', api.JobExecutionTaskDetail.as_view(), name='task-detail'), path('ansible/job-execution//log/', api.AnsibleTaskLogApi.as_view(), name='job-execution-log'), path('celery/task//task-execution//log/', api.CeleryTaskExecutionLogApi.as_view(), diff --git a/apps/ops/ws.py b/apps/ops/ws.py index 24023a33e..5c261f76f 100644 --- a/apps/ops/ws.py +++ b/apps/ops/ws.py @@ -67,11 +67,12 @@ class TaskLogWebsocket(AsyncJsonWebsocketConsumer): task_end_mark.append(1) elif len(task_end_mark) == 2: logger.debug('Task log end: {}'.format(task_id)) + await self.send_json({'event': 'end', 'task': task_id}) break await asyncio.sleep(0.2) except OSError as e: logger.warn('Task log path open failed: {}'.format(e)) - await self.close() + # await self.close() async def disconnect(self, close_code): self.disconnected = True diff --git a/apps/rbac/const.py b/apps/rbac/const.py index 27381640c..d63c2f610 100644 --- a/apps/rbac/const.py +++ b/apps/rbac/const.py @@ -36,6 +36,11 @@ exclude_permissions = ( ('assets', 'gathereduser', 'add,delete,change', 'gathereduser'), ('assets', 'accountbackupplanexecution', 'delete,change', 'accountbackupplanexecution'), ('assets', 'gathereduser', 'add,delete,change', 'gathereduser'), + ('assets', 'web', '*', '*'), + ('assets', 'host', '*', '*'), + ('assets', 'cloud', '*', '*'), + ('assets', 'device', '*', '*'), + ('assets', 'database', '*', '*'), ('assets', 'protocol', '*', '*'), ('assets', 'systemuser', '*', '*'), ('assets', 'baseautomation', '*', '*'),