Beispiel #1
0
class Master(object):

#------------------------------------------------------------------------------ 
    def __init__(self):
        
        self.anime = Animation ()
        
        host = ''                                                              # Bind server to all interfaces
        self.s = socket.socket (socket.AF_INET, socket.SOCK_DGRAM)             # Creating the socket using IPv4, UDP
        self.s.bind((host, PORT))                                              # Binding Server to all interfaces and the chosen port.
        

        self.setup_tool = SetupTool()
        self.paths = self.setup_tool.parse_file('../config/paths.dat')
        self.setup_tool.get_setup_data('../config/session-setup.dat')

        self.clients_list = self.setup_tool.get_clients_list()
                
        self.query_type = self.setup_tool.get_query_type().split()
        self.repetitions = int(self.setup_tool.get_repetitions())
               
        fLog = open(self.paths['LOG_FOLDER_PATH'] + 'enum-bench-tool-master.log', 'w')
        fLog.close()
        
        
        # Refreshing results folder and temp folder
        for s in self.setup_tool.get_scenario_list():
            self.setup_tool.refresh_folder(self.setup_tool.get_save_dir() + self.setup_tool.get_session_name() + 
                                           '/' + s + '/')
        self.setup_tool.refresh_folder(self.paths['TEMP_FOLDER_PATH'])    
             
#------------------------------------------------------------------------------
    # Hiago, this module is temporary. Don't worry about it
    def test_estimation_time (self):
        
        #Number of scenarios
        self.num_scen = len (self.query_type)
     
        self.iterations = len(self.query_type) * self.repetitions * len(self.clients_list)
        total_time = len(self.query_type) * self.repetitions * len(self.clients_list) * (int(self.setup_tool.get_limit()) + int(self.setup_tool.get_timeout()) + 10)

        duration = timedelta (seconds=total_time)
        self.start = datetime.now()
        self.end = self.start + duration

        self.write_to_log('\t>> Scenario run time\n\t\t>> Estimated: ' + str(duration) + '\n' + 
                         '\t\t>> Starting scenario at: ' + str(self.start) + '\n')
                       
        print '\n>> Estimated run time: ', duration
        print '>> Starting scenario at: ', self.start
        print '>> Estimation to finish this scenario: ', self.end
        
#------------------------------------------------------------------------------ 
    def start(self):
        """ executes the tool in each scenario and register the results """
        self.write_to_log('>> Session started at ' + str(datetime.now()) + '\n')
        print '>> Session started at ', datetime.now()
        
        self.check_connection()
         
        scen = 1
        for scenario in self.setup_tool.get_scenario_list():
            self.write_to_log('>> Running scenario ' + str(scen) + '\n')
            self.setup(scenario)
            self.validate()
            self.test_estimation_time()
            self.run(scenario)
            scen += 1
            
        print '>> Session finished at ', datetime.now()            

#------------------------------------------------------------------------------ 
    def check_connection(self):
        """ Check the connections between Server and Master, Client and Master """
        self.write_to_log('>> Checking connection...\n')
        
        self.s.sendto('ping', (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))
        self.s.sendto('ping', (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))
        
        # wait 2 seconds for the answer before considering remote machine off-line.
        t = Timer(2, self.offline)
        t.start()
        
        server_status = False
        client_status = False        
        
        try:
            while 1:
                buf, addr = self.s.recvfrom(1024)
                if buf == 'server pong':
                    t.cancel()
                    self.write_to_log('\t>> Server is alive.\n')
                    server_status = True
                elif buf == 'client pong':
                    t.cancel()
                    self.write_to_log('\t>> Client is alive.\n')
                    client_status = True  
                else:
                    if buf.find('ERROR') >= 0:
                        self.parse_error(buf)

                if server_status and client_status:
                    break
                                    
        except KeyboardInterrupt:
            self.write_to_log('>> Ctrl+c pressed! Exiting...\n')
            print '\t>> Exiting...'
            exit()
        
