#!/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( 'locations' )[ 0 ]  # Only looking for first interface
                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 )
