diff --git a/startup_scripts/000_users.py b/startup_scripts/000_users.py new file mode 100644 index 0000000..d8f6b65 --- /dev/null +++ b/startup_scripts/000_users.py @@ -0,0 +1,28 @@ +from django.contrib.auth.models import Permission, Group, User +from users.models import Token + +from ruamel.yaml import YAML + +with open('/opt/netbox/initializers/users.yml', 'r') as stream: + yaml=YAML(typ='safe') + users = yaml.load(stream) + + if users is not None: + for username, user_details in users.items(): + if not User.objects.filter(username=username): + user = User.objects.create_user( + username = username, + password = user_details.get('password', 0) or User.objects.make_random_password) + + print("👤 Created user ",username) + + if user_details.get('api_token', 0): + Token.objects.create(user=user, key=user_details['api_token']) + + user_permissions = user_details.get('permissions', []) + if user_permissions: + user.user_permissions.clear() + for permission_codename in user_details.get('permissions', []): + permission = Permission.objects.get(codename=permission_codename) + user.user_permissions.add(permission) + user.save() diff --git a/startup_scripts/00_users.py b/startup_scripts/00_users.py deleted file mode 100644 index d8f6b65..0000000 --- a/startup_scripts/00_users.py +++ /dev/null @@ -1,28 +0,0 @@ -from django.contrib.auth.models import Permission, Group, User -from users.models import Token - -from ruamel.yaml import YAML - -with open('/opt/netbox/initializers/users.yml', 'r') as stream: - yaml=YAML(typ='safe') - users = yaml.load(stream) - - if users is not None: - for username, user_details in users.items(): - if not User.objects.filter(username=username): - user = User.objects.create_user( - username = username, - password = user_details.get('password', 0) or User.objects.make_random_password) - - print("👤 Created user ",username) - - if user_details.get('api_token', 0): - Token.objects.create(user=user, key=user_details['api_token']) - - user_permissions = user_details.get('permissions', []) - if user_permissions: - user.user_permissions.clear() - for permission_codename in user_details.get('permissions', []): - permission = Permission.objects.get(codename=permission_codename) - user.user_permissions.add(permission) - user.save() diff --git a/startup_scripts/010_groups.py b/startup_scripts/010_groups.py new file mode 100644 index 0000000..850094c --- /dev/null +++ b/startup_scripts/010_groups.py @@ -0,0 +1,27 @@ +from django.contrib.auth.models import Permission, Group, User +from ruamel.yaml import YAML + +with open('/opt/netbox/initializers/groups.yml', 'r') as stream: + yaml=YAML(typ='safe') + groups = yaml.load(stream) + + if groups is not None: + for groupname, group_details in groups.items(): + group, created = Group.objects.get_or_create(name=groupname) + + if created: + print("👥 Created group", groupname) + + for username in group_details.get('users', []): + user = User.objects.get(username=username) + + if user: + user.groups.add(group) + + group_permissions = group_details.get('permissions', []) + if group_permissions: + group.permissions.clear() + print("Permissions:", group.permissions.all()) + for permission_codename in group_details.get('permissions', []): + permission = Permission.objects.get(codename=permission_codename) + group.permissions.add(permission) diff --git a/startup_scripts/020_custom_fields.py b/startup_scripts/020_custom_fields.py new file mode 100644 index 0000000..2c9e649 --- /dev/null +++ b/startup_scripts/020_custom_fields.py @@ -0,0 +1,69 @@ +from extras.constants import CF_TYPE_TEXT, CF_TYPE_INTEGER, CF_TYPE_BOOLEAN, CF_TYPE_DATE, CF_TYPE_URL, CF_TYPE_SELECT, CF_FILTER_CHOICES +from extras.models import CustomField, CustomFieldChoice + +from ruamel.yaml import YAML + +text_to_fields = { + 'boolean': CF_TYPE_BOOLEAN, + 'date': CF_TYPE_DATE, + 'integer': CF_TYPE_INTEGER, + 'selection': CF_TYPE_SELECT, + 'text': CF_TYPE_TEXT, + 'url': CF_TYPE_URL, +} + +def get_class_for_class_path(class_path): + import importlib + from django.contrib.contenttypes.models import ContentType + + 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) + +with open('/opt/netbox/initializers/custom_fields.yml', 'r') as stream: + yaml = YAML(typ='safe') + customfields = yaml.load(stream) + + if customfields is not None: + for cf_name, cf_details in customfields.items(): + custom_field, created = CustomField.objects.get_or_create(name = cf_name) + + if created: + if cf_details.get('default', 0): + custom_field.default = cf_details['default'] + + if cf_details.get('description', 0): + custom_field.description = cf_details['description'] + + # If no filter_logic is specified then it will default to 'Loose' + if cf_details.get('filter_logic', 0): + for choice_id, choice_text in CF_FILTER_CHOICES: + if choice_text.lower() == cf_details['filter_logic']: + custom_field.filter_logic = choice_id + + if cf_details.get('label', 0): + custom_field.label = cf_details['label'] + + for object_type in cf_details.get('on_objects', []): + custom_field.obj_type.add(get_class_for_class_path(object_type)) + + if cf_details.get('required', 0): + custom_field.required = cf_details['required'] + + if cf_details.get('type', 0): + custom_field.type = text_to_fields[cf_details['type']] + + if cf_details.get('weight', 0): + custom_field.weight = cf_details['weight'] + + custom_field.save() + + for idx, choice_details in enumerate(cf_details.get('choices', [])): + choice, _ = CustomFieldChoice.objects.get_or_create( + field=custom_field, + value=choice_details['value'], + defaults={'weight': idx * 10} + ) + + print("🔧 Created custom field", cf_name) diff --git a/startup_scripts/030_regions.py b/startup_scripts/030_regions.py new file mode 100644 index 0000000..888f031 --- /dev/null +++ b/startup_scripts/030_regions.py @@ -0,0 +1,25 @@ +from dcim.models import Region +from ruamel.yaml import YAML + +with open('/opt/netbox/initializers/regions.yml', 'r') as stream: + yaml=YAML(typ='safe') + regions = yaml.load(stream) + + optional_assocs = { + 'parent': (Region, 'name') + } + + if regions is not None: + for params in regions: + + for assoc, details in optional_assocs.items(): + if assoc in params: + model, field = details + query = { field: params.pop(assoc) } + + params[assoc] = model.objects.get(**query) + + region, created = Region.objects.get_or_create(**params) + + if created: + print("Created region", region.name) diff --git a/startup_scripts/040_sites.py b/startup_scripts/040_sites.py new file mode 100644 index 0000000..3dd5a57 --- /dev/null +++ b/startup_scripts/040_sites.py @@ -0,0 +1,40 @@ +from dcim.models import Region, Site +from extras.models import CustomField, CustomFieldValue +from tenancy.models import Tenant +from ruamel.yaml import YAML + +with open('/opt/netbox/initializers/sites.yml', 'r') as stream: + yaml = YAML(typ='safe') + sites = yaml.load(stream) + + optional_assocs = { + 'region': (Region, 'name'), + 'tenant': (Tenant, 'name') + } + + if sites is not None: + for params in sites: + custom_fields = params.pop('custom_fields', None) + + for assoc, details in optional_assocs.items(): + if assoc in params: + model, field = details + query = { field: params.pop(assoc) } + + params[assoc] = model.objects.get(**query) + + site, created = Site.objects.get_or_create(**params) + + if created: + if custom_fields is not None: + for cf_name, cf_value in custom_fields.items(): + custom_field = CustomField.objects.get(name=cf_name) + custom_field_value = CustomFieldValue.objects.create( + field=custom_field, + obj=site, + value=cf_value + ) + + site.custom_field_values.add(custom_field_value) + + print("Created site", site.name) diff --git a/startup_scripts/050_manufacturers.py b/startup_scripts/050_manufacturers.py new file mode 100644 index 0000000..13cad50 --- /dev/null +++ b/startup_scripts/050_manufacturers.py @@ -0,0 +1,14 @@ +from dcim.models import Manufacturer +from ruamel.yaml import YAML + +with open('/opt/netbox/initializers/manufacturers.yml', 'r') as stream: + yaml = YAML(typ='safe') + manufacturers = yaml.load(stream) + + if manufacturers is not None: + for params in manufacturers: + manufacturer, created = Manufacturer.objects.get_or_create(**params) + + if created: + print("Created Manufacturer", manufacturer.name) + diff --git a/startup_scripts/060_device_types.py b/startup_scripts/060_device_types.py new file mode 100644 index 0000000..f4d5ae2 --- /dev/null +++ b/startup_scripts/060_device_types.py @@ -0,0 +1,51 @@ +from dcim.models import DeviceType, Manufacturer, Region +from tenancy.models import Tenant +from extras.models import CustomField, CustomFieldValue +from ruamel.yaml import YAML + +with open('/opt/netbox/initializers/device_types.yml', 'r') as stream: + yaml = YAML(typ='safe') + device_types = yaml.load(stream) + + required_assocs = { + 'manufacturer': (Manufacturer, 'name') + } + + optional_assocs = { + 'region': (Region, 'name'), + 'tenant': (Tenant, 'name') + } + + if device_types is not None: + for params in device_types: + custom_fields = params.pop('custom_fields', None) + + for assoc, details in required_assocs.items(): + model, field = details + query = { field: params.pop(assoc) } + + params[assoc] = model.objects.get(**query) + + for assoc, details in optional_assocs.items(): + if assoc in params: + model, field = details + query = { field: params.pop(assoc) } + + params[assoc] = model.objects.get(**query) + + device_type, created = DeviceType.objects.get_or_create(**params) + + if created: + if custom_fields is not None: + for cf_name, cf_value in custom_fields.items(): + custom_field = CustomField.objects.get(name=cf_name) + custom_field_value = CustomFieldValue.objects.create( + field=custom_field, + obj=device_type, + value=cf_value + ) + + device_type.custom_field_values.add(custom_field_value) + + print("Created device type", device_type.manufacturer, device_type.model) + diff --git a/startup_scripts/070_rack_roles.py b/startup_scripts/070_rack_roles.py new file mode 100644 index 0000000..ca82125 --- /dev/null +++ b/startup_scripts/070_rack_roles.py @@ -0,0 +1,21 @@ +from dcim.models import RackRole +from ruamel.yaml import YAML +from utilities.forms import COLOR_CHOICES + +with open('/opt/netbox/initializers/rack_roles.yml', 'r') as stream: + yaml=YAML(typ='safe') + rack_roles = yaml.load(stream) + + if rack_roles is not None: + for params in rack_roles: + if 'color' in params: + color = params.pop('color') + + for color_tpl in COLOR_CHOICES: + if color in color_tpl: + params['color'] = color_tpl[0] + + rack_role, created = RackRole.objects.get_or_create(**params) + + if created: + print("Created rack role", rack_role.name) diff --git a/startup_scripts/080_racks.py b/startup_scripts/080_racks.py new file mode 100644 index 0000000..2f5ea75 --- /dev/null +++ b/startup_scripts/080_racks.py @@ -0,0 +1,60 @@ +from dcim.models import Site, RackRole, Rack, RackGroup +from tenancy.models import Tenant +from extras.models import CustomField, CustomFieldValue +from dcim.constants import RACK_TYPE_CHOICES, RACK_WIDTH_CHOICES +from ruamel.yaml import YAML + +with open('/opt/netbox/initializers/racks.yml', 'r') as stream: + yaml = YAML(typ='safe') + racks = yaml.load(stream) + + required_assocs = { + 'site': (Site, 'name') + } + + optional_assocs = { + 'role': (RackRole, 'name'), + 'tenant': (Tenant, 'name'), + 'group': (RackGroup, 'name') + } + + if racks is not None: + for params in racks: + custom_fields = params.pop('custom_fields', None) + + for assoc, details in required_assocs.items(): + model, field = details + query = { field: params.pop(assoc) } + + params[assoc] = model.objects.get(**query) + + for assoc, details in optional_assocs.items(): + if assoc in params: + model, field = details + query = { field: params.pop(assoc) } + + params[assoc] = model.objects.get(**query) + + for rack_type in RACK_TYPE_CHOICES: + if params['type'] in rack_type: + params['type'] = rack_type[0] + + for rack_width in RACK_WIDTH_CHOICES: + if params['width'] in rack_width: + params['width'] = rack_width[0] + + rack, created = Rack.objects.get_or_create(**params) + + if created: + if custom_fields is not None: + for cf_name, cf_value in custom_fields.items(): + custom_field = CustomField.objects.get(name=cf_name) + custom_field_value = CustomFieldValue.objects.create( + field=custom_field, + obj=rack, + value=cf_value + ) + + rack.custom_field_values.add(custom_field_value) + + print("Created rack", rack.site, rack.name) diff --git a/startup_scripts/090_device_roles.py b/startup_scripts/090_device_roles.py new file mode 100644 index 0000000..d3f52d8 --- /dev/null +++ b/startup_scripts/090_device_roles.py @@ -0,0 +1,22 @@ +from dcim.models import DeviceRole +from ruamel.yaml import YAML +from utilities.forms import COLOR_CHOICES + +with open('/opt/netbox/initializers/device_roles.yml', 'r') as stream: + yaml=YAML(typ='safe') + device_roles = yaml.load(stream) + + if device_roles is not None: + for params in device_roles: + + if 'color' in params: + color = params.pop('color') + + for color_tpl in COLOR_CHOICES: + if color in color_tpl: + params['color'] = color_tpl[0] + + device_role, created = DeviceRole.objects.get_or_create(**params) + + if created: + print("Created device role", device_role.name) diff --git a/startup_scripts/100_devices.py b/startup_scripts/100_devices.py new file mode 100644 index 0000000..b4f0323 --- /dev/null +++ b/startup_scripts/100_devices.py @@ -0,0 +1,64 @@ +from dcim.models import Site, Rack, DeviceRole, DeviceType, Device, Platform +from dcim.constants import RACK_FACE_CHOICES +from ipam.models import IPAddress +from virtualization.models import Cluster +from tenancy.models import Tenant +from extras.models import CustomField, CustomFieldValue +from ruamel.yaml import YAML + +with open('/opt/netbox/initializers/devices.yml', 'r') as stream: + yaml = YAML(typ='safe') + devices = yaml.load(stream) + + required_assocs = { + 'device_role': (DeviceRole, 'name'), + 'device_type': (DeviceType, 'model'), + 'site': (Site, 'name') + } + + optional_assocs = { + 'tenant': (Tenant, 'name'), + 'platform': (Platform, 'name'), + 'rack': (Rack, 'name'), + 'cluster': (Cluster, 'name'), + 'primary_ip4': (IPAddress, 'address'), + 'primary_ip6': (IPAddress, 'address') + } + + if devices is not None: + for params in devices: + custom_fields = params.pop('custom_fields', None) + + for assoc, details in required_assocs.items(): + model, field = details + query = { field: params.pop(assoc) } + + params[assoc] = model.objects.get(**query) + + for assoc, details in optional_assocs.items(): + if assoc in params: + model, field = details + query = { field: params.pop(assoc) } + + params[assoc] = model.objects.get(**query) + + if 'face' in params: + for rack_face in RACK_FACE_CHOICES: + if params['face'] in rack_face: + params['face'] = rack_face[0] + + device, created = Device.objects.get_or_create(**params) + + if created: + if custom_fields is not None: + for cf_name, cf_value in custom_fields.items(): + custom_field = CustomField.objects.get(name=cf_name) + custom_field_value = CustomFieldValue.objects.create( + field=custom_field, + obj=device, + value=cf_value + ) + + device.custom_field_values.add(custom_field_value) + + print("Created device", device.name) diff --git a/startup_scripts/10_groups.py b/startup_scripts/10_groups.py deleted file mode 100644 index 850094c..0000000 --- a/startup_scripts/10_groups.py +++ /dev/null @@ -1,27 +0,0 @@ -from django.contrib.auth.models import Permission, Group, User -from ruamel.yaml import YAML - -with open('/opt/netbox/initializers/groups.yml', 'r') as stream: - yaml=YAML(typ='safe') - groups = yaml.load(stream) - - if groups is not None: - for groupname, group_details in groups.items(): - group, created = Group.objects.get_or_create(name=groupname) - - if created: - print("👥 Created group", groupname) - - for username in group_details.get('users', []): - user = User.objects.get(username=username) - - if user: - user.groups.add(group) - - group_permissions = group_details.get('permissions', []) - if group_permissions: - group.permissions.clear() - print("Permissions:", group.permissions.all()) - for permission_codename in group_details.get('permissions', []): - permission = Permission.objects.get(codename=permission_codename) - group.permissions.add(permission) diff --git a/startup_scripts/20_custom_fields.py b/startup_scripts/20_custom_fields.py deleted file mode 100644 index 2c9e649..0000000 --- a/startup_scripts/20_custom_fields.py +++ /dev/null @@ -1,69 +0,0 @@ -from extras.constants import CF_TYPE_TEXT, CF_TYPE_INTEGER, CF_TYPE_BOOLEAN, CF_TYPE_DATE, CF_TYPE_URL, CF_TYPE_SELECT, CF_FILTER_CHOICES -from extras.models import CustomField, CustomFieldChoice - -from ruamel.yaml import YAML - -text_to_fields = { - 'boolean': CF_TYPE_BOOLEAN, - 'date': CF_TYPE_DATE, - 'integer': CF_TYPE_INTEGER, - 'selection': CF_TYPE_SELECT, - 'text': CF_TYPE_TEXT, - 'url': CF_TYPE_URL, -} - -def get_class_for_class_path(class_path): - import importlib - from django.contrib.contenttypes.models import ContentType - - 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) - -with open('/opt/netbox/initializers/custom_fields.yml', 'r') as stream: - yaml = YAML(typ='safe') - customfields = yaml.load(stream) - - if customfields is not None: - for cf_name, cf_details in customfields.items(): - custom_field, created = CustomField.objects.get_or_create(name = cf_name) - - if created: - if cf_details.get('default', 0): - custom_field.default = cf_details['default'] - - if cf_details.get('description', 0): - custom_field.description = cf_details['description'] - - # If no filter_logic is specified then it will default to 'Loose' - if cf_details.get('filter_logic', 0): - for choice_id, choice_text in CF_FILTER_CHOICES: - if choice_text.lower() == cf_details['filter_logic']: - custom_field.filter_logic = choice_id - - if cf_details.get('label', 0): - custom_field.label = cf_details['label'] - - for object_type in cf_details.get('on_objects', []): - custom_field.obj_type.add(get_class_for_class_path(object_type)) - - if cf_details.get('required', 0): - custom_field.required = cf_details['required'] - - if cf_details.get('type', 0): - custom_field.type = text_to_fields[cf_details['type']] - - if cf_details.get('weight', 0): - custom_field.weight = cf_details['weight'] - - custom_field.save() - - for idx, choice_details in enumerate(cf_details.get('choices', [])): - choice, _ = CustomFieldChoice.objects.get_or_create( - field=custom_field, - value=choice_details['value'], - defaults={'weight': idx * 10} - ) - - print("🔧 Created custom field", cf_name) diff --git a/startup_scripts/40_regions.py b/startup_scripts/40_regions.py deleted file mode 100644 index 033e26c..0000000 --- a/startup_scripts/40_regions.py +++ /dev/null @@ -1,25 +0,0 @@ -from dcim.models import Region -from ruamel.yaml import YAML - -with open('/opt/netbox/initializers/regions.yml', 'r') as stream: - yaml=YAML(typ='safe') - regions = yaml.load(stream) - - optional_assocs = { - 'parent': (Region, 'name') - } - - if regions is not None: - for params in regions: - - for assoc, details in optional_assocs.items(): - if assoc in params: - model, field = details - query = dict(field=params.pop(assoc)) - - params[assoc] = model.objects.get(**query) - - region, created = Region.objects.get_or_create(**params) - - if created: - print("Created region", region.name) diff --git a/startup_scripts/41_sites.py b/startup_scripts/41_sites.py deleted file mode 100644 index 599f8b7..0000000 --- a/startup_scripts/41_sites.py +++ /dev/null @@ -1,39 +0,0 @@ -from dcim.models import Region, Site -from extras.models import CustomField, CustomFieldValue -from tenancy.models import Tenant -from ruamel.yaml import YAML - -with open('/opt/netbox/initializers/sites.yml', 'r') as stream: - yaml = YAML(typ='safe') - sites = yaml.load(stream) - - optional_assocs = { - 'region': (Region, 'name'), - 'tenant': (Tenant, 'name') - } - - if sites is not None: - for params in sites: - - for assoc, details in optional_assocs.items(): - if assoc in params: - model, field = details - query = { field: params.pop(assoc) } - - params[assoc] = model.objects.get(**query) - - site, created = Site.objects.get_or_create(**params) - - if created: - if custom_fields is not None: - for cf_name, cf_value in custom_fields.items(): - custom_field = CustomField.objects.get(name=cf_name) - custom_field_value = CustomFieldValue.objects.create( - field=custom_field, - obj=device_type, - value=cf_value - ) - - site.custom_field_values.add(custom_field_value) - - print("Created site", site.name) diff --git a/startup_scripts/42_manufacturers.py b/startup_scripts/42_manufacturers.py deleted file mode 100644 index 13cad50..0000000 --- a/startup_scripts/42_manufacturers.py +++ /dev/null @@ -1,14 +0,0 @@ -from dcim.models import Manufacturer -from ruamel.yaml import YAML - -with open('/opt/netbox/initializers/manufacturers.yml', 'r') as stream: - yaml = YAML(typ='safe') - manufacturers = yaml.load(stream) - - if manufacturers is not None: - for params in manufacturers: - manufacturer, created = Manufacturer.objects.get_or_create(**params) - - if created: - print("Created Manufacturer", manufacturer.name) - diff --git a/startup_scripts/43_device_types.py b/startup_scripts/43_device_types.py deleted file mode 100644 index e27ca00..0000000 --- a/startup_scripts/43_device_types.py +++ /dev/null @@ -1,50 +0,0 @@ -from dcim.models import DeviceType, Manufacturer -from extras.models import CustomField, CustomFieldValue -from ruamel.yaml import YAML - -with open('/opt/netbox/initializers/device_types.yml', 'r') as stream: - yaml = YAML(typ='safe') - device_types = yaml.load(stream) - - required_assocs = { - 'manufacturer': (Manufacturer, 'name') - } - - optional_assocs = { - 'region': (Region, 'name'), - 'tenant': (Tenant, 'name') - } - - if device_types is not None: - for params in device_types: - custom_fields = params.pop('custom_fields', None) - - for assoc, details in required.items(): - model, field = details - query = dict(field=params.pop(assoc)) - - params[assoc] = model.objects.get(**query) - - for assoc, details in optional_assocs.items(): - if assoc in params: - model, field = details - query = dict(field=params.pop(assoc)) - - params[assoc] = model.objects.get(**query) - - device_type, created = DeviceType.objects.get_or_create(**params) - - if created: - if custom_fields is not None: - for cf_name, cf_value in custom_fields.items(): - custom_field = CustomField.objects.get(name=cf_name) - custom_field_value = CustomFieldValue.objects.create( - field=custom_field, - obj=device_type, - value=cf_value - ) - - device_type.custom_field_values.add(custom_field_value) - - print("Created device type", device_type.manufacturer, device_type.model) - diff --git a/startup_scripts/44_rack_roles.py b/startup_scripts/44_rack_roles.py deleted file mode 100644 index 53517c2..0000000 --- a/startup_scripts/44_rack_roles.py +++ /dev/null @@ -1,21 +0,0 @@ -from dcim.models import RackRole -from ruamel.yaml import YAML -from utilities.forms import COLOR_CHOICES - -with open('/opt/netbox/initializers/rack_roles.yml', 'r') as stream: - yaml=YAML(typ='safe') - rack_roles = yaml.load(stream) - - if rack_roles is not None: - for params in rack_roles: - if 'color' in params: - color = params.pop('color') - - for color_tpl in COLOR_CHOICES: - if color in color_tpl: - params['color'] = color_tpl[0] - - rack_role, created = RackRole.objects.get_or_create(**params) - - if created: - print("Created rack role", rack_role.name) diff --git a/startup_scripts/45_racks.py b/startup_scripts/45_racks.py deleted file mode 100644 index 6391b46..0000000 --- a/startup_scripts/45_racks.py +++ /dev/null @@ -1,60 +0,0 @@ -from dcim.models import Site, RackRole, Rack, RackGroup -from tenancy.models import Tenant -from extras.models import CustomField, CustomFieldValue -from dcim.constants import RACK_TYPE_CHOICES, RACK_WIDTH_CHOICES -from ruamel.yaml import YAML - -with open('/opt/netbox/initializers/racks.yml', 'r') as stream: - yaml = YAML(typ='safe') - racks = yaml.load(stream) - - required_assocs = { - 'site': (Site, 'name') - } - - optional_assocs = { - 'role': (RackRole, 'name'), - 'tenant': (Tenant, 'name'), - 'group': (RackGroup, 'name') - } - - if racks is not None: - for params in racks: - custom_fields = params.pop('custom_fields', None) - - for assoc, details in required.items(): - model, field = details - query = dict(field=params.pop(assoc)) - - params[assoc] = model.objects.get(**query) - - for assoc, details in optional_assocs.items(): - if assoc in params: - model, field = details - query = dict(field=params.pop(assoc)) - - params[assoc] = model.objects.get(**query) - - for rack_type in RACK_TYPE_CHOICES: - if params['type'] in rack_type: - params['type'] = rack_type[0] - - for rack_width in RACK_WIDTH_CHOICES: - if params['width'] in rack_width: - params['width'] = rack_width[0] - - rack, created = Rack.objects.get_or_create(**params) - - if created: - if custom_fields is not None: - for cf_name, cf_value in custom_fields.items(): - custom_field = CustomField.objects.get(name=cf_name) - custom_field_value = CustomFieldValue.objects.create( - field=custom_field, - obj=device_type, - value=cf_value - ) - - rack.custom_field_values.add(custom_field_value) - - print("Created rack", rack.site, rack.name) diff --git a/startup_scripts/46_device_roles.py b/startup_scripts/46_device_roles.py deleted file mode 100644 index d3f52d8..0000000 --- a/startup_scripts/46_device_roles.py +++ /dev/null @@ -1,22 +0,0 @@ -from dcim.models import DeviceRole -from ruamel.yaml import YAML -from utilities.forms import COLOR_CHOICES - -with open('/opt/netbox/initializers/device_roles.yml', 'r') as stream: - yaml=YAML(typ='safe') - device_roles = yaml.load(stream) - - if device_roles is not None: - for params in device_roles: - - if 'color' in params: - color = params.pop('color') - - for color_tpl in COLOR_CHOICES: - if color in color_tpl: - params['color'] = color_tpl[0] - - device_role, created = DeviceRole.objects.get_or_create(**params) - - if created: - print("Created device role", device_role.name) diff --git a/startup_scripts/47_devices.py b/startup_scripts/47_devices.py deleted file mode 100644 index 46e8188..0000000 --- a/startup_scripts/47_devices.py +++ /dev/null @@ -1,64 +0,0 @@ -from dcim.models import Site, Rack, DeviceRole, DeviceType, Device, Platform -from dcim.constants import RACK_FACE_CHOICES -from ipam.models import IPAddress -from virtualization.models import Cluster -from tenancy.models import Tenant -from extras.models import CustomField, CustomFieldValue -from ruamel.yaml import YAML - -with open('/opt/netbox/initializers/devices.yml', 'r') as stream: - yaml = YAML(typ='safe') - devices = yaml.load(stream) - - required_assocs = { - 'device_role': (DeviceRole, 'name'), - 'device_type': (DeviceType, 'model'), - 'site': (Site, 'name') - } - - optional_assocs = { - 'tenant': (Tenant, 'name'), - 'platform': (Platform, 'name'), - 'rack': (Rack, 'name'), - 'cluster': (Cluster, 'name'), - 'primary_ip4': (IPAddress, 'address') - 'primary_ip6': (IPAddress, 'address') - } - - if devices is not None: - for params in devices: - custom_fields = params.pop('custom_fields', None) - - for assoc, details in required.items(): - model, field = details - query = dict(field=params.pop(assoc)) - - params[assoc] = model.objects.get(**query) - - for assoc, details in optional_assocs.items(): - if assoc in params: - model, field = details - query = dict(field=params.pop(assoc)) - - params[assoc] = model.objects.get(**query) - - if 'face' in params: - for rack_face in RACK_FACE_CHOICES: - if params['face'] in rack_face: - params['face'] = rack_face[0] - - device, created = Device.objects.get_or_create(**params) - - if created: - if custom_fields is not None: - for cf_name, cf_value in custom_fields.items(): - custom_field = CustomField.objects.get(name=cf_name) - custom_field_value = CustomFieldValue.objects.create( - field=custom_field, - obj=device_type, - value=cf_value - ) - - device.custom_field_values.add(custom_field_value) - - print("Created device", device.name)