#------------------------------------------------------------------------------ 
    def setup(self, scenario):        
        """ Establishes connections and gets the necessary data to run the tests"""
        self.write_to_log('\t>> Setup phase...')
        
        self.s.sendto('setup', (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))
        self.s.sendto('setup', (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))
                       
        server_status = False
        client_status = False
        
        self.num_of_records = self.setup_tool.parse_unity(scenario)
        
        if self.setup_tool.get_software() == 'bind' or self.setup_tool.get_software() == 'nsd':
            print '\nquery files\t\t|\tzone files'
        elif self.setup_tool.get_software() == 'pdns' or self.setup_tool.get_software() == 'mydns':
            print '\nquery files\t\t|\tMySQL'
            
        try:
            while 1:
                buf, addr = self.s.recvfrom(4096)
                if buf == 'server 100 OK':
                    self.send_server_setup()
                elif buf == 'client 100 OK':
                    self.send_client_setup()                    
                elif buf == 'server 400 Bad Request':
                    self.write_to_log('>> Message to server was corrupted. Sending again...')
                    self.send_server_setup()
                elif buf == 'client 400 Bad Request':
                    self.write_to_log('>> Message to client was corrupted. Sending again...')
                    self.send_client_setup()
                elif buf == 'server 200 OK':
                    server_status = True
                elif buf == 'client 200 OK':
                    client_status = True           
                elif buf.startswith('q'):
                    self.anime.double_hashtag_bar(int(buf.split(';')[1]), 1)
                elif buf.startswith('z'):
                    self.anime.double_hashtag_bar(int(buf.split(';')[1]), 2)
                else:
                    if buf.find('ERROR') >= 0:
                        self.parse_error(buf)

                if server_status and client_status:
                    break                    
        except KeyboardInterrupt:
            self.write_to_log('>> Ctrl+c pressed! Exiting...\n')
            print '\t>> Exiting...'
            exit()
        self.write_to_log('done!\n')


#------------------------------------------------------------------------------ 
    def send_server_setup (self):
        """ Get data of scenario related to Server """    
        default = str(self.setup_tool.get_software() + ';' + self.setup_tool.get_processes() + ';' + 
                      self.setup_tool.get_processes_users() + ';' + str(self.num_of_records) + ';' + 
                      str(self.setup_tool.get_num_of_zones()) + ';' + self.setup_tool.get_domain_name() + ';' + 
                      self.setup_tool.get_server_ip_qry() + ';' + str(self.setup_tool.get_num_of_naptr()) + ';' + 
                      self.setup_tool.get_limit() + ';' + str(self.setup_tool.get_num_of_cpu()) + ';' + 
                      str(self.setup_tool.update_enabled()) + ';' + str(self.setup_tool.get_update_rate()) + ';')
                      
        if self.setup_tool.get_software() == 'bind' or self.setup_tool.get_software() == 'nsd':
            software_specifics = str(self.setup_tool.get_server_pass() + ';' + self.setup_tool.get_create_zones() + ';' + 
                                     self.setup_tool.get_restart_software())
        elif self.setup_tool.get_software() == 'pdns' or self.setup_tool.get_software() == 'mydns':
            software_specifics = str(self.setup_tool.get_mysql_database() + ';' + self.setup_tool.get_mysql_user() + ';' + 
                                  self.setup_tool.get_mysql_user_pass() + ';' + self.setup_tool.get_create_database())
        
        self.s.sendto(default + software_specifics, (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))

#------------------------------------------------------------------------------ 
    def send_client_setup(self):
        """ Get data of scenario related to Client """      
        self.s.sendto(str(self.num_of_records) + ';' + 
                      str(self.setup_tool.get_num_of_zones()) + ';' + 
                      self.setup_tool.get_domain_name() + ';' + 
                      self.setup_tool.get_server_ip_qry() + ';' + 
                      self.setup_tool.get_limit() + ';' + 
                      self.setup_tool.get_create_q_files() + ';' + 
                      str(self.setup_tool.get_num_of_cpu()) + ';' + 
                      self.setup_tool.get_num_dnsperf_processes(), (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))
                      
#------------------------------------------------------------------------------ 
    def offline (self):
        """ Reports that Client or Server is not connected """
        self.s.sendto('ERROR!! Client or Server is offline.', ('127.0.0.1', PORT))
        
