def __init__(self, core, sequence, phout, answ, answ_level, timeout, cfg, is_main=False): self.core = core self.cfg = cfg self.address_wizard = AddressWizard() self.sequence_no = sequence self.stepper_wrapper = StepperWrapper(core, cfg) self.phout_file = phout self.answ_log = answ self.answ_log_level = answ_level self.timeout = timeout self.is_main = is_main # per benchmark self.instances = self.get_option('instances') self.ipv6 = None self.ssl = None self.address = None self.port = None self.tank_type = None self.stpd = None self.gatling = None self.phantom_http_line = None self.phantom_http_field_num = None self.phantom_http_field = None self.phantom_http_entity = None self.resolved_ip = None self.method_prefix = None self.source_log_prefix = None self.method_options = None self.client_cipher_suites = None self.client_certificate = None self.client_key = None
def __init__( self, core, sequence, phout, answ, answ_level, timeout, section): self.core = core self.address_wizard = AddressWizard() self.sequence_no = sequence self.section = section self.stepper_wrapper = StepperWrapper(self.core, self.section) self.phout_file = phout self.answ_log = answ self.answ_log_level = answ_level self.timeout = timeout # per benchmark self.instances = None self.ipv6 = None self.ssl = None self.address = None self.port = None self.tank_type = None self.stpd = None self.gatling = None self.phantom_http_line = None self.phantom_http_field_num = None self.phantom_http_field = None self.phantom_http_entity = None self.resolved_ip = None self.method_prefix = None self.source_log_prefix = None self.method_options = None self.client_cipher_suites = None self.client_certificate = None self.client_key = None
def __resolve(chunk): aw = AddressWizard() # return format: is_v6, parsed_ip, int(port), address_str return aw.resolve(chunk)
class StreamConfig: """ each test stream's config """ OPTION_INSTANCES_LIMIT = 'instances' def __init__(self, core, sequence, phout, answ, answ_level, timeout, cfg, is_main=False): self.core = core self.cfg = cfg self.address_wizard = AddressWizard() self.sequence_no = sequence self.stepper_wrapper = StepperWrapper(core, cfg) self.phout_file = phout self.answ_log = answ self.answ_log_level = answ_level self.timeout = timeout self.is_main = is_main # per benchmark self.instances = self.get_option('instances') self.ipv6 = None self.ssl = None self.address = None self.port = None self.tank_type = None self.stpd = None self.gatling = None self.phantom_http_line = None self.phantom_http_field_num = None self.phantom_http_field = None self.phantom_http_entity = None self.resolved_ip = None self.method_prefix = None self.source_log_prefix = None self.method_options = None self.client_cipher_suites = None self.client_certificate = None self.client_key = None def get_option(self, option, default=None): """ get option wrapper """ return self.cfg[option] @staticmethod def get_available_options(): opts = [ "ssl", "tank_type", 'gatling_ip', "method_prefix", "source_log_prefix" ] opts += [ "phantom_http_line", "phantom_http_field_num", "phantom_http_field", "phantom_http_entity" ] opts += ['address', "port", StreamConfig.OPTION_INSTANCES_LIMIT] opts += StepperWrapper.get_available_options() opts += ["connection_test"] return opts def read_config(self): """ reads config """ # multi-options self.ssl = self.get_option("ssl") self.tank_type = self.get_option("tank_type") # TODO: refactor. Maybe we should decide how to interact with # StepperWrapper here. # self.instances = self.get_option('instances') self.gatling = ' '.join(self.get_option('gatling_ip').split("\n")) self.method_prefix = self.get_option("method_prefix") self.method_options = self.get_option("method_options") self.source_log_prefix = self.get_option("source_log_prefix") self.phantom_http_line = self.get_option("phantom_http_line") self.phantom_http_field_num = self.get_option("phantom_http_field_num") self.phantom_http_field = self.get_option("phantom_http_field") self.phantom_http_entity = self.get_option("phantom_http_entity") self.address = self.get_option('address') do_test_connect = self.get_option("connection_test") explicit_port = self.get_option('port', '') self.ipv6, self.resolved_ip, self.port, self.address = self.address_wizard.resolve( self.address, do_test_connect, explicit_port) logger.info("Resolved %s into %s:%s", self.address, self.resolved_ip, self.port) self.client_cipher_suites = self.get_option("client_cipher_suites", "") self.client_certificate = self.get_option("client_certificate", "") self.client_key = self.get_option("client_key", "") self.stepper_wrapper.read_config() def compose_config(self): """ compose benchmark block """ # step file self.stepper_wrapper.prepare_stepper() self.stpd = self.stepper_wrapper.stpd if self.stepper_wrapper.instances: self.instances = self.stepper_wrapper.instances if not self.stpd: raise RuntimeError("Cannot proceed with no STPD file") kwargs = {} kwargs['sequence_no'] = self.sequence_no if self.ssl: _auth_section = '' _ciphers = '' ssl_template = "transport_t ssl_transport = transport_ssl_t {\n" \ " timeout = 1s\n" \ " %s\n" \ " %s}\n" \ " transport = ssl_transport" if self.client_certificate or self.client_key: _auth_section = 'auth_t def_auth = auth_t { key = "%s" cert = "%s"} auth = def_auth' \ % (self.client_key, self.client_certificate) if self.client_cipher_suites: _ciphers = 'ciphers = "%s"' % self.client_cipher_suites kwargs['ssl_transport'] = ssl_template % (_auth_section, _ciphers) else: kwargs['ssl_transport'] = "" kwargs['method_stream'] = self.method_prefix + \ "_ipv6_t" if self.ipv6 else self.method_prefix + "_ipv4_t" kwargs['phout'] = self.phout_file kwargs['answ_log'] = self.answ_log kwargs['answ_log_level'] = self.answ_log_level kwargs['comment_answ'] = "# " if self.answ_log_level == 'none' else '' kwargs['stpd'] = self.stpd kwargs['source_log_prefix'] = self.source_log_prefix kwargs['method_options'] = self.method_options if self.tank_type: kwargs[ 'proto'] = "proto=http_proto%s" % self.sequence_no if self.tank_type == 'http' else "proto=none_proto" kwargs['comment_proto'] = "" else: kwargs['proto'] = "" kwargs['comment_proto'] = "#" if self.gatling: kwargs['bind'] = 'bind={ ' + self.gatling + ' }' else: kwargs['bind'] = '' kwargs['ip'] = self.resolved_ip kwargs['port'] = self.port kwargs['timeout'] = self.timeout kwargs['instances'] = self.instances tune = '' if self.phantom_http_entity: tune += "entity = " + self.phantom_http_entity + "\n" if self.phantom_http_field: tune += "field = " + self.phantom_http_field + "\n" if self.phantom_http_field_num: tune += "field_num = {}\n".format(self.phantom_http_field_num) if self.phantom_http_line: tune += "line = " + self.phantom_http_line + "\n" if tune: kwargs['reply_limits'] = 'reply_limits = {\n' + tune + "}" else: kwargs['reply_limits'] = '' if self.is_main: fname = 'phantom_benchmark_main.tpl' else: fname = 'phantom_benchmark_additional.tpl' template_str = template_str = resource_string(__name__, "config/" + fname) tpl = string.Template(template_str) config = tpl.substitute(kwargs) return config
class StreamConfig: """ each test stream's config """ OPTION_INSTANCES_LIMIT = 'instances' def __init__( self, core, sequence, phout, answ, answ_level, timeout, section): self.core = core self.address_wizard = AddressWizard() self.sequence_no = sequence self.section = section self.stepper_wrapper = StepperWrapper(self.core, self.section) self.phout_file = phout self.answ_log = answ self.answ_log_level = answ_level self.timeout = timeout # per benchmark self.instances = None self.ipv6 = None self.ssl = None self.address = None self.port = None self.tank_type = None self.stpd = None self.gatling = None self.phantom_http_line = None self.phantom_http_field_num = None self.phantom_http_field = None self.phantom_http_entity = None self.resolved_ip = None self.method_prefix = None self.source_log_prefix = None self.method_options = None self.client_cipher_suites = None self.client_certificate = None self.client_key = None def get_option(self, option_ammofile, default=None): """ get option wrapper """ return self.core.get_option(self.section, option_ammofile, default) @staticmethod def get_available_options(): opts = [ "ssl", "tank_type", 'gatling_ip', "method_prefix", "source_log_prefix" ] opts += [ "phantom_http_line", "phantom_http_field_num", "phantom_http_field", "phantom_http_entity" ] opts += ['address', "port", StreamConfig.OPTION_INSTANCES_LIMIT] opts += StepperWrapper.get_available_options() opts += ["connection_test"] return opts def read_config(self): """ reads config """ # multi-options self.ssl = int(self.get_option("ssl", '0')) self.tank_type = self.get_option("tank_type", 'http') # TODO: refactor. Maybe we should decide how to interact with # StepperWrapper here. self.instances = int( self.get_option(self.OPTION_INSTANCES_LIMIT, '1000')) self.gatling = ' '.join(self.get_option('gatling_ip', '').split("\n")) self.method_prefix = self.get_option("method_prefix", 'method_stream') self.method_options = self.get_option("method_options", '') self.source_log_prefix = self.get_option("source_log_prefix", '') self.phantom_http_line = self.get_option("phantom_http_line", "") self.phantom_http_field_num = self.get_option( "phantom_http_field_num", "") self.phantom_http_field = self.get_option("phantom_http_field", "") self.phantom_http_entity = self.get_option("phantom_http_entity", "") self.address = self.get_option('address', '127.0.0.1') do_test_connect = int(self.get_option("connection_test", "1")) > 0 explicit_port = self.get_option('port', '') self.ipv6, self.resolved_ip, self.port, self.address = self.address_wizard.resolve( self.address, do_test_connect, explicit_port) logger.info( "Resolved %s into %s:%s", self.address, self.resolved_ip, self.port) self.client_cipher_suites = self.get_option("client_cipher_suites", "") self.client_certificate = self.get_option("client_certificate", "") self.client_key = self.get_option("client_key", "") self.stepper_wrapper.read_config() def compose_config(self): """ compose benchmark block """ # step file self.stepper_wrapper.prepare_stepper() self.stpd = self.stepper_wrapper.stpd if self.stepper_wrapper.instances: self.instances = self.stepper_wrapper.instances if not self.stpd: raise RuntimeError("Cannot proceed with no STPD file") kwargs = {} kwargs['sequence_no'] = self.sequence_no if self.ssl: _auth_section = '' _ciphers = '' ssl_template = "transport_t ssl_transport = transport_ssl_t {\n" \ " timeout = 1s\n" \ " %s\n" \ " %s}\n" \ " transport = ssl_transport" if self.client_certificate or self.client_key: _auth_section = 'auth_t def_auth = auth_t { key = "%s" cert = "%s"} auth = def_auth' \ % (self.client_key, self.client_certificate) if self.client_cipher_suites: _ciphers = 'ciphers = "%s"' % self.client_cipher_suites kwargs['ssl_transport'] = ssl_template % (_auth_section, _ciphers) else: kwargs['ssl_transport'] = "" kwargs['method_stream'] = self.method_prefix + \ "_ipv6_t" if self.ipv6 else self.method_prefix + "_ipv4_t" kwargs['phout'] = self.phout_file kwargs['answ_log'] = self.answ_log kwargs['answ_log_level'] = self.answ_log_level kwargs['comment_answ'] = "# " if self.answ_log_level == 'none' else '' kwargs['stpd'] = self.stpd kwargs['source_log_prefix'] = self.source_log_prefix kwargs['method_options'] = self.method_options if self.tank_type: kwargs[ 'proto'] = "proto=http_proto%s" % self.sequence_no if self.tank_type == 'http' else "proto=none_proto" kwargs['comment_proto'] = "" else: kwargs['proto'] = "" kwargs['comment_proto'] = "#" if self.gatling: kwargs['bind'] = 'bind={ ' + self.gatling + ' }' else: kwargs['bind'] = '' kwargs['ip'] = self.resolved_ip kwargs['port'] = self.port kwargs['timeout'] = self.timeout kwargs['instances'] = self.instances tune = '' if self.phantom_http_entity: tune += "entity = " + self.phantom_http_entity + "\n" if self.phantom_http_field: tune += "field = " + self.phantom_http_field + "\n" if self.phantom_http_field_num: tune += "field_num = " + self.phantom_http_field_num + "\n" if self.phantom_http_line: tune += "line = " + self.phantom_http_line + "\n" if tune: kwargs['reply_limits'] = 'reply_limits = {\n' + tune + "}" else: kwargs['reply_limits'] = '' if self.section == PhantomConfig.SECTION: fname = 'phantom_benchmark_main.tpl' else: fname = 'phantom_benchmark_additional.tpl' template_str = template_str = resource_string( __name__, "config/" + fname) tpl = string.Template(template_str) config = tpl.substitute(kwargs) return config