From 2067b02202b8e46999a44b3d7721eba26f35e8a2 Mon Sep 17 00:00:00 2001 From: Tobias Genannt Date: Mon, 15 Apr 2024 11:01:38 +0200 Subject: [PATCH] Prepare for Netbox 4.0 --- README.md | 6 +++--- pyproject.toml | 2 +- src/netbox_initializers/__init__.py | 6 +++--- src/netbox_initializers/initializers/__init__.py | 8 ++++---- .../initializers/custom_fields.py | 6 +++--- .../initializers/custom_links.py | 8 ++++---- .../initializers/device_roles.py | 2 +- src/netbox_initializers/initializers/devices.py | 2 +- src/netbox_initializers/initializers/groups.py | 8 ++++---- .../initializers/object_permissions.py | 14 +++++++------- src/netbox_initializers/initializers/rack_roles.py | 2 +- src/netbox_initializers/initializers/tags.py | 6 +++--- src/netbox_initializers/initializers/users.py | 8 +++----- .../initializers/yaml/devices.yml | 10 +++++----- test/Dockerfile | 2 +- test/env/netbox.env | 1 + 16 files changed, 45 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 80b7b37..e4e1841 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Load data from YAML files into Netbox First activate your virtual environment where Netbox is installed, the install the plugin version correspondig to your Netbox version. ```bash -pip install "netbox-initializers==3.7.*" +pip install "netbox-initializers==4.0.*" ``` Then you need to add the plugin to the `PLUGINS` array in the Netbox configuration. ```python @@ -36,6 +36,6 @@ The initializers where a part of the Docker image and where then extracted into To use the new plugin in a the Netbox Docker image, it musst be installad into the image. To this, the following example can be used as a starting point: ```dockerfile -FROM netboxcommunity/netbox:v3.7 -RUN /opt/netbox/venv/bin/pip install "netbox-initializers==3.7.*" +FROM netboxcommunity/netbox:v4.0 +RUN /opt/netbox/venv/bin/pip install "netbox-initializers==4.0.*" ``` diff --git a/pyproject.toml b/pyproject.toml index 89e8703..de16a09 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ license = "Apache-2.0" name = "netbox-initializers" readme = "README.md" repository = "https://github.com/tobiasge/netbox-initializers" -version = "3.7.2" +version = "4.0.0" [tool.poetry.dependencies] python = "^3.8" diff --git a/src/netbox_initializers/__init__.py b/src/netbox_initializers/__init__.py index aab7519..2099aa0 100644 --- a/src/netbox_initializers/__init__.py +++ b/src/netbox_initializers/__init__.py @@ -5,10 +5,10 @@ class NetBoxInitializersConfig(PluginConfig): name = "netbox_initializers" verbose_name = "NetBox Initializers" description = "Load initial data into Netbox" - version = "3.7.2" + version = "4.0.0" base_url = "initializers" - min_version = "3.7.0" - max_version = "3.7.99" + min_version = "4.0-beta1" + max_version = "4.0.99" config = NetBoxInitializersConfig diff --git a/src/netbox_initializers/initializers/__init__.py b/src/netbox_initializers/initializers/__init__.py index 1133e62..b7a2499 100644 --- a/src/netbox_initializers/initializers/__init__.py +++ b/src/netbox_initializers/initializers/__init__.py @@ -1,7 +1,7 @@ from pathlib import Path from typing import Tuple -from django.contrib.contenttypes.models import ContentType +from core.models import ObjectType from django.core.exceptions import ObjectDoesNotExist from extras.models import CustomField, Tag from ruamel.yaml import YAML @@ -105,8 +105,8 @@ def set_custom_fields_values(self, entity, custom_field_data): except ObjectDoesNotExist: missing_cfs.append(key) else: - ct = ContentType.objects.get_for_model(entity) - if ct not in cf.content_types.all(): + ct = ObjectType.objects.get_for_model(entity) + if ct not in cf.object_types.all(): print( f"⚠️ Custom field {key} is not enabled for {entity}'s model!" "Please check the 'on_objects' for that custom field in custom_fields.yml" @@ -131,7 +131,7 @@ def set_tags(self, entity, tags): if not hasattr(entity, "tags"): raise Exception(f"⚠️ Tags cannot be applied to {entity}'s model") - ct = ContentType.objects.get_for_model(entity) + ct = ObjectType.objects.get_for_model(entity) save = False for tag in Tag.objects.filter(name__in=tags): diff --git a/src/netbox_initializers/initializers/custom_fields.py b/src/netbox_initializers/initializers/custom_fields.py index ac0c10f..4a51314 100644 --- a/src/netbox_initializers/initializers/custom_fields.py +++ b/src/netbox_initializers/initializers/custom_fields.py @@ -6,12 +6,12 @@ def get_class_for_class_path(class_path): import importlib - from django.contrib.contenttypes.models import ContentType + from core.models import ObjectType module_name, class_name = class_path.rsplit(".", 1) module = importlib.import_module(module_name) clazz = getattr(module, class_name) - return ContentType.objects.get_for_model(clazz) + return ObjectType.objects.get_for_model(clazz) class CustomFieldInitializer(BaseInitializer): @@ -35,7 +35,7 @@ def load_data(self): custom_field.label = cf_details["label"] for object_type in cf_details.get("on_objects", []): - custom_field.content_types.add(get_class_for_class_path(object_type)) + custom_field.object_types.add(get_class_for_class_path(object_type)) if cf_details.get("required", False): custom_field.required = cf_details["required"] diff --git a/src/netbox_initializers/initializers/custom_links.py b/src/netbox_initializers/initializers/custom_links.py index 1024334..7b149f1 100644 --- a/src/netbox_initializers/initializers/custom_links.py +++ b/src/netbox_initializers/initializers/custom_links.py @@ -1,4 +1,4 @@ -from django.contrib.contenttypes.models import ContentType +from core.models import ObjectType from extras.models import CustomLink from . import BaseInitializer, register_initializer @@ -6,8 +6,8 @@ def get_content_type(content_type): try: - return ContentType.objects.get(model=content_type) - except ContentType.DoesNotExist: + return ObjectType.objects.get(model=content_type) + except ObjectType.DoesNotExist: pass return None @@ -36,7 +36,7 @@ def load_data(self): ) if created: - custom_link.content_types.add(content_type) + custom_link.object_types.add(content_type) custom_link.save() print("🔗 Created Custom Link '{0}'".format(custom_link.name)) diff --git a/src/netbox_initializers/initializers/device_roles.py b/src/netbox_initializers/initializers/device_roles.py index c6cc1d1..544b49a 100644 --- a/src/netbox_initializers/initializers/device_roles.py +++ b/src/netbox_initializers/initializers/device_roles.py @@ -1,5 +1,5 @@ from dcim.models import DeviceRole -from utilities.choices import ColorChoices +from netbox.choices import ColorChoices from . import BaseInitializer, register_initializer diff --git a/src/netbox_initializers/initializers/devices.py b/src/netbox_initializers/initializers/devices.py index c549b42..c73a925 100644 --- a/src/netbox_initializers/initializers/devices.py +++ b/src/netbox_initializers/initializers/devices.py @@ -7,7 +7,7 @@ MATCH_PARAMS = ["device_type", "name", "site"] REQUIRED_ASSOCS = { - "device_role": (DeviceRole, "name"), + "role": (DeviceRole, "name"), "device_type": (DeviceType, "model"), "site": (Site, "name"), } diff --git a/src/netbox_initializers/initializers/groups.py b/src/netbox_initializers/initializers/groups.py index 136f1c6..7280d66 100644 --- a/src/netbox_initializers/initializers/groups.py +++ b/src/netbox_initializers/initializers/groups.py @@ -1,4 +1,4 @@ -from users.models import NetBoxGroup, NetBoxUser +from users.models import Group, User from . import BaseInitializer, register_initializer @@ -12,13 +12,13 @@ def load_data(self): return for groupname, group_details in groups.items(): - group, created = NetBoxGroup.objects.get_or_create(name=groupname) + group, created = Group.objects.get_or_create(name=groupname) if created: print("👥 Created group", groupname) for username in group_details.get("users", []): - user = NetBoxUser.objects.get(username=username) + user = User.objects.get(username=username) if user: - group.user_set.add(user) + group.users.add(user) print(" 👤 Assigned user %s to group %s" % (username, group.name)) group.save() diff --git a/src/netbox_initializers/initializers/object_permissions.py b/src/netbox_initializers/initializers/object_permissions.py index 4878295..3ad2a5b 100644 --- a/src/netbox_initializers/initializers/object_permissions.py +++ b/src/netbox_initializers/initializers/object_permissions.py @@ -1,5 +1,5 @@ -from django.contrib.contenttypes.models import ContentType -from users.models import NetBoxGroup, NetBoxUser, ObjectPermission +from core.models import ObjectType +from users.models import Group, ObjectPermission, User from . import BaseInitializer, register_initializer @@ -28,12 +28,12 @@ def load_data(self): object_types = permission_details["object_types"] if object_types == "all": - object_permission.object_types.set(ContentType.objects.all()) + object_permission.object_types.set(ObjectType.objects.all()) else: for app_label, models in object_types.items(): if models == "all": - app_models = ContentType.objects.filter(app_label=app_label) + app_models = ObjectType.objects.filter(app_label=app_label) for app_model in app_models: object_permission.object_types.add(app_model.id) @@ -41,14 +41,14 @@ def load_data(self): # There is for model in models: object_permission.object_types.add( - ContentType.objects.get(app_label=app_label, model=model) + ObjectType.objects.get(app_label=app_label, model=model) ) if created: print("🔓 Created object permission", object_permission.name) if permission_details.get("groups", 0): for groupname in permission_details["groups"]: - group = NetBoxGroup.objects.filter(name=groupname).first() + group = Group.objects.filter(name=groupname).first() if group: object_permission.groups.add(group) @@ -59,7 +59,7 @@ def load_data(self): if permission_details.get("users", 0): for username in permission_details["users"]: - user = NetBoxUser.objects.filter(username=username).first() + user = User.objects.filter(username=username).first() if user: object_permission.users.add(user) diff --git a/src/netbox_initializers/initializers/rack_roles.py b/src/netbox_initializers/initializers/rack_roles.py index ab4d9f2..bdbbc6d 100644 --- a/src/netbox_initializers/initializers/rack_roles.py +++ b/src/netbox_initializers/initializers/rack_roles.py @@ -1,5 +1,5 @@ from dcim.models import RackRole -from utilities.choices import ColorChoices +from netbox.choices import ColorChoices from . import BaseInitializer, register_initializer diff --git a/src/netbox_initializers/initializers/tags.py b/src/netbox_initializers/initializers/tags.py index 3650c03..72e1894 100644 --- a/src/netbox_initializers/initializers/tags.py +++ b/src/netbox_initializers/initializers/tags.py @@ -1,6 +1,6 @@ -from django.contrib.contenttypes.models import ContentType +from core.models import ObjectType from extras.models import Tag -from utilities.choices import ColorChoices +from netbox.choices import ColorChoices from . import BaseInitializer, register_initializer @@ -29,7 +29,7 @@ def load_data(self): if object_types: for ot in object_types: - ct = ContentType.objects.get( + ct = ObjectType.objects.get( app_label=ot["app"], model=ot["model"], ) diff --git a/src/netbox_initializers/initializers/users.py b/src/netbox_initializers/initializers/users.py index 2e3d771..895bed3 100644 --- a/src/netbox_initializers/initializers/users.py +++ b/src/netbox_initializers/initializers/users.py @@ -1,4 +1,4 @@ -from users.models import NetBoxUser, Token +from users.models import Token, User from . import BaseInitializer, register_initializer @@ -13,10 +13,8 @@ def load_data(self): for username, user_details in users.items(): api_token = user_details.pop("api_token", Token.generate_key()) - password = user_details.pop("password", NetBoxUser.objects.make_random_password()) - user, created = NetBoxUser.objects.get_or_create( - username=username, defaults=user_details - ) + password = user_details.pop("password", User.objects.make_random_password()) + user, created = User.objects.get_or_create(username=username, defaults=user_details) if created: user.set_password(password) user.save() diff --git a/src/netbox_initializers/initializers/yaml/devices.yml b/src/netbox_initializers/initializers/yaml/devices.yml index 32ae82e..4e7155d 100644 --- a/src/netbox_initializers/initializers/yaml/devices.yml +++ b/src/netbox_initializers/initializers/yaml/devices.yml @@ -14,7 +14,7 @@ ## Examples: # - name: server01 -# device_role: server +# role: server # device_type: Other # site: AMS 1 # rack: rack-01 @@ -23,7 +23,7 @@ # custom_field_data: # text_field: Description # - name: server02 -# device_role: server +# role: server # device_type: Other # site: AMS 2 # rack: rack-02 @@ -36,7 +36,7 @@ # custom_field_data: # text_field: Description # - name: server03 -# device_role: server +# role: server # device_type: Other # site: SING 1 # rack: rack-03 @@ -45,7 +45,7 @@ # custom_field_data: # text_field: Description # - name: server04 -# device_role: server +# role: server # device_type: Other # site: SING 1 # location: cage 101 @@ -57,7 +57,7 @@ # ## Templated device # - name: gns3-tor -# device_role: switch +# role: switch # device_type: TOR-8P # site: SING 1 # rack: rack-03 diff --git a/test/Dockerfile b/test/Dockerfile index 5840f97..ba25a73 100644 --- a/test/Dockerfile +++ b/test/Dockerfile @@ -1,4 +1,4 @@ -FROM netboxcommunity/netbox:v3.7 +FROM netboxcommunity/netbox:feature COPY ../ /opt/netbox-initializers/ COPY ./test/config/plugins.py /etc/netbox/config/ diff --git a/test/env/netbox.env b/test/env/netbox.env index 47a77cc..81df20a 100644 --- a/test/env/netbox.env +++ b/test/env/netbox.env @@ -14,4 +14,5 @@ REDIS_INSECURE_SKIP_TLS_VERIFY=false REDIS_PASSWORD=aC4eic9if9de4eHi@kah REDIS_SSL=false SECRET_KEY=yam+ie6Uhou5ciGaez7Psheihae*Nga3wohz9ietsae8Hu:chung:aeGeat9 +SKIP_SUPERUSER=true WEBHOOKS_ENABLED=true