4a58676647
The device database model has changed in Netbox 2.7. Therefore the initializer code, that was used before, broke. As a user, you will need to update your devices.yml file as follows: - Make sure the rack face is spelled lowercase. See the diff of this commit for further information how this is meant.
66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
from dcim.models import Site, Rack, DeviceRole, DeviceType, Device, Platform
|
|
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
|
|
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
file = Path('/opt/netbox/initializers/devices.yml')
|
|
if not file.is_file():
|
|
sys.exit()
|
|
|
|
with file.open('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)
|
|
|
|
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)
|