# 2015.03.12 10:28:21 PDT
#Embedded file name: ../tests/IntentPerfNextBM/IntentPerfNextBM.py


class IntentPerfNextBM:

    def __init__(self):
        self.default = ''

    def CASE1(self, main):
        """
        ONOS startup sequence
        """
        global clusterCount
        global timeToPost
        global runNum
        import time
        
        clusterCount = 1
        timeToPost = time.strftime('%Y-%m-%d %H:%M:%S')
        runNum = time.strftime('%d%H%M%S')
        cellName = main.params['ENV']['cellName']
        gitPull = main.params['GIT']['autoPull']
        checkoutBranch = main.params['GIT']['checkout']
        intentFilePath = main.params['DB']['intentFilePath']
        cellStr = main.params[ 'TEST' ][ 'cellStr' ]
        ONOSIp = []
        
        for i in range(1, 8):
            ONOSIp.append(main.params['CTRL']['ip' + str(i)])
            main.ONOSbench.onosUninstall(nodeIp=ONOSIp[i - 1])

        MN1Ip = main.params['MN']['ip1']
        BENCHIp = main.params['BENCH']['ip']
        main.case('Setting up test environment')
        main.step('Clearing previous DB log file')
        fIntentLog = open(intentFilePath, 'w')
        fIntentLog.write('')
        fIntentLog.close()
        main.step('Starting mininet topology')
        main.Mininet1.startNet()
        main.step('Creating cell file')
        cellFileResult = main.ONOSbench.createCellFile(
                BENCHIp, cellName, MN1Ip, cellStr, ONOSIp[0])
        main.step('Applying cell file to environment')
        cellApplyResult = main.ONOSbench.setCell(cellName)
        verifyCellResult = main.ONOSbench.verifyCell()
        main.step('Removing raft logs')
        main.ONOSbench.onosRemoveRaftLogs()
        main.step('Git checkout and pull ' + checkoutBranch)
        
        if gitPull == 'on':
            checkoutResult = main.ONOSbench.gitCheckout(checkoutBranch)
            pullResult = main.ONOSbench.gitPull()
            main.step('Using onos-build to compile ONOS')
            buildResult = main.ONOSbench.onosBuild()
        else:
            checkoutResult = main.TRUE
            pullResult = main.TRUE
            buildResult = main.TRUE
            main.log.info('Git pull skipped by configuration')
        
        main.log.report('Commit information - ')
        main.ONOSbench.getVersion(report=True)
        main.step('Creating ONOS package')
        packageResult = main.ONOSbench.onosPackage()
        main.step('Installing ONOS package')
        install1Result = main.ONOSbench.onosInstall(node=ONOSIp[0])
        main.step('Set cell for ONOScli env')
        main.ONOS1cli.setCell(cellName)
        time.sleep(5)
        main.step('Start onos cli')
        cli1 = main.ONOS1cli.startOnosCli(ONOSIp[0])
        utilities.assert_equals(expect=main.TRUE, 
                actual=cellFileResult and cellApplyResult and\
                        verifyCellResult and checkoutResult and\
                        pullResult and buildResult and install1Result, 
                        onpass='ONOS started successfully',
                        onfail='Failed to start ONOS')

    def CASE2(self, main):
        """
        Batch intent install
        
        Supports scale-out scenarios and increasing
        number of intents within each iteration
        """
        import time
        import json
        import requests
        import os
        import numpy
        ONOS1Ip = main.params['CTRL']['ip1']
        ONOS2Ip = main.params['CTRL']['ip2']
        ONOS3Ip = main.params['CTRL']['ip3']
        ONOS4Ip = main.params['CTRL']['ip4']
        ONOS5Ip = main.params['CTRL']['ip5']
        ONOS6Ip = main.params['CTRL']['ip6']
        ONOS7Ip = main.params['CTRL']['ip7']
        assertion = main.TRUE
        ONOSIpList = []
        
        for i in range(1, 8):
            ONOSIpList.append(main.params['CTRL']['ip' + str(i)])

        ONOSUser = main.params['CTRL']['user']
        defaultSwPort = main.params['CTRL']['port1']
        batchIntentSize = int(main.params['TEST']['batchIntentSize'])
        batchThreshMin = int(main.params['TEST']['batchThresholdMin'])
        batchThreshMax = int(main.params['TEST']['batchThresholdMax'])
        numIter = main.params['TEST']['numIter']
        numIgnore = int(main.params['TEST']['numIgnore'])
        numSwitch = int(main.params['TEST']['numSwitch'])
        nThread = main.params['TEST']['numMult']
        intentFilePath = main.params['DB']['intentFilePath']
        
        if clusterCount == 1:
            for i in range(1, numSwitch + 1):
                main.Mininet1.assignSwController(sw=str(i),
                        ip1=ONOS1Ip, port1=defaultSwPort)
        if clusterCount == 3:
            for i in range(1, 3):
                main.Mininet1.assignSwController(sw=str(i),
                        ip1=ONOS1Ip, port1=defaultSwPort)
            for i in range(3, 6):
                main.Mininet1.assignSwController(sw=str(i),
                        ip1=ONOS2Ip, port1=defaultSwPort)
            for i in range(6, 9):
                main.Mininet1.assignSwController(sw=str(i),
                        ip1=ONOS3Ip, port1=defaultSwPort)
        if clusterCount == 5:
            main.Mininet1.assignSwController(sw='1',
                    ip1=ONOS1Ip, port1=defaultSwPort)
            main.Mininet1.assignSwController(sw='2',
                    ip1=ONOS2Ip, port1=defaultSwPort)
            for i in range(3, 6):
                main.Mininet1.assignSwController(sw=str(i),
                        ip1=ONOS3Ip, port1=defaultSwPort)
            main.Mininet1.assignSwController(sw='6',
                    ip1=ONOS4Ip, port1=defaultSwPort)
            main.Mininet1.assignSwController(sw='7', 
                    ip1=ONOS5Ip, port1=defaultSwPort)
            main.Mininet1.assignSwController(sw='8',
                    ip1=ONOS5Ip, port1=defaultSwPort)
        if clusterCount == 7:
            for i in range(1, 9):
                if i < 8:
                    main.Mininet1.assignSwController(sw=str(i),
                            ip1=ONOSIpList[i - 1], port1=defaultSwPort)
                elif i >= 8:
                    main.Mininet1.assignSwController(sw=str(i),
                            ip1=ONOSIpList[6], port1=defaultSwPort)

        time.sleep(20)
        
        deviceIdList = []
        batchInstallLat = []
        batchWithdrawLat = []

        main.log.report('Batch intent installation test of ' +
                str(batchIntentSize) + ' intent(s)')
        main.log.info('Getting list of available devices')
        
        jsonStr = main.ONOS1cli.devices()
        jsonObj = json.loads(jsonStr)
        for device in jsonObj:
            deviceIdList.append(device['id'])

        if not jsonObj:
            main.log.warn( "Devices not found, check topology" )
            
        sleepTime = 10
        baseDir = '/tmp/'
        for batch in range(0, 5):
            maxInstallLat = []
            maxWithdrawLat = []
            maxSingleInstallLat = []
            maxSingleWithdrawLat = []
            for i in range(0, int(numIter)):
                main.log.info('Pushing ' + str(
                    int(batchIntentSize) * int(nThread)) +
                    ' intents. Iteration ' + str(i))
                saveDir = baseDir + 'batch_intent_1.txt'
                main.ONOSbench.pushTestIntentsShell(deviceIdList[0] +
                        '/2', deviceIdList[7] + '/2', batchIntentSize,
                        saveDir, ONOSIpList[0], numMult=nThread)
                time.sleep(sleepTime)
                intent = ''
                counter = 300
                while len(intent) > 0 and counter > 0:
                    main.ONOS1cli.handle.sendline('intents | wc -l')
                    main.ONOS1cli.handle.expect('intents | wc -l')
                    main.ONOS1cli.handle.expect('onos>')
                    intentTemp = main.ONOS1cli.handle.before()
                    intent = main.ONOS1cli.intents()
                    intent = json.loads(intent)
                    counter = counter - 1
                    time.sleep(1)

                time.sleep(5)
                saveDir = baseDir + 'batch_intent_1.txt'
                with open(saveDir) as fOnos:
                    lineCount = 0
                    for line in fOnos:
                        line_temp = ''
                        main.log.info('Line read: ' + str(line))
                        line_temp = line[1:]
                        line_temp = line_temp.split(': ')
                        if ' ' in str(line_temp):
                            result = line_temp[1].split(' ')[0]
                        else:
                            main.log.warn('Empty line read')
                            result = 0
                        if lineCount == 0:
                            if 'Failure' in str(line):
                                main.log.warn('Intent installation failed')
                                result = 'NA'
                            else:
                                main.log.info('Install result: ' + result)
                                batchInstallLat.append(int(result))
                            installResult = result
                        elif lineCount == 1:
                            if 'Failure' in str(line):
                                main.log.warn('Intent withdraw failed')
                                result = 'NA'
                            else:
                                main.log.info('Withdraw result: ' + result)
                                batchWithdrawLat.append(int(result))
                            withdrawResult = result
                        else:
                            main.log.warn('Invalid results')
                            installResult = 'NA'
                            withdrawResult = 'NA'
                        lineCount += 1

                main.log.info('Batch install latency with' +
                        str(batchIntentSize) + 'intents: ' +
                        str(installResult) + ' ms')
                main.log.info('Batch withdraw latency with' +
                        str(batchIntentSize) + 'intents: ' +
                        str(withdrawResult) + ' ms')
                main.log.info('Single intent install latency with' +
                        str(batchIntentSize) + 'intents: ' +
                        str(float(installResult) / int(batchIntentSize))+' ms')
                main.log.info('Single intent withdraw latency with' +
                        str(batchIntentSize) + 'intents: ' +
                        str(float(withdrawResult)/ int(batchIntentSize))+' ms')
                if len(batchInstallLat) > 0 and int(i) > numIgnore:
                    maxInstallLat.append(max(batchInstallLat))
                    maxSingleInstallLat.append(
                            max(batchInstallLat) / int(batchIntentSize))
                elif len(batchInstallLat) == 0:
                    sleepTime += 30
                if len(batchWithdrawLat) > 0 and int(i) > numIgnore:
                    maxWithdrawLat.append(max(batchWithdrawLat))
                    maxSingleWithdrawLat.append(
                            max(batchWithdrawLat) / int(batchIntentSize))
                batchInstallLat = []
                batchWithdrawLat = []
                time.sleep(5)

            if maxInstallLat:
                avgInstallLat = str(round(
                    numpy.average(maxInstallLat), 2))
                stdInstallLat = str(round(
                    numpy.std(maxInstallLat), 2))
                avgSingleInstallLat = str(round(
                    numpy.average(maxSingleInstallLat), 3))
                stdSingleInstallLat = str(round(
                    numpy.std(maxSingleInstallLat), 3))
            else:
                avgInstallLat = 'NA'
                stdInstallLat = 'NA'
                main.log.report('Batch installation failed')
                assertion = main.FALSE
            if maxWithdrawLat:
                avgWithdrawLat = str(round(
                    numpy.average(maxWithdrawLat), 2))
                stdWithdrawLat = str(round(
                    numpy.std(maxWithdrawLat), 2))
                avgSingleWithdrawLat = str(round(
                    numpy.average(maxSingleWithdrawLat), 3))
                stdSingleWithdrawLat = str(round(
                    numpy.std(maxSingleWithdrawLat), 3))
            else:
                avgWithdrawLat = 'NA'
                stdWithdrawLat = 'NA'
                main.log.report('Batch withdraw failed')
                assertion = main.FALSE
            
            main.log.report('Avg of batch installation latency ' +
                    'of size ' + str(batchIntentSize) + ': ' +
                    str(avgInstallLat) + ' ms')
            main.log.report('Std Deviation of batch installation latency ' +
                    ': ' + str(round(numpy.std(maxInstallLat), 2)) + ' ms')
            main.log.report('Avg of batch withdraw latency ' +
                    'of size ' + str(batchIntentSize) + ': ' +
                    str(avgWithdrawLat) + ' ms')
            main.log.report('Std Deviation of batch withdraw latency ' +
                    ': ' + str(round(numpy.std(maxWithdrawLat), 2)) + ' ms')
            
            main.log.report('Avg of batch withdraw latency ' + 'of size ' +
                    str(batchIntentSize) + ': ' + str(avgWithdrawLat) + ' ms')
            main.log.report('Std Deviation of batch withdraw latency ' +
                    ': ' + str(stdWithdrawLat) + ' ms')
            main.log.report('Avg of single withdraw latency ' + 'of size ' +
                    str(batchIntentSize) + ': ' +
                    str(avgSingleWithdrawLat) + ' ms')
            main.log.report('Std Deviation of single withdraw latency ' +
                    ': ' + str(stdSingleWithdrawLat) + ' ms')
            
            dbCmd = "INSERT INTO intents_latency_tests VALUES('" +\
                    timeToPost + "','intents_latency_results'," +\
                    runNum + ',' + str(clusterCount) + ',' +\
                    str(batchIntentSize) + ',' + str(avgInstallLat) +\
                    ',' + str(stdInstallLat) + ',' + str(avgWithdrawLat) +\
                    ',' + str(stdWithdrawLat) + ');'
            
            fResult = open(intentFilePath, 'a')
            if dbCmd:
                fResult.write(dbCmd + '\n')
            fResult.close()
            if batch == 0:
                batchIntentSize = 10
            elif batch == 1:
                batchIntentSize = 100
            elif batch == 2:
                batchIntentSize = 1000
            elif batch == 3:
                batchIntentSize = 1500
            if batch < 4:
                main.log.report('Increasing batch intent size to ' +
                        str(batchIntentSize))

        utilities.assert_equals(expect=main.TRUE, actual=assertion,
                onpass='Batch intent install/withdraw test successful',
                onfail='Batch intent install/withdraw test failed')

    def CASE3(self, main):
        """
        Batch intent reroute latency
        """
        import time
        import json
        import requests
        import os
        import numpy
        
        ONOS1Ip = main.params['CTRL']['ip1']
        ONOS2Ip = main.params['CTRL']['ip2']
        ONOS3Ip = main.params['CTRL']['ip3']
        ONOS4Ip = main.params['CTRL']['ip4']
        ONOS5Ip = main.params['CTRL']['ip5']
        ONOS6Ip = main.params['CTRL']['ip6']
        ONOS7Ip = main.params['CTRL']['ip7']
        
        ONOSIpList = []
        for i in range(1, 8):
            ONOSIpList.append(main.params['CTRL']['ip' + str(i)])

        ONOSUser = main.params['CTRL']['user']
        defaultSwPort = main.params['CTRL']['port1']
        batchIntentSize = main.params['TEST']['batchIntentSize']
        thresholdMin = int(main.params['TEST']['batchThresholdMin'])
        thresholdMax = int(main.params['TEST']['batchThresholdMax'])
        
        intfs = main.params['TEST']['intfs']
        installTime = main.params['JSON']['installedTime']
        numIter = main.params['TEST']['numIter']
        numIgnore = int(main.params['TEST']['numIgnore'])
        numSwitch = int(main.params['TEST']['numSwitch'])
        nThread = main.params['TEST']['numMult']
        
        tsharkPortStatus = main.params[ 'TSHARK' ][ 'ofpPortStatus' ]
        tsharkPortDown = '/tmp/tshark_port_down_reroute.txt'
        
        if clusterCount == 1:
            for i in range(1, numSwitch + 1):
                main.Mininet1.assignSwController(sw=str(i),
                        ip1=ONOS1Ip, port1=defaultSwPort)
        if clusterCount == 3:
            for i in range(1, 3):
                main.Mininet1.assignSwController(sw=str(i),
                        ip1=ONOS1Ip, port1=defaultSwPort)
            for i in range(3, 6):
                main.Mininet1.assignSwController(sw=str(i),
                        ip1=ONOS2Ip, port1=defaultSwPort)
            for i in range(6, 9):
                main.Mininet1.assignSwController(sw=str(i),
                        ip1=ONOS3Ip, port1=defaultSwPort)
        if clusterCount == 5:
            main.Mininet1.assignSwController(sw='1',
                    ip1=ONOS1Ip, port1=defaultSwPort)
            main.Mininet1.assignSwController(sw='2',
                    ip1=ONOS2Ip, port1=defaultSwPort)
            for i in range(3, 6):
                main.Mininet1.assignSwController(sw=str(i),
                        ip1=ONOS3Ip, port1=defaultSwPort)
            main.Mininet1.assignSwController(sw='6', 
                    ip1=ONOS4Ip, port1=defaultSwPort)
            main.Mininet1.assignSwController(sw='7',
                    ip1=ONOS5Ip, port1=defaultSwPort)
            main.Mininet1.assignSwController(sw='8',
                    ip1=ONOS5Ip, port1=defaultSwPort)
        if clusterCount == 7:
            for i in range(1, 9):
                if i < 8:
                    main.Mininet1.assignSwController(sw=str(i),
                            ip1=ONOSIpList[i - 1], port1=defaultSwPort)
                elif i >= 8:
                    main.Mininet1.assignSwController(sw=str(i),
                            ip1=ONOSIpList[6], port1=defaultSwPort)

        main.log.report('Batch intent reroute test ')

        batchIntentRerouteAvgSystem = numpy.zeros((
            clusterCount, int(numIter)))
        batchIntentRerouteStdSystem = numpy.zeros((
            clusterCount, int(numIter)))
        batchIntentRerouteAvgPort = numpy.zeros((
            clusterCount, int(numIter)))
        batchIntentRerouteStdSystem = numpy.zeros((
            clusterCount, int(numIter)))
        
        time.sleep(10)
        
        main.log.info('Getting list of available devices')
        
        deviceIdList = []
        jsonStr = main.ONOS1cli.devices()
        jsonObj = json.loads(jsonStr)
        for device in jsonObj:
            deviceIdList.append(device['id'])
        if not jsonObj:
            main.log.warn('No devices have been discovered')
            assertion = main.FALSE
        
        sleepTime = 10
        
        baseDir = '/tmp/'
        for batch in range(0, 5):
            maxRerouteLatSystem = []
            maxRerouteLatPort = []
            for i in range(0, int(numIter)):
                rerouteLatSystem = []
                rerouteLatPort = []
                main.log.info('Pushing ' + str(
                    int(batchIntentSize) * int(nThread)) +
                    ' intents. Iteration ' + str(i))
                main.ONOSbench.pushTestIntentsShell(
                        deviceIdList[0] + '/2', deviceIdList[7] +
                        '/2', batchIntentSize, '/tmp/batch_install.txt',
                        ONOSIpList[0], numMult='1', report=False,
                        options='-i')
                
                time.sleep(10)
                
                main.ONOS1.tsharkGrep(tsharkPortStatus, tsharkPortDown)
                main.log.info('Disabling interface ' + intfs)
                main.Mininet1.handle.sendline(
                        'sh ifconfig ' + intfs + ' down')
                t0System = time.time() * 1000
                
                time.sleep(3)
                
                main.ONOS1.tsharkStop()
                
                time.sleep(2)
                
                os.system('scp ' + ONOSUser + '@' + ONOSIpList[0] +
                        ':' + tsharkPortDown + ' /tmp/')
                time.sleep(5)
                
                fPortDown = open(tsharkPortDown, 'r')
                fLine = fPortDown.readline()
                objDown = fLine.split(' ')
                if len(fLine) > 0:
                    timestampBeginPtDown = int(float(objDown[1]) * 1000)
                    if timestampBeginPtDown < 1400000000000:
                        timestampBeginPtDown = int(float(objDown[2]) * 1000)
                    main.log.info('Port down begin timestamp: ' +
                            str(timestampBeginPtDown))
                else:
                    main.log.info('Tshark output file returned unexpected' +
                            ' results: ' + str(fLine))
                fPortDown.close()
                
                intentsJsonStr1 = main.ONOS1cli.intentsEventsMetrics()
                intentsJsonObj1 = json.loads(intentsJsonStr1)
                intentInstall1 = intentsJsonObj1[installTime]['value']
                intentRerouteLat1 = int(intentInstall1) - int(t0System)
                intentRerouteLatPort1 =\
                        int(intentInstall1) - int(timestampBeginPtDown)
                
                if intentRerouteLat1 > thresholdMin and \
                        intentRerouteLat1 < thresholdMax and\
                        i > numIgnore:
                    rerouteLatSystem.append(intentRerouteLat1)
                main.log.info('ONOS1 Intent Reroute Lat ' +
                        ' size: ' + str(batchIntentSize) +
                        ' system-to-install: ' +
                        str(intentRerouteLat1) + ' ms')
                if intentRerouteLatPort1 > thresholdMin and\
                        intentRerouteLatPort1 < thresholdMax and\
                        i > numIgnore:
                    rerouteLatPort.append(intentRerouteLatPort1)
                
                main.log.info('ONOS1 Intent Reroute Lat ' +
                        ' size: ' + str(batchIntentSize) +
                        ' system-to-install: ' +
                        str(intentRerouteLatPort1) + ' ms')
                
                if clusterCount == 3:
                    intentsJsonStr2 = main.ONOS2cli.intentsEventsMetrics()
                    intentsJsonStr3 = main.ONOS3cli.intentsEventsMetrics()
                    intentsJsonObj2 = json.loads(intentsJsonStr2)
                    intentsJsonObj3 = json.loads(intentsJsonStr3)
                    intentInstall2 = intentsJsonObj2[installTime]['value']
                    intentInstall3 = intentsJsonObj3[installTime]['value']
                    intentRerouteLat2 = int(intentInstall2) - int(t0System)
                    intentRerouteLat3 = int(intentInstall3) - int(t0System)
                    intentRerouteLatPort2 = int(intentInstall2) - int(timestampBeginPtDown)
                    intentRerouteLatPort3 = int(intentInstall3) - int(timestampBeginPtDown)
                    
                    if intentRerouteLat2 > thresholdMin and\
                            intentRerouteLat2 < thresholdMax and\
                            i > numIgnore:
                        rerouteLatSystem.append(intentRerouteLat2)
                        main.log.info('ONOS2 Intent Reroute Lat' +
                                ' size: ' + str(batchIntentSize) +
                                ' system-to-install: ' + str(intentRerouteLat2) + ' ms')
                    if intentRerouteLat3 > thresholdMin and\
                            intentRerouteLat3 < thresholdMax and\
                            i > numIgnore:
                        rerouteLatSystem.append(intentRerouteLat3)
                        main.log.info('ONOS3 Intent Reroute Lat' +
                                ' size: ' + str(batchIntentSize) +
                                ' system-to-install: ' + str(intentRerouteLat3) +
                                ' ms')
                    if intentRerouteLatPort2 > thresholdMin and\
                            intentRerouteLatPort2 < thresholdMax and\
                            i > numIgnore:
                        rerouteLatPort.append(intentRerouteLatPort2)
                        main.log.info('ONOS2 Intent Reroute Lat' +
                                ' size: ' + str(batchIntentSize) +
                                ' port-to-install: ' +
                                str(intentRerouteLatPort2) + ' ms')
                    if intentRerouteLatPort3 > thresholdMin and\
                            intentRerouteLatPort3 < thresholdMax and\
                            i > numIgnore:
                        rerouteLatPort.append(intentRerouteLatPort3)
                        main.log.info('ONOS3 Intent Reroute Lat' +
                                ' size: ' + str(batchIntentSize) +
                                ' port-to-install: ' +
                                str(intentRerouteLatPort2) + ' ms')
                
                if clusterCount == 5:
                    intentsJsonStr4 = main.ONOS4cli.intentsEventsMetrics()
                    intentsJsonStr5 = main.ONOS5cli.intentsEventsMetrics()
                    intentsJsonObj4 = json.loads(intentsJsonStr4)
                    intentsJsonObj5 = json.loads(intentsJsonStr5)
                    intentInstall4 = intentsJsonObj4[installTime]['value']
                    intentInstall5 = intentsJsonObj5[installTime]['value']
                    intentRerouteLat4 = int(intentInstall4) - int(t0System)
                    intentRerouteLat5 = int(intentInstall5) - int(t0System)
                    intentRerouteLatPort4 =\
                            int(intentInstall4) - int(timestampBeginPtDown)
                    intentRerouteLatPort5 =\
                            int(intentInstall5) - int(timestampBeginPtDown)
                    if intentRerouteLat4 > thresholdMin and\
                            intentRerouteLat4 < thresholdMax and \
                            i > numIgnore:
                        rerouteLatSystem.append(intentRerouteLat4)
                        main.log.info('ONOS4 Intent Reroute Lat' +
                                ' size: ' + str(batchIntentSize) +
                                ' system-to-install: ' + str(intentRerouteLat4) +
                                ' ms')
                    if intentRerouteLat5 > thresholdMin and\
                            intentRerouteLat5 < thresholdMax and\
                            i > numIgnore:
                        rerouteLatSystem.append(intentRerouteLat5)
                        main.log.info('ONOS5 Intent Reroute Lat' +
                                ' size: ' + str(batchIntentSize) +
                                ' system-to-install: ' +
                                str(intentRerouteLat5) + ' ms')
                    if intentRerouteLatPort4 > thresholdMin and\
                            intentRerouteLatPort4 < thresholdMax and\
                            i > numIgnore:
                        rerouteLatPort.append(intentRerouteLatPort4)
                        main.log.info('ONOS4 Intent Reroute Lat' +
                                ' size: ' + str(batchIntentSize) +
                                ' port-to-install: ' +
                                str(intentRerouteLatPort4) + ' ms')
                    if intentRerouteLatPort5 > thresholdMin and\
                            intentRerouteLatPort5 < thresholdMax and\
                            i > numIgnore:
                        rerouteLatPort.append(intentRerouteLatPort5)
                        main.log.info('ONOS5 Intent Reroute Lat' +
                                ' size: ' + str(batchIntentSize) +
                                ' port-to-install: ' +
                                str(intentRerouteLatPort5) + ' ms')
                
                if clusterCount == 7:
                    intentsJsonStr6 = main.ONOS6cli.intentsEventsMetrics()
                    intentsJsonStr7 = main.ONOS7cli.intentsEventsMetrics()
                    intentsJsonObj6 = json.loads(intentsJsonStr6)
                    intentsJsonObj7 = json.loads(intentsJsonStr7)
                    intentInstall6 = intentsJsonObj6[installTime]['value']
                    intentInstall7 = intentsJsonObj7[installTime]['value']
                    intentRerouteLat6 = int(intentInstall6) - int(t0System)
                    intentRerouteLat7 = int(intentInstall7) - int(t0System)
                    intentRerouteLatPort4 =\
                            int(intentInstall4) - int(timestampBeginPtDown)
                    intentRerouteLatPort5 =\
                            int(intentInstall5) - int(timestampBeginPtDown)
                    if intentRerouteLat6 > thresholdMin and\
                            intentRerouteLat6 < thresholdMax and\
                            i > numIgnore:
                        rerouteLatSystem.append(intentRerouteLat6)
                        main.log.info('ONOS6 Intent Reroute Lat' +
                                ' size: ' + str(batchIntentSize) +
                                ' system-to-install: ' +
                                str(intentRerouteLat6) + ' ms')
                    if intentRerouteLat7 > thresholdMin and\
                            intentRerouteLat7 < thresholdMax and\
                            i > numIgnore:
                        rerouteLatSystem.append(intentRerouteLat7)
                        main.log.info('ONOS7 Intent Reroute Lat' +
                                ' size: ' + str(batchIntentSize) +
                                ' system-to-install: ' + 
                                str(intentRerouteLat7) + ' ms')
                    if intentRerouteLatPort6 > thresholdMin and\
                            intentRerouteLatPort6 < thresholdMax and\
                            i > numIgnore:
                        rerouteLatPort.append(intentRerouteLatPort6)
                        main.log.info('ONOS6 Intent Reroute Lat' +
                                ' size: ' + str(batchIntentSize) +
                                ' port-to-install: ' +
                                str(intentRerouteLatPort6) + ' ms')
                    if intentRerouteLatPort7 > thresholdMin and\
                            intentRerouteLatPort7 < thresholdMax and\
                            i > numIgnore:
                        rerouteLatPort.append(intentRerouteLatPort7)
                        main.log.info('ONOS7 Intent Reroute Lat' +
                                ' size: ' + str(batchIntentSize) +
                                ' port-to-install: ' +
                                str(intentRerouteLatPort7) + ' ms')

                time.sleep(5)
                
                main.log.info('System: ' + str(rerouteLatSystem))
                main.log.info('Port: ' + str(rerouteLatPort))
                if rerouteLatSystem:
                    maxRerouteLatSystem = max(rerouteLatSystem)
                    main.log.info('Max system: ' + str(maxRerouteLatSystem))
                if rerouteLatPort:
                    maxRerouteLatPort = max(rerouteLatPort)
                    main.log.info('Max port: ' + str(maxRerouteLatPort))
               
                # Bring port back up for next iteration
                main.Mininet1.handle.sendline('sh ifconfig ' + intfs + ' up')
                time.sleep(5)

                # Use 'withdraw' option to withdraw batch intents
                main.ONOSbench.pushTestIntentsShell(
                        deviceIdList[0] + '/2', deviceIdList[7] + '/2',
                        batchIntentSize, '/tmp/batch_install.txt',
                        ONOSIpList[0], numMult='1', report=False, options='-w')
                main.log.info('Intents removed and port back up')
             
            # NOTE: End iteration loop
            if batch == 1:
                batchIntentSize = 10
            elif batch == 2:
                batchIntentSize = 100
            elif batch == 3:
                batchIntentSize = 500
            elif batch == 4:
                batchIntentSize = 1000
            main.log.info('Batch intent size increased to ' + str(batchIntentSize))

    def CASE4(self, main):
        """
        Increase number of nodes and initiate CLI
        """
        global clusterCount
        import time
        import json
        
        clusterCount += 2
        
        cellName = main.params[ 'ENV' ][ 'cellName' ]
        features = main.params[ 'TEST' ][ 'cellStr' ]
        benchIp = main.params[ 'BENCH' ][ 'ip' ]
        mininetIp = main.params[ 'MN' ][ 'ip1' ]
        
        main.log.report('Increasing cluster size to ' + str(clusterCount))
        
        ONOSIp = []
        for i in range( 1, 8 ):
            ONOSIp.append( main.params[ 'CTRL' ][ 'ip'+str(i) ] )

        main.step( "Cleaning environment" )
        for i in range( 0, 7 ):
            main.ONOSbench.onosDie( ONOSIp[i] )
            main.log.info( "Uninstalling ONOS "+str(i+1) )
            main.ONOSbench.onosUninstall( ONOSIp[i] )

        main.step( "Creating new cell file" )
        cellIp = []
        for node in range( 1, clusterCount + 1 ):
            cellIp.append( ONOSIp[node] )
        main.ONOSbench.createCellFile( benchIp, cellName,
                                       mininetIp, str(features), *cellIp )

        main.step( "Setting cell definition" )
        main.ONOSbench.setCell( cellName )

        main.step( "Packaging cell definition" )
        main.ONOSbench.onosPackage()

        for node in range( 1, clusterCount + 1 ):
            main.ONOSbench.onosInstall( node = ONOSIp[node] )
            
        time.sleep( 20 )

        for node in range( 1, clusterCount + 1 ):
            for i in range( 2 ):
                isup = main.ONOSbench.isup( ONOSIp[node] )
                if isup:
                    main.log.info( "ONOS "+str(node) + " is up\n")
                    assertion = main.TRUE
                    break
                if not isup:
                    main.log.info( "ONOS" + str(node) + " did not start")
        
        for node in range( 1, clusterCount + 1 ):
            exec "a = main.ONOS%scli.startOnosCli" %str(node)
            a( ONOSIp[node] )

        time.sleep(30)

        utilities.assert_equals(expect=main.TRUE, actual=assertion,
            onpass='Scale out to ' + str(clusterCount) + ' nodes successful',
            onfail='Scale out to ' + str(clusterCount) + ' nodes failed')

