提交 1472f043 编写于 作者: baltery's avatar baltery

[update] 修改一些性能问题

上级 218e4253
...@@ -149,9 +149,10 @@ class AssetUserTestConnectiveApi(generics.RetrieveAPIView): ...@@ -149,9 +149,10 @@ class AssetUserTestConnectiveApi(generics.RetrieveAPIView):
def get_asset_users(self): def get_asset_users(self):
username = self.request.GET.get('username') username = self.request.GET.get('username')
asset_id = self.request.GET.get('asset_id') asset_id = self.request.GET.get('asset_id')
prefer = self.request.GET.get("prefer")
asset = get_object_or_none(Asset, pk=asset_id) asset = get_object_or_none(Asset, pk=asset_id)
manager = AssetUserManager() manager = AssetUserManager()
asset_users = manager.filter(username=username, assets=[asset]) asset_users = manager.filter(username=username, assets=[asset], prefer=prefer)
return asset_users return asset_users
def retrieve(self, request, *args, **kwargs): def retrieve(self, request, *args, **kwargs):
......
...@@ -126,6 +126,7 @@ class Asset(OrgModelMixin): ...@@ -126,6 +126,7 @@ class Asset(OrgModelMixin):
comment = models.TextField(max_length=128, default='', blank=True, verbose_name=_('Comment')) comment = models.TextField(max_length=128, default='', blank=True, verbose_name=_('Comment'))
objects = OrgManager.from_queryset(AssetQuerySet)() objects = OrgManager.from_queryset(AssetQuerySet)()
_connectivity = None
def __str__(self): def __str__(self):
return '{0.hostname}({0.ip})'.format(self) return '{0.hostname}({0.ip})'.format(self)
...@@ -221,17 +222,18 @@ class Asset(OrgModelMixin): ...@@ -221,17 +222,18 @@ class Asset(OrgModelMixin):
@property @property
def connectivity(self): def connectivity(self):
if self._connectivity:
return self._connectivity
if not self.admin_user: if not self.admin_user:
return Connectivity.unknown() return Connectivity.unknown()
instance = self.admin_user.get_asset_user(self) connectivity = self.admin_user.get_asset_connectivity(self)
return instance.connectivity return connectivity
@connectivity.setter @connectivity.setter
def connectivity(self, value): def connectivity(self, value):
if not self.admin_user: if not self.admin_user:
return return
instance = self.admin_user.get_asset_user(self) self.admin_user.set_asset_connectivity(self, value)
instance.set_asset_connectivity(self, value)
def get_auth_info(self): def get_auth_info(self):
if not self.admin_user: if not self.admin_user:
......
...@@ -35,8 +35,8 @@ class AssetUser(OrgModelMixin): ...@@ -35,8 +35,8 @@ class AssetUser(OrgModelMixin):
date_updated = models.DateTimeField(auto_now=True, verbose_name=_("Date updated")) date_updated = models.DateTimeField(auto_now=True, verbose_name=_("Date updated"))
created_by = models.CharField(max_length=128, null=True, verbose_name=_('Created by')) created_by = models.CharField(max_length=128, null=True, verbose_name=_('Created by'))
CONNECTIVITY_ASSET_CACHE_KEY = "ASSET_USER_{}_ASSET_CONNECTIVITY" CONNECTIVITY_ASSET_CACHE_KEY = "ASSET_USER_{}_{}_ASSET_CONNECTIVITY"
CONNECTIVITY_AMOUNT_CACHE_KEY = "ASSET_USER_{}_CONNECTIVITY_AMOUNT" CONNECTIVITY_AMOUNT_CACHE_KEY = "ASSET_USER_{}_{}_CONNECTIVITY_AMOUNT"
ASSETS_AMOUNT_CACHE_KEY = "ASSET_USER_{}_ASSETS_AMOUNT" ASSETS_AMOUNT_CACHE_KEY = "ASSET_USER_{}_ASSETS_AMOUNT"
ASSET_USER_CACHE_TIME = 3600 * 24 ASSET_USER_CACHE_TIME = 3600 * 24
...@@ -99,21 +99,24 @@ class AssetUser(OrgModelMixin): ...@@ -99,21 +99,24 @@ class AssetUser(OrgModelMixin):
unreachable = summary.get('dark', {}).keys() unreachable = summary.get('dark', {}).keys()
reachable = summary.get('contacted', {}).keys() reachable = summary.get('contacted', {}).keys()
for asset in self.get_related_assets(): assets = self.get_related_assets()
if not isinstance(assets, list):
assets = assets.only('id', 'hostname', 'admin_user__id')
for asset in assets:
if asset.hostname in unreachable: if asset.hostname in unreachable:
self.set_asset_connectivity(asset, Connectivity.unreachable()) self.set_asset_connectivity(asset, Connectivity.unreachable())
elif asset.hostname in reachable: elif asset.hostname in reachable:
self.set_asset_connectivity(asset, Connectivity.reachable()) self.set_asset_connectivity(asset, Connectivity.reachable())
else: else:
self.set_asset_connectivity(asset, Connectivity.unknown()) self.set_asset_connectivity(asset, Connectivity.unknown())
cache_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.part_id) cache_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.username, self.part_id)
cache.delete(cache_key) cache.delete(cache_key)
@property @property
def connectivity(self): def connectivity(self):
assets = self.get_related_assets()\ assets = self.get_related_assets()
.select_related('admin_user')\ if not isinstance(assets, list):
.only('id', 'hostname', 'admin_user') assets = assets.only('id', 'hostname', 'admin_user__id')
data = { data = {
'unreachable': [], 'unreachable': [],
'reachable': [], 'reachable': [],
...@@ -131,11 +134,11 @@ class AssetUser(OrgModelMixin): ...@@ -131,11 +134,11 @@ class AssetUser(OrgModelMixin):
@property @property
def connectivity_amount(self): def connectivity_amount(self):
cache_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.part_id) cache_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.username, self.part_id)
amount = cache.get(cache_key) amount = cache.get(cache_key)
if not amount: if not amount:
connectivity = {k: len(v) for k, v in self.connectivity.items()} amount = {k: len(v) for k, v in self.connectivity.items()}
cache.set(cache_key, connectivity, self.ASSET_USER_CACHE_TIME) cache.set(cache_key, amount, self.ASSET_USER_CACHE_TIME)
return amount return amount
@property @property
...@@ -152,17 +155,18 @@ class AssetUser(OrgModelMixin): ...@@ -152,17 +155,18 @@ class AssetUser(OrgModelMixin):
cache.delete(cache_key) cache.delete(cache_key)
def get_asset_connectivity(self, asset): def get_asset_connectivity(self, asset):
i = self.generate_id_with_asset(asset) key = self.get_asset_connectivity_key(asset)
key = self.CONNECTIVITY_ASSET_CACHE_KEY.format(i)
return Connectivity.get(key) return Connectivity.get(key)
def get_asset_connectivity_key(self, asset):
return self.CONNECTIVITY_ASSET_CACHE_KEY.format(self.username, asset.id)
def set_asset_connectivity(self, asset, c): def set_asset_connectivity(self, asset, c):
i = self.generate_id_with_asset(asset) key = self.get_asset_connectivity_key(asset)
key = self.CONNECTIVITY_ASSET_CACHE_KEY.format(i)
Connectivity.set(key, c) Connectivity.set(key, c)
# 当为某个系统用户或管理用户设置的的时候,失效掉他们的连接数量 # 当为某个系统用户或管理用户设置的的时候,失效掉他们的连接数量
amount_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.part_id) amount_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.username, '*')
cache.delete(amount_key) cache.delete_pattern(amount_key)
def get_asset_user(self, asset): def get_asset_user(self, asset):
from ..backends import AssetUserManager from ..backends import AssetUserManager
......
...@@ -98,5 +98,11 @@ class Connectivity: ...@@ -98,5 +98,11 @@ class Connectivity:
def __eq__(self, other): def __eq__(self, other):
return self.status == other.status return self.status == other.status
def __gt__(self, other):
return self.status > other.status
def __lt__(self, other):
return not self.__gt__(other)
def __str__(self): def __str__(self):
return self.display() return self.display()
...@@ -2,12 +2,12 @@ ...@@ -2,12 +2,12 @@
# #
from rest_framework import serializers from rest_framework import serializers
from rest_framework.validators import ValidationError from rest_framework.validators import ValidationError
from django.db.models import Prefetch
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from orgs.mixins import BulkOrgResourceModelSerializer from orgs.mixins import BulkOrgResourceModelSerializer
from common.serializers import AdaptedBulkListSerializer from common.serializers import AdaptedBulkListSerializer
from ..models import Asset, Protocol from ..models import Asset, Protocol, Node, Label
from .base import ConnectivitySerializer from .base import ConnectivitySerializer
__all__ = [ __all__ = [
...@@ -58,7 +58,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer): ...@@ -58,7 +58,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer):
'cpu_model', 'cpu_count', 'cpu_cores', 'cpu_vcpus', 'memory', 'cpu_model', 'cpu_count', 'cpu_cores', 'cpu_vcpus', 'memory',
'disk_total', 'disk_info', 'os', 'os_version', 'os_arch', 'disk_total', 'disk_info', 'os', 'os_version', 'os_arch',
'hostname_raw', 'comment', 'created_by', 'date_created', 'hostname_raw', 'comment', 'created_by', 'date_created',
'hardware_info', 'connectivity' 'hardware_info', 'connectivity',
] ]
read_only_fields = ( read_only_fields = (
'vendor', 'model', 'sn', 'cpu_model', 'cpu_count', 'vendor', 'model', 'sn', 'cpu_model', 'cpu_count',
...@@ -76,8 +76,11 @@ class AssetSerializer(BulkOrgResourceModelSerializer): ...@@ -76,8 +76,11 @@ class AssetSerializer(BulkOrgResourceModelSerializer):
@classmethod @classmethod
def setup_eager_loading(cls, queryset): def setup_eager_loading(cls, queryset):
""" Perform necessary eager loading of data. """ """ Perform necessary eager loading of data. """
queryset = queryset.prefetch_related('labels', 'nodes', 'protocols')\ queryset = queryset.prefetch_related(
.select_related('admin_user', 'domain') Prefetch('nodes', queryset=Node.objects.all().only('id')),
Prefetch('labels', queryset=Label.objects.all().only('id')),
'protocols'
).select_related('admin_user', 'domain')
return queryset return queryset
@staticmethod @staticmethod
......
...@@ -576,6 +576,7 @@ def test_asset_user_connectivity_util(asset_user, task_name, run_as_admin=False) ...@@ -576,6 +576,7 @@ def test_asset_user_connectivity_util(asset_user, task_name, run_as_admin=False)
tasks = get_test_asset_user_connectivity_tasks(asset_user.asset) tasks = get_test_asset_user_connectivity_tasks(asset_user.asset)
if not tasks: if not tasks:
logger.debug("No tasks ")
return return
args = (task_name,) args = (task_name,)
......
...@@ -92,8 +92,8 @@ function initAssetUserTable() { ...@@ -92,8 +92,8 @@ function initAssetUserTable() {
ajax_url: assetUserListUrl, ajax_url: assetUserListUrl,
columns: [ columns: [
{data: "id"}, {data: "hostname"}, {data: "ip"}, {data: "id"}, {data: "hostname"}, {data: "ip"},
{data: "username", orderable: false}, {data: "version", orderable: false}, {data: "username"}, {data: "version", orderable: false},
{data: "connectivity", orderable: false}, {data: "connectivity"},
{data: "date_created", orderable: false}, {data: "date_created", orderable: false},
{data: "asset", orderable: false} {data: "asset", orderable: false}
], ],
......
...@@ -75,7 +75,7 @@ function initTable() { ...@@ -75,7 +75,7 @@ function initTable() {
}}, }},
{targets: 4, createdCell: function (td, cellData) { {targets: 4, createdCell: function (td, cellData) {
var innerHtml = ""; var innerHtml = "";
var data = cellData['reachable']; var data = cellData.reachable;
if (data !== 0) { if (data !== 0) {
innerHtml = "<span class='text-navy'>" + data + "</span>"; innerHtml = "<span class='text-navy'>" + data + "</span>";
} else { } else {
......
...@@ -83,4 +83,4 @@ class ApiMessageMixin: ...@@ -83,4 +83,4 @@ class ApiMessageMixin:
message = self.get_success_message(resp.data) message = self.get_success_message(resp.data)
if message: if message:
messages.success(request, message) messages.success(request, message)
return resp return resp
\ No newline at end of file
...@@ -57,10 +57,15 @@ class JMSCSVRender(BaseRenderer): ...@@ -57,10 +57,15 @@ class JMSCSVRender(BaseRenderer):
request = renderer_context['request'] request = renderer_context['request']
template = request.query_params.get('template', 'export') template = request.query_params.get('template', 'export')
view = renderer_context['view'] view = renderer_context['view']
data = json.loads(json.dumps(data, cls=encoders.JSONEncoder))
if isinstance(data, dict) and data.get("count"):
data = data["results"]
if template == 'import': if template == 'import':
data = [data[0]] if data else data data = [data[0]] if data else data
data = json.loads(json.dumps(data, cls=encoders.JSONEncoder))
try: try:
serializer = view.get_serializer() serializer = view.get_serializer()
self.set_response_disposition(serializer, renderer_context) self.set_response_disposition(serializer, renderer_context)
......
...@@ -47,7 +47,7 @@ def run_command_execution(cid, **kwargs): ...@@ -47,7 +47,7 @@ def run_command_execution(cid, **kwargs):
try: try:
execution.run() execution.run()
except SoftTimeLimitExceeded: except SoftTimeLimitExceeded:
print("HLLL") logger.error("Run time out")
else: else:
logger.error("Not found the execution id: {}".format(cid)) logger.error("Not found the execution id: {}".format(cid))
......
...@@ -28,7 +28,8 @@ class OrgModelViewSet(IDInCacheFilterMixin, ModelViewSet): ...@@ -28,7 +28,8 @@ class OrgModelViewSet(IDInCacheFilterMixin, ModelViewSet):
class OrgBulkModelViewSet(IDInCacheFilterMixin, BulkModelViewSet): class OrgBulkModelViewSet(IDInCacheFilterMixin, BulkModelViewSet):
def get_queryset(self): def get_queryset(self):
queryset = super().get_queryset().all() queryset = super().get_queryset().all()
if hasattr(self, 'serializer_class') and \ if hasattr(self, 'action') and self.action == 'list' and \
hasattr(self, 'serializer_class') and \
hasattr(self.serializer_class, 'setup_eager_loading'): hasattr(self.serializer_class, 'setup_eager_loading'):
queryset = self.serializer_class.setup_eager_loading(queryset) queryset = self.serializer_class.setup_eager_loading(queryset)
return queryset return queryset
......
...@@ -32,10 +32,10 @@ class OrgManager(models.Manager): ...@@ -32,10 +32,10 @@ class OrgManager(models.Manager):
kwargs['org_id'] = _current_org.id kwargs['org_id'] = _current_org.id
elif _current_org.is_default(): elif _current_org.is_default():
queryset = queryset.filter(org_id="") queryset = queryset.filter(org_id="")
#
# lines = traceback.format_stack() # lines = traceback.format_stack()
# print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>") # print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>")
# for line in lines[-10:-5]: # for line in lines[-10:-1]:
# print(line) # print(line)
# print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<") # print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
......
...@@ -262,7 +262,6 @@ class UserGrantedNodesWithAssetsAsTreeApi(UserPermissionCacheMixin, ListAPIView) ...@@ -262,7 +262,6 @@ class UserGrantedNodesWithAssetsAsTreeApi(UserPermissionCacheMixin, ListAPIView)
system_users=self.system_user_id system_users=self.system_user_id
) )
nodes = util.get_nodes_with_assets() nodes = util.get_nodes_with_assets()
print(list(nodes.keys()))
for node, assets in nodes.items(): for node, assets in nodes.items():
data = parse_node_to_tree_node(node) data = parse_node_to_tree_node(node)
queryset.append(data) queryset.append(data)
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
{% csrf_token %} {% csrf_token %}
<div class="form-group"> <div class="form-group">
<label class="control-label">{% trans "Download the imported template or use the exported CSV file format" %}</label> <label class="control-label">{% trans "Download the imported template or use the exported CSV file format" %}</label>
<a href="{% block import_modal_download_template_url %}{% endblock %}?format=csv&template=import" style="display: block">{% trans 'Download the import template' %}</a> <a href="{% block import_modal_download_template_url %}{% endblock %}?format=csv&template=import&limit=1" style="display: block">{% trans 'Download the import template' %}</a>
</div> </div>
<div class="form-group"> <div class="form-group">
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册