diff --git a/initializers/platforms.yml b/initializers/platforms.yml new file mode 100644 index 0000000..bc9926a --- /dev/null +++ b/initializers/platforms.yml @@ -0,0 +1,19 @@ +# # Allowed rpc clients are: juniper-junos, cisco-ios, opengear +# - name: Platform 1 +# slug: platform-1 +# manufacturer: Manufacturer 1 +# napalm_driver: driver1 +# napalm_args: "{'arg1': 'value1', 'arg2': 'value2'}" +# rpc_client: juniper-junos +# - name: Platform 2 +# slug: platform-2 +# manufacturer: Manufacturer 2 +# napalm_driver: driver2 +# napalm_args: "{'arg1': 'value1', 'arg2': 'value2'}" +# rpc_client: opengear +# - name: Platform 3 +# slug: platform-3 +# manufacturer: NoName +# napalm_driver: driver3 +# napalm_args: "{'arg1': 'value1', 'arg2': 'value2'}" +# rpc_client: juniper-junos diff --git a/startup_scripts/050_manufacturers.py b/startup_scripts/050_manufacturers.py index fdee2b4..6f43fd1 100644 --- a/startup_scripts/050_manufacturers.py +++ b/startup_scripts/050_manufacturers.py @@ -11,4 +11,3 @@ if created: print("🏭 Created Manufacturer", manufacturer.name) - diff --git a/startup_scripts/100_devices.py b/startup_scripts/100_devices.py deleted file mode 100644 index 1818431..0000000 --- a/startup_scripts/100_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_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/100_platforms.py b/startup_scripts/100_platforms.py new file mode 100644 index 0000000..c7916b9 --- /dev/null +++ b/startup_scripts/100_platforms.py @@ -0,0 +1,25 @@ +from dcim.models import Manufacturer, Platform +from ruamel.yaml import YAML + +with open('/opt/netbox/initializers/platforms.yml', 'r') as stream: + yaml = YAML(typ='safe') + platforms = yaml.load(stream) + + optional_assocs = { + 'manufacturer': (Manufacturer, 'name'), + } + + if platforms is not None: + for params in platforms: + + 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) + + platform, created = Platform.objects.get_or_create(**params) + + if created: + print("💾 Created platform", platform.name) diff --git a/startup_scripts/110_devices.py b/startup_scripts/110_devices.py new file mode 100644 index 0000000..1818431 --- /dev/null +++ b/startup_scripts/110_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)