diff --git a/changelogs/fragments/1433-add-custom-headers.yml b/changelogs/fragments/1433-add-custom-headers.yml new file mode 100644 index 000000000..25b67d974 --- /dev/null +++ b/changelogs/fragments/1433-add-custom-headers.yml @@ -0,0 +1,2 @@ +minor_changes: + - Add support for custom headers for all modules diff --git a/docs/getting_started/contributing/modules/architecture.rst b/docs/getting_started/contributing/modules/architecture.rst index edeac7a56..e00ad0696 100644 --- a/docs/getting_started/contributing/modules/architecture.rst +++ b/docs/getting_started/contributing/modules/architecture.rst @@ -284,10 +284,11 @@ We set several instance attributes that are used within other methods throughout url = self.module.params["netbox_url"] token = self.module.params["netbox_token"] ssl_verify = self.module.params["validate_certs"] + headers = self.module.params["headers"] # Attempt to initiate connection to NetBox if nb_client is None: - self.nb = self._connect_netbox_api(url, token, ssl_verify) + self.nb = self._connect_netbox_api(url, token, ssl_verify, headers) else: self.nb = nb_client try: diff --git a/plugins/doc_fragments/common.py b/plugins/doc_fragments/common.py index 47a7895d9..4bb63c73e 100644 --- a/plugins/doc_fragments/common.py +++ b/plugins/doc_fragments/common.py @@ -50,4 +50,8 @@ class ModuleDocFragment(object): - Certificate path required: false type: raw + headers: + description: Dictionary of headers to be passed to the NetBox API. + required: false + type: dict """ diff --git a/plugins/module_utils/netbox_utils.py b/plugins/module_utils/netbox_utils.py index 08a756234..2d5549849 100644 --- a/plugins/module_utils/netbox_utils.py +++ b/plugins/module_utils/netbox_utils.py @@ -723,6 +723,7 @@ query_params=dict(required=False, type="list", elements="str"), validate_certs=dict(type="raw", default=True), cert=dict(type="raw", required=False), + headers=dict(type="dict", required=False), ) @@ -751,10 +752,11 @@ def __init__(self, module, endpoint, nb_client=None): token = self.module.params["netbox_token"] ssl_verify = self.module.params["validate_certs"] cert = self.module.params["cert"] + headers = self.module.params["headers"] # Attempt to initiate connection to NetBox if nb_client is None: - self.nb = self._connect_netbox_api(url, token, ssl_verify, cert) + self.nb = self._connect_netbox_api(url, token, ssl_verify, cert, headers) else: self.nb = nb_client try: @@ -804,10 +806,14 @@ def _version_check_greater(self, greater, lesser, greater_or_equal=False): return False - def _connect_netbox_api(self, url, token, ssl_verify, cert): + def _connect_netbox_api(self, url, token, ssl_verify, cert, headers=None): try: session = requests.Session() session.verify = ssl_verify + if isinstance(headers, str): + headers = json.load(headers) + if isinstance(headers, dict): + session.headers.update(headers) if cert: session.cert = tuple(i for i in cert) nb = pynetbox.api(url, token=token) diff --git a/tests/unit/module_utils/test_netbox_base_class.py b/tests/unit/module_utils/test_netbox_base_class.py index 40bbadaa7..d20a78ca4 100644 --- a/tests/unit/module_utils/test_netbox_base_class.py +++ b/tests/unit/module_utils/test_netbox_base_class.py @@ -63,6 +63,7 @@ def fixture_arg_spec(): "state": "present", "validate_certs": False, "cert": None, + "headers": None, }