diff --git a/initializers/aggregates.yml b/initializers/aggregates.yml index 8e73070..3dc65e6 100644 --- a/initializers/aggregates.yml +++ b/initializers/aggregates.yml @@ -1,2 +1,4 @@ #- prefix: 10.0.0.0/16 # rir: RFC1918 +#- prefix: fd00:ccdd::/32 +# rir: RFC4193 ULA diff --git a/initializers/clusters.yml b/initializers/clusters.yml index 6eff3d0..a8dc121 100644 --- a/initializers/clusters.yml +++ b/initializers/clusters.yml @@ -1,2 +1,5 @@ #- name: cluster1 # type: Hyper-V +#- name: cluster2 +# type: Hyper-V +# site: SING 1 diff --git a/initializers/dcim_interfaces.yml b/initializers/dcim_interfaces.yml index 12ddbad..e02bf07 100644 --- a/initializers/dcim_interfaces.yml +++ b/initializers/dcim_interfaces.yml @@ -1,12 +1,8 @@ -#- device: router1 +#- device: server01 # enabled: true # form_factor: 0 -# name: router2 -#- device: 9901-2.bwi-stf.lab +# name: to-server02 +#- device: server02 # enabled: true # form_factor: 0 -# name: Loopback0 -#- device: switch1 -# enabled: true -# form_factor: 0 -# name: Vlan5 +# name: to-server01 diff --git a/initializers/ip_addresses.yml b/initializers/ip_addresses.yml index 445dd9c..7427a4a 100644 --- a/initializers/ip_addresses.yml +++ b/initializers/ip_addresses.yml @@ -1,18 +1,13 @@ - #- address: 10.1.1.1/24 -# device: router1 -# family: 4 +# device: server01 # interface: Loopback0 # status: 1 # vrf: vrf1 #- address: 10.1.1.2/24 -# device: switch1 -# family: 4 +# device: server02 # interface: Vlan5 # status: 1 #- address: 10.1.1.10/24 # description: reserved IP -# family: 4 # status: 2 # tenant: tenant1 - diff --git a/initializers/prefix_vlan_roles.yml b/initializers/prefix_vlan_roles.yml new file mode 100644 index 0000000..309acc9 --- /dev/null +++ b/initializers/prefix_vlan_roles.yml @@ -0,0 +1,2 @@ +#- name: Main Management +# slug: main-management diff --git a/initializers/prefixes.yml b/initializers/prefixes.yml index 2aeb74f..8644a9e 100644 --- a/initializers/prefixes.yml +++ b/initializers/prefixes.yml @@ -9,4 +9,13 @@ # site: AMS 2 # status: 1 # tenant: tenant2 -# vlan: vlan2 \ No newline at end of file +# vlan: vlan2 +# is_pool: true +# vrf: vrf2 +# tenant: tenant2 +#- description: ipv6 prefix1 +# prefix: fd00:ccdd:a000:1::/64 +# site: AMS 2 +# status: 1 +# tenant: tenant2 +# vlan: vlan2 diff --git a/initializers/rirs.yml b/initializers/rirs.yml index f819c40..1a0c84d 100644 --- a/initializers/rirs.yml +++ b/initializers/rirs.yml @@ -1,3 +1,6 @@ #- is_private: true # name: RFC1918 # slug: rfc1918 +#- is_private: true +# name: RFC4193 ULA +# slug: rfc4193-ula diff --git a/initializers/tenants.yml b/initializers/tenants.yml index 2af9953..86db54f 100644 --- a/initializers/tenants.yml +++ b/initializers/tenants.yml @@ -2,3 +2,4 @@ # slug: tenant1 #- name: tenant2 # slug: tenant2 +# group: Tenant Group 2 diff --git a/initializers/tenants_groups.yml b/initializers/tenants_groups.yml new file mode 100644 index 0000000..53f0ce8 --- /dev/null +++ b/initializers/tenants_groups.yml @@ -0,0 +1,4 @@ +#- name: Tenant Group 1 +# slug: tenant-group-1 +#- name: Tenant Group 2 +# slug: tenant-group-2 diff --git a/initializers/virtual_machines.yml b/initializers/virtual_machines.yml index 23536bc..8fd57ed 100644 --- a/initializers/virtual_machines.yml +++ b/initializers/virtual_machines.yml @@ -6,4 +6,13 @@ # platform: Platform 2 # status: 1 # tenant: tenant1 -# vcpus: 8 \ No newline at end of file +# vcpus: 8 +#- cluster: cluster1 +# comments: VM2 +# disk: 100 +# memory: 2048 +# name: virtual machine 2 +# platform: Platform 2 +# status: 1 +# tenant: tenant1 +# vcpus: 8 diff --git a/initializers/virtualization_interfaces.yml b/initializers/virtualization_interfaces.yml index 000613f..15a64ab 100644 --- a/initializers/virtualization_interfaces.yml +++ b/initializers/virtualization_interfaces.yml @@ -1,13 +1,11 @@ #- description: Network Interface 1 # enabled: true -# form_factor: 0 # mac_address: 00:77:77:77:77:77 # mtu: 1500 # name: Network Interface 1 # virtual_machine: virtual_machine1 #- description: Network Interface 2 # enabled: true -# form_factor: 0 # mac_address: 00:55:55:55:55:55 # mtu: 1500 # name: Network Interface 2 diff --git a/initializers/vlans.yml b/initializers/vlans.yml index 8591192..6e7353d 100644 --- a/initializers/vlans.yml +++ b/initializers/vlans.yml @@ -2,8 +2,10 @@ # site: AMS 1 # status: 1 # vid: 5 +# role: Main Management +# description: VLAN 5 for MGMT #- group: VLAN group 2 # name: vlan2 # site: AMS 1 # status: 1 -# vid: 1300 \ No newline at end of file +# vid: 1300 diff --git a/initializers/vrfs.yml b/initializers/vrfs.yml index 7d9ba85..0f3684d 100644 --- a/initializers/vrfs.yml +++ b/initializers/vrfs.yml @@ -1,5 +1,9 @@ #- enforce_unique: true # name: vrf1 # tenant: tenant1 +# description: main VRF #- enforce_unique: true # name: vrf2 +# rd: "6500:6500" +# tenant: tenant2 +# tenant_group: Tenant Group 2 diff --git a/startup_scripts/104_tenant_groups.py b/startup_scripts/104_tenant_groups.py deleted file mode 100644 index 94c58ad..0000000 --- a/startup_scripts/104_tenant_groups.py +++ /dev/null @@ -1,19 +0,0 @@ -from tenancy.models import TenantGroup -from ruamel.yaml import YAML -from pathlib import Path -import sys - -file = Path('/opt/netbox/initializers/tenant_groups.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - tenant_groups = yaml.load(stream) - - if tenant_groups is not None: - for params in tenant_groups: - tenant_group, created = TenantGroup.objects.get_or_create(**params) - - if created: - print("Created Tenant Group", tenant_group.name) diff --git a/startup_scripts/105_tenants.py b/startup_scripts/105_tenants.py deleted file mode 100644 index 8ae8ea8..0000000 --- a/startup_scripts/105_tenants.py +++ /dev/null @@ -1,45 +0,0 @@ -from tenancy.models import Tenant, TenantGroup -from extras.models import CustomField, CustomFieldValue -from ruamel.yaml import YAML - -from pathlib import Path -import sys - -file = Path('/opt/netbox/initializers/tenants.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - tenants = yaml.load(stream) - - optional_assocs = { - 'group': (TenantGroup, 'name') - } - - if tenants is not None: - for params in tenants: - custom_fields = params.pop('custom_fields', None) - - 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) - - tenant, created = Tenant.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=tenant, - value=cf_value - ) - - tenant.custom_field_values.add(custom_field_value) - - print("Created Tenant", tenant.name) diff --git a/startup_scripts/110_devices.py b/startup_scripts/110_devices.py deleted file mode 100644 index 16c6f9e..0000000 --- a/startup_scripts/110_devices.py +++ /dev/null @@ -1,71 +0,0 @@ -from dcim.models import Site, Rack, DeviceRole, DeviceType, Device, Platform -from dcim.constants import RACK_FACE_CHOICES -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) - - if 'face' in params: - for rack_face in RACK_FACE_CHOICES: - if params['face'] in rack_face: - params['face'] = rack_face[0] - - 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) diff --git a/startup_scripts/110_tenant_groups.py b/startup_scripts/110_tenant_groups.py new file mode 100644 index 0000000..eaf75dc --- /dev/null +++ b/startup_scripts/110_tenant_groups.py @@ -0,0 +1,19 @@ +from tenancy.models import TenantGroup +from ruamel.yaml import YAML +from pathlib import Path +import sys + +file = Path('/opt/netbox/initializers/tenant_groups.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + tenant_groups = yaml.load(stream) + + if tenant_groups is not None: + for params in tenant_groups: + tenant_group, created = TenantGroup.objects.get_or_create(**params) + + if created: + print("πŸ”³ Created Tenant Group", tenant_group.name) diff --git a/startup_scripts/120_cluster_types.py b/startup_scripts/120_cluster_types.py deleted file mode 100644 index 5211ea5..0000000 --- a/startup_scripts/120_cluster_types.py +++ /dev/null @@ -1,19 +0,0 @@ -from virtualization.models import ClusterType -from ruamel.yaml import YAML -from pathlib import Path -import sys - -file = Path('/opt/netbox/initializers/cluster_types.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - cluster_types = yaml.load(stream) - - if cluster_types is not None: - for params in cluster_types: - cluster_type, created = ClusterType.objects.get_or_create(**params) - - if created: - print("Created Cluster Type", cluster_type.name) diff --git a/startup_scripts/120_tenants.py b/startup_scripts/120_tenants.py new file mode 100644 index 0000000..8252dc7 --- /dev/null +++ b/startup_scripts/120_tenants.py @@ -0,0 +1,45 @@ +from tenancy.models import Tenant, TenantGroup +from extras.models import CustomField, CustomFieldValue +from ruamel.yaml import YAML + +from pathlib import Path +import sys + +file = Path('/opt/netbox/initializers/tenants.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + tenants = yaml.load(stream) + + optional_assocs = { + 'group': (TenantGroup, 'name') + } + + if tenants is not None: + for params in tenants: + custom_fields = params.pop('custom_fields', None) + + 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) + + tenant, created = Tenant.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=tenant, + value=cf_value + ) + + tenant.custom_field_values.add(custom_field_value) + + print("πŸ‘©β€πŸ’» Created Tenant", tenant.name) diff --git a/startup_scripts/125_rirs.py b/startup_scripts/125_rirs.py deleted file mode 100644 index d120545..0000000 --- a/startup_scripts/125_rirs.py +++ /dev/null @@ -1,19 +0,0 @@ -from ipam.models import RIR -from ruamel.yaml import YAML -from pathlib import Path -import sys - -file = Path('/opt/netbox/initializers/rirs.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - rirs = yaml.load(stream) - - if rirs is not None: - for params in rirs: - rir, created = RIR.objects.get_or_create(**params) - - if created: - print("Created RIR", rir.name) diff --git a/startup_scripts/130_aggregates.py b/startup_scripts/130_aggregates.py deleted file mode 100644 index c82aa95..0000000 --- a/startup_scripts/130_aggregates.py +++ /dev/null @@ -1,47 +0,0 @@ -from ipam.models import Aggregate, RIR -from ruamel.yaml import YAML -from extras.models import CustomField, CustomFieldValue - -from netaddr import IPNetwork -from pathlib import Path -import sys - -file = Path('/opt/netbox/initializers/aggregates.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - aggregates = yaml.load(stream) - - required_assocs = { - 'rir': (RIR, 'name') - } - - if aggregates is not None: - for params in aggregates: - custom_fields = params.pop('custom_fields', None) - params['prefix'] = IPNetwork(params['prefix']) - - for assoc, details in required_assocs.items(): - model, field = details - query = { field: params.pop(assoc) } - - params[assoc] = model.objects.get(**query) - - aggregate, created = Aggregate.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=aggregate, - value=cf_value - ) - - aggregate.custom_field_values.add(custom_field_value) - - print("Created Aggregate", aggregate.prefix) - diff --git a/startup_scripts/130_devices.py b/startup_scripts/130_devices.py new file mode 100644 index 0000000..16c6f9e --- /dev/null +++ b/startup_scripts/130_devices.py @@ -0,0 +1,71 @@ +from dcim.models import Site, Rack, DeviceRole, DeviceType, Device, Platform +from dcim.constants import RACK_FACE_CHOICES +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) + + if 'face' in params: + for rack_face in RACK_FACE_CHOICES: + if params['face'] in rack_face: + params['face'] = rack_face[0] + + 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) diff --git a/startup_scripts/140_cluster_types.py b/startup_scripts/140_cluster_types.py new file mode 100644 index 0000000..9bd4be1 --- /dev/null +++ b/startup_scripts/140_cluster_types.py @@ -0,0 +1,19 @@ +from virtualization.models import ClusterType +from ruamel.yaml import YAML +from pathlib import Path +import sys + +file = Path('/opt/netbox/initializers/cluster_types.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + cluster_types = yaml.load(stream) + + if cluster_types is not None: + for params in cluster_types: + cluster_type, created = ClusterType.objects.get_or_create(**params) + + if created: + print("🧰 Created Cluster Type", cluster_type.name) diff --git a/startup_scripts/150_clusters.py b/startup_scripts/150_clusters.py deleted file mode 100644 index bc8a268..0000000 --- a/startup_scripts/150_clusters.py +++ /dev/null @@ -1,57 +0,0 @@ -from dcim.models import Site -from virtualization.models import Cluster, ClusterType, ClusterGroup -from extras.models import CustomField, CustomFieldValue -from ruamel.yaml import YAML - -from pathlib import Path -import sys - -file = Path('/opt/netbox/initializers/clusters.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - clusters = yaml.load(stream) - - required_assocs = { - 'type': (ClusterType, 'name') - } - - optional_assocs = { - 'site': (Site, 'name'), - 'group': (ClusterGroup, 'name') - } - - if clusters is not None: - for params in clusters: - 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) - - cluster, created = Cluster.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=cluster, - value=cf_value - ) - - cluster.custom_field_values.add(custom_field_value) - - print("Created cluster", cluster.name) diff --git a/startup_scripts/150_rirs.py b/startup_scripts/150_rirs.py new file mode 100644 index 0000000..9cee56f --- /dev/null +++ b/startup_scripts/150_rirs.py @@ -0,0 +1,19 @@ +from ipam.models import RIR +from ruamel.yaml import YAML +from pathlib import Path +import sys + +file = Path('/opt/netbox/initializers/rirs.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + rirs = yaml.load(stream) + + if rirs is not None: + for params in rirs: + rir, created = RIR.objects.get_or_create(**params) + + if created: + print("πŸ—ΊοΈ Created RIR", rir.name) diff --git a/startup_scripts/155_vrfs.py b/startup_scripts/155_vrfs.py deleted file mode 100644 index 4d7a927..0000000 --- a/startup_scripts/155_vrfs.py +++ /dev/null @@ -1,47 +0,0 @@ -from ipam.models import VRF -from tenancy.models import Tenant -from ruamel.yaml import YAML -from extras.models import CustomField, CustomFieldValue - -from pathlib import Path -import sys - -file = Path('/opt/netbox/initializers/vrfs.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - vrfs = yaml.load(stream) - - optional_assocs = { - 'tenant': (Tenant, 'name') - } - - if vrfs is not None: - for params in vrfs: - custom_fields = params.pop('custom_fields', None) - - 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) - - vrf, created = VRF.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=vrf, - value=cf_value - ) - - vrf.custom_field_values.add(custom_field_value) - - print("Created VRF", vrf.name) - diff --git a/startup_scripts/160_aggregates.py b/startup_scripts/160_aggregates.py new file mode 100644 index 0000000..f932709 --- /dev/null +++ b/startup_scripts/160_aggregates.py @@ -0,0 +1,46 @@ +from ipam.models import Aggregate, RIR +from ruamel.yaml import YAML +from extras.models import CustomField, CustomFieldValue + +from netaddr import IPNetwork +from pathlib import Path +import sys + +file = Path('/opt/netbox/initializers/aggregates.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + aggregates = yaml.load(stream) + + required_assocs = { + 'rir': (RIR, 'name') + } + + if aggregates is not None: + for params in aggregates: + custom_fields = params.pop('custom_fields', None) + params['prefix'] = IPNetwork(params['prefix']) + + for assoc, details in required_assocs.items(): + model, field = details + query = { field: params.pop(assoc) } + + params[assoc] = model.objects.get(**query) + + aggregate, created = Aggregate.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=aggregate, + value=cf_value + ) + + aggregate.custom_field_values.add(custom_field_value) + + print("πŸ—žοΈ Created Aggregate", aggregate.prefix) diff --git a/startup_scripts/160_prefix_vlan_roles.py b/startup_scripts/160_prefix_vlan_roles.py deleted file mode 100644 index 6a460bd..0000000 --- a/startup_scripts/160_prefix_vlan_roles.py +++ /dev/null @@ -1,19 +0,0 @@ -from ipam.models import Role -from ruamel.yaml import YAML -from pathlib import Path -import sys - -file = Path('/opt/netbox/initializers/prefix_vlan_roles.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - roles = yaml.load(stream) - - if roles is not None: - for params in roles: - role, created = Role.objects.get_or_create(**params) - - if created: - print("Created Prefix/VLAN Role", role.name) diff --git a/startup_scripts/170_clusters.py b/startup_scripts/170_clusters.py new file mode 100644 index 0000000..597f73f --- /dev/null +++ b/startup_scripts/170_clusters.py @@ -0,0 +1,57 @@ +from dcim.models import Site +from virtualization.models import Cluster, ClusterType, ClusterGroup +from extras.models import CustomField, CustomFieldValue +from ruamel.yaml import YAML + +from pathlib import Path +import sys + +file = Path('/opt/netbox/initializers/clusters.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + clusters = yaml.load(stream) + + required_assocs = { + 'type': (ClusterType, 'name') + } + + optional_assocs = { + 'site': (Site, 'name'), + 'group': (ClusterGroup, 'name') + } + + if clusters is not None: + for params in clusters: + 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) + + cluster, created = Cluster.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=cluster, + value=cf_value + ) + + cluster.custom_field_values.add(custom_field_value) + + print("πŸ—„οΈ Created cluster", cluster.name) diff --git a/startup_scripts/170_vlan_groups.py b/startup_scripts/170_vlan_groups.py deleted file mode 100644 index 06673dd..0000000 --- a/startup_scripts/170_vlan_groups.py +++ /dev/null @@ -1,46 +0,0 @@ -from dcim.models import Site -from ipam.models import VLANGroup -from extras.models import CustomField, CustomFieldValue -from ruamel.yaml import YAML - -from pathlib import Path -import sys - -file = Path('/opt/netbox/initializers/vlan_groups.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - vlan_groups = yaml.load(stream) - - optional_assocs = { - 'site': (Site, 'name') - } - - if vlan_groups is not None: - for params in vlan_groups: - custom_fields = params.pop('custom_fields', None) - - 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) - - vlan_group, created = VLANGroup.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=vlan_group, - value=cf_value - ) - - vlan_group.custom_field_values.add(custom_field_value) - - print("Created VLAN Group", vlan_group.name) diff --git a/startup_scripts/180_vlans.py b/startup_scripts/180_vlans.py deleted file mode 100644 index 12f2cd1..0000000 --- a/startup_scripts/180_vlans.py +++ /dev/null @@ -1,50 +0,0 @@ -from dcim.models import Site -from ipam.models import VLAN, VLANGroup, Role -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/vlans.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - vlans = yaml.load(stream) - - optional_assocs = { - 'site': (Site, 'name'), - 'tenant': (Tenant, 'name'), - 'group': (VLANGroup, 'name'), - 'role': (Role, 'name') - } - - if vlans is not None: - for params in vlans: - custom_fields = params.pop('custom_fields', None) - - 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) - - vlan, created = VLAN.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=vlan, - value=cf_value - ) - - vlan.custom_field_values.add(custom_field_value) - - print("Created VLAN", vlan.name) diff --git a/startup_scripts/180_vrfs.py b/startup_scripts/180_vrfs.py new file mode 100644 index 0000000..d611c04 --- /dev/null +++ b/startup_scripts/180_vrfs.py @@ -0,0 +1,46 @@ +from ipam.models import VRF +from tenancy.models import Tenant +from ruamel.yaml import YAML +from extras.models import CustomField, CustomFieldValue + +from pathlib import Path +import sys + +file = Path('/opt/netbox/initializers/vrfs.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + vrfs = yaml.load(stream) + + optional_assocs = { + 'tenant': (Tenant, 'name') + } + + if vrfs is not None: + for params in vrfs: + custom_fields = params.pop('custom_fields', None) + + 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) + + vrf, created = VRF.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=vrf, + value=cf_value + ) + + vrf.custom_field_values.add(custom_field_value) + + print("πŸ“¦ Created VRF", vrf.name) diff --git a/startup_scripts/190_prefix_vlan_roles.py b/startup_scripts/190_prefix_vlan_roles.py new file mode 100644 index 0000000..61fa606 --- /dev/null +++ b/startup_scripts/190_prefix_vlan_roles.py @@ -0,0 +1,19 @@ +from ipam.models import Role +from ruamel.yaml import YAML +from pathlib import Path +import sys + +file = Path('/opt/netbox/initializers/prefix_vlan_roles.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + roles = yaml.load(stream) + + if roles is not None: + for params in roles: + role, created = Role.objects.get_or_create(**params) + + if created: + print("⛹️‍ Created Prefix/VLAN Role", role.name) diff --git a/startup_scripts/190_prefixes.py b/startup_scripts/190_prefixes.py deleted file mode 100644 index 208feb8..0000000 --- a/startup_scripts/190_prefixes.py +++ /dev/null @@ -1,53 +0,0 @@ -from dcim.models import Site -from ipam.models import Prefix, VLAN, Role, VRF -from tenancy.models import Tenant -from extras.models import CustomField, CustomFieldValue -from ruamel.yaml import YAML - -from netaddr import IPNetwork -from pathlib import Path -import sys - -file = Path('/opt/netbox/initializers/prefixes.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - prefixes = yaml.load(stream) - - optional_assocs = { - 'site': (Site, 'name'), - 'tenant': (Tenant, 'name'), - 'vlan': (VLAN, 'name'), - 'role': (Role, 'name'), - 'vrf': (VRF, 'name') - } - - if prefixes is not None: - for params in prefixes: - custom_fields = params.pop('custom_fields', None) - params['prefix'] = IPNetwork(params['prefix']) - - 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) - - prefix, created = Prefix.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=prefix, - value=cf_value - ) - - prefix.custom_field_values.add(custom_field_value) - - print("Created Prefix", prefix.prefix) diff --git a/startup_scripts/200_virtual_machines.py b/startup_scripts/200_virtual_machines.py deleted file mode 100644 index 8845819..0000000 --- a/startup_scripts/200_virtual_machines.py +++ /dev/null @@ -1,59 +0,0 @@ -from dcim.models import Site, Platform, DeviceRole -from virtualization.models import Cluster, VirtualMachine -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/virtual_machines.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - virtual_machines = yaml.load(stream) - - required_assocs = { - 'cluster': (Cluster, 'name') - } - - optional_assocs = { - 'tenant': (Tenant, 'name'), - 'platform': (Platform, 'name'), - 'role': (DeviceRole, 'name') - } - - if virtual_machines is not None: - for params in virtual_machines: - 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) - - virtual_machine, created = VirtualMachine.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=virtual_machine, - value=cf_value - ) - - virtual_machine.custom_field_values.add(custom_field_value) - - print("Created virtual machine", virtual_machine.name) diff --git a/startup_scripts/200_vlan_groups.py b/startup_scripts/200_vlan_groups.py new file mode 100644 index 0000000..54250fb --- /dev/null +++ b/startup_scripts/200_vlan_groups.py @@ -0,0 +1,46 @@ +from dcim.models import Site +from ipam.models import VLANGroup +from extras.models import CustomField, CustomFieldValue +from ruamel.yaml import YAML + +from pathlib import Path +import sys + +file = Path('/opt/netbox/initializers/vlan_groups.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + vlan_groups = yaml.load(stream) + + optional_assocs = { + 'site': (Site, 'name') + } + + if vlan_groups is not None: + for params in vlan_groups: + custom_fields = params.pop('custom_fields', None) + + 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) + + vlan_group, created = VLANGroup.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=vlan_group, + value=cf_value + ) + + vlan_group.custom_field_values.add(custom_field_value) + + print("🏘️ Created VLAN Group", vlan_group.name) diff --git a/startup_scripts/210_virtualization_interfaces.py b/startup_scripts/210_virtualization_interfaces.py deleted file mode 100644 index f76f876..0000000 --- a/startup_scripts/210_virtualization_interfaces.py +++ /dev/null @@ -1,47 +0,0 @@ -from dcim.models import Interface -from virtualization.models import VirtualMachine -from extras.models import CustomField, CustomFieldValue -from ruamel.yaml import YAML - -from pathlib import Path -import sys - -file = Path('/opt/netbox/initializers/virtualization_interfaces.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - interfaces = yaml.load(stream) - - optional_assocs = { - 'virtual_machine': (VirtualMachine, 'name') - } - - if interfaces is not None: - for params in interfaces: - custom_fields = params.pop('custom_fields', None) - - 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) - - interface, created = Interface.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=interface, - value=cf_value - ) - - interface.custom_field_values.add(custom_field_value) - - print("Created interface", interface.name, interface.virtual_machine.name) - diff --git a/startup_scripts/210_vlans.py b/startup_scripts/210_vlans.py new file mode 100644 index 0000000..ab6bd2b --- /dev/null +++ b/startup_scripts/210_vlans.py @@ -0,0 +1,51 @@ +from dcim.models import Site +from ipam.models import VLAN, VLANGroup, Role +from tenancy.models import Tenant, TenantGroup +from extras.models import CustomField, CustomFieldValue +from ruamel.yaml import YAML + +from pathlib import Path +import sys + +file = Path('/opt/netbox/initializers/vlans.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + vlans = yaml.load(stream) + + optional_assocs = { + 'site': (Site, 'name'), + 'tenant': (Tenant, 'name'), + 'tenant_group': (TenantGroup, 'name'), + 'group': (VLANGroup, 'name'), + 'role': (Role, 'name') + } + + if vlans is not None: + for params in vlans: + custom_fields = params.pop('custom_fields', None) + + 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) + + vlan, created = VLAN.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=vlan, + value=cf_value + ) + + vlan.custom_field_values.add(custom_field_value) + + print("🏠 Created VLAN", vlan.name) diff --git a/startup_scripts/215_dcim_interfaces.py b/startup_scripts/215_dcim_interfaces.py deleted file mode 100644 index 38b9f61..0000000 --- a/startup_scripts/215_dcim_interfaces.py +++ /dev/null @@ -1,46 +0,0 @@ -from dcim.models import Interface, Device -from extras.models import CustomField, CustomFieldValue -from ruamel.yaml import YAML - -from pathlib import Path -import sys - -file = Path('/opt/netbox/initializers/dcim_interfaces.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - interfaces = yaml.load(stream) - - optional_assocs = { - 'device': (Device, 'name') - } - - if interfaces is not None: - for params in interfaces: - custom_fields = params.pop('custom_fields', None) - - 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) - - interface, created = Interface.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=interface, - value=cf_value - ) - - interface.custom_field_values.add(custom_field_value) - - print("Created interface", interface.name, interface.device.name) - diff --git a/startup_scripts/220_ip_addresses.py b/startup_scripts/220_ip_addresses.py deleted file mode 100644 index 2310a2a..0000000 --- a/startup_scripts/220_ip_addresses.py +++ /dev/null @@ -1,61 +0,0 @@ -from ipam.models import IPAddress, VRF -from dcim.models import Device, Interface -from virtualization.models import VirtualMachine -from tenancy.models import Tenant -from extras.models import CustomField, CustomFieldValue -from ruamel.yaml import YAML - -from netaddr import IPNetwork -from pathlib import Path -import sys - -file = Path('/opt/netbox/initializers/ip_addresses.yml') -if not file.is_file(): - sys.exit() - -with file.open('r') as stream: - yaml = YAML(typ='safe') - ip_addresses = yaml.load(stream) - - optional_assocs = { - 'tenant': (Tenant, 'name'), - 'vrf': (VRF, 'name'), - 'interface': (Interface, 'name') - } - - if ip_addresses is not None: - for params in ip_addresses: - vm = params.pop('virtual_machine', None) - device = params.pop('device', None) - custom_fields = params.pop('custom_fields', None) - params['address'] = IPNetwork(params['address']) - - for assoc, details in optional_assocs.items(): - if assoc in params: - model, field = details - if assoc == 'interface': - if vm: - vm_id = VirtualMachine.objects.get(name=vm).id - query = { field: params.pop(assoc), "virtual_machine_id": vm_id } - elif device: - dev_id = Device.objects.get(name=device).id - query = { field: params.pop(assoc), "device_id": dev_id } - else: - query = { field: params.pop(assoc) } - params[assoc] = model.objects.get(**query) - - ip_address, created = IPAddress.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=ip_address, - value=cf_value - ) - - ip_address.custom_field_values.add(custom_field_value) - - print("Created IP Address", ip_address.address) diff --git a/startup_scripts/220_prefixes.py b/startup_scripts/220_prefixes.py new file mode 100644 index 0000000..d13578a --- /dev/null +++ b/startup_scripts/220_prefixes.py @@ -0,0 +1,54 @@ +from dcim.models import Site +from ipam.models import Prefix, VLAN, Role, VRF +from tenancy.models import Tenant, TenantGroup +from extras.models import CustomField, CustomFieldValue +from ruamel.yaml import YAML + +from netaddr import IPNetwork +from pathlib import Path +import sys + +file = Path('/opt/netbox/initializers/prefixes.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + prefixes = yaml.load(stream) + + optional_assocs = { + 'site': (Site, 'name'), + 'tenant': (Tenant, 'name'), + 'tenant_group': (TenantGroup, 'name'), + 'vlan': (VLAN, 'name'), + 'role': (Role, 'name'), + 'vrf': (VRF, 'name') + } + + if prefixes is not None: + for params in prefixes: + custom_fields = params.pop('custom_fields', None) + params['prefix'] = IPNetwork(params['prefix']) + + 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) + + prefix, created = Prefix.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=prefix, + value=cf_value + ) + + prefix.custom_field_values.add(custom_field_value) + + print("πŸ“Œ Created Prefix", prefix.prefix) diff --git a/startup_scripts/230_virtual_machines.py b/startup_scripts/230_virtual_machines.py new file mode 100644 index 0000000..449df8a --- /dev/null +++ b/startup_scripts/230_virtual_machines.py @@ -0,0 +1,59 @@ +from dcim.models import Site, Platform, DeviceRole +from virtualization.models import Cluster, VirtualMachine +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/virtual_machines.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + virtual_machines = yaml.load(stream) + + required_assocs = { + 'cluster': (Cluster, 'name') + } + + optional_assocs = { + 'tenant': (Tenant, 'name'), + 'platform': (Platform, 'name'), + 'role': (DeviceRole, 'name') + } + + if virtual_machines is not None: + for params in virtual_machines: + 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) + + virtual_machine, created = VirtualMachine.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=virtual_machine, + value=cf_value + ) + + virtual_machine.custom_field_values.add(custom_field_value) + + print("πŸ–₯️ Created virtual machine", virtual_machine.name) diff --git a/startup_scripts/240_virtualization_interfaces.py b/startup_scripts/240_virtualization_interfaces.py new file mode 100644 index 0000000..e1c2b8d --- /dev/null +++ b/startup_scripts/240_virtualization_interfaces.py @@ -0,0 +1,46 @@ +from dcim.models import Interface +from virtualization.models import VirtualMachine +from extras.models import CustomField, CustomFieldValue +from ruamel.yaml import YAML + +from pathlib import Path +import sys + +file = Path('/opt/netbox/initializers/virtualization_interfaces.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + interfaces = yaml.load(stream) + + optional_assocs = { + 'virtual_machine': (VirtualMachine, 'name') + } + + if interfaces is not None: + for params in interfaces: + custom_fields = params.pop('custom_fields', None) + + 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) + + interface, created = Interface.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=interface, + value=cf_value + ) + + interface.custom_field_values.add(custom_field_value) + + print("🧷 Created interface", interface.name, interface.virtual_machine.name) diff --git a/startup_scripts/250_dcim_interfaces.py b/startup_scripts/250_dcim_interfaces.py new file mode 100644 index 0000000..eca5415 --- /dev/null +++ b/startup_scripts/250_dcim_interfaces.py @@ -0,0 +1,46 @@ +from dcim.models import Interface, Device +from extras.models import CustomField, CustomFieldValue +from ruamel.yaml import YAML + +from pathlib import Path +import sys + +file = Path('/opt/netbox/initializers/dcim_interfaces.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + interfaces = yaml.load(stream) + + optional_assocs = { + 'device': (Device, 'name') + } + + if interfaces is not None: + for params in interfaces: + custom_fields = params.pop('custom_fields', None) + + 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) + + interface, created = Interface.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=interface, + value=cf_value + ) + + interface.custom_field_values.add(custom_field_value) + + print("🧷 Created interface", interface.name, interface.device.name) + diff --git a/startup_scripts/260_ip_addresses.py b/startup_scripts/260_ip_addresses.py new file mode 100644 index 0000000..13c755d --- /dev/null +++ b/startup_scripts/260_ip_addresses.py @@ -0,0 +1,61 @@ +from ipam.models import IPAddress, VRF +from dcim.models import Device, Interface +from virtualization.models import VirtualMachine +from tenancy.models import Tenant +from extras.models import CustomField, CustomFieldValue +from ruamel.yaml import YAML + +from netaddr import IPNetwork +from pathlib import Path +import sys + +file = Path('/opt/netbox/initializers/ip_addresses.yml') +if not file.is_file(): + sys.exit() + +with file.open('r') as stream: + yaml = YAML(typ='safe') + ip_addresses = yaml.load(stream) + + optional_assocs = { + 'tenant': (Tenant, 'name'), + 'vrf': (VRF, 'name'), + 'interface': (Interface, 'name') + } + + if ip_addresses is not None: + for params in ip_addresses: + vm = params.pop('virtual_machine', None) + device = params.pop('device', None) + custom_fields = params.pop('custom_fields', None) + params['address'] = IPNetwork(params['address']) + + for assoc, details in optional_assocs.items(): + if assoc in params: + model, field = details + if assoc == 'interface': + if vm: + vm_id = VirtualMachine.objects.get(name=vm).id + query = { field: params.pop(assoc), "virtual_machine_id": vm_id } + elif device: + dev_id = Device.objects.get(name=device).id + query = { field: params.pop(assoc), "device_id": dev_id } + else: + query = { field: params.pop(assoc) } + params[assoc] = model.objects.get(**query) + + ip_address, created = IPAddress.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=ip_address, + value=cf_value + ) + + ip_address.custom_field_values.add(custom_field_value) + + print("🧬 Created IP Address", ip_address.address)