def __init__( self ):
    self.default = ''

def consistentCheck():
    """
    Checks that TestON counters are consistent across all nodes.

    Returns the tuple (onosCounters, consistent)
    - onosCounters is the parsed json output of the counters command on all nodes
    - consistent is main.TRUE if all "TestON" counters are consitent across all
        nodes or main.FALSE
    """
    import json
    correctResults = main.TRUE
    # Get onos counters results
    onosCountersRaw = []
    threads = []
    for i in range( main.numCtrls ):
        t = main.Thread( target=main.CLIs[i].counters,
                         name="counters-" + str( i ) )
        threads.append( t )
        t.start()
    for t in threads:
        t.join()
        onosCountersRaw.append( t.result )
    onosCounters = []
    for i in range( main.numCtrls ):
        try:
            onosCounters.append( json.loads( onosCountersRaw[i] ) )
        except ( ValueError, TypeError ):
            main.log.error( "Could not parse counters response from ONOS" +
                            str( i + 1 ) )
            main.log.warn( repr( onosCountersRaw[ i ] ) )
            return main.FALSE

    testCounters = {}
    # make a list of all the "TestON-*" counters in ONOS
    # lookes like a dict whose keys are the name of the ONOS node and values
    # are a list of the counters. I.E.
    # { "ONOS1": [ {"name":"TestON-inMemory","value":56},
    #              {"name":"TestON-Partitions","value":56} ]
    # }
    # NOTE: There is an assumtion that all nodes are active
    #        based on the above for loops
    for controller in enumerate( onosCounters ):
        for dbType in controller[1]:
            for dbName, items in dbType.iteritems():
                for item in items:
                    if 'TestON' in item['name']:
                        node = 'ONOS' + str( controller[0] + 1 )
                        try:
                            testCounters[node].append( item )
                        except KeyError:
                            testCounters[node] = [ item ]
    # compare the counters on each node
    tmp = [ v == testCounters['ONOS1'] for k, v in testCounters.iteritems() ]
    if all( tmp ):
        consistent = main.TRUE
    else:
        consistent = main.FALSE
        main.log.error( "ONOS nodes have different values for counters:\n" +
                        testCounters )
    return ( onosCounters, consistent )

def counterCheck( counterName, counterValue ):
    """
    Checks that TestON counters are consistent across all nodes and that
    specified counter is in ONOS with the given value
    """
    import json
    correctResults = main.TRUE
    # Get onos counters results and consistentCheck
    onosCounters, consistent = main.Counters.consistentCheck()
    # Check for correct values
    for i in range( main.numCtrls ):
        current = onosCounters[i]
        onosValue = None
        try:
            for database in current:
                database = database.values()[0]
                for counter in database:
                    if counter.get( 'name' ) == counterName:
                        onosValue = counter.get( 'value' )
                        break
        except AttributeError, e:
            main.log.error( "ONOS" + str( i + 1 ) + " counters result " +
                            "is not as expected" )
            correctResults = main.FALSE
        if onosValue == counterValue:
            main.log.info( counterName + " counter value is correct" )
        else:
            main.log.error( counterName + " counter value is incorrect," +
                            " expected value: " + str( counterValue )
                            + " current value: " + str( onosValue ) )
            correctResults = main.FALSE
    return consistent and correctResults
