diff --git a/recipes/python/config/README.md b/recipes/python/config/README.md index bcce2bb..a24134b 100644 --- a/recipes/python/config/README.md +++ b/recipes/python/config/README.md @@ -1,21 +1,31 @@ -### NetBackup Hosts Configuration Management API Code Samples +### NetBackup Config API Code Samples -This directory contains Python scripts demonstrating the use of NetBackup Hosts Configuration Management APIs to update exclude list on a NetBackup host. +This directory contains Python scripts demonstrating : +1. The use of NetBackup Hosts Configuration Management APIs to update exclude list on a NetBackup host. +2. The use of NetBackup Access Hosts API to view, add and delete an access-host on a NetBackup master. #### Disclaimer These samples are provided only for reference and not meant for production use. -#### Executing the script - -Pre-requisites: +####Pre-requisites: - NetBackup 8.2 or higher - Python 3.5 or higher - Python modules: `requests`. +####Usage +#####NetBackup Hosts Configuration Management API Use the following command to run the script. The command should be run from the parent directory of this 'config' directory. `python -W ignore -m config.hosts_exclude_list -hostName -nbmaster -username -password [-domainName ] [-domainType ]` `Note: hostName is the name of the NetBackup host to set the exclude configuration. The exclude list is specified in the config/exclude_list file.` + +#####NetBackup Access Hosts API +Use the following command to run the script. The command should be run from the parent directory of this 'config' directory. + +`python -W ignore -m config.access_hosts_api_usecases -hostName -nbmaster -username -password [-domainName ] [-domainType ]` + +`Note: hostName is the name of the VMware Access host to add/delete using the Access Host APIs.` + diff --git a/recipes/python/config/access_hosts_api.py b/recipes/python/config/access_hosts_api.py new file mode 100644 index 0000000..1135c87 --- /dev/null +++ b/recipes/python/config/access_hosts_api.py @@ -0,0 +1,24 @@ +import requests + +vmware_access_hosts_url = "/config/vmware/access-hosts/" +content_type_header = "application/vnd.netbackup+json;version=3.0" +accept_header = "application/vnd.netbackup+json;version=3.0" + +def get_access_hosts(base_url, jwt, filter): + headers = {'Accept': accept_header, 'Authorization': jwt} + long_url = base_url + vmware_access_hosts_url + filter + response = requests.get(long_url, headers=headers, verify=False) + return response + +def add_access_host(base_url, jwt, hostName): + headers = {'Content-Type': content_type_header, 'Authorization': jwt} + long_url = base_url + vmware_access_hosts_url + data = {'data':{'type':'accessHostRequest', 'id':'vmware', 'attributes':{'hostname':hostName, 'validate': 'false'}}} + response = requests.post(long_url, headers=headers, json=data, verify=False) + return response + +def delete_access_host(base_url, jwt, hostName): + headers = {'Content-Type': content_type_header, 'Authorization': jwt} + long_url = base_url + vmware_access_hosts_url + hostName + response = requests.delete(long_url, headers=headers, verify=False) + return response \ No newline at end of file diff --git a/recipes/python/config/access_hosts_api_usecases.py b/recipes/python/config/access_hosts_api_usecases.py new file mode 100644 index 0000000..d572079 --- /dev/null +++ b/recipes/python/config/access_hosts_api_usecases.py @@ -0,0 +1,165 @@ +import sys +import login.login_api as login_api +import config.access_hosts_api as access_hosts_api + +nbmaster = "" +username = "" +password = "" +domainName = "" +domainType = "" +hostName = "" + +EXCLUDE_CONFIG_NAME = "Exclude" + +def print_disclaimer(): + print("\n-------------------------------------------------------------------------------------------------") + print("-- This script requires Python3.5 or higher. --") + print("-- The system where this script is run should have Python 3.5 or higher version installed. --") + print("-------------------------------------------------------------------------------------------------") + print("The script requires 'requests' library to make the API calls.") + print("You can install the library using the command: pip install requests") + print("-------------------------------------------------------------------------------------------------") + +def print_usage(): + print("\nCommand-line usage (should be run from the parent directory of the 'config' directory):") + print("\tpython -W ignore -m config.access_hosts_api_usecases -hostName -nbmaster -username -password [-domainName ] [-domainType ]") + print("Note: hostName is the name of the VMware Access host to add/delete using the Access Host APIs.\n") + print("-------------------------------------------------------------------------------------------------") + +def read_command_line_arguments(): + if len(sys.argv)%2 == 0: + print("\nInvalid command!") + print_usage() + exit() + + global nbmaster + global username + global password + global domainName + global domainType + global hostName + global workload + + for i in range(1, len(sys.argv), 2): + if sys.argv[i] == "-nbmaster": + nbmaster = sys.argv[i + 1] + elif sys.argv[i] == "-username": + username = sys.argv[i + 1] + elif sys.argv[i] == "-password": + password = sys.argv[i + 1] + elif sys.argv[i] == "-domainName": + domainName = sys.argv[i + 1] + elif sys.argv[i] == "-domainType": + domainType = sys.argv[i + 1] + elif sys.argv[i] == "-hostName": + hostName = sys.argv[i + 1] + else: + print("\nInvalid command!") + print_usage() + exit() + + if nbmaster == "": + print("Please provide the value for 'nbmaster'\n") + exit() + elif username == "": + print("Please provide the value for 'username'\n") + exit() + elif password == "": + print("Please provide the value for 'password'\n") + exit() + elif hostName == "": + print("Using default hostName to 'test_vmwareAccessHost123'\n") + hostName = "test_vmwareAccessHost123" + +def parse_access_host_response(response): + global nbmaster + resp_size = len(response.json()["data"]) + if resp_size==0: + print("No Matching Entries Found on {}".format(nbmaster)) + else: + print("{} Matching Entries Found on {} : ".format(resp_size, nbmaster)) + i = 0; + for host in response.json()["data"]: + i = i+1 + print ("\t{}. hostName = {}, hostType = {}".format(i, host["id"], host["attributes"]["hostType"])) + +def use_case_1(base_url, jwt): + global nbmaster + print("\n-------------------Use Case 1 Start -------------------") + print(" *** Description : Get All VMware Access Hosts on {} ***".format(nbmaster)) + print("-------------------------------------------------------") + print("\nCalling GET Access-Hosts API ... ") + response = access_hosts_api.get_access_hosts(base_url, jwt, "") + print("\nParsing GET API response ... ") + parse_access_host_response(response) + print("-------------------Use Case 1 End ---------------------") + +def use_case_2(base_url, jwt): + global nbmaster + global hostName + print("\n\n-------------------Use Case 2 Start -------------------") + print(" *** Description : Add VMware Dummy Access Host='{}' on {} ***".format(hostName, nbmaster)) + print("-------------------------------------------------------") + print("\nCalling POST Access-Hosts API ... ") + response = access_hosts_api.add_access_host(base_url, jwt, hostName) + if response.status_code != 204: + print("\nAdd Access Host failed with status code {} and {}".format(response.status_code, response.json())) + raise SystemExit("\n\n") + else: + print("Add VMware Access Host successful.") + + print("\nCalling GET Access-Hosts API ... ") + response = access_hosts_api.get_access_hosts(base_url, jwt, "") + print("Parsing GET API response ... ") + parse_access_host_response(response) + print("-------------------Use Case 2 End ---------------------") + +def use_case_3(base_url, jwt): + global nbmaster + print("\n\n-------------------Use Case 3 Start -------------------") + print(" *** Description : Get All VMware Access Hosts of type 'CLIENT' on {} ***".format(nbmaster)) + print("-------------------------------------------------------") + print("\nCalling GET Access-Hosts API with filter: hostType eq 'CLIENT'... ") + response = access_hosts_api.get_access_hosts(base_url, jwt, "?filter=hostType eq 'CLIENT'") + print("Parsing GET API response ... ") + parse_access_host_response(response) + print("-------------------Use Case 3 End ---------------------") + + +def use_case_4(base_url, jwt): + global nbmaster + global hostName + print("\n\n-------------------Use Case 4 Start -------------------") + print(" *** Description : Delete VMware Dummy Access Host = '{}' on {} ***".format(hostName, nbmaster)) + print("-------------------------------------------------------") + print("\nCalling DELETE Access-Hosts API ... ") + response = access_hosts_api.delete_access_host(base_url, jwt, hostName) + + if response.status_code != 204: + print("\nDelete Access Host failed with status code {} and {}".format(response.status_code, response.json())) + raise SystemExit("\n\n") + else: + print("Delete VMware Access Host successful.") + + print("\nCalling GET Access-Hosts API ... ") + response = access_hosts_api.get_access_hosts(base_url, jwt, "") + print("Parsing GET API response ... ") + parse_access_host_response(response) + print("-------------------Use Case 4 End ---------------------") + +print_disclaimer() +print_usage() +read_command_line_arguments() + +base_url = "https://" + nbmaster + "/netbackup" + +print("\nExecuting the script...") + +jwt = login_api.perform_login(base_url, username, password, domainName, domainType) + +use_case_1(base_url, jwt) +use_case_2(base_url, jwt) +use_case_3(base_url, jwt) +use_case_4(base_url, jwt) + +print("\nScript completed successfully!\n") \ No newline at end of file