#!/usr/bin/env python
'''
Created on 31-May-2013 

@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)      

    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/>.        


''' 
import time
import pexpect
import struct, fcntl, os, sys, signal
import sys
import re
import json
sys.path.append("../")
from drivers.common.clidriver import CLI

class OnosCliDriver(CLI):
    
    def __init__(self):
        super(CLI, self).__init__()
        
    def connect(self,**connectargs):
	'''
        Creates ssh handle for ONOS. 
        '''
        for key in connectargs:
           vars(self)[key] = connectargs[key]

        
        self.name = self.options['name']
        self.handle = super(OnosCliDriver,self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd)

        if self.handle:
            #self.start()
            #self.start_rest()
            return self.handle
        else :
            main.log.info("NO HANDLE")
            return main.FALSE
        
    def start(self):
        '''
        Starts ONOS on remote machine.
        Returns false if any errors were encountered. 
        '''
        self.handle.sendline("")
        self.handle.expect("\$")
        self.handle.sendline("~/ONOS/start-onos.sh start")
        self.handle.expect("onos.sh start")
        i=self.handle.expect(["Starting\sONOS\scontroller","Cassandra\sis\snot\srunning"])
        if i==0:
            try: 
                self.handle.expect("\$", timeout=60)
                main.log.info("ONOS Started ") 
            except:  
                main.log.info("ONOS NOT Started, stuck while waiting for it to start ") 
                return main.FALSE
            return main.TRUE
        elif i==1:
            main.log.error("ONOS didn't start because cassandra wasn't running.") 
            return main.FALSE
        
        main.log.error("ONOS expect script missed something... ") 
        return main.FALSE
    
    def link_down(self, **linkParams):
        '''
        Specifically used for the ONOS demo on the HW.
        Should be replaced by actual switch drivers in the future.
        '''
        args = utilities.parse_args(["SDPID","SPORT","DDPID","DPORT"], **linkParams)
        sdpid = args["SDPID"] if args["SDPID"] != None else "00:00:00:00:ba:5e:ba:13"
        sport = args["SPORT"] if args["SPORT"] != None else "22"
        ddpid = args["DDPID"] if args["DDPID"] != None else "00:00:20:4e:7f:51:8a:35"
        dport = args["DPORT"] if args["DPORT"] != None else "22"
       
        cmd = "curl -s  10.128.4.11:9000/gui/link/down/" + sdpid + "/" + sport + "/" + ddpid + "/" + dport + " > /tmp/log &"
        os.popen( cmd ) 

    def link_up(self, **linkParams):
        '''
        Specifically used for the ONOS demo on the HW.
        Should be replaced by actual switch drivers in the future.
        '''
        args = utilities.parse_args(["SDPID","SPORT","DDPID","DPORT"], **linkParams)
        sdpid = args["SDPID"] if args["SDPID"] != None else "00:00:00:00:ba:5e:ba:13"
        sport = args["SPORT"] if args["SPORT"] != None else "22"
        ddpid = args["DDPID"] if args["DDPID"] != None else "00:00:20:4e:7f:51:8a:35"
        dport = args["DPORT"] if args["DPORT"] != None else "22"
       
        cmd = "curl -s  10.128.4.11:9000/gui/link/up/" + sdpid + "/" + sport + "/" + ddpid + "/" + dport + " > /tmp/log &"
        os.popen( cmd ) 

    def start_rest(self):
        '''
        Starts the rest server on ONOS.
        '''
        response = self.execute(cmd="~/ONOS/start-rest.sh start",prompt="\$",timeout=10)
        if re.search("admin",response):
            main.log.info("Rest Server Started Successfully")
            time.sleep(5)
            return main.TRUE
        else :
            main.log.warn("Failed to start Rest Server")   
            return main.FALSE     
        
    def status(self):
        '''
        Called start-onos.sh status and returns TRUE/FALSE accordingly 
        '''
        self.execute(cmd="\r",prompt="\$",timeout=10)
        response = self.execute(cmd="~/ONOS/start-onos.sh status ",prompt="\d+\sinstance\sof\sonos\srunning",timeout=10)
        self.execute(cmd="\r",prompt="\$",timeout=10)
        if re.search("1\sinstance\sof\sonos\srunning",response):
            return main.TRUE
        elif re.search("0\sinstance\sof\sonos\srunning",response):
            return main.FALSE
        else :
            return main.FALSE

    def isup(self):
        '''
        A more complete check to see if ONOS is up and running properly. 
        First, it checks if the process is up. 
        Second, it reads the logs for "Exception: Connection refused" 
        Third, it makes sure the logs are actually moving. 
        returns TRUE/FALSE accordingly.
        '''
        self.execute(cmd="\r",prompt="\$",timeout=10)
        response = self.execute(cmd="~/ONOS/start-onos.sh status ",prompt="running",timeout=10)
        self.execute(cmd="\r",prompt="\$",timeout=10)
        tail1 = self.execute(cmd="tail ~/ONOS/onos-logs/onos.*.log",prompt="\$",timeout=10)
        time.sleep(2)
        self.execute(cmd="\r",prompt="\$",timeout=10)
        tail2 = self.execute(cmd="tail ~/ONOS/onos-logs/onos.*.log",prompt="\$",timeout=10)
        pattern = '(.*)1 instance(.*)'
        pattern2 = '(.*)Exception: Connection refused(.*)'
        if utilities.assert_matches(expect=pattern,actual=response,onpass="ONOS process is running...",onfail="ONOS process not running..."):
            if tail1 == tail2:
                main.log.error("ONOS is frozen...")
                return main.FALSE
            elif re.search( pattern2,tail1 ):
                main.log.info("Connection Refused found in onos log") 
                return main.FALSE
            elif re.search( pattern2,tail2 ):
                main.log.info("Connection Refused found in onos log") 
                return main.FALSE
            else:
                main.log.info("Onos log is moving! It's looking good!")
                return main.TRUE
        else:
            return main.FALSE

    
    def rest_status(self): 
        '''
        Checks if the rest server is running. 
        '''
        response = self.execute(cmd="~/ONOS/start-rest.sh status ",prompt="running",timeout=10)
        if re.search("rest\sserver\sis\srunning",response):
            main.log.info("Rest Server is running")
        elif re.search("rest\sserver\sis\snot\srunning",response):
            main.log.warn("Rest Server is not Running")
        else :
            main.log.error("No response" +response)
        self.execute(cmd="\r",prompt="\$",timeout=10)
        
        return response
    
    def stop(self):
        '''
        Runs ./start-onos.sh stop to stop ONOS
        '''
        self.handle.sendline("")
        self.handle.expect("\$")
        self.handle.sendline("~/ONOS/start-onos.sh stop")
        self.handle.expect("stop", 2)
        result = self.handle.before 
        self.handle.expect("\$", 60)
        if re.search("Killed", result):
            main.log.info("ONOS Killed Successfully")
            return main.TRUE
        else :
            main.log.warn("ONOS wasn't running")
            return main.FALSE
    
    def rest_stop(self):
        '''
        Runs ./start-rest.sh stop to stop ONOS rest server
        '''
        response = self.execute(cmd="~/ONOS/start-rest.sh stop ",prompt="killing",timeout=10)
        self.execute(cmd="\r",prompt="\$",timeout=10)
        if re.search("killing", response):
            main.log.info("Rest Server Stopped")
            return main.TRUE
        else :
            main.log.error("Failed to Stop, Rest Server is not Running")
            return main.FALSE
        
    def disconnect(self):
        '''
        Called when Test is complete to disconnect the ONOS handle.  
        '''
        response = ''
        try:
            self.handle.sendline("exit")
            self.handle.expect("closed")
        except: 
            main.log.error("Connection failed to the host")
            response = main.FALSE
        return response
 
    def get_version(self):
        ''' 
        Writes the COMMIT number to the report to be parsed by Jenkins data collecter.  
        ''' 
        self.handle.sendline("cat /home/admin/ONOS/.git/ORIG_HEAD")
        self.handle.expect("ORIG_HEAD")
        self.handle.expect("\$")
        main.log.report( "COMMIT: " + str(self.handle.before + self.handle.after))

    def add_flow(self, path):
        ''' 
        Copies the flowdef file from TestStation -> ONOS machine
        Then runs ./add_flow.py to add the flows to ONOS
        ''' 
        main.log.info("Adding Flows...")
        self.handle.sendline("scp admin@10.128.7.7:%s /tmp/flowtmp" % path) 
        self.handle.expect("100%")
        self.handle.expect("\$", 30)
        self.handle.sendline("~/ONOS/web/add_flow.py -m onos -f /tmp/flowtmp") 
        self.handle.expect("add_flow")
        self.handle.expect("\$", 1000)
        main.log.info("Flows added")

    def delete_flow(self, *delParams):
        '''
        Deletes a specific flow, a range of flows, or all flows.
        '''
        if len(delParams)==1:
             if str(delParams[0])=="all":
                  main.log.info("Deleting ALL flows...")
                  #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh all",prompt="done",timeout=150)
                  self.handle.sendline("~/ONOS/web/delete_flow.py all")
                  self.handle.expect("delete_flow")
                  self.handle.expect("\$",1000)
                  self.handle.sendline("~/ONOS/web/clear_flow.py all")
                  self.handle.expect("clear_flow")
                  self.handle.expect("\$",1000)
                  main.log.info("Flows deleted")
             else:
                  main.log.info("Deleting flow "+str(delParams[0])+"...")
                  #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh "+str(delParams[0]),prompt="done",timeout=150)
                  #self.execute(cmd="\n",prompt="\$",timeout=60)
                  self.handle.sendline("~/ONOS/web/delete_flow.py %d" % int(delParams[0]))
                  self.handle.expect("delete_flow")
                  self.handle.expect("\$",60)
                  self.handle.sendline("~/ONOS/web/clear_flow.py %d" % int(delParams[0]))
                  self.handle.expect("clear_flow")
                  self.handle.expect("\$",60)
                  main.log.info("Flow deleted")
        elif len(delParams)==2:
             main.log.info("Deleting flows "+str(delParams[0])+" through "+str(delParams[1])+"...")
             #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh "+str(delParams[0])+" "+str(delParams[1]),prompt="done",timeout=150)
             #self.execute(cmd="\n",prompt="\$",timeout=60)
             self.handle.sendline("~/ONOS/web/delete_flow.py %d %d" % (int(delParams[0]), int(delParams[1])))
             self.handle.expect("delete_flow")
             self.handle.expect("\$",600)
             self.handle.sendline("~/ONOS/web/clear_flow.py %d %d" % (int(delParams[0]), int(delParams[1])))
             self.handle.expect("clear_flow")
             self.handle.expect("\$",600)
             main.log.info("Flows deleted")

    def check_flow(self):
        '''
        Calls the ./get_flow.py all and checks:
          - If each FlowPath has at least one FlowEntry  
          - That there are no "NOT"s found
        returns TRUE/FALSE 
        '''
        flowEntryDetect = 1
        count = 0
        self.handle.sendline("clear")
        time.sleep(1)
        self.handle.sendline("~/ONOS/web/get_flow.py all")
        self.handle.expect("get_flow")
        while 1:
            i=self.handle.expect(['FlowPath','FlowEntry','NOT','\$',pexpect.TIMEOUT],timeout=180)
            if i==0:
                count = count + 1
                if flowEntryDetect == 0:
                    main.log.info("FlowPath without FlowEntry")
                    return main.FALSE
                else:
                    flowEntryDetect = 0
            elif i==1:
                flowEntryDetect = 1
            elif i==2:
                main.log.error("Found a NOT")
                return main.FALSE
            elif i==3:
                if count == 0:
                    main.log.info("There don't seem to be any flows here...")
                    return main.FALSE
                else:
                    main.log.info("All flows pass")
                    main.log.info("Number of FlowPaths: "+str(count))
                    return main.TRUE
            elif i==4:
                main.log.error("Command Timeout!")
                return main.FALSE

    def get_flow(self, *flowParams):
         '''
         Returns verbose output of ./get_flow.py
         '''
         if len(flowParams)==1:
              if str(flowParams[0])=="all":
                   self.execute(cmd="\n",prompt="\$",timeout=60)
                   main.log.info("Getting all flow data...")
                   data = self.execute(cmd="~/ONOS/scripts/TestON_get_flow.sh all",prompt="done",timeout=150)
                   self.execute(cmd="\n",prompt="\$",timeout=60)
                   return data
              else:
                   main.log.info("Retrieving flow "+str(flowParams[0])+" data...")
                   data = self.execute(cmd="~/ONOS/scripts/TestON_get_flow.sh "+str(flowParams[0]),prompt="done",timeout=150)
                   self.execute(cmd="\n",prompt="\$",timeout=60)
                   return data
         elif len(flowParams)==5:
              main.log.info("Retrieving flow installer data...")
              data = self.execute(cmd="~/ONOS/scripts/TestON_get_flow.sh "+str(flowParams[0])+" "+str(flowParams[1])+" "+str(flowParams[2])+" "+str(flowParams[3])+" "+str(flowParams[4]),prompt="done",timeout=150)
              self.execute(cmd="\n",prompt="\$",timeout=60)
              return data
         elif len(flowParams)==4:
              main.log.info("Retrieving flow endpoints...")
              data = self.execute(cmd="~/ONOS/scripts/TestON_get_flow.sh "+str(flowParams[0])+" "+str(flowParams[1])+" "+str(flowParams[2])+" "+str(flowParams[3]),prompt="done",timeout=150)
              self.execute(cmd="\n",prompt="\$",timeout=60)
              return data