#------------------------------------------------------------------------------ 
    def validate(self):
        """ Verify if the connections and other procedures to run the test at Client and Server are ready """
        self.write_to_log('\t>> Validating process, process users, server connectivity, query files and zone files...')
               
        self.s.sendto('validate', (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))
        self.s.sendto('validate', (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))
        
        server_status = False
        client_status = False
        
        try:
            while 1:
                buf, addr = self.s.recvfrom(2048)
                if buf == 'client 200 OK':                 
                    client_status = True
                    self.write_to_log('\tclient OK')
                elif buf.startswith('server 200 OK'):
                    server_status = True
                    tmp = buf.split(';')
                    tmp.pop(0)
                    self.mem = tmp
                    self.write_to_log('\tserver OK')                    
                else:
                    if buf.find('ERROR') >= 0:
                        self.parse_error(buf)
                        
                if server_status and client_status:
                    self.write_to_log('\n')
                    break                              
        except KeyboardInterrupt:
            self.write_to_log('>> Ctrl+c pressed! Exiting...\n')
            print '\t>> Exiting...'
            exit()       
        
##------------------------------------------------------------------------------
    def run(self, scenario):
        """ Executes the tests in each scenario """                                                                                 
        print '>> Starting queries...'
              
        for q in self.query_type:
            self.insert_header(scenario, q)
            for clients in self.clients_list:
                self.write_to_log('\t>> Clients: ' + str(clients) + '\n')
                for j in range(self.repetitions):                                      
                    self.write_to_log('\t\t>>  Repetition ' + str(j + 1) + '/' + str(self.repetitions) + '\n')
                    self.control_test(clients, q)                                   
                self.write_to_file(scenario, q)
        self.control_tear_down() 
        
        self.write_to_log('\t>> Scenario successfully completed at ' + str(datetime.now()) + '\n')
        print '>> Scenario successfully completed!'
                        
##------------------------------------------------------------------------------ 
    def write_to_log(self, string):
        """ Write information about some process about client at file 'enum-bench-tool-master.log'"""
        fLog = open(self.paths['LOG_FOLDER_PATH'] + 'enum-bench-tool-master.log', 'a')
        fLog.write(string)
        fLog.close()        

##------------------------------------------------------------------------------ 
    def control_test(self, clients, q):
        """ Control the tests rate """
        self.s.sendto(str(clients) + ' ' + 
                      q, (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))
        self.s.sendto('-', (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))

        server_status = False
        client_status = False
        
        self.write_to_log('\t\t\t>> teste running...')
        
        try:
            while 1:                    
                buf, addr = self.s.recvfrom(2048)
                if buf == 'server 200 OK': 
                    server_status = True
                    self.write_to_log('\tserver ok!')
                elif buf == 'client 200 OK': 
                    client_status = True
                    self.write_to_log('\tclient ok!')             
                else:
                    if buf.find('ERROR') >= 0:
                        self.parse_error(buf)

                if server_status and client_status:
                    timeout_count_down = int(self.setup_tool.get_timeout())
                    self.write_to_log('\ttimeout...\n')
                    while (timeout_count_down > 0):
                        time.sleep (1.0)
                        timeout_count_down -= 1
                    break                                                
        except KeyboardInterrupt:
            print '\t>> Exiting...'
            exit ()        
            
##------------------------------------------------------------------------------ 
    def write_to_file(self, scenario, q):
        """ Writes the results from Client and Server at file """
        server_status = False
        client_status = False
        
        f_stats = open(self.setup_tool.get_save_dir() + self.setup_tool.get_session_name() + '/' + 
                       scenario + '/' + q[4:] + '.dat', 'a')
        
        self.write_to_log('\t\t>> Writing to file...')
        self.s.sendto('send-result', (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))
        self.s.sendto('send-result', (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))
        try:
            while 1:
                buf, addr = self.s.recvfrom(2048)
                if buf.startswith('server 200 OK'): 
                    server_status = True
                    server_result = buf.split(';')[1]
                    self.write_to_log('\tserver ok!')
                elif buf.startswith('client 200 OK'): 
                    client_status = True
                    self.write_to_log('\tclient ok!')             
                    client_result = buf.split(';')[1]
                    
                if server_status and client_status:
                    self.write_to_log('\n')
                    f_stats.write(client_result + server_result + '\n')
                    f_stats.close()
                    break
        
        except KeyboardInterrupt:
            print '\t>> Exiting...'
            exit()        
            
