Add python script to test host attachment points for the obelisk network

Change-Id: I68560a31cce8b12d9626cfdaa8cb5acc0f20dc12
diff --git a/tools/test/topos/obeliskHostCheck.py b/tools/test/topos/obeliskHostCheck.py
new file mode 100755
index 0000000..e928f89
--- /dev/null
+++ b/tools/test/topos/obeliskHostCheck.py
@@ -0,0 +1,91 @@
+#!/usr/bin/python
+
+import sys
+import os
+import json
+
+# TODO: if none given, use OCI
+try:
+    onosIp = sys.argv[1]
+    print "Reading hosts view from ONOS node " + onosIp + ":"
+except Exception as e:
+    print "Error reading ONOS IP arguement"
+    print e
+# Grab the json objects from ONOS
+output = os.popen("onos " + onosIp + " \"hosts -j\"" )
+hosts = json.loads( output.read() )
+#hosts = json.loads( output.split( 'Logging in as karaf\n' )[1] )
+
+hostAttachment = True
+# FIXME: topo-HA/obelisk specific mappings:
+# key is mac and value is dpid
+mappings = {}
+for i in range( 1, 29 ):  # hosts 1 through 28
+    # set up correct variables:
+    macId = "00:" * 5 + hex( i ).split( "0x" )[1].upper().zfill(2)
+    if i == 1:
+        deviceId = "1000".zfill(16)
+    elif i == 2:
+        deviceId = "2000".zfill(16)
+    elif i == 3:
+        deviceId = "3000".zfill(16)
+    elif i == 4:
+        deviceId = "3004".zfill(16)
+    elif i == 5:
+        deviceId = "5000".zfill(16)
+    elif i == 6:
+        deviceId = "6000".zfill(16)
+    elif i == 7:
+        deviceId = "6007".zfill(16)
+    elif i >= 8 and i <= 17:
+        dpid = '3' + str( i ).zfill( 3 )
+        deviceId = dpid.zfill(16)
+    elif i >= 18 and i <= 27:
+        dpid = '6' + str( i ).zfill( 3 )
+        deviceId = dpid.zfill(16)
+    elif i == 28:
+        deviceId = "2800".zfill(16)
+    mappings[ macId ] = deviceId
+
+if hosts or "Error" not in hosts:
+    if hosts == []:
+        print "WARNING: There are no hosts discovered"
+    else:
+        for host in hosts:
+            mac = None
+            location = None
+            device = None
+            port = None
+            try:
+                mac = host.get( 'mac' )
+                assert mac, "mac field could not be found for this host object"
+
+                location = host.get( 'location' )
+                assert location, "location field could not be found for this host object"
+
+                # Trim the protocol identifier off deviceId
+                device = str( location.get( 'elementId' ) ).split(':')[1]
+                assert device, "elementId field could not be found for this host location object"
+
+                port = location.get( 'port' )
+                assert port, "port field could not be found for this host location object"
+
+                # Now check if this matches where they should be
+                if mac and device and port:
+                    if device != mappings[ str( mac ) ]:
+                        print "The attachment device is incorrect for host " + str( mac ) +\
+                              ". Expected: " + mappings[ str( mac ) ] + "; Actual: " + device
+                        hostAttachment = False
+                    if str( port ) != "1":
+                        print "The attachment port is incorrect for host " + str( mac ) +\
+                              ". Expected: 1; Actual: " + str( port)
+                        hostAttachment = False
+                else:
+                    hostAttachment = False
+            except AssertionError as e:
+                print "ERROR: Json object not as expected:"
+                print e
+                print "host object: " + repr( host )
+                hostAttachment = False
+else:
+    print "No hosts json output or \"Error\" in output. hosts = " + repr( hosts )