Source code for pynos.versions.base.vcs

"""
Copyright 2015 Brocade Communications Systems, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
import xml.etree.ElementTree as ET
import pynos.utilities

from pynos.versions.base.yang.brocade_vcs import brocade_vcs
from ipaddress import ip_interface


[docs]class VCS(object): """ VCS class containing all VCS methods and attributes. """ def __init__(self, callback): """VCS init method. Args: callback: Callback function that will be called for each action. Returns: VCS Object Raises: None """ self._callback = callback self._vcs = brocade_vcs( callback=pynos.utilities.return_xml ) @property def vcs_nodes(self): """dict: vcs node details """ urn = "{urn:brocade.com:mgmt:brocade-vcs}" namespace = 'urn:brocade.com:mgmt:brocade-vcs' show_vcs = ET.Element('show-vcs', xmlns=namespace) results = self._callback(show_vcs, handler='get') result = [] for nodes in results.findall('%svcs-nodes' % urn): for item in nodes.findall('%svcs-node-info' % urn): serial_number = item.find('%snode-serial-num' % urn).text node_status = item.find('%snode-status' % urn).text vcs_id = item.find('%snode-vcs-id' % urn).text rbridge_id = item.find('%snode-rbridge-id' % urn).text switch_mac = item.find('%snode-switch-mac' % urn).text switch_wwn = item.find('%snode-switch-wwn' % urn).text switch_name = item.find('%snode-switchname' % urn).text node_is_principal = item.find('%snode-is-principal' % urn).text switch_ip = '' for switch_ip_addr in item.findall( '%snode-public-ip-addresses' % urn): switch_ip = switch_ip_addr.find( '%snode-public-ip-address' % urn).text break item_results = {'node-serial-num': serial_number, 'node-status': node_status, 'node-vcs-id': vcs_id, 'node-rbridge-id': rbridge_id, 'node-switch-mac': switch_mac, 'node-switch-wwn': switch_wwn, 'node-switch-ip': switch_ip, 'node-switchname': switch_name, 'node-is-principal': node_is_principal} result.append(item_results) return result
[docs] def vcs_vip(self, **kwargs): """Set VCS Virtual IP. Args: vip (str): IPv4/IPv6 Virtual IP Address. rbridge_id (str): rbridge-id for device. Only required when type is `ve`. delete (bool): Deletes the virtual ip if `delete` is ``True``. get (bool): Get config instead of editing config. (True, False) callback (function): A function executed upon completion of the method. The only parameter passed to `callback` will be the ``ElementTree`` `config`. Returns: Return value of `callback`. Raises: KeyError: if `vip` is not passed. ValueError: if `vip` is invalid. Examples: >>> import pynos.device >>> switches = ['10.24.39.211', '10.24.39.203'] >>> auth = ('admin', 'password') >>> for switch in switches: ... conn = (switch, '22') ... with pynos.device.Device(conn=conn, auth=auth) as dev: ... dev.interface.vcs_vip(vip='10.1.1.1/24') ... dev.interface.vcs_vip(vip='fe80::cafe:beef:1000:1/64') ... dev.interface.vcs_vip(vip='10.1.1.1/24',get=True) ... dev.interface.vcs_vip(vip='fe80::cafe:beef:1000:1/64', ... get=True) ... dev.interface.vcs_vip(vip='fe80::cafe:beef:1000:1/64', ... delete=True) ... dev.interface.vcs_vip(vip='10.1.1.1/24',get=True) ... dev.interface.vcs_vip(vip='fe80::cafe:beef:1000:1/64', ... get=True) ... dev.interface.vcs_vip(vip='10.1.1.1/24',delete=True) ... dev.interface.vcs_vip(vip='fe80::cafe:beef:1000:1/64', ... delete=True) """ get_config = kwargs.pop('get', False) delete = kwargs.pop('delete', False) callback = kwargs.pop('callback', self._callback) method_class = self._vcs if not get_config: vip = str(kwargs.pop('vip')) ipaddress = ip_interface(unicode(vip)) vcs_vip = None if ipaddress.version == 4: method_name = 'vcs_virtual_ip_address_address' vcs_args = dict(address=vip) vcs_vip = getattr(method_class, method_name) elif ipaddress.version == 6: method_name = 'vcs_virtual_ipv6_address_ipv6address' vcs_args = dict(ipv6address=vip) vcs_vip = getattr(method_class, method_name) if not delete: config = vcs_vip(**vcs_args) else: if ipaddress.version == 4: config = vcs_vip(**vcs_args) config.find('.//*address').set('operation', 'delete') elif ipaddress.version == 6: config = vcs_vip(**vcs_args) config.find('.//*ipv6address').set('operation', 'delete') elif get_config: vip_info = {} method_name = 'vcs_virtual_ip_address_address' vcs_args = dict(address='') vcs_vip = getattr(method_class, method_name) config = vcs_vip(**vcs_args) vip_info['ipv4_vip'] = callback(config, handler='get_config') method_name = 'vcs_virtual_ipv6_address_ipv6address' vcs_args = dict(ipv6address='') vcs_vip = getattr(method_class, method_name) config = vcs_vip(**vcs_args) vip_info['ipv6_vip'] = callback(config, handler='get_config') return vip_info return callback(config)