Newer
Older
netbox-docker / startup_scripts / 130_devices.py
@Tobias Genannt Tobias Genannt on 10 Feb 2020 1 KB Add function to load YAML files
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 startup_script_utils import load_yaml
import sys

devices = load_yaml('/opt/netbox/initializers/devices.yml')

if devices is None:
  sys.exit()

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')
}

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)