#------------------------------------------------------------------------------ 
    def control_tear_down(self):
        """ Send to client and server the instruction to run the function 'tear_down' """
        server_status = False
        client_status = False
        
        self.write_to_log('\n\t>> Teardown session...')
        self.s.sendto('tear-down', (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))        
        self.s.sendto('tear-down', (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))    
        
        try:
            while 1:
                buf, addr = self.s.recvfrom(2048)
                if buf == 'server 200 OK': 
                    server_status = True
                    self.write_to_log('\tserver ok!')                    
                elif buf == 'client 200 OK': 
                    client_status = True
                    self.write_to_log('\tclient ok!')       

                if server_status and client_status:
                    self.write_to_log('\n')
                    break
        except KeyboardInterrupt:
            print '\t>> Exiting...'
            exit()

#------------------------------------------------------------------------------
    def parse_error(self, buf): 
        """ Reports an error at log file and abort the operations at Client and Server"""
        self.write_to_log('>> ' + buf + '\n')
        print '>> ' + buf
        self.s.sendto('abort', (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))
        self.s.sendto('abort', (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))
        print '>> Session aborted!'
        exit()

#------------------------------------------------------------------------------ 
    def insert_header(self, scenario, q):
        """ Insert a header with all process and unities involved"""
        f_stats = open(self.setup_tool.get_save_dir() + self.setup_tool.get_session_name() + '/' + 
                            scenario + '/' + q[4:] + '.dat', 'w')
        
        f_stats.write('# session:\t' + self.setup_tool.get_session_name() + '\n' + 
                      '# scenario:\t' + scenario + '\n' + 
                      '# records:\t' + q[4:] + '\n')
        for u in self.mem:
            f_stats.write('# ' + u + '\n')
            
        title = '#Clients\tCompleted\tLost\tthroughput\tLatency\t\t\t\tdnsperf\tnetwork\tnet_max'
        for process in self.setup_tool.get_processes().split():
            title += '\t' + process
            
        unity = '#\t\t(%)\t(%)\t(qps)\tmean(s)\tstd\t\tcpu(%)\t(Mbps)\t(Mbps)'
        for process in self.setup_tool.get_processes().split():
            unity += '\tcpu(%)'
             
        f_stats.write(title + '\n' + 
                      unity + '\n')
        f_stats.close()        
Beispiel #2
0
class Master(object):

    #------------------------------------------------------------------------------
    def __init__(self):

        self.anime = Animation()

        host = ''  # Bind server to all interfaces
        self.s = socket.socket(
            socket.AF_INET,
            socket.SOCK_DGRAM)  # Creating the socket using IPv4, UDP
        self.s.bind(
            (host,
             PORT))  # Binding Server to all interfaces and the chosen port.

        self.setup_tool = SetupTool()
        self.paths = self.setup_tool.parse_file('../config/paths.dat')
        self.setup_tool.get_setup_data('../config/session-setup.dat')

        self.clients_list = self.setup_tool.get_clients_list()

        self.query_type = self.setup_tool.get_query_type().split()
        self.repetitions = int(self.setup_tool.get_repetitions())

        fLog = open(
            self.paths['LOG_FOLDER_PATH'] + 'enum-bench-tool-master.log', 'w')
        fLog.close()

        # Refreshing results folder and temp folder
        for s in self.setup_tool.get_scenario_list():
            self.setup_tool.refresh_folder(self.setup_tool.get_save_dir() +
                                           self.setup_tool.get_session_name() +
                                           '/' + s + '/')
        self.setup_tool.refresh_folder(self.paths['TEMP_FOLDER_PATH'])

#------------------------------------------------------------------------------
# Hiago, this module is temporary. Don't worry about it

    def test_estimation_time(self):

        #Number of scenarios
        self.num_scen = len(self.query_type)

        self.iterations = len(self.query_type) * self.repetitions * len(
            self.clients_list)
        total_time = len(self.query_type) * self.repetitions * len(
            self.clients_list) * (int(self.setup_tool.get_limit()) +
                                  int(self.setup_tool.get_timeout()) + 10)

        duration = timedelta(seconds=total_time)
        self.start = datetime.now()
        self.end = self.start + duration

        self.write_to_log('\t>> Scenario run time\n\t\t>> Estimated: ' +
                          str(duration) + '\n' +
                          '\t\t>> Starting scenario at: ' + str(self.start) +
                          '\n')

        print '\n>> Estimated run time: ', duration
        print '>> Starting scenario at: ', self.start
        print '>> Estimation to finish this scenario: ', self.end

