class IXLOADHttpTest(object): def __init__(self, test_input): self.test_input = jsonutils.loads(test_input) self.parse_run_test() self.ix_load = None self.stat_utils = None self.remote_server = None self.config_file = None self.results_on_windows = None self.result_dir = None self.chassis = None self.card = None self.ports_to_reassign = None @staticmethod def format_ports_for_reassignment(ports): formatted = [join_non_strings(';', p) for p in ports if len(p) == 3] LOG.debug('for client ports:%s', os.linesep.join(formatted)) return formatted def reassign_ports(self, test, repository, ports_to_reassign): LOG.debug('ReassignPorts: %s %s', test, repository) chassis_chain = repository.cget('chassisChain') LOG.debug('chassischain: %s', chassis_chain) client_ports = ports_to_reassign[0::2] server_ports = ports_to_reassign[1::2] client_ports = self.format_ports_for_reassignment(client_ports) LOG.debug('Reassigning client ports: %s', client_ports) server_ports = self.format_ports_for_reassignment(server_ports) LOG.debug('Reassigning server ports: %s', server_ports) ports_to_set = client_ports + server_ports try: LOG.debug('Reassigning ports: %s', ports_to_set) test.setPorts(ports_to_set) except Exception: LOG.error('Error: Could not remap port assignment for: %s', ports_to_set) self.ix_load.delete(repository) self.ix_load.disconnect() raise @staticmethod def stat_collector(*args): LOG.debug(INCOMING_STAT_RECORD_TEMPLATE, args, len(args), args[0], args[1]) @staticmethod def IxL_StatCollectorCommand(*args): stats = args[1][3] timestamp = args[1][1] LOG.debug(INCOMING_STAT_INTERVAL_TEMPLATE, timestamp, stats) @staticmethod def set_results_dir(test_controller, results_on_windows): """ If the folder doesn't exists on the Windows Client PC, IxLoad will automatically create it. """ try: test_controller.setResultDir(results_on_windows) except Exception: LOG.error('Error creating results dir on Win: %s', results_on_windows) raise def load_config_file(self, config_file): try: LOG.debug(config_file) repository = self.ix_load.new("ixRepository", name=config_file) return repository except Exception: LOG.error('Error: IxLoad config file not found: %s', config_file) raise def start_http_test(self): self.ix_load = IxLoad() LOG.debug('--- ixLoad obj: %s', self.ix_load) try: self.ix_load.connect(self.remote_server) except Exception: raise log_tag = "IxLoad-api" log_name = "reprun" logger = self.ix_load.new("ixLogger", log_tag, 1) log_engine = logger.getEngine() log_engine.setLevels(self.ix_load.ixLogger.kLevelDebug, self.ix_load.ixLogger.kLevelInfo) log_engine.setFile(log_name, 2, 256, 1) # Initialize stat collection utilities self.stat_utils = StatCollectorUtils() test_controller = self.ix_load.new("ixTestController", outputDir=1) repository = self.load_config_file(self.config_file) # Get the first test on the testList test_name = repository.testList[0].cget("name") test = repository.testList.getItem(test_name) self.set_results_dir(test_controller, self.results_on_windows) test.config(statsRequired=1, enableResetPorts=1, csvInterval=2, enableForceOwnership=True) # ---- Remap ports ---- try: self.reassign_ports(test, repository, self.ports_to_reassign) except Exception: LOG.exception("Exception occurred during reassign_ports") # ----------------------------------------------------------------------- # Set up stat Collection # ----------------------------------------------------------------------- test_server_handle = test_controller.getTestServerHandle() self.stat_utils.Initialize(test_server_handle) # Clear any stats that may have been registered previously self.stat_utils.ClearStats() # Define the stats we would like to collect self.stat_utils.AddStat(caption="Watch_Stat_1", statSourceType="HTTP Client", statName="TCP Connections Established", aggregationType="kSum", filterList={}) self.stat_utils.AddStat(caption="Watch_Stat_2", statSourceType="HTTP Client", statName="TCP Connection Requests Failed", aggregationType="kSum", filterList={}) self.stat_utils.AddStat(caption="Watch_Stat_3", statSourceType="HTTP Server", statName="TCP Connections Established", aggregationType="kSum", filterList={}) self.stat_utils.AddStat(caption="Watch_Stat_4", statSourceType="HTTP Server", statName="TCP Connection Requests Failed", aggregationType="kSum", filterList={}) self.stat_utils.StartCollector(self.IxL_StatCollectorCommand) test_controller.run(test) self.ix_load.waitForTestFinish() test_controller.releaseConfigWaitFinish() # Stop the collector (running in the tcl event loop) self.stat_utils.StopCollector() # Cleanup test_controller.generateReport(detailedReport=1, format="PDF;HTML") test_controller.releaseConfigWaitFinish() self.ix_load.delete(test) self.ix_load.delete(test_controller) self.ix_load.delete(logger) self.ix_load.delete(log_engine) LOG.debug('Retrieving CSV stats from Windows Client PC ...') for stat_file in STATS_TO_GET: enhanced_stat_file = stat_file.replace('-', '') enhanced_stat_file = enhanced_stat_file.replace(' ', '_') enhanced_stat_file = enhanced_stat_file.replace('__', '_') LOG.debug('Getting csv stat file: %s', stat_file) src_file = os.path.join(self.results_on_windows, stat_file) dst_file = os.path.join(self.result_dir, '_'.join(['ixLoad', enhanced_stat_file])) self.ix_load.retrieveFileCopy(src_file, dst_file) self.ix_load.disconnect() def parse_run_test(self): self.remote_server = self.test_input["remote_server"] LOG.debug("remote tcl server: %s", self.remote_server) self.config_file = self.test_input["ixload_cfg"] LOG.debug("ixload config: %s", self.remote_server) self.results_on_windows = 'C:/Results' self.result_dir = self.test_input["result_dir"] self.chassis = self.test_input["ixia_chassis"] LOG.debug("remote ixia chassis: %s", self.chassis) self.card = self.test_input["IXIA"]["card"] self.ports_to_reassign = [ [self.chassis, self.card, port] for port in self.test_input["IXIA"]["ports"] ] LOG.debug("Ports to be reassigned: %s", self.ports_to_reassign)
def start_http_test(self): self.ix_load = IxLoad() LOG.debug('--- ixLoad obj: %s', self.ix_load) try: self.ix_load.connect(self.remote_server) except Exception: raise log_tag = "IxLoad-api" log_name = "reprun" logger = self.ix_load.new("ixLogger", log_tag, 1) log_engine = logger.getEngine() log_engine.setLevels(self.ix_load.ixLogger.kLevelDebug, self.ix_load.ixLogger.kLevelInfo) log_engine.setFile(log_name, 2, 256, 1) # Initialize stat collection utilities self.stat_utils = StatCollectorUtils() test_controller = self.ix_load.new("ixTestController", outputDir=1) repository = self.load_config_file(self.config_file) # Get the first test on the testList test_name = repository.testList[0].cget("name") test = repository.testList.getItem(test_name) self.set_results_dir(test_controller, self.results_on_windows) test.config(statsRequired=1, enableResetPorts=1, csvInterval=2, enableForceOwnership=True) # ---- Remap ports ---- try: self.reassign_ports(test, repository, self.ports_to_reassign) except Exception: LOG.exception("Exception occurred during reassign_ports") # ----------------------------------------------------------------------- # Set up stat Collection # ----------------------------------------------------------------------- test_server_handle = test_controller.getTestServerHandle() self.stat_utils.Initialize(test_server_handle) # Clear any stats that may have been registered previously self.stat_utils.ClearStats() # Define the stats we would like to collect self.stat_utils.AddStat(caption="Watch_Stat_1", statSourceType="HTTP Client", statName="TCP Connections Established", aggregationType="kSum", filterList={}) self.stat_utils.AddStat(caption="Watch_Stat_2", statSourceType="HTTP Client", statName="TCP Connection Requests Failed", aggregationType="kSum", filterList={}) self.stat_utils.AddStat(caption="Watch_Stat_3", statSourceType="HTTP Server", statName="TCP Connections Established", aggregationType="kSum", filterList={}) self.stat_utils.AddStat(caption="Watch_Stat_4", statSourceType="HTTP Server", statName="TCP Connection Requests Failed", aggregationType="kSum", filterList={}) self.stat_utils.StartCollector(self.IxL_StatCollectorCommand) test_controller.run(test) self.ix_load.waitForTestFinish() test_controller.releaseConfigWaitFinish() # Stop the collector (running in the tcl event loop) self.stat_utils.StopCollector() # Cleanup test_controller.generateReport(detailedReport=1, format="PDF;HTML") test_controller.releaseConfigWaitFinish() self.ix_load.delete(test) self.ix_load.delete(test_controller) self.ix_load.delete(logger) self.ix_load.delete(log_engine) LOG.debug('Retrieving CSV stats from Windows Client PC ...') for stat_file in STATS_TO_GET: enhanced_stat_file = stat_file.replace('-', '') enhanced_stat_file = enhanced_stat_file.replace(' ', '_') enhanced_stat_file = enhanced_stat_file.replace('__', '_') LOG.debug('Getting csv stat file: %s', stat_file) src_file = os.path.join(self.results_on_windows, stat_file) dst_file = os.path.join(self.result_dir, '_'.join(['ixLoad', enhanced_stat_file])) self.ix_load.retrieveFileCopy(src_file, dst_file) self.ix_load.disconnect()
class IXLOADHttpTest(object): def __init__(self, test_input): self.ix_load = None self.stat_utils = None self.remote_server = None self.config_file = None self.results_on_windows = None self.result_dir = None self.chassis = None self.card = None self.ports_to_reassign = None self.links_param = None self.test_input = jsonutils.loads(test_input) self.parse_run_test() self.test = None @staticmethod def format_ports_for_reassignment(ports): formatted = [join_non_strings(';', p) for p in ports if len(p) == 3] LOG.debug('for client ports:%s', os.linesep.join(formatted)) return formatted def reassign_ports(self, test, repository, ports_to_reassign): LOG.debug('ReassignPorts: %s %s', test, repository) chassis_chain = repository.cget('chassisChain') LOG.debug('chassischain: %s', chassis_chain) client_ports = ports_to_reassign[0::2] server_ports = ports_to_reassign[1::2] client_ports = self.format_ports_for_reassignment(client_ports) LOG.debug('Reassigning client ports: %s', client_ports) server_ports = self.format_ports_for_reassignment(server_ports) LOG.debug('Reassigning server ports: %s', server_ports) ports_to_set = client_ports + server_ports try: LOG.debug('Reassigning ports: %s', ports_to_set) test.setPorts(ports_to_set) except Exception: LOG.error('Error: Could not remap port assignment for: %s', ports_to_set) self.ix_load.delete(repository) self.ix_load.disconnect() raise @staticmethod def stat_collector(*args): LOG.debug(INCOMING_STAT_RECORD_TEMPLATE, args, len(args), args[0], args[1]) @staticmethod def IxL_StatCollectorCommand(*args): stats = args[1][3] timestamp = args[1][1] LOG.debug(INCOMING_STAT_INTERVAL_TEMPLATE, timestamp, stats) @staticmethod def set_results_dir(test_controller, results_on_windows): """ If the folder doesn't exists on the Windows Client PC, IxLoad will automatically create it. """ try: test_controller.setResultDir(results_on_windows) except Exception: LOG.error('Error creating results dir on Win: %s', results_on_windows) raise def load_config_file(self, config_file): try: LOG.debug(config_file) repository = self.ix_load.new("ixRepository", name=config_file) return repository except Exception: LOG.error('Error: IxLoad config file not found: %s', config_file) raise def update_network_address(self, net_traffic, address, gateway, prefix): """Update ip address and gateway for net_traffic object This function update field which configure source addresses for traffic which is described by net_traffic object. Do not return anything :param net_traffic: (IxLoadObjectProxy) proxy obj to tcl net_traffic object :param address: (str) Ipv4 range start address :param gateway: (str) Ipv4 address of gateway :param prefix: (int) subnet prefix :return: """ try: ethernet = net_traffic.network.getL1Plugin() ix_net_l2_ethernet_plugin = ethernet.childrenList[0] ix_net_ip_v4_v6_plugin = ix_net_l2_ethernet_plugin.childrenList[0] ix_net_ip_v4_v6_range = ix_net_ip_v4_v6_plugin.rangeList[0] ix_net_ip_v4_v6_range.config(prefix=prefix, ipAddress=address, gatewayAddress=gateway) except Exception: raise exceptions.InvalidRxfFile def update_network_mac_address(self, net_traffic, mac): """Update MACaddress for net_traffic object This function update field which configure MACaddresses for traffic which is described by net_traffic object. If mac == "auto" then will be configured auto generated mac Do not return anything. :param net_traffic: (IxLoadObjectProxy) proxy obj to tcl net_traffic object :param mac: (str) MAC :return: """ try: ethernet = net_traffic.network.getL1Plugin() ix_net_l2_ethernet_plugin = ethernet.childrenList[0] ix_net_ip_v4_v6_plugin = ix_net_l2_ethernet_plugin.childrenList[0] ix_net_ip_v4_v6_range = ix_net_ip_v4_v6_plugin.rangeList[0] if str(mac).lower() == "auto": ix_net_ip_v4_v6_range.config(autoMacGeneration=True) else: ix_net_ip_v4_v6_range.config(autoMacGeneration=False) mac_range = ix_net_ip_v4_v6_range.getLowerRelatedRange( "MacRange") mac_range.config(mac=mac) except Exception: raise exceptions.InvalidRxfFile def update_network_param(self, net_traffic, param): """Update net_traffic by parameters specified in param""" self.update_network_address(net_traffic, param["address"], param["gateway"], param["subnet_prefix"]) self.update_network_mac_address(net_traffic, param["mac"]) def update_config(self): """Update some fields by parameters from traffic profile""" net_traffics = {} # self.test.communityList is a IxLoadObjectProxy to some tcl object # which contain all net_traffic objects in scenario. # net_traffic item has a name in format "activity_name@item_name" try: for item in self.test.communityList: net_traffics[item.name.split('@')[1]] = item except Exception: # pylint: disable=broad-except pass for name, net_traffic in net_traffics.items(): try: param = self.links_param[name] except KeyError: LOG.debug('There is no param for net_traffic %s', name) continue self.update_network_param(net_traffic, param["ip"]) if "uplink" in name: self.update_http_client_param(net_traffic, param["http_client"]) def update_http_client_param(self, net_traffic, param): """Update http client object in net_traffic Update http client object in net_traffic by parameters specified in param. Do not return anything. :param net_traffic: (IxLoadObjectProxy) proxy obj to tcl net_traffic object :param param: (dict) http_client section from traffic profile :return: """ page = param.get("page_object") if page: self.update_page_size(net_traffic, page) users = param.get("simulated_users") if users: self.update_user_count(net_traffic, users) def update_page_size(self, net_traffic, page_object): """Update page_object field in http client object in net_traffic This function update field which configure page_object which will be loaded from server Do not return anything. :param net_traffic: (IxLoadObjectProxy) proxy obj to tcl net_traffic object :param page_object: (str) path to object on server e.g. "/4k.html" :return: """ try: activity = net_traffic.activityList[0] ix_http_command = activity.agent.actionList[0] ix_http_command.config(pageObject=page_object) except Exception: raise exceptions.InvalidRxfFile def update_user_count(self, net_traffic, user_count): """Update userObjectiveValue field in activity object in net_traffic This function update field which configure users count which will be simulated by client. Do not return anything. :param net_traffic: (IxLoadObjectProxy) proxy obj to tcl net_traffic object :param user_count: (int) number of simulated users :return: """ try: activity = net_traffic.activityList[0] activity.config(userObjectiveValue=user_count) except Exception: raise exceptions.InvalidRxfFile def start_http_test(self): self.ix_load = IxLoad() LOG.debug('--- ixLoad obj: %s', self.ix_load) try: self.ix_load.connect(self.remote_server) except Exception: raise log_tag = "IxLoad-api" log_name = "reprun" logger = self.ix_load.new("ixLogger", log_tag, 1) log_engine = logger.getEngine() log_engine.setLevels(self.ix_load.ixLogger.kLevelDebug, self.ix_load.ixLogger.kLevelInfo) log_engine.setFile(log_name, 2, 256, 1) # Initialize stat collection utilities self.stat_utils = StatCollectorUtils() test_controller = self.ix_load.new("ixTestController", outputDir=1) repository = self.load_config_file(self.config_file) # Get the first test on the testList test_name = repository.testList[0].cget("name") self.test = repository.testList.getItem(test_name) self.set_results_dir(test_controller, self.results_on_windows) self.test.config(statsRequired=1, enableResetPorts=1, csvInterval=2, enableForceOwnership=True) self.update_config() # ---- Remap ports ---- try: self.reassign_ports(self.test, repository, self.ports_to_reassign) except Exception: # pylint: disable=broad-except LOG.exception("Exception occurred during reassign_ports") # ----------------------------------------------------------------------- # Set up stat Collection # ----------------------------------------------------------------------- test_server_handle = test_controller.getTestServerHandle() self.stat_utils.Initialize(test_server_handle) # Clear any stats that may have been registered previously self.stat_utils.ClearStats() # Define the stats we would like to collect self.stat_utils.AddStat(caption="Watch_Stat_1", statSourceType="HTTP Client", statName="TCP Connections Established", aggregationType="kSum", filterList={}) self.stat_utils.AddStat(caption="Watch_Stat_2", statSourceType="HTTP Client", statName="TCP Connection Requests Failed", aggregationType="kSum", filterList={}) self.stat_utils.AddStat(caption="Watch_Stat_3", statSourceType="HTTP Server", statName="TCP Connections Established", aggregationType="kSum", filterList={}) self.stat_utils.AddStat(caption="Watch_Stat_4", statSourceType="HTTP Server", statName="TCP Connection Requests Failed", aggregationType="kSum", filterList={}) self.stat_utils.StartCollector(self.IxL_StatCollectorCommand) test_controller.run(self.test) self.ix_load.waitForTestFinish() test_controller.releaseConfigWaitFinish() # Stop the collector (running in the tcl event loop) self.stat_utils.StopCollector() # Cleanup test_controller.generateReport(detailedReport=1, format="PDF;HTML") test_controller.releaseConfigWaitFinish() self.ix_load.delete(self.test) self.ix_load.delete(test_controller) self.ix_load.delete(logger) self.ix_load.delete(log_engine) LOG.debug('Retrieving CSV stats from Windows Client PC ...') for stat_file in STATS_TO_GET: enhanced_stat_file = stat_file.replace('-', '') enhanced_stat_file = enhanced_stat_file.replace(' ', '_') enhanced_stat_file = enhanced_stat_file.replace('__', '_') LOG.debug('Getting csv stat file: %s', stat_file) src_file = os.path.join(self.results_on_windows, stat_file) dst_file = os.path.join(self.result_dir, '_'.join(['ixLoad', enhanced_stat_file])) self.ix_load.retrieveFileCopy(src_file, dst_file) self.ix_load.disconnect() def parse_run_test(self): self.remote_server = self.test_input["remote_server"] LOG.debug("remote tcl server: %s", self.remote_server) self.config_file = self.test_input["ixload_cfg"] LOG.debug("ixload config: %s", self.remote_server) self.results_on_windows = 'C:/Results' self.result_dir = self.test_input["result_dir"] self.chassis = self.test_input["ixia_chassis"] LOG.debug("remote ixia chassis: %s", self.chassis) self.card = self.test_input["IXIA"]["card"] self.ports_to_reassign = [[self.chassis, self.card, port] for port in self.test_input["IXIA"]["ports"]] LOG.debug("Ports to be reassigned: %s", self.ports_to_reassign) self.links_param = self.test_input["links_param"] LOG.debug("Links param to be applied: %s", self.links_param)
if len(sys.argv) == 2: repositoryName = sys.argv[1] else: repositoryName = raw_input("Enter full path of rxf file to run: ") print "Running all tests in repository %s" % repositoryName # # setup path and load IxLoad package # # # Initialize IxLoad # IxLoad = IxLoad() # IxLoad connect should always be called, even for local scripts IxLoad.connect(remoteServer) # once we've connected, make sure we disconnect, even if there's a problem try: # # setup logger # logtag = "IxLoad-api" logName = "reprun" logger = IxLoad.new("ixLogger", logtag, 1) logEngine = logger.getEngine() logEngine.setLevels(IxLoad.ixLogger.kLevelDebug,
'attachment', filename=filename) msg.attach(attachment) print '\nSending email notification...' try: # Python 2 p = Popen(["sendmail", "-t"], stdin=PIPE) except: # Python 3 p = Popen(["sendmail", "-t"], stdin=PIPE, universal_newlines=True) p.communicate(msg.as_string()) ixLoad = IxLoad() try: ixLoad.connect(remote_server) except: sys.exit('Failed to connect to: %s' % remote_server) logTag = "IxLoad-api" logName = "reprun" logger = ixLoad.new("ixLogger", logTag, 1) logEngine = logger.getEngine() logEngine.setLevels(ixLoad.ixLogger.kLevelDebug, ixLoad.ixLogger.kLevelInfo) logEngine.setFile(logName, 2, 256, 1) # Initialize stat collection utilities statUtils = StatCollectorUtils()
from IxLoad import IxLoad, StatCollectorUtils from setup_simple import * # # Initialize IxLoad # IxLoad = IxLoad() # IxLoad connect should always be called, even for local scripts IxLoad.connect(remoteServer) # once we've connected, make sure we disconnect, even if there's a problem try: # # Loads plugins for specific protocols configured in this test # IxLoad.loadAppPlugin("HTTP") # # setup logger # logtag = "IxLoad-python-api" logName = "HTTP" logger = IxLoad.new("ixLogger", logtag, 1) logEngine = logger.getEngine() logEngine.setLevels(IxLoad.ixLogger.kLevelDebug, IxLoad.ixLogger.kLevelWarning) logEngine.setFile(logName, 2, 256, 1) #-----------------------------------------------------------------------