Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fc0a232808 | ||
|
|
774412d5dd | ||
|
|
909a7f10b9 | ||
|
|
f7edac730a | ||
|
|
8f014953af | ||
|
|
7e8b74f3b8 | ||
|
|
dd851d388c | ||
|
|
88fad0f9fa | ||
|
|
1e0c3b808b | ||
|
|
12cbfef017 |
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user