#------------------------------------------------------------------------------

    def start(self):
        """ executes the tool in each scenario and register the results """
        self.write_to_log('>> Session started at ' + str(datetime.now()) +
                          '\n')
        print '>> Session started at ', datetime.now()

        self.check_connection()

        scen = 1
        for scenario in self.setup_tool.get_scenario_list():
            self.write_to_log('>> Running scenario ' + str(scen) + '\n')
            self.setup(scenario)
            self.validate()
            self.test_estimation_time()
            self.run(scenario)
            scen += 1

        print '>> Session finished at ', datetime.now()

#------------------------------------------------------------------------------

    def check_connection(self):
        """ Check the connections between Server and Master, Client and Master """
        self.write_to_log('>> Checking connection...\n')

        self.s.sendto('ping',
                      (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))
        self.s.sendto('ping',
                      (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))

        # wait 2 seconds for the answer before considering remote machine off-line.
        t = Timer(2, self.offline)
        t.start()

        server_status = False
        client_status = False

        try:
            while 1:
                buf, addr = self.s.recvfrom(1024)
                if buf == 'server pong':
                    t.cancel()
                    self.write_to_log('\t>> Server is alive.\n')
                    server_status = True
                elif buf == 'client pong':
                    t.cancel()
                    self.write_to_log('\t>> Client is alive.\n')
                    client_status = True
                else:
                    if buf.find('ERROR') >= 0:
                        self.parse_error(buf)

                if server_status and client_status:
                    break

        except KeyboardInterrupt:
            self.write_to_log('>> Ctrl+c pressed! Exiting...\n')
            print '\t>> Exiting...'
            exit()

#------------------------------------------------------------------------------

    def setup(self, scenario):
        """ Establishes connections and gets the necessary data to run the tests"""
        self.write_to_log('\t>> Setup phase...')

        self.s.sendto('setup',
                      (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))
        self.s.sendto('setup',
                      (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))

        server_status = False
        client_status = False

        self.num_of_records = self.setup_tool.parse_unity(scenario)

        if self.setup_tool.get_software(
        ) == 'bind' or self.setup_tool.get_software() == 'nsd':
            print '\nquery files\t\t|\tzone files'
        elif self.setup_tool.get_software(
        ) == 'pdns' or self.setup_tool.get_software() == 'mydns':
            print '\nquery files\t\t|\tMySQL'

        try:
            while 1:
                buf, addr = self.s.recvfrom(4096)
                if buf == 'server 100 OK':
                    self.send_server_setup()
                elif buf == 'client 100 OK':
                    self.send_client_setup()
                elif buf == 'server 400 Bad Request':
                    self.write_to_log(
                        '>> Message to server was corrupted. Sending again...')
                    self.send_server_setup()
                elif buf == 'client 400 Bad Request':
                    self.write_to_log(
                        '>> Message to client was corrupted. Sending again...')
                    self.send_client_setup()
                elif buf == 'server 200 OK':
                    server_status = True
                elif buf == 'client 200 OK':
                    client_status = True
                elif buf.startswith('q'):
                    self.anime.double_hashtag_bar(int(buf.split(';')[1]), 1)
                elif buf.startswith('z'):
                    self.anime.double_hashtag_bar(int(buf.split(';')[1]), 2)
                else:
                    if buf.find('ERROR') >= 0:
                        self.parse_error(buf)

                if server_status and client_status:
                    break
        except KeyboardInterrupt:
            self.write_to_log('>> Ctrl+c pressed! Exiting...\n')
            print '\t>> Exiting...'
            exit()
        self.write_to_log('done!\n')

