diff --git a/apps/assets/api/node.py b/apps/assets/api/node.py index a5f9fff8a..9538a265c 100644 --- a/apps/assets/api/node.py +++ b/apps/assets/api/node.py @@ -96,4 +96,5 @@ class NodeRemoveAssetsApi(generics.UpdateAPIView): def perform_update(self, serializer): assets = serializer.validated_data.get('assets') instance = self.get_object() - instance.assets.remove(*tuple(assets)) + if instance != Node.root(): + instance.assets.remove(*tuple(assets)) diff --git a/apps/assets/forms/asset.py b/apps/assets/forms/asset.py index f2d3d2783..f8cab4abb 100644 --- a/apps/assets/forms/asset.py +++ b/apps/assets/forms/asset.py @@ -64,7 +64,10 @@ class AssetUpdateForm(forms.ModelForm): 'ip': '* required', 'port': '* required', 'cluster': '* required', - 'admin_user': _('') + 'admin_user': _( + 'Admin user is a privilege user exist on this asset,' + 'Example: root or other NOPASSWD sudo privilege user' + ) } diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index a8c24420f..999b9e016 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -238,6 +238,13 @@ class SystemUser(AssetUser): 'auto_push': self.auto_push, } + @property + def assets(self): + assets = set() + for node in self.nodes.all(): + assets.update(set(node.get_all_assets())) + return assets + @property def assets_connective(self): _result = cache.get(SYSTEM_USER_CONN_CACHE_KEY.format(self.name), {}) diff --git a/apps/assets/serializers/node.py b/apps/assets/serializers/node.py index 88a270917..09bd17ff2 100644 --- a/apps/assets/serializers/node.py +++ b/apps/assets/serializers/node.py @@ -14,11 +14,12 @@ class NodeGrantedSerializer(BulkSerializerMixin, serializers.ModelSerializer): assets_granted = AssetGrantedSerializer(many=True, read_only=True) assets_amount = serializers.SerializerMethodField() parent = serializers.SerializerMethodField() + name = serializers.SerializerMethodField() class Meta: model = Node fields = [ - 'id', 'key', 'value', 'parent', + 'id', 'key', 'name', 'value', 'parent', 'assets_granted', 'assets_amount', ] @@ -26,6 +27,10 @@ class NodeGrantedSerializer(BulkSerializerMixin, serializers.ModelSerializer): def get_assets_amount(obj): return len(obj.assets_granted) + @staticmethod + def get_name(obj): + return obj.name + @staticmethod def get_parent(obj): return obj.parent.id diff --git a/apps/assets/serializers/system_user.py b/apps/assets/serializers/system_user.py index e454cbbbc..794c841f2 100644 --- a/apps/assets/serializers/system_user.py +++ b/apps/assets/serializers/system_user.py @@ -33,8 +33,7 @@ class SystemUserSerializer(serializers.ModelSerializer): @staticmethod def get_assets_amount(obj): - amount = 0 - return amount + return len(obj.assets) class AssetSystemUserSerializer(serializers.ModelSerializer): diff --git a/apps/assets/signals_handler.py b/apps/assets/signals_handler.py index 95c57e4cb..2577c7a6c 100644 --- a/apps/assets/signals_handler.py +++ b/apps/assets/signals_handler.py @@ -24,9 +24,15 @@ def test_asset_conn_on_created(asset): test_asset_connectability_util.delay(asset) +def set_asset_root_node(asset): + logger.debug("Set asset default node: {}".format(Node.root())) + asset.nodes.add(Node.root()) + + @receiver(post_save, sender=Asset, dispatch_uid="my_unique_identifier") -def on_asset_created(sender, instance=None, created=False, **kwargs): - if instance and created: +def on_asset_created_or_update(sender, instance=None, created=False, **kwargs): + set_asset_root_node(instance) + if created: logger.info("Asset `{}` create signal received".format(instance)) update_asset_hardware_info_on_created(instance) test_asset_conn_on_created(instance) diff --git a/apps/assets/tasks.py b/apps/assets/tasks.py index a64eff231..30f463597 100644 --- a/apps/assets/tasks.py +++ b/apps/assets/tasks.py @@ -166,6 +166,8 @@ def test_admin_user_connectability_util(admin_user, task_name): assets = admin_user.get_related_assets() hosts = [asset.hostname for asset in assets] + if not hosts: + return tasks = const.TEST_ADMIN_USER_CONN_TASKS task, created = update_or_create_ansible_task( task_name=task_name, hosts=hosts, tasks=tasks, pattern='all', @@ -184,19 +186,10 @@ def test_admin_user_connectability_period(): """ A period task that update the ansible task period """ - from ops.utils import update_or_create_ansible_task admin_users = AdminUser.objects.all() for admin_user in admin_users: - task_name = _("Test admin user connectability period: {}").format(admin_user) - assets = admin_user.get_related_assets() - hosts = [asset.hostname for asset in assets] - tasks = const.TEST_ADMIN_USER_CONN_TASKS - update_or_create_ansible_task( - task_name=task_name, hosts=hosts, tasks=tasks, pattern='all', - options=const.TASK_OPTIONS, run_as_admin=True, created_by='System', - interval=3600, is_periodic=True, - callback=set_admin_user_connectability_info.name, - ) + task_name = _("Test admin user connectability period: {}".format(admin_user.name)) + test_admin_user_connectability_util(admin_user, task_name) @shared_task @@ -262,23 +255,21 @@ def test_system_user_connectability_util(system_user, task_name): :param task_name: :return: """ - # todo - # from ops.utils import update_or_create_ansible_task - # assets = system_user.get_clusters_assets() - # hosts = [asset.hostname for asset in assets] - # tasks = const.TEST_SYSTEM_USER_CONN_TASKS - # if not hosts: - # logger.info("No hosts, passed") - # return {} - # task, created = update_or_create_ansible_task( - # task_name, hosts=hosts, tasks=tasks, pattern='all', - # options=const.TASK_OPTIONS, - # run_as=system_user.name, created_by="System", - # ) - # result = task.run() - # set_system_user_connectablity_info(result, system_user=system_user.name) - # return result - return {} + from ops.utils import update_or_create_ansible_task + assets = system_user.assets + hosts = [asset.hostname for asset in assets] + tasks = const.TEST_SYSTEM_USER_CONN_TASKS + if not hosts: + logger.info("No hosts, passed") + return {} + task, created = update_or_create_ansible_task( + task_name, hosts=hosts, tasks=tasks, pattern='all', + options=const.TASK_OPTIONS, + run_as=system_user.name, created_by="System", + ) + result = task.run() + set_system_user_connectablity_info(result, system_user=system_user.name) + return result @shared_task @@ -292,23 +283,10 @@ def test_system_user_connectability_manual(system_user): @after_app_ready_start @after_app_shutdown_clean def test_system_user_connectability_period(): - # Todo - pass - # from ops.utils import update_or_create_ansible_task - # system_users = SystemUser.objects.all() - # for system_user in system_users: - # task_name = _("Test system user connectability period: {}").format( - # system_user.name - # ) - # assets = system_user.get_clusters_assets() - # hosts = [asset.hostname for asset in assets] - # tasks = const.TEST_SYSTEM_USER_CONN_TASKS - # update_or_create_ansible_task( - # task_name=task_name, hosts=hosts, tasks=tasks, pattern='all', - # options=const.TASK_OPTIONS, run_as_admin=False, run_as=system_user.name, - # created_by='System', interval=3600, is_periodic=True, - # callback=set_admin_user_connectability_info.name, - # ) + system_users = SystemUser.objects.all() + for system_user in system_users: + task_name = _("test system user connectability period: {}".format(system_user)) + test_system_user_connectability_util(system_user, task_name) #### Push system user tasks #### @@ -416,10 +394,10 @@ def push_node_system_users_to_asset(node, assets): push_system_user_util.delay(system_users, assets, task_name) -@shared_task -@register_as_period_task(interval=3600) -@after_app_ready_start -@after_app_shutdown_clean -def push_system_user_period(): - for system_user in SystemUser.objects.all(): - push_system_user_related_nodes(system_user) +# @shared_task +# @register_as_period_task(interval=3600) +# @after_app_ready_start +# # @after_app_shutdown_clean +# def push_system_user_period(): +# for system_user in SystemUser.objects.all(): +# push_system_user_related_nodes(system_user) diff --git a/apps/assets/templates/assets/admin_user_list.html b/apps/assets/templates/assets/admin_user_list.html index f7c13a32f..bb9286150 100644 --- a/apps/assets/templates/assets/admin_user_list.html +++ b/apps/assets/templates/assets/admin_user_list.html @@ -5,7 +5,7 @@ {% block help_message %}
{% endblock %} diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html index dbcb8a350..7c4c9fd8e 100644 --- a/apps/assets/templates/assets/asset_list.html +++ b/apps/assets/templates/assets/asset_list.html @@ -5,6 +5,7 @@ {% block custom_head_css_js %} +