Skip to content

Commit 9efacca

Browse files
committed
Merge branch 'Tassatux-develop' into develop
2 parents c744603 + f553d17 commit 9efacca

File tree

5 files changed

+54
-4
lines changed

5 files changed

+54
-4
lines changed

initializers/devices.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
# rack: rack-02
3030
# face: front
3131
# position: 2
32+
# primary_ip4: 10.1.1.2/24
33+
# primary_ip6: 2001:db8:a000:1::2/64
3234
# custom_fields:
3335
# text_field: Description
3436
# - name: server03

initializers/virtual_machines.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
# memory: 2048
2222
# name: virtual machine 2
2323
# platform: Platform 2
24+
# primary_ip4: 10.1.1.10/24
25+
# primary_ip6: 2001:db8:a000:1::10/64
2426
# status: active
2527
# tenant: tenant1
2628
# vcpus: 8

startup_scripts/130_devices.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from dcim.models import Site, Rack, DeviceRole, DeviceType, Device, Platform
2-
from ipam.models import IPAddress
32
from virtualization.models import Cluster
43
from tenancy.models import Tenant
54
from extras.models import CustomField, CustomFieldValue
@@ -21,13 +20,14 @@
2120
'tenant': (Tenant, 'name'),
2221
'platform': (Platform, 'name'),
2322
'rack': (Rack, 'name'),
24-
'cluster': (Cluster, 'name'),
25-
'primary_ip4': (IPAddress, 'address'),
26-
'primary_ip6': (IPAddress, 'address')
23+
'cluster': (Cluster, 'name')
2724
}
2825

2926
for params in devices:
3027
custom_fields = params.pop('custom_fields', None)
28+
# primary ips are handled later in `270_primary_ips.py`
29+
params.pop('primary_ip4', None)
30+
params.pop('primary_ip6', None)
3131

3232
for assoc, details in required_assocs.items():
3333
model, field = details

startup_scripts/230_virtual_machines.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222

2323
for params in virtual_machines:
2424
custom_fields = params.pop('custom_fields', None)
25+
# primary ips are handled later in `270_primary_ips.py`
26+
params.pop('primary_ip4', None)
27+
params.pop('primary_ip6', None)
2528

2629
for assoc, details in required_assocs.items():
2730
model, field = details

startup_scripts/270_primary_ips.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from dcim.models import Device
2+
from ipam.models import IPAddress
3+
from virtualization.models import VirtualMachine
4+
from startup_script_utils import load_yaml
5+
import sys
6+
7+
def link_primary_ip(assets, asset_model):
8+
for params in assets:
9+
primary_ip_fields = set(params) & {'primary_ip4', 'primary_ip6'}
10+
if not primary_ip_fields:
11+
continue
12+
13+
for assoc, details in optional_assocs.items():
14+
if assoc in params:
15+
model, field = details
16+
query = { field: params.pop(assoc) }
17+
18+
try:
19+
params[assoc] = model.objects.get(**query)
20+
except model.DoesNotExist:
21+
primary_ip_fields -= {assoc}
22+
print(f"⚠️ IP Address '{query[field]}' not found")
23+
24+
asset = asset_model.objects.get(name=params['name'])
25+
for field in primary_ip_fields:
26+
if getattr(asset, field) != params[field]:
27+
setattr(asset, field, params[field])
28+
print(f"🔗 Define primary IP '{params[field].address}' on '{asset.name}'")
29+
asset.save()
30+
31+
devices = load_yaml('/opt/netbox/initializers/devices.yml')
32+
virtual_machines = load_yaml('/opt/netbox/initializers/virtual_machines.yml')
33+
34+
if devices is None and virtual_machines is None:
35+
sys.exit()
36+
37+
optional_assocs = {
38+
'primary_ip4': (IPAddress, 'address'),
39+
'primary_ip6': (IPAddress, 'address')
40+
}
41+
42+
link_primary_ip(devices, Device)
43+
link_primary_ip(virtual_machines, VirtualMachine)

0 commit comments

Comments
 (0)