#------------------------------------------------------------------------------

    def send_server_setup(self):
        """ Get data of scenario related to Server """
        default = str(self.setup_tool.get_software() + ';' +
                      self.setup_tool.get_processes() + ';' +
                      self.setup_tool.get_processes_users() + ';' +
                      str(self.num_of_records) + ';' +
                      str(self.setup_tool.get_num_of_zones()) + ';' +
                      self.setup_tool.get_domain_name() + ';' +
                      self.setup_tool.get_server_ip_qry() + ';' +
                      str(self.setup_tool.get_num_of_naptr()) + ';' +
                      self.setup_tool.get_limit() + ';' +
                      str(self.setup_tool.get_num_of_cpu()) + ';' +
                      str(self.setup_tool.update_enabled()) + ';' +
                      str(self.setup_tool.get_update_rate()) + ';')

        if self.setup_tool.get_software(
        ) == 'bind' or self.setup_tool.get_software() == 'nsd':
            software_specifics = str(self.setup_tool.get_server_pass() + ';' +
                                     self.setup_tool.get_create_zones() + ';' +
                                     self.setup_tool.get_restart_software())
        elif self.setup_tool.get_software(
        ) == 'pdns' or self.setup_tool.get_software() == 'mydns':
            software_specifics = str(self.setup_tool.get_mysql_database() +
                                     ';' + self.setup_tool.get_mysql_user() +
                                     ';' +
                                     self.setup_tool.get_mysql_user_pass() +
                                     ';' +
                                     self.setup_tool.get_create_database())

        self.s.sendto(default + software_specifics,
                      (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))

#------------------------------------------------------------------------------

    def send_client_setup(self):
        """ Get data of scenario related to Client """
        self.s.sendto(
            str(self.num_of_records) + ';' +
            str(self.setup_tool.get_num_of_zones()) + ';' +
            self.setup_tool.get_domain_name() + ';' +
            self.setup_tool.get_server_ip_qry() + ';' +
            self.setup_tool.get_limit() + ';' +
            self.setup_tool.get_create_q_files() + ';' +
            str(self.setup_tool.get_num_of_cpu()) + ';' +
            self.setup_tool.get_num_dnsperf_processes(),
            (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))

#------------------------------------------------------------------------------

    def offline(self):
        """ Reports that Client or Server is not connected """
        self.s.sendto('ERROR!! Client or Server is offline.',
                      ('127.0.0.1', PORT))

#------------------------------------------------------------------------------

    def validate(self):
        """ Verify if the connections and other procedures to run the test at Client and Server are ready """
        self.write_to_log(
            '\t>> Validating process, process users, server connectivity, query files and zone files...'
        )

        self.s.sendto('validate',
                      (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))
        self.s.sendto('validate',
                      (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))

        server_status = False
        client_status = False

        try:
            while 1:
                buf, addr = self.s.recvfrom(2048)
                if buf == 'client 200 OK':
                    client_status = True
                    self.write_to_log('\tclient OK')
                elif buf.startswith('server 200 OK'):
                    server_status = True
                    tmp = buf.split(';')
                    tmp.pop(0)
                    self.mem = tmp
                    self.write_to_log('\tserver OK')
                else:
                    if buf.find('ERROR') >= 0:
                        self.parse_error(buf)

                if server_status and client_status:
                    self.write_to_log('\n')
                    break
        except KeyboardInterrupt:
            self.write_to_log('>> Ctrl+c pressed! Exiting...\n')
            print '\t>> Exiting...'
            exit()

##------------------------------------------------------------------------------

    def run(self, scenario):
        """ Executes the tests in each scenario """
        print '>> Starting queries...'

        for q in self.query_type:
            self.insert_header(scenario, q)
            for clients in self.clients_list:
                self.write_to_log('\t>> Clients: ' + str(clients) + '\n')
                for j in range(self.repetitions):
                    self.write_to_log('\t\t>>  Repetition ' + str(j + 1) +
                                      '/' + str(self.repetitions) + '\n')
                    self.control_test(clients, q)
                self.write_to_file(scenario, q)
        self.control_tear_down()

        self.write_to_log('\t>> Scenario successfully completed at ' +
                          str(datetime.now()) + '\n')
        print '>> Scenario successfully completed!'

##------------------------------------------------------------------------------

    def write_to_log(self, string):
        """ Write information about some process about client at file 'enum-bench-tool-master.log'"""
        fLog = open(
            self.paths['LOG_FOLDER_PATH'] + 'enum-bench-tool-master.log', 'a')
        fLog.write(string)
        fLog.close()

