perf: change domain to zone (#15255)

* perf: change domain to zone

* perf: change domain to zone

* perf: change some word

* perf: update gateway enabled i18n

* perf: change migrations

---------

Co-authored-by: ibuler <ibuler@qq.com>
pull/15260/head
fit2bot 2025-04-21 10:30:18 +08:00 committed by GitHub
parent 57fcebfdd3
commit 3159a4e794
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
40 changed files with 178 additions and 143 deletions

View File

@ -1,10 +1,10 @@
from .asset import *
from .category import *
from .domain import *
from .favorite_asset import *
from .mixin import *
from .my_asset import *
from .node import *
from .platform import *
from .protocol import *
from .tree import *
from .my_asset import *
from .zone import *

View File

@ -37,12 +37,12 @@ class AssetFilterSet(BaseFilterSet):
platform = drf_filters.CharFilter(method='filter_platform')
is_gateway = drf_filters.BooleanFilter(method='filter_is_gateway')
exclude_platform = drf_filters.CharFilter(field_name="platform__name", lookup_expr='exact', exclude=True)
domain = drf_filters.CharFilter(method='filter_domain')
zone = drf_filters.CharFilter(method='filter_zone')
type = drf_filters.CharFilter(field_name="platform__type", lookup_expr="exact")
category = drf_filters.CharFilter(field_name="platform__category", lookup_expr="exact")
protocols = drf_filters.CharFilter(method='filter_protocols')
domain_enabled = drf_filters.BooleanFilter(
field_name="platform__domain_enabled", lookup_expr="exact"
gateway_enabled = drf_filters.BooleanFilter(
field_name="platform__gateway_enabled", lookup_expr="exact"
)
ping_enabled = drf_filters.BooleanFilter(
field_name="platform__automation__ping_enabled", lookup_expr="exact"
@ -85,11 +85,11 @@ class AssetFilterSet(BaseFilterSet):
return queryset
@staticmethod
def filter_domain(queryset, name, value):
def filter_zone(queryset, name, value):
if is_uuid(value):
return queryset.filter(domain_id=value)
return queryset.filter(zone_id=value)
else:
return queryset.filter(domain__name__contains=value)
return queryset.filter(zone__name__contains=value)
@staticmethod
def filter_protocols(queryset, name, value):
@ -171,10 +171,10 @@ class AssetViewSet(SuggestionMixin, BaseAssetViewSet):
@action(methods=["GET"], detail=True, url_path="gateways")
def gateways(self, *args, **kwargs):
asset = self.get_object()
if not asset.domain:
if not asset.zone:
gateways = Gateway.objects.none()
else:
gateways = asset.domain.gateways
gateways = asset.zone.gateways
return self.get_paginated_response_from_queryset(gateways)
@action(methods=['post'], detail=False, url_path='sync-platform-protocols')

View File

@ -9,24 +9,24 @@ from common.utils import get_logger
from orgs.mixins.api import OrgBulkModelViewSet
from .asset import HostViewSet
from .. import serializers
from ..models import Domain, Gateway
from ..models import Zone, Gateway
logger = get_logger(__file__)
__all__ = ['DomainViewSet', 'GatewayViewSet', "GatewayTestConnectionApi"]
__all__ = ['ZoneViewSet', 'GatewayViewSet', "GatewayTestConnectionApi"]
class DomainViewSet(OrgBulkModelViewSet):
model = Domain
class ZoneViewSet(OrgBulkModelViewSet):
model = Zone
filterset_fields = ("name",)
search_fields = filterset_fields
serializer_classes = {
'default': serializers.DomainSerializer,
'list': serializers.DomainListSerializer,
'default': serializers.ZoneSerializer,
'list': serializers.ZoneListSerializer,
}
def get_serializer_class(self):
if self.request.query_params.get('gateway'):
return serializers.DomainWithGatewaySerializer
return serializers.ZoneWithGatewaySerializer
return super().get_serializer_class()
def partial_update(self, request, *args, **kwargs):
@ -36,8 +36,8 @@ class DomainViewSet(OrgBulkModelViewSet):
class GatewayViewSet(HostViewSet):
perm_model = Gateway
filterset_fields = ("domain__name", "name", "domain")
search_fields = ("domain__name",)
filterset_fields = ("zone__name", "name", "zone")
search_fields = ("zone__name",)
def get_serializer_classes(self):
serializer_classes = super().get_serializer_classes()
@ -45,7 +45,7 @@ class GatewayViewSet(HostViewSet):
return serializer_classes
def get_queryset(self):
queryset = Domain.get_gateway_queryset()
queryset = Zone.get_gateway_queryset()
return queryset
@ -55,7 +55,7 @@ class GatewayTestConnectionApi(SingleObjectMixin, APIView):
}
def get_queryset(self):
queryset = Domain.get_gateway_queryset()
queryset = Zone.get_gateway_queryset()
return queryset
def post(self, request, *args, **kwargs):

View File

@ -37,7 +37,7 @@ class FillType(models.TextChoices):
class BaseType(TextChoices):
"""
约束应该考虑代是对平台对限制避免多余对选项: mysql 开启 ssh,
或者开启了也没有作用, 比如 k8s 开启了 domain目前还不支持
或者开启了也没有作用, 比如 k8s 开启了 gateway 目前还不支持
"""
@classmethod

View File

@ -13,11 +13,11 @@ class CloudTypes(BaseType):
return {
'*': {
'charset_enabled': False,
'domain_enabled': False,
'gateway_enabled': False,
'su_enabled': False,
},
cls.K8S: {
'domain_enabled': True,
'gateway_enabled': True,
}
}

View File

@ -20,7 +20,7 @@ class CustomTypes(BaseType):
return {
'*': {
'charset_enabled': False,
'domain_enabled': False,
'gateway_enabled': False,
'su_enabled': False,
},
}

View File

@ -20,7 +20,7 @@ class DatabaseTypes(BaseType):
return {
'*': {
'charset_enabled': False,
'domain_enabled': True,
'gateway_enabled': True,
'su_enabled': False,
}
}

View File

@ -19,7 +19,7 @@ class DeviceTypes(BaseType):
return {
'*': {
'charset_enabled': False,
'domain_enabled': True,
'gateway_enabled': True,
'ds_enabled': False,
'su_enabled': True,
'su_methods': ['enable', 'super', 'super_level']

View File

@ -16,7 +16,7 @@ class DirectoryTypes(BaseType):
return {
'*': {
'charset_enabled': True,
'domain_enabled': True,
'gateway_enabled': True,
'ds_enabled': False,
'su_enabled': True,
},

View File

@ -11,7 +11,7 @@ class GPTTypes(BaseType):
return {
'*': {
'charset_enabled': False,
'domain_enabled': False,
'gateway_enabled': False,
'su_enabled': False,
}
}

View File

@ -18,7 +18,7 @@ class HostTypes(BaseType):
'*': {
'charset_enabled': True,
'charset': 'utf-8', # default
'domain_enabled': True,
'gateway_enabled': True,
'su_enabled': True,
'ds_enabled': True,
'su_methods': ['sudo', 'su', 'only_sudo', 'only_su'],
@ -81,7 +81,7 @@ class HostTypes(BaseType):
{'name': 'Linux'},
{
'name': GATEWAY_NAME,
'domain_enabled': True,
'gateway_enabled': True,
}
],
cls.UNIX: [

View File

@ -312,7 +312,7 @@ class AllTypes(ChoicesMixin):
'category': category,
'type': tp, 'internal': True,
'charset': constraints.get('charset', 'utf-8'),
'domain_enabled': constraints.get('domain_enabled', False),
'gateway_enabled': constraints.get('gateway_enabled', False),
'su_enabled': constraints.get('su_enabled', False),
}
if data['su_enabled'] and data.get('su_methods'):

View File

@ -11,7 +11,7 @@ class WebTypes(BaseType):
return {
'*': {
'charset_enabled': False,
'domain_enabled': False,
'gateway_enabled': False,
'su_enabled': False,
}
}

View File

@ -1,11 +1,11 @@
# Generated by Django 4.1.13 on 2024-05-09 03:16
import json
import assets.models.asset.common
from django.db.models import F, Q
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
from django.db.models import F
import assets.models.asset.common
class Migration(migrations.Migration):
@ -39,22 +39,26 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='automationexecution',
name='automation',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='executions', to='assets.baseautomation', verbose_name='Automation task'),
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='executions',
to='assets.baseautomation', verbose_name='Automation task'),
),
migrations.AddField(
model_name='asset',
name='domain',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assets', to='assets.domain', verbose_name='Zone'),
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
related_name='assets', to='assets.domain', verbose_name='Zone'),
),
migrations.AddField(
model_name='asset',
name='nodes',
field=models.ManyToManyField(default=assets.models.asset.common.default_node, related_name='assets', to='assets.node', verbose_name='Nodes'),
field=models.ManyToManyField(default=assets.models.asset.common.default_node, related_name='assets',
to='assets.node', verbose_name='Nodes'),
),
migrations.AddField(
model_name='asset',
name='platform',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='assets', to='assets.platform', verbose_name='Platform'),
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='assets',
to='assets.platform', verbose_name='Platform'),
),
migrations.CreateModel(
name='AssetBaseAutomation',
@ -71,7 +75,9 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='GatherFactsAutomation',
fields=[
('baseautomation_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.baseautomation')),
('baseautomation_ptr',
models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True,
primary_key=True, serialize=False, to='assets.baseautomation')),
],
options={
'verbose_name': 'Gather asset facts',
@ -81,7 +87,9 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='PingAutomation',
fields=[
('baseautomation_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.baseautomation')),
('baseautomation_ptr',
models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True,
primary_key=True, serialize=False, to='assets.baseautomation')),
],
options={
'verbose_name': 'Ping asset',

View File

@ -18,7 +18,7 @@ platforms_data_json = '''[
"type": "linux",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": true,
"su_method": null,
"custom_fields": [],
@ -119,7 +119,7 @@ platforms_data_json = '''[
"type": "unix",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": true,
"su_method": null,
"custom_fields": [],
@ -209,7 +209,7 @@ platforms_data_json = '''[
"type": "unix",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": true,
"su_method": null,
"custom_fields": [],
@ -299,7 +299,7 @@ platforms_data_json = '''[
"type": "unix",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": true,
"su_method": null,
"custom_fields": [],
@ -389,7 +389,7 @@ platforms_data_json = '''[
"type": "windows",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -481,7 +481,7 @@ platforms_data_json = '''[
"security": "any"
},
"internal": false,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -582,7 +582,7 @@ platforms_data_json = '''[
"type": "other",
"meta": {},
"internal": false,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -684,7 +684,7 @@ platforms_data_json = '''[
"security": "rdp"
},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -776,7 +776,7 @@ platforms_data_json = '''[
"security": "tls"
},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -866,7 +866,7 @@ platforms_data_json = '''[
"type": "unix",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": true,
"su_method": null,
"custom_fields": [],
@ -956,7 +956,7 @@ platforms_data_json = '''[
"type": "linux",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": true,
"su_method": null,
"custom_fields": [],
@ -1057,7 +1057,7 @@ platforms_data_json = '''[
"type": "windows",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -1136,7 +1136,7 @@ platforms_data_json = '''[
"type": "general",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -1201,7 +1201,7 @@ platforms_data_json = '''[
"type": "general",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": true,
"su_method": "enable",
"custom_fields": [],
@ -1266,7 +1266,7 @@ platforms_data_json = '''[
"type": "general",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": true,
"su_method": "super",
"custom_fields": [],
@ -1332,7 +1332,7 @@ platforms_data_json = '''[
"type": "general",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": true,
"su_method": "super_level",
"custom_fields": [],
@ -1397,7 +1397,7 @@ platforms_data_json = '''[
"type": "mysql",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -1449,7 +1449,7 @@ platforms_data_json = '''[
"type": "mariadb",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -1501,7 +1501,7 @@ platforms_data_json = '''[
"type": "postgresql",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -1553,7 +1553,7 @@ platforms_data_json = '''[
"type": "oracle",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -1605,7 +1605,7 @@ platforms_data_json = '''[
"type": "sqlserver",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -1657,7 +1657,7 @@ platforms_data_json = '''[
"type": "clickhouse",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -1709,7 +1709,7 @@ platforms_data_json = '''[
"type": "mongodb",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -1761,7 +1761,7 @@ platforms_data_json = '''[
"type": "redis",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -1815,7 +1815,7 @@ platforms_data_json = '''[
"type": "redis",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -1869,7 +1869,7 @@ platforms_data_json = '''[
"type": "website",
"meta": {},
"internal": true,
"domain_enabled": false,
"gateway_enabled": false,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -1924,7 +1924,7 @@ platforms_data_json = '''[
"type": "private",
"meta": {},
"internal": true,
"domain_enabled": false,
"gateway_enabled": false,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -1979,7 +1979,7 @@ platforms_data_json = '''[
"type": "k8s",
"meta": {},
"internal": true,
"domain_enabled": false,
"gateway_enabled": false,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -2029,7 +2029,7 @@ platforms_data_json = '''[
"type": "chatgpt",
"meta": {},
"internal": true,
"domain_enabled": false,
"gateway_enabled": false,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -2081,7 +2081,7 @@ platforms_data_json = '''[
"type": "db2",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -2131,7 +2131,7 @@ platforms_data_json = '''[
"type": "dameng",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],

View File

@ -52,6 +52,6 @@ class Migration(migrations.Migration):
related_name="assets",
to="assets.directoryservice",
verbose_name="Directory services",
),
)
),
]

View File

@ -19,7 +19,7 @@ def add_ds_platforms(apps, schema_editor):
"type": "windows_ad",
"meta": {},
"internal": true,
"domain_enabled": true,
"gateway_enabled": true,
"su_enabled": false,
"su_method": null,
"custom_fields": [],
@ -117,7 +117,7 @@ def add_ds_platforms(apps, schema_editor):
"meta": {
},
"internal": true,
"domain_enabled": false,
"gateway_enabled": false,
"su_enabled": false,
"su_method": null,
"custom_fields": [

View File

@ -0,0 +1,26 @@
# Generated by Django 4.1.13 on 2025-04-18 08:05
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("assets", "0017_auto_20250407_1124"),
]
operations = [
migrations.RenameField(
model_name="platform",
old_name="domain_enabled",
new_name="gateway_enabled",
),
migrations.RenameModel(
old_name="Domain",
new_name="Zone",
),
migrations.RenameField(
model_name="asset",
old_name="domain",
new_name="zone",
),
]

View File

@ -1,9 +1,10 @@
# noqa
from .base import *
from .platform import *
from .asset import *
from .label import Label
from .gateway import *
from .domain import *
from .zone import * # noqa
from .node import *
from .favorite_asset import *
from .automations import *

View File

@ -168,8 +168,8 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
platform = models.ForeignKey(
Platform, on_delete=models.PROTECT, verbose_name=_("Platform"), related_name='assets'
)
domain = models.ForeignKey(
"assets.Domain", null=True, blank=True, related_name='assets',
zone = models.ForeignKey(
"assets.Zone", null=True, blank=True, related_name='assets',
verbose_name=_("Zone"), on_delete=models.SET_NULL
)
nodes = models.ManyToManyField(
@ -177,7 +177,7 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
)
directory_services = models.ManyToManyField(
'assets.DirectoryService', related_name='assets',
verbose_name=_("Directory service")
verbose_name=_("Directory services")
)
is_active = models.BooleanField(default=True, verbose_name=_('Active'))
gathered_info = models.JSONField(verbose_name=_('Gathered info'), default=dict, blank=True) # 资产的一些信息,如 硬件信息
@ -244,7 +244,7 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
platform = self.platform
auto_config = {
'su_enabled': platform.su_enabled,
'domain_enabled': platform.domain_enabled,
'gateway_enabled': platform.gateway_enabled,
'ansible_enabled': False
}
automation = getattr(self.platform, 'automation', None)
@ -362,11 +362,11 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
@lazyproperty
def gateway(self):
if not self.domain_id:
if not self.zone_id:
return
if not self.platform.domain_enabled:
if not self.platform.gateway_enabled:
return
return self.domain.select_gateway()
return self.zone.select_gateway()
def as_node(self):
from assets.models import Node

View File

@ -101,7 +101,7 @@ class Platform(LabeledMixin, JMSBaseModel):
default=CharsetChoices.utf8, choices=CharsetChoices.choices,
max_length=8, verbose_name=_("Charset")
)
domain_enabled = models.BooleanField(default=True, verbose_name=_("Gateway enabled"))
gateway_enabled = models.BooleanField(default=True, verbose_name=_("Gateway enabled"))
ds_enabled = models.BooleanField(default=False, verbose_name=_("DS enabled"))
# 账号有关的
su_enabled = models.BooleanField(default=False, verbose_name=_("Su enabled"))

View File

@ -12,10 +12,10 @@ from .gateway import Gateway
logger = get_logger(__file__)
__all__ = ['Domain']
__all__ = ['Zone']
class Domain(LabeledMixin, JMSOrgBaseModel):
class Zone(LabeledMixin, JMSOrgBaseModel):
name = models.CharField(max_length=128, verbose_name=_('Name'))
class Meta:
@ -49,7 +49,7 @@ class Domain(LabeledMixin, JMSOrgBaseModel):
@property
def gateways(self):
queryset = self.get_gateway_queryset().filter(domain=self)
queryset = self.get_gateway_queryset().filter(zone=self)
return queryset
@classmethod

View File

@ -154,7 +154,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa
class Meta:
model = Asset
fields_fk = ['domain', 'platform']
fields_fk = ['zone', 'platform']
fields_mini = ['id', 'name', 'address'] + fields_fk
fields_small = fields_mini + ['is_active', 'comment']
fields_m2m = [
@ -233,7 +233,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa
@classmethod
def setup_eager_loading(cls, queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.prefetch_related('domain', 'nodes', 'protocols', 'directory_services') \
queryset = queryset.prefetch_related('zone', 'nodes', 'protocols', 'directory_services') \
.prefetch_related('platform', 'platform__automation') \
.annotate(category=F("platform__category")) \
.annotate(type=F("platform__type")) \
@ -271,9 +271,9 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa
raise serializers.ValidationError({'platform': _("Platform not exist")})
return platform
def validate_domain(self, value):
def validate_zone(self, value):
platform = self._asset_platform
if platform.domain_enabled:
if platform.gateway_enabled:
return value
else:
return None

View File

@ -8,12 +8,12 @@ from common.serializers import ResourceLabelsMixin
from common.serializers.fields import ObjectRelatedField
from orgs.mixins.serializers import BulkOrgResourceModelSerializer
from .gateway import GatewayWithAccountSecretSerializer
from ..models import Domain, Gateway
from ..models import Zone, Gateway
__all__ = ['DomainSerializer', 'DomainWithGatewaySerializer', 'DomainListSerializer']
__all__ = ['ZoneSerializer', 'ZoneWithGatewaySerializer', 'ZoneListSerializer']
class DomainSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer):
class ZoneSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer):
gateways = ObjectRelatedField(
many=True, required=False, label=_('Gateway'), queryset=Gateway.objects,
help_text=_(
@ -23,7 +23,7 @@ class DomainSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer):
assets_amount = serializers.IntegerField(label=_('Assets amount'), read_only=True)
class Meta:
model = Domain
model = Zone
fields_mini = ['id', 'name']
fields_small = fields_mini + ['comment']
fields_m2m = ['assets', 'gateways', 'labels', 'assets_amount']
@ -55,9 +55,9 @@ class DomainSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer):
return super().update(instance, validated_data)
class DomainListSerializer(DomainSerializer):
class Meta(DomainSerializer.Meta):
fields = list(set(DomainSerializer.Meta.fields + ['assets_amount']) - {'assets'})
class ZoneListSerializer(ZoneSerializer):
class Meta(ZoneSerializer.Meta):
fields = list(set(ZoneSerializer.Meta.fields + ['assets_amount']) - {'assets'})
@classmethod
def setup_eager_loading(cls, queryset):
@ -67,9 +67,9 @@ class DomainListSerializer(DomainSerializer):
return queryset
class DomainWithGatewaySerializer(serializers.ModelSerializer):
class ZoneWithGatewaySerializer(serializers.ModelSerializer):
gateways = GatewayWithAccountSecretSerializer(many=True, read_only=True)
class Meta:
model = Domain
model = Zone
fields = '__all__'

View File

@ -194,7 +194,7 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes
]
fields_m2m = ['assets', 'assets_amount']
fields = fields_small + fields_m2m + [
"protocols", "domain_enabled", "su_enabled", "su_method",
"protocols", "gateway_enabled", "su_enabled", "su_method",
"ds_enabled", "automation", "comment", "custom_fields", "labels"
] + read_only_fields
extra_kwargs = {
@ -205,11 +205,11 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes
"similar to logging in with a regular account and then switching to root"
)
},
"domain_enabled": {
"gateway_enabled": {
"label": _('Gateway enabled'),
"help_text": _("Assets can be connected using a zone gateway")
},
"domain_default": {"label": _('Default Domain')},
"zone_default": {"label": _('Default zone')},
'assets': {'required': False, 'label': _('Assets')},
}
@ -262,8 +262,8 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes
def validate_su_enabled(self, su_enabled):
return su_enabled and self.constraints.get('su_enabled', False)
def validate_domain_enabled(self, domain_enabled):
return domain_enabled and self.constraints.get('domain_enabled', False)
def validate_gateway_enabled(self, gateway_enabled):
return gateway_enabled and self.constraints.get('gateway_enabled', False)
def validate_automation(self, automation):
automation = automation or {}

View File

@ -20,7 +20,7 @@ router.register(r'directories', api.DSViewSet, 'ds')
router.register(r'customs', api.CustomViewSet, 'custom')
router.register(r'platforms', api.AssetPlatformViewSet, 'platform')
router.register(r'nodes', api.NodeViewSet, 'node')
router.register(r'domains', api.DomainViewSet, 'domain')
router.register(r'zones', api.ZoneViewSet, 'zone')
router.register(r'gateways', api.GatewayViewSet, 'gateway')
router.register(r'favorite-assets', api.FavoriteAssetViewSet, 'favorite-asset')
router.register(r'protocol-settings', api.PlatformProtocolViewSet, 'protocol-setting')

View File

@ -251,7 +251,7 @@ class ConnectionToken(JMSOrgBaseModel):
raise JMSException({'error': 'No host account available, please check the applet, host and account'})
host, account, lock_key = bulk_get(host_account, ('host', 'account', 'lock_key'))
gateway = host.domain.select_gateway() if host.domain else None
gateway = host.zone.select_gateway() if host.zone else None
platform = host.platform
data = {
@ -305,17 +305,17 @@ class ConnectionToken(JMSOrgBaseModel):
return account
@lazyproperty
def domain(self):
if not self.asset.platform.domain_enabled:
def zone(self):
if not self.asset.platform.gateway_enabled:
return
if self.asset.platform.name == GATEWAY_NAME:
return
domain = self.asset.domain if self.asset.domain else None
return domain
zone = self.asset.zone if self.asset.zone else None
return zone
@lazyproperty
def gateway(self):
if not self.asset or not self.domain:
if not self.asset or not self.zone:
return
return self.asset.gateway

View File

@ -4,7 +4,7 @@ from rest_framework import serializers
from accounts.const import SecretType
from accounts.models import Account
from acls.models import CommandGroup, CommandFilterACL
from assets.models import Asset, Platform, Gateway, Domain
from assets.models import Asset, Platform, Gateway, Zone
from assets.serializers.asset import AssetProtocolsSerializer
from assets.serializers.platform import PlatformSerializer
from common.serializers.fields import LabeledChoiceField
@ -135,7 +135,7 @@ class ConnectionTokenSecretSerializer(OrgResourceModelSerializerMixin):
account = _ConnectionTokenAccountSerializer(read_only=True, source='account_object')
gateway = _ConnectionTokenGatewaySerializer(read_only=True)
platform = _ConnectionTokenPlatformSerializer(read_only=True)
domain = ObjectRelatedField(queryset=Domain.objects, required=False, label=_('Domain'))
zone = ObjectRelatedField(queryset=Zone.objects, required=False, label=_('Domain'))
command_filter_acls = _ConnectionTokenCommandFilterACLSerializer(read_only=True, many=True)
expire_now = serializers.BooleanField(label=_('Expired now'), write_only=True, default=True)
connect_method = _ConnectTokenConnectMethodSerializer(read_only=True, source='connect_method_object')
@ -148,7 +148,7 @@ class ConnectionTokenSecretSerializer(OrgResourceModelSerializerMixin):
fields = [
'id', 'value', 'user', 'asset', 'account',
'platform', 'command_filter_acls', 'protocol',
'domain', 'gateway', 'actions', 'expire_at',
'zone', 'gateway', 'actions', 'expire_at',
'from_ticket', 'expire_now', 'connect_method',
'connect_options', 'face_monitor_token'
]

View File

@ -2882,7 +2882,7 @@ msgstr "Código"
#: assets/models/platform.py:104 assets/serializers/platform.py:209
msgid "Gateway enabled"
msgstr "Activar dominio"
msgstr "Activar gateway de zona"
#: assets/models/platform.py:105
msgid "DS enabled"

View File

@ -2769,7 +2769,7 @@ msgstr "シャーセット"
#: assets/models/platform.py:104 assets/serializers/platform.py:209
msgid "Gateway enabled"
msgstr "ゲートウェイが有効になりました"
msgstr "ゾーンゲートウェイを有効化"
#: assets/models/platform.py:105
msgid "DS enabled"

View File

@ -2862,7 +2862,7 @@ msgstr "Codificação"
#: assets/models/platform.py:104 assets/serializers/platform.py:209
msgid "Gateway enabled"
msgstr "Habilitar domínio"
msgstr "Ativar zone gateway"
#: assets/models/platform.py:105
msgid "DS enabled"

View File

@ -2827,7 +2827,7 @@ msgstr "Кодировка"
#: assets/models/platform.py:104 assets/serializers/platform.py:209
msgid "Gateway enabled"
msgstr "Шлюз включен"
msgstr "Включить шлюз зоны"
#: assets/models/platform.py:105
msgid "DS enabled"

View File

@ -2780,11 +2780,11 @@ msgstr "编码"
#: assets/models/platform.py:104 assets/serializers/platform.py:209
msgid "Gateway enabled"
msgstr "启用网域"
msgstr "启用网域网关"
#: assets/models/platform.py:105
msgid "DS enabled"
msgstr "目录服务已启用"
msgstr "启用目录服务"
#: assets/models/platform.py:107 assets/serializers/platform.py:202
msgid "Su enabled"

View File

@ -2751,7 +2751,7 @@ msgstr "編碼"
#: assets/models/platform.py:104 assets/serializers/platform.py:209
msgid "Gateway enabled"
msgstr "啟用網域"
msgstr "啟用網域網関"
#: assets/models/platform.py:105
msgid "DS enabled"

View File

@ -37,7 +37,7 @@ class JMSInventory:
from assets.models import Asset
asset_ids = [asset.id for asset in assets]
assets = Asset.objects.filter(id__in=asset_ids, is_active=True) \
.prefetch_related('platform', 'domain', 'accounts')
.prefetch_related('platform', 'zone', 'accounts')
return assets
@staticmethod
@ -236,8 +236,8 @@ class JMSInventory:
host.update(ansible_config)
gateway = None
if not asset.is_gateway and asset.domain:
gateway = asset.domain.select_gateway()
if not asset.is_gateway and asset.zone:
gateway = asset.zone.select_gateway()
self.make_account_vars(
host, asset, account, automation, protocol, platform, gateway, path_dir, ansible_config

View File

@ -7,7 +7,7 @@ from rest_framework.exceptions import PermissionDenied
from rest_framework.generics import RetrieveAPIView
from assets.models import (
Asset, Domain, Label, Node,
Asset, Zone, Label, Node,
)
from common.api import JMSBulkModelViewSet
from common.permissions import IsValidUser
@ -24,7 +24,7 @@ logger = get_logger(__file__)
# 部分 org 相关的 model需要清空这些数据之后才能删除该组织
org_related_models = [
User, UserGroup, Asset, Node, Label, Domain, AssetPermission
User, UserGroup, Asset, Node, Label, Zone, AssetPermission
]

View File

@ -1,16 +1,16 @@
from django.db.transaction import on_commit
from orgs.models import Organization
from orgs.tasks import refresh_org_cache_task
from orgs.utils import current_org, tmp_to_org
from accounts.models import Account
from assets.models import Node, Zone, Asset
from common.cache import Cache, IntegerField
from common.utils import get_logger
from common.utils.timezone import local_zero_hour, local_monday
from users.models import UserGroup, User
from assets.models import Node, Domain, Asset
from accounts.models import Account
from terminal.models import Session
from orgs.models import Organization
from orgs.tasks import refresh_org_cache_task
from orgs.utils import current_org, tmp_to_org
from perms.models import AssetPermission
from terminal.models import Session
from users.models import UserGroup, User
logger = get_logger(__file__)
@ -57,7 +57,7 @@ class OrgResourceStatisticsCache(OrgRelatedCache):
new_users_amount_this_week = IntegerField()
new_assets_amount_this_week = IntegerField()
nodes_amount = IntegerField(queryset=Node.objects)
domains_amount = IntegerField(queryset=Domain.objects)
zones_amount = IntegerField(queryset=Zone.objects)
groups_amount = IntegerField(queryset=UserGroup.objects)
accounts_amount = IntegerField(queryset=Account.objects)
asset_perms_amount = IntegerField(queryset=AssetPermission.objects)

View File

@ -12,7 +12,7 @@ class ResourceStatisticsSerializer(serializers.Serializer):
assets_amount = serializers.IntegerField(required=False, label=_('Assets amount'))
nodes_amount = serializers.IntegerField(required=False, label=_('Nodes amount'))
domains_amount = serializers.IntegerField(required=False, label=_('Domains amount'))
zones_amount = serializers.IntegerField(required=False, label=_('Domains amount'))
gateways_amount = serializers.IntegerField(required=False, label=_('Gateways amount'))
asset_perms_amount = serializers.IntegerField(required=False, label=_('Asset permissions amount'))

View File

@ -2,7 +2,7 @@ from django.db.models.signals import post_save, pre_delete, pre_save, post_delet
from django.dispatch import receiver
from accounts.models import Account
from assets.models import Asset, Domain
from assets.models import Asset, Zone
from assets.models import Node
from common.decorators import merge_delay_run
from common.utils import get_logger
@ -64,7 +64,7 @@ def on_user_delete_refresh_cache(sender, instance, **kwargs):
model_cache_field_mapper = {
Node: ['nodes_amount'],
Domain: ['domains_amount'],
Zone: ['zones_amount'],
UserGroup: ['groups_amount'],
Account: ['accounts_amount'],
RoleBinding: ['users_amount', 'new_users_amount_this_week'],

View File

@ -25,12 +25,12 @@ class AssetPermedSerializer(OrgResourceModelSerializerMixin, ResourceLabelsMixin
platform = ObjectRelatedField(required=False, queryset=Platform.objects, label=_('Platform'))
category = LabeledChoiceField(choices=Category.choices, read_only=True, label=_('Category'))
type = LabeledChoiceField(choices=AllTypes.choices(), read_only=True, label=_('Type'))
domain = ObjectRelatedField(required=False, queryset=Node.objects, label=_('Domain'))
zone = ObjectRelatedField(required=False, read_only=True, label=_('Zone'))
class Meta:
model = Asset
only_fields = [
'id', 'name', 'address', 'domain', 'platform',
'id', 'name', 'address', 'zone', 'platform',
'comment', 'org_id', 'is_active', 'date_verified',
'created_by', 'date_created', 'connectivity', 'nodes', 'labels'
]
@ -40,7 +40,7 @@ class AssetPermedSerializer(OrgResourceModelSerializerMixin, ResourceLabelsMixin
@classmethod
def setup_eager_loading(cls, queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.prefetch_related('domain', 'nodes') \
queryset = queryset.prefetch_related('zone', 'nodes') \
.prefetch_related('platform') \
.annotate(category=F("platform__category")) \
.annotate(type=F("platform__type"))