Beispiel #1
0
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
Beispiel #3
0
    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)