def test_getLogger(self, mock_oslogging, mock_rally_context_adapter, mock_log): name = "fake" vers = "fake" mock_oslogging._loggers = {} returned_logger = rally_logging.getLogger(name, vers) self.assertIn(name, mock_oslogging._loggers) mock_rally_context_adapter.assert_called_once_with( mock_log.getLogger(name), {"project": "rally", "version": vers}) self.assertEqual(mock_oslogging._loggers[name], returned_logger)
def test_logcatcher(self): LOG = rally_logging.getLogger("testlogger") LOG.logger.setLevel(rally_logging.INFO) with rally_logging.LogCatcher(LOG) as catcher: LOG.warning("Warning") LOG.info("Info") LOG.debug("Debug") catcher.assertInLogs("Warning") self.assertRaises(AssertionError, catcher.assertInLogs, "Error") self.assertEqual(["Warning", "Info"], catcher.fetchLogs()) self.assertEqual(2, len(catcher.fetchLogRecords()))
def __init__(self, expected_failures=None, skipped_tests=None, live=False, logger_name=None): self._tests = {} self._expected_failures = expected_failures or {} self._skipped_tests = skipped_tests or {} self._live = live self._logger = logging.getLogger(logger_name or __name__) self._timestamps = {} # NOTE(andreykurilin): _first_timestamp and _last_timestamp variables # are designed to calculate the total time of tests execution. self._first_timestamp = None self._last_timestamp = None # Store unknown entities and process them later. self._unknown_entities = {} self._is_parsed = False
# Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from rally.common import logging from rally.common import utils as rutils from rally.common import validation from rally.plugins.openstack.cleanup import manager as resource_manager from rally.plugins.openstack.scenarios.nova import utils as nova_utils from rally.plugins.openstack import types from rally.task import context LOG = logging.getLogger(__name__) @validation.add("required_platform", platform="openstack", users=True) @context.configure(name="servers", platform="openstack", order=430) class ServerGenerator(context.Context): """Creates specified amount of Nova Servers per each tenant.""" CONFIG_SCHEMA = { "type": "object", "properties": { "image": { "description": "Name of image to boot server(s) from.", "type": "object", "properties": { "name": {"type": "string"}
def run(argv, categories): parser = lambda subparsers: _add_command_parsers(categories, subparsers) category_opt = cfg.SubCommandOpt("category", title="Command categories", help="Available categories", handler=parser) CONF.register_cli_opt(category_opt) help_msg = ("Additional custom plugin locations. Multiple files or " "directories may be specified. All plugins in the specified" " directories and subdirectories will be imported. Plugins in" " /opt/rally/plugins and ~/.rally/plugins will always be " "imported.") CONF.register_cli_opt(cfg.ListOpt("plugin-paths", default=os.environ.get( "RALLY_PLUGIN_PATHS"), help=help_msg)) try: CONF(argv[1:], project="rally", version=version.version_string(), default_config_files=find_config_files(CONFIG_SEARCH_PATHS)) logging.setup("rally") if not CONF.get("log_config_append"): # The below two lines are to disable noise from request module. The # standard way should be we make such lots of settings on the root # rally. However current oslo codes doesn't support such interface. # So I choose to use a 'hacking' way to avoid INFO logs from # request module where user didn't give specific log configuration. # And we could remove this hacking after oslo.log has such # interface. LOG.debug("INFO logs from urllib3 and requests module are hide.") requests_log = logging.getLogger("requests").logger requests_log.setLevel(logging.WARNING) urllib3_log = logging.getLogger("urllib3").logger urllib3_log.setLevel(logging.WARNING) # NOTE(wtakase): This is for suppressing boto error logging. LOG.debug("ERROR log from boto module is hide.") boto_log = logging.getLogger("boto").logger boto_log.setLevel(logging.CRITICAL) except cfg.ConfigFilesNotFoundError: cfgfile = CONF.config_file[-1] if CONF.config_file else None if cfgfile and not os.access(cfgfile, os.R_OK): st = os.stat(cfgfile) print(_("Could not read %s. Re-running with sudo") % cfgfile) try: os.execvp("sudo", ["sudo", "-u", "#%s" % st.st_uid] + sys.argv) except Exception: print(_("sudo failed, continuing as if nothing happened")) print(_("Please re-run %s as root.") % argv[0]) return(2) if CONF.category.name == "version": print(version.version_string()) return(0) if CONF.category.name == "bash-completion": print(_generate_bash_completion_script()) return(0) fn = CONF.category.action_fn fn_args = [encodeutils.safe_decode(arg) for arg in CONF.category.action_args] fn_kwargs = {} for k in CONF.category.action_kwargs: v = getattr(CONF.category, "action_kwarg_" + k) if v is None: continue if isinstance(v, six.string_types): v = encodeutils.safe_decode(v) fn_kwargs[k] = v # call the action with the remaining arguments # check arguments try: validate_args(fn, *fn_args, **fn_kwargs) except MissingArgs as e: # NOTE(mikal): this isn't the most helpful error message ever. It is # long, and tells you a lot of things you probably don't want to know # if you just got a single arg wrong. print(fn.__doc__) CONF.print_help() print("Missing arguments:") for missing in e.missing: for arg in fn.args: if arg[1].get("dest", "").endswith(missing): print(" " + arg[0][0]) break return(1) try: for path in CONF.plugin_paths or []: discover.load_plugins(path) validate_deprecated_args(argv, fn) if getattr(fn, "_suppress_warnings", False): with warnings.catch_warnings(): warnings.simplefilter("ignore") ret = fn(*fn_args, **fn_kwargs) else: ret = fn(*fn_args, **fn_kwargs) return(ret) except (IOError, TypeError, ValueError, exceptions.DeploymentNotFound, exceptions.TaskNotFound, jsonschema.ValidationError) as e: if logging.is_debug(): LOG.exception(e) print(e) return 1 except sqlalchemy.exc.OperationalError as e: if logging.is_debug(): LOG.exception(e) print(e) print("Looks like Rally can't connect to its DB.") print("Make a sure that connection string in rally.conf is proper:") print(CONF.database.connection) return 1 except Exception: print(_("Command failed, please check log for more info")) raise
# # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from rally.common import logging LOG = logging.getLogger(__file__) class OpenStackCredential(dict): """Credential for OpenStack.""" def __init__(self, auth_url, username, password, tenant_name=None, project_name=None, permission=None, region_name=None, endpoint_type=None, domain_name=None, endpoint=None, user_domain_name=None, project_domain_name=None, https_insecure=False, https_cacert=None, profiler_hmac_key=None, profiler_conn_str=None, **kwargs): if kwargs: raise TypeError("%s" % kwargs)
# Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import abc import traceback import six from rally.common import logging from rally.common.plugin import plugin from rally import exceptions LOG = logging.getLogger(__name__) @logging.log_deprecated_args("Use 'platform' arg instead", "0.10.0", ["namespace"], log_function=LOG.warning) def configure(name, platform="default", namespace=None): if namespace: platform = namespace def wrapper(cls): return plugin.configure(name=name, platform=platform)(cls) return wrapper
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from rally.common import cfg from rally.common import logging from rally import exceptions from rally.task import atomic from rally.task import utils from rally_openstack import scenario from rally_openstack.scenarios.cinder import utils as cinder_utils from rally_openstack.services.image import image as image_service CONF = cfg.CONF LOG = logging.getLogger(__file__) class NovaScenario(scenario.OpenStackScenario): """Base class for Nova scenarios with basic atomic actions.""" @atomic.action_timer("nova.list_servers") def _list_servers(self, detailed=True): """Returns user servers list.""" return self.clients("nova").servers.list(detailed) def _pick_random_nic(self): """Choose one network from existing ones.""" ctxt = self.context nets = [ net["id"] for net in ctxt.get("tenant", {}).get("networks", []) ]
def __init__(self, config_file=None, config_args=None, rally_endpoint=None, plugin_paths=None, skip_db_check=False): """Initialize Rally API instance :param config_file: Path to rally configuration file. If None, default path will be selected :type config_file: str :param config_args: Arguments for initialization current configuration :type config_args: list :param rally_endpoint: [Restricted]Rally endpoint connection string. :type rally_endpoint: str :param plugin_paths: Additional custom plugin locations :type plugin_paths: list :param skip_db_check: Allows to skip db revision check :type skip_db_check: bool """ if rally_endpoint: raise NotImplementedError( _LE("Sorry, but Rally-as-a-Service is " "not ready yet.")) try: config_files = ([config_file] if config_file else self._default_config_file()) CONF(config_args or [], project="rally", version=rally_version.version_string(), default_config_files=config_files) logging.setup("rally") if not CONF.get("log_config_append"): # The below two lines are to disable noise from request module. # The standard way should be we make such lots of settings on # the root rally. However current oslo codes doesn't support # such interface. So I choose to use a 'hacking' way to avoid # INFO logs from request module where user didn't give specific # log configuration. And we could remove this hacking after # oslo.log has such interface. LOG.debug( "INFO logs from urllib3 and requests module are hide.") requests_log = logging.getLogger("requests").logger requests_log.setLevel(logging.WARNING) urllib3_log = logging.getLogger("urllib3").logger urllib3_log.setLevel(logging.WARNING) LOG.debug("urllib3 insecure warnings are hidden.") for warning in ("InsecurePlatformWarning", "SNIMissingWarning", "InsecureRequestWarning"): warning_cls = getattr(urllib3.exceptions, warning, None) if warning_cls is not None: urllib3.disable_warnings(warning_cls) # NOTE(wtakase): This is for suppressing boto error logging. LOG.debug("ERROR log from boto module is hide.") boto_log = logging.getLogger("boto").logger boto_log.setLevel(logging.CRITICAL) # Set alembic log level to ERROR alembic_log = logging.getLogger("alembic").logger alembic_log.setLevel(logging.ERROR) except cfg.ConfigFilesNotFoundError as e: cfg_files = e.config_files raise exceptions.RallyException( _LE("Failed to read configuration file(s): %s") % cfg_files) # Check that db is upgraded to the latest revision if not skip_db_check: self.check_db_revision() # Load plugins plugin_paths = plugin_paths or [] if "plugin_paths" in CONF: plugin_paths.extend(CONF.get("plugin_paths") or []) for path in plugin_paths: discover.load_plugins(path) # NOTE(andreykurilin): There is no reason to auto-discover API's. We # have only 4 classes, so let's do it in good old way - hardcode them:) self._deployment = _Deployment self._task = _Task self._verifier = _Verifier self._verification = _Verification