Use black as formatter for python files

This commit is contained in:
Christian Mäder 2021-02-08 11:59:33 +01:00
parent 0d25aff744
commit 493fc60401
57 changed files with 915 additions and 900 deletions

View File

@ -7,5 +7,5 @@ charset = utf-8
indent_style = space indent_style = space
indent_size = 2 indent_size = 2
[configuration/**.py] [*.py]
indent_size = 4 indent_size = 4

View File

@ -18,8 +18,8 @@ RUN apk add --no-cache \
postgresql-dev \ postgresql-dev \
py3-pip \ py3-pip \
python3-dev \ python3-dev \
&& python3 -m venv /opt/netbox/venv \ && python3 -m venv /opt/netbox/venv \
&& /opt/netbox/venv/bin/python3 -m pip install --upgrade \ && /opt/netbox/venv/bin/python3 -m pip install --upgrade \
pip \ pip \
setuptools \ setuptools \
wheel wheel

View File

@ -5,9 +5,8 @@
#### ####
import re import re
from os.path import dirname, abspath, join
from os import environ from os import environ
from os.path import abspath, dirname, join
# For reference see https://netbox.readthedocs.io/en/stable/configuration/ # For reference see https://netbox.readthedocs.io/en/stable/configuration/
# Based on https://github.com/netbox-community/netbox/blob/master/netbox/netbox/configuration.example.py # Based on https://github.com/netbox-community/netbox/blob/master/netbox/netbox/configuration.example.py
@ -39,16 +38,16 @@ ALLOWED_HOSTS = environ.get('ALLOWED_HOSTS', '*').split(' ')
# PostgreSQL database configuration. See the Django documentation for a complete list of available parameters: # PostgreSQL database configuration. See the Django documentation for a complete list of available parameters:
# https://docs.djangoproject.com/en/stable/ref/settings/#databases # https://docs.djangoproject.com/en/stable/ref/settings/#databases
DATABASE = { DATABASE = {
'NAME': environ.get('DB_NAME', 'netbox'), # Database name 'NAME': environ.get('DB_NAME', 'netbox'), # Database name
'USER': environ.get('DB_USER', ''), # PostgreSQL username 'USER': environ.get('DB_USER', ''), # PostgreSQL username
'PASSWORD': _read_secret('db_password', environ.get('DB_PASSWORD', '')), 'PASSWORD': _read_secret('db_password', environ.get('DB_PASSWORD', '')),
# PostgreSQL password # PostgreSQL password
'HOST': environ.get('DB_HOST', 'localhost'), # Database server 'HOST': environ.get('DB_HOST', 'localhost'), # Database server
'PORT': environ.get('DB_PORT', ''), # Database port (leave blank for default) 'PORT': environ.get('DB_PORT', ''), # Database port (leave blank for default)
'OPTIONS': {'sslmode': environ.get('DB_SSLMODE', 'prefer')}, 'OPTIONS': {'sslmode': environ.get('DB_SSLMODE', 'prefer')},
# Database connection SSLMODE # Database connection SSLMODE
'CONN_MAX_AGE': int(environ.get('DB_CONN_MAX_AGE', '300')), 'CONN_MAX_AGE': int(environ.get('DB_CONN_MAX_AGE', '300')),
# Max database connection age # Max database connection age
} }
# Redis database settings. Redis is used for caching and for queuing background tasks such as webhook events. A separate # Redis database settings. Redis is used for caching and for queuing background tasks such as webhook events. A separate

View File

@ -1,9 +1,10 @@
import ldap
from django_auth_ldap.config import LDAPSearch
from importlib import import_module from importlib import import_module
from os import environ from os import environ
import ldap
from django_auth_ldap.config import LDAPSearch
# Read secret from file # Read secret from file
def _read_secret(secret_name, default=None): def _read_secret(secret_name, default=None):
try: try:
@ -47,9 +48,11 @@ LDAP_IGNORE_CERT_ERRORS = environ.get('LDAP_IGNORE_CERT_ERRORS', 'False').lower(
AUTH_LDAP_USER_SEARCH_BASEDN = environ.get('AUTH_LDAP_USER_SEARCH_BASEDN', '') AUTH_LDAP_USER_SEARCH_BASEDN = environ.get('AUTH_LDAP_USER_SEARCH_BASEDN', '')
AUTH_LDAP_USER_SEARCH_ATTR = environ.get('AUTH_LDAP_USER_SEARCH_ATTR', 'sAMAccountName') AUTH_LDAP_USER_SEARCH_ATTR = environ.get('AUTH_LDAP_USER_SEARCH_ATTR', 'sAMAccountName')
AUTH_LDAP_USER_SEARCH = LDAPSearch(AUTH_LDAP_USER_SEARCH_BASEDN, AUTH_LDAP_USER_SEARCH = LDAPSearch(
ldap.SCOPE_SUBTREE, AUTH_LDAP_USER_SEARCH_BASEDN,
"(" + AUTH_LDAP_USER_SEARCH_ATTR + "=%(user)s)") ldap.SCOPE_SUBTREE,
"(" + AUTH_LDAP_USER_SEARCH_ATTR + "=%(user)s)"
)
# This search ought to return all groups to which the user belongs. django_auth_ldap uses this to determine group # This search ought to return all groups to which the user belongs. django_auth_ldap uses this to determine group
# heirarchy. # heirarchy.

View File

@ -4,58 +4,58 @@
# #
# They can be imported by other code (see `ldap_config.py` for an example). # They can be imported by other code (see `ldap_config.py` for an example).
from os.path import abspath, isfile
from os import scandir
import importlib.util import importlib.util
import sys import sys
from os import scandir
from os.path import abspath, isfile
def _filename(f): def _filename(f):
return f.name return f.name
def _import(module_name, path, loaded_configurations): def _import(module_name, path, loaded_configurations):
spec = importlib.util.spec_from_file_location('', path) spec = importlib.util.spec_from_file_location("", path)
module = importlib.util.module_from_spec(spec) module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module) spec.loader.exec_module(module)
sys.modules[module_name] = module sys.modules[module_name] = module
loaded_configurations.insert(0, module) loaded_configurations.insert(0, module)
print(f"🧬 loaded config '{path}'") print(f"🧬 loaded config '{path}'")
def read_configurations(config_module, config_dir, main_config): def read_configurations(config_module, config_dir, main_config):
loaded_configurations = [] loaded_configurations = []
main_config_path = abspath(f'{config_dir}/{main_config}.py') main_config_path = abspath(f"{config_dir}/{main_config}.py")
if isfile(main_config_path): if isfile(main_config_path):
_import(f'{config_module}.{main_config}', main_config_path, loaded_configurations) _import(f"{config_module}.{main_config}", main_config_path, loaded_configurations)
else: else:
print(f"⚠️ Main configuration '{main_config_path}' not found.") print(f"⚠️ Main configuration '{main_config_path}' not found.")
with scandir(config_dir) as it: with scandir(config_dir) as it:
for f in sorted(it, key=_filename): for f in sorted(it, key=_filename):
if not f.is_file(): if not f.is_file():
continue continue
if f.name.startswith('__'): if f.name.startswith("__"):
continue continue
if not f.name.endswith('.py'): if not f.name.endswith(".py"):
continue continue
if f.name == f'{config_dir}.py': if f.name == f"{config_dir}.py":
continue continue
module_name = f"{config_module}.{f.name[:-len('.py')]}".replace(".", "_") module_name = f"{config_module}.{f.name[:-len('.py')]}".replace(".", "_")
_import(module_name, f.path, loaded_configurations) _import(module_name, f.path, loaded_configurations)
if len(loaded_configurations) == 0: if len(loaded_configurations) == 0:
print(f"‼️ No configuration files found in '{config_dir}'.") print(f"‼️ No configuration files found in '{config_dir}'.")
raise ImportError(f"No configuration files found in '{config_dir}'.") raise ImportError(f"No configuration files found in '{config_dir}'.")
return loaded_configurations return loaded_configurations
## Specific Parts ## Specific Parts
@ -66,15 +66,16 @@ def read_configurations(config_module, config_dir, main_config):
_loaded_configurations = read_configurations( _loaded_configurations = read_configurations(
config_dir = '/etc/netbox/config/', config_dir="/etc/netbox/config/",
config_module = 'netbox.configuration', config_module="netbox.configuration",
main_config = 'configuration') main_config="configuration",
)
def __getattr__(name): def __getattr__(name):
for config in _loaded_configurations: for config in _loaded_configurations:
try: try:
return getattr(config, name) return getattr(config, name)
except: except:
pass pass
raise AttributeError raise AttributeError

View File

@ -1,21 +1,23 @@
from .configuration import read_configurations from .configuration import read_configurations
_loaded_configurations = read_configurations( _loaded_configurations = read_configurations(
config_dir = '/etc/netbox/config/ldap/', config_dir="/etc/netbox/config/ldap/",
config_module = 'netbox.configuration.ldap', config_module="netbox.configuration.ldap",
main_config = 'ldap_config') main_config="ldap_config",
)
def __getattr__(name): def __getattr__(name):
for config in _loaded_configurations: for config in _loaded_configurations:
try: try:
return getattr(config, name) return getattr(config, name)
except: except:
pass pass
raise AttributeError raise AttributeError
def __dir__(): def __dir__():
names = [] names = []
for config in _loaded_configurations: for config in _loaded_configurations:
names.extend(config.__dir__()) names.extend(config.__dir__())
return names return names

View File

@ -53,20 +53,20 @@
# - Fifth Item # - Fifth Item
# - Fourth Item # - Fourth Item
# select_field_legacy_format: # select_field_legacy_format:
# type: select # type: select
# label: Choose between items # label: Choose between items
# required: false # required: false
# filter_logic: loose # filter_logic: loose
# weight: 30 # weight: 30
# on_objects: # on_objects:
# - dcim.models.Device # - dcim.models.Device
# choices: # choices:
# - value: A # this is the deprecated format. # - value: A # this is the deprecated format.
# - value: B # we only use it for the tests. # - value: B # we only use it for the tests.
# - value: C # please see above for the new format. # - value: C # please see above for the new format.
# - value: "D like deprecated" # - value: "D like deprecated"
# weight: 999 # weight: 999
# - value: E # - value: E
# boolean_field: # boolean_field:
# type: boolean # type: boolean
# label: Yes Or No? # label: Yes Or No?

21
pyproject.toml Normal file
View File

@ -0,0 +1,21 @@
[tool.black]
line-length = 100
target-version = ['py38']
include = '\.pyi?$'
exclude = '''
(
/(
\.eggs # exclude a few common directories in the
| \.git # root of the project
| \.venv
| \.netbox
| \.vscode
| configuration
)/
)
'''
[tool.isort]
profile = "black"
multi_line_output = 3

View File

@ -4,20 +4,21 @@ from django.contrib.auth.models import User
from startup_script_utils import load_yaml, set_permissions from startup_script_utils import load_yaml, set_permissions
from users.models import Token from users.models import Token
users = load_yaml('/opt/netbox/initializers/users.yml') users = load_yaml("/opt/netbox/initializers/users.yml")
if users is None: if users is None:
sys.exit() sys.exit()
for username, user_details in users.items(): for username, user_details in users.items():
if not User.objects.filter(username=username): if not User.objects.filter(username=username):
user = User.objects.create_user( user = User.objects.create_user(
username = username, username=username,
password = user_details.get('password', 0) or User.objects.make_random_password()) password=user_details.get("password", 0) or User.objects.make_random_password(),
)
print("👤 Created user",username) print("👤 Created user", username)
if user_details.get('api_token', 0): if user_details.get("api_token", 0):
Token.objects.create(user=user, key=user_details['api_token']) Token.objects.create(user=user, key=user_details["api_token"])
yaml_permissions = user_details.get('permissions', []) yaml_permissions = user_details.get("permissions", [])
set_permissions(user.user_permissions, yaml_permissions) set_permissions(user.user_permissions, yaml_permissions)

View File

@ -3,21 +3,21 @@ import sys
from django.contrib.auth.models import Group, User from django.contrib.auth.models import Group, User
from startup_script_utils import load_yaml, set_permissions from startup_script_utils import load_yaml, set_permissions
groups = load_yaml('/opt/netbox/initializers/groups.yml') groups = load_yaml("/opt/netbox/initializers/groups.yml")
if groups is None: if groups is None:
sys.exit() sys.exit()
for groupname, group_details in groups.items(): for groupname, group_details in groups.items():
group, created = Group.objects.get_or_create(name=groupname) group, created = Group.objects.get_or_create(name=groupname)
if created: if created:
print("👥 Created group", groupname) print("👥 Created group", groupname)
for username in group_details.get('users', []): for username in group_details.get("users", []):
user = User.objects.get(username=username) user = User.objects.get(username=username)
if user: if user:
user.groups.add(group) user.groups.add(group)
yaml_permissions = group_details.get('permissions', []) yaml_permissions = group_details.get("permissions", [])
set_permissions(group.permissions, yaml_permissions) set_permissions(group.permissions, yaml_permissions)

View File

@ -3,56 +3,62 @@ import sys
from extras.models import CustomField from extras.models import CustomField
from startup_script_utils import load_yaml from startup_script_utils import load_yaml
def get_class_for_class_path(class_path): def get_class_for_class_path(class_path):
import importlib import importlib
from django.contrib.contenttypes.models import ContentType
module_name, class_name = class_path.rsplit(".", 1) from django.contrib.contenttypes.models import ContentType
module = importlib.import_module(module_name)
clazz = getattr(module, class_name)
return ContentType.objects.get_for_model(clazz)
customfields = load_yaml('/opt/netbox/initializers/custom_fields.yml') module_name, class_name = class_path.rsplit(".", 1)
module = importlib.import_module(module_name)
clazz = getattr(module, class_name)
return ContentType.objects.get_for_model(clazz)
customfields = load_yaml("/opt/netbox/initializers/custom_fields.yml")
if customfields is None: if customfields is None:
sys.exit() sys.exit()
for cf_name, cf_details in customfields.items(): for cf_name, cf_details in customfields.items():
custom_field, created = CustomField.objects.get_or_create(name = cf_name) custom_field, created = CustomField.objects.get_or_create(name=cf_name)
if created: if created:
if cf_details.get('default', False): if cf_details.get("default", False):
custom_field.default = cf_details['default'] custom_field.default = cf_details["default"]
if cf_details.get('description', False): if cf_details.get("description", False):
custom_field.description = cf_details['description'] custom_field.description = cf_details["description"]
if cf_details.get('label', False): if cf_details.get("label", False):
custom_field.label = cf_details['label'] custom_field.label = cf_details["label"]
for object_type in cf_details.get('on_objects', []): for object_type in cf_details.get("on_objects", []):
custom_field.content_types.add(get_class_for_class_path(object_type)) custom_field.content_types.add(get_class_for_class_path(object_type))
if cf_details.get('required', False): if cf_details.get("required", False):
custom_field.required = cf_details['required'] custom_field.required = cf_details["required"]
if cf_details.get('type', False): if cf_details.get("type", False):
custom_field.type = cf_details['type'] custom_field.type = cf_details["type"]
if cf_details.get('weight', -1) >= 0: if cf_details.get("weight", -1) >= 0:
custom_field.weight = cf_details['weight'] custom_field.weight = cf_details["weight"]
if cf_details.get('choices', False): if cf_details.get("choices", False):
custom_field.choices = [] custom_field.choices = []
for choice_detail in cf_details.get('choices', []): for choice_detail in cf_details.get("choices", []):
if isinstance(choice_detail, dict) and 'value' in choice_detail: if isinstance(choice_detail, dict) and "value" in choice_detail:
# legacy mode # legacy mode
print(f"⚠️ Please migrate the choice '{choice_detail['value']}' of '{cf_name}' to the new format, as 'weight' is no longer supported!") print(
custom_field.choices.append(choice_detail['value']) f"⚠️ Please migrate the choice '{choice_detail['value']}' of '{cf_name}'"
else: + " to the new format, as 'weight' is no longer supported!"
custom_field.choices.append(choice_detail) )
custom_field.choices.append(choice_detail["value"])
else:
custom_field.choices.append(choice_detail)
custom_field.save() custom_field.save()
print("🔧 Created custom field", cf_name) print("🔧 Created custom field", cf_name)

View File

@ -1,23 +1,23 @@
from extras.models import Tag
from utilities.choices import ColorChoices
from startup_script_utils import load_yaml
import sys import sys
tags = load_yaml('/opt/netbox/initializers/tags.yml') from extras.models import Tag
from startup_script_utils import load_yaml
from utilities.choices import ColorChoices
tags = load_yaml("/opt/netbox/initializers/tags.yml")
if tags is None: if tags is None:
sys.exit() sys.exit()
for params in tags: for params in tags:
if 'color' in params: if "color" in params:
color = params.pop('color') color = params.pop("color")
for color_tpl in ColorChoices: for color_tpl in ColorChoices:
if color in color_tpl: if color in color_tpl:
params['color'] = color_tpl[0] params["color"] = color_tpl[0]
tag, created = Tag.objects.get_or_create(**params) tag, created = Tag.objects.get_or_create(**params)
if created: if created:
print("🎨 Created Tag", tag.name) print("🎨 Created Tag", tag.name)

View File

@ -1,26 +1,25 @@
from dcim.models import Region
from startup_script_utils import load_yaml
import sys import sys
regions = load_yaml('/opt/netbox/initializers/regions.yml') from dcim.models import Region
from startup_script_utils import load_yaml
regions = load_yaml("/opt/netbox/initializers/regions.yml")
if regions is None: if regions is None:
sys.exit() sys.exit()
optional_assocs = { optional_assocs = {"parent": (Region, "name")}
'parent': (Region, 'name')
}
for params in regions: for params in regions:
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
region, created = Region.objects.get_or_create(**params) region, created = Region.objects.get_or_create(**params)
if created: if created:
print("🌐 Created region", region.name) print("🌐 Created region", region.name)

View File

@ -1,32 +1,29 @@
import sys import sys
from dcim.models import Region, Site from dcim.models import Region, Site
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant from tenancy.models import Tenant
sites = load_yaml('/opt/netbox/initializers/sites.yml') sites = load_yaml("/opt/netbox/initializers/sites.yml")
if sites is None: if sites is None:
sys.exit() sys.exit()
optional_assocs = { optional_assocs = {"region": (Region, "name"), "tenant": (Tenant, "name")}
'region': (Region, 'name'),
'tenant': (Tenant, 'name')
}
for params in sites: for params in sites:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
site, created = Site.objects.get_or_create(**params) site, created = Site.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(site, custom_field_data) set_custom_fields_values(site, custom_field_data)
print("📍 Created site", site.name) print("📍 Created site", site.name)

View File

@ -1,14 +1,15 @@
from dcim.models import Manufacturer
from startup_script_utils import load_yaml
import sys import sys
manufacturers = load_yaml('/opt/netbox/initializers/manufacturers.yml') from dcim.models import Manufacturer
from startup_script_utils import load_yaml
manufacturers = load_yaml("/opt/netbox/initializers/manufacturers.yml")
if manufacturers is None: if manufacturers is None:
sys.exit() sys.exit()
for params in manufacturers: for params in manufacturers:
manufacturer, created = Manufacturer.objects.get_or_create(**params) manufacturer, created = Manufacturer.objects.get_or_create(**params)
if created: if created:
print("🏭 Created Manufacturer", manufacturer.name) print("🏭 Created Manufacturer", manufacturer.name)

View File

@ -1,42 +1,37 @@
import sys import sys
from dcim.models import DeviceType, Manufacturer, Region from dcim.models import DeviceType, Manufacturer, Region
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant from tenancy.models import Tenant
device_types = load_yaml('/opt/netbox/initializers/device_types.yml') device_types = load_yaml("/opt/netbox/initializers/device_types.yml")
if device_types is None: if device_types is None:
sys.exit() sys.exit()
required_assocs = { required_assocs = {"manufacturer": (Manufacturer, "name")}
'manufacturer': (Manufacturer, 'name')
}
optional_assocs = { optional_assocs = {"region": (Region, "name"), "tenant": (Tenant, "name")}
'region': (Region, 'name'),
'tenant': (Tenant, 'name')
}
for params in device_types: for params in device_types:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
device_type, created = DeviceType.objects.get_or_create(**params) device_type, created = DeviceType.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(device_type, custom_field_data) set_custom_fields_values(device_type, custom_field_data)
print("🔡 Created device type", device_type.manufacturer, device_type.model) print("🔡 Created device type", device_type.manufacturer, device_type.model)

View File

@ -1,23 +1,23 @@
from dcim.models import RackRole
from utilities.choices import ColorChoices
from startup_script_utils import load_yaml
import sys import sys
rack_roles = load_yaml('/opt/netbox/initializers/rack_roles.yml') from dcim.models import RackRole
from startup_script_utils import load_yaml
from utilities.choices import ColorChoices
rack_roles = load_yaml("/opt/netbox/initializers/rack_roles.yml")
if rack_roles is None: if rack_roles is None:
sys.exit() sys.exit()
for params in rack_roles: for params in rack_roles:
if 'color' in params: if "color" in params:
color = params.pop('color') color = params.pop("color")
for color_tpl in ColorChoices: for color_tpl in ColorChoices:
if color in color_tpl: if color in color_tpl:
params['color'] = color_tpl[0] params["color"] = color_tpl[0]
rack_role, created = RackRole.objects.get_or_create(**params) rack_role, created = RackRole.objects.get_or_create(**params)
if created: if created:
print("🎨 Created rack role", rack_role.name) print("🎨 Created rack role", rack_role.name)

View File

@ -1,25 +1,23 @@
from dcim.models import Site,RackGroup
from startup_script_utils import load_yaml
import sys import sys
rack_groups = load_yaml('/opt/netbox/initializers/rack_groups.yml') from dcim.models import RackGroup, Site
from startup_script_utils import load_yaml
rack_groups = load_yaml("/opt/netbox/initializers/rack_groups.yml")
if rack_groups is None: if rack_groups is None:
sys.exit() sys.exit()
required_assocs = { required_assocs = {"site": (Site, "name")}
'site': (Site, 'name')
}
for params in rack_groups: for params in rack_groups:
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
rack_group, created = RackGroup.objects.get_or_create(**params) rack_group, created = RackGroup.objects.get_or_create(**params)
if created:
print("🎨 Created rack group", rack_group.name)
if created:
print("🎨 Created rack group", rack_group.name)

View File

@ -1,43 +1,41 @@
import sys import sys
from dcim.models import Site, RackRole, Rack, RackGroup from dcim.models import Rack, RackGroup, RackRole, Site
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant from tenancy.models import Tenant
racks = load_yaml('/opt/netbox/initializers/racks.yml') racks = load_yaml("/opt/netbox/initializers/racks.yml")
if racks is None: if racks is None:
sys.exit() sys.exit()
required_assocs = { required_assocs = {"site": (Site, "name")}
'site': (Site, 'name')
}
optional_assocs = { optional_assocs = {
'role': (RackRole, 'name'), "role": (RackRole, "name"),
'tenant': (Tenant, 'name'), "tenant": (Tenant, "name"),
'group': (RackGroup, 'name') "group": (RackGroup, "name"),
} }
for params in racks: for params in racks:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
rack, created = Rack.objects.get_or_create(**params) rack, created = Rack.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(rack, custom_field_data) set_custom_fields_values(rack, custom_field_data)
print("🔳 Created rack", rack.site, rack.name) print("🔳 Created rack", rack.site, rack.name)

View File

@ -1,24 +1,24 @@
from dcim.models import DeviceRole
from utilities.choices import ColorChoices
from startup_script_utils import load_yaml
import sys import sys
device_roles = load_yaml('/opt/netbox/initializers/device_roles.yml') from dcim.models import DeviceRole
from startup_script_utils import load_yaml
from utilities.choices import ColorChoices
device_roles = load_yaml("/opt/netbox/initializers/device_roles.yml")
if device_roles is None: if device_roles is None:
sys.exit() sys.exit()
for params in device_roles: for params in device_roles:
if 'color' in params: if "color" in params:
color = params.pop('color') color = params.pop("color")
for color_tpl in ColorChoices: for color_tpl in ColorChoices:
if color in color_tpl: if color in color_tpl:
params['color'] = color_tpl[0] params["color"] = color_tpl[0]
device_role, created = DeviceRole.objects.get_or_create(**params) device_role, created = DeviceRole.objects.get_or_create(**params)
if created: if created:
print("🎨 Created device role", device_role.name) print("🎨 Created device role", device_role.name)

View File

@ -1,26 +1,27 @@
from dcim.models import Manufacturer, Platform
from startup_script_utils import load_yaml
import sys import sys
platforms = load_yaml('/opt/netbox/initializers/platforms.yml') from dcim.models import Manufacturer, Platform
from startup_script_utils import load_yaml
platforms = load_yaml("/opt/netbox/initializers/platforms.yml")
if platforms is None: if platforms is None:
sys.exit() sys.exit()
optional_assocs = { optional_assocs = {
'manufacturer': (Manufacturer, 'name'), "manufacturer": (Manufacturer, "name"),
} }
for params in platforms: for params in platforms:
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
platform, created = Platform.objects.get_or_create(**params) platform, created = Platform.objects.get_or_create(**params)
if created: if created:
print("💾 Created platform", platform.name) print("💾 Created platform", platform.name)

View File

@ -1,14 +1,15 @@
from tenancy.models import TenantGroup
from startup_script_utils import load_yaml
import sys import sys
tenant_groups = load_yaml('/opt/netbox/initializers/tenant_groups.yml') from startup_script_utils import load_yaml
from tenancy.models import TenantGroup
tenant_groups = load_yaml("/opt/netbox/initializers/tenant_groups.yml")
if tenant_groups is None: if tenant_groups is None:
sys.exit() sys.exit()
for params in tenant_groups: for params in tenant_groups:
tenant_group, created = TenantGroup.objects.get_or_create(**params) tenant_group, created = TenantGroup.objects.get_or_create(**params)
if created: if created:
print("🔳 Created Tenant Group", tenant_group.name) print("🔳 Created Tenant Group", tenant_group.name)

View File

@ -1,30 +1,28 @@
import sys import sys
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant, TenantGroup from tenancy.models import Tenant, TenantGroup
tenants = load_yaml('/opt/netbox/initializers/tenants.yml') tenants = load_yaml("/opt/netbox/initializers/tenants.yml")
if tenants is None: if tenants is None:
sys.exit() sys.exit()
optional_assocs = { optional_assocs = {"group": (TenantGroup, "name")}
'group': (TenantGroup, 'name')
}
for params in tenants: for params in tenants:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
tenant, created = Tenant.objects.get_or_create(**params) tenant, created = Tenant.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(tenant, custom_field_data) set_custom_fields_values(tenant, custom_field_data)
print("👩‍💻 Created Tenant", tenant.name) print("👩‍💻 Created Tenant", tenant.name)

View File

@ -1,14 +1,15 @@
from virtualization.models import ClusterType
from startup_script_utils import load_yaml
import sys import sys
cluster_types = load_yaml('/opt/netbox/initializers/cluster_types.yml') from startup_script_utils import load_yaml
from virtualization.models import ClusterType
cluster_types = load_yaml("/opt/netbox/initializers/cluster_types.yml")
if cluster_types is None: if cluster_types is None:
sys.exit() sys.exit()
for params in cluster_types: for params in cluster_types:
cluster_type, created = ClusterType.objects.get_or_create(**params) cluster_type, created = ClusterType.objects.get_or_create(**params)
if created: if created:
print("🧰 Created Cluster Type", cluster_type.name) print("🧰 Created Cluster Type", cluster_type.name)

View File

@ -1,14 +1,15 @@
from virtualization.models import ClusterGroup
from startup_script_utils import load_yaml
import sys import sys
cluster_groups = load_yaml('/opt/netbox/initializers/cluster_groups.yml') from startup_script_utils import load_yaml
from virtualization.models import ClusterGroup
cluster_groups = load_yaml("/opt/netbox/initializers/cluster_groups.yml")
if cluster_groups is None: if cluster_groups is None:
sys.exit() sys.exit()
for params in cluster_groups: for params in cluster_groups:
cluster_group, created = ClusterGroup.objects.get_or_create(**params) cluster_group, created = ClusterGroup.objects.get_or_create(**params)
if created: if created:
print("🗄️ Created Cluster Group", cluster_group.name) print("🗄️ Created Cluster Group", cluster_group.name)

View File

@ -1,44 +1,42 @@
import sys import sys
from dcim.models import Site from dcim.models import Site
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from virtualization.models import Cluster, ClusterType, ClusterGroup
from tenancy.models import Tenant from tenancy.models import Tenant
from virtualization.models import Cluster, ClusterGroup, ClusterType
clusters = load_yaml('/opt/netbox/initializers/clusters.yml') clusters = load_yaml("/opt/netbox/initializers/clusters.yml")
if clusters is None: if clusters is None:
sys.exit() sys.exit()
required_assocs = { required_assocs = {"type": (ClusterType, "name")}
'type': (ClusterType, 'name')
}
optional_assocs = { optional_assocs = {
'site': (Site, 'name'), "site": (Site, "name"),
'group': (ClusterGroup, 'name'), "group": (ClusterGroup, "name"),
'tenant': (Tenant, 'name') "tenant": (Tenant, "name"),
} }
for params in clusters: for params in clusters:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
cluster, created = Cluster.objects.get_or_create(**params) cluster, created = Cluster.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(cluster, custom_field_data) set_custom_fields_values(cluster, custom_field_data)
print("🗄️ Created cluster", cluster.name) print("🗄️ Created cluster", cluster.name)

View File

@ -1,44 +1,42 @@
import sys import sys
from dcim.models import Site from dcim.models import Site
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from virtualization.models import Cluster, ClusterType, ClusterGroup
from tenancy.models import Tenant from tenancy.models import Tenant
from virtualization.models import Cluster, ClusterGroup, ClusterType
clusters = load_yaml('/opt/netbox/initializers/clusters.yml') clusters = load_yaml("/opt/netbox/initializers/clusters.yml")
if clusters is None: if clusters is None:
sys.exit() sys.exit()
required_assocs = { required_assocs = {"type": (ClusterType, "name")}
'type': (ClusterType, 'name')
}
optional_assocs = { optional_assocs = {
'site': (Site, 'name'), "site": (Site, "name"),
'group': (ClusterGroup, 'name'), "group": (ClusterGroup, "name"),
'tenant': (Tenant, 'name') "tenant": (Tenant, "name"),
} }
for params in clusters: for params in clusters:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
cluster, created = Cluster.objects.get_or_create(**params) cluster, created = Cluster.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(cluster, custom_field_data) set_custom_fields_values(cluster, custom_field_data)
print("🗄️ Created cluster", cluster.name) print("🗄️ Created cluster", cluster.name)

View File

@ -1,51 +1,51 @@
import sys import sys
from dcim.models import Site, Rack, DeviceRole, DeviceType, Device, Platform from dcim.models import Device, DeviceRole, DeviceType, Platform, Rack, Site
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant from tenancy.models import Tenant
from virtualization.models import Cluster from virtualization.models import Cluster
devices = load_yaml('/opt/netbox/initializers/devices.yml') devices = load_yaml("/opt/netbox/initializers/devices.yml")
if devices is None: if devices is None:
sys.exit() sys.exit()
required_assocs = { required_assocs = {
'device_role': (DeviceRole, 'name'), "device_role": (DeviceRole, "name"),
'device_type': (DeviceType, 'model'), "device_type": (DeviceType, "model"),
'site': (Site, 'name') "site": (Site, "name"),
} }
optional_assocs = { optional_assocs = {
'tenant': (Tenant, 'name'), "tenant": (Tenant, "name"),
'platform': (Platform, 'name'), "platform": (Platform, "name"),
'rack': (Rack, 'name'), "rack": (Rack, "name"),
'cluster': (Cluster, 'name') "cluster": (Cluster, "name"),
} }
for params in devices: for params in devices:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
# primary ips are handled later in `270_primary_ips.py` # primary ips are handled later in `270_primary_ips.py`
params.pop('primary_ip4', None) params.pop("primary_ip4", None)
params.pop('primary_ip6', None) params.pop("primary_ip6", None)
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
device, created = Device.objects.get_or_create(**params) device, created = Device.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(device, custom_field_data) set_custom_fields_values(device, custom_field_data)
print("🖥️ Created device", device.name) print("🖥️ Created device", device.name)

View File

@ -1,51 +1,51 @@
import sys import sys
from dcim.models import Site, Rack, DeviceRole, DeviceType, Device, Platform from dcim.models import Device, DeviceRole, DeviceType, Platform, Rack, Site
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant from tenancy.models import Tenant
from virtualization.models import Cluster from virtualization.models import Cluster
devices = load_yaml('/opt/netbox/initializers/devices.yml') devices = load_yaml("/opt/netbox/initializers/devices.yml")
if devices is None: if devices is None:
sys.exit() sys.exit()
required_assocs = { required_assocs = {
'device_role': (DeviceRole, 'name'), "device_role": (DeviceRole, "name"),
'device_type': (DeviceType, 'model'), "device_type": (DeviceType, "model"),
'site': (Site, 'name') "site": (Site, "name"),
} }
optional_assocs = { optional_assocs = {
'tenant': (Tenant, 'name'), "tenant": (Tenant, "name"),
'platform': (Platform, 'name'), "platform": (Platform, "name"),
'rack': (Rack, 'name'), "rack": (Rack, "name"),
'cluster': (Cluster, 'name') "cluster": (Cluster, "name"),
} }
for params in devices: for params in devices:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
# primary ips are handled later in `270_primary_ips.py` # primary ips are handled later in `270_primary_ips.py`
params.pop('primary_ip4', None) params.pop("primary_ip4", None)
params.pop('primary_ip6', None) params.pop("primary_ip6", None)
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
device, created = Device.objects.get_or_create(**params) device, created = Device.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(device, custom_field_data) set_custom_fields_values(device, custom_field_data)
print("🖥️ Created device", device.name) print("🖥️ Created device", device.name)

View File

@ -1,14 +1,15 @@
from ipam.models import RIR
from startup_script_utils import load_yaml
import sys import sys
rirs = load_yaml('/opt/netbox/initializers/rirs.yml') from ipam.models import RIR
from startup_script_utils import load_yaml
rirs = load_yaml("/opt/netbox/initializers/rirs.yml")
if rirs is None: if rirs is None:
sys.exit() sys.exit()
for params in rirs: for params in rirs:
rir, created = RIR.objects.get_or_create(**params) rir, created = RIR.objects.get_or_create(**params)
if created: if created:
print("🗺️ Created RIR", rir.name) print("🗺️ Created RIR", rir.name)

View File

@ -1,44 +1,42 @@
import sys import sys
from ipam.models import Aggregate, RIR from ipam.models import RIR, Aggregate
from netaddr import IPNetwork from netaddr import IPNetwork
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant from tenancy.models import Tenant
aggregates = load_yaml('/opt/netbox/initializers/aggregates.yml') aggregates = load_yaml("/opt/netbox/initializers/aggregates.yml")
if aggregates is None: if aggregates is None:
sys.exit() sys.exit()
required_assocs = { required_assocs = {"rir": (RIR, "name")}
'rir': (RIR, 'name')
}
optional_assocs = { optional_assocs = {
'tenant': (Tenant, 'name'), "tenant": (Tenant, "name"),
} }
for params in aggregates: for params in aggregates:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
params['prefix'] = IPNetwork(params['prefix']) params["prefix"] = IPNetwork(params["prefix"])
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
aggregate, created = Aggregate.objects.get_or_create(**params) aggregate, created = Aggregate.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(aggregate, custom_field_data) set_custom_fields_values(aggregate, custom_field_data)
print("🗞️ Created Aggregate", aggregate.prefix) print("🗞️ Created Aggregate", aggregate.prefix)

View File

@ -1,14 +1,15 @@
from virtualization.models import ClusterGroup
from startup_script_utils import load_yaml
import sys import sys
cluster_groups = load_yaml('/opt/netbox/initializers/cluster_groups.yml') from startup_script_utils import load_yaml
from virtualization.models import ClusterGroup
cluster_groups = load_yaml("/opt/netbox/initializers/cluster_groups.yml")
if cluster_groups is None: if cluster_groups is None:
sys.exit() sys.exit()
for params in cluster_groups: for params in cluster_groups:
cluster_group, created = ClusterGroup.objects.get_or_create(**params) cluster_group, created = ClusterGroup.objects.get_or_create(**params)
if created: if created:
print("🗄️ Created Cluster Group", cluster_group.name) print("🗄️ Created Cluster Group", cluster_group.name)

View File

@ -1,31 +1,29 @@
import sys import sys
from ipam.models import RouteTarget from ipam.models import RouteTarget
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant from tenancy.models import Tenant
route_targets = load_yaml('/opt/netbox/initializers/route_targets.yml') route_targets = load_yaml("/opt/netbox/initializers/route_targets.yml")
if route_targets is None: if route_targets is None:
sys.exit() sys.exit()
optional_assocs = { optional_assocs = {"tenant": (Tenant, "name")}
'tenant': (Tenant, 'name')
}
for params in route_targets: for params in route_targets:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
route_target, created = RouteTarget.objects.get_or_create(**params) route_target, created = RouteTarget.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(route_target, custom_field_data) set_custom_fields_values(route_target, custom_field_data)
print("🎯 Created Route Target", route_target.name) print("🎯 Created Route Target", route_target.name)

View File

@ -1,31 +1,29 @@
import sys import sys
from ipam.models import VRF from ipam.models import VRF
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant from tenancy.models import Tenant
vrfs = load_yaml('/opt/netbox/initializers/vrfs.yml') vrfs = load_yaml("/opt/netbox/initializers/vrfs.yml")
if vrfs is None: if vrfs is None:
sys.exit() sys.exit()
optional_assocs = { optional_assocs = {"tenant": (Tenant, "name")}
'tenant': (Tenant, 'name')
}
for params in vrfs: for params in vrfs:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
vrf, created = VRF.objects.get_or_create(**params) vrf, created = VRF.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(vrf, custom_field_data) set_custom_fields_values(vrf, custom_field_data)
print("📦 Created VRF", vrf.name) print("📦 Created VRF", vrf.name)

View File

@ -1,14 +1,15 @@
from ipam.models import Role
from startup_script_utils import load_yaml
import sys import sys
roles = load_yaml('/opt/netbox/initializers/prefix_vlan_roles.yml') from ipam.models import Role
from startup_script_utils import load_yaml
roles = load_yaml("/opt/netbox/initializers/prefix_vlan_roles.yml")
if roles is None: if roles is None:
sys.exit() sys.exit()
for params in roles: for params in roles:
role, created = Role.objects.get_or_create(**params) role, created = Role.objects.get_or_create(**params)
if created: if created:
print("⛹️‍ Created Prefix/VLAN Role", role.name) print("⛹️‍ Created Prefix/VLAN Role", role.name)

View File

@ -2,30 +2,28 @@ import sys
from dcim.models import Site from dcim.models import Site
from ipam.models import VLANGroup from ipam.models import VLANGroup
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
vlan_groups = load_yaml('/opt/netbox/initializers/vlan_groups.yml') vlan_groups = load_yaml("/opt/netbox/initializers/vlan_groups.yml")
if vlan_groups is None: if vlan_groups is None:
sys.exit() sys.exit()
optional_assocs = { optional_assocs = {"site": (Site, "name")}
'site': (Site, 'name')
}
for params in vlan_groups: for params in vlan_groups:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
vlan_group, created = VLANGroup.objects.get_or_create(**params) vlan_group, created = VLANGroup.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(vlan_group, custom_field_data) set_custom_fields_values(vlan_group, custom_field_data)
print("🏘️ Created VLAN Group", vlan_group.name) print("🏘️ Created VLAN Group", vlan_group.name)

View File

@ -1,36 +1,36 @@
import sys import sys
from dcim.models import Site from dcim.models import Site
from ipam.models import VLAN, VLANGroup, Role from ipam.models import VLAN, Role, VLANGroup
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant, TenantGroup from tenancy.models import Tenant, TenantGroup
vlans = load_yaml('/opt/netbox/initializers/vlans.yml') vlans = load_yaml("/opt/netbox/initializers/vlans.yml")
if vlans is None: if vlans is None:
sys.exit() sys.exit()
optional_assocs = { optional_assocs = {
'site': (Site, 'name'), "site": (Site, "name"),
'tenant': (Tenant, 'name'), "tenant": (Tenant, "name"),
'tenant_group': (TenantGroup, 'name'), "tenant_group": (TenantGroup, "name"),
'group': (VLANGroup, 'name'), "group": (VLANGroup, "name"),
'role': (Role, 'name') "role": (Role, "name"),
} }
for params in vlans: for params in vlans:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
vlan, created = VLAN.objects.get_or_create(**params) vlan, created = VLAN.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(vlan, custom_field_data) set_custom_fields_values(vlan, custom_field_data)
print("🏠 Created VLAN", vlan.name) print("🏠 Created VLAN", vlan.name)

View File

@ -1,39 +1,39 @@
import sys import sys
from dcim.models import Site from dcim.models import Site
from ipam.models import Prefix, VLAN, Role, VRF from ipam.models import VLAN, VRF, Prefix, Role
from netaddr import IPNetwork from netaddr import IPNetwork
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant, TenantGroup from tenancy.models import Tenant, TenantGroup
prefixes = load_yaml('/opt/netbox/initializers/prefixes.yml') prefixes = load_yaml("/opt/netbox/initializers/prefixes.yml")
if prefixes is None: if prefixes is None:
sys.exit() sys.exit()
optional_assocs = { optional_assocs = {
'site': (Site, 'name'), "site": (Site, "name"),
'tenant': (Tenant, 'name'), "tenant": (Tenant, "name"),
'tenant_group': (TenantGroup, 'name'), "tenant_group": (TenantGroup, "name"),
'vlan': (VLAN, 'name'), "vlan": (VLAN, "name"),
'role': (Role, 'name'), "role": (Role, "name"),
'vrf': (VRF, 'name') "vrf": (VRF, "name"),
} }
for params in prefixes: for params in prefixes:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
params['prefix'] = IPNetwork(params['prefix']) params["prefix"] = IPNetwork(params["prefix"])
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
prefix, created = Prefix.objects.get_or_create(**params) prefix, created = Prefix.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(prefix, custom_field_data) set_custom_fields_values(prefix, custom_field_data)
print("📌 Created Prefix", prefix.prefix) print("📌 Created Prefix", prefix.prefix)

View File

@ -1,48 +1,46 @@
import sys import sys
from dcim.models import Platform, DeviceRole from dcim.models import DeviceRole, Platform
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant from tenancy.models import Tenant
from virtualization.models import Cluster, VirtualMachine from virtualization.models import Cluster, VirtualMachine
virtual_machines = load_yaml('/opt/netbox/initializers/virtual_machines.yml') virtual_machines = load_yaml("/opt/netbox/initializers/virtual_machines.yml")
if virtual_machines is None: if virtual_machines is None:
sys.exit() sys.exit()
required_assocs = { required_assocs = {"cluster": (Cluster, "name")}
'cluster': (Cluster, 'name')
}
optional_assocs = { optional_assocs = {
'tenant': (Tenant, 'name'), "tenant": (Tenant, "name"),
'platform': (Platform, 'name'), "platform": (Platform, "name"),
'role': (DeviceRole, 'name') "role": (DeviceRole, "name"),
} }
for params in virtual_machines: for params in virtual_machines:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
# primary ips are handled later in `270_primary_ips.py` # primary ips are handled later in `270_primary_ips.py`
params.pop('primary_ip4', None) params.pop("primary_ip4", None)
params.pop('primary_ip6', None) params.pop("primary_ip6", None)
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
virtual_machine, created = VirtualMachine.objects.get_or_create(**params) virtual_machine, created = VirtualMachine.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(virtual_machine, custom_field_data) set_custom_fields_values(virtual_machine, custom_field_data)
print("🖥️ Created virtual machine", virtual_machine.name) print("🖥️ Created virtual machine", virtual_machine.name)

View File

@ -1,29 +1,27 @@
import sys import sys
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from virtualization.models import VirtualMachine, VMInterface from virtualization.models import VirtualMachine, VMInterface
interfaces = load_yaml('/opt/netbox/initializers/virtualization_interfaces.yml') interfaces = load_yaml("/opt/netbox/initializers/virtualization_interfaces.yml")
if interfaces is None: if interfaces is None:
sys.exit() sys.exit()
required_assocs = { required_assocs = {"virtual_machine": (VirtualMachine, "name")}
'virtual_machine': (VirtualMachine, 'name')
}
for params in interfaces: for params in interfaces:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
interface, created = VMInterface.objects.get_or_create(**params) interface, created = VMInterface.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(interface, custom_field_data) set_custom_fields_values(interface, custom_field_data)
print("🧷 Created interface", interface.name, interface.virtual_machine.name) print("🧷 Created interface", interface.name, interface.virtual_machine.name)

View File

@ -1,29 +1,27 @@
import sys import sys
from dcim.models import Interface, Device from dcim.models import Device, Interface
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
interfaces = load_yaml('/opt/netbox/initializers/dcim_interfaces.yml') interfaces = load_yaml("/opt/netbox/initializers/dcim_interfaces.yml")
if interfaces is None: if interfaces is None:
sys.exit() sys.exit()
required_assocs = { required_assocs = {"device": (Device, "name")}
'device': (Device, 'name')
}
for params in interfaces: for params in interfaces:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
interface, created = Interface.objects.get_or_create(**params) interface, created = Interface.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(interface, custom_field_data) set_custom_fields_values(interface, custom_field_data)
print("🧷 Created interface", interface.name, interface.device.name) print("🧷 Created interface", interface.name, interface.device.name)

View File

@ -5,56 +5,58 @@ from django.contrib.contenttypes.models import ContentType
from django.db.models import Q from django.db.models import Q
from ipam.models import VRF, IPAddress from ipam.models import VRF, IPAddress
from netaddr import IPNetwork from netaddr import IPNetwork
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant from tenancy.models import Tenant
from virtualization.models import VirtualMachine, VMInterface from virtualization.models import VirtualMachine, VMInterface
ip_addresses = load_yaml('/opt/netbox/initializers/ip_addresses.yml') ip_addresses = load_yaml("/opt/netbox/initializers/ip_addresses.yml")
if ip_addresses is None: if ip_addresses is None:
sys.exit()
optional_assocs = {
'tenant': (Tenant, 'name'),
'vrf': (VRF, 'name'),
'interface': (None, None)
}
vm_interface_ct = ContentType.objects.filter(Q(app_label='virtualization', model='vminterface')).first()
interface_ct = ContentType.objects.filter(Q(app_label='dcim', model='interface')).first()
for params in ip_addresses:
custom_field_data = pop_custom_fields(params)
vm = params.pop('virtual_machine', None)
device = params.pop('device', None)
params['address'] = IPNetwork(params['address'])
if vm and device:
print("IP Address can only specify one of the following: virtual_machine or device.")
sys.exit() sys.exit()
for assoc, details in optional_assocs.items(): optional_assocs = {
if assoc in params: "tenant": (Tenant, "name"),
model, field = details "vrf": (VRF, "name"),
if assoc == 'interface': "interface": (None, None),
if vm: }
vm_id = VirtualMachine.objects.get(name=vm).id
query = { 'name': params.pop(assoc), "virtual_machine_id": vm_id }
params['assigned_object_type'] = vm_interface_ct
params['assigned_object_id'] = VMInterface.objects.get(**query).id
elif device:
dev_id = Device.objects.get(name=device).id
query = { 'name': params.pop(assoc), "device_id": dev_id }
params['assigned_object_type'] = interface_ct
params['assigned_object_id'] = Interface.objects.get(**query).id
else:
query = { field: params.pop(assoc) }
params[assoc] = model.objects.get(**query)
ip_address, created = IPAddress.objects.get_or_create(**params) vm_interface_ct = ContentType.objects.filter(
Q(app_label="virtualization", model="vminterface")
).first()
interface_ct = ContentType.objects.filter(Q(app_label="dcim", model="interface")).first()
if created: for params in ip_addresses:
set_custom_fields_values(ip_address, custom_field_data) custom_field_data = pop_custom_fields(params)
print("🧬 Created IP Address", ip_address.address) vm = params.pop("virtual_machine", None)
device = params.pop("device", None)
params["address"] = IPNetwork(params["address"])
if vm and device:
print("IP Address can only specify one of the following: virtual_machine or device.")
sys.exit()
for assoc, details in optional_assocs.items():
if assoc in params:
model, field = details
if assoc == "interface":
if vm:
vm_id = VirtualMachine.objects.get(name=vm).id
query = {"name": params.pop(assoc), "virtual_machine_id": vm_id}
params["assigned_object_type"] = vm_interface_ct
params["assigned_object_id"] = VMInterface.objects.get(**query).id
elif device:
dev_id = Device.objects.get(name=device).id
query = {"name": params.pop(assoc), "device_id": dev_id}
params["assigned_object_type"] = interface_ct
params["assigned_object_id"] = Interface.objects.get(**query).id
else:
query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query)
ip_address, created = IPAddress.objects.get_or_create(**params)
if created:
set_custom_fields_values(ip_address, custom_field_data)
print("🧬 Created IP Address", ip_address.address)

View File

@ -1,44 +1,47 @@
from dcim.models import Device
from ipam.models import IPAddress
from virtualization.models import VirtualMachine
from startup_script_utils import load_yaml
import sys import sys
from dcim.models import Device
from ipam.models import IPAddress
from startup_script_utils import load_yaml
from virtualization.models import VirtualMachine
def link_primary_ip(assets, asset_model): def link_primary_ip(assets, asset_model):
for params in assets: for params in assets:
primary_ip_fields = set(params) & {'primary_ip4', 'primary_ip6'} primary_ip_fields = set(params) & {"primary_ip4", "primary_ip6"}
if not primary_ip_fields: if not primary_ip_fields:
continue continue
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
try: try:
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
except model.DoesNotExist: except model.DoesNotExist:
primary_ip_fields -= {assoc} primary_ip_fields -= {assoc}
print(f"⚠️ IP Address '{query[field]}' not found") print(f"⚠️ IP Address '{query[field]}' not found")
asset = asset_model.objects.get(name=params['name']) asset = asset_model.objects.get(name=params["name"])
for field in primary_ip_fields: for field in primary_ip_fields:
if getattr(asset, field) != params[field]: if getattr(asset, field) != params[field]:
setattr(asset, field, params[field]) setattr(asset, field, params[field])
print(f"🔗 Define primary IP '{params[field].address}' on '{asset.name}'") print(f"🔗 Define primary IP '{params[field].address}' on '{asset.name}'")
asset.save() asset.save()
devices = load_yaml('/opt/netbox/initializers/devices.yml')
virtual_machines = load_yaml('/opt/netbox/initializers/virtual_machines.yml') devices = load_yaml("/opt/netbox/initializers/devices.yml")
virtual_machines = load_yaml("/opt/netbox/initializers/virtual_machines.yml")
optional_assocs = { optional_assocs = {
'primary_ip4': (IPAddress, 'address'), "primary_ip4": (IPAddress, "address"),
'primary_ip6': (IPAddress, 'address') "primary_ip6": (IPAddress, "address"),
} }
if devices is None and virtual_machines is None: if devices is None and virtual_machines is None:
sys.exit() sys.exit()
if devices is not None: if devices is not None:
link_primary_ip(devices, Device) link_primary_ip(devices, Device)
if virtual_machines is not None: if virtual_machines is not None:
link_primary_ip(virtual_machines, VirtualMachine) link_primary_ip(virtual_machines, VirtualMachine)

View File

@ -1,29 +1,33 @@
import sys
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from extras.models import CustomLink from extras.models import CustomLink
from startup_script_utils import load_yaml from startup_script_utils import load_yaml
import sys
custom_links = load_yaml("/opt/netbox/initializers/custom_links.yml")
custom_links = load_yaml('/opt/netbox/initializers/custom_links.yml')
if custom_links is None: if custom_links is None:
sys.exit() sys.exit()
def get_content_type_id(content_type): def get_content_type_id(content_type):
try: try:
return ContentType.objects.get(model=content_type).id return ContentType.objects.get(model=content_type).id
except ContentType.DoesNotExist: except ContentType.DoesNotExist:
pass pass
for link in custom_links: for link in custom_links:
content_type = link.pop('content_type') content_type = link.pop("content_type")
link['content_type_id'] = get_content_type_id(content_type) link["content_type_id"] = get_content_type_id(content_type)
if link['content_type_id'] is None: if link["content_type_id"] is None:
print("⚠️ Unable to create Custom Link '{0}': The content_type '{1}' is unknown".format(link.name, content_type)) print(
continue "⚠️ Unable to create Custom Link '{0}': The content_type '{1}' is unknown".format(
link.name, content_type
)
)
continue
custom_link, created = CustomLink.objects.get_or_create(**link) custom_link, created = CustomLink.objects.get_or_create(**link)
if created: if created:
print("🔗 Created Custom Link '{0}'".format(custom_link.name)) print("🔗 Created Custom Link '{0}'".format(custom_link.name))

View File

@ -1,18 +1,19 @@
from circuits.models import Provider
from startup_script_utils import *
import sys import sys
providers = load_yaml('/opt/netbox/initializers/providers.yml') from circuits.models import Provider
from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
providers = load_yaml("/opt/netbox/initializers/providers.yml")
if providers is None: if providers is None:
sys.exit() sys.exit()
for params in providers: for params in providers:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
provider, created = Provider.objects.get_or_create(**params) provider, created = Provider.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(provider, custom_field_data) set_custom_fields_values(provider, custom_field_data)
print("📡 Created provider", provider.name) print("📡 Created provider", provider.name)

View File

@ -1,18 +1,19 @@
from circuits.models import CircuitType
from startup_script_utils import *
import sys import sys
circuit_types = load_yaml('/opt/netbox/initializers/circuit_types.yml') from circuits.models import CircuitType
from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
circuit_types = load_yaml("/opt/netbox/initializers/circuit_types.yml")
if circuit_types is None: if circuit_types is None:
sys.exit() sys.exit()
for params in circuit_types: for params in circuit_types:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
circuit_type, created = CircuitType.objects.get_or_create(**params) circuit_type, created = CircuitType.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(circuit_type, custom_field_data) set_custom_fields_values(circuit_type, custom_field_data)
print("⚡ Created Circuit Type", circuit_type.name) print("⚡ Created Circuit Type", circuit_type.name)

View File

@ -1,34 +1,34 @@
import sys
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from extras.models import Webhook from extras.models import Webhook
from startup_script_utils import load_yaml from startup_script_utils import load_yaml
import sys
webhooks = load_yaml("/opt/netbox/initializers/webhooks.yml")
webhooks = load_yaml('/opt/netbox/initializers/webhooks.yml')
if webhooks is None: if webhooks is None:
sys.exit() sys.exit()
def get_content_type_id(hook_name, content_type): def get_content_type_id(hook_name, content_type):
try: try:
return ContentType.objects.get(model=content_type).id return ContentType.objects.get(model=content_type).id
except ContentType.DoesNotExist as ex: except ContentType.DoesNotExist as ex:
print("⚠️ Webhook '{0}': The object_type '{1}' is unknown.".format(hook_name, content_type)) print("⚠️ Webhook '{0}': The object_type '{1}' is unknown.".format(hook_name, content_type))
raise ex raise ex
for hook in webhooks: for hook in webhooks:
obj_types = hook.pop('object_types') obj_types = hook.pop("object_types")
try: try:
obj_type_ids = [get_content_type_id(hook['name'], obj) for obj in obj_types] obj_type_ids = [get_content_type_id(hook["name"], obj) for obj in obj_types]
except ContentType.DoesNotExist: except ContentType.DoesNotExist:
continue continue
webhook, created = Webhook.objects.get_or_create(**hook) webhook, created = Webhook.objects.get_or_create(**hook)
if created: if created:
webhook.content_types.set(obj_type_ids) webhook.content_types.set(obj_type_ids)
webhook.save() webhook.save()
print("🪝 Created Webhook {0}".format(webhook.name)) print("🪝 Created Webhook {0}".format(webhook.name))

View File

@ -1,41 +1,37 @@
from circuits.models import Circuit, Provider, CircuitType
from tenancy.models import Tenant
from startup_script_utils import *
import sys import sys
circuits = load_yaml('/opt/netbox/initializers/circuits.yml') from circuits.models import Circuit, CircuitType, Provider
from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant
circuits = load_yaml("/opt/netbox/initializers/circuits.yml")
if circuits is None: if circuits is None:
sys.exit() sys.exit()
required_assocs = { required_assocs = {"provider": (Provider, "name"), "type": (CircuitType, "name")}
'provider': (Provider, 'name'),
'type': (CircuitType, 'name')
}
optional_assocs = { optional_assocs = {"tenant": (Tenant, "name")}
'tenant': (Tenant, 'name')
}
for params in circuits: for params in circuits:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
circuit, created = Circuit.objects.get_or_create(**params) circuit, created = Circuit.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(circuit, custom_field_data) set_custom_fields_values(circuit, custom_field_data)
print("⚡ Created Circuit", circuit.cid) print("⚡ Created Circuit", circuit.cid)

View File

@ -1,14 +1,15 @@
from secrets.models import SecretRole
from startup_script_utils import load_yaml
import sys import sys
from secrets.models import SecretRole
secret_roles = load_yaml('/opt/netbox/initializers/secret_roles.yml') from startup_script_utils import load_yaml
secret_roles = load_yaml("/opt/netbox/initializers/secret_roles.yml")
if secret_roles is None: if secret_roles is None:
sys.exit() sys.exit()
for params in secret_roles: for params in secret_roles:
secret_role, created = SecretRole.objects.get_or_create(**params) secret_role, created = SecretRole.objects.get_or_create(**params)
if created: if created:
print("🔑 Created Secret Role", secret_role.name) print("🔑 Created Secret Role", secret_role.name)

View File

@ -1,29 +1,30 @@
from ipam.models import Service
from dcim.models import Device
from virtualization.models import VirtualMachine
from startup_script_utils import load_yaml
import sys import sys
services = load_yaml('/opt/netbox/initializers/services.yml') from dcim.models import Device
from ipam.models import Service
from startup_script_utils import load_yaml
from virtualization.models import VirtualMachine
services = load_yaml("/opt/netbox/initializers/services.yml")
if services is None: if services is None:
sys.exit() sys.exit()
optional_assocs = { optional_assocs = {
'device': (Device, 'name'), "device": (Device, "name"),
'virtual_machine': (VirtualMachine, 'name') "virtual_machine": (VirtualMachine, "name"),
} }
for params in services: for params in services:
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
service, created = Service.objects.get_or_create(**params) service, created = Service.objects.get_or_create(**params)
if created: if created:
print("🧰 Created Service", service.name) print("🧰 Created Service", service.name)

View File

@ -1,41 +1,36 @@
import sys import sys
from dcim.models import Site, RackGroup, PowerPanel from dcim.models import PowerPanel, RackGroup, Site
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant
power_panels = load_yaml('/opt/netbox/initializers/power_panels.yml') power_panels = load_yaml("/opt/netbox/initializers/power_panels.yml")
if power_panels is None: if power_panels is None:
sys.exit() sys.exit()
required_assocs = { required_assocs = {"site": (Site, "name")}
'site': (Site, 'name')
}
optional_assocs = { optional_assocs = {"rack_group": (RackGroup, "name")}
'rack_group': (RackGroup, 'name')
}
for params in power_panels: for params in power_panels:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
power_panel, created = PowerPanel.objects.get_or_create(**params) power_panel, created = PowerPanel.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(power_panel, custom_field_data) set_custom_fields_values(power_panel, custom_field_data)
print("⚡ Created Power Panel", power_panel.site, power_panel.name) print("⚡ Created Power Panel", power_panel.site, power_panel.name)

View File

@ -1,41 +1,36 @@
import sys import sys
from dcim.models import Rack, PowerPanel, PowerFeed from dcim.models import PowerFeed, PowerPanel, Rack
from startup_script_utils import * from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
from tenancy.models import Tenant
power_feeds = load_yaml('/opt/netbox/initializers/power_feeds.yml') power_feeds = load_yaml("/opt/netbox/initializers/power_feeds.yml")
if power_feeds is None: if power_feeds is None:
sys.exit() sys.exit()
required_assocs = { required_assocs = {"power_panel": (PowerPanel, "name")}
'power_panel': (PowerPanel, 'name')
}
optional_assocs = { optional_assocs = {"rack": (Rack, "name")}
'rack': (Rack, 'name')
}
for params in power_feeds: for params in power_feeds:
custom_field_data = pop_custom_fields(params) custom_field_data = pop_custom_fields(params)
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
for assoc, details in optional_assocs.items(): for assoc, details in optional_assocs.items():
if assoc in params: if assoc in params:
model, field = details model, field = details
query = { field: params.pop(assoc) } query = {field: params.pop(assoc)}
params[assoc] = model.objects.get(**query) params[assoc] = model.objects.get(**query)
power_feed, created = PowerFeed.objects.get_or_create(**params) power_feed, created = PowerFeed.objects.get_or_create(**params)
if created: if created:
set_custom_fields_values(power_feed, custom_field_data) set_custom_fields_values(power_feed, custom_field_data)
print("⚡ Created Power Feed", power_feed.name) print("⚡ Created Power Feed", power_feed.name)

View File

@ -2,28 +2,30 @@
import runpy import runpy
from os import scandir from os import scandir
from os.path import dirname, abspath from os.path import abspath, dirname
this_dir = dirname(abspath(__file__)) this_dir = dirname(abspath(__file__))
def filename(f): def filename(f):
return f.name return f.name
with scandir(this_dir) as it: with scandir(this_dir) as it:
for f in sorted(it, key = filename): for f in sorted(it, key=filename):
if not f.is_file(): if not f.is_file():
continue continue
if f.name.startswith('__'): if f.name.startswith("__"):
continue continue
if not f.name.endswith('.py'): if not f.name.endswith(".py"):
continue continue
print(f"▶️ Running the startup script {f.path}") print(f"▶️ Running the startup script {f.path}")
try: try:
runpy.run_path(f.path) runpy.run_path(f.path)
except SystemExit as e: except SystemExit as e:
if e.code is not None and e.code != 0: if e.code is not None and e.code != 0:
print(f"‼️ The startup script {f.path} returned with code {e.code}, exiting.") print(f"‼️ The startup script {f.path} returned with code {e.code}, exiting.")
raise raise

View File

@ -1,3 +1,3 @@
from .custom_fields import pop_custom_fields, set_custom_fields_values
from .load_yaml import load_yaml from .load_yaml import load_yaml
from .permissions import set_permissions from .permissions import set_permissions
from .custom_fields import set_custom_fields_values, pop_custom_fields

View File

@ -1,15 +1,16 @@
def set_custom_fields_values(entity, custom_field_data): def set_custom_fields_values(entity, custom_field_data):
if not custom_field_data: if not custom_field_data:
return return
entity.custom_field_data = custom_field_data
return entity.save()
entity.custom_field_data = custom_field_data
return entity.save()
def pop_custom_fields(params): def pop_custom_fields(params):
if 'custom_field_data' in params: if "custom_field_data" in params:
return params.pop('custom_field_data') return params.pop("custom_field_data")
elif 'custom_fields' in params: elif "custom_fields" in params:
print("⚠️ Please rename 'custom_fields' to 'custom_field_data'!") print("⚠️ Please rename 'custom_fields' to 'custom_field_data'!")
return params.pop('custom_fields') return params.pop("custom_fields")
return None return None

View File

@ -1,11 +1,12 @@
from pathlib import Path from pathlib import Path
from ruamel.yaml import YAML from ruamel.yaml import YAML
def load_yaml(yaml_file: str): def load_yaml(yaml_file: str):
yf = Path(yaml_file) yf = Path(yaml_file)
if not yf.is_file(): if not yf.is_file():
return None return None
with yf.open("r") as stream: with yf.open("r") as stream:
yaml = YAML(typ="safe") yaml = YAML(typ="safe")
return yaml.load(stream) return yaml.load(stream)

View File

@ -2,17 +2,21 @@ from django.contrib.auth.models import Permission
def set_permissions(subject, permission_filters): def set_permissions(subject, permission_filters):
if subject is None or permission_filters is None: if subject is None or permission_filters is None:
return return
subject.clear() subject.clear()
for permission_filter in permission_filters: for permission_filter in permission_filters:
if "*" in permission_filter: if "*" in permission_filter:
permission_filter_regex = "^" + permission_filter.replace("*", ".*") + "$" permission_filter_regex = "^" + permission_filter.replace("*", ".*") + "$"
permissions = Permission.objects.filter(codename__iregex=permission_filter_regex) permissions = Permission.objects.filter(codename__iregex=permission_filter_regex)
print(" ⚿ Granting", permissions.count(), "permissions matching '" + permission_filter + "'") print(
else: " ⚿ Granting",
permissions = Permission.objects.filter(codename=permission_filter) permissions.count(),
print(" ⚿ Granting permission", permission_filter) "permissions matching '" + permission_filter + "'",
)
else:
permissions = Permission.objects.filter(codename=permission_filter)
print(" ⚿ Granting permission", permission_filter)
for permission in permissions: for permission in permissions:
subject.add(permission) subject.add(permission)