Source code for pyhpecw7.features.vlan

"""Manage VLANS on HPCOM7 devices.
"""
from pyhpecw7.features.errors import LengthOfStringError, VlanIDError
from pyhpecw7.utils.xml.lib import *


[docs]class Vlan(object): """This class is used to get data and configure a specific VLAN. Args: device (HPCOM7): connected instance of a ``pyhpecw7.comware.HPCOM7`` object. vlanid (str): VLAN ID Attributes: device (HPCOM7): connected instance of a ``pyhpecw7.comware.HPCOM7`` object. vlanid (str): VLAN ID """ def __init__(self, device, vlanid=None): self.device = device if vlanid: self.vlanid = vlanid # dictionary to XML tag mappings self.vlan_key_map = { 'vlanid': 'ID', 'name': 'Name', 'descr': 'Description' }
[docs] def gen_top(self): E = data_element_maker() top = E.top( E.VLAN( E.VLANs( E.VLANID() ) ) ) return top
[docs] def get_vlan_list(self): """Get a list of VLAN IDs that exist on the switch. Returns: It returns a list of VLAN IDs as strings. """ top = self.gen_top() nc_get_reply = self.device.get(('subtree', top)) vlans_xml = findall_in_data('ID', nc_get_reply.data_ele) vlans = [vlan.text for vlan in vlans_xml] return vlans
[docs] def get_config(self): """Gets current configuration for a given VLAN ID Args: vlanid (str): REQUIRED - VLAN ID Returns: This returns a dictionary with the following k/v pairs: :vlanid (str): VLAN ID of the vlan requested :name (str): configured name of the vlan :descr (str): configured descr of the vlan It returns an empty dictionary if the vlan does not exist """ top = self.gen_top() vlan_id_ele = find_in_data('VLANID', top) vlan_id_ele.append(data_element_maker().ID(self.vlanid)) nc_get_reply = self.device.get(('subtree', top)) vlan_config = data_elem_to_dict(nc_get_reply.data_ele, self.vlan_key_map) return vlan_config
[docs] def remove(self, stage=False): """Stage or execute XML object for VLAN removal and send to staging Args: stage (bool): whether to stage the command or execute immediately Returns: True if stage=True and successfully staged etree.Element XML response if immediate execution """ config = self._build_config(state='absent') if stage: return self.device.stage_config(config, 'edit_config') else: return self.device.edit_config(config)
[docs] def build(self, stage=False, **vlan): """Stage or execute XML object for VLAN configuration and send to staging Args: stage (bool): whether to stage the command or execute immediately vlan: see Keyword Args Keyword Args: name (str): OPTIONAL - VLAN name descr (str): OPTOINAL - VLAN description Returns: True if stage=True and successfully staged etree.Element XML response if immediate execution """ config = self._build_config(state='present', **vlan) if stage: return self.device.stage_config(config, 'edit_config') else: return self.device.edit_config(config)
def _build_config(self, state, **vlan): """Build XML object for VLAN configuration Args: state (str): OPTIONAL must be "present" or "absent" DEFAULT is "present" vlan: see Keyword Args Keyword Args: name (str): OPTIONAL - VLAN name descr (str): OPTOINAL - VLAN description Returns: XML object for VLAN configuration """ if state == 'present': operation = 'merge' elif state == 'absent': operation = 'delete' EC = nc_element_maker() E = config_element_maker() vlan['vlanid'] = self.vlanid config = EC.config( E.top( E.VLAN( E.VLANs( E.VLANID( *config_params(vlan, self.vlan_key_map) ) ), **operation_kwarg(operation) ) ) ) return config
[docs] def param_check(self, **vlan): """Basic param validation for vlan Args: state (str): REQUIRED must be "present" or "absent" vlan: see Keyword Args Keyword Args: vlanid (str): OPTIONAL - VLAN ID name (str): OPTIONAL - VLAN name descr (str): OPTIONAL - VLAN description """ try: vlanid = int(self.vlanid) except ValueError: raise VlanIDError if vlanid < -1 or vlanid > 4094: raise VlanIDError descr = vlan.get('descr') if descr and len(descr) > 254: raise LengthOfStringError("'descr'") name = vlan.get('name') if name and len(name) > 32: raise LengthOfStringError("'name'")