# http://localhost:8080/wm/core/topology/switches/all/json
# http://localhost:8080/wm/core/topology/links/json
# http://localhost:8080/wm/registry/controllers/json
# http://localhost:8080/wm/registry/switches/json"

    def get_json(self, url):
        '''
        Helper functions used to parse the json output of a rest call 
        '''
        try:
            command = "curl -s %s" % (url)
            result = os.popen(command).read()
            parsedResult = json.loads(result)
        except:
            print "REST IF %s has issue" % command
            parsedResult = ""
    
        if type(parsedResult) == 'dict' and parsedResult.has_key('code'):
            print "REST %s returned code %s" % (command, parsedResult['code'])
            parsedResult = ""
        return parsedResult 

    def check_switch(self,RestIP,correct_nr_switch ):
        ''' 
        Used by check_status 
        ''' 
        buf = ""
        retcode = 0
        RestPort="8080"
        url="http://%s:%s/wm/core/topology/switches/all/json" % (RestIP, RestPort)
        parsedResult = self.get_json(url)
        if parsedResult == "":
            retcode = 1
            return (retcode, "Rest API has an issue")
        url = "http://%s:%s/wm/registry/switches/json" % (RestIP, RestPort)
        registry = self.get_json(url)
    
        if registry == "":
            retcode = 1
            return (retcode, "Rest API has an issue")
    
        cnt = 0
        active = 0

        for s in parsedResult:
            cnt += 1
            if s['state']  == "ACTIVE":
               active += 1

        buf += "switch: network %d : %d switches %d active\n" % (0+1, cnt, active)
        if correct_nr_switch != cnt:
            buf += "switch fail: network %d should have %d switches but has %d\n" % (1, correct_nr_switch, cnt)
            retcode = 1

        if correct_nr_switch != active:
            buf += "switch fail: network %d should have %d active switches but has %d\n" % (1, correct_nr_switch, active)
            retcode = 1
    
        return (retcode, buf)

    def check_link(self,RestIP, nr_links):
        ''' 
        Used by check_status 
        ''' 
        RestPort = "8080"
        buf = ""
        retcode = 0
    
        url = "http://%s:%s/wm/core/topology/links/json" % (RestIP, RestPort)
        parsedResult = self.get_json(url)
    
        if parsedResult == "":
            retcode = 1
            return (retcode, "Rest API has an issue")
    
        buf += "link: total %d links (correct : %d)\n" % (len(parsedResult), nr_links)
        intra = 0
        interlink=0
    
        for s in parsedResult:
            intra = intra + 1 
    
        if intra != nr_links:
            buf += "link fail\n"
            retcode = 1
    
        return (retcode, buf)

    def check_status_report(self, ip, numoswitch, numolink):
        ''' 
        Checks the number of swithes & links that ONOS sees against the supplied values.
        Writes to the report log.  
        ''' 
        main.log.info("Making some rest calls...") 
        switch = self.check_switch(ip, int(numoswitch))
        link = self.check_link(ip, int(numolink))
        value = switch[0]
        value += link[0]
        main.log.report( "\n-----\n%s%s-----\n" % ( switch[1], link[1]) )
        if value != 0:
            return 0
        else: 
            # "PASS"
            return 1

    def check_status(self, ip, numoswitch, numolink):
        ''' 
        Checks the number of swithes & links that ONOS sees against the supplied values.
        Writes to the main log.  
        ''' 
        main.log.info("Making some rest calls...") 
        switch = self.check_switch(ip, int(numoswitch))
        link = self.check_link(ip, int(numolink))
        value = switch[0]
        value += link[0]
        main.log.info( "\n-----\n%s%s-----\n" % ( switch[1], link[1]) )
        if value != 0:
            return 0
        else: 
            # "PASS"
            return 1
 
    def drop_keyspace(self):
        '''
        Drops the ONOS keyspace
        '''
        self.handle.sendline("~/ONOS/scripts/test-drop-keyspace.sh")
        self.handle.expect("keyspace")
        self.handle.sendline("")
        self.handle.expect("\$")
        self.handle.expect("\$")

    def ctrl_none(self):
        '''
        Points all the mininet swithces to no controllers 
        *NOTE will only work if CLUSTER is set up on ONOS nodes
        '''
        self.execute(cmd="switch none", prompt="\$",timeout=10)

    def ctrl_one(self, ip):
        '''
        Points all the mininet swithces to all controllers 
        *NOTE will only work if CLUSTER is set up on ONOS nodes
        '''
        self.execute(cmd="switch one", prompt="\$",timeout=10)

    def check_for_no_exceptions(self):
        '''
        Used by CassndraCheck.py to scan ONOS logs for Exceptions
        '''
        self.handle.sendline("dsh 'grep Exception ~/ONOS/onos-logs/onos.*.log'")
        self.handle.expect("\$ dsh") 
        self.handle.expect("\$")
        output = self.handle.before
        main.log.info( output ) 
        if re.search("Exception",output):
            return main.FALSE
        else :
            return main.TRUE
 
    def git_pull(self):
        '''
        Stops the ONOS, pulls the latest code, and builds with mvn. 
        Assumes that "git pull" works without login 
        '''
        main.log.info("Stopping onos") 
        self.stop()
        self.handle.sendline("cd ~/ONOS") 
        self.handle.expect("ONOS\$")
        self.handle.sendline("git pull")
       
        uptodate = 0 
        i=self.handle.expect(['fatal','Username\sfor\s(.*):\s','Unpacking\sobjects',pexpect.TIMEOUT,'Already up-to-date','Aborting'],timeout=180)
        if i==0:
            main.log.error("Git pull had some issue...") 
            return main.FALSE
        elif i==1:
            main.log.error("Asking for username!!! BADD!") 
            return false 
            
            self.handle.expect('Password\sfor\s(.*):\s')
            j = self.handle.expect(['Unpacking\sobjects','Already up-to-date'])
            if j == 0:
                main.log.info("pulling repository now")
            elif j == 1:
                main.log.info("Up to date!")
            else:
                main.log.error("something went wrong")
                return main.FALSE
            self.handle.expect("ONOS\$", 30)
        elif i==2:
            main.log.info("pulling repository now")
            self.handle.expect("ONOS\$", 30)
        elif i==3:
            main.log.error("TIMEOUT")
            return main.FALSE
        elif i==4:
            main.log.info("Already up to date")
            uptodate = 1 
        elif i==5:
            main.log.info("Aborting... Are there conflicting git files?")
            return main.FALSE
        
        '''        
        main.log.info("./setup-local-maven.sh")
        self.handle.sendline("./setup-local-maven.sh")
        self.handle.expect("local-maven.sh")
        while 1: 
            i=self.handle.expect(['BUILD\sFAILURE','BUILD\sSUCCESS','ONOS\$',pexpect.TIMEOUT],timeout=90)
            if i == 0:
                main.log.error("Build failure!")
                return main.FALSE
            elif i == 1:
                main.log.info("Build success!")
            elif i == 2:
                main.log.info("Build complete") 
                break;
            elif i == 3:
                main.log.error("TIMEOUT!")
                return main.FALSE
        '''      
        if uptodate == 0:
            main.log.info("mvn clean") 
            self.handle.sendline("mvn clean")
            while 1: 
                i=self.handle.expect(['BUILD\sFAILURE','BUILD\sSUCCESS','ONOS\$',pexpect.TIMEOUT],timeout=30)
                if i == 0:
                    main.log.error("Build failure!")
                    return main.FALSE
                elif i == 1:
                    main.log.info("Build success!")
                elif i == 2:
                    main.log.info("Build complete") 
                    break;
                elif i == 3:
                    main.log.error("TIMEOUT!")
                    return main.FALSE
        
            main.log.info("mvn compile") 
            self.handle.sendline("mvn compile")
            while 1: 
                i=self.handle.expect(['BUILD\sFAILURE','BUILD\sSUCCESS','ONOS\$',pexpect.TIMEOUT],timeout=30)
                if i == 0:
                    main.log.error("Build failure!")
                    return main.FALSE
                elif i == 1:
                    main.log.info("Build success!")
                elif i == 2:
                    main.log.info("Build complete") 
                    break;
                elif i == 3:
                    main.log.error("TIMEOUT!")
                    return main.FALSE
        
