diff --git a/docs/ref/modules/all.rst b/docs/ref/modules/all.rst index 16d6db80..6e73add6 100644 --- a/docs/ref/modules/all.rst +++ b/docs/ref/modules/all.rst @@ -25,6 +25,7 @@ Execution Modules saltext.vmware.modules.nsxt_policy_segment saltext.vmware.modules.nsxt_policy_tier0 saltext.vmware.modules.nsxt_policy_tier1 + saltext.vmware.modules.nsxt_rest saltext.vmware.modules.nsxt_transport_node saltext.vmware.modules.nsxt_transport_node_profiles saltext.vmware.modules.nsxt_transport_zone diff --git a/docs/ref/modules/saltext.vmware.modules.nsxt_rest.rst b/docs/ref/modules/saltext.vmware.modules.nsxt_rest.rst new file mode 100644 index 00000000..8aa420dd --- /dev/null +++ b/docs/ref/modules/saltext.vmware.modules.nsxt_rest.rst @@ -0,0 +1,6 @@ + +saltext.vmware.modules.nsxt_rest +================================ + +.. automodule:: saltext.vmware.modules.nsxt_rest + :members: diff --git a/src/saltext/vmware/modules/nsxt_rest.py b/src/saltext/vmware/modules/nsxt_rest.py new file mode 100644 index 00000000..dc0b5279 --- /dev/null +++ b/src/saltext/vmware/modules/nsxt_rest.py @@ -0,0 +1,85 @@ +""" +Salt execution Module to interact with NSX-T REST APIs + +""" +import logging + +from saltext.vmware.utils import nsxt_request + +log = logging.getLogger(__name__) + +__virtual_name__ = "nsxt_rest" + + +def call_api( + url, + username, + password, + method="get", + cert_common_name=None, + verify_ssl=True, + cert=None, + data=None, + params=None, +): + """ + Used to execute NSX-T REST API calls. In case of error, function returns a dictionary with respective error. + Sample error returned : {'error': 'Error message'} + + CLI Example: + + .. code-block:: bash + + salt vm_minion nsxt_rest.call_api method=get url=https://nsxt-instance/ ... + + url + Url or api endpoint to access + + username + Username to connect to NSX-T manager + + password + Password to connect to NSX-T manager + + + method + Http request method. Default is 'get'. Accepted values: get, post, put, patch, delete.. + + verify_ssl + Option to enable/disable SSL verification. Enabled by default. + If set to False, the certificate validation is skipped. + + cert + Path to the SSL client certificate file to connect to NSX-T manager. + The certificate can be retrieved from browser. + + cert_common_name + (Optional) By default, the hostname parameter and the common name in certificate is compared for host name + verification. If the client certificate common name and hostname do not match (in case of self-signed + certificates), specify the certificate common name as part of this parameter. This value is then used to + compare against + + data + (Optional) Data to be sent to the specified url. Request body + + params + (Optional) Query parameters for the request. Usually a dictionary with key-value pairs + + """ + log.info("{} call for url: {}".format(method.upper(), url)) + log.info("data: {}\n params: {}".format(data, params)) + response = nsxt_request.call_api( + url=url, + username=username, + password=password, + verify_ssl=verify_ssl, + cert=cert, + cert_common_name=cert_common_name, + method=method, + data=data, + params=params, + ) + if response: + return response + else: + return "{} call is success".format(method.upper()) diff --git a/tests/unit/modules/test_nsxt_rest.py b/tests/unit/modules/test_nsxt_rest.py new file mode 100644 index 00000000..d868791e --- /dev/null +++ b/tests/unit/modules/test_nsxt_rest.py @@ -0,0 +1,45 @@ +""" + Tests for nsxt_rest module +""" +import logging +from unittest.mock import patch + +from saltext.vmware.modules import nsxt_rest +from saltext.vmware.utils import nsxt_request + +log = logging.getLogger(__name__) + + +@patch.object(nsxt_request, "call_api") +def test_call_post_api_should_return_response(mock_call_api): + response = {"results": {"key": "value"}} + mock_call_api.return_value = response + + assert ( + nsxt_rest.call_api( + url="https://nsxt-vmware.local/api/to/call", + method="post", + username="user", + password="pass", + data={}, + verify_ssl=False, + ) + == response + ) + + +@patch.object(nsxt_request, "call_api") +def test_call_delete_api_with_return_none(mock_call_api): + mock_call_api.return_value = None + method = "delete" + + assert ( + nsxt_rest.call_api( + url="https://nsxt-vmware.local/api/to/call", + method=method, + username="user", + password="pass", + verify_ssl=False, + ) + == "{} call is success".format(method.upper()) + )