def execute(self, server, cmd_data_json): if ("name" not in cmd_data_json or "ipspace" not in cmd_data_json or "ip_ranges" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( "subnet ip range " + self._get_cmd_type() + " commands must" + " have name, ipspace and ip_ranges defined" + ", got: " + str(cmd_data_json)) name = cmd_data_json["name"] ipspace = cmd_data_json["ipspace"] iprs = cmd_data_json["ip_ranges"] cmd = ("net-subnet-" + self._get_cmd_type() + "-ranges") call = NaElement(cmd) call.child_add_string("subnet-name", name) call.child_add_string("ipspace", ipspace) el_iprs = NaElement("ip-ranges") for ip_range in iprs: el_iprs.child_add_string("ip-range", ip_range) call.child_add(el_iprs) _, err_resp = self._INVOKE_CHECK( server, call, cmd + ": " + name + " [" + ipspace + "]" + self._get_cmd_type() + str(iprs)) if err_resp: return err_resp # LOGGER.debug(resp.sprintf()) return self._CREATE_EMPTY_RESPONSE(True, "")
def create(self, cluster): api_call = NaElement('net-interface-create') api_child_data_protocols = NaElement('data-protocols') api_child_data_protocols.child_add_string('data-protocol', self.data_protocol) api_call.child_add(api_child_data_protocols) api_call.child_add_string('vserver', self.vserver) if (self.data_protocol == 'none') or (self.data_protocol == 'nfs') or ( self.data_protocol == 'cifs') or (self.data_protocol == 'iscsi'): api_call.child_add_string('interface-name', self.interface_name) api_call.child_add_string('role', self.role) api_call.child_add_string('home-node', self.home_node) api_call.child_add_string('home-port', self.home_port) api_call.child_add_string('address', self.address) api_call.child_add_string('netmask', self.netmask) elif (self.data_protocol == 'fcp'): api_call.child_add_string('interface-name', self.interface_name) api_call.child_add_string('role', self.role) api_call.child_add_string('home-node', self.home_node) api_call.child_add_string('home-port', self.home_port) output = cluster.run_command(api_call) return output.results_status(), output.sprintf()
def execute(self, server, cmd_data_json): if ("parent_name" not in cmd_data_json or "vlan_id" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( 'create vlan request must have parent name' + ' and vlan id defined, got: ' + str(cmd_data_json)) parent = cmd_data_json["parent_name"] vlan_id = cmd_data_json["vlan_id"] cmd = "net-vlan-create" call = NaElement(cmd) vi = NaElement("vlan-info") vi.child_add_string("parent-interface", parent) vi.child_add_string("vlanid", vlan_id) if "node_name" in cmd_data_json: vi.child_add_string("node", cmd_data_json["node_name"]) call.child_add(vi) _, err_resp = self._INVOKE_CHECK(server, call, cmd + ": " + parent + ":" + vlan_id) if err_resp: return err_resp return self._CREATE_EMPTY_RESPONSE(True, "")
def execute(self, server, cmd_data_json): call = NaElement("system-get-ontapi-version") resp, err_resp = self._INVOKE_CHECK(server, call, "system-get-ontapi-version") if err_resp: return err_resp majvnum = resp.child_get_int('major-version') minvnum = resp.child_get_int('minor-version') LOGGER.debug("ONTAPI v %d.%d" % (majvnum, minvnum)) call = NaElement("system-get-version") resp, err_resp = self._INVOKE_CHECK(server, call, "system-get-version") if err_resp: return err_resp os_version = resp.child_get_string('version') LOGGER.debug("OS Version: %s", os_version) return { 'success': True, 'errmsg': '', 'data': { 'ontap_major': majvnum, 'ontap_minor': minvnum, 'os_version': os_version } }
def execute(self, server, cmd_data_json): if ("parent_name" not in cmd_data_json or "vlan_id" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( 'get vlan request must have parent name' + ' and vlan id defined, got: ' + str(cmd_data_json)) parent = cmd_data_json["parent_name"] vlan_id = cmd_data_json["vlan_id"] cmd = "net-vlan-get-iter" call = NaElement(cmd) qe = NaElement("query") qe_vi = NaElement("vlan-info") qe_vi.child_add_string("parent-interface", parent) qe_vi.child_add_string("vlanid", vlan_id) if "node_name" in cmd_data_json: qe_vi.child_add_string("node", cmd_data_json["node_name"]) qe.child_add(qe_vi) call.child_add(qe) des_attr = NaElement("desired-attributes") vi = NaElement("vlan-info") vi.child_add_string("interface-name", "<interface-name>") vi.child_add_string("node", "<node>") vi.child_add_string("parent-interface", "<parent-interface>") vi.child_add_string("vlanid", "<vlanid>") des_attr.child_add(vi) call.child_add(des_attr) resp, err_resp = self._INVOKE_CHECK( server, call, cmd + ": " + parent + ":" + vlan_id) if err_resp: return err_resp #LOGGER.debug(resp.sprintf()) vlan_cnt = self._GET_INT(resp, 'num-records') if not vlan_cnt or vlan_cnt < 1: # either None or 0 evaluates to False return self._CREATE_FAIL_RESPONSE( 'no vlans or too many found for query: [' + str(cmd_data_json) + '] result is: ' + resp.sprintf()) if not resp.child_get("attributes-list"): return self._CREATE_FAIL_RESPONSE('no vlan data found in: ' + resp.sprintf()) vlan_info = resp.child_get("attributes-list").children_get()[0] dd = { "name": self._GET_STRING(vlan_info, "interface-name"), "node_name": self._GET_STRING(vlan_info, "node"), "parent_name": self._GET_STRING(vlan_info, "parent-interface"), "vlan_id": self._GET_STRING(vlan_info, "vlanid") } return {'success': True, 'errmsg': '', 'data': dd}
def execute(self, server, cmd_data_json): if "name" not in cmd_data_json: return self._CREATE_FAIL_RESPONSE( "broadcast domain status commands must" + " have name defined, got: " + str(cmd_data_json)) name = cmd_data_json["name"] cmd = "net-port-broadcast-domain-get-iter" call = NaElement(cmd) qe = NaElement("query") qe_bcdi = NaElement("net-port-broadcast-domain-info") qe_bcdi.child_add_string("broadcast-domain", name) qe.child_add(qe_bcdi) call.child_add(qe) dattr = NaElement("desired-attributes") bcdi = NaElement("net-port-broadcast-domain-info") bcdi.child_add_string("port-update-status-combined", "<port-update-status-combined>") dattr.child_add(bcdi) call.child_add(dattr) resp, err_resp = self._INVOKE_CHECK(server, call, cmd + ": " + name) if err_resp: return err_resp # LOGGER.debug(resp.sprintf()) bcd_cnt = self._GET_INT(resp, 'num-records') if bcd_cnt != 1: # too many bc domains found for query return self._CREATE_FAIL_RESPONSE( 'too many broadcast domains found for' + ' query: [' + str(cmd_data_json) + '] result is: ' + resp.sprintf()) if not resp.child_get("attributes-list"): return self._CREATE_FAIL_RESPONSE( 'no broadcast domain info data found in: ' + resp.sprintf()) bcd_info = resp.child_get("attributes-list").children_get()[0] dd = { "update_status": self._GET_STRING(bcd_info, "port-update-status-combined"), } return {'success': True, 'errmsg': '', 'data': dd}
def create(self, cluster): api_call = NaElement('aggr-create') api_call.child_add_string('aggregate', self.aggr_name) api_call.child_add_string('disk-count', self.disk_count) api_call.child_add_string('disk-type', self.disk_type) api_call.child_add_string('raid-type', self.raid_type) api_call.child_add_string('raid-size', self.raid_size) api_child_nodes = NaElement('nodes') api_child_nodes.child_add_string('node-name', self.node_name) api_call.child_add(api_child_nodes) output = cluster.run_command(api_call) return output.results_status(), output.sprintf()
def execute(self, server, cmd_data_json): if "name" not in cmd_data_json: return self._CREATE_FAIL_RESPONSE( 'create IPSpace request must have name' + ' defined, got: ' + str(cmd_data_json)) name = cmd_data_json["name"] cmd = "net-ipspaces-create" call = NaElement(cmd) call.child_add_string("ipspace", name) call.child_add_string("return-record", "true") resp, err_resp = self._INVOKE_CHECK(server, call, cmd + ": " + name) if err_resp: return err_resp if not (resp.child_get("result") and resp.child_get("result").child_get("net-ipspaces-info")): return self._CREATE_FAIL_RESPONSE( 'no ipspace info received from create, got: ' + resp.sprintf()) ipspace_info = resp.child_get("result").child_get("net-ipspaces-info") dd = {"uuid": self._GET_STRING(ipspace_info, "uuid")} return {'success': True, 'errmsg': '', 'data': dd}
def svm_execute(self, svm, cmd_data_json): if ( "name" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( 'volume [' + self._get_simple_cmd() + '] request must have name ' + 'defined, got: ' + str(cmd_data_json)) name = cmd_data_json['name'] cmd = "volume-" + self._get_simple_cmd() call = NaElement(cmd) call.child_add_string("name", name) resp, err_resp = self._INVOKE_CHECK( svm, call, cmd + ": " + name) #LOGGER.debug(resp.sprintf()) if err_resp: return err_resp return self._CREATE_EMPTY_RESPONSE(True, "")
def execute(self, server, cmd_data_json): if ( "name" not in cmd_data_json or "new_name" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( 'SVM rename request must have ' + 'name and new_name defined, got: ' + str(cmd_data_json)) name = cmd_data_json['name'] new_name = cmd_data_json['new_name'] cmd = "vserver-rename" call = NaElement(cmd) call.child_add_string("vserver-name", name) call.child_add_string("new-name", new_name) resp, err_resp = self._INVOKE_CHECK( server, call, cmd + ": " + name + ' --> ' + new_name) #LOGGER.debug(resp.sprintf()) if err_resp: return err_resp return self._CREATE_EMPTY_RESPONSE(True, "")
def execute(self, server, cmd_data_json): if ( "name" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( self._get_simple_cmd() + ' SVM request must have name ' + 'defined, got: ' + str(cmd_data_json)) name = cmd_data_json['name'] cmd = "vserver-" + self._get_simple_cmd() call = NaElement(cmd) call.child_add_string("vserver-name", name) # force will only be present if set otherwise ommitted if 'force' in cmd_data_json: call.child_add_string('force', True) resp, err_resp = self._INVOKE_CHECK( server, call, cmd + ": " + name) #LOGGER.debug(resp.sprintf()) if err_resp: return err_resp return self._CREATE_EMPTY_RESPONSE(True, "")
def execute(self, server, cmd_data_json): if ("node" not in cmd_data_json or "name" not in cmd_data_json or "ports" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( "port group port " + self._get_cmd_type() + " commands must" + " have node, name and ports defined" + ", got: " + str(cmd_data_json)) node = cmd_data_json["node"] name = cmd_data_json["name"] ports = cmd_data_json["ports"] cmd = ("net-port-ifgrp-" + self._get_cmd_type() + "-port") # ifgrp only allows add/remove of single port... for port in ports: call = NaElement(cmd) call.child_add_string("ifgrp-name", name) call.child_add_string("node", node) call.child_add_string("port", port) resp, err_resp = self._INVOKE_CHECK( server, call, cmd + ": " + node + " [" + name + "]" + self._get_cmd_type() + " " + port) if err_resp: return err_resp #LOGGER.debug(resp.sprintf()) return self._CREATE_EMPTY_RESPONSE(True, "")
def execute(self, server, cmd_data_json): if ("node" not in cmd_data_json or "name" not in cmd_data_json or "mode" not in cmd_data_json or "dist" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( "port group create commands must" + " have node, name, mode" + " and distribution defined" + ", got: " + str(cmd_data_json)) node = cmd_data_json["node"] name = cmd_data_json["name"] mode = cmd_data_json["mode"] dist = cmd_data_json["dist"] cmd = "net-port-ifgrp-create" call = NaElement(cmd) call.child_add_string("distribution-function", dist) call.child_add_string("ifgrp-name", name) call.child_add_string("mode", mode) call.child_add_string("node", node) call.child_add_string("return-record", False) resp, err_resp = self._INVOKE_CHECK( server, call, cmd + ": " + node + " [" + name + "]") if err_resp: return err_resp #LOGGER.debug(resp.sprintf()) return self._CREATE_EMPTY_RESPONSE(True, "")
def execute(self, server, cmd_data_json): if ("node" not in cmd_data_json or "port" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( 'modify port request must have node and port defined, got: ' + str(cmd_data_json)) node = cmd_data_json["node"] port = cmd_data_json["port"] cmd = "net-port-modify" call = NaElement(cmd) call.child_add_string("node", node) call.child_add_string("port", port) for cmd_data_key, netapp_cmd_str in self.__cmd_mapping.items(): if cmd_data_key in cmd_data_json: call.child_add_string(netapp_cmd_str, cmd_data_json[cmd_data_key]) _, err_resp = self._INVOKE_CHECK(server, call, cmd + ": " + node + ":" + port) if err_resp: return err_resp return self._CREATE_EMPTY_RESPONSE(True, "")
def execute(self, server, cmd_data_json): if ("name" not in cmd_data_json or "ipspace" not in cmd_data_json or "mtu" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( "broadcast domain update commands must" + " have name, ipspace and mtu defined," + " got: " + str(cmd_data_json)) name = cmd_data_json["name"] ipspace = cmd_data_json["ipspace"] mtu = cmd_data_json["mtu"] cmd = "net-port-broadcast-domain-modify" call = NaElement(cmd) call.child_add_string("broadcast-domain", name) call.child_add_string("ipspace", ipspace) call.child_add_string("mtu", mtu) resp, err_resp = self._INVOKE_CHECK( server, call, cmd + ": " + name + " [" + ipspace + "]") if err_resp: return err_resp # LOGGER.debug(resp.sprintf()) dd = { "update_status": self._GET_STRING(resp, "port-update-status-combined"), } return {'success': True, 'errmsg': '', 'data': dd}
def execute(self, server, cmd_data_json): if ("name" not in cmd_data_json or "ipspace" not in cmd_data_json or ("subnet" not in cmd_data_json and "gateway" not in cmd_data_json)): return self._CREATE_FAIL_RESPONSE( "subnet modify must" + " have name, ipspace and either" + " gateway or subnet defined" + ", got: " + str(cmd_data_json)) name = cmd_data_json["name"] ipspace = cmd_data_json["ipspace"] cmd = "net-subnet-modify" call = NaElement(cmd) call.child_add_string("subnet-name", name) call.child_add_string("ipspace", ipspace) if "gateway" in cmd_data_json: call.child_add_string("gateway", cmd_data_json["gateway"]) if "subnet" in cmd_data_json: call.child_add_string("subnet", cmd_data_json["subnet"]) _, err_resp = self._INVOKE_CHECK( server, call, cmd + ": " + name + " [" + ipspace + "] <-- " + str(cmd_data_json)) if err_resp: return err_resp # LOGGER.debug(resp.sprintf()) return self._CREATE_EMPTY_RESPONSE(True, "")
def execute(self, server, cmd_data_json): if ("name" not in cmd_data_json or "ipspace" not in cmd_data_json or "new_name" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( "subnet rename commands must" + " have name, new name and ipspace defined" + ", got: " + str(cmd_data_json)) name = cmd_data_json["name"] ipspace = cmd_data_json["ipspace"] new_name = cmd_data_json["new_name"] cmd = "net-subnet-rename" call = NaElement(cmd) call.child_add_string("subnet-name", name) call.child_add_string("ipspace", ipspace) call.child_add_string("new-name", new_name) _, err_resp = self._INVOKE_CHECK( server, call, cmd + ": " + name + " [" + ipspace + "] --> " + new_name) if err_resp: return err_resp # LOGGER.debug(resp.sprintf()) return self._CREATE_EMPTY_RESPONSE(True, "")
def set_properties(self, cluster): api_call = NaElement('vserver-modify') api_call.child_add_string('vserver-name', self.vserver_name) api_child_aggrs = NaElement('aggr-list') for aggr in self.aggr_list: api_child_aggrs.child_add_string('aggr-name', aggr) api_child_protocols = NaElement('allowed-protocols') for protocol in self.allowed_protocols: api_child_protocols.child_add_string('protocol', protocol) api_call.child_add(api_child_aggrs) api_call.child_add(api_child_protocols) output = cluster.run_command(api_call) return output.results_status(), output.sprintf()
def create(self, svm): api_call = NaElement('igroup-create') api_call.child_add_string('initiator-group-name', self.initiator_group_name) api_call.child_add_string('initiator-group-type', self.initiator_group_type) api_call.child_add_string('os-type', self.os_type) output = svm.run_command(api_call) return output.results_status(), output.sprintf()
def create(self, cluster): api_call = NaElement('vserver-create-async') api_call.child_add_string('vserver-name', self.vserver_name) api_call.child_add_string('root-volume', self.root_volume) api_call.child_add_string('root-volume-aggregate', self.root_volume_aggregate) api_call.child_add_string('root-volume-security-style', self.root_volume_security_style) output = cluster.run_command(api_call) return output.results_status(), output.sprintf()
def mapping(self, svm): results = [] for igroup in self.igroup_name: api_call = NaElement('lun-map') api_call.child_add_string('path', self.path) api_call.child_add_string('initiator-group', igroup) output = svm.run_command(api_call) results.append( (output.results_status(), output.sprintf(), self.path, igroup)) return results
def create(self, svm): api_call = NaElement('lun-create-by-size') api_call.child_add_string('path', self.path) api_call.child_add_string('size', self.size) api_call.child_add_string('ostype', self.ostype) api_call.child_add_string('space-reservation-enabled', self.space_reservation_enabled) api_call.child_add_string('space-allocation-enabled', self.space_allocation_enabled) output = svm.run_command(api_call) return output.results_status(), output.sprintf()
def add_initiators(self, svm): results = [] for wwpn in self.initiator_list: api_call = NaElement('igroup-add') api_call.child_add_string('initiator-group-name', self.initiator_group_name) api_call.child_add_string('initiator', wwpn) output = svm.run_command(api_call) results.append((output.results_status(), output.sprintf(), self.initiator_group_name, wwpn)) return results
def execute(self, server, cmd_data_json): if ("name" not in cmd_data_json or "ipspace" not in cmd_data_json or "ports" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( "broadcast domain port " + self._get_cmd_type() + " commands must" + " have name, ipspace and ports defined" + ", got: " + str(cmd_data_json)) name = cmd_data_json["name"] ipspace = cmd_data_json["ipspace"] ports = cmd_data_json["ports"] cmd = ("net-port-broadcast-domain-" + self._get_cmd_type() + "-ports") call = NaElement(cmd) call.child_add_string("broadcast-domain", name) call.child_add_string("ipspace", ipspace) ports_el = NaElement("ports") for port_name in ports: ports_el.child_add_string("net-qualified-port-name", port_name) call.child_add(ports_el) resp, err_resp = self._INVOKE_CHECK( server, call, cmd + ": " + name + " [" + ipspace + "]" + self._get_cmd_type() + str(ports)) if err_resp: return err_resp # LOGGER.debug(resp.sprintf()) dd = { "update_status": self._GET_STRING(resp, "port-update-status-combined"), } return {'success': True, 'errmsg': '', 'data': dd}
def execute(self, server, cmd_data_json): if ("node" not in cmd_data_json or "port" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( 'find port by pattern request must have' + ' node and port defined, got: ' + str(cmd_data_json)) node = cmd_data_json["node"] port = cmd_data_json["port"] cmd = "net-port-get-iter" call = NaElement(cmd) qe = NaElement("query") qe_npi = NaElement("net-port-info") qe_npi.child_add_string("node", node) qe_npi.child_add_string("port", port) qe.child_add(qe_npi) call.child_add(qe) des_attr = NaElement("desired-attributes") npi = NaElement("net-port-info") npi.child_add_string("port", "<port>") des_attr.child_add(npi) call.child_add(des_attr) resp, err_resp = self._INVOKE_CHECK(server, call, cmd + ": " + node + ":" + port) if err_resp: return err_resp #LOGGER.debug(resp.sprintf()) ports = [] if resp.child_get("attributes-list"): for port_info in resp.child_get("attributes-list").children_get(): ports.append(self._GET_STRING(port_info, "port")) return {'success': True, 'errmsg': '', 'data': {'ports': ports}}
def execute(self, server, cmd_data_json): if ("name" not in cmd_data_json or "mtu" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( "broadcast domain create commands must" + " have name and mtu defined, got: " + str(cmd_data_json)) name = cmd_data_json["name"] mtu = cmd_data_json["mtu"] cmd = "net-port-broadcast-domain-create" call = NaElement(cmd) call.child_add_string("broadcast-domain", name) call.child_add_string("mtu", mtu) if "ipspace" in cmd_data_json: call.child_add_string("ipspace", cmd_data_json["ipspace"]) if "ports" in cmd_data_json: ports = NaElement("ports") for port_name in cmd_data_json["ports"]: ports.child_add_string("net-qualified-port-name", port_name) call.child_add(ports) resp, err_resp = self._INVOKE_CHECK(server, call, cmd + ": " + name) if err_resp: return err_resp # LOGGER.debug(resp.sprintf()) dd = { "update_status": self._GET_STRING(resp, "port-update-status-combined"), } return {'success': True, 'errmsg': '', 'data': dd}
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 create(self, svm): api_call = NaElement('volume-create') api_call.child_add_string('volume', self.volume) api_call.child_add_string('containing-aggr-name', self.containing_aggr_name) api_call.child_add_string('size', self.size) api_call.child_add_string('volume-type', self.volume_type) api_call.child_add_string('volume-security-style', self.volume_security_style) api_call.child_add_string('snapshot-policy', self.snapshot_policy) api_call.child_add_string('percentage-snapshot-reserve', self.percentage_snapshot_reserve) api_call.child_add_string('efficiency-policy', self.efficiency_policy) output = svm.run_command(api_call) return output.results_status(), output.sprintf()
def execute(self, server, cmd_data_json): if "name" not in cmd_data_json: return self._CREATE_FAIL_RESPONSE( 'delete ipspace must have name defined, got: ' + str(cmd_data_json)) name = cmd_data_json["name"] cmd = "net-ipspaces-destroy" call = NaElement(cmd) call.child_add_string("ipspace", name) _, err_resp = self._INVOKE_CHECK(server, call, cmd + ": " + name) if err_resp: return err_resp return self._CREATE_EMPTY_RESPONSE(True, "")
def svm_execute(self, svm, cmd_data_json): if ( "name" not in cmd_data_json): return self._CREATE_FAIL_RESPONSE( 'SVM volume size request must have name ' + 'defined, got: ' + str(cmd_data_json)) name = cmd_data_json['name'] cmd = "volume-size" call = NaElement(cmd) call.child_add_string("volume", name) if 'size' in cmd_data_json: call.child_add_string( 'new-size', cmd_data_json['size']) resp, err_resp = self._INVOKE_CHECK( svm, call, cmd + ": " + name) #LOGGER.debug(resp.sprintf()) if err_resp: return err_resp dd = { "size": self._GET_STRING(resp, "volume-size"), } # if resp.child_get("result-jobid"): # dd["jobid"] = self._GET_INT(resp, "result-jobid") # if resp.child_get('result-error-code'): # dd["errno"] = self._GET_INT(resp, "result-error-code") # if resp.child_get('result-error-message'): # dd["errmsg"] = self._GET_STRING(resp, "result-error-message") return { 'success' : True, 'errmsg': '', 'data': dd}