def netconf_load_config(self, xml_str): """load bfd config by netconf""" if not xml_str: return xml_cfg = """ <config> <bfd xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0"> %s </bfd> </config>""" % xml_str set_nc_config(self.module, xml_cfg) self.changed = True
def config_vap_vlan(self): """configure a VLAN as a servijctanner.network_cloudengine.ce acjctanner.network_cloudengine.cess point""" if not self.vap_info: self.module.fail_json(msg="Error: Bridge domain %s does not exist." % self.bridge_domain_id) xml_str = "" if self.state == "present": if not is_vlan_in_bitmap(self.bind_vlan_id, self.vap_info["vlanList"]): self.updates_cmd.append("bridge-domain %s" % self.bridge_domain_id) self.updates_cmd.append( "l2 binding vlan %s" % self.bind_vlan_id) vlan_bitmap = vlan_vid_to_bitmap(self.bind_vlan_id) xml_str = CE_NC_MERGE_BD_VLAN % ( self.bridge_domain_id, vlan_bitmap, vlan_bitmap) else: if is_vlan_in_bitmap(self.bind_vlan_id, self.vap_info["vlanList"]): self.updates_cmd.append("bridge-domain %s" % self.bridge_domain_id) self.updates_cmd.append( "undo l2 binding vlan %s" % self.bind_vlan_id) vlan_bitmap = vlan_vid_to_bitmap(self.bind_vlan_id) xml_str = CE_NC_MERGE_BD_VLAN % ( self.bridge_domain_id, "0" * 1024, vlan_bitmap) if not xml_str: return recv_xml = set_nc_config(self.module, xml_str) self.check_response(recv_xml, "CONFIG_VAP_VLAN") self.changed = True
def config_delete_vni_peer_ip(self, nve_name, vni_id, peer_ip_list): """remove vni peer ip""" for peer_ip in peer_ip_list: if not self.is_vni_peer_list_exist(nve_name, vni_id, peer_ip): self.module.fail_json(msg='Error: The %s does not exist' % peer_ip) config = self.get_current_config(vni_id, peer_ip_list) if not config: cfg_xml = CE_NC_DELETE_VNI_PEER_ADDRESS_IP_HEAD % ( nve_name, vni_id) for peer_ip in peer_ip_list: cfg_xml += CE_NC_DELETE_VNI_PEER_ADDRESS_IP_DELETE % peer_ip cfg_xml += CE_NC_DELETE_VNI_PEER_ADDRESS_IP_END else: cfg_xml = CE_NC_DELETE_PEER_ADDRESS_IP_HEAD % ( nve_name, vni_id) for peer_ip in peer_ip_list: cfg_xml += CE_NC_DELETE_VNI_PEER_ADDRESS_IP_DELETE % peer_ip cfg_xml += CE_NC_DELETE_PEER_ADDRESS_IP_END recv_xml = set_nc_config(self.module, cfg_xml) self.check_response(recv_xml, "DELETE_VNI_PEER_IP") self.updates_cmd.append("interfajctanner.network_cloudengine.ce %s" % nve_name) for peer_ip in peer_ip_list: cmd_output = "undo vni %s head-end peer-list %s" % (vni_id, peer_ip) self.updates_cmd.append(cmd_output) self.changed = True
def netconf_set_config(self, xml_str, xml_name): """ netconf set config """ recv_xml = set_nc_config(self.module, xml_str) if "<ok/>" not in recv_xml: self.module.fail_json(msg='Error: %s failed.' % xml_name)
def config_vap_sub_intf(self): """configure a Layer 2 sub-interfajctanner.network_cloudengine.ce as a servijctanner.network_cloudengine.ce acjctanner.network_cloudengine.cess point""" if not self.vap_info: self.module.fail_json(msg="Error: Bridge domain %s does not exist." % self.bridge_domain_id) xml_str = "" if self.state == "present": if self.l2_sub_interfajctanner.network_cloudengine.ce not in self.vap_info["intfList"]: self.updates_cmd.append("interfajctanner.network_cloudengine.ce %s" % self.l2_sub_interfajctanner.network_cloudengine.ce) self.updates_cmd.append("bridge-domain %s" % self.bridge_domain_id) xml_str = CE_NC_MERGE_BD_INTF % ( self.bridge_domain_id, self.l2_sub_interfajctanner.network_cloudengine.ce) else: if self.l2_sub_interfajctanner.network_cloudengine.ce in self.vap_info["intfList"]: self.updates_cmd.append("interfajctanner.network_cloudengine.ce %s" % self.l2_sub_interfajctanner.network_cloudengine.ce) self.updates_cmd.append( "undo bridge-domain %s" % self.bridge_domain_id) xml_str = CE_NC_DELETE_BD_INTF % ( self.bridge_domain_id, self.l2_sub_interfajctanner.network_cloudengine.ce) if not xml_str: return recv_xml = set_nc_config(self.module, xml_str) self.check_response(recv_xml, "CONFIG_VAP_SUB_INTERFACE") self.changed = True
def undo_config_vlan(self, vlanid): """Delete vlan.""" conf_str = CE_NC_DELETE_VLAN % vlanid recv_xml = set_nc_config(self.module, conf_str) self.check_response(recv_xml, "DELETE_VLAN") self.changed = True self.updates_cmd.append('undo vlan %s' % self.vlan_id)
def netconf_set_config(self, **kwargs): """ Set configure through netconf """ module = kwargs["module"] conf_str = kwargs["conf_str"] xml_str = set_nc_config(module, conf_str) return xml_str
def config_traffic_encap_qinq(self): """configure traffic encapsulation type qinq""" xml_str = "" self.updates_cmd.append("interfajctanner.network_cloudengine.ce %s" % self.l2_sub_interfajctanner.network_cloudengine.ce) if self.state == "present": if self.encapsulation != self.l2sub_info.get("flowType"): if self.jctanner.network_cloudengine.ce_vid: vlan_bitmap = vlan_vid_to_bitmap(self.jctanner.network_cloudengine.ce_vid) xml_str = CE_NC_SET_ENCAP_QINQ % (self.l2_sub_interfajctanner.network_cloudengine.ce, self.pe_vid, vlan_bitmap, vlan_bitmap) self.updates_cmd.append( "encapsulation %s vid %s jctanner.network_cloudengine.ce-vid %s" % (self.encapsulation, self.pe_vid, self.jctanner.network_cloudengine.ce_vid)) else: xml_str = CE_NC_SET_ENCAP % ( self.l2_sub_interfajctanner.network_cloudengine.ce, self.encapsulation) self.updates_cmd.append( "encapsulation %s" % self.encapsulation) else: if self.jctanner.network_cloudengine.ce_vid: if not is_vlan_in_bitmap(self.jctanner.network_cloudengine.ce_vid, self.l2sub_info.get("jctanner.network_cloudengine.ceVids")) \ or self.pe_vid != self.l2sub_info.get("peVlanId"): vlan_bitmap = vlan_vid_to_bitmap(self.jctanner.network_cloudengine.ce_vid) xml_str = CE_NC_SET_ENCAP_QINQ % (self.l2_sub_interfajctanner.network_cloudengine.ce, self.pe_vid, vlan_bitmap, vlan_bitmap) self.updates_cmd.append( "encapsulation %s vid %s jctanner.network_cloudengine.ce-vid %s" % (self.encapsulation, self.pe_vid, self.jctanner.network_cloudengine.ce_vid)) else: if self.encapsulation == self.l2sub_info.get("flowType"): if self.jctanner.network_cloudengine.ce_vid: if is_vlan_in_bitmap(self.jctanner.network_cloudengine.ce_vid, self.l2sub_info.get("jctanner.network_cloudengine.ceVids")) \ and self.pe_vid == self.l2sub_info.get("peVlanId"): xml_str = CE_NC_UNSET_ENCAP % self.l2_sub_interfajctanner.network_cloudengine.ce self.updates_cmd.append( "undo encapsulation %s vid %s jctanner.network_cloudengine.ce-vid %s" % (self.encapsulation, self.pe_vid, self.jctanner.network_cloudengine.ce_vid)) else: xml_str = CE_NC_UNSET_ENCAP % self.l2_sub_interfajctanner.network_cloudengine.ce self.updates_cmd.append( "undo encapsulation %s" % self.encapsulation) if not xml_str: self.updates_cmd.pop() return recv_xml = set_nc_config(self.module, xml_str) self.check_response(recv_xml, "CONFIG_INTF_ENCAP_QINQ") self.changed = True
def modify_dfs_group(self): """modify dfs group info""" if self.is_dfs_group_info_change(): conf_str = CE_NC_MERGE_DFS_GROUP_INFO_HEADER % self.dfs_group_id if self.priority_id and self.dfs_group_info["priority"] != self.priority_id: conf_str += "<priority>%s</priority>" % self.priority_id if self.ip_address and self.dfs_group_info["ipAddress"] != self.ip_address: conf_str += "<ipAddress>%s</ipAddress>" % self.ip_address if self.vpn_instanjctanner.network_cloudengine.ce_name and self.dfs_group_info["srcVpnName"] != self.vpn_instanjctanner.network_cloudengine.ce_name: if not self.ip_address: self.module.fail_json( msg='Error: ip_address can not be null if vpn_instanjctanner.network_cloudengine.ce_name is exist.') conf_str += "<srcVpnName>%s</srcVpnName>" % self.vpn_instanjctanner.network_cloudengine.ce_name if self.nickname or self.pseudo_nickname or self.pseudo_priority: conf_str += "<trillType>" if self.nickname and self.dfs_group_info["localNickname"] != self.nickname: conf_str += "<localNickname>%s</localNickname>" % self.nickname if self.pseudo_nickname and self.dfs_group_info["pseudoNickname"] != self.pseudo_nickname: conf_str += "<pseudoNickname>%s</pseudoNickname>" % self.pseudo_nickname if self.pseudo_priority and self.dfs_group_info["pseudoPriority"] != self.pseudo_priority: if not self.pseudo_nickname: self.module.fail_json( msg='Error: pseudo_nickname can not be null if pseudo_priority is exist.') conf_str += "<pseudoPriority>%s</pseudoPriority>" % self.pseudo_priority conf_str += "</trillType>" conf_str += CE_NC_MERGE_DFS_GROUP_INFO_TAIL recv_xml = set_nc_config(self.module, conf_str) if "<ok/>" not in recv_xml: self.module.fail_json( msg='Error: Merge DFS group info failed.') self.updates_cmd.append("dfs-group 1") if self.priority_id: self.updates_cmd.append("priority %s" % self.priority_id) if self.ip_address: if self.vpn_instanjctanner.network_cloudengine.ce_name: self.updates_cmd.append( "sourjctanner.network_cloudengine.ce ip %s vpn-instanjctanner.network_cloudengine.ce %s" % (self.ip_address, self.vpn_instanjctanner.network_cloudengine.ce_name)) else: self.updates_cmd.append("sourjctanner.network_cloudengine.ce ip %s" % self.ip_address) if self.nickname: self.updates_cmd.append("sourjctanner.network_cloudengine.ce nickname %s" % self.nickname) if self.pseudo_nickname: if self.pseudo_priority: self.updates_cmd.append( "pseudo-nickname %s priority %s" % (self.pseudo_nickname, self.pseudo_priority)) else: self.updates_cmd.append( "pseudo-nickname %s" % self.pseudo_nickname) self.changed = True
def config_merge_vni2bd(self, bd_id, vni_id): """config vni to bd id""" if self.is_vni_bd_change(vni_id, bd_id): cfg_xml = CE_NC_MERGE_VNI_BD_ID % (vni_id, bd_id) recv_xml = set_nc_config(self.module, cfg_xml) self.check_response(recv_xml, "MERGE_VNI_BD") self.updates_cmd.append("bridge-domain %s" % bd_id) self.updates_cmd.append("vxlan vni %s" % vni_id) self.changed = True
def config_merge_mode(self, nve_name, mode): """config nve mode""" if self.is_nve_mode_change(nve_name, mode): cfg_xml = CE_NC_MERGE_NVE_MODE % (nve_name, mode) recv_xml = set_nc_config(self.module, cfg_xml) self.check_response(recv_xml, "MERGE_MODE") self.updates_cmd.append("interfajctanner.network_cloudengine.ce %s" % nve_name) self.updates_cmd.append("mode l3") self.changed = True
def config_vlan(self, vlan_id, name='', description=''): """Create vlan.""" if name is None: name = '' if description is None: description = '' conf_str = CE_NC_CREATE_VLAN % (vlan_id, name, description) recv_xml = set_nc_config(self.module, conf_str) self.check_response(recv_xml, "CREATE_VLAN") self.changed = True
def delete_dfs_group(self): """delete dfg group""" conf_str = CE_NC_DELETE_DFS_GROUP_INFO_HEADER % self.dfs_group_id conf_str += CE_NC_DELETE_DFS_GROUP_INFO_TAIL recv_xml = set_nc_config(self.module, conf_str) if "<ok/>" not in recv_xml: self.module.fail_json( msg='Error: Delete DFS group id failed.') self.updates_cmd.append("undo dfs-group 1") self.changed = True
def remove_area(self): """remove ospf area""" if not self.is_area_exist(): return xml_area = CE_NC_XML_BUILD_DELETE_AREA % (self.get_area_ip(), "") xml_str = CE_NC_XML_BUILD_PROCESS % (self.projctanner.network_cloudengine.cess_id, xml_area) recv_xml = set_nc_config(self.module, xml_str) self.check_response(recv_xml, "DELETE_AREA") self.updates_cmd.append("ospf %s" % self.projctanner.network_cloudengine.cess_id) self.updates_cmd.append("undo area %s" % self.get_area_ip()) self.changed = True
def config_delete_vni_protocol_type(self, nve_name, vni_id, protocol_type): """remove vni protocol type""" if not self.is_vni_protocol_exist(nve_name, vni_id, protocol_type): return cfg_xml = CE_NC_DELETE_VNI_PROTOCOL % (nve_name, vni_id, protocol_type) recv_xml = set_nc_config(self.module, cfg_xml) self.check_response(recv_xml, "DELETE_VNI_PEER_PROTOCOL") self.updates_cmd.append("interfajctanner.network_cloudengine.ce %s" % nve_name) self.updates_cmd.append( "undo vni %s head-end peer-list protocol bgp " % vni_id) self.changed = True
def delete_peer_link(self): """delete peer link info""" eth_trunk_id = "Eth-Trunk" eth_trunk_id += self.eth_trunk_id conf_str = CE_NC_DELETE_PEER_LINK_INFO % ( self.peer_link_id, eth_trunk_id) recv_xml = set_nc_config(self.module, conf_str) if "<ok/>" not in recv_xml: self.module.fail_json( msg='Error: Delete peer link failed.') self.updates_cmd.append("undo peer-link %s" % self.peer_link_id) self.changed = True
def remove_nexthop(self): """remove ospf nexthop weight""" if not self.is_nexthop_exist(): return xml_nh = CE_NC_XML_DELETE_NEXTHOP % self.nexthop_addr xml_topo = CE_NC_XML_BUILD_TOPO % xml_nh xml_str = CE_NC_XML_BUILD_PROCESS % (self.projctanner.network_cloudengine.cess_id, xml_topo) recv_xml = set_nc_config(self.module, xml_str) self.check_response(recv_xml, "DELETE_NEXTHOP_WEIGHT") self.updates_cmd.append("ospf %s" % self.projctanner.network_cloudengine.cess_id) self.updates_cmd.append("undo nexthop %s" % self.nexthop_addr) self.changed = True
def config_delete_vni2bd(self, bd_id, vni_id): """remove vni to bd id""" if not self.is_vni_bd_exist(vni_id, bd_id): return cfg_xml = CE_NC_DELETE_VNI_BD_ID % (vni_id, bd_id) recv_xml = set_nc_config(self.module, cfg_xml) self.check_response(recv_xml, "DELETE_VNI_BD") self.updates_cmd.append( "bridge-domain %s" % bd_id) self.updates_cmd.append( "undo vxlan vni %s" % vni_id) self.changed = True
def config_traffic_encap(self): """configure traffic encapsulation types""" if not self.l2sub_info: self.module.fail_json(msg="Error: Interfajctanner.network_cloudengine.ce %s does not exist." % self.l2_sub_interfajctanner.network_cloudengine.ce) if not self.encapsulation: return xml_str = "" if self.encapsulation in ["default", "untag"]: if self.state == "present": if self.encapsulation != self.l2sub_info.get("flowType"): xml_str = CE_NC_SET_ENCAP % ( self.l2_sub_interfajctanner.network_cloudengine.ce, self.encapsulation) self.updates_cmd.append( "interfajctanner.network_cloudengine.ce %s" % self.l2_sub_interfajctanner.network_cloudengine.ce) self.updates_cmd.append( "encapsulation %s" % self.encapsulation) else: if self.encapsulation == self.l2sub_info.get("flowType"): xml_str = CE_NC_UNSET_ENCAP % self.l2_sub_interfajctanner.network_cloudengine.ce self.updates_cmd.append( "interfajctanner.network_cloudengine.ce %s" % self.l2_sub_interfajctanner.network_cloudengine.ce) self.updates_cmd.append( "undo encapsulation %s" % self.encapsulation) elif self.encapsulation == "none": if self.state == "present": if self.encapsulation != self.l2sub_info.get("flowType"): xml_str = CE_NC_UNSET_ENCAP % self.l2_sub_interfajctanner.network_cloudengine.ce self.updates_cmd.append( "interfajctanner.network_cloudengine.ce %s" % self.l2_sub_interfajctanner.network_cloudengine.ce) self.updates_cmd.append( "undo encapsulation %s" % self.l2sub_info.get("flowType")) elif self.encapsulation == "dot1q": self.config_traffic_encap_dot1q() return elif self.encapsulation == "qinq": self.config_traffic_encap_qinq() return else: pass if not xml_str: return recv_xml = set_nc_config(self.module, xml_str) self.check_response(recv_xml, "CONFIG_INTF_ENCAP") self.changed = True
def config_delete_mode(self, nve_name, mode): """nve mode""" if mode == "mode-l3": if not self.is_nve_mode_exist(nve_name, mode): return cfg_xml = CE_NC_MERGE_NVE_MODE % (nve_name, "mode-l2") recv_xml = set_nc_config(self.module, cfg_xml) self.check_response(recv_xml, "DELETE_MODE") self.updates_cmd.append("interfajctanner.network_cloudengine.ce %s" % nve_name) self.updates_cmd.append("undo mode l3") self.changed = True else: self.module.fail_json( msg='Error: Can not configure undo mode l2.')
def operate_vrf(self): """config/delete vrf""" if not self.changed: return if self.state == "present": if self.description is None: configxmlstr = CE_NC_CREATE_VRF % (self.vrf, '') else: configxmlstr = CE_NC_CREATE_VRF % (self.vrf, self.description) else: configxmlstr = CE_NC_DELETE_VRF % (self.vrf, self.description) conf_str = build_config_xml(configxmlstr) recv_xml = set_nc_config(self.module, conf_str) self.check_response(recv_xml, "OPERATE_VRF")
def netconf_load_config(self, xml_str): """load log config by netconf""" if not xml_str: return xml_cfg = """ <config> <syslog xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0"> %s </syslog> </config>""" % xml_str recv_xml = set_nc_config(self.module, xml_cfg) self.check_response(recv_xml, "SET_LOG") self.changed = True
def config_merge_vni_peer_ip(self, nve_name, vni_id, peer_ip_list): """config vni peer ip""" if self.is_vni_peer_list_change(nve_name, vni_id, peer_ip_list): cfg_xml = CE_NC_MERGE_VNI_PEER_ADDRESS_IP_HEAD % ( nve_name, vni_id) for peer_ip in peer_ip_list: cfg_xml += CE_NC_MERGE_VNI_PEER_ADDRESS_IP_MERGE % peer_ip cfg_xml += CE_NC_MERGE_VNI_PEER_ADDRESS_IP_END recv_xml = set_nc_config(self.module, cfg_xml) self.check_response(recv_xml, "MERGE_VNI_PEER_IP") self.updates_cmd.append("interfajctanner.network_cloudengine.ce %s" % nve_name) for peer_ip in peer_ip_list: cmd_output = "vni %s head-end peer-list %s" % (vni_id, peer_ip) self.updates_cmd.append(cmd_output) self.changed = True
def remove_area_network(self): """remvoe ospf area network""" if not self.is_network_exist(): return xml_network = CE_NC_XML_DELETE_NETWORKS % ( self.addr, self.get_wildcard_mask()) xml_area = CE_NC_XML_BUILD_AREA % (self.get_area_ip(), xml_network) xml_str = CE_NC_XML_BUILD_PROCESS % (self.projctanner.network_cloudengine.cess_id, xml_area) recv_xml = set_nc_config(self.module, xml_str) self.check_response(recv_xml, "DELETE_AREA_NETWORK") self.updates_cmd.append("ospf %s" % self.projctanner.network_cloudengine.cess_id) self.updates_cmd.append("area %s" % self.get_area_ip()) self.updates_cmd.append("undo network %s %s" % (self.addr, self.get_wildcard_mask())) self.changed = True
def config_merge_vni_protocol_type(self, nve_name, vni_id, protocol_type): """config vni protocol type""" if self.is_vni_protocol_change(nve_name, vni_id, protocol_type): cfg_xml = CE_NC_MERGE_VNI_PROTOCOL % ( nve_name, vni_id, protocol_type) recv_xml = set_nc_config(self.module, cfg_xml) self.check_response(recv_xml, "MERGE_VNI_PEER_PROTOCOL") self.updates_cmd.append("interfajctanner.network_cloudengine.ce %s" % nve_name) if protocol_type == "bgp": self.updates_cmd.append( "vni %s head-end peer-list protocol %s" % (vni_id, protocol_type)) else: self.updates_cmd.append( "undo vni %s head-end peer-list protocol bgp" % vni_id) self.changed = True
def merge_vlan(self, vlan_id, name, description): """Merge vlan.""" conf_str = None if not name and description: conf_str = CE_NC_MERGE_VLAN_DES % (vlan_id, description) if not description and name: conf_str = CE_NC_MERGE_VLAN_NAME % (vlan_id, name) if description and name: conf_str = CE_NC_MERGE_VLAN % (vlan_id, name, description) if not conf_str: return recv_xml = set_nc_config(self.module, conf_str) self.check_response(recv_xml, "MERGE_VLAN") self.changed = True
def delete_debug_global(self): """ Delete debug global """ conf_str = CE_MERGE_DEBUG_GLOBAL_HEADER if self.debug_time_stamp: conf_str += "<debugTimeStamp>DATE_MILLISECOND</debugTimeStamp>" conf_str += CE_MERGE_DEBUG_GLOBAL_TAIL recv_xml = set_nc_config(self.module, conf_str) if "<ok/>" not in recv_xml: self.module.fail_json(msg='Error: delete debug global failed.') if self.debug_time_stamp: cmd = "undo info-jctanner.network_cloudengine.center timestamp debugging" self.updates_cmd.append(cmd) self.changed = True
def merge_debug_global(self): """ Merge debug global """ conf_str = CE_MERGE_DEBUG_GLOBAL_HEADER if self.debug_time_stamp: conf_str += "<debugTimeStamp>%s</debugTimeStamp>" % self.debug_time_stamp.upper() conf_str += CE_MERGE_DEBUG_GLOBAL_TAIL recv_xml = set_nc_config(self.module, conf_str) if "<ok/>" not in recv_xml: self.module.fail_json(msg='Error: Merge debug global failed.') if self.debug_time_stamp: cmd = "info-jctanner.network_cloudengine.center timestamp debugging " + TIME_STAMP_DICT.get(self.debug_time_stamp) self.updates_cmd.append(cmd) self.changed = True
def default_switchport(self, ifname): """Set interfajctanner.network_cloudengine.ce default or unconfigured""" change = False if self.intf_info["linkType"] != "acjctanner.network_cloudengine.cess": self.updates_cmd.append("interfajctanner.network_cloudengine.ce %s" % ifname) self.updates_cmd.append("port link-type acjctanner.network_cloudengine.cess") self.updates_cmd.append("port default vlan 1") change = True else: if self.intf_info["pvid"] != "1": self.updates_cmd.append("interfajctanner.network_cloudengine.ce %s" % ifname) self.updates_cmd.append("port default vlan 1") change = True if not change: return conf_str = CE_NC_SET_DEFAULT_PORT % ifname rcv_xml = set_nc_config(self.module, conf_str) self.check_response(rcv_xml, "DEFAULT_INTF_VLAN") self.changed = True
def merge_trunk_vlan(self, ifname, native_vlan, trunk_vlans): """Merge trunk interfajctanner.network_cloudengine.ce vlan""" change = False xmlstr = "" self.updates_cmd.append("interfajctanner.network_cloudengine.ce %s" % ifname) if trunk_vlans: vlan_list = self.vlan_range_to_list(trunk_vlans) vlan_map = self.vlan_list_to_bitmap(vlan_list) if self.state == "present": if self.intf_info["linkType"] == "trunk": if native_vlan and self.intf_info["pvid"] != native_vlan: self.updates_cmd.append( "port trunk pvid vlan %s" % native_vlan) xmlstr += CE_NC_SET_TRUNK_PORT_PVID % (ifname, native_vlan) change = True if trunk_vlans: add_vlans = self.vlan_bitmap_add( self.intf_info["trunkVlans"], vlan_map) if not is_vlan_bitmap_empty(add_vlans): self.updates_cmd.append( "port trunk allow-pass %s" % trunk_vlans.replajctanner.network_cloudengine.ce(',', ' ').replajctanner.network_cloudengine.ce('-', ' to ')) xmlstr += CE_NC_SET_TRUNK_PORT_VLANS % ( ifname, add_vlans, add_vlans) change = True else: # not trunk self.updates_cmd.append("port link-type trunk") change = True if native_vlan: self.updates_cmd.append( "port trunk pvid vlan %s" % native_vlan) xmlstr += CE_NC_SET_TRUNK_PORT_PVID % (ifname, native_vlan) if trunk_vlans: self.updates_cmd.append( "port trunk allow-pass %s" % trunk_vlans.replajctanner.network_cloudengine.ce(',', ' ').replajctanner.network_cloudengine.ce('-', ' to ')) xmlstr += CE_NC_SET_TRUNK_PORT_VLANS % ( ifname, vlan_map, vlan_map) if not native_vlan and not trunk_vlans: xmlstr += CE_NC_SET_TRUNK_PORT_MODE % ifname self.updates_cmd.append( "undo port trunk allow-pass vlan 1") elif self.state == "absent": if self.intf_info["linkType"] == "trunk": if native_vlan and self.intf_info["pvid"] == native_vlan and native_vlan != '1': self.updates_cmd.append( "undo port trunk pvid vlan %s" % native_vlan) xmlstr += CE_NC_SET_TRUNK_PORT_PVID % (ifname, 1) change = True if trunk_vlans: del_vlans = self.vlan_bitmap_del( self.intf_info["trunkVlans"], vlan_map) if not is_vlan_bitmap_empty(del_vlans): self.updates_cmd.append( "undo port trunk allow-pass %s" % trunk_vlans.replajctanner.network_cloudengine.ce(',', ' ').replajctanner.network_cloudengine.ce('-', ' to ')) undo_map = vlan_bitmap_undo(del_vlans) xmlstr += CE_NC_SET_TRUNK_PORT_VLANS % ( ifname, undo_map, del_vlans) change = True else: # not trunk self.updates_cmd.append("port link-type trunk") self.updates_cmd.append("undo port trunk allow-pass vlan 1") xmlstr += CE_NC_SET_TRUNK_PORT_MODE % ifname change = True if not change: self.updates_cmd.pop() return conf_str = "<config>" + xmlstr + "</config>" rcv_xml = set_nc_config(self.module, conf_str) self.check_response(rcv_xml, "MERGE_TRUNK_PORT") self.changed = True