"""
Copyright 2015 Open Networking Foundation ( ONF )

Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>

    TestON is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    ( at your option ) any later version.

    TestON is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
"""
# This is a basic platform test suite.
# Additional platform test cases can be added on this test suite where appropriate.


class PLATdockertest:

    """
    This testsuite performs the following tests:
    1 ) checkout onos docker image;
    2 ) test image start up in single and clustered mode;
    3 ) test onos app activation and deactivation;

    Prerequisites:
    1 ) docker-engine installed on test station ( localhost );
    2 ) python docker client ( docker-py ) installed on test station
    """
    def __init__( self ):
        self.default = ''
        global DOCKERREPO, DOCKERTAG, INITDOCKERTAG
        global IPlist
        global CTIDlist
        global NODElist

        DOCKERREPO = "onosproject/onos"
        DOCKERTAG = "latest"

    def CASE0( self, main ):
        """
        Pull all docker images and get a list of image tags
        """
        main.case( "Pull all docker images and get a list of image tags" )
        import os
        DOCKERREPO = main.params[ 'DOCKER' ][ 'repo' ]
        os.system( "docker pull -a " + DOCKERREPO )
        imageTagList = list()
        imageTagCounter = 0
        duplicateTagDetected = 0
        imageTagList, duplicateTagDetected = main.ONOSbenchDocker.getListOfImages( DOCKERREPO )
        stepResult = main.FALSE
        main.step( "Check for duplicate Tags for a given image" )
        if not duplicateTagDetected:
            stepResult = main.TRUE
        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
                                    onpass="no duplicate image tags",
                                    onfail="duplicate image tags detected!!" )
        main.step( "Get a list of image tags" )
        stepResult = main.FALSE
        if imageTagList is not []:
            main.log.info( "The Image tag list is: " + str( imageTagList ) )
            stepResult = main.TRUE
        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
                                    onpass="image tag list pulled successfully",
                                    onfail="image tag list not pulled" )

    def CASE1( self, main ):
        """
        1 ) set up test params;
        """
        import re
        import time
        import subprocess

        if imageTagCounter < len( imageTagList ):
            DOCKERTAG = imageTagList[ imageTagCounter ]
        if not imageTagCounter:
            INITDOCKERTAG = DOCKERTAG
        imageTagCounter += 1

        main.case( "Set case test params for onos image {}".format( DOCKERTAG ) )
        main.step( "Initialize test params" )
        NODElist = main.params[ "SCALE" ][ "nodelist" ].split( ',' )
        main.log.info( "onos container names are: " + ",".join( NODElist ) )
        IPlist = list()
        main.testOnDirectory = re.sub( "(/tests)$", "", main.testsRoot )
        CTIDlist = list()

        main.log.info( "Check docker status, it not running, try restart it" )
        iter = 0
        stepResult = main.TRUE
        while subprocess.call( "sudo service docker status", shell=True ) and iter <= 3:
            subprocess.call( "sudo service docker restart", shell=True )
            time.sleep( 5 )
            iter += 1
            if iter == 3:
                stepResult = main.FALSE

        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
                                    onpass="docker is running",
                                    onfail="docker is not running" )
        if stepResult == main.FALSE:
            main.log.warn( "docker is not running - exiting test" )
            main.cleanAndExit()
        if imageTagCounter > len( imageTagList ):
            main.log.info( "All images have been tested" )
            main.cleanAndExit()

    def CASE5( self, main ):
        """
        Pull the specified image
        """
        main.case( "Pull onos docker image {} from {} - \
                    it may take sometime if this is a first time pulling.".format( DOCKERTAG, DOCKERREPO ) )
        stepResult = main.FALSE
        main.step( "pull image {} from {}".format( DOCKERTAG, DOCKERREPO ) )
        stepResult = main.ONOSbenchDocker.dockerPull( onosRepo=DOCKERREPO, onosTag=DOCKERTAG )
        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
                                    onpass="Succeeded in pulling " + DOCKERREPO + ":" + DOCKERTAG,
                                    onfail="Failed to pull " + DOCKERREPO + ":" + DOCKERTAG )
        if stepResult == main.FALSE:
            main.skipCase()

    def CASE10( self, main ):
        """
        Start docker containers for list of onos nodes, only if not already existed
        """
        import re
        createResult = main.TRUE
        startResult = main.TRUE
        main.case( "Start onos container(s) for onos image {}".format( DOCKERTAG ) )
        image = DOCKERREPO + ":" + DOCKERTAG

        main.step( "Create and (re)start docker container(s) for onos image {} if not already exist".format( DOCKERTAG ) )
        # stepResult = main.FALSE

        for ct in xrange( 0, len( NODElist ) ):
            if not main.ONOSbenchDocker.dockerCheckCTName( ctName=NODElist[ ct ] ):
                main.log.info( "Create new container for onos" + str( ct + 1 ) )
                createResult, ctid = main.ONOSbenchDocker.dockerCreateCT( onosImage=image, onosNode=NODElist[ ct ] )
                CTIDlist.append( ctid )
                startResult = main.ONOSbenchDocker.dockerStartCT( ctID=ctid )
            else:
                main.log.info( "Container exists for node onos" + str( ct + 1 ) + "; restart container with {} image".format( DOCKERTAG ) )
                startResult = main.ONOSbenchDocker.dockerRestartCT( ctName=NODElist[ ct ] )

        utilities.assert_equals( expect=main.TRUE, actual=createResult and startResult,
                                    onpass="Container successfully created",
                                    onfail="Failed to create the container" )

        main.step( "Get IP address on onos containers" )
        stepResult = main.FALSE

        for ct in xrange( 0, len( NODElist ) ):
            IPlist.append( main.ONOSbenchDocker.dockerIP( ctName=NODElist[ ct ] ) )
        main.log.info( "Container IPs are: " + ', '.join( IPlist ) )

        if IPlist is not []:
            stepResult = main.TRUE
        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
                                    onpass="Container successfully started",
                                    onfail="Failed to start the container" )

    def CASE110( self, main ):
        """
        Docker init testing

        Steps:
        1 ) check default startup standalone onos applications status;
        2 ) form onos cluster with all nodes;
        3 ) check onos applications status;
        4 ) activate apps per params and check app status;

        """
        import time
        import json

        main.case( "Form onos cluster and check status of onos apps for onos image {}".format( DOCKERTAG ) )

        startupSleep = int( main.params[ "SLEEP" ][ "startup" ] )
        main.swDPID = main.params[ "CASE110" ][ "swDPID" ]
        main.debug = main.params[ "CASE110" ][ "debug" ]

        appToAct = main.params[ "CASE110" ][ "apps" ]
        main.initResult = main.FALSE

        main.log.info( "Wait for startup, sleep (sec): " + str( startupSleep ) )
        time.sleep( startupSleep )

        main.step( "Check initial app states from onos1 for onos image {}".format( DOCKERTAG ) )
        main.initResult = main.TRUE
        response = main.ONOSbenchRest.apps( ip=IPlist[ 0 ], port=8181 )
        main.log.debug( "Rest call response is: " + response )
        if response is not main.FALSE:
            for item in json.loads( response ):
                if item[ "state" ] not in [ "ACTIVE", "INSTALLED" ]:
                    main.log.info( "Some bundles are not in correct state. " )
                    main.log.info( "App states are: " + response )
                    main.initResult = main.FALSE
                    break
                if ( item[ "description" ] == "Builtin device drivers" ) and ( item[ "state" ] != "ACTIVE" ):
                    main.log.info( "Driver app is not in 'ACTIVE' state, but in: " + item[ "state" ] )
                    main.initResult = main.FALSE
                    break
        utilities.assert_equals( expect=main.TRUE, actual=main.initResult,
                                    onpass="ONOS successfully started",
                                    onfail="Failed to start ONOS correctly" )
        if main.initResult is main.FALSE:
            main.skipCase()

        main.step( "Form onos cluster using 'dependencies/onos-form-cluster' util" )
        main.initResult = main.FALSE
        clcmdpath = main.params[ "CASE110" ][ "clustercmdpath" ]
        main.log.info( "onos-form-cluster cmd path is: " + clcmdpath )
        dkruser = main.params[ "DOCKER" ][ "user" ]
        dkrpasswd = main.params[ "DOCKER" ][ "password" ]
        main.ONOSbenchDocker.onosFormCluster( cmdPath=clcmdpath, onosIPs=IPlist, user=dkruser, passwd=dkrpasswd )
        main.log.info( "Wait for cluster to form with sleep time of " + str( startupSleep ) )
        time.sleep( startupSleep )
        status, response = main.ONOSbenchRest.send( ip=IPlist[ 0 ], port=8181, url="/cluster" )
        main.log.debug( "Rest call response: " + str( status ) + " - " + response )
        if status == 200:
            jrsp = json.loads( response )
            if DOCKERTAG == "1.2" or DOCKERTAG == "1.3" or DOCKERTAG == "1.4" or DOCKERTAG == "1.5":
                clusterIP = [ item[ "ip" ]for item in jrsp[ "nodes" ] if item[ "status" ] == "ACTIVE" ]
            else:
                clusterIP = [ item[ "ip" ]for item in jrsp[ "nodes" ] if item[ "status" ] == "READY" ]
            main.log.debug( " IPlist is:" + ",".join( IPlist ) )
            main.log.debug( " cluster IP is" + ",".join( clusterIP ) )
            if set( IPlist ) == set( clusterIP ):
                main.initResult = main.TRUE

        utilities.assert_equals( expect=main.TRUE, actual=main.initResult,
                                    onpass="ONOS successfully started",
                                    onfail="Failed to start ONOS correctly" )
        if main.initResult is main.FALSE:
            main.skipCase()

        main.step( "Check cluster app status" )
        main.initResult = main.TRUE
        response = main.ONOSbenchRest.apps( ip=IPlist[ 0 ], port=8181 )
        if response is not main.FALSE:
            for item in json.loads( response ):
                if item[ "state" ] not in [ "ACTIVE", "INSTALLED" ]:
                    main.log.info( "Some bundles are not in correct state. " )
                    main.log.info( "App states are: " + response )
                    main.initResult = main.FALSE
                    break
                if ( item[ "description" ] == "Builtin device drivers" ) and ( item[ "state" ] != "ACTIVE" ):
                    main.log.info( "Driver app is not in 'ACTIVE' state, but in: " + item[ "state" ] )
                    main.initResult = main.FALSE
                    break
        utilities.assert_equals( expect=main.TRUE, actual=main.initResult,
                                    onpass="ONOS successfully started",
                                    onfail="Failed to start ONOS correctly" )
        if main.initResult is main.FALSE:
            main.skipCase()

        main.step( " Activate an APP from REST and check APP status" )
        appResults = list()
        main.initResult = main.TRUE
        applist = main.params[ "CASE110" ][ "apps" ].split( "," )
        main.log.info( "List of apps to activate: " + str( applist ) )
        for app in applist:
            appRslt = main.ONOSbenchRest.activateApp( appName=app, ip=IPlist[ 0 ], port=8181, check=True )
            time.sleep( 5 )
            appResults.append( appRslt )
            main.initResult = main.initResult and appRslt
        main.log.debug( "Apps activation result for " + ",".join( applist ) + ": " + str( appResults ) )
        utilities.assert_equals( expect=main.TRUE, actual=main.initResult,
                                    onpass="Successfully activated apps",
                                    onfail="Failed to activated apps correctly" )

    def CASE120( self, main ):
        """
            Docker Mininet testing
        """
        import time
        import json
        from operator import itemgetter

        if main.initResult is main.FALSE:
            main.mininetResult = main.FALSE
            main.skipCase()

        main.step( "Loading Mininet Topology." )

        mnCmd = main.params[ "CASE110" ][ "mnCmd" ]
        main.mininetResult = main.Mininet1.startNet( mnCmd=mnCmd + IPlist[ 0 ] )
        utilities.assert_equals( expect=main.TRUE,
                                 actual=main.mininetResult,
                                 onpass="Successfully loaded topology.",
                                 onfail="Failed to load topology" )

        if main.mininetResult is main.FALSE:
            main.skipCase()

        main.mininetResult = utilities.retry( f=main.Mininet1.pingall,
                                              retValue=main.FALSE,
                                              attempts=3,
                                              sleep=5 )

        utilities.assert_equals( expect=main.TRUE,
                                 actual=main.mininetResult,
                                 onpass="Successfully loaded topology.",
                                 onfail="Failed to load topology" )

    def CASE130( self, main ):
        """
            Docker Intents testing
        """
        import time
        import json
        from operator import itemgetter

        if main.initResult is main.FALSE or main.mininetResult is main.FALSE:
            main.intentResult = False
            main.skipCase()

        main.hosts = sorted( json.loads( main.ONOSbenchRest.hosts( ip=IPlist[ 0 ] ) ), key=itemgetter( "ipAddresses" ) )
        main.ONOSbenchRest.addHostIntent( main.hosts[ 0 ][ "id" ], main.hosts[ -1 ][ "id" ], ip=IPlist[ 0 ] )
        main.ONOSbenchRest.addHostIntent( main.hosts[ 1 ][ "id" ], main.hosts[ -2 ][ "id" ], ip=IPlist[ 0 ] )

        main.log.info( "Sleeping for 5 seconds to avoid potential race condition..." )
        time.sleep( 5 )

        main.step( "Get the intents from each controller" )
        main.ONOSIntents = main.ONOSbenchRest.intents( IPlist[ 0 ] )
        main.intentResult = True
        for i in range( 0, len( IPlist ) ):
            node = str( IPlist[ i ] )
            if not main.ONOSIntents[ i ] or "Error" in main.ONOSIntents[ i ]:
                main.log.error( "Error in getting " + node + " intents" )
                main.log.warn( node + " intents response: " +
                               repr( main.ONOSIntents[ i ] ) )
                main.intentResult = False

        utilities.assert_equals( expect=True,
                                 actual=main.intentResult,
                                 onpass="No error in reading intents output",
                                 onfail="Error in reading intents from ONOS" )

        if not main.intentResult:
            main.skipCase()

        main.step( "Checking intent state" )

        main.intentResult = json.loads( main.ONOSIntents )[ 0 ][ "state" ] == "INSTALLED"

        utilities.assert_equals( expect=True,
                                 actual=main.intentResult,
                                 onpass="Intent check successful.",
                                 onfail="Intent check failed." )

    def CASE140( self, main ):
        """
            Docker Flows testing
        """
        import time
        import json

        if main.initResult is main.FALSE or not main.intentResult:
            main.skipCase()

        main.step( "Adding flows." )

        ingress = 1
        egress = 2

        main.log.info( "Add flow with MAC selectors." )
        main.flowResult = main.ONOSbenchRest.addFlow( deviceId=main.swDPID,
                                                      egressPort=egress,
                                                      ingressPort=ingress,
                                                      ethSrc=main.hosts[ 0 ][ 'mac' ],
                                                      ethDst=main.hosts[ 1 ][ 'mac' ],
                                                      debug=main.debug,
                                                      ip=IPlist[ 0 ] )

        main.log.info( "Sleeping for 10 seconds..." )
        time.sleep( 10 )

        utilities.assert_equals( expect=main.TRUE,
                                 actual=main.flowResult,
                                 onpass="Successfully added flows",
                                 onfail="Failed to add flows" )

    def CASE299( self, main ):
        """
            Cleanup Docker testing
        """
        import time
        import json

        if main.initResult is main.FALSE:
            main.skipCase()

        if main.flowResult is main.TRUE:
            main.step( "Remove flow." )

            prevFlow = json.loads( main.ONOSbenchRest.getFlows( main.swDPID, ip=IPlist[ 0 ] ) )[ -1 ]
            stepResult = main.ONOSbenchRest.removeFlow( main.swDPID, prevFlow[ 'id' ], ip=IPlist[ 0 ] )
            utilities.assert_equals( expect=main.TRUE, actual=stepResult,
                                     onpass="Successfully removed flow.",
                                     onfail="Failed to remove flow." )

        if main.intentResult:
            main.step( "Remove intents." )
            results = []
            for i in range( 0, len( json.loads( main.ONOSIntents ) ) ):
                intentID = json.loads( main.ONOSbenchRest.intents( IPlist[ 0 ] ) )[ 0 ][ 'id' ]
                results.append( main.ONOSbenchRest.removeIntent( intentID, ip=IPlist[ 0 ] ) == main.TRUE )

            utilities.assert_equals( expect=True, actual=all( results ),
                                     onpass="Successfully removed intents.",
                                     onfail="Failed to remove intents." )

        if main.mininetResult is main.TRUE:
            main.Mininet1.stopNet()

        main.step( "Deactivate an APP from REST and check APP status" )
        appResults = list()
        stepResult = main.TRUE
        applist = main.params[ "CASE110" ][ "apps" ].split( "," )
        main.log.info( "Apps to deactivate: " + str( applist ) )
        for app in applist:
            time.sleep( 5 )
            appRslt = main.ONOSbenchRest.deactivateApp( appName=app, ip=IPlist[ 0 ], port=8181, check=True )
            appResults.append( appRslt )
            stepResult = stepResult and appRslt
        main.log.debug( "Apps deactivation result for " + ",".join( applist ) + ": " + str( appResults ) )
        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
                                 onpass="Successfully deactivated apps",
                                 onfail="Failed to deactivated apps correctly" )

    def CASE900( self, main ):
        """
        Check onos logs for exceptions after tests
        """
        import pexpect
        import time
        import re

        logResult = main.TRUE

        user = main.params[ "DOCKER" ][ "user" ]
        pwd = main.params[ "DOCKER" ][ "password" ]

        main.case( "onos Exceptions check with onos image {}".format( DOCKERTAG ) )
        main.step( "check onos for any exceptions" )

        for ip in IPlist:
            spawncmd = "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 8101 " + user + "@" + ip
            main.log.info( "log on node using cmd: " + spawncmd )
            try:
                handle = pexpect.spawn( spawncmd )
                # handle.expect( "yes/no" )
                # handle.sendline( "yes" )
                # print( "yes is sent" )
                # this extra statement is sent to get around some
                # pexpect issue of not seeing the next expected string
                handle.expect( "Password:" )
                handle.sendline( pwd )
                time.sleep( 5 )
                handle.expect( "onos>" )
                handle.sendline( "log:exception-display" )
                handle.expect( "onos>" )
                result = handle.before
                if re.search( "Exception", result ):
                    main.log.info( "onos: " + ip + " Exceptions:" + result )
                    logResult = logResult and main.FALSE
                else:
                    main.log.info( "onos: " + ip + " Exceptions: None" )
                    logResult = logResult and main.TRUE
            except Exception:
                main.log.exception( "Uncaught exception when getting log from onos:" + ip )
                logResult = logResult and main.FALSE

        utilities.assert_equals( expect=main.TRUE, actual=logResult,
                                    onpass="onos exception check passed",
                                    onfail="onos exeption check failed" )

    def CASE1000( self, main ):
        """
        Cleanup after tests - stop and delete the containers created; delete the image
        """
        import time

        main.case( "Clean up  images (ex. none:none tagged) and containers" )
        main.step( "Stop onos containers" )
        stepResult = main.TRUE
        for ctname in NODElist:
            if main.ONOSbenchDocker.dockerCheckCTName( ctName="/" + ctname ):
                main.log.info( "stopping docker container: /" + ctname )
                stopResult = main.ONOSbenchDocker.dockerStopCT( ctName="/" + ctname )
                time.sleep( 10 )
                rmResult = main.ONOSbenchDocker.dockerRemoveCT( ctName="/" + ctname )
                stepResult = stepResult and stopResult and rmResult
        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
                                    onpass="Container successfully stopped",
                                    onfail="Failed to stopped the container" )

        # main.step( "remove exiting onosproject/onos images" )
        # stepResult = main.ONOSbenchDocker.dockerRemoveImage( image=DOCKERREPO + ":" + DOCKERTAG )
        main.step( "remove dangling 'none:none' images" )
        stepResult = main.ONOSbenchDocker.dockerRemoveImage()
        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
                                    onpass="Succeeded in cleaning up images",
                                    onfail="Failed in cleaning up images" )

    def CASE1001( self, main ):
        """
        Create a file for publishing results on wiki in tabular form
        """
        main.case( "Create a file for publishing on wiki in tabular form" )
        import re
        imageTagCounter = 0
        testCaseCounter = 0
        resultCounter = 0
        resultDictionary = {}
        testCaseList = []
        totalNumOfTestCases = 6
        try:
            main.tableFileName = main.logdir + "/" + main.TEST + "TableWiki.txt"
            main.wikiTableFile = open( main.tableFileName, "a+" )
            main.wikiFileHandle = open( main.WikiFileName, "r" )
            for imageTag in imageTagList:
                resultDictionary[ imageTag ] = []
            for line in main.wikiFileHandle:
                matchObj = re.search( "(?!.*Case 0).*<h3>(.+?)<\/h3>", line )
                if testCaseCounter < totalNumOfTestCases:
                    if matchObj:
                        wordsToRemove = re.compile( "latest|- PASS|- FAIL|- No Result" )
                        testCaseName = wordsToRemove.sub( "", matchObj.group( 1 ) )
                        testCaseName = testCaseName.replace( INITDOCKERTAG, '' )
                        testCaseList.append( testCaseName )
                        testCaseCounter += 1
                if matchObj:
                    if "- PASS" in line:
                        resultDictionary[ imageTagList[ imageTagCounter ] ].append( "PASS" )
                    if "- FAIL" in line:
                        resultDictionary[ imageTagList[ imageTagCounter ] ].append( "FAIL" )
                    if "- No Result" in line:
                        resultDictionary[ imageTagList[ imageTagCounter ] ].append( "No Result" )
                    resultCounter += 1
                if resultCounter == totalNumOfTestCases:
                    imageTagCounter += 1
                    resultCounter = 0
            main.wikiTableFile.write( "<table style=\"width:100%\">\n" )
            main.wikiTableFile.write( "<tr>\n" )
            main.wikiTableFile.write( "<th>ONOS Version</th>\n" )
            for testCaseName in testCaseList:
                main.wikiTableFile.write( "<th>" + testCaseName + "</th>\n" )
            main.wikiTableFile.write( "</tr>\n" )
            for imageTag in imageTagList:
                main.wikiTableFile.write( "<tr>\n" )
                main.wikiTableFile.write( "<td>" + imageTag + "</td>\n" )
                for resultValue in resultDictionary[ imageTag ]:
                    if resultValue == "PASS":
                        emoticonValue = "\"tick\""
                    if resultValue == "FAIL":
                        emoticonValue = "\"cross\""
                    if resultValue == "No Result":
                        emoticonValue = "\"warning\""
                    main.wikiTableFile.write( "<td>" + resultValue + "  <ac:emoticon ac:name=" + emoticonValue + " /></td>\n" )
                main.wikiTableFile.write( "</tr>\n" )
            main.wikiTableFile.write( "</table>\n" )
            main.wikiTableFile.close()
            main.wikiFileHandle.close()
            logResult = main.TRUE
        except Exception:
            main.log.exception( "Exception while writing to the table file" )
            logResult = main.FALSE
        utilities.assert_equals( expect=main.TRUE, actual=logResult,
                                    onpass="onos exception check passed",
                                    onfail="onos exception check failed" )
