Add tests of topology APIs to STC smoke test.
Change-Id: Ie993df1c8a4150a1b4467cc3cffe54eec6f64d43
diff --git a/tools/test/scenarios/bin/find-link-in-cluster.py b/tools/test/scenarios/bin/find-link-in-cluster.py
new file mode 100755
index 0000000..928531f
--- /dev/null
+++ b/tools/test/scenarios/bin/find-link-in-cluster.py
@@ -0,0 +1,54 @@
+#! /usr/bin/env python
+
+import requests
+import sys
+
+from requests.auth import HTTPBasicAuth
+
+if len(sys.argv) != 9:
+ print "usage: find-link-in-cluster onos-node name cluster-id expected-length src-device-id src-port dst-device-id dst-port"
+ sys.exit(1)
+
+node = sys.argv[1]
+name = sys.argv[2]
+cluster = sys.argv[3]
+length = int(sys.argv[4])
+srcDeviceId = sys.argv[5]
+srcPort = sys.argv[6]
+dstDeviceId = sys.argv[7]
+dstPort = sys.argv[8]
+
+
+linksRequest = requests.get('http://' + node + ':8181/onos/v1/topology/clusters/'
+ + cluster + '/links',
+ auth=HTTPBasicAuth('onos', 'rocks'))
+
+if linksRequest.status_code != 200:
+ print linksRequest.text
+ sys.exit(1)
+
+linksJson = linksRequest.json()
+linksLength = len(linksJson["links"])
+
+if linksLength != length:
+ print "Expected length {} but got {}".format(length, linksLength)
+ sys.exit(1)
+
+for link in linksJson["links"]:
+ if srcDeviceId == link["src"]["device"] and srcPort == link["src"]["port"]:
+ if dstDeviceId == link["dst"]["device"] and dstPort == link["dst"]["port"]:
+ print "@stc " + name + "SrcDevice=" + link["src"]["device"]
+ print "@stc " + name + "SrcPort=" + link["src"]["port"]
+ print "@stc " + name + "DstDevice=" + link["dst"]["device"]
+ print "@stc " + name + "DstPort=" + link["dst"]["port"]
+ print "@stc " + name + "Type=" + link["type"]
+ print "@stc " + name + "State=" + link["state"]
+ sys.exit(0)
+
+print "Could not find link from {}:{} to {}:{}"\
+ .format(srcDeviceId, srcPort, dstDeviceId, dstPort)
+sys.exit(1)
+
+
+
+
diff --git a/tools/test/scenarios/bin/find-topo-infrastructure.py b/tools/test/scenarios/bin/find-topo-infrastructure.py
new file mode 100755
index 0000000..6d1970f
--- /dev/null
+++ b/tools/test/scenarios/bin/find-topo-infrastructure.py
@@ -0,0 +1,34 @@
+#! /usr/bin/env python
+
+import requests
+import sys
+import urllib
+
+from requests.auth import HTTPBasicAuth
+
+if len(sys.argv) != 4:
+ print "usage: find-topo-infrastructure onos-node name connect-point"
+ sys.exit(1)
+
+node = sys.argv[1]
+name = sys.argv[2]
+id = sys.argv[3]
+
+infrastructureRequest = requests.get('http://' + node + ':8181/onos/v1/topology/infrastructure/' +
+ urllib.quote_plus(id),
+ auth=HTTPBasicAuth('onos', 'rocks'))
+
+if infrastructureRequest.status_code != 200:
+ print infrastructureRequest.text
+ sys.exit(1)
+
+infrastructureJson = infrastructureRequest.json()
+
+print "@stc " + name + "Infrastructure=" + str(infrastructureJson["infrastructure"])
+
+sys.exit(0)
+
+
+
+
+
diff --git a/tools/test/scenarios/bin/query-cluster.py b/tools/test/scenarios/bin/query-cluster.py
new file mode 100755
index 0000000..0cac7ac
--- /dev/null
+++ b/tools/test/scenarios/bin/query-cluster.py
@@ -0,0 +1,37 @@
+#! /usr/bin/env python
+
+import requests
+import sys
+import urllib
+
+from requests.auth import HTTPBasicAuth
+
+if len(sys.argv) != 4:
+ print "usage: query-cluster onos-node name cluster-number"
+ sys.exit(1)
+
+node = sys.argv[1]
+name = sys.argv[2]
+cluster = sys.argv[3]
+
+topoRequest = requests.get('http://' + node + ':8181/onos/v1/topology/clusters/'
+ + cluster,
+ auth=HTTPBasicAuth('onos', 'rocks'))
+
+if topoRequest.status_code != 200:
+ print topoRequest.text
+ sys.exit(1)
+
+topoJson = topoRequest.json()
+
+print "@stc " + name + "Id=" + str(topoJson["id"])
+print "@stc " + name + "DeviceCount=" + str(topoJson["deviceCount"])
+print "@stc " + name + "LinkCount=" + str(topoJson["linkCount"])
+print "@stc " + name + "Root=" + topoJson["root"]
+
+sys.exit(0)
+
+
+
+
+
diff --git a/tools/test/scenarios/bin/query-topo.py b/tools/test/scenarios/bin/query-topo.py
new file mode 100755
index 0000000..9b81b4e
--- /dev/null
+++ b/tools/test/scenarios/bin/query-topo.py
@@ -0,0 +1,35 @@
+#! /usr/bin/env python
+
+import requests
+import sys
+import urllib
+
+from requests.auth import HTTPBasicAuth
+
+if len(sys.argv) != 3:
+ print "usage: query-topo onos-node name"
+ sys.exit(1)
+
+node = sys.argv[1]
+name = sys.argv[2]
+
+topoRequest = requests.get('http://' + node + ':8181/onos/v1/topology/',
+ auth=HTTPBasicAuth('onos', 'rocks'))
+
+if topoRequest.status_code != 200:
+ print topoRequest.text
+ sys.exit(1)
+
+topoJson = topoRequest.json()
+
+print "@stc " + name + "Time=" + str(topoJson["time"])
+print "@stc " + name + "Devices=" + str(topoJson["devices"])
+print "@stc " + name + "Links=" + str(topoJson["links"])
+print "@stc " + name + "Clusters=" + str(topoJson["clusters"])
+
+sys.exit(0)
+
+
+
+
+
diff --git a/tools/test/scenarios/bin/verify-topo-devices.py b/tools/test/scenarios/bin/verify-topo-devices.py
new file mode 100755
index 0000000..be834b9
--- /dev/null
+++ b/tools/test/scenarios/bin/verify-topo-devices.py
@@ -0,0 +1,51 @@
+#! /usr/bin/env python
+
+import requests
+import sys
+import urllib
+
+from requests.auth import HTTPBasicAuth
+
+if len(sys.argv) != 5:
+ print "usage: verify-topo-links onos-node cluster-id first-index last-index"
+ sys.exit(1)
+
+node = sys.argv[1]
+cluster = sys.argv[2]
+first = int(sys.argv[3])
+last = int(sys.argv[4])
+
+found = 0
+
+topoRequest = requests.get('http://' + node + ':8181/onos/v1/topology/clusters/'
+ + cluster
+ + "/devices",
+ auth=HTTPBasicAuth('onos', 'rocks'))
+
+if topoRequest.status_code != 200:
+ print topoRequest.text
+ sys.exit(1)
+
+topoJson = topoRequest.json()
+
+for deviceIndex in range(first, last+1):
+ lookingFor = "of:" + format(deviceIndex, '016x')
+ print lookingFor
+ for arrayIndex in range(0, len(topoJson["devices"])):
+ device = topoJson["devices"][arrayIndex]
+ if device == lookingFor:
+ found = found + 1
+ print "Match found for " + device
+ break
+
+
+if found == last - first:
+ sys.exit(0)
+
+print "Found " + str(found) + " matches, need " + str(last - first)
+sys.exit(2)
+
+
+
+
+
diff --git a/tools/test/scenarios/net-smoke.xml b/tools/test/scenarios/net-smoke.xml
index 53a5729..2aad758 100644
--- a/tools/test/scenarios/net-smoke.xml
+++ b/tools/test/scenarios/net-smoke.xml
@@ -35,6 +35,9 @@
<import file="${ONOS_SCENARIOS}/net-create-flows.xml"/>
<dependency name="Net-Create-Flows" requires="Net-Setup,P2P-Intent-Connectivity,Net-REST"/>
+ <import file="${ONOS_SCENARIOS}/net-topo.xml"/>
+ <dependency name="Net-topo" requires="Net-Setup,Net-Create-Flows"/>
+
<import file="${ONOS_SCENARIOS}/net-teardown.xml"/>
<dependency name="Net-Teardown" requires="~Host-Intent-Connectivity,
~P2P-Intent-Connectivity,
diff --git a/tools/test/scenarios/net-topo.xml b/tools/test/scenarios/net-topo.xml
new file mode 100644
index 0000000..e8e2399
--- /dev/null
+++ b/tools/test/scenarios/net-topo.xml
@@ -0,0 +1,76 @@
+<!--
+ ~ Copyright 2015 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<scenario name="net-topo"
+ description="Network topology test">
+ <!-- TODO: parametrize this via recipes -->
+ <group name="Net-topo">
+
+ <!-- Verify the overall topology using the REST API -->
+ <step name="Net-topo.Query-Topo"
+ exec="query-topo.py ${OC1} topo"/>
+ <step name="Net-topo.Verify-Topo-Devices" requires="Net-topo.Query-Topo"
+ exec="test ${topoDevices} == 25"/>
+ <step name="Net-topo.Verify-Topo-Links" requires="Net-topo.Query-Topo"
+ exec="test ${topoLinks} == 140"/>
+ <step name="Net-topo.Verify-Topo-Clusters" requires="Net-topo.Query-Topo"
+ exec="test ${topoClusters} == 1"/>
+
+ <!-- Verify the cluster topology using the REST API -->
+ <step name="Net-topo.Query-Cluster0"
+ exec="query-cluster.py ${OC1} clusterTopo0 0"/>
+ <step name="Net-topo.Verify-Cluster0-Id" requires="Net-topo.Query-Cluster0"
+ exec="test ${clusterTopo0Id} == 0"/>
+ <step name="Net-topo.Verify-Cluster0-DeviceCount" requires="Net-topo.Query-Cluster0"
+ exec="test ${clusterTopo0DeviceCount} == 25"/>
+ <step name="Net-topo.Verify-Cluster0-LinkCount" requires="Net-topo.Query-Cluster0"
+ exec="test ${clusterTopo0LinkCount} == 140"/>
+ <step name="Net-topo.Verify-Cluster0-Root" requires="Net-topo.Query-Cluster0"
+ exec="test '${clusterTopo0Root}' == 'of:000000000000000a'"/>
+
+ <!-- Verify the list of devices for the cluster -->
+ <step name="Net-topo.Verify-Cluster0-Devices"
+ exec="verify-topo-devices.py ${OC1} 0 0 24"/>
+
+ <!-- Spot check some known links in the topology -->
+ <step name="Net-topo.Verify-Cluster0-Link1"
+ exec="find-link-in-cluster.py ${OC1} link1 0 140 of:000000000000000f 8 of:0000000000000015 3"/>
+ <step name="Net-topo.Verify-Cluster0-Link2"
+ exec="find-link-in-cluster.py ${OC1} link2 0 140 of:0000000000000008 3 of:0000000000000005 4"/>
+ <step name="Net-topo.Verify-Cluster0-Link3"
+ exec="find-link-in-cluster.py ${OC1} link3 0 140 of:0000000000000011 2 of:0000000000000002 9"/>
+ <step name="Net-topo.Verify-Cluster0-Link4"
+ exec="find-link-in-cluster.py ${OC1} link4 0 140 of:000000000000000f 3 of:000000000000000d 10"/>
+ <step name="Net-topo.Verify-Cluster0-Link5"
+ exec="find-link-in-cluster.py ${OC1} link5 0 140 of:000000000000000d 13 of:0000000000000010 6"/>
+
+ <!-- Verify the topology infrastructure query -->
+ <step name="Net-topo.Query-Cluster0-Infra1"
+ exec="find-topo-infrastructure.py ${OC1} infra1 of:000000000000000f:8"/>
+ <step name="Net-topo.Verify-Cluster0-Infra1" requires="Net-topo.Query-Cluster0-Infra1"
+ exec="test '${infra1Infrastructure}' == 'True'"/>
+
+ <step name="Net-topo.Query-Cluster0-Infra2"
+ exec="find-topo-infrastructure.py ${OC1} infra2 of:000000000000000d:8"/>
+ <step name="Net-topo.Verify-Cluster0-Infra2" requires="Net-topo.Query-Cluster0-Infra2"
+ exec="test '${infra2Infrastructure}' == 'True'"/>
+
+ <step name="Net-topo.Query-Cluster0-Infra3"
+ exec="find-topo-infrastructure.py ${OC1} infra3 of:0000000000000012:8"/>
+ <step name="Net-topo.Verify-Cluster0-Infra3" requires="Net-topo.Query-Cluster0-Infra3"
+ exec="test '${infra3Infrastructure}' == 'False'"/>
+
+ </group>
+</scenario>