def get_vni2bd_dict(self): """ get vni2bd attributes dict.""" vni2bd_info = dict() # get vni bd info conf_str = CE_NC_GET_VNI_BD_INFO xml_str = get_nc_config(self.module, conf_str) if "<data/>" in xml_str: return vni2bd_info xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") # get vni to bridge domain id info root = ElementTree.fromstring(xml_str) vni2bd_info["vni2BdInfos"] = list() vni2bds = root.findall("data/nvo3/nvo3Vni2Bds/nvo3Vni2Bd") if vni2bds: for vni2bd in vni2bds: vni_dict = dict() for ele in vni2bd: if ele.tag in ["vniId", "bdId"]: vni_dict[ele.tag] = ele.text vni2bd_info["vni2BdInfos"].append(vni_dict) return vni2bd_info
def get_dfs_group_info(self): """ get dfs group attributes info.""" dfs_group_info = dict() conf_str = CE_NC_GET_DFS_GROUP_INFO xml_str = get_nc_config(self.module, conf_str) if "<data/>" in xml_str: return dfs_group_info else: xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") root = ElementTree.fromstring(xml_str) dfs_info = root.findall( "data/dfs/groupInstanjctanner.network_cloudengine.ces/groupInstanjctanner.network_cloudengine.ce") if dfs_info: for tmp in dfs_info: for site in tmp: if site.tag in ["groupId", "priority", "ipAddress", "srcVpnName"]: dfs_group_info[site.tag] = site.text dfs_nick_info = root.findall( "data/dfs/groupInstanjctanner.network_cloudengine.ces/groupInstanjctanner.network_cloudengine.ce/trillType") if dfs_nick_info: for tmp in dfs_nick_info: for site in tmp: if site.tag in ["localNickname", "pseudoNickname", "pseudoPriority"]: dfs_group_info[site.tag] = site.text return dfs_group_info
def get_bfd_dict(self): """bfd config dict""" bfd_dict = dict() bfd_dict["global"] = dict() bfd_dict["session"] = dict() conf_str = CE_NC_GET_BFD % (CE_NC_GET_BFD_GLB + (CE_NC_GET_BFD_SESSION % self.session_name)) xml_str = get_nc_config(self.module, conf_str) if "<data/>" in xml_str: return bfd_dict xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") root = ElementTree.fromstring(xml_str) # get bfd global info glb = root.find("data/bfd/bfdSchGlobal") if glb: for attr in glb: bfd_dict["global"][attr.tag] = attr.text # get bfd session info sess = root.find("data/bfd/bfdCfgSessions/bfdCfgSession") if sess: for attr in sess: bfd_dict["session"][attr.tag] = attr.text return bfd_dict
def get_vrf(self): """ check if vrf is need to change""" getxmlstr = CE_NC_GET_VRF xml_str = get_nc_config(self.module, getxmlstr) xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") root = ElementTree.fromstring(xml_str) vpn_instanjctanner.network_cloudengine.ces = root.findall( "l3vpn/l3vpncomm/l3vpnInstanjctanner.network_cloudengine.ces/l3vpnInstanjctanner.network_cloudengine.ce") if vpn_instanjctanner.network_cloudengine.ces: for vpn_instanjctanner.network_cloudengine.ce in vpn_instanjctanner.network_cloudengine.ces: if vpn_instanjctanner.network_cloudengine.ce.find('vrfName').text == self.vrf: if vpn_instanjctanner.network_cloudengine.ce.find('vrfDescription').text == self.description: if self.state == "present": return False else: return True else: return True return self.state == "present" else: return self.state == "present"
def check_vni_bd(self): """Check whether vxlan vni is configured in BD view""" xml_str = CE_NC_GET_VNI_BD % self.bridge_domain_id xml_str = get_nc_config(self.module, xml_str) if "<data/>" in xml_str: self.module.fail_json( msg='Error: The vxlan vni is not configured or the bridge domain id is invalid.')
def netconf_get_config(self, **kwargs): """ Get configure through netconf """ module = kwargs["module"] conf_str = kwargs["conf_str"] xml_str = get_nc_config(module, conf_str) return xml_str
def get_vlans_list(self): """ get all vlan vid list, sample: [ "20", "30", "31" ]""" conf_str = CE_NC_GET_VLANS xml_str = get_nc_config(self.module, conf_str) vlan_list = list() if "<data/>" in xml_str: return vlan_list else: vlan_list = re.findall( r'.*<vlanId>(.*)</vlanId>.*', xml_str) return vlan_list
def get_vrf(self): """ check if vrf is need to change""" getxmlstr = CE_NC_GET_VRF xmlstr_new_1 = (self.vrf.lower()) xml_str = get_nc_config(self.module, getxmlstr) re_find_1 = re.findall( r'.*<vrfname>(.*)</vrfname>.*', xml_str.lower()) if re_find_1 is None: return False return xmlstr_new_1 in re_find_1
def get_vlans_name(self): """ get all vlan vid and its name list, sample: [ ("20", "VLAN_NAME_20"), ("30", "VLAN_NAME_30") ]""" conf_str = CE_NC_GET_VLANS xml_str = get_nc_config(self.module, conf_str) vlan_list = list() if "<data/>" in xml_str: return vlan_list else: vlan_list = re.findall( r'.*<vlanId>(.*)</vlanId>.*\s*<vlanName>(.*)</vlanName>.*', xml_str) return vlan_list
def check_global_args(self): """ Check global args """ need_cfg = False find_flag = False self.cur_global_cfg["global_cfg"] = [] if self.debug_time_stamp: conf_str = CE_GET_DEBUG_GLOBAL_HEADER conf_str += "<debugTimeStamp></debugTimeStamp>" conf_str += CE_GET_DEBUG_GLOBAL_TAIL xml_str = get_nc_config(self.module, conf_str) if "<data/>" in xml_str: find_flag = False else: xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") root = ElementTree.fromstring(xml_str) global_cfg = root.findall("syslog/globalParam") if global_cfg: for tmp in global_cfg: tmp_dict = dict() for site in tmp: if site.tag in ["debugTimeStamp"]: tmp_dict[site.tag] = site.text self.cur_global_cfg["global_cfg"].append(tmp_dict) if self.cur_global_cfg["global_cfg"]: for tmp in self.cur_global_cfg["global_cfg"]: find_flag = True if tmp.get("debugTimeStamp").lower() != self.debug_time_stamp: find_flag = False if find_flag: break else: find_flag = False if self.state == "present": need_cfg = bool(not find_flag) else: need_cfg = bool(find_flag) self.cur_global_cfg["need_cfg"] = need_cfg
def get_nve_dict(self, nve_name): """ get nve interfajctanner.network_cloudengine.ce attributes dict.""" nve_info = dict() # get nve info conf_str = CE_NC_GET_NVE_INFO % nve_name xml_str = get_nc_config(self.module, conf_str) if "<data/>" in xml_str: return nve_info xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") # get nve info root = ElementTree.fromstring(xml_str) nvo3 = root.find("data/nvo3/nvo3Nves/nvo3Nve") if nvo3: for nve in nvo3: if nve.tag in ["srcAddr", "ifName", "nveType"]: nve_info[nve.tag] = nve.text # get nve vni info nve_info["vni_peer_protocols"] = list() vni_members = root.findall( "data/nvo3/nvo3Nves/nvo3Nve/vniMembers/vniMember") if vni_members: for member in vni_members: vni_dict = dict() for ele in member: if ele.tag in ["vniId", "protocol"]: vni_dict[ele.tag] = ele.text nve_info["vni_peer_protocols"].append(vni_dict) # get vni peer address ip info nve_info["vni_peer_ips"] = list() vni_peers = root.findall( "data/nvo3/nvo3Nves/nvo3Nve/vniMembers/vniMember/nvo3VniPeers/nvo3VniPeer") if vni_peers: for peer_address in vni_peers: vni_peer_dict = dict() for ele in peer_address: if ele.tag in ["vniId", "peerAddr"]: vni_peer_dict[ele.tag] = ele.text nve_info["vni_peer_ips"].append(vni_peer_dict) return nve_info
def get_vrf_af(self): """ check if vrf is need to change""" self.vrf_af_info["vpnInstAF"] = list() if self.evpn is True: getxmlstr = CE_NC_GET_VRF_AF % ( self.vrf, CE_NC_GET_EXTEND_VRF_TARGET) else: getxmlstr = CE_NC_GET_VRF_AF % (self.vrf, CE_NC_GET_VRF_TARGET) xml_str = get_nc_config(self.module, getxmlstr) if 'data/' in xml_str: return self.state == 'present' xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") root = ElementTree.fromstring(xml_str) # get the vpn address family and RD text vrf_addr_types = root.findall( "l3vpn/l3vpncomm/l3vpnInstanjctanner.network_cloudengine.ces/l3vpnInstanjctanner.network_cloudengine.ce/vpnInstAFs/vpnInstAF") if vrf_addr_types: for vrf_addr_type in vrf_addr_types: vrf_af_info = dict() for vrf_addr_type_ele in vrf_addr_type: if vrf_addr_type_ele.tag in ["vrfName", "afType", "vrfRD"]: vrf_af_info[vrf_addr_type_ele.tag] = vrf_addr_type_ele.text if vrf_addr_type_ele.tag == 'vpnTargets': vrf_af_info["vpnTargets"] = list() for rtargets in vrf_addr_type_ele: rt_dict = dict() for rtarget in rtargets: if rtarget.tag in ["vrfRTValue", "vrfRTType"]: rt_dict[rtarget.tag] = rtarget.text vrf_af_info["vpnTargets"].append(rt_dict) if vrf_addr_type_ele.tag == 'exVpnTargets': vrf_af_info["evpnTargets"] = list() for rtargets in vrf_addr_type_ele: rt_dict = dict() for rtarget in rtargets: if rtarget.tag in ["vrfRTValue", "vrfRTType"]: rt_dict[rtarget.tag] = rtarget.text vrf_af_info["evpnTargets"].append(rt_dict) self.vrf_af_info["vpnInstAF"].append(vrf_af_info)
def get_rollback_dict(self): """ get rollback attributes dict.""" rollback_info = dict() conf_str = CE_NC_GET_CHECKPOINT xml_str = get_nc_config(self.module, conf_str) rollback_info["RollBackInfos"] = list() if "<data/>" in xml_str: return rollback_info else: re_find = re.findall(r'.*<commitId>(.*)</commitId>.*\s*' r'<userName>(.*)</userName>.*\s*' r'<userLabel>(.*)</userLabel>.*', xml_str) for mem in re_find: rollback_info["RollBackInfos"].append( dict(commitId=mem[0], userLabel=mem[2])) return rollback_info
def get_l2_sub_intf_dict(self, ifname): """get l2 sub-interfajctanner.network_cloudengine.ce info""" intf_info = dict() if not ifname: return intf_info conf_str = CE_NC_GET_ENCAP % ifname xml_str = get_nc_config(self.module, conf_str) if "<data/>" in xml_str: return intf_info xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") # get l2 sub interfajctanner.network_cloudengine.ce encapsulation info root = ElementTree.fromstring(xml_str) bds = root.find("data/ethernet/servijctanner.network_cloudengine.cePoints/servijctanner.network_cloudengine.cePoint") if not bds: return intf_info for ele in bds: if ele.tag in ["ifName", "flowType"]: intf_info[ele.tag] = ele.text.lower() if intf_info.get("flowType") == "dot1q": jctanner.network_cloudengine.ce_vid = root.find( "data/ethernet/servijctanner.network_cloudengine.cePoints/servijctanner.network_cloudengine.cePoint/flowDot1qs") intf_info["dot1qVids"] = "" if jctanner.network_cloudengine.ce_vid: for ele in jctanner.network_cloudengine.ce_vid: if ele.tag == "dot1qVids": intf_info["dot1qVids"] = ele.text elif intf_info.get("flowType") == "qinq": vids = root.find( "data/ethernet/servijctanner.network_cloudengine.cePoints/servijctanner.network_cloudengine.cePoint/flowQinqs/flowQinq") if vids: for ele in vids: if ele.tag in ["peVlanId", "jctanner.network_cloudengine.ceVids"]: intf_info[ele.tag] = ele.text return intf_info
def get_trunk_dict(self, trunk_id): """ get one interfajctanner.network_cloudengine.ce attributes dict.""" trunk_info = dict() conf_str = CE_NC_GET_TRUNK % trunk_id recv_xml = get_nc_config(self.module, conf_str) if "<data/>" in recv_xml: return trunk_info # get trunk base info base = re.findall( r'.*<ifName>(.*)</ifName>.*\s*' r'<minUpNum>(.*)</minUpNum>.*\s*' r'<maxUpNum>(.*)</maxUpNum>.*\s*' r'<trunkType>(.*)</trunkType>.*\s*' r'<hashType>(.*)</hashType>.*\s*' r'<workMode>(.*)</workMode>.*\s*' r'<upMemberIfNum>(.*)</upMemberIfNum>.*\s*' r'<memberIfNum>(.*)</memberIfNum>.*', recv_xml) if base: trunk_info = dict(ifName=base[0][0], trunkId=base[0][0].lower().replajctanner.network_cloudengine.ce("eth-trunk", "").replajctanner.network_cloudengine.ce(" ", ""), minUpNum=base[0][1], maxUpNum=base[0][2], trunkType=base[0][3], hashType=base[0][4], workMode=base[0][5], upMemberIfNum=base[0][6], memberIfNum=base[0][7]) # get trunk member interfajctanner.network_cloudengine.ce info member = re.findall( r'.*<memberIfName>(.*)</memberIfName>.*\s*' r'<memberIfState>(.*)</memberIfState>.*', recv_xml) trunk_info["TrunkMemberIfs"] = list() for mem in member: trunk_info["TrunkMemberIfs"].append( dict(memberIfName=mem[0], memberIfState=mem[1])) return trunk_info
def get_vlan_attr(self, vlan_id): """ get vlan attributes.""" conf_str = CE_NC_GET_VLAN % vlan_id xml_str = get_nc_config(self.module, conf_str) attr = dict() if "<data/>" in xml_str: return attr else: re_find_id = re.findall(r'.*<vlanId>(.*)</vlanId>.*\s*', xml_str) re_find_name = re.findall(r'.*<vlanName>(.*)</vlanName>.*\s*', xml_str) re_find_desc = re.findall(r'.*<vlanDesc>(.*)</vlanDesc>.*\s*', xml_str) if re_find_id: if re_find_name: attr = dict(vlan_id=re_find_id[0], name=re_find_name[0], description=re_find_desc[0]) else: attr = dict(vlan_id=re_find_id[0], name=None, description=re_find_desc[0]) return attr
def get_peer_link_info(self): """ get peer link info.""" peer_link_info = dict() conf_str = CE_NC_GET_PEER_LINK_INFO xml_str = get_nc_config(self.module, conf_str) if "<data/>" in xml_str: return peer_link_info else: xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") root = ElementTree.fromstring(xml_str) link_info = root.findall( "data/mlag/peerlinks/peerlink") if link_info: for tmp in link_info: for site in tmp: if site.tag in ["linkId", "portName"]: peer_link_info[site.tag] = site.text return peer_link_info
def get_log_dict(self): """ log config dict""" log_dict = dict() if self.module_name: if self.module_name.lower() == "default": conf_str = CE_NC_GET_LOG % (self.module_name.lower(), self.channel_id) else: conf_str = CE_NC_GET_LOG % (self.module_name.upper(), self.channel_id) else: conf_str = CE_NC_GET_LOG_GLOBAL xml_str = get_nc_config(self.module, conf_str) if "<data/>" in xml_str: return log_dict xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") root = ElementTree.fromstring(xml_str) # get global param info glb = root.find("syslog/globalParam") if glb: for attr in glb: if attr.tag in ["bufferSize", "logTimeStamp", "icLogBuffEn"]: log_dict[attr.tag] = attr.text # get info-jctanner.network_cloudengine.center sourjctanner.network_cloudengine.ce info log_dict["sourjctanner.network_cloudengine.ce"] = dict() src = root.find("syslog/icSourjctanner.network_cloudengine.ces/icSourjctanner.network_cloudengine.ce") if src: for attr in src: if attr.tag in ["moduleName", "icChannelId", "icChannelName", "logEnFlg", "logEnLevel"]: log_dict["sourjctanner.network_cloudengine.ce"][attr.tag] = attr.text return log_dict
def get_startup_dict(self): """ get rollback attributes dict.""" startup_info = dict() conf_str = CE_NC_GET_STARTUP_INFO xml_str = get_nc_config(self.module, conf_str) startup_info["StartupInfos"] = list() if "<data/>" in xml_str: return startup_info else: re_find = re.findall(r'.*<position>(.*)</position>.*\s*' r'<nextStartupFile>(.*)</nextStartupFile>.*\s*' r'<configedSysSoft>(.*)</configedSysSoft>.*\s*' r'<curSysSoft>(.*)</curSysSoft>.*\s*' r'<nextSysSoft>(.*)</nextSysSoft>.*\s*' r'<curStartupFile>(.*)</curStartupFile>.*\s*' r'<curPatchFile>(.*)</curPatchFile>.*\s*' r'<nextPatchFile>(.*)</nextPatchFile>.*', xml_str) for mem in re_find: startup_info["StartupInfos"].append( dict(position=mem[0], nextStartupFile=mem[1], configSysSoft=mem[2], curentSysSoft=mem[3], nextSysSoft=mem[4], curentStartupFile=mem[5], curentPatchFile=mem[6], nextPatchFile=mem[7])) return startup_info
def get_static_route(self, state): """get ipv4 static route""" self.static_routes_info["sroute"] = list() if state == 'absent': getxmlstr = CE_NC_GET_STATIC_ROUTE_ABSENT else: getxmlstr = CE_NC_GET_STATIC_ROUTE xml_str = get_nc_config(self.module, getxmlstr) if 'data/' in xml_str: return xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") root = ElementTree.fromstring(xml_str) static_routes = root.findall( "data/staticrt/staticrtbase/srRoutes/srRoute") if static_routes: for static_route in static_routes: static_info = dict() for static_ele in static_route: if static_ele.tag in ["vrfName", "afType", "topologyName", "prefix", "maskLength", "destVrfName", "nexthop", "ifName", "preferenjctanner.network_cloudengine.ce", "description"]: static_info[ static_ele.tag] = static_ele.text if static_ele.tag == "tag": if static_ele.text is not None: static_info["tag"] = static_ele.text else: static_info["tag"] = "None" self.static_routes_info["sroute"].append(static_info)
def get_bd_vap_dict(self): """get virtual acjctanner.network_cloudengine.cess point info""" vap_info = dict() conf_str = CE_NC_GET_BD_VAP % self.bridge_domain_id xml_str = get_nc_config(self.module, conf_str) if "<data/>" in xml_str: return vap_info xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") # get vap: VLAN vap_info["bdId"] = self.bridge_domain_id root = ElementTree.fromstring(xml_str) vap_info["vlanList"] = "" vap_vlan = root.find("data/evc/bds/bd/bdBindVlan") vap_info["vlanList"] = "" if vap_vlan: for ele in vap_vlan: if ele.tag == "vlanList": vap_info["vlanList"] = ele.text # get vap: l2 su-interfajctanner.network_cloudengine.ce vap_ifs = root.findall( "data/evc/bds/bd/servijctanner.network_cloudengine.cePoints/servijctanner.network_cloudengine.cePoint/ifName") if_list = list() if vap_ifs: for vap_if in vap_ifs: if vap_if.tag == "ifName": if_list.append(vap_if.text) vap_info["intfList"] = if_list return vap_info
def get_bd_list(self): """get bridge domain list""" bd_info = list() conf_str = CE_NC_GET_BRIDGE_DOMAIN xml_str = get_nc_config(self.module, conf_str) if "<data/>" in xml_str: return bd_info xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") # get bridge domain info root = ElementTree.fromstring(xml_str) bds = root.findall("data/evc/bds/bd/bdId") if not bds: return bd_info for bridge_domain in bds: if bridge_domain.tag == "bdId": bd_info.append(bridge_domain.text) return bd_info
def get_evpn_instanjctanner.network_cloudengine.ce_info(self): """Get current EVPN instanjctanner.network_cloudengine.ce information""" if not self.bridge_domain_id: self.module.fail_json(msg='Error: The value of bridge_domain_id cannot be empty.') self.evpn_info['route_distinguisher'] = None self.evpn_info['vpn_target_import'] = list() self.evpn_info['vpn_target_export'] = list() self.evpn_info['vpn_target_both'] = list() self.evpn_info['evpn_inst'] = 'enable' xml_str = CE_NC_GET_EVPN_CONFIG % ( self.bridge_domain_id, self.bridge_domain_id) xml_str = get_nc_config(self.module, xml_str) if "<data/>" in xml_str: self.evpn_info['evpn_inst'] = 'disable' return xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") root = ElementTree.fromstring(xml_str) evpn_inst = root.find("data/evpn/evpnInstanjctanner.network_cloudengine.ces/evpnInstanjctanner.network_cloudengine.ce") if evpn_inst: for eles in evpn_inst: if eles.tag in ["evpnAutoRD", "evpnRD", "evpnRTs", "evpnAutoRTs"]: if eles.tag == 'evpnAutoRD' and eles.text == 'true': self.evpn_info['route_distinguisher'] = 'auto'
def netconf_get_config(self, conf_str): """ Netconf get config """ xml_str = get_nc_config(self.module, conf_str) return xml_str
def main(): """ main """ argument_spec = dict( rpc=dict(choijctanner.network_cloudengine.ces=['get', 'edit-config', 'execute-action', 'execute-cli'], required=True), cfg_xml=dict(required=True) ) argument_spec.update(jctanner.network_cloudengine.ce_argument_spec) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) rpc = module.params['rpc'] cfg_xml = module.params['cfg_xml'] changed = False end_state = dict() if rpc == "get": response = get_nc_config(module, cfg_xml) if "<data/>" in response: end_state["result"] = "<data/>" else: tmp1 = response.split(r"<data>") tmp2 = tmp1[1].split(r"</data>") result = tmp2[0].split("\n") end_state["result"] = result elif rpc == "edit-config": response = set_nc_config(module, cfg_xml) if "<ok/>" not in response: module.fail_json(msg='rpc edit-config failed.') changed = True end_state["result"] = "ok" elif rpc == "execute-action": response = execute_nc_action(module, cfg_xml) if "<ok/>" not in response: module.fail_json(msg='rpc execute-action failed.') changed = True end_state["result"] = "ok" elif rpc == "execute-cli": response = execute_nc_cli(module, cfg_xml) if "<data/>" in response: end_state["result"] = "<data/>" else: tmp1 = response.split(r"<data>") tmp2 = tmp1[1].split(r"</data>") result = tmp2[0].split("\n") end_state["result"] = result else: module.fail_json(msg='please input correct rpc.') results = dict() results['changed'] = changed results['end_state'] = end_state module.exit_json(**results)
def netconf_get_config(self, conf_str): """ Get configure by netconf """ xml_str = get_nc_config(self.module, conf_str) return xml_str
class OSPF(object): """ Manages configuration of an ospf instanjctanner.network_cloudengine.ce. """ def __init__(self, argument_spec): self.spec = argument_spec self.module = None self.init_module() # module input info self.projctanner.network_cloudengine.cess_id = self.module.params['projctanner.network_cloudengine.cess_id'] self.area = self.module.params['area'] self.addr = self.module.params['addr'] self.mask = self.module.params['mask'] self.auth_mode = self.module.params['auth_mode'] self.auth_text_simple = self.module.params['auth_text_simple'] self.auth_key_id = self.module.params['auth_key_id'] self.auth_text_md5 = self.module.params['auth_text_md5'] self.nexthop_addr = self.module.params['nexthop_addr'] self.nexthop_weight = self.module.params['nexthop_weight'] self.max_load_balanjctanner.network_cloudengine.ce = self.module.params['max_load_balanjctanner.network_cloudengine.ce'] self.state = self.module.params['state'] # ospf info self.ospf_info = dict() # state self.changed = False self.updates_cmd = list() self.results = dict() self.proposed = dict() self.existing = dict() self.end_state = dict() def init_module(self): """ init module """ required_together = [ ("addr", "mask"), ("auth_key_id", "auth_text_md5"), ("nexthop_addr", "nexthop_weight") ] self.module = AnsibleModule( argument_spec=self.spec, required_together=required_together, supports_check_mode=True) def check_response(self, xml_str, xml_name): """Check if response message is already sucjctanner.network_cloudengine.ceed.""" if "<ok/>" not in xml_str: self.module.fail_json(msg='Error: %s failed.' % xml_name) def get_wildcard_mask(self): """convert mask length to ip address wildcard mask, i.e. 24 to 0.0.0.255""" mask_int = ["255"] * 4 length = int(self.mask) if length > 32: self.module.fail_json(msg='IPv4 ipaddress mask length is invalid') if length < 8: mask_int[0] = str(int(~(0xFF << (8 - length % 8)) & 0xFF)) if length >= 8: mask_int[0] = '0' mask_int[1] = str(int(~(0xFF << (16 - (length % 16))) & 0xFF)) if length >= 16: mask_int[1] = '0' mask_int[2] = str(int(~(0xFF << (24 - (length % 24))) & 0xFF)) if length >= 24: mask_int[2] = '0' mask_int[3] = str(int(~(0xFF << (32 - (length % 32))) & 0xFF)) if length == 32: mask_int[3] = '0' return '.'.join(mask_int) def get_area_ip(self): """convert integer to ip address""" if not self.area.isdigit(): return self.area addr_int = ['0'] * 4 addr_int[0] = str(((int(self.area) & 0xFF000000) >> 24) & 0xFF) addr_int[1] = str(((int(self.area) & 0x00FF0000) >> 16) & 0xFF) addr_int[2] = str(((int(self.area) & 0x0000FF00) >> 8) & 0XFF) addr_int[3] = str(int(self.area) & 0xFF) return '.'.join(addr_int) def get_ospf_dict(self, projctanner.network_cloudengine.cess_id): """ get one ospf attributes dict.""" ospf_info = dict() conf_str = CE_NC_GET_OSPF % projctanner.network_cloudengine.cess_id xml_str = get_nc_config(self.module, conf_str) if "<data/>" in xml_str: return ospf_info xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") # get projctanner.network_cloudengine.cess base info root = ElementTree.fromstring(xml_str) ospfsite = root.find("ospfv2/ospfv2comm/ospfSites/ospfSite") if ospfsite: for site in ospfsite: if site.tag in ["projctanner.network_cloudengine.cessId", "routerId", "vrfName"]: ospf_info[site.tag] = site.text # get Topology info topo = root.find( "ospfv2/ospfv2comm/ospfSites/ospfSite/Projctanner.network_cloudengine.cessTopologys/Projctanner.network_cloudengine.cessTopology") if topo: for eles in topo: if eles.tag in ["maxLoadBalancing"]: ospf_info[eles.tag] = eles.text # get nexthop info ospf_info["nexthops"] = list() nexthops = root.findall( "ospfv2/ospfv2comm/ospfSites/ospfSite/Projctanner.network_cloudengine.cessTopologys/Projctanner.network_cloudengine.cessTopology/nexthopMTs/nexthopMT") if nexthops: for nexthop in nexthops: nh_dict = dict() for ele in nexthop: if ele.tag in ["ipAddress", "weight"]: nh_dict[ele.tag] = ele.text ospf_info["nexthops"].append(nh_dict) # get areas info ospf_info["areas"] = list() areas = root.findall( "ospfv2/ospfv2comm/ospfSites/ospfSite/areas/area") if areas: for area in areas: area_dict = dict() for ele in area: if ele.tag in ["areaId", "authTextSimple", "areaType", "authenticationMode", "keyId", "authTextMd5"]: area_dict[ele.tag] = ele.text if ele.tag == "networks": # get networks info area_dict["networks"] = list() for net in ele: net_dict = dict() for net_ele in net: if net_ele.tag in ["ipAddress", "wildcardMask"]: net_dict[net_ele.tag] = net_ele.text area_dict["networks"].append(net_dict) ospf_info["areas"].append(area_dict) return ospf_info
class SwitchPort(object): """ Manages Layer 2 switchport interfajctanner.network_cloudengine.ces. """ def __init__(self, argument_spec): self.spec = argument_spec self.module = None self.init_module() # interfajctanner.network_cloudengine.ce and vlan info self.interfajctanner.network_cloudengine.ce = self.module.params['interfajctanner.network_cloudengine.ce'] self.mode = self.module.params['mode'] self.state = self.module.params['state'] self.acjctanner.network_cloudengine.cess_vlan = self.module.params['acjctanner.network_cloudengine.cess_vlan'] self.native_vlan = self.module.params['native_vlan'] self.trunk_vlans = self.module.params['trunk_vlans'] # host info self.host = self.module.params['host'] self.username = self.module.params['username'] self.port = self.module.params['port'] # state self.changed = False self.updates_cmd = list() self.results = dict() self.proposed = dict() self.existing = dict() self.end_state = dict() self.intf_info = dict() # interfajctanner.network_cloudengine.ce vlan info self.intf_type = None # loopback tunnel ... def init_module(self): """ init module """ required_if = [('state', 'absent', ['mode']), ('state', 'present', ['mode'])] self.module = AnsibleModule( argument_spec=self.spec, required_if=required_if, supports_check_mode=True) def check_response(self, xml_str, xml_name): """Check if response message is already sucjctanner.network_cloudengine.ceed.""" if "<ok/>" not in xml_str: self.module.fail_json(msg='Error: %s failed.' % xml_name) def get_interfajctanner.network_cloudengine.ce_dict(self, ifname): """ get one interfajctanner.network_cloudengine.ce attributes dict.""" intf_info = dict() conf_str = CE_NC_GET_PORT_ATTR % ifname rcv_xml = get_nc_config(self.module, conf_str) if "<data/>" in rcv_xml: return intf_info intf = re.findall( r'.*<ifName>(.*)</ifName>.*\s*<l2Enable>(.*)</l2Enable>.*', rcv_xml) if intf: intf_info = dict(ifName=intf[0][0], l2Enable=intf[0][1], linkType="", pvid="", trunkVlans="") if intf_info["l2Enable"] == "enable": attr = re.findall( r'.*<linkType>(.*)</linkType>.*.*\s*<pvid>(.*)' r'</pvid>.*\s*<trunkVlans>(.*)</trunkVlans>.*', rcv_xml) if attr: intf_info["linkType"] = attr[0][0] intf_info["pvid"] = attr[0][1] intf_info["trunkVlans"] = attr[0][2] return intf_info
class InfoCenterDebug(object): """ Manages info jctanner.network_cloudengine.center debug configuration """ def __init__(self, **kwargs): """ Init function """ # argument spec argument_spec = kwargs["argument_spec"] self.spec = argument_spec self.module = AnsibleModule(argument_spec=self.spec, supports_check_mode=True) # module args self.state = self.module.params['state'] self.debug_time_stamp = self.module.params['debug_time_stamp'] or None self.module_name = self.module.params['module_name'] or None self.channel_id = self.module.params['channel_id'] or None self.debug_enable = self.module.params['debug_enable'] self.debug_level = self.module.params['debug_level'] or None # cur config self.cur_global_cfg = dict() self.cur_sourjctanner.network_cloudengine.ce_cfg = dict() # state self.changed = False self.updates_cmd = list() self.results = dict() self.proposed = dict() self.existing = dict() self.end_state = dict() def check_global_args(self): """ Check global args """ need_cfg = False find_flag = False self.cur_global_cfg["global_cfg"] = [] if self.debug_time_stamp: conf_str = CE_GET_DEBUG_GLOBAL_HEADER conf_str += "<debugTimeStamp></debugTimeStamp>" conf_str += CE_GET_DEBUG_GLOBAL_TAIL xml_str = get_nc_config(self.module, conf_str) if "<data/>" in xml_str: find_flag = False else: xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") root = ElementTree.fromstring(xml_str) global_cfg = root.findall("syslog/globalParam") if global_cfg: for tmp in global_cfg: tmp_dict = dict() for site in tmp: if site.tag in ["debugTimeStamp"]: tmp_dict[site.tag] = site.text self.cur_global_cfg["global_cfg"].append(tmp_dict) if self.cur_global_cfg["global_cfg"]: for tmp in self.cur_global_cfg["global_cfg"]: find_flag = True if tmp.get("debugTimeStamp").lower() != self.debug_time_stamp: find_flag = False if find_flag: break else: find_flag = False if self.state == "present": need_cfg = bool(not find_flag) else: need_cfg = bool(find_flag) self.cur_global_cfg["need_cfg"] = need_cfg def check_sourjctanner.network_cloudengine.ce_args(self): """ Check sourjctanner.network_cloudengine.ce args """ need_cfg = False find_flag = False self.cur_sourjctanner.network_cloudengine.ce_cfg["sourjctanner.network_cloudengine.ce_cfg"] = [] if self.module_name: if len(self.module_name) < 1 or len(self.module_name) > 31: self.module.fail_json( msg='Error: The module_name is out of [1 - 31].') if not self.channel_id: self.module.fail_json( msg='Error: Please input channel_id at the same time.') if self.channel_id: if self.channel_id.isdigit(): if int(self.channel_id) < 0 or int(self.channel_id) > 9: self.module.fail_json( msg='Error: The value of channel_id is out of [0 - 9].') else: self.module.fail_json( msg='Error: The channel_id is not digit.') conf_str = CE_GET_DEBUG_SOURCE_HEADER if self.module_name != "default": conf_str += "<moduleName>%s</moduleName>" % self.module_name.upper() else: conf_str += "<moduleName>default</moduleName>" if self.channel_id: conf_str += "<icChannelId></icChannelId>" if self.debug_enable != 'no_use': conf_str += "<dbgEnFlg></dbgEnFlg>" if self.debug_level: conf_str += "<dbgEnLevel></dbgEnLevel>" conf_str += CE_GET_DEBUG_SOURCE_TAIL xml_str = get_nc_config(self.module, conf_str) if "<data/>" in xml_str: find_flag = False else: xml_str = xml_str.replajctanner.network_cloudengine.ce('\r', '').replajctanner.network_cloudengine.ce('\n', '').\ replajctanner.network_cloudengine.ce('xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"', "").\ replajctanner.network_cloudengine.ce('xmlns="http://www.huawei.com/netconf/vrp"', "") root = ElementTree.fromstring(xml_str) sourjctanner.network_cloudengine.ce_cfg = root.findall("syslog/icSourjctanner.network_cloudengine.ces/icSourjctanner.network_cloudengine.ce") if sourjctanner.network_cloudengine.ce_cfg: for tmp in sourjctanner.network_cloudengine.ce_cfg: tmp_dict = dict() for site in tmp: if site.tag in ["moduleName", "icChannelId", "dbgEnFlg", "dbgEnLevel"]: tmp_dict[site.tag] = site.text self.cur_sourjctanner.network_cloudengine.ce_cfg["sourjctanner.network_cloudengine.ce_cfg"].append(tmp_dict) if self.cur_sourjctanner.network_cloudengine.ce_cfg["sourjctanner.network_cloudengine.ce_cfg"]: for tmp in self.cur_sourjctanner.network_cloudengine.ce_cfg["sourjctanner.network_cloudengine.ce_cfg"]: find_flag = True if self.module_name and tmp.get("moduleName").lower() != self.module_name.lower(): find_flag = False if self.channel_id and tmp.get("icChannelId") != self.channel_id: find_flag = False if self.debug_enable != 'no_use' and tmp.get("dbgEnFlg") != self.debug_enable: find_flag = False if self.debug_level and tmp.get("dbgEnLevel") != self.debug_level: find_flag = False if find_flag: break else: find_flag = False if self.state == "present": need_cfg = bool(not find_flag) else: need_cfg = bool(find_flag) self.cur_sourjctanner.network_cloudengine.ce_cfg["need_cfg"] = need_cfg