From 4cb5b9f20da270e84d9748b9576200a92d844e6b Mon Sep 17 00:00:00 2001 From: Alvaro Arriola Date: Thu, 4 Jul 2019 14:10:56 +0200 Subject: [PATCH] Added more startup_scripts and initializers examples. --- initializers/aggregates.yml | 2 + initializers/cluster_types.yml | 2 + initializers/clusters.yml | 2 + initializers/dcim_interfaces.yml | 12 ++++ initializers/ip_addresses.yml | 18 ++++++ initializers/prefixes.yml | 12 ++++ initializers/rirs.yml | 3 + initializers/tenants.yml | 4 ++ initializers/virtual_machines.yml | 9 +++ initializers/virtualization_interfaces.yml | 14 +++++ initializers/vlan_groups.yml | 6 ++ initializers/vlans.yml | 9 +++ initializers/vrfs.yml | 5 ++ startup_scripts/104_tenant_groups.py | 19 ++++++ startup_scripts/105_tenants.py | 45 ++++++++++++++ startup_scripts/120_cluster_types.py | 19 ++++++ startup_scripts/125_rirs.py | 19 ++++++ startup_scripts/130_aggregates.py | 47 ++++++++++++++ startup_scripts/150_clusters.py | 57 +++++++++++++++++ startup_scripts/155_vrfs.py | 47 ++++++++++++++ startup_scripts/160_prefix_vlan_roles.py | 19 ++++++ startup_scripts/170_vlan_groups.py | 46 ++++++++++++++ startup_scripts/180_vlans.py | 50 +++++++++++++++ startup_scripts/190_prefixes.py | 53 ++++++++++++++++ startup_scripts/200_virtual_machines.py | 59 ++++++++++++++++++ .../210_virtualization_interfaces.py | 47 ++++++++++++++ startup_scripts/215_dcim_interfaces.py | 46 ++++++++++++++ startup_scripts/220_ip_addresses.py | 61 +++++++++++++++++++ 28 files changed, 732 insertions(+) create mode 100644 initializers/aggregates.yml create mode 100644 initializers/cluster_types.yml create mode 100644 initializers/clusters.yml create mode 100644 initializers/dcim_interfaces.yml create mode 100644 initializers/ip_addresses.yml create mode 100644 initializers/prefixes.yml create mode 100644 initializers/rirs.yml create mode 100644 initializers/tenants.yml create mode 100644 initializers/virtual_machines.yml create mode 100644 initializers/virtualization_interfaces.yml create mode 100644 initializers/vlan_groups.yml create mode 100644 initializers/vlans.yml create mode 100644 initializers/vrfs.yml create mode 100644 startup_scripts/104_tenant_groups.py create mode 100644 startup_scripts/105_tenants.py create mode 100644 startup_scripts/120_cluster_types.py create mode 100644 startup_scripts/125_rirs.py create mode 100644 startup_scripts/130_aggregates.py create mode 100644 startup_scripts/150_clusters.py create mode 100644 startup_scripts/155_vrfs.py create mode 100644 startup_scripts/160_prefix_vlan_roles.py create mode 100644 startup_scripts/170_vlan_groups.py create mode 100644 startup_scripts/180_vlans.py create mode 100644 startup_scripts/190_prefixes.py create mode 100644 startup_scripts/200_virtual_machines.py create mode 100644 startup_scripts/210_virtualization_interfaces.py create mode 100644 startup_scripts/215_dcim_interfaces.py create mode 100644 startup_scripts/220_ip_addresses.py diff --git a/initializers/aggregates.yml b/initializers/aggregates.yml new file mode 100644 index 0000000..8e73070 --- /dev/null +++ b/initializers/aggregates.yml @@ -0,0 +1,2 @@ +#- prefix: 10.0.0.0/16 +# rir: RFC1918 diff --git a/initializers/cluster_types.yml b/initializers/cluster_types.yml new file mode 100644 index 0000000..03365ae --- /dev/null +++ b/initializers/cluster_types.yml @@ -0,0 +1,2 @@ +#- name: Hyper-V +# slug: hyper-v diff --git a/initializers/clusters.yml b/initializers/clusters.yml new file mode 100644 index 0000000..6eff3d0 --- /dev/null +++ b/initializers/clusters.yml @@ -0,0 +1,2 @@ +#- name: cluster1 +# type: Hyper-V diff --git a/initializers/dcim_interfaces.yml b/initializers/dcim_interfaces.yml new file mode 100644 index 0000000..12ddbad --- /dev/null +++ b/initializers/dcim_interfaces.yml @@ -0,0 +1,12 @@ +#- device: router1 +# enabled: true +# form_factor: 0 +# name: router2 +#- device: 9901-2.bwi-stf.lab +# enabled: true +# form_factor: 0 +# name: Loopback0 +#- device: switch1 +# enabled: true +# form_factor: 0 +# name: Vlan5 diff --git a/initializers/ip_addresses.yml b/initializers/ip_addresses.yml new file mode 100644 index 0000000..445dd9c --- /dev/null +++ b/initializers/ip_addresses.yml @@ -0,0 +1,18 @@ + +#- address: 10.1.1.1/24 +# device: router1 +# family: 4 +# interface: Loopback0 +# status: 1 +# vrf: vrf1 +#- address: 10.1.1.2/24 +# device: switch1 +# family: 4 +# interface: Vlan5 +# status: 1 +#- address: 10.1.1.10/24 +# description: reserved IP +# family: 4 +# status: 2 +# tenant: tenant1 + diff --git a/initializers/prefixes.yml b/initializers/prefixes.yml new file mode 100644 index 0000000..2aeb74f --- /dev/null +++ b/initializers/prefixes.yml @@ -0,0 +1,12 @@ +#- description: prefix1 +# prefix: 10.1.1.0/24 +# site: AMS 1 +# status: 1 +# tenant: tenant1 +# vlan: vlan1 +#- description: prefix2 +# prefix: 10.1.2.0/24 +# site: AMS 2 +# status: 1 +# tenant: tenant2 +# vlan: vlan2 \ No newline at end of file diff --git a/initializers/rirs.yml b/initializers/rirs.yml new file mode 100644 index 0000000..f819c40 --- /dev/null +++ b/initializers/rirs.yml @@ -0,0 +1,3 @@ +#- is_private: true +# name: RFC1918 +# slug: rfc1918 diff --git a/initializers/tenants.yml b/initializers/tenants.yml new file mode 100644 index 0000000..2af9953 --- /dev/null +++ b/initializers/tenants.yml @@ -0,0 +1,4 @@ +#- name: tenant1 +# slug: tenant1 +#- name: tenant2 +# slug: tenant2 diff --git a/initializers/virtual_machines.yml b/initializers/virtual_machines.yml new file mode 100644 index 0000000..23536bc --- /dev/null +++ b/initializers/virtual_machines.yml @@ -0,0 +1,9 @@ +#- cluster: cluster1 +# comments: VM1 +# disk: 200 +# memory: 4096 +# name: virtual machine 1 +# platform: Platform 2 +# status: 1 +# tenant: tenant1 +# vcpus: 8 \ No newline at end of file diff --git a/initializers/virtualization_interfaces.yml b/initializers/virtualization_interfaces.yml new file mode 100644 index 0000000..000613f --- /dev/null +++ b/initializers/virtualization_interfaces.yml @@ -0,0 +1,14 @@ +#- 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 +# virtual_machine: virtual_machine1 \ No newline at end of file diff --git a/initializers/vlan_groups.yml b/initializers/vlan_groups.yml new file mode 100644 index 0000000..11a48fc --- /dev/null +++ b/initializers/vlan_groups.yml @@ -0,0 +1,6 @@ +#- name: VLAN group 1 +# site: AMS 1 +# slug: vlan-group-2 +#- name: VLAN group 2 +# site: AMS 1 +# slug: vlan-group-2 diff --git a/initializers/vlans.yml b/initializers/vlans.yml new file mode 100644 index 0000000..8591192 --- /dev/null +++ b/initializers/vlans.yml @@ -0,0 +1,9 @@ +#- name: vlan1 +# site: AMS 1 +# status: 1 +# vid: 5 +#- group: VLAN group 2 +# name: vlan2 +# site: AMS 1 +# status: 1 +# vid: 1300 \ No newline at end of file diff --git a/initializers/vrfs.yml b/initializers/vrfs.yml new file mode 100644 index 0000000..7d9ba85 --- /dev/null +++ b/initializers/vrfs.yml @@ -0,0 +1,5 @@ +#- enforce_unique: true +# name: vrf1 +# tenant: tenant1 +#- enforce_unique: true +# name: vrf2 diff --git a/startup_scripts/104_tenant_groups.py b/startup_scripts/104_tenant_groups.py new file mode 100644 index 0000000..94c58ad --- /dev/null +++ b/startup_scripts/104_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/105_tenants.py b/startup_scripts/105_tenants.py new file mode 100644 index 0000000..8ae8ea8 --- /dev/null +++ b/startup_scripts/105_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/120_cluster_types.py b/startup_scripts/120_cluster_types.py new file mode 100644 index 0000000..5211ea5 --- /dev/null +++ b/startup_scripts/120_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/125_rirs.py b/startup_scripts/125_rirs.py new file mode 100644 index 0000000..d120545 --- /dev/null +++ b/startup_scripts/125_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/130_aggregates.py b/startup_scripts/130_aggregates.py new file mode 100644 index 0000000..c82aa95 --- /dev/null +++ b/startup_scripts/130_aggregates.py @@ -0,0 +1,47 @@ +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/150_clusters.py b/startup_scripts/150_clusters.py new file mode 100644 index 0000000..bc8a268 --- /dev/null +++ b/startup_scripts/150_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/155_vrfs.py b/startup_scripts/155_vrfs.py new file mode 100644 index 0000000..4d7a927 --- /dev/null +++ b/startup_scripts/155_vrfs.py @@ -0,0 +1,47 @@ +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_prefix_vlan_roles.py b/startup_scripts/160_prefix_vlan_roles.py new file mode 100644 index 0000000..6a460bd --- /dev/null +++ b/startup_scripts/160_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/170_vlan_groups.py b/startup_scripts/170_vlan_groups.py new file mode 100644 index 0000000..06673dd --- /dev/null +++ b/startup_scripts/170_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/180_vlans.py b/startup_scripts/180_vlans.py new file mode 100644 index 0000000..12f2cd1 --- /dev/null +++ b/startup_scripts/180_vlans.py @@ -0,0 +1,50 @@ +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/190_prefixes.py b/startup_scripts/190_prefixes.py new file mode 100644 index 0000000..208feb8 --- /dev/null +++ b/startup_scripts/190_prefixes.py @@ -0,0 +1,53 @@ +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 new file mode 100644 index 0000000..8845819 --- /dev/null +++ b/startup_scripts/200_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/210_virtualization_interfaces.py b/startup_scripts/210_virtualization_interfaces.py new file mode 100644 index 0000000..f76f876 --- /dev/null +++ b/startup_scripts/210_virtualization_interfaces.py @@ -0,0 +1,47 @@ +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/215_dcim_interfaces.py b/startup_scripts/215_dcim_interfaces.py new file mode 100644 index 0000000..38b9f61 --- /dev/null +++ b/startup_scripts/215_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/220_ip_addresses.py b/startup_scripts/220_ip_addresses.py new file mode 100644 index 0000000..2310a2a --- /dev/null +++ b/startup_scripts/220_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)