diff --git a/apps/assets/api/system_user_relation.py b/apps/assets/api/system_user_relation.py index 86037229e..cd7b64a68 100644 --- a/apps/assets/api/system_user_relation.py +++ b/apps/assets/api/system_user_relation.py @@ -75,7 +75,7 @@ class SystemUserAssetRelationViewSet(BaseRelationViewSet): ] search_fields = [ "id", "asset__hostname", "asset__ip", - "systemuser__name", "systemuser__username" + "systemuser__name", "systemuser__username", ] def get_objects_attr(self): diff --git a/apps/assets/models/authbook.py b/apps/assets/models/authbook.py index 493ed1126..b3b8bbbdc 100644 --- a/apps/assets/models/authbook.py +++ b/apps/assets/models/authbook.py @@ -3,10 +3,9 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ - from simple_history.models import HistoricalRecords - +from common.utils import lazyproperty from .base import BaseUser, AbsConnectivity __all__ = ['AuthBook'] @@ -17,6 +16,7 @@ class AuthBook(BaseUser, AbsConnectivity): systemuser = models.ForeignKey('assets.SystemUser', on_delete=models.CASCADE, null=True, verbose_name=_("System user")) version = models.IntegerField(default=1, verbose_name=_('Version')) history = HistoricalRecords() + _systemuser_display = '' auth_attrs = ['username', 'password', 'private_key', 'public_key'] @@ -63,8 +63,10 @@ class AuthBook(BaseUser, AbsConnectivity): def username_display(self): return self.get_or_systemuser_attr('username') or '*' - @property + @lazyproperty def systemuser_display(self): + if self._systemuser_display: + return self._systemuser_display if not self.systemuser: return '' return str(self.systemuser) diff --git a/apps/assets/serializers/asset.py b/apps/assets/serializers/asset.py index b2a65fad7..d329575eb 100644 --- a/apps/assets/serializers/asset.py +++ b/apps/assets/serializers/asset.py @@ -83,7 +83,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer): 'hardware_info', 'connectivity', 'date_verified' ] fields_fk = [ - 'domain', 'domain_display', 'platform', 'admin_user', 'admin_user_display' + 'domain', 'domain_display', 'platform', 'admin_user', ] fields_m2m = [ 'nodes', 'nodes_display', 'labels', @@ -97,7 +97,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer): 'protocol': {'write_only': True}, 'port': {'write_only': True}, 'hardware_info': {'label': _('Hardware info')}, - 'org_name': {'label': _('Org name')} + 'org_name': {'label': _('Org name')}, } def get_fields(self): @@ -168,6 +168,9 @@ class AssetVerboseSerializer(AssetSerializer): queryset=SystemUser.objects, label=_('Admin user') ) + class Meta(AssetSerializer.Meta): + fields = AssetSerializer.Meta.fields + ['admin_user_display'] + class PlatformSerializer(serializers.ModelSerializer): meta = serializers.DictField(required=False, allow_null=True, label=_('Meta')) diff --git a/apps/assets/serializers/system_user.py b/apps/assets/serializers/system_user.py index 88fc0ab9f..a8b4f815b 100644 --- a/apps/assets/serializers/system_user.py +++ b/apps/assets/serializers/system_user.py @@ -249,8 +249,8 @@ class SystemUserAssetRelationSerializer(RelationMixin, serializers.ModelSerializ class Meta: model = SystemUser.assets.through fields = [ - "id", "asset", "asset_display", - 'systemuser', 'systemuser_display' + "id", "asset", "asset_display", 'systemuser', 'systemuser_display', + "connectivity", 'date_verified', ] use_model_bulk_create = True model_bulk_create_kwargs = { diff --git a/apps/assets/tasks/system_user_connectivity.py b/apps/assets/tasks/system_user_connectivity.py index 87152c8cc..91264c1c7 100644 --- a/apps/assets/tasks/system_user_connectivity.py +++ b/apps/assets/tasks/system_user_connectivity.py @@ -8,7 +8,7 @@ from django.utils.translation import ugettext as _ from assets.models import Asset from common.utils import get_logger from orgs.utils import tmp_to_org, org_aware_func -from ..models import SystemUser +from ..models import SystemUser, Connectivity, AuthBook from . import const from .utils import ( clean_ansible_task_hosts, group_asset_by_platform @@ -21,6 +21,25 @@ __all__ = [ ] +def set_assets_accounts_connectivity(system_user, assets, results_summary): + asset_ids_ok = set() + asset_ids_failed = set() + + asset_hostnames_ok = results_summary.get('contacted', {}).keys() + + for asset in assets: + if asset.hostname in asset_hostnames_ok: + asset_ids_ok.add(asset.id) + else: + asset_ids_failed.add(asset.id) + + accounts_ok = AuthBook.objects.filter(asset_id__in=asset_ids_ok, systemuser=system_user) + accounts_failed = AuthBook.objects.filter(asset_id__in=asset_ids_failed, systemuser=system_user) + + AuthBook.bulk_set_connectivity(accounts_ok, Connectivity.ok) + AuthBook.bulk_set_connectivity(accounts_failed, Connectivity.failed) + + @org_aware_func("system_user") def test_system_user_connectivity_util(system_user, assets, task_name): """ @@ -32,9 +51,13 @@ def test_system_user_connectivity_util(system_user, assets, task_name): """ from ops.utils import update_or_create_ansible_task + if system_user.username_same_with_user: + logger.error(_("Dynamic system user not support test")) + return + # hosts = clean_ansible_task_hosts(assets, system_user=system_user) # TODO: 这里不传递系统用户,因为clean_ansible_task_hosts会通过system_user来判断是否可以推送, - # 不符合测试可连接性逻辑, 后面需要优化此逻辑 + # 不符合测试可连接性逻辑, 后面需要优化此逻辑 hosts = clean_ansible_task_hosts(assets) if not hosts: return {} @@ -81,17 +104,10 @@ def test_system_user_connectivity_util(system_user, assets, task_name): print(_("Start test system user connectivity for platform: [{}]").format(platform)) print(_("Hosts count: {}").format(len(_hosts))) # 用户名不是动态的,用户名则是一个 - if not system_user.username_same_with_user: - logger.debug("System user not has special auth") - run_task(tasks, _hosts, system_user.username) - # 否则需要多个任务 - else: - users = system_user.users.all().values_list('username', flat=True) - print(_("System user is dynamic: {}").format(list(users))) - for username in users: - run_task(tasks, _hosts, username) + logger.debug("System user not has special auth") + run_task(tasks, _hosts, system_user.username) - system_user.set_connectivity(results_summary) + set_assets_accounts_connectivity(system_user, hosts, results_summary) return results_summary