mirror of https://github.com/jumpserver/jumpserver
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
parent
57fcebfdd3
commit
3159a4e794
|
@ -1,10 +1,10 @@
|
||||||
from .asset import *
|
from .asset import *
|
||||||
from .category import *
|
from .category import *
|
||||||
from .domain import *
|
|
||||||
from .favorite_asset import *
|
from .favorite_asset import *
|
||||||
from .mixin import *
|
from .mixin import *
|
||||||
|
from .my_asset import *
|
||||||
from .node import *
|
from .node import *
|
||||||
from .platform import *
|
from .platform import *
|
||||||
from .protocol import *
|
from .protocol import *
|
||||||
from .tree import *
|
from .tree import *
|
||||||
from .my_asset import *
|
from .zone import *
|
||||||
|
|
|
@ -37,12 +37,12 @@ class AssetFilterSet(BaseFilterSet):
|
||||||
platform = drf_filters.CharFilter(method='filter_platform')
|
platform = drf_filters.CharFilter(method='filter_platform')
|
||||||
is_gateway = drf_filters.BooleanFilter(method='filter_is_gateway')
|
is_gateway = drf_filters.BooleanFilter(method='filter_is_gateway')
|
||||||
exclude_platform = drf_filters.CharFilter(field_name="platform__name", lookup_expr='exact', exclude=True)
|
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")
|
type = drf_filters.CharFilter(field_name="platform__type", lookup_expr="exact")
|
||||||
category = drf_filters.CharFilter(field_name="platform__category", lookup_expr="exact")
|
category = drf_filters.CharFilter(field_name="platform__category", lookup_expr="exact")
|
||||||
protocols = drf_filters.CharFilter(method='filter_protocols')
|
protocols = drf_filters.CharFilter(method='filter_protocols')
|
||||||
domain_enabled = drf_filters.BooleanFilter(
|
gateway_enabled = drf_filters.BooleanFilter(
|
||||||
field_name="platform__domain_enabled", lookup_expr="exact"
|
field_name="platform__gateway_enabled", lookup_expr="exact"
|
||||||
)
|
)
|
||||||
ping_enabled = drf_filters.BooleanFilter(
|
ping_enabled = drf_filters.BooleanFilter(
|
||||||
field_name="platform__automation__ping_enabled", lookup_expr="exact"
|
field_name="platform__automation__ping_enabled", lookup_expr="exact"
|
||||||
|
@ -85,11 +85,11 @@ class AssetFilterSet(BaseFilterSet):
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def filter_domain(queryset, name, value):
|
def filter_zone(queryset, name, value):
|
||||||
if is_uuid(value):
|
if is_uuid(value):
|
||||||
return queryset.filter(domain_id=value)
|
return queryset.filter(zone_id=value)
|
||||||
else:
|
else:
|
||||||
return queryset.filter(domain__name__contains=value)
|
return queryset.filter(zone__name__contains=value)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def filter_protocols(queryset, name, value):
|
def filter_protocols(queryset, name, value):
|
||||||
|
@ -171,10 +171,10 @@ class AssetViewSet(SuggestionMixin, BaseAssetViewSet):
|
||||||
@action(methods=["GET"], detail=True, url_path="gateways")
|
@action(methods=["GET"], detail=True, url_path="gateways")
|
||||||
def gateways(self, *args, **kwargs):
|
def gateways(self, *args, **kwargs):
|
||||||
asset = self.get_object()
|
asset = self.get_object()
|
||||||
if not asset.domain:
|
if not asset.zone:
|
||||||
gateways = Gateway.objects.none()
|
gateways = Gateway.objects.none()
|
||||||
else:
|
else:
|
||||||
gateways = asset.domain.gateways
|
gateways = asset.zone.gateways
|
||||||
return self.get_paginated_response_from_queryset(gateways)
|
return self.get_paginated_response_from_queryset(gateways)
|
||||||
|
|
||||||
@action(methods=['post'], detail=False, url_path='sync-platform-protocols')
|
@action(methods=['post'], detail=False, url_path='sync-platform-protocols')
|
||||||
|
|
|
@ -9,24 +9,24 @@ from common.utils import get_logger
|
||||||
from orgs.mixins.api import OrgBulkModelViewSet
|
from orgs.mixins.api import OrgBulkModelViewSet
|
||||||
from .asset import HostViewSet
|
from .asset import HostViewSet
|
||||||
from .. import serializers
|
from .. import serializers
|
||||||
from ..models import Domain, Gateway
|
from ..models import Zone, Gateway
|
||||||
|
|
||||||
logger = get_logger(__file__)
|
logger = get_logger(__file__)
|
||||||
__all__ = ['DomainViewSet', 'GatewayViewSet', "GatewayTestConnectionApi"]
|
__all__ = ['ZoneViewSet', 'GatewayViewSet', "GatewayTestConnectionApi"]
|
||||||
|
|
||||||
|
|
||||||
class DomainViewSet(OrgBulkModelViewSet):
|
class ZoneViewSet(OrgBulkModelViewSet):
|
||||||
model = Domain
|
model = Zone
|
||||||
filterset_fields = ("name",)
|
filterset_fields = ("name",)
|
||||||
search_fields = filterset_fields
|
search_fields = filterset_fields
|
||||||
serializer_classes = {
|
serializer_classes = {
|
||||||
'default': serializers.DomainSerializer,
|
'default': serializers.ZoneSerializer,
|
||||||
'list': serializers.DomainListSerializer,
|
'list': serializers.ZoneListSerializer,
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_serializer_class(self):
|
def get_serializer_class(self):
|
||||||
if self.request.query_params.get('gateway'):
|
if self.request.query_params.get('gateway'):
|
||||||
return serializers.DomainWithGatewaySerializer
|
return serializers.ZoneWithGatewaySerializer
|
||||||
return super().get_serializer_class()
|
return super().get_serializer_class()
|
||||||
|
|
||||||
def partial_update(self, request, *args, **kwargs):
|
def partial_update(self, request, *args, **kwargs):
|
||||||
|
@ -36,8 +36,8 @@ class DomainViewSet(OrgBulkModelViewSet):
|
||||||
|
|
||||||
class GatewayViewSet(HostViewSet):
|
class GatewayViewSet(HostViewSet):
|
||||||
perm_model = Gateway
|
perm_model = Gateway
|
||||||
filterset_fields = ("domain__name", "name", "domain")
|
filterset_fields = ("zone__name", "name", "zone")
|
||||||
search_fields = ("domain__name",)
|
search_fields = ("zone__name",)
|
||||||
|
|
||||||
def get_serializer_classes(self):
|
def get_serializer_classes(self):
|
||||||
serializer_classes = super().get_serializer_classes()
|
serializer_classes = super().get_serializer_classes()
|
||||||
|
@ -45,7 +45,7 @@ class GatewayViewSet(HostViewSet):
|
||||||
return serializer_classes
|
return serializer_classes
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
queryset = Domain.get_gateway_queryset()
|
queryset = Zone.get_gateway_queryset()
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ class GatewayTestConnectionApi(SingleObjectMixin, APIView):
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
queryset = Domain.get_gateway_queryset()
|
queryset = Zone.get_gateway_queryset()
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
|
@ -37,7 +37,7 @@ class FillType(models.TextChoices):
|
||||||
class BaseType(TextChoices):
|
class BaseType(TextChoices):
|
||||||
"""
|
"""
|
||||||
约束应该考虑代是对平台对限制,避免多余对选项,如: mysql 开启 ssh,
|
约束应该考虑代是对平台对限制,避免多余对选项,如: mysql 开启 ssh,
|
||||||
或者开启了也没有作用, 比如 k8s 开启了 domain,目前还不支持
|
或者开启了也没有作用, 比如 k8s 开启了 gateway 目前还不支持
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
|
@ -13,11 +13,11 @@ class CloudTypes(BaseType):
|
||||||
return {
|
return {
|
||||||
'*': {
|
'*': {
|
||||||
'charset_enabled': False,
|
'charset_enabled': False,
|
||||||
'domain_enabled': False,
|
'gateway_enabled': False,
|
||||||
'su_enabled': False,
|
'su_enabled': False,
|
||||||
},
|
},
|
||||||
cls.K8S: {
|
cls.K8S: {
|
||||||
'domain_enabled': True,
|
'gateway_enabled': True,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ class CustomTypes(BaseType):
|
||||||
return {
|
return {
|
||||||
'*': {
|
'*': {
|
||||||
'charset_enabled': False,
|
'charset_enabled': False,
|
||||||
'domain_enabled': False,
|
'gateway_enabled': False,
|
||||||
'su_enabled': False,
|
'su_enabled': False,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ class DatabaseTypes(BaseType):
|
||||||
return {
|
return {
|
||||||
'*': {
|
'*': {
|
||||||
'charset_enabled': False,
|
'charset_enabled': False,
|
||||||
'domain_enabled': True,
|
'gateway_enabled': True,
|
||||||
'su_enabled': False,
|
'su_enabled': False,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ class DeviceTypes(BaseType):
|
||||||
return {
|
return {
|
||||||
'*': {
|
'*': {
|
||||||
'charset_enabled': False,
|
'charset_enabled': False,
|
||||||
'domain_enabled': True,
|
'gateway_enabled': True,
|
||||||
'ds_enabled': False,
|
'ds_enabled': False,
|
||||||
'su_enabled': True,
|
'su_enabled': True,
|
||||||
'su_methods': ['enable', 'super', 'super_level']
|
'su_methods': ['enable', 'super', 'super_level']
|
||||||
|
|
|
@ -16,7 +16,7 @@ class DirectoryTypes(BaseType):
|
||||||
return {
|
return {
|
||||||
'*': {
|
'*': {
|
||||||
'charset_enabled': True,
|
'charset_enabled': True,
|
||||||
'domain_enabled': True,
|
'gateway_enabled': True,
|
||||||
'ds_enabled': False,
|
'ds_enabled': False,
|
||||||
'su_enabled': True,
|
'su_enabled': True,
|
||||||
},
|
},
|
||||||
|
|
|
@ -11,7 +11,7 @@ class GPTTypes(BaseType):
|
||||||
return {
|
return {
|
||||||
'*': {
|
'*': {
|
||||||
'charset_enabled': False,
|
'charset_enabled': False,
|
||||||
'domain_enabled': False,
|
'gateway_enabled': False,
|
||||||
'su_enabled': False,
|
'su_enabled': False,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ class HostTypes(BaseType):
|
||||||
'*': {
|
'*': {
|
||||||
'charset_enabled': True,
|
'charset_enabled': True,
|
||||||
'charset': 'utf-8', # default
|
'charset': 'utf-8', # default
|
||||||
'domain_enabled': True,
|
'gateway_enabled': True,
|
||||||
'su_enabled': True,
|
'su_enabled': True,
|
||||||
'ds_enabled': True,
|
'ds_enabled': True,
|
||||||
'su_methods': ['sudo', 'su', 'only_sudo', 'only_su'],
|
'su_methods': ['sudo', 'su', 'only_sudo', 'only_su'],
|
||||||
|
@ -81,7 +81,7 @@ class HostTypes(BaseType):
|
||||||
{'name': 'Linux'},
|
{'name': 'Linux'},
|
||||||
{
|
{
|
||||||
'name': GATEWAY_NAME,
|
'name': GATEWAY_NAME,
|
||||||
'domain_enabled': True,
|
'gateway_enabled': True,
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
cls.UNIX: [
|
cls.UNIX: [
|
||||||
|
|
|
@ -312,7 +312,7 @@ class AllTypes(ChoicesMixin):
|
||||||
'category': category,
|
'category': category,
|
||||||
'type': tp, 'internal': True,
|
'type': tp, 'internal': True,
|
||||||
'charset': constraints.get('charset', 'utf-8'),
|
'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),
|
'su_enabled': constraints.get('su_enabled', False),
|
||||||
}
|
}
|
||||||
if data['su_enabled'] and data.get('su_methods'):
|
if data['su_enabled'] and data.get('su_methods'):
|
||||||
|
|
|
@ -11,7 +11,7 @@ class WebTypes(BaseType):
|
||||||
return {
|
return {
|
||||||
'*': {
|
'*': {
|
||||||
'charset_enabled': False,
|
'charset_enabled': False,
|
||||||
'domain_enabled': False,
|
'gateway_enabled': False,
|
||||||
'su_enabled': False,
|
'su_enabled': False,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
# Generated by Django 4.1.13 on 2024-05-09 03:16
|
# Generated by Django 4.1.13 on 2024-05-09 03:16
|
||||||
|
|
||||||
import json
|
import django.db.models.deletion
|
||||||
import assets.models.asset.common
|
|
||||||
from django.db.models import F, Q
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
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):
|
class Migration(migrations.Migration):
|
||||||
|
@ -39,22 +39,26 @@ class Migration(migrations.Migration):
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='automationexecution',
|
model_name='automationexecution',
|
||||||
name='automation',
|
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(
|
migrations.AddField(
|
||||||
model_name='asset',
|
model_name='asset',
|
||||||
name='domain',
|
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(
|
migrations.AddField(
|
||||||
model_name='asset',
|
model_name='asset',
|
||||||
name='nodes',
|
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(
|
migrations.AddField(
|
||||||
model_name='asset',
|
model_name='asset',
|
||||||
name='platform',
|
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(
|
migrations.CreateModel(
|
||||||
name='AssetBaseAutomation',
|
name='AssetBaseAutomation',
|
||||||
|
@ -71,7 +75,9 @@ class Migration(migrations.Migration):
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='GatherFactsAutomation',
|
name='GatherFactsAutomation',
|
||||||
fields=[
|
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={
|
options={
|
||||||
'verbose_name': 'Gather asset facts',
|
'verbose_name': 'Gather asset facts',
|
||||||
|
@ -81,7 +87,9 @@ class Migration(migrations.Migration):
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='PingAutomation',
|
name='PingAutomation',
|
||||||
fields=[
|
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={
|
options={
|
||||||
'verbose_name': 'Ping asset',
|
'verbose_name': 'Ping asset',
|
||||||
|
|
|
@ -18,7 +18,7 @@ platforms_data_json = '''[
|
||||||
"type": "linux",
|
"type": "linux",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": true,
|
"su_enabled": true,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -119,7 +119,7 @@ platforms_data_json = '''[
|
||||||
"type": "unix",
|
"type": "unix",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": true,
|
"su_enabled": true,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -209,7 +209,7 @@ platforms_data_json = '''[
|
||||||
"type": "unix",
|
"type": "unix",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": true,
|
"su_enabled": true,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -299,7 +299,7 @@ platforms_data_json = '''[
|
||||||
"type": "unix",
|
"type": "unix",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": true,
|
"su_enabled": true,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -389,7 +389,7 @@ platforms_data_json = '''[
|
||||||
"type": "windows",
|
"type": "windows",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -481,7 +481,7 @@ platforms_data_json = '''[
|
||||||
"security": "any"
|
"security": "any"
|
||||||
},
|
},
|
||||||
"internal": false,
|
"internal": false,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -582,7 +582,7 @@ platforms_data_json = '''[
|
||||||
"type": "other",
|
"type": "other",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": false,
|
"internal": false,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -684,7 +684,7 @@ platforms_data_json = '''[
|
||||||
"security": "rdp"
|
"security": "rdp"
|
||||||
},
|
},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -776,7 +776,7 @@ platforms_data_json = '''[
|
||||||
"security": "tls"
|
"security": "tls"
|
||||||
},
|
},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -866,7 +866,7 @@ platforms_data_json = '''[
|
||||||
"type": "unix",
|
"type": "unix",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": true,
|
"su_enabled": true,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -956,7 +956,7 @@ platforms_data_json = '''[
|
||||||
"type": "linux",
|
"type": "linux",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": true,
|
"su_enabled": true,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1057,7 +1057,7 @@ platforms_data_json = '''[
|
||||||
"type": "windows",
|
"type": "windows",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1136,7 +1136,7 @@ platforms_data_json = '''[
|
||||||
"type": "general",
|
"type": "general",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1201,7 +1201,7 @@ platforms_data_json = '''[
|
||||||
"type": "general",
|
"type": "general",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": true,
|
"su_enabled": true,
|
||||||
"su_method": "enable",
|
"su_method": "enable",
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1266,7 +1266,7 @@ platforms_data_json = '''[
|
||||||
"type": "general",
|
"type": "general",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": true,
|
"su_enabled": true,
|
||||||
"su_method": "super",
|
"su_method": "super",
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1332,7 +1332,7 @@ platforms_data_json = '''[
|
||||||
"type": "general",
|
"type": "general",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": true,
|
"su_enabled": true,
|
||||||
"su_method": "super_level",
|
"su_method": "super_level",
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1397,7 +1397,7 @@ platforms_data_json = '''[
|
||||||
"type": "mysql",
|
"type": "mysql",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1449,7 +1449,7 @@ platforms_data_json = '''[
|
||||||
"type": "mariadb",
|
"type": "mariadb",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1501,7 +1501,7 @@ platforms_data_json = '''[
|
||||||
"type": "postgresql",
|
"type": "postgresql",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1553,7 +1553,7 @@ platforms_data_json = '''[
|
||||||
"type": "oracle",
|
"type": "oracle",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1605,7 +1605,7 @@ platforms_data_json = '''[
|
||||||
"type": "sqlserver",
|
"type": "sqlserver",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1657,7 +1657,7 @@ platforms_data_json = '''[
|
||||||
"type": "clickhouse",
|
"type": "clickhouse",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1709,7 +1709,7 @@ platforms_data_json = '''[
|
||||||
"type": "mongodb",
|
"type": "mongodb",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1761,7 +1761,7 @@ platforms_data_json = '''[
|
||||||
"type": "redis",
|
"type": "redis",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1815,7 +1815,7 @@ platforms_data_json = '''[
|
||||||
"type": "redis",
|
"type": "redis",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1869,7 +1869,7 @@ platforms_data_json = '''[
|
||||||
"type": "website",
|
"type": "website",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": false,
|
"gateway_enabled": false,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1924,7 +1924,7 @@ platforms_data_json = '''[
|
||||||
"type": "private",
|
"type": "private",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": false,
|
"gateway_enabled": false,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -1979,7 +1979,7 @@ platforms_data_json = '''[
|
||||||
"type": "k8s",
|
"type": "k8s",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": false,
|
"gateway_enabled": false,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -2029,7 +2029,7 @@ platforms_data_json = '''[
|
||||||
"type": "chatgpt",
|
"type": "chatgpt",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": false,
|
"gateway_enabled": false,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -2081,7 +2081,7 @@ platforms_data_json = '''[
|
||||||
"type": "db2",
|
"type": "db2",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -2131,7 +2131,7 @@ platforms_data_json = '''[
|
||||||
"type": "dameng",
|
"type": "dameng",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
|
|
@ -52,6 +52,6 @@ class Migration(migrations.Migration):
|
||||||
related_name="assets",
|
related_name="assets",
|
||||||
to="assets.directoryservice",
|
to="assets.directoryservice",
|
||||||
verbose_name="Directory services",
|
verbose_name="Directory services",
|
||||||
),
|
)
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -19,7 +19,7 @@ def add_ds_platforms(apps, schema_editor):
|
||||||
"type": "windows_ad",
|
"type": "windows_ad",
|
||||||
"meta": {},
|
"meta": {},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": true,
|
"gateway_enabled": true,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [],
|
"custom_fields": [],
|
||||||
|
@ -117,7 +117,7 @@ def add_ds_platforms(apps, schema_editor):
|
||||||
"meta": {
|
"meta": {
|
||||||
},
|
},
|
||||||
"internal": true,
|
"internal": true,
|
||||||
"domain_enabled": false,
|
"gateway_enabled": false,
|
||||||
"su_enabled": false,
|
"su_enabled": false,
|
||||||
"su_method": null,
|
"su_method": null,
|
||||||
"custom_fields": [
|
"custom_fields": [
|
||||||
|
|
|
@ -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",
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,9 +1,10 @@
|
||||||
|
# noqa
|
||||||
from .base import *
|
from .base import *
|
||||||
from .platform import *
|
from .platform import *
|
||||||
from .asset import *
|
from .asset import *
|
||||||
from .label import Label
|
from .label import Label
|
||||||
from .gateway import *
|
from .gateway import *
|
||||||
from .domain import *
|
from .zone import * # noqa
|
||||||
from .node import *
|
from .node import *
|
||||||
from .favorite_asset import *
|
from .favorite_asset import *
|
||||||
from .automations import *
|
from .automations import *
|
||||||
|
|
|
@ -168,8 +168,8 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
|
||||||
platform = models.ForeignKey(
|
platform = models.ForeignKey(
|
||||||
Platform, on_delete=models.PROTECT, verbose_name=_("Platform"), related_name='assets'
|
Platform, on_delete=models.PROTECT, verbose_name=_("Platform"), related_name='assets'
|
||||||
)
|
)
|
||||||
domain = models.ForeignKey(
|
zone = models.ForeignKey(
|
||||||
"assets.Domain", null=True, blank=True, related_name='assets',
|
"assets.Zone", null=True, blank=True, related_name='assets',
|
||||||
verbose_name=_("Zone"), on_delete=models.SET_NULL
|
verbose_name=_("Zone"), on_delete=models.SET_NULL
|
||||||
)
|
)
|
||||||
nodes = models.ManyToManyField(
|
nodes = models.ManyToManyField(
|
||||||
|
@ -177,7 +177,7 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
|
||||||
)
|
)
|
||||||
directory_services = models.ManyToManyField(
|
directory_services = models.ManyToManyField(
|
||||||
'assets.DirectoryService', related_name='assets',
|
'assets.DirectoryService', related_name='assets',
|
||||||
verbose_name=_("Directory service")
|
verbose_name=_("Directory services")
|
||||||
)
|
)
|
||||||
is_active = models.BooleanField(default=True, verbose_name=_('Active'))
|
is_active = models.BooleanField(default=True, verbose_name=_('Active'))
|
||||||
gathered_info = models.JSONField(verbose_name=_('Gathered info'), default=dict, blank=True) # 资产的一些信息,如 硬件信息
|
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
|
platform = self.platform
|
||||||
auto_config = {
|
auto_config = {
|
||||||
'su_enabled': platform.su_enabled,
|
'su_enabled': platform.su_enabled,
|
||||||
'domain_enabled': platform.domain_enabled,
|
'gateway_enabled': platform.gateway_enabled,
|
||||||
'ansible_enabled': False
|
'ansible_enabled': False
|
||||||
}
|
}
|
||||||
automation = getattr(self.platform, 'automation', None)
|
automation = getattr(self.platform, 'automation', None)
|
||||||
|
@ -362,11 +362,11 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
|
||||||
|
|
||||||
@lazyproperty
|
@lazyproperty
|
||||||
def gateway(self):
|
def gateway(self):
|
||||||
if not self.domain_id:
|
if not self.zone_id:
|
||||||
return
|
return
|
||||||
if not self.platform.domain_enabled:
|
if not self.platform.gateway_enabled:
|
||||||
return
|
return
|
||||||
return self.domain.select_gateway()
|
return self.zone.select_gateway()
|
||||||
|
|
||||||
def as_node(self):
|
def as_node(self):
|
||||||
from assets.models import Node
|
from assets.models import Node
|
||||||
|
|
|
@ -101,7 +101,7 @@ class Platform(LabeledMixin, JMSBaseModel):
|
||||||
default=CharsetChoices.utf8, choices=CharsetChoices.choices,
|
default=CharsetChoices.utf8, choices=CharsetChoices.choices,
|
||||||
max_length=8, verbose_name=_("Charset")
|
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"))
|
ds_enabled = models.BooleanField(default=False, verbose_name=_("DS enabled"))
|
||||||
# 账号有关的
|
# 账号有关的
|
||||||
su_enabled = models.BooleanField(default=False, verbose_name=_("Su enabled"))
|
su_enabled = models.BooleanField(default=False, verbose_name=_("Su enabled"))
|
||||||
|
|
|
@ -12,10 +12,10 @@ from .gateway import Gateway
|
||||||
|
|
||||||
logger = get_logger(__file__)
|
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'))
|
name = models.CharField(max_length=128, verbose_name=_('Name'))
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -49,7 +49,7 @@ class Domain(LabeledMixin, JMSOrgBaseModel):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def gateways(self):
|
def gateways(self):
|
||||||
queryset = self.get_gateway_queryset().filter(domain=self)
|
queryset = self.get_gateway_queryset().filter(zone=self)
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
|
@ -154,7 +154,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Asset
|
model = Asset
|
||||||
fields_fk = ['domain', 'platform']
|
fields_fk = ['zone', 'platform']
|
||||||
fields_mini = ['id', 'name', 'address'] + fields_fk
|
fields_mini = ['id', 'name', 'address'] + fields_fk
|
||||||
fields_small = fields_mini + ['is_active', 'comment']
|
fields_small = fields_mini + ['is_active', 'comment']
|
||||||
fields_m2m = [
|
fields_m2m = [
|
||||||
|
@ -233,7 +233,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa
|
||||||
@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('domain', 'nodes', 'protocols', 'directory_services') \
|
queryset = queryset.prefetch_related('zone', 'nodes', 'protocols', 'directory_services') \
|
||||||
.prefetch_related('platform', 'platform__automation') \
|
.prefetch_related('platform', 'platform__automation') \
|
||||||
.annotate(category=F("platform__category")) \
|
.annotate(category=F("platform__category")) \
|
||||||
.annotate(type=F("platform__type")) \
|
.annotate(type=F("platform__type")) \
|
||||||
|
@ -271,9 +271,9 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa
|
||||||
raise serializers.ValidationError({'platform': _("Platform not exist")})
|
raise serializers.ValidationError({'platform': _("Platform not exist")})
|
||||||
return platform
|
return platform
|
||||||
|
|
||||||
def validate_domain(self, value):
|
def validate_zone(self, value):
|
||||||
platform = self._asset_platform
|
platform = self._asset_platform
|
||||||
if platform.domain_enabled:
|
if platform.gateway_enabled:
|
||||||
return value
|
return value
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -8,12 +8,12 @@ from common.serializers import ResourceLabelsMixin
|
||||||
from common.serializers.fields import ObjectRelatedField
|
from common.serializers.fields import ObjectRelatedField
|
||||||
from orgs.mixins.serializers import BulkOrgResourceModelSerializer
|
from orgs.mixins.serializers import BulkOrgResourceModelSerializer
|
||||||
from .gateway import GatewayWithAccountSecretSerializer
|
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(
|
gateways = ObjectRelatedField(
|
||||||
many=True, required=False, label=_('Gateway'), queryset=Gateway.objects,
|
many=True, required=False, label=_('Gateway'), queryset=Gateway.objects,
|
||||||
help_text=_(
|
help_text=_(
|
||||||
|
@ -23,7 +23,7 @@ class DomainSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer):
|
||||||
assets_amount = serializers.IntegerField(label=_('Assets amount'), read_only=True)
|
assets_amount = serializers.IntegerField(label=_('Assets amount'), read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Domain
|
model = Zone
|
||||||
fields_mini = ['id', 'name']
|
fields_mini = ['id', 'name']
|
||||||
fields_small = fields_mini + ['comment']
|
fields_small = fields_mini + ['comment']
|
||||||
fields_m2m = ['assets', 'gateways', 'labels', 'assets_amount']
|
fields_m2m = ['assets', 'gateways', 'labels', 'assets_amount']
|
||||||
|
@ -55,9 +55,9 @@ class DomainSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer):
|
||||||
return super().update(instance, validated_data)
|
return super().update(instance, validated_data)
|
||||||
|
|
||||||
|
|
||||||
class DomainListSerializer(DomainSerializer):
|
class ZoneListSerializer(ZoneSerializer):
|
||||||
class Meta(DomainSerializer.Meta):
|
class Meta(ZoneSerializer.Meta):
|
||||||
fields = list(set(DomainSerializer.Meta.fields + ['assets_amount']) - {'assets'})
|
fields = list(set(ZoneSerializer.Meta.fields + ['assets_amount']) - {'assets'})
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setup_eager_loading(cls, queryset):
|
def setup_eager_loading(cls, queryset):
|
||||||
|
@ -67,9 +67,9 @@ class DomainListSerializer(DomainSerializer):
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
class DomainWithGatewaySerializer(serializers.ModelSerializer):
|
class ZoneWithGatewaySerializer(serializers.ModelSerializer):
|
||||||
gateways = GatewayWithAccountSecretSerializer(many=True, read_only=True)
|
gateways = GatewayWithAccountSecretSerializer(many=True, read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Domain
|
model = Zone
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
|
@ -194,7 +194,7 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes
|
||||||
]
|
]
|
||||||
fields_m2m = ['assets', 'assets_amount']
|
fields_m2m = ['assets', 'assets_amount']
|
||||||
fields = fields_small + fields_m2m + [
|
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"
|
"ds_enabled", "automation", "comment", "custom_fields", "labels"
|
||||||
] + read_only_fields
|
] + read_only_fields
|
||||||
extra_kwargs = {
|
extra_kwargs = {
|
||||||
|
@ -205,11 +205,11 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes
|
||||||
"similar to logging in with a regular account and then switching to root"
|
"similar to logging in with a regular account and then switching to root"
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
"domain_enabled": {
|
"gateway_enabled": {
|
||||||
"label": _('Gateway enabled'),
|
"label": _('Gateway enabled'),
|
||||||
"help_text": _("Assets can be connected using a zone gateway")
|
"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')},
|
'assets': {'required': False, 'label': _('Assets')},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,8 +262,8 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes
|
||||||
def validate_su_enabled(self, su_enabled):
|
def validate_su_enabled(self, su_enabled):
|
||||||
return su_enabled and self.constraints.get('su_enabled', False)
|
return su_enabled and self.constraints.get('su_enabled', False)
|
||||||
|
|
||||||
def validate_domain_enabled(self, domain_enabled):
|
def validate_gateway_enabled(self, gateway_enabled):
|
||||||
return domain_enabled and self.constraints.get('domain_enabled', False)
|
return gateway_enabled and self.constraints.get('gateway_enabled', False)
|
||||||
|
|
||||||
def validate_automation(self, automation):
|
def validate_automation(self, automation):
|
||||||
automation = automation or {}
|
automation = automation or {}
|
||||||
|
|
|
@ -20,7 +20,7 @@ router.register(r'directories', api.DSViewSet, 'ds')
|
||||||
router.register(r'customs', api.CustomViewSet, 'custom')
|
router.register(r'customs', api.CustomViewSet, 'custom')
|
||||||
router.register(r'platforms', api.AssetPlatformViewSet, 'platform')
|
router.register(r'platforms', api.AssetPlatformViewSet, 'platform')
|
||||||
router.register(r'nodes', api.NodeViewSet, 'node')
|
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'gateways', api.GatewayViewSet, 'gateway')
|
||||||
router.register(r'favorite-assets', api.FavoriteAssetViewSet, 'favorite-asset')
|
router.register(r'favorite-assets', api.FavoriteAssetViewSet, 'favorite-asset')
|
||||||
router.register(r'protocol-settings', api.PlatformProtocolViewSet, 'protocol-setting')
|
router.register(r'protocol-settings', api.PlatformProtocolViewSet, 'protocol-setting')
|
||||||
|
|
|
@ -251,7 +251,7 @@ class ConnectionToken(JMSOrgBaseModel):
|
||||||
raise JMSException({'error': 'No host account available, please check the applet, host and account'})
|
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'))
|
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
|
platform = host.platform
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
|
@ -305,17 +305,17 @@ class ConnectionToken(JMSOrgBaseModel):
|
||||||
return account
|
return account
|
||||||
|
|
||||||
@lazyproperty
|
@lazyproperty
|
||||||
def domain(self):
|
def zone(self):
|
||||||
if not self.asset.platform.domain_enabled:
|
if not self.asset.platform.gateway_enabled:
|
||||||
return
|
return
|
||||||
if self.asset.platform.name == GATEWAY_NAME:
|
if self.asset.platform.name == GATEWAY_NAME:
|
||||||
return
|
return
|
||||||
domain = self.asset.domain if self.asset.domain else None
|
zone = self.asset.zone if self.asset.zone else None
|
||||||
return domain
|
return zone
|
||||||
|
|
||||||
@lazyproperty
|
@lazyproperty
|
||||||
def gateway(self):
|
def gateway(self):
|
||||||
if not self.asset or not self.domain:
|
if not self.asset or not self.zone:
|
||||||
return
|
return
|
||||||
return self.asset.gateway
|
return self.asset.gateway
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ from rest_framework import serializers
|
||||||
from accounts.const import SecretType
|
from accounts.const import SecretType
|
||||||
from accounts.models import Account
|
from accounts.models import Account
|
||||||
from acls.models import CommandGroup, CommandFilterACL
|
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.asset import AssetProtocolsSerializer
|
||||||
from assets.serializers.platform import PlatformSerializer
|
from assets.serializers.platform import PlatformSerializer
|
||||||
from common.serializers.fields import LabeledChoiceField
|
from common.serializers.fields import LabeledChoiceField
|
||||||
|
@ -135,7 +135,7 @@ class ConnectionTokenSecretSerializer(OrgResourceModelSerializerMixin):
|
||||||
account = _ConnectionTokenAccountSerializer(read_only=True, source='account_object')
|
account = _ConnectionTokenAccountSerializer(read_only=True, source='account_object')
|
||||||
gateway = _ConnectionTokenGatewaySerializer(read_only=True)
|
gateway = _ConnectionTokenGatewaySerializer(read_only=True)
|
||||||
platform = _ConnectionTokenPlatformSerializer(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)
|
command_filter_acls = _ConnectionTokenCommandFilterACLSerializer(read_only=True, many=True)
|
||||||
expire_now = serializers.BooleanField(label=_('Expired now'), write_only=True, default=True)
|
expire_now = serializers.BooleanField(label=_('Expired now'), write_only=True, default=True)
|
||||||
connect_method = _ConnectTokenConnectMethodSerializer(read_only=True, source='connect_method_object')
|
connect_method = _ConnectTokenConnectMethodSerializer(read_only=True, source='connect_method_object')
|
||||||
|
@ -148,7 +148,7 @@ class ConnectionTokenSecretSerializer(OrgResourceModelSerializerMixin):
|
||||||
fields = [
|
fields = [
|
||||||
'id', 'value', 'user', 'asset', 'account',
|
'id', 'value', 'user', 'asset', 'account',
|
||||||
'platform', 'command_filter_acls', 'protocol',
|
'platform', 'command_filter_acls', 'protocol',
|
||||||
'domain', 'gateway', 'actions', 'expire_at',
|
'zone', 'gateway', 'actions', 'expire_at',
|
||||||
'from_ticket', 'expire_now', 'connect_method',
|
'from_ticket', 'expire_now', 'connect_method',
|
||||||
'connect_options', 'face_monitor_token'
|
'connect_options', 'face_monitor_token'
|
||||||
]
|
]
|
||||||
|
|
|
@ -2882,7 +2882,7 @@ msgstr "Código"
|
||||||
|
|
||||||
#: assets/models/platform.py:104 assets/serializers/platform.py:209
|
#: assets/models/platform.py:104 assets/serializers/platform.py:209
|
||||||
msgid "Gateway enabled"
|
msgid "Gateway enabled"
|
||||||
msgstr "Activar dominio"
|
msgstr "Activar gateway de zona"
|
||||||
|
|
||||||
#: assets/models/platform.py:105
|
#: assets/models/platform.py:105
|
||||||
msgid "DS enabled"
|
msgid "DS enabled"
|
||||||
|
|
|
@ -2769,7 +2769,7 @@ msgstr "シャーセット"
|
||||||
|
|
||||||
#: assets/models/platform.py:104 assets/serializers/platform.py:209
|
#: assets/models/platform.py:104 assets/serializers/platform.py:209
|
||||||
msgid "Gateway enabled"
|
msgid "Gateway enabled"
|
||||||
msgstr "ゲートウェイが有効になりました"
|
msgstr "ゾーンゲートウェイを有効化"
|
||||||
|
|
||||||
#: assets/models/platform.py:105
|
#: assets/models/platform.py:105
|
||||||
msgid "DS enabled"
|
msgid "DS enabled"
|
||||||
|
|
|
@ -2862,7 +2862,7 @@ msgstr "Codificação"
|
||||||
|
|
||||||
#: assets/models/platform.py:104 assets/serializers/platform.py:209
|
#: assets/models/platform.py:104 assets/serializers/platform.py:209
|
||||||
msgid "Gateway enabled"
|
msgid "Gateway enabled"
|
||||||
msgstr "Habilitar domínio"
|
msgstr "Ativar zone gateway"
|
||||||
|
|
||||||
#: assets/models/platform.py:105
|
#: assets/models/platform.py:105
|
||||||
msgid "DS enabled"
|
msgid "DS enabled"
|
||||||
|
|
|
@ -2827,7 +2827,7 @@ msgstr "Кодировка"
|
||||||
|
|
||||||
#: assets/models/platform.py:104 assets/serializers/platform.py:209
|
#: assets/models/platform.py:104 assets/serializers/platform.py:209
|
||||||
msgid "Gateway enabled"
|
msgid "Gateway enabled"
|
||||||
msgstr "Шлюз включен"
|
msgstr "Включить шлюз зоны"
|
||||||
|
|
||||||
#: assets/models/platform.py:105
|
#: assets/models/platform.py:105
|
||||||
msgid "DS enabled"
|
msgid "DS enabled"
|
||||||
|
|
|
@ -2780,11 +2780,11 @@ msgstr "编码"
|
||||||
|
|
||||||
#: assets/models/platform.py:104 assets/serializers/platform.py:209
|
#: assets/models/platform.py:104 assets/serializers/platform.py:209
|
||||||
msgid "Gateway enabled"
|
msgid "Gateway enabled"
|
||||||
msgstr "启用网域"
|
msgstr "启用网域网关"
|
||||||
|
|
||||||
#: assets/models/platform.py:105
|
#: assets/models/platform.py:105
|
||||||
msgid "DS enabled"
|
msgid "DS enabled"
|
||||||
msgstr "目录服务已启用"
|
msgstr "启用目录服务"
|
||||||
|
|
||||||
#: assets/models/platform.py:107 assets/serializers/platform.py:202
|
#: assets/models/platform.py:107 assets/serializers/platform.py:202
|
||||||
msgid "Su enabled"
|
msgid "Su enabled"
|
||||||
|
|
|
@ -2751,7 +2751,7 @@ msgstr "編碼"
|
||||||
|
|
||||||
#: assets/models/platform.py:104 assets/serializers/platform.py:209
|
#: assets/models/platform.py:104 assets/serializers/platform.py:209
|
||||||
msgid "Gateway enabled"
|
msgid "Gateway enabled"
|
||||||
msgstr "啟用網域"
|
msgstr "啟用網域網関"
|
||||||
|
|
||||||
#: assets/models/platform.py:105
|
#: assets/models/platform.py:105
|
||||||
msgid "DS enabled"
|
msgid "DS enabled"
|
||||||
|
|
|
@ -37,7 +37,7 @@ class JMSInventory:
|
||||||
from assets.models import Asset
|
from assets.models import Asset
|
||||||
asset_ids = [asset.id for asset in assets]
|
asset_ids = [asset.id for asset in assets]
|
||||||
assets = Asset.objects.filter(id__in=asset_ids, is_active=True) \
|
assets = Asset.objects.filter(id__in=asset_ids, is_active=True) \
|
||||||
.prefetch_related('platform', 'domain', 'accounts')
|
.prefetch_related('platform', 'zone', 'accounts')
|
||||||
return assets
|
return assets
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -236,8 +236,8 @@ class JMSInventory:
|
||||||
host.update(ansible_config)
|
host.update(ansible_config)
|
||||||
|
|
||||||
gateway = None
|
gateway = None
|
||||||
if not asset.is_gateway and asset.domain:
|
if not asset.is_gateway and asset.zone:
|
||||||
gateway = asset.domain.select_gateway()
|
gateway = asset.zone.select_gateway()
|
||||||
|
|
||||||
self.make_account_vars(
|
self.make_account_vars(
|
||||||
host, asset, account, automation, protocol, platform, gateway, path_dir, ansible_config
|
host, asset, account, automation, protocol, platform, gateway, path_dir, ansible_config
|
||||||
|
|
|
@ -7,7 +7,7 @@ from rest_framework.exceptions import PermissionDenied
|
||||||
from rest_framework.generics import RetrieveAPIView
|
from rest_framework.generics import RetrieveAPIView
|
||||||
|
|
||||||
from assets.models import (
|
from assets.models import (
|
||||||
Asset, Domain, Label, Node,
|
Asset, Zone, Label, Node,
|
||||||
)
|
)
|
||||||
from common.api import JMSBulkModelViewSet
|
from common.api import JMSBulkModelViewSet
|
||||||
from common.permissions import IsValidUser
|
from common.permissions import IsValidUser
|
||||||
|
@ -24,7 +24,7 @@ logger = get_logger(__file__)
|
||||||
|
|
||||||
# 部分 org 相关的 model,需要清空这些数据之后才能删除该组织
|
# 部分 org 相关的 model,需要清空这些数据之后才能删除该组织
|
||||||
org_related_models = [
|
org_related_models = [
|
||||||
User, UserGroup, Asset, Node, Label, Domain, AssetPermission
|
User, UserGroup, Asset, Node, Label, Zone, AssetPermission
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
from django.db.transaction import on_commit
|
from django.db.transaction import on_commit
|
||||||
|
|
||||||
from orgs.models import Organization
|
from accounts.models import Account
|
||||||
from orgs.tasks import refresh_org_cache_task
|
from assets.models import Node, Zone, Asset
|
||||||
from orgs.utils import current_org, tmp_to_org
|
|
||||||
from common.cache import Cache, IntegerField
|
from common.cache import Cache, IntegerField
|
||||||
from common.utils import get_logger
|
from common.utils import get_logger
|
||||||
from common.utils.timezone import local_zero_hour, local_monday
|
from common.utils.timezone import local_zero_hour, local_monday
|
||||||
from users.models import UserGroup, User
|
from orgs.models import Organization
|
||||||
from assets.models import Node, Domain, Asset
|
from orgs.tasks import refresh_org_cache_task
|
||||||
from accounts.models import Account
|
from orgs.utils import current_org, tmp_to_org
|
||||||
from terminal.models import Session
|
|
||||||
from perms.models import AssetPermission
|
from perms.models import AssetPermission
|
||||||
|
from terminal.models import Session
|
||||||
|
from users.models import UserGroup, User
|
||||||
|
|
||||||
logger = get_logger(__file__)
|
logger = get_logger(__file__)
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ class OrgResourceStatisticsCache(OrgRelatedCache):
|
||||||
new_users_amount_this_week = IntegerField()
|
new_users_amount_this_week = IntegerField()
|
||||||
new_assets_amount_this_week = IntegerField()
|
new_assets_amount_this_week = IntegerField()
|
||||||
nodes_amount = IntegerField(queryset=Node.objects)
|
nodes_amount = IntegerField(queryset=Node.objects)
|
||||||
domains_amount = IntegerField(queryset=Domain.objects)
|
zones_amount = IntegerField(queryset=Zone.objects)
|
||||||
groups_amount = IntegerField(queryset=UserGroup.objects)
|
groups_amount = IntegerField(queryset=UserGroup.objects)
|
||||||
accounts_amount = IntegerField(queryset=Account.objects)
|
accounts_amount = IntegerField(queryset=Account.objects)
|
||||||
asset_perms_amount = IntegerField(queryset=AssetPermission.objects)
|
asset_perms_amount = IntegerField(queryset=AssetPermission.objects)
|
||||||
|
|
|
@ -12,7 +12,7 @@ class ResourceStatisticsSerializer(serializers.Serializer):
|
||||||
|
|
||||||
assets_amount = serializers.IntegerField(required=False, label=_('Assets amount'))
|
assets_amount = serializers.IntegerField(required=False, label=_('Assets amount'))
|
||||||
nodes_amount = serializers.IntegerField(required=False, label=_('Nodes 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'))
|
gateways_amount = serializers.IntegerField(required=False, label=_('Gateways amount'))
|
||||||
|
|
||||||
asset_perms_amount = serializers.IntegerField(required=False, label=_('Asset permissions amount'))
|
asset_perms_amount = serializers.IntegerField(required=False, label=_('Asset permissions amount'))
|
||||||
|
|
|
@ -2,7 +2,7 @@ from django.db.models.signals import post_save, pre_delete, pre_save, post_delet
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
|
|
||||||
from accounts.models import Account
|
from accounts.models import Account
|
||||||
from assets.models import Asset, Domain
|
from assets.models import Asset, Zone
|
||||||
from assets.models import Node
|
from assets.models import Node
|
||||||
from common.decorators import merge_delay_run
|
from common.decorators import merge_delay_run
|
||||||
from common.utils import get_logger
|
from common.utils import get_logger
|
||||||
|
@ -64,7 +64,7 @@ def on_user_delete_refresh_cache(sender, instance, **kwargs):
|
||||||
|
|
||||||
model_cache_field_mapper = {
|
model_cache_field_mapper = {
|
||||||
Node: ['nodes_amount'],
|
Node: ['nodes_amount'],
|
||||||
Domain: ['domains_amount'],
|
Zone: ['zones_amount'],
|
||||||
UserGroup: ['groups_amount'],
|
UserGroup: ['groups_amount'],
|
||||||
Account: ['accounts_amount'],
|
Account: ['accounts_amount'],
|
||||||
RoleBinding: ['users_amount', 'new_users_amount_this_week'],
|
RoleBinding: ['users_amount', 'new_users_amount_this_week'],
|
||||||
|
|
|
@ -25,12 +25,12 @@ class AssetPermedSerializer(OrgResourceModelSerializerMixin, ResourceLabelsMixin
|
||||||
platform = ObjectRelatedField(required=False, queryset=Platform.objects, label=_('Platform'))
|
platform = ObjectRelatedField(required=False, queryset=Platform.objects, label=_('Platform'))
|
||||||
category = LabeledChoiceField(choices=Category.choices, read_only=True, label=_('Category'))
|
category = LabeledChoiceField(choices=Category.choices, read_only=True, label=_('Category'))
|
||||||
type = LabeledChoiceField(choices=AllTypes.choices(), read_only=True, label=_('Type'))
|
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:
|
class Meta:
|
||||||
model = Asset
|
model = Asset
|
||||||
only_fields = [
|
only_fields = [
|
||||||
'id', 'name', 'address', 'domain', 'platform',
|
'id', 'name', 'address', 'zone', 'platform',
|
||||||
'comment', 'org_id', 'is_active', 'date_verified',
|
'comment', 'org_id', 'is_active', 'date_verified',
|
||||||
'created_by', 'date_created', 'connectivity', 'nodes', 'labels'
|
'created_by', 'date_created', 'connectivity', 'nodes', 'labels'
|
||||||
]
|
]
|
||||||
|
@ -40,7 +40,7 @@ class AssetPermedSerializer(OrgResourceModelSerializerMixin, ResourceLabelsMixin
|
||||||
@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('domain', 'nodes') \
|
queryset = queryset.prefetch_related('zone', 'nodes') \
|
||||||
.prefetch_related('platform') \
|
.prefetch_related('platform') \
|
||||||
.annotate(category=F("platform__category")) \
|
.annotate(category=F("platform__category")) \
|
||||||
.annotate(type=F("platform__type"))
|
.annotate(type=F("platform__type"))
|
||||||
|
|
Loading…
Reference in New Issue