コード例 #1
0
class ClassicProtocol(object):
    def __init__(self, ixnObj=None):
        """
        Parameters
           ixnObj: <str>: The main connection object.
        """
        self.ixnObj = ixnObj

        from IxNetRestApiPortMgmt import PortMgmt
        self.portMgmtObj = PortMgmt(self.ixnObj)

        from IxNetRestApiStatistics import Statistics
        self.statObj = Statistics(self.ixnObj)

    def getPortsByProtocol(self, protocolName):
        """
        Description
            Based on the specified protocol, return all ports associated with the protocol.

        Parameters
           protocolName options:
              bfd, bgp, cfm, eigrp, elmi, igmp, isis, lacp, ldp, linkOam, lisp, mld,
              mplsOam, mplsTp, openFlow, ospf, ospfV3, pimsm, ping, rip, ripng, rsvp,
              static, stp

        Returns: [chassisIp, cardNumber, portNumber]
                  Example: [['192.168.70.11', '1', '1'], ['192.168.70.11', '1', '2']]

        Returns [] if no port is configured with the specified protocolName
        """
        portList = []
        response = self.ixnObj.get(self.ixnObj.sessionUrl + '/vport')
        # ['http://{apiServerIp:port}/api/v1/sessions/1/ixnetwork/vport/1']
        vportList = [
            '%s/%s/%s' % (self.ixnObj.sessionUrl, 'vport', str(i["id"]))
            for i in response.json()
        ]

        # Go through each port that has the protocol enabled.
        for vport in vportList:
            # http://{apiServerIp:port}/api/v1/sessions/1/ixnetwork/vport/1/protocols/ospf
            currentProtocol = vport + '/protocols/' + protocolName
            response = self.ixnObj.get(currentProtocol)
            if response.json()['enabled'] == True:
                # 192.168.70.11:1:5
                response = self.ixnObj.get(vport)
                assignedTo = response.json()['assignedTo']
                currentChassisIp = str(assignedTo.split(':')[0])
                currentCardNumber = str(assignedTo.split(':')[1])
                currentPortNumber = str(assignedTo.split(':')[2])
                currentPort = [
                    currentChassisIp, currentCardNumber, currentPortNumber
                ]
                portList.append(currentPort)

        return portList

    def getProtocolListByPort(self, port):
        """
        Description
            Get all enabled protocols by the specified port.

        Parameters
            port: [chassisIp, cardNumber, portNumber] -> ['192.168.70.11', '2', '8']
        """
        self.ixnObj.logInfo('\ngetProtocolListByPort...')
        chassis = str(port[0])
        card = str(port[1])
        port = str(port[2])
        specifiedPort = [chassis, card, port]
        enabledProtocolList = []
        response = self.ixnObj.get(self.ixnObj.sessionUrl + '/vport')
        vportList = [
            '%s/%s/%s' % (self.ixnObj.sessionUrl, 'vport', str(i["id"]))
            for i in response.json()
        ]
        for vport in vportList:
            response = self.ixnObj.get(vport, 'assignedTo')
            # 192.168.70.11:1:5
            assignedTo = response.json()['assignedTo']
            currentChassisIp = str(assignedTo.split(':')[0])
            currentCardNumber = str(assignedTo.split(':')[1])
            currentPortNumber = str(assignedTo.split(':')[2])
            currentPort = [
                currentChassisIp, currentCardNumber, currentPortNumber
            ]
            if currentPort != specifiedPort:
                continue
            else:
                response = self.ixnObj.get(vport + '/protocols?links=true')
                if response.status_code == 200:
                    #print 'json', response.json()['links']
                    for protocol in response.json()['links']:
                        currentProtocol = protocol['href']
                        url = self.ixnObj.httpHeader + currentProtocol
                        response = self.ixnObj.get(url)
                        if 'enabled' in response.json() and response.json(
                        )['enabled'] == True:
                            # Exclude ARP object
                            if 'arp' not in currentProtocol:
                                enabledProtocolList.append(
                                    str(currentProtocol))

        return enabledProtocolList

    def sendArpOnPort(self, portName):
        """
        Description
            Send Arp request on a specified port

        Parameters
            portName: <str>: Name of the port. eg: '1/1/11'

        Syntax
            POST: http://10.154.162.94:11009/api/v1/sessions/1/ixnetwork/vport/operations/sendarp
            DATA: {"arg1": "/api/v1/sessions/1/ixnetwork/vport/1"}

        Examples
            sendArpOnPort(portName='1/1/11')
        """
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport == None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))

        url = self.ixnObj.sessionUrl + '/vport/operations/sendarp'
        response = self.ixnObj.post(url, data={'arg1': vport})
        self.ixnObj.waitForComplete(response,
                                    url + '/' + response.json()['id'])

    def getDiscoverdNeighborOnPort(self, portName):
        """
        Description
            Get Arp discovered neighbor on a specified port

        Parameters
            portName: <str>: Name of the port. eg: '1/1/11'

        Syntax
            GET: http://10.154.162.94:11009/api/v1/sessions/1/ixnetwork/vport/1/discoveredNeighbor/1

        Examples
            getDiscoverdNeighborOnPort(portName='1/1/11')

        Return
            Discovered mac address
        """
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport == None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))

        url = vport + '/discoveredNeighbor'
        response = self.ixnObj.get(url)

        url = self.ixnObj.httpHeader + response.json()[0]['links'][0]['href']
        response = self.ixnObj.get(url)

        self.ixnObj.logInfo('Discovered Neighbor: %s' %
                            response.json()['neighborMac'])
        return response.json()['neighborMac']

    def startStopProtocolOnPort(self, protocol, portName, action='start'):
        """
        Description
            Start and stop a protocol on a specified port

        Parameters
            protocol: <str>: Protocol to start
            portName: <str>: Name of the port, eg: '1/1/11'
            action: <str>: start or stop a protocol, default is start

        Syntax
            POST: /api/v1/sessions/{id}/ixnetwork/vport/protocols/<protocol>
            DATA: {'args': 'api/v1/sessions/1/ixnetwork/vport/1'}

        Examples
            startStopProtocolOnPort(protocol='ospf', portName='1/1/11')
            startStopProtocolOnPort(protocol='ospf', portName='1/1/11', action='stop')

        """
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport == None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))

        url = self.ixnObj.sessionUrl + '/vport/protocols/' + protocol + '/operations/' + action
        vport = vport + '/protocols/' + protocol
        response = self.ixnObj.post(url, data={'arg1': vport})
        self.ixnObj.waitForComplete(response,
                                    url + '/' + response.json()['id'])

    def getConfiguredProtocols(self):
        """
        Description
            Get the list of protocols configured on vports.

        Return
            A list or one or more congfigured protocols eg: "['ospf','bgp']"
            return [] if no protocol is configured
        """
        time.sleep(5)
        configuredProtocolList = []
        protocolList = [
            'bfd', 'bgp', 'eigrp', 'isis', 'ldp', 'lisp', 'mplsOam', 'mplsTp',
            'ospf', 'ospfV3', 'pimsm', 'rip', 'ripng'
        ]
        response = self.ixnObj.get(self.ixnObj.sessionUrl + '/vport')
        if response == False:
            raise IxNetRestApiException('No ports connected to chassis')

        vportList = [
            '%s' % vport['links'][0]['href'] for vport in response.json()
        ]
        for eachVport in vportList:
            for eachProtocol in protocolList:
                node = '/router'
                if re.search('bgp', eachProtocol, re.I):
                    node = '/neighborRange'
                protocolResponse = self.ixnObj.get(self.ixnObj.httpHeader +
                                                   eachVport + '/protocols/' +
                                                   eachProtocol)
                response = self.ixnObj.get(self.ixnObj.httpHeader + eachVport +
                                           '/protocols/' + eachProtocol + node)
                if response.json() != []:
                    if response.json(
                    )[0]['enabled'] == True and protocolResponse.json(
                    )['runningState'] == 'started':
                        configuredProtocolList.append(eachProtocol)
        configuredProtocolList = list(set(configuredProtocolList))
        return configuredProtocolList

    def enableProtocolOnPort(self, protocol, portName, enable=True):
        """
        Description
           Enable protocol on a speficied port

        Parameters
            protocol: <str>: Protocol to start
            portName: <str>: Name of the port eg: '1/1/11'
            enable: <bool> enable or disable specified protocol. default is True

        Syntax
            PATCH: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/router/{id}
            PATCH: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/neighborRange/{id}
            PATCH: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/host/{id}
            PATCH: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/bridge/{id}
            PATCH: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/actor/{id}
            PATCH: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/neighborPair/{id}

        Examples
            enableProtocolOnPort(protocol='ospf', portName='1/1/11')
            enableProtocolOnPort(protocol='ospf', portName='1/1/11', enable=False)
        """
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport == None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))

        RouterInstanceList = self.getRouterInstanceByPortAndProtocol(
            protocol=protocol, vport=vport)
        if RouterInstanceList == []:
            raise IxNetRestApiException(
                'No Router instance exists in protocol {0}'.format(protocol))

        for eachRouterInstance in RouterInstanceList:
            url = self.ixnObj.httpHeader + eachRouterInstance
            self.ixnObj.patch(url, data={"enabled": enable})

    def getProtocolSessionsStats(self, portName, protocol):
        """
        Description
            Get a protocol session status for a specified protocol on a port

        Parameters
            portName: <str>: Name of the Port to get the protocol session stats eg: "1/1/11"
            protocol: <str>: Name of the protocol. eg: <ospf/ospfV3/bgp/isis/ripng/bfd/rip/ldp/mplsoam/pim>

        Examples
            getProtocolSessionsStats(portName='1/1/11', protocol='ospf')

        Return
            Protocol stats in dictionary format eg: {'ospf': {'Configured': 2, 'Up': 1}}
        """
        protocolStats = {}
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport == None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))

        node = '/router'
        if re.search('bgp', protocol, re.I):
            node = '/neighborRange'
        protocolResponse = self.ixnObj.get(vport + '/protocols/' + protocol)
        response = self.ixnObj.get(vport + '/protocols/' + protocol + node)

        if response.json() != []:
            if response.json()[0]['enabled'] == True and protocolResponse.json(
            )['runningState'] == 'started':
                if re.search('ospf', protocol, re.I):
                    protocolViewName = 'OSPF Aggregated Statistics'
                elif re.search('ospfV3', protocol, re.I):
                    protocolViewName = 'OSPFv3 Aggregated Statistics'
                elif re.search('bgp', protocol, re.I):
                    protocolViewName = 'BGP Aggregated Statistics'
                elif re.search('isis', protocol, re.I):
                    protocolViewName = 'ISIS Aggregated Statistics'
                elif re.search('ripng', protocol, re.I):
                    protocolViewName = 'RIPng Aggregated Statistics'
                elif re.search('bfd', protocol, re.I):
                    protocolViewName = 'BFD Aggregated Statistics'
                elif re.search('rip', protocol, re.I):
                    protocolViewName = 'RIP Aggregated Statistics'
                elif re.search('ldp', protocol, re.I):
                    protocolViewName = 'LDP Aggregated Statistics'
                elif re.search('mplsoam', protocol, re.I):
                    protocolViewName = 'MPLSOAM Aggregated Statistics'
                elif re.search('pim', protocol, re.I):
                    protocolViewName = 'PIMSM Aggregated Statistics'
                else:
                    raise IxNetRestApiException('No viewName defined')
            else:
                raise IxNetRestApiException(
                    'No {0} protocol running or enabled on port {1}'.format(
                        protocol, portName))
        else:
            raise IxNetRestApiException(
                'No {0} protocol configured on port {1}'.format(
                    protocol, portName))

        stats = self.statObj.getStats(viewName=protocolViewName,
                                      displayStats=False)

        #totalPorts = len(stats.keys());  # Length stats.keys() represents total ports.
        self.ixnObj.logInfo('ProtocolViewName: {0}'.format(protocolViewName))
        for session in stats.keys():
            if re.search('OSPF', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Full Nbrs.'])
                totalSessions = int(stats[session]['Sess. Configured'])
            elif re.search('BGP', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Sess. Up'])
                totalSessions = int(stats[session]['Sess. Configured'])
            elif re.search('ISIS', protocolViewName, re.I):
                sessionsUp = int(stats[session]['L2 Sess. Up'])
                totalSessions = int(stats[session]['L2 Sess. Configured'])
            elif re.search('RIPng', protocolViewName, re.I) or re.search(
                    'BFD', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Routers Running'])
                totalSessions = int(stats[session]['Routers Configured'])
            elif re.search('RIP', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Request Packet Tx'])
                totalSessions = int(stats[session]['Routers Configured'])
            elif re.search('LACP', protocolViewName, re.I):
                sessionsUp = int(stats[session]['LAG Member Ports UP'])
                totalSessions = int(stats[session]['Total LAG Member Ports'])
            elif re.search('LDP', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Targeted Sess. Up'])
                totalSessions = int(
                    stats[session]['Targeted Sess. Configured'])
            elif re.search('MPLS', protocolViewName, re.I):
                sessionsUp = int(stats[session]['BFD Up-Sessions'])
                totalSessions = int(stats[session]['BFD Session Count'])
            elif re.search('PIM', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Rtrs. Running'])
                totalSessions = int(stats[session]['Rtrs. Configured'])
                # totalSessionsNotStarted = int(stats[session]['Sessions Not Started'])
            else:
                raise IxNetRestApiException('No protocol viewName found')

            if stats[session]['Port Name'] == portName:
                self.ixnObj.logInfo(
                    '\n\tPortName: {0}\n\t   TotalSessionsUp: {1}\n\t   TotalSessionsConfigured: {2}'
                    .format(stats[session]['Port Name'], sessionsUp,
                            totalSessions),
                    timestamp=False)
                protocolStats[protocol] = {
                    'Configured': totalSessions,
                    'Up': sessionsUp
                }
        return protocolStats

    def enableRouteRangeOnProtocol(self,
                                   portName,
                                   protocol,
                                   routeRange,
                                   enable=True):
        """
        Description
            Enable a route range for a protocol on a speficied port

        Parameters
            portName: <str>: Name of the port eg: "1/1/11"
            protocol: <str>: protocol to enable route range. eg: <OSPF|OSPFV3|BGP|ISIS|EIGRP|RIP|RIPng>
            routeRange: <str>: route range <IPv4|IPv6> address
            enable: <bool>: enable or disable route range, default is True (enable)

        Syntax
            PATCH: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/router/{id}/routeRange/{id}
            PATCH: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/neighborRange/{id}/routeRange/{id}

        Examples:
            enableRouteRangeOnProtocol(protName='1/1/11', protocol='ospf', routeRange='10.10.10.1')
            enableRouteRangeOnProtocol(protName='1/1/11', protocol='ospfv3', routeRange='10::1', enable=True)
        """
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport == None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))

        RouterInstanceList = self.getRouterInstanceByPortAndProtocol(
            protocol=protocol, vport=vport)
        if RouterInstanceList == []:
            raise IxNetRestApiException(
                'No Router instance exists in protocol {0}'.format(protocol))

        args = 'firstRoute'
        if protocol == 'ospf':
            args = 'networkNumber'
        if protocol == 'bgp':
            args = 'networkAddress'

        for eachRouterInstance in RouterInstanceList:
            url = self.ixnObj.httpHeader + eachRouterInstance + '/routeRange'
            response = self.ixnObj.get(url)
            RouteRangeInstanceList = [
                "%s" % (str(i["links"][0]["href"])) for i in response.json()
            ]
            self.ixnObj.logInfo('Route Range list %s' % RouteRangeInstanceList)

            for eachRouteRange in RouteRangeInstanceList:
                url = self.ixnObj.httpHeader + eachRouteRange
                response = self.ixnObj.get(url)
                RouteRangeNetwork = response.json()[args]
                if RouteRangeNetwork == routeRange:
                    self.ixnObj.patch(url, data={"enabled": enable})
                    return
            raise IxNetRestApiException(
                'Route range: {0} does not exist in protocol: {1} port: {2}'.
                format(routeRange, protocol, portName))

    def removeRouteRangeOnProtocol(self, portName, protocol, routeRange):
        """
        Description
            Remove a route range for a protocol on a speficied port

        Parameters
            portName: <str>: Name of the port eg: "1/1/11"
            protocol: <str>: protocol to remove route range. eg: <OSPF|OSPFV3|BGP|ISIS|EIGRP|RIP|RIPng>
            routeRange: <str>: route range <IPv4|IPv6> address

        Syntax
            DELETE: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/router/{id}/routeRange/{id}
            DELETE: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/neighborRange/{id}/routeRange/{id}

        Examples:
            removeRouteRangeOnProtocol(protName='1/1/11', protocol='ospf', routeRange='10.10.10.1')
            removeRouteRangeOnProtocol(protName='1/1/11', protocol='ospfv3', routeRange='10::1')
        """
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport == None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))

        RouterInstanceList = self.getRouterInstanceByPortAndProtocol(
            protocol=protocol, vport=vport)
        if RouterInstanceList == []:
            raise IxNetRestApiException(
                'No Router instance exists in protocol {0}'.format(protocol))

        self.ixnObj.logInfo('Router list %s' % RouterInstanceList)
        args = 'firstRoute'
        if protocol == 'ospf':
            args = 'networkNumber'
        if protocol == 'bgp':
            args = 'networkAddress'

        for eachRouterInstance in RouterInstanceList:
            url = self.ixnObj.httpHeader + eachRouterInstance + '/routeRange'
            response = self.ixnObj.get(url)
            RouteRangeInstanceList = [
                "%s" % (str(i["links"][0]["href"])) for i in response.json()
            ]
            self.ixnObj.logInfo('Route Range list %s' % RouteRangeInstanceList)
            for eachRouteRange in RouteRangeInstanceList:
                url = self.ixnObj.httpHeader + eachRouteRange
                response = self.ixnObj.get(url)
                RouteRangeNetwork = response.json()[args]
                if RouteRangeNetwork == routeRange:
                    self.ixnObj.delete(url)
                    return

            raise IxNetRestApiException(
                'Route range: {0} does not exist in protocol: {1} port: {2}'.
                format(routeRange, protocol, portName))

    def createRouteRangeOnProtocol(self, portName, protocol, routeRange):
        """
        Description
            Create a route range for a protocol on a speficied port

        Parameters
            portName: <str>: Name of the port eg: "1/1/11"
            protocol: <str>: protocol to create route range. eg: <OSPF|OSPFV3|BGP|ISIS|EIGRP|RIP|RIPng>
            routeRange: <dict>: route range to configure <IPv4|IPv6> address
            eg: {'enabled': 'True', 'mask': 24, 'numberOfRoutes': 5, 'networkNumber': '8.7.7.1', 'metric': 10, 'origin': 'externalType1'}
                {'enabled': 'True', 'maskWidth': 64, 'numberOfRoute': 10, 'firstRoute': '7::1', 'metric': 10, 'nextHop': '7::2'}

        Syntax
            POST: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/ospf/router/{id}/routeRange/{id}
            DATA: {'enabled': 'True', 'mask': 24, 'numberOfRoutes': 5, 'networkNumber': '7.7.7.1', 'metric': 10, 'origin': 'externalType1'}

            POST: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/ospfV3/router/{id}/routeRange/{id}
            DATA: {'enabled': 'True', 'mask': 64, 'numberOfRoutes': 5, 'firstRoute': '7::1', 'metric': 10, 'type': 'anotherArea', 'addressFamily': 'unicast'}

            POST: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/eigrp/router/{id}/routeRange/{id}
            DATA: {'enabled': 'True', 'mask': 24, 'numberOfRoutes': 10, 'firstRoute': '7.7.7.1', 'metric': 10, 'nextHop': '7.7.7.2'}

            POST: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/rip/router/{id}/routeRange/{id}
            DATA: {'enabled': 'True', 'maskWidth': 24, 'noOfRoutes': 10, 'firstRoute': '7.7.7.1', 'metric': 10, 'nextHop': '7.7.7.2'}

            POST: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/ripng/router/{id}/routeRange/{id}
            DATA: {'enabled': 'True', 'maskWidth': 64, 'numberOfRoute': 10, 'firstRoute': '7::1', 'metric': 10, 'nextHop': '7::2'}

            POST: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/bgp/neighborRange/{id}/routeRange/{id}
            DATA: {'enabled': 'True', 'fromPrefix': 24, 'thruPrefix': 24, 'numRoutes': 10, 'networkAddress': '7.7.7.7'}

            POST: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/bgp/neighborRange/{id}/routeRange/{id}
            DATA: {'enabled': 'True', 'fromPrefix': 64, 'thruPrefix': 64, 'numRoutes': 10, 'networkAddress': '7::1'}

        Examples
            createRouteRangeOnProtocol(portName='1/1/11', protocol='ospf', routeRange={'enabled': 'True', 'mask': 24,
                                                                         'numberOfRoutes': 5, 'networkNumber': '8.7.7.1',
                                                                         'metric': 10, 'origin': 'externalType1'}
            createRouteRangeOnProtocol(portName='1/1/11', protocol='ospf', routeRange={'networkNumber': '8.7.7.1'}

        """
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport == None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))

        RouterInstanceList = self.getRouterInstanceByPortAndProtocol(
            protocol=protocol, vport=vport)
        if RouterInstanceList == []:
            raise IxNetRestApiException(
                'No Router instance exists in protocol {0}'.format(protocol))

        self.ixnObj.logInfo('Router list %s' % RouterInstanceList)
        #routeRange = ast.literal_eval(routeRange)
        for eachRouterInstance in RouterInstanceList:
            url = self.ixnObj.httpHeader + eachRouterInstance + '/routeRange'
            self.ixnObj.post(url, data=routeRange)

    def getRouterInstanceByPortAndProtocol(self, protocol, vport):
        """
        Description
            Get router instance for the specified protocol on a speficied vport

        Parameters
            protocol: <str>: protocol to get a router instance
            vport: <str>: vport instance eg: "/api/v1/sessions/1/ixnetwork/vport/1"

        Syntax
            GET: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/router
            GET: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/neighborRange
            GET: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/host
            GET: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/bridge
            GET: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/actor
            GET: /api/v1/sessions/{id}/ixnetwork/vport/{id}/protocols/<protocol>/neighborPair

        Examples
            getRouterInstanceByPortAndProtocol(protocol='ospf', vport='/api/v1/sessions/1/ixnetwork/vport/1')

        Return
            RouterInstanceList
            Returns [] if no router instance exists
        """
        if protocol == 'bgp':
            nextNode = '/neighborRange'
        elif protocol == 'igmp' or protocol == 'mld':
            nextNode = '/host'
        elif protocol == 'stp':
            nextNode = '/bridge'
        elif protocol == 'rsvp':
            nextNode = '/neighborPair'
        elif protocol == 'lacp':
            nextNode = '/link'
        else:
            nextNode = '/router'
        url = vport + '/protocols/' + protocol + nextNode
        response = self.ixnObj.get(url)
        RouterInstanceList = [
            "%s" % (str(i["links"][0]["href"])) for i in response.json()
        ]
        self.ixnObj.logInfo('Router Instance list %s' % RouterInstanceList)
        return RouterInstanceList

    def verifyProtocolSessionsUp(self,
                                 protocolViewName='BGP Peer Per Port',
                                 timeout=60):
        """
        Description
            Verify the specified protocol sessions are UP or not.

        Parameters
            protocolViewName: <str>: The protocol view name. Get this name from API browser or in IxNetwork GUI statistic tabs.
            timeout: <int>: Duration to wait for the protocol sessions to up. Default = 60 seconds.

        protocolViewName options:
            'BFD Aggregated Statistics'
            'BGP Aggregated Statistics'
            'ISIS Aggregated Statistics'
            'OSPF Aggregated Statistics'
            'RIPng Aggregated Statistics'
            'RIP Aggregated Statistics'
            'LDP Aggregated Statistics'
            'PIMSM Aggregated Statistics'
            'MPLSOAM Aggregated Statistics'

        Examples
            verifyProtocolSessionsUp(protcolViewName='ospf Aggregated Statistics')
            verifyProtocolSessionsUp(protcolViewName='ospf Aggregated Statistics',timeout=90)
        """
        totalSessionsDetectedUp = 0
        totalSessionsDetectedDown = 0
        totalPortsUpFlag = 0
        self.ixnObj.logInfo('Protocol view name %s' % protocolViewName)
        time.sleep(10)
        for counter in range(1, timeout + 1):
            stats = self.statObj.getStats(viewName=protocolViewName,
                                          displayStats=False)
            totalPorts = len(
                stats.keys())  # Length stats.keys() represents total ports.
            self.ixnObj.logInfo('ProtocolName: {0}'.format(protocolViewName))
            for session in stats.keys():
                if re.search('OSPF', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Full Nbrs.'])
                    totalSessions = int(stats[session]['Sess. Configured'])
                elif re.search('BGP', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Sess. Up'])
                    totalSessions = int(stats[session]['Sess. Configured'])
                elif re.search('ISIS', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['L2 Sess. Up'])
                    totalSessions = int(stats[session]['L2 Sess. Configured'])
                elif re.search('RIPng', protocolViewName, re.I) or re.search(
                        'BFD', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Routers Running'])
                    totalSessions = int(stats[session]['Routers Configured'])
                elif re.search('RIP', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Request Packet Tx'])
                    totalSessions = int(stats[session]['Routers Configured'])
                elif re.search('LACP', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['LAG Member Ports UP'])
                    totalSessions = int(
                        stats[session]['Total LAG Member Ports'])
                elif re.search('LDP', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Targeted Sess. Up'])
                    totalSessions = int(
                        stats[session]['Targeted Sess. Configured'])
                elif re.search('MPLS', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['BFD Up-Sessions'])
                    totalSessions = int(stats[session]['BFD Session Count'])
                elif re.search('PIM', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Rtrs. Running'])
                    totalSessions = int(stats[session]['Rtrs. Configured'])
                # totalSessionsNotStarted = int(stats[session]['Sessions Not Started'])
                totalExpectedSessionsUp = totalSessions

                if totalExpectedSessionsUp != 0:
                    self.ixnObj.logInfo(
                        '\n\tPortName: {0}\n\t   TotalSessionsUp: {1}\n\t   ExpectedTotalSessionsup: {2}'
                        .format(stats[session]['Port Name'], sessionsUp,
                                totalExpectedSessionsUp),
                        timestamp=False)
                    if counter < timeout and sessionsUp != totalExpectedSessionsUp:
                        self.ixnObj.logInfo(
                            '\t   Protocol Session is still down',
                            timestamp=False)

                    if counter < timeout and sessionsUp == totalExpectedSessionsUp:
                        totalPortsUpFlag += 1
                        if totalPortsUpFlag == totalPorts:
                            self.ixnObj.logInfo(
                                'All protocol sessions are up!')
                            return

            if counter == timeout and sessionsUp != totalExpectedSessionsUp:
                raise IxNetRestApiException(
                    'Protocol Sessions failed to come up')

            self.ixnObj.logInfo('\n\tWait {0}/{1} seconds\n'.format(
                counter, timeout),
                                timestamp=False)
            time.sleep(1)

    def verifyAllConfiguredProtocolSessions(self, duration):
        """
        Description
            verify all configured protocol sessions are UP or not

        Parameters
            duration: <int>: duration to wait for the protocol sessions to UP

        Examples
            verifyAllConfiguredProtocolSessions(duration=120)
            verifyAllConfiguredProtocolSessions(120)
        """
        response = self.getConfiguredProtocols()
        if response == []:
            raise IxNetRestApiException(
                'No protocols Running or Configured or Enabled')

        for eachProtocol in response:
            if re.search('ospf', eachProtocol, re.I):
                viewName = 'OSPF Aggregated Statistics'
            elif re.search('ospfV3', eachProtocol, re.I):
                viewName = 'OSPFv3 Aggregated Statistics'
            elif re.search('bgp', eachProtocol, re.I):
                viewName = 'BGP Aggregated Statistics'
            elif re.search('isis', eachProtocol, re.I):
                viewName = 'ISIS Aggregated Statistics'
            elif re.search('ripng', eachProtocol, re.I):
                viewName = 'RIPng Aggregated Statistics'
            elif re.search('bfd', eachProtocol, re.I):
                viewName = 'BFD Aggregated Statistics'
            elif re.search('rip', eachProtocol, re.I):
                viewName = 'RIP Aggregated Statistics'
            elif re.search('ldp', eachProtocol, re.I):
                viewName = 'LDP Aggregated Statistics'
            elif re.search('mplsoam', eachProtocol, re.I):
                viewName = 'MPLSOAM Aggregated Statistics'
            elif re.search('pim', eachProtocol, re.I):
                viewName = 'PIMSM Aggregated Statistics'
            else:
                raise IxNetRestApiException('No viewName defined')

            self.verifyProtocolSessionsUp(protocolViewName=viewName,
                                          timeout=duration)
コード例 #2
0
class ClassicProtocol(object):
    def __init__(self, ixnObj=None):
        """
        Parameters
           ixnObj: <str>: The main connection object.
        """
        self.ixnObj = ixnObj
        self.ixNetwork = ixnObj.ixNetwork
        self.portMgmtObj = PortMgmt(self.ixnObj)
        self.statObj = Statistics(self.ixnObj)

    def getPortsByProtocol(self, protocolName):
        """
        Description
            Based on the specified protocol, return all ports associated with the protocol.

        Parameters
           protocolName options:
              bfd, bgp, cfm, eigrp, elmi, igmp, isis, lacp, ldp, linkOam, lisp, mld, mplsOam,
              mplsTp, openFlow, ospf, ospfV3, pimsm, ping, rip, ripng, rsvp, static, stp

        Returns: [chassisIp, cardNumber, portNumber]
                  Example: [['192.168.70.11', '1', '1'],['192.168.70.11', '1', '2']]

        Returns [] if no port is configured with the specified protocolName
        """
        portList = []
        vportList = self.ixNetwork.Vport.find()
        for vport in vportList:
            protocol = protocolName[0].capitalize() + protocolName[1:]
            protocolObj = getattr(vport.Protocols.find(), protocol)
            if protocolObj.Enabled:
                assignedTo = vport.AssignedTo
                currentChassisIp = assignedTo.split(':')[0]
                currentCardNumber = assignedTo.split(':')[1]
                currentPortNumber = assignedTo.split(':')[2]
                currentPort = [
                    currentChassisIp, currentCardNumber, currentPortNumber
                ]
                portList.append(currentPort)
        return portList

    def getProtocolListByPort(self, port):
        """
        Description
            Get all enabled protocols by the specified port.

        Parameters
            port: [chassisIp, cardNumber, portNumber] ->['192.168.70.11', '2', '8']
        """
        self.ixnObj.logInfo('\ngetProtocolListByPort...')
        protocolList = [
            'bfd', 'bgp', 'cfm', 'eigrp', 'elmi', 'igmp', 'isis', 'lacp',
            'ldp', 'linkOam', 'lisp', 'mld', 'mplsOam', 'mplsTp', 'openFlow',
            'ospf', 'ospfV3', 'pimsm', 'ping', 'rip', 'ripng', 'rsvp', 'stp'
        ]
        self.ixnObj.logInfo('\ngetProtocolListByPort...')
        chassis = str(port[0])
        card = str(port[1])
        port = str(port[2])
        portObj = chassis + ":" + card + ":" + port
        enabledProtocolList = []
        vport = self.ixNetwork.Vport.find(AssignedTo=portObj)
        for protocol in protocolList:
            currentProtocol = protocol[0].capitalize() + protocol[1:]
            protocolObj = getattr(vport.Protocols.find(), currentProtocol)
            if protocolObj.Enabled:
                enabledProtocolList.append(str(protocol))
        return enabledProtocolList

    def sendArpOnPort(self, portName):
        """
        Description
            Send Arp request on a specified port

        Parameters
            portName: <str>: Name of the port. eg: '1/1/11'

        Examples
            sendArpOnPort(portName='1/1/11')
        """
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport is None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))
        vport.SendArp()

    def getDiscoverdNeighborOnPort(self, portName):
        """
        Description
            Get Arp discovered neighbor on a specified port

        Parameters
            portName: <str>: Name of the port. eg: '1/1/11'

        Examples
            getDiscoverdNeighborOnPort(portName='1/1/11')

        Return
            Discovered mac address
        """
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport is None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))
        discoveredNeighborMac = vport.DiscoveredNeighbor.find().NeighborMac
        self.ixnObj.logInfo('Discovered Neighbor: %s' % discoveredNeighborMac)
        return discoveredNeighborMac

    def startStopProtocolOnPort(self, protocol, portName, action='start'):
        """
        Description
            Start and stop a protocol on a specified port

        Parameters
            protocol: <str>: Protocol to start
            portName: <str>: Name of the port, eg: '1/1/11'
            action: <str>: start or stop a protocol, default is start

        Examples
            startStopProtocolOnPort(protocol='ospf', portName='1/1/11')
            startStopProtocolOnPort(protocol='ospf', portName='1/1/11', action='stop')
        """
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport is None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))
        protocol = protocol[0].capitalize() + protocol[1:]
        protocolObj = getattr(vport.Protocols.find(), protocol)
        if action == "start":
            protocolObj.Start()
        if action == "stop":
            protocolObj.Stop()

    def getConfiguredProtocols(self):
        """
        Description
            Get the list of protocols configured on vports.

        Return
            A list or one or more congfigured protocols eg: "['ospf','bgp']"
            return [] if no protocol is configured
        """
        configuredProtocolList = []
        availableProtocolList = [
            'bfd', 'bgp', 'cfm', 'eigrp', 'elmi', 'igmp', 'isis', 'lacp',
            'ldp', 'linkOam', 'lisp', 'mld', 'mplsOam', 'mplsTp', 'openFlow',
            'ospf', 'ospfV3', 'pimsm', 'ping', 'rip', 'ripng', 'rsvp', 'stp'
        ]
        vportList = self.ixNetwork.Vport.find()
        if not vportList:
            raise IxNetRestApiException('No ports connected to chassis')

        protocolNextNodeDict = {
            'bgp': 'NeighborRange',
            'igmp': 'Host',
            'mld': 'Host',
            'stp': 'Bridge',
            'cfm': 'Bridge',
            'rsvp': 'NeighborPair',
            'lacp': 'Link',
            'linkOam': 'Link',
            'elmi': 'Uni',
            'openFlow': 'Device'
        }
        protocols = [
            'bgp', 'igmp', 'mld', 'stp', 'cfm', 'rsvp', 'lacp', 'linkOam',
            'elmi', 'openFlow'
        ]
        for eachVport in vportList:
            for protocol in availableProtocolList:
                if protocol in protocols:
                    nextNode = protocolNextNodeDict[protocol]
                else:
                    nextNode = 'Router'
                protocol = protocol[0].capitalize() + protocol[1:]
                protocolResponse = getattr(eachVport.Protocols.find(),
                                           protocol)
                nextNodeObj = getattr(protocolResponse, nextNode)
                routerInstancesObj = nextNodeObj.find()
                if routerInstancesObj:
                    if routerInstancesObj.Enabled and protocolResponse.RunningState == 'started':
                        configuredProtocolList.append(protocol)
        configuredProtocolList = list(set(configuredProtocolList))
        return configuredProtocolList

    def enableProtocolOnPort(self, protocol, portName, enable=True):
        """
        Description
           Enable protocol on a speficied port

        Parameters
            protocol: <str>: Protocol to start
            portName: <str>: Name of the port eg: '1/1/11'
            enable: <bool> enable or disable specified protocol.

        Examples
            enableProtocolOnPort(protocol='ospf', portName='1/1/11')
            enableProtocolOnPort(protocol='ospf', portName='1/1/11', enable=False)
        """
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport is None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))

        RouterInstanceList = self.getRouterInstanceByPortAndProtocol(
            protocol=protocol, vport=vport)
        if not RouterInstanceList:
            raise IxNetRestApiException(
                'No Router instance exists in protocol {0}'.format(protocol))
        for eachRouterInstance in RouterInstanceList:
            eachRouterInstance.Enabled = enable

    def getProtocolSessionsStats(self, portName, protocol):
        """
        Description
            Get a protocol session status for a specified protocol on a port

        Parameters
            portName: <str>: Name of the Port eg: "1/1/11"
            protocol: <str>: Name of the protocol. eg: <ospf/ospfV3/bgp/isis/ripng/bfd/rip/ldp/pim>

        Examples
            getProtocolSessionsStats(portName='1/1/11', protocol='ospf')

        Return
            Protocol stats in dictionary format eg: {'ospf': {'Configured': 2, 'Up': 1}}
        """
        protocolStats = {}
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport is None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))
        protocolNextNodeDict = {
            'bgp': 'NeighborRange',
            'igmp': 'Host',
            'mld': 'Host',
            'stp': 'Bridge',
            'cfm': 'Bridge',
            'rsvp': 'NeighborPair',
            'lacp': 'Link',
            'linkOam': 'Link',
            'elmi': 'Uni',
            'openFlow': 'Device'
        }
        protocols = [
            'bgp', 'igmp', 'mld', 'stp', 'cfm', 'rsvp', 'lacp', 'linkOam',
            'elmi', 'openFlow'
        ]
        if protocol in protocols:
            nextNode = protocolNextNodeDict[protocol]
        else:
            nextNode = 'Router'
        protocol = protocol[0].capitalize() + protocol[1:]
        protocolResponse = getattr(vport.Protocols.find(), protocol)
        nextNodeObj = getattr(protocolResponse, nextNode)
        routerInstancesObj = nextNodeObj.find()

        if routerInstancesObj:
            if routerInstancesObj.Enabled and (
                    protocolResponse.RunningState == 'started'
                    or protocolResponse.ProtocolState == 'started'):
                if protocol in [
                        'Bfd', 'Bgp', 'Cfm', 'Eigrp', 'Elmi', 'Igmp', 'Isis',
                        'Lacp', 'Ldp', 'Lisp', 'Mld', 'MplsTp', 'MplsOam',
                        'Ospf', 'Rip', 'Rsvp', 'Stp'
                ]:
                    protocolViewName = protocol.upper(
                    ) + 'Aggregated Statistics'
                elif re.search('LinkOam', protocol, re.I):
                    protocolViewName = 'OAM Aggregated Statistics'
                elif re.search('openFlow', protocol, re.I):
                    protocolViewName = 'OpenFlow Switch Aggregated Statistics'
                elif re.search('OspfV3', protocol, re.I):
                    protocolViewName = 'OSPFv3 Aggregated Statistics'
                elif re.search('Pim', protocol, re.I):
                    protocolViewName = 'PIMSM Aggregated Statistics'
                elif re.search('Ripng', protocol, re.I):
                    protocolViewName = 'RIPng Aggregated Statistics'
                else:
                    raise IxNetRestApiException('No viewName defined')
            else:
                raise IxNetRestApiException(
                    'No {0} protocol running or enabled on port {1}'.format(
                        protocol, portName))
        else:
            raise IxNetRestApiException(
                'No {0} protocol configured on port {1}'.format(
                    protocol, portName))

        stats = self.statObj.getStats(viewName=protocolViewName,
                                      displayStats=False)
        self.ixnObj.logInfo('ProtocolViewName: {0}'.format(protocolViewName))
        for session in stats.keys():
            if re.search('BFD', protocolViewName, re.I) or re.search(
                    'RIPng', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Routers Running'])
                totalSessions = int(stats[session]['Routers Configured'])
            elif re.search('BGP', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Sess. Up'])
                totalSessions = int(stats[session]['Sess. Configured'])
            elif re.search('CFM', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Bridges Running'])
                totalSessions = int(stats[session]['Bridges Configured'])
            elif re.search('EIGRP', protocolViewName, re.I) or re.search(
                    'ELMI', protocolViewName, re.I):
                sessionsUp = int(stats[session]['IPv4 Routers Running'])
                totalSessions = int(stats[session]['IPv4 Routers Configured'])
            elif re.search('IGMP', protocolViewName, re.I) or re.search(
                    'MLD', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Host Total Frames Tx'])
                totalSessions = int(stats[session]['Host Total Frames Rx'])
            elif re.search('ISIS', protocolViewName, re.I):
                sessionsUp = int(stats[session]['L2 Sess. Up'])
                totalSessions = int(stats[session]['L2 Sess. Configured'])
            elif re.search('LACP', protocolViewName, re.I):
                sessionsUp = int(stats[session]['LAG Member Ports UP'])
                totalSessions = int(stats[session]['Total LAG Member Ports'])
            elif re.search('LDP', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Targeted Sess. Up'])
                totalSessions = int(
                    stats[session]['Targeted Sess. Configured'])
            elif re.search('OAM', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Links Running'])
                totalSessions = int(stats[session]['Links Configured'])
            elif re.search('LISP', protocolViewName, re.I):
                sessionsUp = int(stats[session]['MS/MR Running'])
                totalSessions = int(stats[session]['MS/MR Configured'])
            elif re.search('MPLSTP', protocolViewName, re.I):
                sessionsUp = int(stats[session]['CCCV Up'])
                totalSessions = int(stats[session]['CCCV Configured'])
            elif re.search('MPLSOAM', protocolViewName, re.I):
                sessionsUp = int(stats[session]['BFD Up-Sessions'])
                totalSessions = int(stats[session]['BFD Session Count'])
            elif re.search('OpenFlow', protocolViewName, re.I):
                sessionsUp = int(stats[session]['OF Channel Configured Up'])
                totalSessions = int(stats[session]['OF Channel Configured'])
            elif re.search('OSPF', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Full Nbrs.'])
                totalSessions = int(stats[session]['Sess. Configured'])
            elif re.search('PIM', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Rtrs. Running'])
                totalSessions = int(stats[session]['Rtrs. Configured'])
            elif re.search('RIP', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Request Packet Tx'])
                totalSessions = int(stats[session]['Routers Configured'])
            elif re.search('RSVP', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Ingress LSPs Up'])
                totalSessions = int(stats[session]['Ingress LSPs Configured'])
            elif re.search('STP', protocolViewName, re.I):
                sessionsUp = int(stats[session]['Forwarding State Count'])
                totalSessions = int(stats[session]['Discarding State Count'])
            else:
                raise IxNetRestApiException('No protocol viewName found')

            if stats[session]['Port Name'] == portName:
                self.ixnObj.logInfo(
                    '\n\tPortName: {0}\n\t   TotalSessionsUp: {1}\n\t   '
                    'TotalSessionsConfigured: {2}'.format(
                        stats[session]['Port Name'], sessionsUp,
                        totalSessions),
                    timestamp=False)
                protocolStats[protocol] = {
                    'Configured': totalSessions,
                    'Up': sessionsUp
                }
        return protocolStats

    def enableRouteRangeOnProtocol(self,
                                   portName,
                                   protocol,
                                   routeRange,
                                   enable=True):
        """
        Description
            Enable a route range for a protocol on a speficied port

        Parameters
            portName: <str>: Name of the port eg: "1/1/11"
            protocol: <str>: protocol to enable route range.
            routeRange: <str>: route range <IPv4|IPv6> address
            enable: <bool>: enable or disable route range, default is True

        Examples:
            enableRouteRangeOnProtocol(protName='1/1/11', protocol='ospf', routeRange='10.10.10.1')
            enableRouteRangeOnProtocol(protName='1/1/11', protocol='ospfv3', routeRange='10::1',
            enable=True)
        """
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport is None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))

        RouterInstanceList = self.getRouterInstanceByPortAndProtocol(
            protocol=protocol, vport=vport)
        if not RouterInstanceList:
            raise IxNetRestApiException(
                'No Router instance exists in protocol {0}'.format(protocol))
        argsDict = {'ospf': 'NetworkNumber', 'bgp': 'NetworkAddress'}

        if protocol in ['ospf', 'bgp']:
            args = argsDict[protocol]
        else:
            args = 'firstRoute'

        for eachRouterInstance in RouterInstanceList:
            RouteRangeInstanceList = eachRouterInstance.RouteRange.find()
            self.ixnObj.logInfo('Route Range list %s' % RouteRangeInstanceList)

            for eachRouteRange in RouteRangeInstanceList:
                RouteRangeNetwork = getattr(eachRouteRange, args)
                if RouteRangeNetwork == routeRange:
                    eachRouteRange.Enabled = enable
                    return
            raise IxNetRestApiException(
                'Route range: {0} does not exist in protocol: {1} port: {2}'.
                format(routeRange, protocol, portName))

    def removeRouteRangeOnProtocol(self, portName, protocol, routeRange):
        """
        Description
            Remove a route range for a protocol on a speficied port

        Parameters
            portName: <str>: Name of the port eg: "1/1/11"
            protocol: <str>: protocol to remove route range.
            routeRange: <str>: route range <IPv4|IPv6> address

        Examples:
            removeRouteRangeOnProtocol(protName='1/1/11', protocol='ospf', routeRange='10.10.10.1')
            removeRouteRangeOnProtocol(protName='1/1/11', protocol='ospfv3', routeRange='10::1')
        """
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport is None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))

        RouterInstanceList = self.getRouterInstanceByPortAndProtocol(
            protocol=protocol, vport=vport)
        if not RouterInstanceList:
            raise IxNetRestApiException(
                'No Router instance exists in protocol {0}'.format(protocol))

        self.ixnObj.logInfo('Router list %s' % RouterInstanceList)
        argsDict = {'ospf': 'NetworkNumber', 'bgp': 'NetworkAddress'}

        if protocol in ['ospf', 'bgp']:
            args = argsDict[protocol]
        else:
            args = 'firstRoute'

        for eachRouterInstance in RouterInstanceList:
            RouteRangeInstanceList = eachRouterInstance.RouteRange.find()
            self.ixnObj.logInfo('Route Range list %s' % RouteRangeInstanceList)
            for eachRouteRange in RouteRangeInstanceList:
                RouteRangeNetwork = getattr(eachRouteRange, args)
                if RouteRangeNetwork == routeRange:
                    eachRouteRange.remove()
                    return
            raise IxNetRestApiException(
                'Route range: {0} does not exist in protocol: {1} port: {2}'.
                format(routeRange, protocol, portName))

    def createRouteRangeOnProtocol(self, portName, protocol, routeRange):
        """
        Description
            Create a route range for a protocol on a speficied port

        Parameters
            portName: <str>: Name of the port eg: "1/1/11"
            protocol: <str>: protocol to create route range.
            routeRange: <dict>: route range to configure <IPv4|IPv6> address
            eg: {'enabled': 'True', 'mask': 24, 'origin': 'externalType1',
            'networkNumber': '8.7.7.1', 'metric': 10, 'numberOfRoutes': 5}
                {'enabled': 'True', 'maskWidth': 64, 'numberOfRoute': 10, 'firstRoute': '7::1',
                'metric': 10, 'nextHop': '7::2'}

        Examples
            createRouteRangeOnProtocol(portName='1/1/11', protocol='ospf',
            routeRange={'enabled': 'True', 'mask': 24, 'numberOfRoutes': 5,
            'networkNumber': '8.7.7.1', 'metric': 10, 'origin': 'externalType1'}
            createRouteRangeOnProtocol(portName='1/1/11', protocol='ospf',
            routeRange={'networkNumber': '8.7.7.1'}

        """
        vport = self.portMgmtObj.getVportObjectByName(portName)
        if vport is None:
            raise IxNetRestApiException(
                'PortName {0} not connected to chassis'.format(portName))

        RouterInstanceList = self.getRouterInstanceByPortAndProtocol(
            protocol=protocol, vport=vport)
        if not RouterInstanceList:
            raise IxNetRestApiException(
                'No Router instance exists in protocol {0}'.format(protocol))

        self.ixnObj.logInfo('Router list %s' % RouterInstanceList)
        for eachRouterInstance in RouterInstanceList:
            if not eachRouterInstance.RouteRange.find():
                routeRangeObj = eachRouterInstance.RouteRange.add()
            else:
                routeRangeObj = eachRouterInstance.RouteRange.find()
            for key, value in routeRange:
                key = key[0].capitalize() + key[1:]
                setattr(routeRangeObj, key, value)

    def getRouterInstanceByPortAndProtocol(self, protocol, vport):
        """
        Description
            Get router instance for the specified protocol on a speficied vport

        Parameters
            protocol: <str>: protocol to get a router instance
            vport: <str>: vport instance

        Examples
            getRouterInstanceByPortAndProtocol(protocol='ospf', vport=vport object)

        Return
            RouterInstanceList
            Returns [] if no router instance exists
        """
        protocolNextNodeDict = {
            'bgp': 'NeighborRange',
            'igmp': 'Host',
            'mld': 'Host',
            'stp': 'Bridge',
            'cfm': 'Bridge',
            'rsvp': 'NeighborPair',
            'lacp': 'Link',
            'linkOam': 'Link',
            'elmi': 'Uni',
            'openFlow': 'Device'
        }
        protocols = [
            'bgp', 'igmp', 'mld', 'stp', 'cfm', 'rsvp', 'lacp', 'linkOam',
            'elmi', 'openFlow'
        ]
        if protocol in protocols:
            nextNode = protocolNextNodeDict[protocol]
        else:
            nextNode = 'Router'
        RouterInstanceList = []
        protocol = protocol[0].capitalize() + protocol[1:]
        protocolObj = getattr(vport.Protocols.find(), protocol)
        nextNodeObj = getattr(protocolObj, nextNode)
        RouterInstancesList = nextNodeObj.find()
        for eachRouterInstance in RouterInstancesList:
            RouterInstanceList.append(eachRouterInstance)
        self.ixnObj.logInfo('Router Instance list %s' % RouterInstanceList)
        return RouterInstanceList

    def verifyProtocolSessionsUp(self,
                                 protocolViewName='BGP Peer Per Port',
                                 timeout=60):
        """
        Description
            Verify the specified protocol sessions are UP or not.

        Parameters
            protocolViewName: <str>: The protocol view name.
            timeout: <int>: Duration to wait for the protocol sessions to up.Default = 60 seconds.

        protocolViewName options:
            'BFD Aggregated Statistics'
            'BGP Aggregated Statistics'
            'ISIS Aggregated Statistics'
            'OSPF Aggregated Statistics'
            'RIPng Aggregated Statistics'
            'RIP Aggregated Statistics'
            'LDP Aggregated Statistics'
            'PIMSM Aggregated Statistics'
            'MPLSOAM Aggregated Statistics'

        Examples
            verifyProtocolSessionsUp(protcolViewName='ospf Aggregated Statistics')
            verifyProtocolSessionsUp(protcolViewName='ospf Aggregated Statistics',timeout=90)
        """
        totalSessions = 0
        totalPortsUpFlag = 0
        totalExpectedSessionsUp = 0
        sessionsUp = 0
        self.ixnObj.logInfo('Protocol view name %s' % protocolViewName)
        time.sleep(10)
        for counter in range(1, timeout + 1):
            stats = self.statObj.getStats(viewName=protocolViewName,
                                          displayStats=False)
            totalPorts = len(stats.keys())
            self.ixnObj.logInfo('ProtocolName: {0}'.format(protocolViewName))
            for session in stats.keys():
                if re.search('BFD', protocolViewName, re.I) or re.search(
                        'RIPng', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Routers Running'])
                    totalSessions = int(stats[session]['Routers Configured'])
                elif re.search('BGP', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Sess. Up'])
                    totalSessions = int(stats[session]['Sess. Configured'])
                elif re.search('CFM', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Bridges Running'])
                    totalSessions = int(stats[session]['Bridges Configured'])
                elif re.search('EIGRP', protocolViewName, re.I) or \
                        re.search('ELMI', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['IPv4 Routers Running'])
                    totalSessions = int(
                        stats[session]['IPv4 Routers Configured'])
                elif re.search('IGMP', protocolViewName, re.I) or re.search(
                        'MLD', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Host Total Frames Tx'])
                    totalSessions = int(stats[session]['Host Total Frames Rx'])
                elif re.search('ISIS', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['L2 Sess. Up'])
                    totalSessions = int(stats[session]['L2 Sess. Configured'])
                elif re.search('LACP', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['LAG Member Ports UP'])
                    totalSessions = int(
                        stats[session]['Total LAG Member Ports'])
                elif re.search('LDP', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Targeted Sess. Up'])
                    totalSessions = int(
                        stats[session]['Targeted Sess. Configured'])
                elif re.search('OAM', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Links Running'])
                    totalSessions = int(stats[session]['Links Configured'])
                elif re.search('LISP', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['MS/MR Running'])
                    totalSessions = int(stats[session]['MS/MR Configured'])
                elif re.search('MPLSTP', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['CCCV Up'])
                    totalSessions = int(stats[session]['CCCV Configured'])
                elif re.search('MPLSOAM', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['BFD Up-Sessions'])
                    totalSessions = int(stats[session]['BFD Session Count'])
                elif re.search('OpenFlow', protocolViewName, re.I):
                    sessionsUp = int(
                        stats[session]['OF Channel Configured Up'])
                    totalSessions = int(
                        stats[session]['OF Channel Configured'])
                elif re.search('OSPF', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Full Nbrs.'])
                    totalSessions = int(stats[session]['Sess. Configured'])
                elif re.search('PIM', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Rtrs. Running'])
                    totalSessions = int(stats[session]['Rtrs. Configured'])
                elif re.search('RIP', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Request Packet Tx'])
                    totalSessions = int(stats[session]['Routers Configured'])
                elif re.search('RSVP', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Ingress LSPs Up'])
                    totalSessions = int(
                        stats[session]['Ingress LSPs Configured'])
                elif re.search('STP', protocolViewName, re.I):
                    sessionsUp = int(stats[session]['Forwarding State Count'])
                    totalSessions = int(
                        stats[session]['Discarding State Count'])
                totalExpectedSessionsUp = totalSessions

                if totalExpectedSessionsUp != 0:
                    self.ixnObj.logInfo(
                        '\n\tPortName: {0}\n\t   TotalSessionsUp: {1}\n\t   '
                        'ExpectedTotalSessionsup: {2}'.format(
                            stats[session]['Port Name'], sessionsUp,
                            totalExpectedSessionsUp),
                        timestamp=False)
                    if counter < timeout and sessionsUp != totalExpectedSessionsUp:
                        self.ixnObj.logInfo(
                            '\t   Protocol Session is still down',
                            timestamp=False)

                    if counter < timeout and sessionsUp == totalExpectedSessionsUp:
                        totalPortsUpFlag += 1
                        if totalPortsUpFlag == totalPorts:
                            self.ixnObj.logInfo(
                                'All protocol sessions are up!')
                            return

            if counter == timeout and sessionsUp != totalExpectedSessionsUp:
                raise IxNetRestApiException(
                    'Protocol Sessions failed to come up')

            self.ixnObj.logInfo('\n\tWait {0}/{1} seconds\n'.format(
                counter, timeout),
                                timestamp=False)
            time.sleep(1)

    def verifyAllConfiguredProtocolSessions(self, duration):
        """
        Description
            verify all configured protocol sessions are UP or not

        Parameters
            duration: <int>: duration to wait for the protocol sessions to UP

        Examples
            verifyAllConfiguredProtocolSessions(duration=120)
            verifyAllConfiguredProtocolSessions(120)
        """
        confifuredProtocols = self.getConfiguredProtocols()
        if not confifuredProtocols:
            raise IxNetRestApiException(
                'No protocols Running or Configured or Enabled')

        for protocol in confifuredProtocols:
            if protocol in [
                    'Bfd', 'Bgp', 'Cfm', 'Eigrp', 'Elmi', 'Igmp', 'Isis',
                    'Lacp', 'Ldp', 'Lisp', 'Mld', 'MplsTp', 'MplsOam', 'Ospf',
                    'Rip', 'Rsvp', 'Stp'
            ]:
                protocolViewName = protocol.upper() + 'Aggregated Statistics'
            elif re.search('LinkOam', protocol, re.I):
                protocolViewName = 'OAM Aggregated Statistics'
            elif re.search('openFlow', protocol, re.I):
                protocolViewName = 'OpenFlow Switch Aggregated Statistics'
            elif re.search('OspfV3', protocol, re.I):
                protocolViewName = 'OSPFv3 Aggregated Statistics'
            elif re.search('Pim', protocol, re.I):
                protocolViewName = 'PIMSM Aggregated Statistics'
            elif re.search('Ripng', protocol, re.I):
                protocolViewName = 'RIPng Aggregated Statistics'
            else:
                raise IxNetRestApiException('No viewName defined')
            self.verifyProtocolSessionsUp(protocolViewName=protocolViewName,
                                          timeout=duration)