Creating subfolders for test suites

allow teston to look in subfolders
create subfolders for current test suites
move tests into sub folders
create HA suite dependencies folder and moved all common files there
minor driver and test updates
standardize on the name dependencies for the directory
change from admin to sdn users

Conflicts:
	TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.topo

Change-Id: I849e45ab67da8b285c36c5fdf43b34323876e741
diff --git a/TestON/tests/PLAT/PLATdockertest/PLATdockertest.params b/TestON/tests/PLAT/PLATdockertest/PLATdockertest.params
new file mode 100755
index 0000000..cc90dae
--- /dev/null
+++ b/TestON/tests/PLAT/PLATdockertest/PLATdockertest.params
@@ -0,0 +1,45 @@
+<PARAMS>
+
+    <testcases>1,1000,5,10,110,900,1000</testcases>
+
+    <DOCKER>
+        <repo>onosproject/onos</repo>
+        <tag>latest</tag>
+        <user>karaf</user>
+        <password>karaf</password>
+    </DOCKER>
+
+    <SCALE>
+        <nodelist>onos1,onos2,onos3</nodelist>
+    </SCALE>
+
+    <CASE110>
+        <clustercmdpath>../tests/PLATdockertest/dependencies</clustercmdpath>
+        <apps>org.onosproject.proxyarp,org.onosproject.fwd</apps>
+    </CASE110>
+
+    <DEPENDENCY>
+        <path>/tests/SAMPstartTemplate/dependencies/</path>
+        <wrapper1>startUp</wrapper1>
+        <topology>newFuncTopo.py</topology>
+    </DEPENDENCY>
+
+    <ENV>
+        <cellName>productionCell</cellName>
+        <cellApps>drivers,openflow,proxyarp,mobility</cellApps>
+    </ENV>
+
+    <GIT>
+        <pull>False</pull>
+        <branch>master</branch>
+    </GIT>
+
+    <CTRL>
+        <port>6653</port>
+    </CTRL>
+
+    <SLEEP>
+        <startup>60</startup>
+    </SLEEP>
+
+</PARAMS>
diff --git a/TestON/tests/PLAT/PLATdockertest/PLATdockertest.py b/TestON/tests/PLAT/PLATdockertest/PLATdockertest.py
new file mode 100755
index 0000000..6e4acda
--- /dev/null
+++ b/TestON/tests/PLAT/PLATdockertest/PLATdockertest.py
@@ -0,0 +1,306 @@
+
+# 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
+        global IPlist
+        global CTIDlist
+        global NODElist
+
+        DOCKERREPO = "onosproject/onos"
+        DOCKERTAG = "latest"
+
+    def CASE1( self, main ):
+        """
+        1) set up test params;
+        """
+        import re
+        import time
+        import subprocess
+
+        main.case("Set case test params")
+        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.testDir )
+        DOCKERREPO = main.params[ 'DOCKER' ][ 'repo' ]
+        DOCKERTAG = main.params[ 'DOCKER' ][ 'tag' ]
+        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.exit()
+            main.cleanup()
+
+    def CASE5(self, main):
+        """
+        Pull (default) "onosproject/onos:latest" image
+        """
+
+        main.case( "Pull latest onos docker image from onosproject/onos - \
+                    it may take sometime if this is a first time pulling." )
+        stepResult = main.FALSE
+        main.step( "pull latest image from onosproject/onos")
+        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)")
+        image = DOCKERREPO + ":" + DOCKERTAG
+
+        main.step( "Create and (re)start docker container(s) if not already exist")
+        #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 latest image" )
+                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):
+        """
+        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;
+        5) deactivate apps and check app status
+
+        """
+        import time
+        import json
+
+        startupSleep = int(main.params["SLEEP"]["startup"])
+
+        appToAct = main.params["CASE110"]["apps"]
+        stepResult = main.FALSE
+
+        main.log.info( "Wait for startup, sleep (sec): " + str(startupSleep))
+        time.sleep(startupSleep)
+
+        main.step( "Check initial app states from onos1")
+        stepResult = 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)
+                    stepResult = 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"])
+                    stepResult = main.FALSE
+                    break;
+        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
+                                    onpass = "ONOS successfully started",
+                                    onfail = "Failed to start ONOS correctly" )
+        if stepResult is main.FALSE: main.skipCase()
+
+        main.step( "Form onos cluster using 'dependencies/onos-form-cluster' util")
+        stepResult = 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)
+            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): stepResult = main.TRUE
+
+        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
+                                    onpass = "ONOS successfully started",
+                                    onfail = "Failed to start ONOS correctly" )
+        if stepResult is main.FALSE: main.skipCase()
+
+        main.step( "Check cluster app status")
+        stepResult = 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)
+                    stepResult = 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"])
+                    stepResult = main.FALSE
+                    break
+        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
+                                    onpass = "ONOS successfully started",
+                                    onfail = "Failed to start ONOS correctly" )
+        if stepResult is main.FALSE: main.skipCase()
+
+        main.step(" Activate an APP from REST and check APP status")
+        appResults = list()
+        stepResult = 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)
+            stepResult = stepResult and appRslt
+        main.log.debug("Apps activation result for " + ",".join(applist) + ": " + str(appResults) ) 
+        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
+                                    onpass = "Successfully activated apps",
+                                    onfail = "Failed to activated apps correctly" )
+        if stepResult is main.FALSE: main.skipCase()
+
+        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" )
+        if stepResult is main.FALSE: main.skipCase()
+
+    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")
+        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 "onosproject/onos:latest 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( image = "<none>:<none>" )
+        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
+                                    onpass = "Succeeded in cleaning up images",
+                                    onfail = "Failed in cleaning up images" )
+
diff --git a/TestON/tests/PLAT/PLATdockertest/PLATdockertest.topo b/TestON/tests/PLAT/PLATdockertest/PLATdockertest.topo
new file mode 100755
index 0000000..3501864
--- /dev/null
+++ b/TestON/tests/PLAT/PLATdockertest/PLATdockertest.topo
@@ -0,0 +1,46 @@
+<TOPOLOGY>
+    <COMPONENT>
+        <ONOSbenchCli>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSbenchCli>
+
+        <ONOSbenchRest>
+            <host>localhost</host>
+            <port>8181</port>
+            <user>karaf</user>
+            <password>karaf</password>
+            <type>OnosRestDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSbenchRest>
+
+        <ONOSbenchDocker>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>DockerApiDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSbenchDocker>
+
+        <Mininet1>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>MininetCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS>
+                <home>~/mininet/custom/</home>
+            </COMPONENTS>
+        </Mininet1>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/PLAT/PLATdockertest/__init__.py b/TestON/tests/PLAT/PLATdockertest/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/PLAT/PLATdockertest/__init__.py
diff --git a/TestON/tests/PLAT/PLATdockertest/dependencies/Dependency/onos-form-cluster b/TestON/tests/PLAT/PLATdockertest/dependencies/Dependency/onos-form-cluster
new file mode 100755
index 0000000..3ccf2a5
--- /dev/null
+++ b/TestON/tests/PLAT/PLATdockertest/dependencies/Dependency/onos-form-cluster
@@ -0,0 +1,39 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+# Forms ONOS cluster using REST API of each separate instance.
+# -----------------------------------------------------------------------------
+
+[ $# -lt 2 ] && echo "usage: $(basename $0) ip1 ip2..." && exit 1
+
+# Scan arguments for user/password or other options...
+while getopts u:p: o; do
+    case "$o" in
+        u) user=$OPTARG;;
+        p) password=$OPTARG;;
+    esac
+done
+user=${user:-onos}           # user defaults to 'onos'
+password=${password:-$user}  # password defaults to user name if not specified
+let OPC=$OPTIND-1
+shift $OPC
+
+ip=$1
+shift
+nodes=$*
+
+ipPrefix=${ip%.*}
+
+aux=/tmp/${ipPrefix}.cluster.json
+trap "rm -f $aux" EXIT
+
+echo "{ \"nodes\": [ { \"ip\": \"$ip\" }" > $aux
+for node in $nodes; do
+    echo ", { \"ip\": \"$node\" }" >> $aux
+done
+echo "], \"ipPrefix\": \"$ipPrefix.*\" }" >> $aux
+
+for node in $ip $nodes; do
+    echo "Forming cluster on $node..."
+    curl --user $user:$password -X POST \
+        http://$node:8181/onos/v1/cluster/configuration -d @$aux
+done