Handle primary IPs on devices and VMs

This commit is contained in:
Aurélien Dunand 2020-06-04 20:46:40 +02:00
parent a9232e4f30
commit df72d6bbb5
5 changed files with 55 additions and 8 deletions

View File

@ -29,6 +29,8 @@
# rack: rack-02 # rack: rack-02
# face: front # face: front
# position: 2 # position: 2
# primary_ip4: 10.1.1.2/24
# primary_ip6: 2001:db8:a000:1::2/64
# custom_fields: # custom_fields:
# text_field: Description # text_field: Description
# - name: server03 # - name: server03

View File

@ -21,6 +21,8 @@
# memory: 2048 # memory: 2048
# name: virtual machine 2 # name: virtual machine 2
# platform: Platform 2 # platform: Platform 2
# primary_ip4: 10.1.1.10/24
# primary_ip6: 2001:db8:a000:1::10/64
# status: active # status: active
# tenant: tenant1 # tenant: tenant1
# vcpus: 8 # vcpus: 8

View File

@ -1,5 +1,4 @@
from dcim.models import Site, Rack, DeviceRole, DeviceType, Device, Platform from dcim.models import Site, Rack, DeviceRole, DeviceType, Device, Platform
from ipam.models import IPAddress
from virtualization.models import Cluster from virtualization.models import Cluster
from tenancy.models import Tenant from tenancy.models import Tenant
from extras.models import CustomField, CustomFieldValue from extras.models import CustomField, CustomFieldValue
@ -21,13 +20,14 @@ optional_assocs = {
'tenant': (Tenant, 'name'), 'tenant': (Tenant, 'name'),
'platform': (Platform, 'name'), 'platform': (Platform, 'name'),
'rack': (Rack, 'name'), 'rack': (Rack, 'name'),
'cluster': (Cluster, 'name'), 'cluster': (Cluster, 'name')
'primary_ip4': (IPAddress, 'address'),
'primary_ip6': (IPAddress, 'address')
} }
for params in devices: for params in devices:
custom_fields = params.pop('custom_fields', None) custom_fields = params.pop('custom_fields', None)
# primary ips are handled later in `270_primary_ips.py`
params.pop('primary_ip4', None)
params.pop('primary_ip6', None)
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details

View File

@ -1,5 +1,4 @@
from dcim.models import Site, Platform, DeviceRole from dcim.models import Site, Platform, DeviceRole
from ipam.models import IPAddress
from virtualization.models import Cluster, VirtualMachine from virtualization.models import Cluster, VirtualMachine
from tenancy.models import Tenant from tenancy.models import Tenant
from extras.models import CustomField, CustomFieldValue from extras.models import CustomField, CustomFieldValue
@ -18,13 +17,14 @@ required_assocs = {
optional_assocs = { optional_assocs = {
'tenant': (Tenant, 'name'), 'tenant': (Tenant, 'name'),
'platform': (Platform, 'name'), 'platform': (Platform, 'name'),
'role': (DeviceRole, 'name'), 'role': (DeviceRole, 'name')
'primary_ip4': (IPAddress, 'address'),
'primary_ip6': (IPAddress, 'address')
} }
for params in virtual_machines: for params in virtual_machines:
custom_fields = params.pop('custom_fields', None) custom_fields = params.pop('custom_fields', None)
# primary ips are handled later in `270_primary_ips.py`
params.pop('primary_ip4', None)
params.pop('primary_ip6', None)
for assoc, details in required_assocs.items(): for assoc, details in required_assocs.items():
model, field = details model, field = details

View File

@ -0,0 +1,43 @@
from dcim.models import Device
from ipam.models import IPAddress
from virtualization.models import VirtualMachine
from startup_script_utils import load_yaml
import sys
def link_primary_ip(assets, asset_model):
for params in assets:
primary_ip_fields = set(params) & {'primary_ip4', 'primary_ip6'}
if not primary_ip_fields:
continue
for assoc, details in optional_assocs.items():
if assoc in params:
model, field = details
query = { field: params.pop(assoc) }
try:
params[assoc] = model.objects.get(**query)
except model.DoesNotExist:
primary_ip_fields -= {assoc}
print(f"⚠️ IP Address {query[field]} not found")
asset = asset_model.objects.get(name=params['name'])
for field in primary_ip_fields:
if getattr(asset, field) != params[field]:
setattr(asset, field, params[field])
print(f"🧬 Linked primary IP {params[field].address} on {asset.name}")
asset.save()
devices = load_yaml('/opt/netbox/initializers/devices.yml')
virtual_machines = load_yaml('/opt/netbox/initializers/virtual_machines.yml')
if devices is None and virtual_machines is None:
sys.exit()
optional_assocs = {
'primary_ip4': (IPAddress, 'address'),
'primary_ip6': (IPAddress, 'address')
}
link_primary_ip(devices, Device)
link_primary_ip(virtual_machines, VirtualMachine)