From 7f8cc76af6aafd9dabcae1a428b5883ec84a41ba Mon Sep 17 00:00:00 2001 From: Schylar Utley Date: Fri, 15 Jan 2021 23:33:19 -0600 Subject: [PATCH 1/2] address issue #365 --- startup_scripts/{140_cluster_types.py => 130_cluster_types.py} | 0 startup_scripts/{170_clusters.py => 135_clusters.py} | 0 startup_scripts/{130_devices.py => 140_devices.py} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename startup_scripts/{140_cluster_types.py => 130_cluster_types.py} (100%) rename startup_scripts/{170_clusters.py => 135_clusters.py} (100%) rename startup_scripts/{130_devices.py => 140_devices.py} (100%) diff --git a/startup_scripts/140_cluster_types.py b/startup_scripts/130_cluster_types.py similarity index 100% rename from startup_scripts/140_cluster_types.py rename to startup_scripts/130_cluster_types.py diff --git a/startup_scripts/170_clusters.py b/startup_scripts/135_clusters.py similarity index 100% rename from startup_scripts/170_clusters.py rename to startup_scripts/135_clusters.py diff --git a/startup_scripts/130_devices.py b/startup_scripts/140_devices.py similarity index 100% rename from startup_scripts/130_devices.py rename to startup_scripts/140_devices.py From a0f7737916d54933969dff05e0fed7074b4a3e89 Mon Sep 17 00:00:00 2001 From: Schylar Utley Date: Tue, 19 Jan 2021 23:19:09 -0600 Subject: [PATCH 2/2] rebase and fix script order --- startup_scripts/135_cluster_groups.py | 14 ++++++++ startup_scripts/140_clusters.py | 44 +++++++++++++++++++++++ startup_scripts/145_devices.py | 51 +++++++++++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 startup_scripts/135_cluster_groups.py create mode 100644 startup_scripts/140_clusters.py create mode 100644 startup_scripts/145_devices.py diff --git a/startup_scripts/135_cluster_groups.py b/startup_scripts/135_cluster_groups.py new file mode 100644 index 0000000..b52518a --- /dev/null +++ b/startup_scripts/135_cluster_groups.py @@ -0,0 +1,14 @@ +from virtualization.models import ClusterGroup +from startup_script_utils import load_yaml +import sys + +cluster_groups = load_yaml('/opt/netbox/initializers/cluster_groups.yml') + +if cluster_groups is None: + sys.exit() + +for params in cluster_groups: + cluster_group, created = ClusterGroup.objects.get_or_create(**params) + + if created: + print("🗄️ Created Cluster Group", cluster_group.name) diff --git a/startup_scripts/140_clusters.py b/startup_scripts/140_clusters.py new file mode 100644 index 0000000..85e462f --- /dev/null +++ b/startup_scripts/140_clusters.py @@ -0,0 +1,44 @@ +import sys + +from dcim.models import Site +from startup_script_utils import * +from virtualization.models import Cluster, ClusterType, ClusterGroup +from tenancy.models import Tenant + +clusters = load_yaml('/opt/netbox/initializers/clusters.yml') + +if clusters is None: + sys.exit() + +required_assocs = { + 'type': (ClusterType, 'name') +} + +optional_assocs = { + 'site': (Site, 'name'), + 'group': (ClusterGroup, 'name'), + 'tenant': (Tenant, 'name') +} + +for params in clusters: + custom_field_data = pop_custom_fields(params) + + 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: + set_custom_fields_values(cluster, custom_field_data) + + print("🗄️ Created cluster", cluster.name) diff --git a/startup_scripts/145_devices.py b/startup_scripts/145_devices.py new file mode 100644 index 0000000..d73fd07 --- /dev/null +++ b/startup_scripts/145_devices.py @@ -0,0 +1,51 @@ +import sys + +from dcim.models import Site, Rack, DeviceRole, DeviceType, Device, Platform +from startup_script_utils import * +from tenancy.models import Tenant +from virtualization.models import Cluster + +devices = load_yaml('/opt/netbox/initializers/devices.yml') + +if devices is None: + sys.exit() + +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') +} + +for params in devices: + custom_field_data = pop_custom_fields(params) + + # 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(): + 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) + + device, created = Device.objects.get_or_create(**params) + + if created: + set_custom_fields_values(device, custom_field_data) + + print("🖥️ Created device", device.name)