class ClusterSession: def __init__(self, cluster_ip, user, password, vserver=None): self.server = NaServer(cluster_ip, 1, 100) self.server.set_server_type('FILER') self.server.set_transport_type('HTTP') self.server.set_port(80) self.server.set_style('LOGIN') self.server.set_admin_user(user, password) if vserver is not None: self.server.set_vserver(vserver) def get_vserver(self): return self.server.get_vserver() def run_command(self, api): return self.server.invoke_elem(api) def get_nodes(self): api_call = NaElement('cluster-node-get-iter') output = self.run_command(api_call) if output.results_status() == 'failed': return output.results_status(), output.sprintf() else: cluster_node_info = output.children_get() for cni in cluster_node_info: if cni.has_children() == 1: nodes = cni.children_get() nodes_list = [] for n in nodes: nodes_list.append(n.child_get_string('node-name')) return nodes_list
def connect(): naHost = getConfigOption("NAHost") user = getConfigOption("User") password = getConfigOption("Password") s = NaServer(naHost, 1 , 21) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user, password) return s
def __create_server(self, testing_active): if testing_active: return None s = NaServer( self.host, self.ontap_major_version, self.ontap_minor_version) s.set_server_type(self.server_type) s.set_transport_type(self.transport_type) s.set_port(self.server_port) s.set_style(self.connect_style) s.set_admin_user(self.user, self.pwd) return s
def connect(): try: _create_unverified_https_context = ssl._create_unverified_context except AttributeError: # Legacy Python that doesn't verify HTTPS certificates by default pass else: # Handle target environment that doesn't support HTTPS verification ssl._create_default_https_context = _create_unverified_https_context naHost = getConfigOption("NAHost") user = getConfigOption("User") password = getConfigOption("Password") s = NaServer(naHost, 1, 21) s.set_server_type("FILER") s.set_transport_type("HTTPS") s.set_port(443) s.set_style("LOGIN") s.set_admin_user(user, password) return s
def cluster_setup(cluster): print("> " + cluster["cluster-name"] + ": Creating Cluster ") for node in cluster["cluster-nodes"]: print("---> " + node["node-name"] + ": Working on node ") # Building Session - REST s = requests.Session() s.url = "https://{}".format(node["ip"]) s.verify = False s.auth = (node["user"], node["password"]) s.headers = { "Content-Type": "application/hal+json", "Accept": "application/hal+json" } # Building Session - ZAPI session = NaServer(node["ip"], 1, 140) session.set_server_type("Filer") session.set_admin_user(node["user"], node["password"]) session.set_transport_type("HTTPS") # STEP: Create cluster if ("-01" in node["node-name"]): print("---> " + node["node-name"] + ": Creating cluster...") # create cluster API api = "/api/cluster" # creating body body = { "contact": cluster["contact"], "location": cluster["location"], "name": cluster["cluster-name"], "password": cluster["password"], "management_interface": {} } # add cluster mgmt for lif in cluster["net-interfaces"]: if (lif["role"] == "cluster-mgmt"): body["management_interface"]["ip"] = { "address": lif["address"], "netmask": lif["netmask"] } for route in cluster["net-routes"]: if (route["destination"] == "0.0.0.0/0"): body["management_interface"]["ip"][ "gateway"] = route["gateway"] break else: continue break else: continue # add ntp server #if (cluster.get("ntp-servers")): # for ntp_server in cluster["ntp-servers"]: # body["ntp_servers"].append(ntp_server["server-name"]) # add licenses #for ontap_license in cluster["licenses"]: # body["licenses"].append(cluster["licenses"][ontap_license]) response = s.post(url=s.url + api, data=json.dumps(body)) print("URL==" + s.url + api) #debug print("BODY==" + json.dumps(body)) #debug if response: print(response.json()) else: print("WE DIDNT GET RESPONSE") #sys.exit() status = handle_job(s, response) if (status == "success"): print("---> " + node["node-name"] + ": SUCCESS") else: print("---> " + node["node-name"] + ": " + status) sys.exit() # STEP: Reading cluster LIF IP for joining additional nodes later if ("-01" in node["node-name"]): print( "--- " + node["node-name"] + ": Reading cluster LIF IP for joining further nodes later...") api = NaElement("net-interface-modify") for lif in cluster["net-interfaces"]: if (lif["role"] == "cluster-mgmt"): api.child_add_string("home-port", lif["home-port"]) api.child_add_string("interface-name", "cluster_mgmt") api.child_add_string("vserver", cluster["cluster-name"]) else: continue xo = session.invoke_elem(api) if (xo.results_status() == "failed"): print("Error:\n") print(xo.sprintf()) sys.exit(1) print("Received:\n") print(xo.sprintf()) api1 = NaElement("net-interface-revert") api1.child_add_string("interface-name", "cluster_mgmt") api1.child_add_string("vserver", cluster["cluster-name"]) xo1 = session.invoke_elem(api1) if (xo1.results_status() == "failed"): print("Error:\n") print(xo1.sprintf()) sys.exit(1) print("Received:\n") print(xo1.sprintf()) api = "/api/network/ip/interfaces" url_params = "?fields=services,ip.address&services=cluster_core&max_records=1" response = s.get(url=s.url + api + url_params) status = handle_job(s, response) if (status == "success"): clus_lif_ip = response.json()["records"][0]["ip"]["address"] print("---> " + node["node-name"] + ": SUCCESS") else: print("---> " + node["node-name"] + ": " + status) sys.exit(1) # STEP: Join nodes to cluster if (not "-01" in node["node-name"]): print("--- " + node["node-name"] + ": Joining node to cluster...") zapi_post = NaElement("cluster-join") zapi_post.child_add_string("cluster-ip-address", clus_lif_ip) zapi_post_return = session.invoke_elem(zapi_post) if (zapi_post_return.results_status() == "failed"): print("---> " + node["node-name"] + ": " + zapi_post_return.sprintf().strip()) sys.exit(1) else: zapi_get = NaElement("cluster-create-join-progress-get") is_complete = "" join_iterator = 1 while is_complete != "true" and \ join_iterator < 13: time.sleep(10) zapi_get_return = session.invoke_elem(zapi_get) is_complete = zapi_get_return.child_get( "attributes").child_get( "cluster-create-join-progress-info" ).child_get_string("is-complete") action_status = zapi_get_return.child_get( "attributes").child_get( "cluster-create-join-progress-info" ).child_get_string("status") join_iterator = join_iterator + 1 if (is_complete == "true") and (action_status == "success"): print("---> " + node["node-name"] + ": SUCCESS") else: print("---> " + node["node-name"] + ": " + zapi_get.sprintf().strip()) print("---> " + node["node-name"] + ": " + zapi_get_return.sprintf().strip()) sys.exit(1)