From 43542cb0c96ce0756165619915ec6ffe6cf66640 Mon Sep 17 00:00:00 2001 From: Michal Cerny Date: Tue, 18 Nov 2025 18:33:20 +0100 Subject: [PATCH 1/2] plugins/module_utils: rename variable version to api_version --- changelogs/fragments/version_api.yml | 3 ++ .../contributing/modules/architecture.rst | 2 +- plugins/module_utils/netbox_dcim.py | 12 +++++-- plugins/module_utils/netbox_ipam.py | 6 ++-- plugins/module_utils/netbox_tenancy.py | 8 ++--- plugins/module_utils/netbox_utils.py | 36 ++++++++++--------- plugins/modules/netbox_service.py | 2 +- 7 files changed, 41 insertions(+), 28 deletions(-) create mode 100644 changelogs/fragments/version_api.yml diff --git a/changelogs/fragments/version_api.yml b/changelogs/fragments/version_api.yml new file mode 100644 index 000000000..40963046e --- /dev/null +++ b/changelogs/fragments/version_api.yml @@ -0,0 +1,3 @@ +--- +minor_changes: + - rename variable version to api_version. diff --git a/docs/getting_started/contributing/modules/architecture.rst b/docs/getting_started/contributing/modules/architecture.rst index e00ad0696..8980045d3 100644 --- a/docs/getting_started/contributing/modules/architecture.rst +++ b/docs/getting_started/contributing/modules/architecture.rst @@ -292,7 +292,7 @@ We set several instance attributes that are used within other methods throughout else: self.nb = nb_client try: - self.version = self.nb.version + self.api_version = self.nb.version except AttributeError: self.module.fail_json(msg="Must have pynetbox >=4.1.0") diff --git a/plugins/module_utils/netbox_dcim.py b/plugins/module_utils/netbox_dcim.py index 8b3994eb4..489c52af5 100644 --- a/plugins/module_utils/netbox_dcim.py +++ b/plugins/module_utils/netbox_dcim.py @@ -114,7 +114,9 @@ def run(self): # Handle rack and form_factor if endpoint_name == "rack": - if self._version_check_greater(self.version, "4.1", greater_or_equal=True): + if self._version_check_greater( + self.api_version, "4.1", greater_or_equal=True + ): if "type" in data: data["form_factor"] = self._to_slug(data["type"]) del data["type"] @@ -193,7 +195,9 @@ def run(self): data["color"] = data["color"].lower() if self.endpoint == "cables": - if self._version_check_greater(self.version, "3.0", greater_or_equal=True): + if self._version_check_greater( + self.api_version, "3.0", greater_or_equal=True + ): cables = [ nb_endpoint.get( termination_a_type=data["termination_a_type"], @@ -222,7 +226,9 @@ def run(self): else: self._handle_errors(msg="More than one result returned for %s" % (name)) - if self._version_check_greater(self.version, "3.3", greater_or_equal=True): + if self._version_check_greater( + self.api_version, "3.3", greater_or_equal=True + ): data["a_terminations"] = [ { "object_id": data.pop("termination_a_id"), diff --git a/plugins/module_utils/netbox_ipam.py b/plugins/module_utils/netbox_ipam.py index d82f78544..a70fe97b1 100644 --- a/plugins/module_utils/netbox_ipam.py +++ b/plugins/module_utils/netbox_ipam.py @@ -62,7 +62,9 @@ def _ensure_ip_in_prefix_present_on_netif( "parent": data["prefix"], } - if not self._version_check_greater(self.version, "2.9", greater_or_equal=True): + if not self._version_check_greater( + self.api_version, "2.9", greater_or_equal=True + ): if not data.get("interface") or not data.get("prefix"): self._handle_errors("A prefix and interface is required") data_intf_key = "interface" @@ -217,7 +219,7 @@ def run(self): data["slug"] = self._to_slug(name) if self.endpoint == "services" and self._version_check_greater( - self.version, "4.3", greater_or_equal=True + self.api_version, "4.3", greater_or_equal=True ): if "device" in data: data["parent_object_type"] = "dcim.device" diff --git a/plugins/module_utils/netbox_tenancy.py b/plugins/module_utils/netbox_tenancy.py index 6b5c97577..c0df81ae8 100644 --- a/plugins/module_utils/netbox_tenancy.py +++ b/plugins/module_utils/netbox_tenancy.py @@ -112,17 +112,17 @@ def run(self): if self.endpoint == NB_CONTACTS: if data.get("groups"): if not self._version_check_greater( - self.version, "4.3", greater_or_equal=True + self.api_version, "4.3", greater_or_equal=True ): raise Exception( - f"contact_groups is not available in Netbox {self.version}. Use contact_group instead, or upgrade to Netbox 4.3 or greater." + f"contact_groups is not available in Netbox {self.api_version}. Use contact_group instead, or upgrade to Netbox 4.3 or greater." ) if data.get("group"): if self._version_check_greater( - self.version, "4.3", greater_or_equal=True + self.api_version, "4.3", greater_or_equal=True ): raise Exception( - f"contact_group is not available in Netbox {self.version}. Use contact_groups instead." + f"contact_group is not available in Netbox {self.api_version}. Use contact_groups instead." ) # For ease and consistency of use, the contact assignment module takes the name of the contact, role, and target object rather than an ID or slug. diff --git a/plugins/module_utils/netbox_utils.py b/plugins/module_utils/netbox_utils.py index c4316e83a..db8c29130 100644 --- a/plugins/module_utils/netbox_utils.py +++ b/plugins/module_utils/netbox_utils.py @@ -781,14 +781,14 @@ def __init__(self, module, endpoint, nb_client=None): else: self.nb = nb_client try: - self.version = self._version_sanitize(self.nb.version) + self.api_version = self._version_sanitize(self.nb.version) try: self.full_version = self._version_sanitize( self.nb.status().get("netbox-version") ) except Exception: # For NetBox versions without /api/status endpoint - self.full_version = f"{self.version}.0" + self.full_version = f"{self.api_version}.0" except AttributeError: self.module.fail_json(msg="Must have pynetbox >=4.1.0") @@ -850,14 +850,14 @@ def _connect_netbox_api(self, url, token, ssl_verify, cert, headers=None): nb = pynetbox.api(url, token=token) nb.http_session = session try: - self.version = self._version_sanitize(nb.version) + self.api_version = self._version_sanitize(nb.version) try: self.full_version = self._version_sanitize( nb.status().get("netbox-version") ) except Exception: # For NetBox versions without /api/status endpoint - self.full_version = f"{self.version}.0" + self.full_version = f"{self.api_version}.0" except AttributeError: self.module.fail_json(msg="Must have pynetbox >=4.1.0") except Exception: @@ -941,7 +941,7 @@ def _convert_identical_keys(self, data): :params data (dict): Data dictionary after _find_ids method ran """ temp_dict = dict() - if self._version_check_greater(self.version, "2.7", greater_or_equal=True): + if self._version_check_greater(self.api_version, "2.7", greater_or_equal=True): if data.get("form_factor"): temp_dict["type"] = data.pop("form_factor") @@ -950,7 +950,7 @@ def _convert_identical_keys(self, data): temp_dict[key] = data[key] # TODO: Remove this once the lowest supported Netbox version is 3.6 or greater as we can use default logic of CONVERT_KEYS moving forward. elif key == "device_role" and not self._version_check_greater( - self.version, "3.6", greater_or_equal=True + self.api_version, "3.6", greater_or_equal=True ): temp_dict[key] = data[key] elif key in CONVERT_KEYS: @@ -1043,7 +1043,7 @@ def _build_query_params( parent == "interface" and "device" in module_data and self._version_check_greater( - self.version, "3.6", greater_or_equal=True + self.api_version, "3.6", greater_or_equal=True ) ): query_dict.update( @@ -1130,7 +1130,7 @@ def _build_query_params( elif parent == "rear_port_template" and self.endpoint == "front_port_templates": if isinstance(module_data.get("rear_port_template"), str): if self._version_check_greater( - self.version, "4.0", greater_or_equal=True + self.api_version, "4.0", greater_or_equal=True ): rear_port_template = { "device_type_id": module_data.get("device_type"), @@ -1157,7 +1157,7 @@ def _build_query_params( ): if isinstance(module_data.get("power_port_template"), str): if self._version_check_greater( - self.version, "4.0", greater_or_equal=True + self.api_version, "4.0", greater_or_equal=True ): power_port_template = { "device_type_id": module_data.get("device_type"), @@ -1192,7 +1192,7 @@ def _build_query_params( elif "_template" in parent: if query_dict.get("device_type"): if self._version_check_greater( - self.version, "4.0", greater_or_equal=True + self.api_version, "4.0", greater_or_equal=True ): query_dict["device_type_id"] = query_dict.pop("device_type") else: @@ -1202,7 +1202,7 @@ def _build_query_params( # Netbox 4.3.0 - 4.4.3 is removed elif parent == "services": if self._version_check_greater( - self.version, "4.3", greater_or_equal=True + self.api_version, "4.3", greater_or_equal=True ) and self._version_check_greater("4.4.4", self.full_version): query_dict.pop("parent_object_id", None) query_dict.pop("parent_object_type", None) @@ -1277,13 +1277,15 @@ def _find_app(self, endpoint): if endpoint in v.keys(): if "introduced" in v[endpoint]: pre_introduction = self._version_check_greater( - v[endpoint]["introduced"], self.version + v[endpoint]["introduced"], self.api_version ) if pre_introduction: continue if "deprecated" in v[endpoint]: after_deprecation = self._version_check_greater( - self.version, v[endpoint]["deprecated"], greater_or_equal=True + self.api_version, + v[endpoint]["deprecated"], + greater_or_equal=True, ) if after_deprecation: continue @@ -1303,7 +1305,7 @@ def _find_ids(self, data, user_query_params): if k in CONVERT_TO_ID: if ( not self._version_check_greater( - self.version, "2.9", greater_or_equal=True + self.api_version, "2.9", greater_or_equal=True ) and k == "tags" ) or (self.endpoint == "config_contexts" and k == "tags"): @@ -1527,7 +1529,7 @@ def _update_netbox_object(self, data): updated_obj["tags"] = set(data["tags"]) # Ensure idempotency for site on older netbox versions - version_pre_30 = self._version_check_greater("3.0", self.version) + version_pre_30 = self._version_check_greater("3.0", self.api_version) if ( serialized_nb_obj.get("latitude") and data.get("latitude") @@ -1542,7 +1544,7 @@ def _update_netbox_object(self, data): updated_obj["longitude"] = str(data["longitude"]) # Ensure idempotency for virtual machine on older netbox versions - version_pre_211 = self._version_check_greater("2.11", self.version) + version_pre_211 = self._version_check_greater("2.11", self.api_version) if serialized_nb_obj.get("vcpus") and data.get("vcpus"): if version_pre_211: updated_obj["vcpus"] = int(data["vcpus"]) @@ -1550,7 +1552,7 @@ def _update_netbox_object(self, data): updated_obj["vcpus"] = float(data["vcpus"]) # Ensure idempotency for cable on netbox versions later than 3.3 - version_post_33 = self._version_check_greater(self.version, "3.3", True) + version_post_33 = self._version_check_greater(self.api_version, "3.3", True) if ( serialized_nb_obj.get("a_terminations") and serialized_nb_obj.get("b_terminations") diff --git a/plugins/modules/netbox_service.py b/plugins/modules/netbox_service.py index 972127127..1974bc86a 100644 --- a/plugins/modules/netbox_service.py +++ b/plugins/modules/netbox_service.py @@ -179,7 +179,7 @@ def main(): # Change port to ports for 2.10+ and convert to a list with the single integer if netbox_service.data.get("port") and netbox_service._version_check_greater( - netbox_service.version, "2.10", greater_or_equal=True + netbox_service.api_version, "2.10", greater_or_equal=True ): netbox_service.data["ports"] = [netbox_service.data.pop("port")] From 86f2b7f07143f5e20ba6ae659ce60d8455ef90e3 Mon Sep 17 00:00:00 2001 From: Michal Cerny Date: Tue, 18 Nov 2025 18:50:44 +0100 Subject: [PATCH 2/2] plugins/module_utils: rename variable full_version to netbox_version --- changelogs/fragments/version_netbox.yml | 3 +++ plugins/module_utils/netbox_utils.py | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 changelogs/fragments/version_netbox.yml diff --git a/changelogs/fragments/version_netbox.yml b/changelogs/fragments/version_netbox.yml new file mode 100644 index 000000000..51161823b --- /dev/null +++ b/changelogs/fragments/version_netbox.yml @@ -0,0 +1,3 @@ +--- +minor_changes: + - rename variable full_version to netbox_version. diff --git a/plugins/module_utils/netbox_utils.py b/plugins/module_utils/netbox_utils.py index db8c29130..12a3f068e 100644 --- a/plugins/module_utils/netbox_utils.py +++ b/plugins/module_utils/netbox_utils.py @@ -783,12 +783,12 @@ def __init__(self, module, endpoint, nb_client=None): try: self.api_version = self._version_sanitize(self.nb.version) try: - self.full_version = self._version_sanitize( + self.netbox_version = self._version_sanitize( self.nb.status().get("netbox-version") ) except Exception: # For NetBox versions without /api/status endpoint - self.full_version = f"{self.api_version}.0" + self.netbox_version = f"{self.api_version}.0" except AttributeError: self.module.fail_json(msg="Must have pynetbox >=4.1.0") @@ -852,12 +852,12 @@ def _connect_netbox_api(self, url, token, ssl_verify, cert, headers=None): try: self.api_version = self._version_sanitize(nb.version) try: - self.full_version = self._version_sanitize( + self.netbox_version = self._version_sanitize( nb.status().get("netbox-version") ) except Exception: # For NetBox versions without /api/status endpoint - self.full_version = f"{self.api_version}.0" + self.netbox_version = f"{self.api_version}.0" except AttributeError: self.module.fail_json(msg="Must have pynetbox >=4.1.0") except Exception: @@ -1203,7 +1203,7 @@ def _build_query_params( elif parent == "services": if self._version_check_greater( self.api_version, "4.3", greater_or_equal=True - ) and self._version_check_greater("4.4.4", self.full_version): + ) and self._version_check_greater("4.4.4", self.netbox_version): query_dict.pop("parent_object_id", None) query_dict.pop("parent_object_type", None)