diff --git a/devstack/actions.py b/devstack/actions.py index b9c974f7..8fe3168f 100644 --- a/devstack/actions.py +++ b/devstack/actions.py @@ -286,7 +286,7 @@ class InstallRunner(ActionRunner): PhaseFunctors( start=lambda name: LOG.info('Installing %s.', colorizer.quote(name)), run=lambda i: i.install(), - end=(lambda name, result: LOG.info("Finished install of %s items - check %s for information on what was done", + end=(lambda name, result: LOG.info("Finished install of %s items - check %s for information on what was done.", colorizer.quote(name), colorizer.quote(result))), ), component_order, diff --git a/devstack/colorizer.py b/devstack/colorizer.py index 745cf0c9..ed7fb975 100644 --- a/devstack/colorizer.py +++ b/devstack/colorizer.py @@ -31,7 +31,10 @@ def quote(data, quote_color='green'): if not is_terminal(): return "'%s'" % (data) else: - return color(data, quote_color) + text = str(data) + if len(text) == 0: + text = "''" + return color(text, quote_color) def format(data, params): diff --git a/devstack/components/db.py b/devstack/components/db.py index 09c66e9b..e596af60 100644 --- a/devstack/components/db.py +++ b/devstack/components/db.py @@ -14,6 +14,7 @@ # License for the specific language governing permissions and limitations # under the License. +from devstack import colorizer from devstack import component as comp from devstack import exceptions as excp from devstack import log as logging @@ -239,6 +240,7 @@ def drop_db(cfg, pw_gen, distro, dbname): dbtype = cfg.get("db", "type") dropcmd = distro.get_command(dbtype, 'drop_db', silent=True) if dropcmd: + LOG.info('Dropping %s database: %s', colorizer.quote(dbtype), colorizer.quote(dbname)) params = dict() params['PASSWORD'] = pw_gen.get_password("sql", PASSWORD_PROMPT) params['USER'] = cfg.getdefaulted("db", "sql_user", 'root') @@ -261,7 +263,7 @@ def create_db(cfg, pw_gen, distro, dbname, utf8=False): else: createcmd = distro.get_command(dbtype, 'create_db_utf8', silent=True) if createcmd: - LOG.debug('Creating %s database %s', dbtype, dbname) + LOG.info('Creating %s database: %s', colorizer.quote(dbtype), colorizer.quote(dbname)) params = dict() params['PASSWORD'] = pw_gen.get_password("sql", PASSWORD_PROMPT) params['USER'] = cfg.getdefaulted("db", "sql_user", 'root') diff --git a/devstack/components/glance.py b/devstack/components/glance.py index e1959781..7cc0f8ca 100644 --- a/devstack/components/glance.py +++ b/devstack/components/glance.py @@ -17,6 +17,7 @@ import io from devstack import cfg +from devstack import colorizer from devstack import component as comp from devstack import log as logging from devstack import shell as sh @@ -99,7 +100,6 @@ class GlanceInstaller(GlanceMixin, comp.PythonInstallComponent): self._setup_db() def _setup_db(self): - LOG.info("Fixing up database named %r", DB_NAME) db.drop_db(self.cfg, self.pw_gen, self.distro, DB_NAME) db.create_db(self.cfg, self.pw_gen, self.distro, DB_NAME, utf8=True) diff --git a/devstack/components/horizon.py b/devstack/components/horizon.py index b5d2293f..eb3ef200 100644 --- a/devstack/components/horizon.py +++ b/devstack/components/horizon.py @@ -14,6 +14,7 @@ # License for the specific language governing permissions and limitations # under the License. +from devstack import colorizer from devstack import component as comp from devstack import exceptions as excp from devstack import log as logging @@ -55,6 +56,7 @@ BAD_APACHE_USERS = ['root'] # Apache logs will go here LOGS_DIR = "logs" +# This db will be dropped and created DB_NAME = 'horizon' @@ -123,11 +125,10 @@ class HorizonInstaller(comp.PythonInstallComponent): def _sync_db(self): # Initialize the horizon database (it stores sessions and notices shown to users). # The user system is external (keystone). - LOG.info("Initializing the horizon database.") + LOG.info("Syncing horizon to database: %s", colorizer.quote(DB_NAME)) sh.execute(*DB_SYNC_CMD, cwd=self.app_dir) def _setup_db(self): - LOG.info("Fixing up database named %r", DB_NAME) db.drop_db(self.cfg, self.pw_gen, self.distro, DB_NAME) db.create_db(self.cfg, self.pw_gen, self.distro, DB_NAME, utf8=True) diff --git a/devstack/components/keystone.py b/devstack/components/keystone.py index 4c8bcceb..a323cd15 100644 --- a/devstack/components/keystone.py +++ b/devstack/components/keystone.py @@ -19,6 +19,7 @@ import io from urlparse import urlunparse from devstack import cfg +from devstack import colorizer from devstack import component as comp from devstack import log as logging from devstack import shell as sh @@ -113,7 +114,7 @@ class KeystoneInstaller(comp.PythonInstallComponent): return set(['swift', 'quantum']) def _sync_db(self): - LOG.info("Syncing keystone to database named %r", DB_NAME) + LOG.info("Syncing keystone to database: %s", colorizer.quote(DB_NAME)) mp = self._get_param_map(None) cmds = [{'cmd': SYNC_DB_CMD}] utils.execute_template(*cmds, cwd=self.bin_dir, params=mp) @@ -122,12 +123,11 @@ class KeystoneInstaller(comp.PythonInstallComponent): return list(CONFIGS) def _setup_db(self): - LOG.info("Fixing up database named %r", DB_NAME) db.drop_db(self.cfg, self.pw_gen, self.distro, DB_NAME) db.create_db(self.cfg, self.pw_gen, self.distro, DB_NAME, utf8=True) def _setup_initer(self): - LOG.info("Configuring keystone initializer template %r", MANAGE_DATA_CONF) + LOG.info("Configuring keystone initializer template: %s", colorizer.quote(MANAGE_DATA_CONF)) (_, contents) = utils.load_template(self.component_name, MANAGE_DATA_CONF) mp = self._get_param_map(MANAGE_DATA_CONF) contents = utils.param_replace(contents, mp, True) diff --git a/devstack/components/melange.py b/devstack/components/melange.py index 916537cf..3aa67d3f 100644 --- a/devstack/components/melange.py +++ b/devstack/components/melange.py @@ -17,6 +17,7 @@ import io from devstack import cfg +from devstack import colorizer from devstack import component as comp from devstack import log as logging from devstack import shell as sh @@ -75,7 +76,6 @@ class MelangeInstaller(comp.PythonInstallComponent): return places def _setup_db(self): - LOG.info("Fixing up database named %r", DB_NAME) db.drop_db(self.cfg, self.pw_gen, self.distro, DB_NAME) db.create_db(self.cfg, self.pw_gen, self.distro, DB_NAME, utf8=True) @@ -85,7 +85,7 @@ class MelangeInstaller(comp.PythonInstallComponent): self._sync_db() def _sync_db(self): - LOG.info("Syncing melange to database named %r", DB_NAME) + LOG.info("Syncing melange to database: %s", colorizer.quote(DB_NAME)) utils.execute_template(*DB_SYNC_CMD, params=self._get_param_map(None)) def _get_param_map(self, config_fn): diff --git a/devstack/components/nova.py b/devstack/components/nova.py index e2c6a5c7..9ebb1f16 100644 --- a/devstack/components/nova.py +++ b/devstack/components/nova.py @@ -21,6 +21,7 @@ import weakref from urlparse import urlunparse from devstack import cfg +from devstack import colorizer from devstack import component as comp from devstack import date from devstack import exceptions @@ -240,7 +241,7 @@ class NovaUninstaller(NovaMixin, comp.PythonUninstallComponent): env['VOLUME_NAME_PREFIX'] = self.cfg.getdefaulted('nova', 'volume_name_prefix', DEF_VOL_PREFIX) cleaner_fn = sh.joinpths(self.bin_dir, CLEANER_DATA_CONF) if sh.isfile(cleaner_fn): - LOG.info("Cleaning up your system by running nova cleaner script %r" % (cleaner_fn)) + LOG.info("Cleaning up your system by running nova cleaner script: %s", colorizer.quote(cleaner_fn)) cmd = CLEANER_CMD_ROOT + [cleaner_fn] sh.execute(*cmd, run_as_root=True, env_overrides=env) @@ -288,7 +289,7 @@ class NovaInstaller(NovaMixin, comp.PythonInstallComponent): self.pw_gen.get_password(pw_key, pw_prompt) def _setup_network_initer(self): - LOG.info("Configuring nova network initializer template %r", NET_INIT_CONF) + LOG.info("Configuring nova network initializer template: %s", colorizer.quote(NET_INIT_CONF)) (_, contents) = utils.load_template(self.component_name, NET_INIT_CONF) params = self._get_param_map(NET_INIT_CONF) contents = utils.param_replace(contents, params, True) @@ -299,7 +300,7 @@ class NovaInstaller(NovaMixin, comp.PythonInstallComponent): self.tracewriter.file_touched(tgt_fn) def _sync_db(self): - LOG.info("Syncing nova to database named %r", DB_NAME) + LOG.info("Syncing nova to database named: %s", colorizer.quote(DB_NAME)) mp = self._get_param_map(None) utils.execute_template(*DB_SYNC_CMD, params=mp) @@ -315,7 +316,7 @@ class NovaInstaller(NovaMixin, comp.PythonInstallComponent): self.volume_maker.setup_volumes() def _setup_cleaner(self): - LOG.info("Configuring cleaner template %r", CLEANER_DATA_CONF) + LOG.info("Configuring cleaner template: %s", colorizer.quote(CLEANER_DATA_CONF)) (_, contents) = utils.load_template(self.component_name, CLEANER_DATA_CONF) # FIXME, stop placing in checkout dir... tgt_fn = sh.joinpths(self.bin_dir, CLEANER_DATA_CONF) @@ -324,13 +325,12 @@ class NovaInstaller(NovaMixin, comp.PythonInstallComponent): self.tracewriter.file_touched(tgt_fn) def _setup_db(self): - LOG.info("Fixing up database named %r", DB_NAME) db.drop_db(self.cfg, self.pw_gen, self.distro, DB_NAME) db.create_db(self.cfg, self.pw_gen, self.distro, DB_NAME) def _generate_nova_conf(self, root_wrapped): conf_fn = self._get_target_config_name(API_CONF) - LOG.info("Generating dynamic content for nova: %r" % (conf_fn)) + LOG.info("Generating dynamic content for nova: %s", colorizer.quote(conf_fn)) nova_conf_contents = self.conf_maker.configure(root_wrapped) self.tracewriter.dirs_made(*sh.mkdirslist(sh.dirname(conf_fn))) self.tracewriter.cfg_file_written(sh.write_file(conf_fn, nova_conf_contents)) diff --git a/devstack/components/quantum.py b/devstack/components/quantum.py index 13680e1f..e9268d5c 100644 --- a/devstack/components/quantum.py +++ b/devstack/components/quantum.py @@ -17,6 +17,7 @@ import io from devstack import cfg +from devstack import colorizer from devstack import component as comp from devstack import log as logging from devstack import shell as sh @@ -116,7 +117,7 @@ class QuantumInstaller(QuantumMixin, comp.PkgInstallComponent): 'no-ovs-bridge-init' in self.options: return bridge = self.cfg.getdefaulted("quantum", "ovs_bridge", 'br-int') - LOG.info("Fixing up ovs bridge named %s.", bridge) + LOG.info("Fixing up ovs bridge named: %s", colorizer.quote(bridge)) external_id = self.cfg.getdefaulted("quantum", 'ovs_bridge_external_name', bridge) params = dict() params['OVS_BRIDGE'] = bridge @@ -138,7 +139,6 @@ class QuantumInstaller(QuantumMixin, comp.PkgInstallComponent): if not self.q_vswitch_service or \ 'no-ovs-db-init' in self.options: return - LOG.info("Fixing up database named %r", DB_NAME) db.drop_db(self.cfg, self.pw_gen, self.distro, DB_NAME) db.create_db(self.cfg, self.pw_gen, self.distro, DB_NAME, utf8=True) diff --git a/devstack/components/rabbit.py b/devstack/components/rabbit.py index e66dd1e3..138dd994 100644 --- a/devstack/components/rabbit.py +++ b/devstack/components/rabbit.py @@ -16,6 +16,7 @@ from tempfile import TemporaryFile +from devstack import colorizer from devstack import component as comp from devstack import log as logging from devstack import shell as sh @@ -46,12 +47,12 @@ class RabbitUninstaller(comp.PkgUninstallComponent): def pre_uninstall(self): try: self.runtime.restart() - LOG.info("Attempting to reset the rabbit-mq guest password to %r", RESET_BASE_PW) + LOG.info("Attempting to reset the rabbit-mq guest password to: %s", colorizer.quote(RESET_BASE_PW)) cmd = self.distro.get_command('rabbit-mq', 'change_password') + [RESET_BASE_PW] sh.execute(*cmd, run_as_root=True) except IOError: LOG.warn(("Could not reset the rabbit-mq password. You might have to manually " - "reset the password to %r before the next install") % (RESET_BASE_PW)) + "reset the password to %s before the next install"), colorizer.quote(RESET_BASE_PW)) class RabbitInstaller(comp.PkgInstallComponent): diff --git a/devstack/components/swift.py b/devstack/components/swift.py index 710bd375..c68fce94 100644 --- a/devstack/components/swift.py +++ b/devstack/components/swift.py @@ -16,6 +16,7 @@ import re +from devstack import colorizer from devstack import component as comp from devstack import log as logging from devstack import shell as sh diff --git a/devstack/distros/oneiric.py b/devstack/distros/oneiric.py index ce3cd597..f67706e6 100644 --- a/devstack/distros/oneiric.py +++ b/devstack/distros/oneiric.py @@ -33,7 +33,7 @@ LOG = logging.getLogger(__name__) class DBInstaller(db.DBInstaller): def _configure_db_confs(self): - LOG.info("Fixing up %r mysql configs.", self.distro.name) + LOG.info("Fixing up %s mysql configs.", colorizer.quote(self.distro.name)) fc = sh.load_file('/etc/mysql/my.cnf') lines = fc.splitlines() new_lines = list() diff --git a/devstack/distros/rhel6.py b/devstack/distros/rhel6.py index 42238f24..fcb1cec8 100644 --- a/devstack/distros/rhel6.py +++ b/devstack/distros/rhel6.py @@ -20,6 +20,7 @@ import re +from devstack import colorizer from devstack import log as logging from devstack import shell as sh from devstack import utils @@ -50,7 +51,7 @@ DEF_IDENT = 'unix-group:libvirtd' class DBInstaller(db.DBInstaller): def _configure_db_confs(self): - LOG.info("Fixing up %r mysql configs.", self.distro.name) + LOG.info("Fixing up %s mysql configs.", colorizer.quote(self.distro.name)) fc = sh.load_file('/etc/my.cnf') lines = fc.splitlines() new_lines = list() @@ -68,14 +69,14 @@ class HorizonInstaller(horizon.HorizonInstaller): def _config_fix_wsgi(self): # This is recorded so it gets cleaned up during uninstall self.tracewriter.file_touched("/etc/httpd/conf.d/wsgi-socket-prefix.conf") - LOG.info("Fixing up %r" % ("/etc/httpd/conf.d/wsgi-socket-prefix.conf")) + LOG.info("Fixing up: %s", colorizer.quote("/etc/httpd/conf.d/wsgi-socket-prefix.conf")) contents = "WSGISocketPrefix %s" % (sh.joinpths(self.log_dir, "wsgi-socket")) with sh.Rooted(True): # The name seems to need to come after wsgi.conf (so thats what we are doing) sh.write_file("/etc/httpd/conf.d/wsgi-socket-prefix.conf", contents) def _config_fix_httpd(self): - LOG.info("Fixing up %r" % ('/etc/httpd/conf/httpd.conf')) + LOG.info("Fixing up: %s", colorizer.quote('/etc/httpd/conf/httpd.conf')) (user, group) = self._get_apache_user_group() old_lines = sh.load_file('/etc/httpd/conf/httpd.conf').splitlines() new_lines = list()