Compare commits

10 Commits
main ... dev

Author SHA1 Message Date
IluaAir
fc0a232808 add script order 2025-10-06 17:59:59 +03:00
IluaAir
774412d5dd fix 2025-10-06 17:30:01 +03:00
IluaAir
909a7f10b9 fix tenant group 2025-10-06 17:28:31 +03:00
IluaAir
f7edac730a test tenants group 2025-10-06 17:26:04 +03:00
IluaAir
8f014953af fix tenant group 2025-10-06 17:24:49 +03:00
IluaAir
7e8b74f3b8 add device test template 2025-10-06 17:21:10 +03:00
IluaAir
dd851d388c 3 fix 2025-10-06 15:12:27 +03:00
IluaAir
88fad0f9fa doble fix tanant check 2025-10-06 15:04:50 +03:00
IluaAir
1e0c3b808b fix tenant check 2025-10-06 15:03:15 +03:00
IluaAir
12cbfef017 refactor 2025-10-06 13:32:42 +03:00

View File

@@ -2,9 +2,11 @@ import re
from tenancy.models import Tenant, TenantGroup, Contact, ContactRole, ContactAssignment from tenancy.models import Tenant, TenantGroup, Contact, ContactRole, ContactAssignment
from ipam.models import Prefix, VRF, Role from ipam.models import Prefix, VRF, Role
from dcim.models import DeviceType, DeviceRole, Device
from extras.scripts import Script, StringVar, IPNetworkVar, ChoiceVar, ObjectVar from extras.scripts import Script, StringVar, IPNetworkVar, ChoiceVar, ObjectVar
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from extras.models import CustomField from extras.models import CustomField
from utilities.exceptions import AbortScript
def slugify(text: str): def slugify(text: str):
@@ -90,6 +92,7 @@ class CreateTenant(Script):
class Meta: class Meta:
name = "Создание Оператора" name = "Создание Оператора"
description = "Создание оператора и связанного префикса" description = "Создание оператора и связанного префикса"
scheduling_enabled = False
fieldsets = ( fieldsets = (
( (
"Оператор", "Оператор",
@@ -131,31 +134,49 @@ class CreateTenant(Script):
description="URL или номер задачи из redmine, jira, CRM", description="URL или номер задачи из redmine, jira, CRM",
required=False, required=False,
) )
prefix_cidr = IPNetworkVar(label="Префикс (CIDR)")
prefix_cidr = IPNetworkVar(
label="Префикс для оператора (CIDR)",
description="Указывается с маской подсети /xx",
)
prefix_vrf = ObjectVar(label="VRF проекта", model=VRF, required=True) prefix_vrf = ObjectVar(label="VRF проекта", model=VRF, required=True)
prefix_role = ObjectVar(label="Роль", model=Role, required=True) prefix_role = ObjectVar(
label="Роль",
description="Роль для малых операторов IPMI-SSH-MGMT",
model=Role,
required=True,
)
prefix_description = StringVar(label="Описание префикса", required=False) prefix_description = StringVar(label="Описание префикса", required=False)
contacts_fio = StringVar(label="ФИО", required=False) contacts_fio = StringVar(
label="ФИО",
description="Указывается в формате Иванов Иван Иванович, остальные значения игнорируются при отсутсвии ФИО",
required=False,
)
contacts_phone = StringVar(label="Номер тел.", required=False) contacts_phone = StringVar(label="Номер тел.", required=False)
contacts_email = StringVar(label="E-mail", required=False) contacts_email = StringVar(label="E-mail", required=False)
contacts_role = ObjectVar(label="Роль контакта", model=ContactRole, required=False) contacts_role = ObjectVar(label="Роль контакта", model=ContactRole, required=False)
def run(self, data, commit): def check_tenant_exists(self, data):
try:
tenant_slug = slugify(data["tenant_name"])
if Tenant.objects.filter(name=data["tenant_name"]).exists(): if Tenant.objects.filter(name=data["tenant_name"]).exists():
self.log_failure( raise ValidationError(
f"Оператор с именем '{data['tenant_name']}' уже существует" f"Оператор с именем '{data['tenant_name']}' уже существует"
) )
return
if Tenant.objects.filter(slug=tenant_slug).exists(): def check_prefix_exists(self, data):
self.log_failure( if Prefix.objects.filter(prefix=data["prefix_cidr"]).exists():
f"Оператор со slug '{data['tenant_slug']}' уже существует" self.log_warning(
f"Префикс {data['prefix_cidr']} уже существует, оператор будет создан без префикса"
) )
return return False
return True
def run(self, data, commit):
try:
self.check_tenant_exists(data)
validate_prefix = self.check_prefix_exists(data)
tenant_slug = slugify(data["tenant_name"])
tenant_data = { tenant_data = {
"name": data["tenant_name"], "name": data["tenant_name"],
"slug": tenant_slug, "slug": tenant_slug,
@@ -167,7 +188,9 @@ class CreateTenant(Script):
tenant = Tenant(**tenant_data) tenant = Tenant(**tenant_data)
tenant.custom_field_data["dogovor"] = data["tenant_contract"] tenant.custom_field_data["dogovor"] = data["tenant_contract"]
tenant.custom_field_data["connection_type_tenant"] = data["tenant_connection_type"] tenant.custom_field_data["connection_type_tenant"] = data[
"tenant_connection_type"
]
tenant.custom_field_data["link_on_docs"] = data["tenant_tr"] tenant.custom_field_data["link_on_docs"] = data["tenant_tr"]
tenant.full_clean() tenant.full_clean()
if commit: if commit:
@@ -175,9 +198,7 @@ class CreateTenant(Script):
self.log_success( self.log_success(
f"Создан новый оператор: {tenant.name} - {tenant.slug}" f"Создан новый оператор: {tenant.name} - {tenant.slug}"
) )
if Prefix.objects.filter(prefix=data["prefix_cidr"]).exists(): if validate_prefix:
self.log_warning(f"Префикс {data['prefix_cidr']} уже существует")
return
prefix = Prefix( prefix = Prefix(
prefix=data["prefix_cidr"], prefix=data["prefix_cidr"],
tenant=tenant, tenant=tenant,
@@ -252,7 +273,52 @@ class CreateTenant(Script):
self.log_success("Все данные валидны") self.log_success("Все данные валидны")
except ValidationError as e: except ValidationError as e:
self.log_failure(f"Ошибка валидации: {e}") self.log_failure(f"Ошибка валидации: {e}")
except ValidationError as e:
raise AbortScript(f"Ошибка валидации: {e}")
except Exception as e: except Exception as e:
self.log_failure(f"Ошибка при выполнении скрипта: {e}") self.log_failure(f"Ошибка при выполнении скрипта: {e}")
if commit: if commit:
self.log_failure("Изменения отменены из-за ошибки") self.log_failure("Изменения отменены из-за ошибки")
raise
class CreateDevice(Script):
class Meta:
name = "Создание устройства"
description = "Создание устройства и привязка к оператору"
scheduling_enabled = False
fieldsets = (
(
"Устройство",
(
"device_name",
"device_type",
"device_role",
"device_description",
"tenant_group",
"device_tenant",
),
),
)
device_name = StringVar(label="Имя устройства")
device_role = ObjectVar(label="Роль устройства", model=DeviceRole, required=True)
device_type = ObjectVar(label="Тип устройства", model=DeviceType, required=True)
device_description = StringVar(label="Описание устройства", required=False)
tenant_group = ObjectVar(
label="Группа оператора", model=TenantGroup, required=False
)
device_tenant = ObjectVar(
label="Оператор",
model=Tenant,
required=True,
query_params={
"group_id": "$tenant_group",
},
)
def run(self, data, commit):
pass
script_order = (CreateTenant, CreateDevice)