Newer
Older
netbox-docker / startup_scripts / 080_racks.py
@Christian Mäder Christian Mäder on 20 Jan 2020 1 KB Update Rack Initializer for Netbox 2.7
from dcim.models import Site, RackRole, Rack, RackGroup
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/racks.yml')
if not file.is_file():
  sys.exit()

with file.open('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)

      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)