def add_trunk_vlan(self, interface_id, vlan): config = self.query(all_interfaces, self.custom_strategies.all_vlans) self.custom_strategies.vlan_node(config, vlan) interface_node = self.get_interface_config(interface_id, config) interface = self.node_to_interface(interface_node, config) actual_port_mode = self.get_port_mode(interface_node) if actual_port_mode is ACCESS or interface.access_vlan is not None: raise InterfaceInWrongPortMode("access") if vlan not in interface.trunk_vlans: update = Update() update.add_interface( self.custom_strategies. interface_update(interface_id, "0", [ self.custom_strategies. get_interface_port_mode_update_element("trunk") ] if actual_port_mode is None else None, [ self.custom_strategies.get_vlan_member_update_element(vlan) ])) self._push_interface_update(interface_id, update)
def add_trunk_vlan(self, interface_id, vlan): interface_data = self.get_interface_data(interface_id) actual_port_mode = resolve_port_mode(interface_data) if actual_port_mode == "access": raise InterfaceInWrongPortMode("access") vlans = self.get_vlans() if not [v for v in vlans if v.number == vlan]: raise UnknownVlan(vlan) with self.config(), self.interface(interface_id): if actual_port_mode is None: self.set("switchport mode trunk") actual_port_mode = "trunk" if actual_port_mode == "trunk": if has_trunk_vlans(interface_data): self.set("switchport {} allowed vlan add {}", actual_port_mode, vlan) \ .on_result_matching(".*VLAN does not exist.*", UnknownVlan, vlan) else: self.set("switchport {} allowed vlan {}", actual_port_mode, vlan) \ .on_result_matching(".*VLAN does not exist.*", UnknownVlan, vlan) else: self.set("switchport {} allowed vlan add {}", actual_port_mode, vlan) \ .on_result_matching(".*VLAN does not exist.*", UnknownVlan, vlan)
def remove_trunk_vlan(self, interface_id, vlan): config = self.query(all_interfaces, self.custom_strategies.all_vlans) interface_node = self.get_interface_config(interface_id, config) if interface_node is None: raise UnknownInterface(interface_id) interface = self.node_to_interface(interface_node, config) if interface.port_mode is ACCESS: raise InterfaceInWrongPortMode("access") vlan_node = self.custom_strategies.vlan_node(config, vlan) vlan_name = first(vlan_node.xpath("name")).text modifications = self.custom_strategies.craft_members_modification_to_remove_vlan( interface_node, vlan_name, vlan) if len(modifications) == 0: raise TrunkVlanNotSet(interface_id) update = Update() update.add_interface( self.custom_strategies.interface_update( interface_id, "0", vlan_members=modifications)) self._push(update)
def set_access_vlan(self, interface_id, vlan): update_attributes = [] update_vlan_members = [] config = self.query(all_interfaces, self.custom_strategies.all_vlans) self.custom_strategies.vlan_node(config, vlan) interface_node = self.get_interface_config(interface_id, config) interface = self.node_to_interface(interface_node, config) if interface.port_mode == TRUNK: raise InterfaceInWrongPortMode("trunk") elif self.get_port_mode(interface_node) is None: update_attributes.append( self.custom_strategies.get_interface_port_mode_update_element( "access")) if interface.access_vlan != vlan: self.custom_strategies.update_vlan_members(interface_node, update_vlan_members, vlan) if update_attributes or update_vlan_members: update = Update() update.add_interface( self.custom_strategies.interface_update( interface_id, "0", update_attributes, update_vlan_members)) try: self._push_interface_update(interface_id, update) except RPCError as e: if "No vlan matches vlan tag" in e.message: raise UnknownVlan(vlan) raise
def set_access_vlan(self, interface_id, vlan): interface_data = self.get_interface_data(interface_id) actual_port_mode = resolve_port_mode(interface_data) if actual_port_mode in ("trunk", "general"): raise InterfaceInWrongPortMode(actual_port_mode) with self.config(), self.interface(interface_id): self.set("switchport access vlan {}", vlan) \ .on_result_matching(".*VLAN ID not found.*", UnknownVlan, vlan)
def add_trunk_vlan(self, interface_id, vlan): interface_data = self.get_interface_data(interface_id) actual_port_mode = resolve_port_mode(interface_data) if actual_port_mode == "access": raise InterfaceInWrongPortMode("access") with self.config(), self.interface(interface_id): if actual_port_mode is None: self.set("switchport mode trunk") actual_port_mode = "trunk" self.set("switchport {} allowed vlan add {}", actual_port_mode, vlan)\ .on_result_matching(".*VLAN does not exist.*", UnknownVlan, vlan)
def set_interface_native_vlan(self, interface_id, vlan): interface_data = self.get_interface_data(interface_id) actual_port_mode = resolve_port_mode(interface_data) if actual_port_mode == "access": raise InterfaceInWrongPortMode("access") with self.config(), self.interface(interface_id): if actual_port_mode != "general": self.set("switchport mode general") if actual_port_mode == "trunk": self.copy_vlans(interface_data, "trunk", "general") self.set("switchport general pvid {}", vlan).on_any_result(UnknownVlan, vlan)
def unset_interface_access_vlan(self, interface_id): interface = self.get_interface(interface_id) if interface.port_mode == TRUNK: raise InterfaceInWrongPortMode("trunk") if interface.access_vlan is not None: update = Update() update.add_interface( interface_update(interface_id, "0", [to_ele('<vlan operation="delete" />')])) self._push(update) else: raise AccessVlanNotSet(interface_id)
def unset_interface_access_vlan(self, interface_id): config = self.query(one_interface(interface_id), self.custom_strategies.all_vlans) interface_node = self.get_interface_config(interface_id, config) interface = self.node_to_interface(interface_node, config) if interface.port_mode == TRUNK: raise InterfaceInWrongPortMode("trunk") if interface.access_vlan is not None: update = Update() update.add_interface( self.custom_strategies.interface_update( interface_id, "0", [to_ele('<vlan operation="delete" />')])) self._push(update) else: raise AccessVlanNotSet(interface_id)
def set_interface_native_vlan(self, interface_id, vlan): port_mode_node = None native_vlan_id_node = None config = self.query(all_interfaces, self.custom_strategies.all_vlans) self.custom_strategies.vlan_node(config, vlan) interface_node = self.get_interface_config(interface_id, config) interface = self.node_to_interface(interface_node, config) actual_port_mode = self.get_port_mode(interface_node) if actual_port_mode is ACCESS: raise InterfaceInWrongPortMode("access") elif actual_port_mode is None: port_mode_node = self.custom_strategies.get_interface_port_mode_update_element( "trunk") if vlan in interface.trunk_vlans: raise VlanAlreadyInTrunk(vlan) elif interface.trunk_native_vlan != vlan: native_vlan_id_node = to_ele( "<native-vlan-id>{}</native-vlan-id>".format(vlan)) if native_vlan_id_node is not None: interface = self.custom_strategies.interface_update( interface_id, "0", [port_mode_node] if port_mode_node is not None else []) self.custom_strategies.set_native_vlan_id_node( interface, native_vlan_id_node) update = Update() update.add_interface(interface) try: self._push_interface_update(interface_id, update) except RPCError as e: if "No vlan matches vlan tag" in e.message: raise UnknownVlan(vlan) raise
def set_access_vlan(self, interface_id, vlan): update_attributes = [] update_vlan_members = [] config = self.query(all_interfaces, all_vlans) self.get_vlan_config(vlan, config) interface_node = self.get_interface_config(interface_id, config) interface = self.node_to_interface(interface_node, config) if interface.port_mode == TRUNK: raise InterfaceInWrongPortMode("trunk") elif self.get_port_mode(interface_node) is None: update_attributes.append( self.custom_strategies.get_interface_port_mode_update_element( "access")) if interface.access_vlan != vlan: if interface_node is not None: for members in interface_node.xpath( "unit/family/ethernet-switching/vlan/members"): update_vlan_members.append( to_ele( '<members operation="delete">{}</members>'.format( members.text))) update_vlan_members.append( to_ele("<members>{}</members>".format(vlan))) if update_attributes or update_vlan_members: update = Update() update.add_interface( interface_update(interface_id, "0", update_attributes, update_vlan_members)) try: self._push_interface_update(interface_id, update) except RPCError as e: if "No vlan matches vlan tag" in e.message: raise UnknownVlan(vlan) raise