#!/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 start_embedded(self):
        self.handle.sendline("")
        self.handle.expect("\$")
        self.handle.sendline("~/ONOS/start-onos-embedded.sh start")
        try:
            self.handle.expect("start...")
            main.log.info("Embedded ONOS started")
        except:
            main.log.info("Embedded ONOS failed to start")

    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

    def tcpdump(self):
        self.handle.sendline("")
        self.handle.expect("\$")
        self.handle.sendline("sudo tcpdump -n -i eth0 -s0 -w onos-logs/tcpdump &")
  
    def kill_tcpdump(self):
        self.handle.sendline("")
        self.handle.expect("\$")
        self.handle.sendline("sudo kill -9 `ps -ef | grep \"tcpdump -n\" | grep -v grep | awk '{print $2}'`")
