"""
Copyright 2016 Open Networking Foundation ( ONF )

Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>

    TestON is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    ( at your option ) any later version.

    TestON is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
"""
"""
Insert network/ONOS/app events into CHOTestMonkey
Author: you@onlab.us
"""
import time
import random
from multiprocessing.connection import Client


def triggerEvent( type, scheduleMethod, *args ):
    """
    This function inserts an event into CHOTestMonkey
    """
    host = "localhost"
    port = 6000
    address = ( host, port )
    conn = Client( address )
    request = []
    request.append( 1 )
    request.append( type )
    request.append( scheduleMethod )
    for arg in args:
        request.append( arg )
    conn.send( request )
    response = conn.recv()
    while response == 11:
        conn.close()
        time.sleep( 1 )
        conn = Client( address )
        conn.send( request )
        response = conn.recv()
    if response == 10:
        print "Event inserted:", type, scheduleMethod, args
    elif response == 20:
        print "Unknown message to server"
    elif response == 21:
        print "Unknown event type to server"
    elif response == 22:
        print "Unknown schedule method to server"
    elif response == 23:
        print "Not enough argument"
    else:
        print "Unknown response from server:", response
    conn.close()


def testLoop( sleepTime=5 ):
    downLinkNum = 0
    downDeviceNum = 0
    while True:
        r = random.random()
        if r < 0.2:
            triggerEvent( 'NETWORK_LINK_DOWN', 'RUN_BLOCK', 'random', 'random' )
            downLinkNum += 1
            time.sleep( sleepTime )
        elif r < 0.4:
            triggerEvent( 'NETWORK_DEVICE_DOWN', 'RUN_BLOCK', 'random' )
            downDeviceNum += 1
            time.sleep( sleepTime * 2 )
        elif r < 0.7 and downLinkNum > 0:
            triggerEvent( 'NETWORK_LINK_UP', 'RUN_BLOCK', 'random', 'random' )
            downLinkNum -= 1
            time.sleep( sleepTime )
        elif downDeviceNum > 0:
            triggerEvent( 'NETWORK_DEVICE_UP', 'RUN_BLOCK', 'random' )
            downDeviceNum -= 1
            time.sleep( sleepTime * 2 )
        else:
            pass


def replayFromFile( filePath='/home/admin/event-list', sleepTime=1 ):
    try:
        f = open( filePath, 'r' )
        for line in f.readlines():
            event = line.split()
            if event[ 3 ].startswith( 'CHECK' ):
                continue
            triggerEvent( event[ 3 ], 'RUN_BLOCK', *event[ 4: ] )
            time.sleep( sleepTime )
        f.close()
    except Exception as e:
        print e

if __name__ == '__main__':
    # testLoop( 2 )
    replayFromFile()
