From 81e05b004841328c5be165164d4965734b01bf50 Mon Sep 17 00:00:00 2001 From: srsettur Date: Thu, 17 Feb 2022 15:58:59 +0530 Subject: [PATCH 1/7] modified: IxNetRestApi.py modified: IxNetRestApiPortMgmt.py modified: IxNetRestApiProtocol.py modified: IxNetRestApiTraffic.py --- RestApi/Python/Modules/IxNetRestApi.py | 84 ++++++------------- .../Python/Modules/IxNetRestApiPortMgmt.py | 4 + .../Python/Modules/IxNetRestApiProtocol.py | 4 + RestApi/Python/Modules/IxNetRestApiTraffic.py | 4 +- 4 files changed, 37 insertions(+), 59 deletions(-) diff --git a/RestApi/Python/Modules/IxNetRestApi.py b/RestApi/Python/Modules/IxNetRestApi.py index 8b90bd91..eae7e530 100644 --- a/RestApi/Python/Modules/IxNetRestApi.py +++ b/RestApi/Python/Modules/IxNetRestApi.py @@ -15,7 +15,10 @@ import datetime import platform import time -from ixnetwork_restpy import TestPlatform +import re +import traceback +# from ixnetwork_restpy import TestPlatform +from ixnetwork_restpy import SessionAssistant class IxNetRestApiException(Exception): @@ -51,7 +54,7 @@ def __init__(self, apiServerIp=None, serverIpPort=None, includeDebugTraceback=True, sessionId=None, httpsSecured=None, apiKey=None, generateLogFile=True, robotFrameworkStdout=False, - linuxApiServerTimeout=120): + linuxApiServerTimeout=120, traceLevel='all'): """ Description Initializing default parameters and making a connection to the API server @@ -128,7 +131,8 @@ def __init__(self, apiServerIp=None, serverIpPort=None, self.password = password self.apiKey = apiKey self.verifySslCert = verifySslCert - self.linuxApiServerIp = apiServerIp + self.apiServerIp = apiServerIp + self.deleteSessionAfterTest = deleteSessionAfterTest self.manageSessionMode = manageSessionMode self.apiServerPort = serverIpPort self.webQuickTest = webQuickTest @@ -138,6 +142,14 @@ def __init__(self, apiServerIp=None, serverIpPort=None, self.linuxApiServerTimeout = linuxApiServerTimeout self.sessionId = sessionId + logleveldict = {'none':SessionAssistant.LOGLEVEL_NONE, + 'info':SessionAssistant.LOGLEVEL_INFO, + 'warning':SessionAssistant.LOGLEVEL_WARNING, + 'request':SessionAssistant.LOGLEVEL_REQUEST, + 'request_response':SessionAssistant.LOGLEVEL_REQUEST_RESPONSE, + 'all':SessionAssistant.LOGLEVEL_ALL} + self.logLevel = logleveldict[traceLevel] + # Make Robot print to stdout if self.robotFrameworkStdout: from robot.libraries.BuiltIn import _Misc @@ -152,60 +164,18 @@ def __init__(self, apiServerIp=None, serverIpPort=None, if type(generateLogFile) != bool: self.restLogFile = generateLogFile - - if self.serverOs == 'windows': - if self.apiServerPort is None: - self.apiServerPort = 11009 - else: - self.apiServerPort = serverIpPort - self.testPlatform = TestPlatform(ip_address=self.linuxApiServerIp, - rest_port=self.apiServerPort, - platform=self.serverOs, - verify_cert=verifySslCert, - log_file_name=self.restLogFile) - self.session = self.testPlatform.Sessions.add() - self.sessionId = self.session.Id - self.ixNetwork = self.session.Ixnetwork - - if self.serverOs == 'windowsConnectionMgr': - if self.sessionId: - self.testPlatform = TestPlatform( - ip_address=self.linuxApiServerIp, - rest_port=self.apiServerPort, - platform=self.serverOs, - verify_cert=verifySslCert, - log_file_name=self.restLogFile) - - if self.serverOs == 'linux': - if self.apiServerPort is None: - self.apiServerPort = 443 - - if username is None or password is None: - self.username = 'admin' - self.password = 'admin' - - self.testPlatform = TestPlatform(ip_address=self.linuxApiServerIp, - rest_port=self.apiServerPort, - platform=self.serverOs, - verify_cert=verifySslCert, - log_file_name=self.restLogFile) - self.testPlatform.Authenticate(self.username, self.password) - - if apiKey is not None and sessionId is None: - raise IxNetRestApiException('Providing an apiKey must also provide a sessionId.') - # Connect to an existing session on the Linux API server - if apiKey and sessionId: - self.session = self.testPlatform.Sessions.find(Id=sessionId) - self.ixNetwork = self.session.Ixnetwork - - if apiKey is None and sessionId: - self.session = self.testPlatform.Sessions.find(Id=sessionId) - self.ixNetwork = self.session.Ixnetwork - - if apiKey is None and sessionId is None: - self.session = self.testPlatform.Sessions.add() - self.sessionId = self.session.Id - self.ixNetwork = self.session.Ixnetwork + + try: + session = SessionAssistant(IpAddress=self.apiServerIp, UserName=self.username, Password=self.password, + RestPort=serverIpPort, ApiKey=self.apiKey, LogFilename=self.restLogFile, + SessionId=self.sessionId, LogLevel=self.logLevel, ClearConfig=True) + self.ixNetwork = session.Ixnetwork + self.testPlatform = session.TestPlatform + self.sessionId = session.Ixnetwork.parent.Id + except (IxNetRestApiException, Exception, KeyboardInterrupt) as errMsg: + if bool(re.search('ConnectionError', traceback.format_exc())): + print('\n%s' % traceback.format_exc()) + raise IxNetRestApiException('Connection Error') if licenseServerIp or licenseMode or licenseTier: self.configLicenseServerDetails( diff --git a/RestApi/Python/Modules/IxNetRestApiPortMgmt.py b/RestApi/Python/Modules/IxNetRestApiPortMgmt.py index 48e54725..8b6b7799 100644 --- a/RestApi/Python/Modules/IxNetRestApiPortMgmt.py +++ b/RestApi/Python/Modules/IxNetRestApiPortMgmt.py @@ -248,6 +248,10 @@ def getVports(self, portList): port = [chassisIp, cardNum, portNum] if port in portList: vportList.append(vport) + + if not vportList: + raise Exception("Unable to find vport for the given portList {} ".format(portList)) + return vportList def getPhysicalPortsFromCreatedVports(self): diff --git a/RestApi/Python/Modules/IxNetRestApiProtocol.py b/RestApi/Python/Modules/IxNetRestApiProtocol.py index 8db7b8eb..e921daa8 100644 --- a/RestApi/Python/Modules/IxNetRestApiProtocol.py +++ b/RestApi/Python/Modules/IxNetRestApiProtocol.py @@ -589,6 +589,10 @@ def configDhcpClientV4(self, obj, **kwargs): if 'multiplier' in kwargs: del kwargs['multiplier'] + if 'useRapdCommit' in kwargs: + kwargs['useRapidCommit'] = kwargs['useRapdCommit'] + del kwargs['useRapdCommit'] + for key, value in kwargs.items(): key = key[0:1].capitalize() + key[1:] multivalueObj = getattr(dhcpObj, key) diff --git a/RestApi/Python/Modules/IxNetRestApiTraffic.py b/RestApi/Python/Modules/IxNetRestApiTraffic.py index 35afef64..579dd602 100644 --- a/RestApi/Python/Modules/IxNetRestApiTraffic.py +++ b/RestApi/Python/Modules/IxNetRestApiTraffic.py @@ -837,13 +837,13 @@ def configPacketHeaderField(self, stackIdObj, fieldName, data): raise IxNetRestApiException('Failed to located your provided fieldName:', fieldName) self.ixnObj.logInfo('configPacketHeaderFieldId: fieldIdObj: %s' % stackIdObj.href + '/field/' + str(fieldId), timestamp=False) + if 'auto' in data: + fieldObj.Auto = data['auto'] if data.get('valueType'): fieldObj.ValueType = data.get('valueType') else: fieldObj.ValueType = 'singleValue' data['valueType'] = 'singleValue' - if data.get('auto'): - fieldObj.Auto = data['auto'] if data.get('valueType') == 'singleValue': fieldObj.SingleValue = data['fieldValue'] if data.get('fieldValue') else 0 elif data.get('valueType') in ['increment', 'decrement']: From 41417de46a156ce6dd6f343d0200788f2e3db26f Mon Sep 17 00:00:00 2001 From: srsettur Date: Thu, 17 Feb 2022 16:10:23 +0530 Subject: [PATCH 2/7] modified: IxNetRestApiTraffic.py --- RestApi/Python/Modules/IxNetRestApiTraffic.py | 35 ------------------- 1 file changed, 35 deletions(-) diff --git a/RestApi/Python/Modules/IxNetRestApiTraffic.py b/RestApi/Python/Modules/IxNetRestApiTraffic.py index 579dd602..f065d935 100644 --- a/RestApi/Python/Modules/IxNetRestApiTraffic.py +++ b/RestApi/Python/Modules/IxNetRestApiTraffic.py @@ -229,42 +229,7 @@ def configTrafficItem(self, mode=None, obj=None, trafficItem=None, endpoints=Non self.configConfigElements(trafficItemObj.HighLevelStream.find(), eachHighLevelStream) pass - # if configElements != "" and trafficItemObj is not None: - # configElementObj = trafficItemObj.ConfigElement.find() - # - # for configEle in configElements: - # if 'transmissionType' in configEle: - # configElementObj.TransmissionControl.Type = configEle['transmissionType'] - # del configEle['transmissionType'] - # - # if 'frameCount' in configEle: - # configElementObj.TransmissionControl.FrameCount = configEle['frameCount'] - # del configEle['frameCount'] - # - # if 'frameRate' in configEle: - # configElementObj.FrameRate.Rate = configEle['frameRate'] - # del configEle['frameRate'] - # - # if 'frameRateType' in configEle: - # configElementObj.FrameRate.Type = configEle['frameRateType'] - # del configEle['frameRateType'] - # - # if 'frameSize' in configEle: - # configElementObj.FrameSize.FixedSize = configEle['frameSize'] - # del configEle['frameSize'] - # - # if 'portDistribution' in configEle: - # configElementObj.FrameRateDistribution.PortDistribution \ - # = configEle['portDistribution'] - # del configEle['portDistribution'] - # - # if 'streamDistribution' in configEle: - # configElementObj.FrameRateDistribution.StreamDistribution \ - # = configEle['streamDistribution'] - # del configEle['streamDistribution'] - if mode == 'modify': - if trafficItem is not None: trafficItemObj = obj if 'trackBy' in trafficItem: From f6ce6830d0331743d4af751496862ab83b770707 Mon Sep 17 00:00:00 2001 From: srsettur Date: Fri, 25 Feb 2022 20:36:04 +0530 Subject: [PATCH 3/7] modified: RestApi/Python/Modules/IxNetRestApiFileMgmt.py --- RestApi/Python/Modules/IxNetRestApiFileMgmt.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/RestApi/Python/Modules/IxNetRestApiFileMgmt.py b/RestApi/Python/Modules/IxNetRestApiFileMgmt.py index 41ccef76..dc3daa9b 100644 --- a/RestApi/Python/Modules/IxNetRestApiFileMgmt.py +++ b/RestApi/Python/Modules/IxNetRestApiFileMgmt.py @@ -1,6 +1,8 @@ import re import os import json +import time + from IxNetRestApi import IxNetRestApiException from ixnetwork_restpy.files import Files import datetime @@ -28,7 +30,7 @@ def setMainObject(self, mainObject): """ self.ixnObj = mainObject - def loadConfigFile(self, configFile, localFile=True): + def loadConfigFile(self, configFile, localFile=True, portList=None): """ Description Load a saved config file. @@ -48,6 +50,16 @@ def loadConfigFile(self, configFile, localFile=True): self.ixnObj.logInfo("Loading Config File {}".format(configFile)) try: self.ixNetwork.LoadConfig(Files(configFile, local_file=localFile)) + if portList is not None: + vportList = self.ixNetwork.Vport.find() + chassisIp = portList[0][0] + connectedChassis = self.ixNetwork.AvailableHardware.Chassis.find() + if chassisIp != connectedChassis.Hostname: + self.ixNetwork.AvailableHardware.Chassis.find().remove() + self.ixNetwork.AvailableHardware.Chassis.add(Hostname=chassisIp) + for port, vport in zip(portList, vportList): + vport.update(Location=';'.join(port)) + except Exception as err: self.ixnObj.logInfo("Error with Load config {}".format(err)) raise Exception("Failed to load config file {} ".format(configFile)) From c36b46f81dc90329552837f2cf5a3955fa909920 Mon Sep 17 00:00:00 2001 From: srsettur Date: Fri, 25 Feb 2022 20:51:20 +0530 Subject: [PATCH 4/7] modified: RestApi/Python/Modules/IxNetRestApiFileMgmt.py --- RestApi/Python/Modules/IxNetRestApiFileMgmt.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/RestApi/Python/Modules/IxNetRestApiFileMgmt.py b/RestApi/Python/Modules/IxNetRestApiFileMgmt.py index dc3daa9b..afeb5426 100644 --- a/RestApi/Python/Modules/IxNetRestApiFileMgmt.py +++ b/RestApi/Python/Modules/IxNetRestApiFileMgmt.py @@ -45,6 +45,13 @@ def loadConfigFile(self, configFile, localFile=True, portList=None): localFile: (bool): For Windows API server and Connection Mgr running on a Windows server only. Set to False if the config file is in the Windows API server filesystem. + + portList: (list): This takes the list of ports to be connected to once load config is performed + If the value is None(default value), then chassis, slot and port under configuration file are retained. + If not None, chassis, slot and port configurations loaded using configuration file will get replaced with + the given parameters + Example: [['10.39.64.197', '1', '1'], + ['10.39.64.197', '1', '2']] """ self.ixnObj.logInfo("Loading Config File {}".format(configFile)) From c87d3731c04d7d912cb3d9c10b5324d53de1fd2d Mon Sep 17 00:00:00 2001 From: settur1409 Date: Tue, 17 May 2022 09:00:47 +0530 Subject: [PATCH 5/7] modified: RestApi/Python/Modules/IxNetRestApi.py modified: RestApi/Python/Modules/IxNetRestApiTraffic.py --- RestApi/Python/Modules/IxNetRestApi.py | 5 +++-- RestApi/Python/Modules/IxNetRestApiTraffic.py | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/RestApi/Python/Modules/IxNetRestApi.py b/RestApi/Python/Modules/IxNetRestApi.py index eae7e530..36cd85c5 100644 --- a/RestApi/Python/Modules/IxNetRestApi.py +++ b/RestApi/Python/Modules/IxNetRestApi.py @@ -54,7 +54,7 @@ def __init__(self, apiServerIp=None, serverIpPort=None, includeDebugTraceback=True, sessionId=None, httpsSecured=None, apiKey=None, generateLogFile=True, robotFrameworkStdout=False, - linuxApiServerTimeout=120, traceLevel='all'): + linuxApiServerTimeout=120, traceLevel='all', clearConfig=False): """ Description Initializing default parameters and making a connection to the API server @@ -141,6 +141,7 @@ def __init__(self, apiServerIp=None, serverIpPort=None, self.linuxChassisIp = linuxChassisIp self.linuxApiServerTimeout = linuxApiServerTimeout self.sessionId = sessionId + self.clearConfig = clearConfig logleveldict = {'none':SessionAssistant.LOGLEVEL_NONE, 'info':SessionAssistant.LOGLEVEL_INFO, @@ -168,7 +169,7 @@ def __init__(self, apiServerIp=None, serverIpPort=None, try: session = SessionAssistant(IpAddress=self.apiServerIp, UserName=self.username, Password=self.password, RestPort=serverIpPort, ApiKey=self.apiKey, LogFilename=self.restLogFile, - SessionId=self.sessionId, LogLevel=self.logLevel, ClearConfig=True) + SessionId=self.sessionId, LogLevel=self.logLevel, ClearConfig=self.clearConfig) self.ixNetwork = session.Ixnetwork self.testPlatform = session.TestPlatform self.sessionId = session.Ixnetwork.parent.Id diff --git a/RestApi/Python/Modules/IxNetRestApiTraffic.py b/RestApi/Python/Modules/IxNetRestApiTraffic.py index f065d935..76a908d2 100644 --- a/RestApi/Python/Modules/IxNetRestApiTraffic.py +++ b/RestApi/Python/Modules/IxNetRestApiTraffic.py @@ -188,6 +188,13 @@ def configTrafficItem(self, mode=None, obj=None, trafficItem=None, endpoints=Non trackBy = trafficItem['trackBy'] del trafficItem['trackBy'] + if 'srcDestMesh' in trafficItem: + if trafficItem['srcDestMesh'] not in ['fullMesh', 'manyToMany', 'none', 'oneToOne']: + trafficItem['srcDestMesh'] = trafficItem['srcDestMesh'].replace("-", "") + for element in ['fullMesh', 'manyToMany', 'none', 'oneToOne']: + if element.lower() == trafficItem['srcDestMesh'].lower(): + trafficItem['srcDestMesh'] = element + for item, value in trafficItem.items(): itemObj = item[0:1].capitalize() + item[1:] setattr(trafficItemObj, itemObj, value) @@ -235,6 +242,14 @@ def configTrafficItem(self, mode=None, obj=None, trafficItem=None, endpoints=Non if 'trackBy' in trafficItem: trackBy = trafficItem['trackBy'] del trafficItem['trackBy'] + + if 'srcDestMesh' in trafficItem: + if trafficItem['srcDestMesh'] not in ['fullMesh', 'manyToMany', 'none', 'oneToOne']: + trafficItem['srcDestMesh'] = trafficItem['srcDestMesh'].replace("-", "") + for element in['fullMesh', 'manyToMany', 'none', 'oneToOne']: + if element.lower() == trafficItem['srcDestMesh'].lower(): + trafficItem['srcDestMesh'] = element + for item, value in trafficItem.items(): itemObj = item[0:1].capitalize() + item[1:] setattr(trafficItemObj, itemObj, trafficItem[item]) From c0689af24a336ad7616e59f2fccc101a3cb0b7c6 Mon Sep 17 00:00:00 2001 From: srsettur Date: Tue, 13 Sep 2022 20:08:39 +0530 Subject: [PATCH 6/7] modified: IxNetRestApiPacketCapture.py modified: IxNetRestApiPortMgmt.py --- RestApi/Python/Modules/IxNetRestApiPacketCapture.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RestApi/Python/Modules/IxNetRestApiPacketCapture.py b/RestApi/Python/Modules/IxNetRestApiPacketCapture.py index a1a5d4b2..64819ebc 100644 --- a/RestApi/Python/Modules/IxNetRestApiPacketCapture.py +++ b/RestApi/Python/Modules/IxNetRestApiPacketCapture.py @@ -141,8 +141,8 @@ def packetCaptureGetCurrentPackets(self, getUpToPacketNumber=20, capturePacketsT 'options: enableDataPlane|enableControlPlane') vport = self.portMgmtObj.getVports([self.captureRxPort])[0] - totalDataCapturedPackets = vport.Capture.DataPacketCounter - totalControlCapturedPackets = vport.Capture.ControlPacketCounter + totalDataCapturedPackets = vport.Capture.DataCapturedPacketCounter + totalControlCapturedPackets = vport.Capture.ControlCapturedPacketCounter if type(totalDataCapturedPackets) != int: totalDataCapturedPackets = 0 From eb07d0373234ebe4aeb07650328357e1347938e1 Mon Sep 17 00:00:00 2001 From: srsettur Date: Mon, 21 Nov 2022 16:08:35 +0530 Subject: [PATCH 7/7] updated portMgmt --- .../Python/Modules/IxNetRestApiPortMgmt.py | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/RestApi/Python/Modules/IxNetRestApiPortMgmt.py b/RestApi/Python/Modules/IxNetRestApiPortMgmt.py index 8b6b7799..7d52f8bc 100644 --- a/RestApi/Python/Modules/IxNetRestApiPortMgmt.py +++ b/RestApi/Python/Modules/IxNetRestApiPortMgmt.py @@ -237,6 +237,19 @@ def getVports(self, portList): vportList = [] self.ixnObj.logInfo("get vport objects for portList {}".format(portList)) + portConnected = False + if len(self.ixnObj.ixNetwork.Vport.find()) == 0: + # this means no ports are configured + return + else: + for vport in self.ixnObj.ixNetwork.Vport.find(): + if vport.IsConnected == True: + portConnected = True + break + + if portConnected == False: + return + for vport in self.ixnObj.ixNetwork.Vport.find(): assignedTo = vport.AssignedTo if assignedTo == '': @@ -402,9 +415,13 @@ def releasePorts(self, portList): [[ixChassisIp, str(cardNum), str(portNum)], [], [] ...] """ self.ixnObj.logInfo('Release selected ports {} from configuration'.format(portList)) + # vportConfiguredList = [vport for vport in self.ixNetwork.Vport.find()] + # if vportConfiguredList != portList[0]: + # return vportList = self.getVports(portList) - for vport in vportList: - vport.ReleasePort() + if vportList != None: + for vport in vportList: + vport.ReleasePort() def resetPortCpu(self, vportList=None, portList=None, timeout=90): """