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/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/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/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/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 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)