##------------------------------------------------------------------------------

    def control_test(self, clients, q):
        """ Control the tests rate """
        self.s.sendto(
            str(clients) + ' ' + q,
            (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))
        self.s.sendto('-', (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))

        server_status = False
        client_status = False

        self.write_to_log('\t\t\t>> teste running...')

        try:
            while 1:
                buf, addr = self.s.recvfrom(2048)
                if buf == 'server 200 OK':
                    server_status = True
                    self.write_to_log('\tserver ok!')
                elif buf == 'client 200 OK':
                    client_status = True
                    self.write_to_log('\tclient ok!')
                else:
                    if buf.find('ERROR') >= 0:
                        self.parse_error(buf)

                if server_status and client_status:
                    timeout_count_down = int(self.setup_tool.get_timeout())
                    self.write_to_log('\ttimeout...\n')
                    while (timeout_count_down > 0):
                        time.sleep(1.0)
                        timeout_count_down -= 1
                    break
        except KeyboardInterrupt:
            print '\t>> Exiting...'
            exit()

##------------------------------------------------------------------------------

    def write_to_file(self, scenario, q):
        """ Writes the results from Client and Server at file """
        server_status = False
        client_status = False

        f_stats = open(
            self.setup_tool.get_save_dir() +
            self.setup_tool.get_session_name() + '/' + scenario + '/' + q[4:] +
            '.dat', 'a')

        self.write_to_log('\t\t>> Writing to file...')
        self.s.sendto('send-result',
                      (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))
        self.s.sendto('send-result',
                      (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))
        try:
            while 1:
                buf, addr = self.s.recvfrom(2048)
                if buf.startswith('server 200 OK'):
                    server_status = True
                    server_result = buf.split(';')[1]
                    self.write_to_log('\tserver ok!')
                elif buf.startswith('client 200 OK'):
                    client_status = True
                    self.write_to_log('\tclient ok!')
                    client_result = buf.split(';')[1]

                if server_status and client_status:
                    self.write_to_log('\n')
                    f_stats.write(client_result + server_result + '\n')
                    f_stats.close()
                    break

        except KeyboardInterrupt:
            print '\t>> Exiting...'
            exit()

#------------------------------------------------------------------------------

    def control_tear_down(self):
        """ Send to client and server the instruction to run the function 'tear_down' """
        server_status = False
        client_status = False

        self.write_to_log('\n\t>> Teardown session...')
        self.s.sendto('tear-down',
                      (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))
        self.s.sendto('tear-down',
                      (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))

        try:
            while 1:
                buf, addr = self.s.recvfrom(2048)
                if buf == 'server 200 OK':
                    server_status = True
                    self.write_to_log('\tserver ok!')
                elif buf == 'client 200 OK':
                    client_status = True
                    self.write_to_log('\tclient ok!')

                if server_status and client_status:
                    self.write_to_log('\n')
                    break
        except KeyboardInterrupt:
            print '\t>> Exiting...'
            exit()

#------------------------------------------------------------------------------

    def parse_error(self, buf):
        """ Reports an error at log file and abort the operations at Client and Server"""
        self.write_to_log('>> ' + buf + '\n')
        print '>> ' + buf
        self.s.sendto('abort',
                      (self.setup_tool.get_client_ip_ctrl(), CLIENTPORT))
        self.s.sendto('abort',
                      (self.setup_tool.get_server_ip_ctrl(), SERVERPORT))
        print '>> Session aborted!'
        exit()

#------------------------------------------------------------------------------

    def insert_header(self, scenario, q):
        """ Insert a header with all process and unities involved"""
        f_stats = open(
            self.setup_tool.get_save_dir() +
            self.setup_tool.get_session_name() + '/' + scenario + '/' + q[4:] +
            '.dat', 'w')

        f_stats.write('# session:\t' + self.setup_tool.get_session_name() +
                      '\n' + '# scenario:\t' + scenario + '\n' +
                      '# records:\t' + q[4:] + '\n')
        for u in self.mem:
            f_stats.write('# ' + u + '\n')

        title = '#Clients\tCompleted\tLost\tthroughput\tLatency\t\t\t\tdnsperf\tnetwork\tnet_max'
        for process in self.setup_tool.get_processes().split():
            title += '\t' + process

        unity = '#\t\t(%)\t(%)\t(qps)\tmean(s)\tstd\t\tcpu(%)\t(Mbps)\t(Mbps)'
        for process in self.setup_tool.get_processes().split():
            unity += '\tcpu(%)'

        f_stats.write(title + '\n' + unity + '\n')
        f_stats.close()