Yedidyah Bar David has uploaded a new change for review. Change subject: packaging: setup: refactor db credentials questions ......................................................................
packaging: setup: refactor db credentials questions Move the questions for db credentials to a common place. Change-Id: I1451e581a89b750ab34c09e34faeb77403909f00 Signed-off-by: Yedidyah Bar David <[email protected]> --- M packaging/setup/ovirt_engine_setup/constants.py M packaging/setup/ovirt_engine_setup/database.py M packaging/setup/plugins/ovirt-engine-setup/ovirt-engine-common/db/connection.py M packaging/setup/plugins/ovirt-engine-setup/ovirt-engine/provisioning/postgres.py 4 files changed, 242 insertions(+), 199 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/61/28261/1 diff --git a/packaging/setup/ovirt_engine_setup/constants.py b/packaging/setup/ovirt_engine_setup/constants.py index 49345f6..0094ae8 100644 --- a/packaging/setup/ovirt_engine_setup/constants.py +++ b/packaging/setup/ovirt_engine_setup/constants.py @@ -635,6 +635,19 @@ 'database': DBEnv.DATABASE, 'connection': DBEnv.CONNECTION, 'pgpassfile': DBEnv.PGPASS_FILE, + 'newDatabase': DBEnv.NEW_DATABASE, + } + + @classproperty + def DEFAULT_ENGINE_DB_ENV_KEYS(self): + return { + 'host': Defaults.DEFAULT_DB_HOST, + 'port': Defaults.DEFAULT_DB_PORT, + 'secured': Defaults.DEFAULT_DB_SECURED, + 'hostValidation': Defaults.DEFAULT_DB_SECURED_HOST_VALIDATION, + 'user': Defaults.DEFAULT_DB_USER, + 'password': Defaults.DEFAULT_DB_PASSWORD, + 'database': Defaults.DEFAULT_DB_DATABASE, } diff --git a/packaging/setup/ovirt_engine_setup/database.py b/packaging/setup/ovirt_engine_setup/database.py index ffa7a97..ab4d698 100644 --- a/packaging/setup/ovirt_engine_setup/database.py +++ b/packaging/setup/ovirt_engine_setup/database.py @@ -356,11 +356,16 @@ def command(self): return self._plugin.command + @property + def dialog(self): + return self._plugin.dialog + def __init__( self, plugin, dbenvkeys, environment=None, + defaultdbenvkeys=None, ): super(OvirtUtils, self).__init__() self._plugin = plugin @@ -370,6 +375,7 @@ else environment ) self._dbenvkeys = dbenvkeys + self._defaults = defaultdbenvkeys def detectCommands(self): self.command.detect('pg_dump') @@ -715,5 +721,222 @@ # existing. When doing that, verify with both pg 8 and 9. ) + def _checkDbEncoding(self, name): + + statement = Statement( + environment=self.environment, + dbenvkeys=self._dbenvkeys, + ) + encoding = statement.execute( + statement=""" + show server_encoding + """, + ownConnection=True, + transaction=False, + )[0]['server_encoding'] + if encoding.lower() != 'utf8': + raise RuntimeError( + _( + 'Encoding of the {name} database is {encoding}. ' + '{name} installation is only supported on servers ' + 'with default encoding set to UTF8. Please fix the ' + 'default DB encoding before you continue' + ).format( + encoding=encoding, + name=name, + ) + ) + + def getCredentials(self, name, queryprefix, show_create_msg=False): + interactive = None in ( + self.environment[self._dbenvkeys['host']], + self.environment[self._dbenvkeys['port']], + self.environment[self._dbenvkeys['database']], + self.environment[self._dbenvkeys['user']] + self.environment[self._dbenvkeys['password']], + ) + + if interactive and show_create_msg: + self.dialog.note( + text=_( + "\n" + "ATTENTION\n" + "\n" + "Manual action required.\n" + "Please create database for ovirt-engine use. " + "Use the following commands as an example:\n" + "\n" + "create role {user} with login encrypted password '{user}'" + ";\n" + "create database {database} owner {user}\n" + " template template0\n" + " encoding 'UTF8' lc_collate 'en_US.UTF-8'\n" + " lc_ctype 'en_US.UTF-8';\n" + "\n" + "Make sure that database can be accessed remotely.\n" + "\n" + ).format( + user=self._defaults['user'], + database=self._defaults['database'], + ), + ) + + connectionValid = False + while not connectionValid: + host = self.environment[self._dbenvkeys['host']] + port = self.environment[self._dbenvkeys['port']] + secured = self.environment[self._dbenvkeys['secured']] + securedHostValidation = self.environment[ + self._dbenvkeys['hostValidation'] + ] + db = self.environment[self._dbenvkeys['database']] + user = self.environment[self._dbenvkeys['user']] + password = self.environment[self._dbenvkeys['password']] + + if host is None: + while True: + host = self.dialog.queryString( + name='{qpref}HOST'.format(qpref=queryprefix), + note=_( + '{name} database host [@DEFAULT@]: ' + ).format( + name=name, + ), + prompt=True, + default=self._defaults['host'], + ) + try: + socket.getaddrinfo(host, None) + break # do while missing in python + except socket.error as e: + self.logger.error( + _('Host is invalid: {error}').format( + error=e.strerror + ) + ) + + if port is None: + while True: + try: + port = osetuputil.parsePort( + self.dialog.queryString( + name='{qpref}PORT'.format(qpref=queryprefix), + note=_( + '{name} database port [@DEFAULT@]: ' + ).format( + name=name, + ), + prompt=True, + default=self._defaults['port'], + ) + ) + break # do while missing in python + except ValueError: + pass + + if secured is None: + secured = dialog.queryBoolean( + dialog=self.dialog, + name='{qpref}SECURED'.format(qpref=queryprefix), + note=_( + '{name} database secured connection (@VALUES@) ' + '[@DEFAULT@]: ' + ).format( + name=name, + ), + prompt=True, + default=self._defaults['secured'], + ) + + if not secured: + securedHostValidation = False + + if securedHostValidation is None: + securedHostValidation = dialog.queryBoolean( + dialog=self.dialog, + name='{qpref}SECURED_HOST_VALIDATION'.format( + qpref=queryprefix + ), + note=_( + '{name} database host name validation in secured ' + 'connection (@VALUES@) [@DEFAULT@]: ' + ).format( + name=name, + ), + prompt=True, + default=True, + ) == 'yes' + + if db is None: + db = self.dialog.queryString( + name='{qpref}DATABASE'.format(qpref=queryprefix), + note=_( + '{name} database name [@DEFAULT@]: ' + ).format( + name=name, + ), + prompt=True, + default=self._defaults['database'], + ) + + if user is None: + user = self.dialog.queryString( + name='{qpref}USER'.format(qpref=queryprefix), + note=_( + '{name} database user [@DEFAULT@]: ' + ).format( + name=name, + ), + prompt=True, + default=self._defaults['user'], + ) + + if password is None: + password = self.dialog.queryString( + name='{qpref}PASSWORD'.format(qpref=queryprefix), + note=_( + '{name} database password: ' + ).format( + name=name, + ), + prompt=True, + hidden=True, + ) + + dbenv = { + self._dbenvkeys['host']: host, + self._dbenvkeys['port']: port, + self._dbenvkeys['secured']: secured, + self._dbenvkeys['hostValidation']: securedHostValidation, + self._dbenvkeys['user']: user, + self._dbenvkeys['password']: password, + self._dbenvkeys['database']: db, + } + + if interactive: + try: + self.tryDatabaseConnect(dbenv) + self._checkDbEncoding(dbenv, name=name) + self.environment.update(dbenv) + connectionValid = True + except RuntimeError as e: + self.logger.error( + _('Cannot connect to {name} database: {error}').format( + name=name, + error=e, + ) + ) + else: + # this is usally reached in provisioning + # or if full ansewr file + self.environment.update(dbenv) + connectionValid = True + + try: + self.environment[ + self._dbenvkeys['newDatabase'] + ] = self.isNewDatabase() + except: + self.logger.debug('database connection failed', exc_info=True) # vim: expandtab tabstop=4 shiftwidth=4 diff --git a/packaging/setup/plugins/ovirt-engine-setup/ovirt-engine-common/db/connection.py b/packaging/setup/plugins/ovirt-engine-setup/ovirt-engine-common/db/connection.py index 2feb7e1..f5bb2d4 100644 --- a/packaging/setup/plugins/ovirt-engine-setup/ovirt-engine-common/db/connection.py +++ b/packaging/setup/plugins/ovirt-engine-setup/ovirt-engine-common/db/connection.py @@ -63,30 +63,6 @@ if connection is not None: connection.commit() - def _checkDbEncoding(self, environment): - - statement = database.Statement( - dbenvkeys=osetupcons.Const.ENGINE_DB_ENV_KEYS, - environment=environment, - ) - encoding = statement.execute( - statement=""" - show server_encoding - """, - ownConnection=True, - transaction=False, - )[0]['server_encoding'] - if encoding.lower() != 'utf8': - raise RuntimeError( - _( - 'Encoding of the Engine database is {encoding}. ' - 'Engine installation is only supported on servers ' - 'with default encoding set to UTF8. Please fix the ' - 'default DB encoding before you continue' - ).format( - encoding=encoding, - ) - ) def __init__(self, context): super(Plugin, self).__init__(context=context) @@ -113,173 +89,13 @@ dbovirtutils = database.OvirtUtils( plugin=self, dbenvkeys=osetupcons.Const.ENGINE_DB_ENV_KEYS, + defaultdbenvkeys=osetupcons.Const.DEFAULT_ENGINE_DB_ENV_KEYS, ) - - interactive = None in ( - self.environment[osetupcons.DBEnv.HOST], - self.environment[osetupcons.DBEnv.PORT], - self.environment[osetupcons.DBEnv.DATABASE], - self.environment[osetupcons.DBEnv.USER], - self.environment[osetupcons.DBEnv.PASSWORD], + dbovirtutils.getCredentials( + name='Engine', + queryprefix='OVESETUP_ENGINE_DB_', + show_create_msg=True, ) - - if interactive: - self.dialog.note( - text=_( - "\n" - "ATTENTION\n" - "\n" - "Manual action required.\n" - "Please create database for ovirt-engine use. " - "Use the following commands as an example:\n" - "\n" - "create role {user} with login encrypted password '{user}'" - ";\n" - "create database {database} owner {user}\n" - " template template0\n" - " encoding 'UTF8' lc_collate 'en_US.UTF-8'\n" - " lc_ctype 'en_US.UTF-8';\n" - "\n" - "Make sure that database can be accessed remotely.\n" - "\n" - ).format( - user=osetupcons.Defaults.DEFAULT_DB_USER, - database=osetupcons.Defaults.DEFAULT_DB_DATABASE, - ), - ) - - connectionValid = False - while not connectionValid: - host = self.environment[osetupcons.DBEnv.HOST] - port = self.environment[osetupcons.DBEnv.PORT] - secured = self.environment[osetupcons.DBEnv.SECURED] - securedHostValidation = self.environment[ - osetupcons.DBEnv.SECURED_HOST_VALIDATION - ] - db = self.environment[osetupcons.DBEnv.DATABASE] - user = self.environment[osetupcons.DBEnv.USER] - password = self.environment[osetupcons.DBEnv.PASSWORD] - - if host is None: - while True: - host = self.dialog.queryString( - name='OVESETUP_ENGINE_DB_HOST', - note=_('Engine database host [@DEFAULT@]: '), - prompt=True, - default=osetupcons.Defaults.DEFAULT_DB_HOST, - ) - try: - socket.getaddrinfo(host, None) - break # do while missing in python - except socket.error as e: - self.logger.error( - _('Host is invalid: {error}').format( - error=e.strerror - ) - ) - - if port is None: - while True: - try: - port = osetuputil.parsePort( - self.dialog.queryString( - name='OVESETUP_ENGINE_DB_PORT', - note=_('Engine database port [@DEFAULT@]: '), - prompt=True, - default=osetupcons.Defaults.DEFAULT_DB_PORT, - ) - ) - break # do while missing in python - except ValueError: - pass - - if secured is None: - secured = dialog.queryBoolean( - dialog=self.dialog, - name='OVESETUP_ENGINE_DB_SECURED', - note=_( - 'Engine database secured connection (@VALUES@) ' - '[@DEFAULT@]: ' - ), - prompt=True, - default=osetupcons.Defaults.DEFAULT_DB_SECURED, - ) - - if not secured: - securedHostValidation = False - - if securedHostValidation is None: - securedHostValidation = dialog.queryBoolean( - dialog=self.dialog, - name='OVESETUP_ENGINE_DB_SECURED_HOST_VALIDATION', - note=_( - 'Engine database host name validation in secured ' - 'connection (@VALUES@) [@DEFAULT@]: ' - ), - prompt=True, - default=True, - ) == 'yes' - - if db is None: - db = self.dialog.queryString( - name='OVESETUP_ENGINE_DB_DATABASE', - note=_('Engine database name [@DEFAULT@]: '), - prompt=True, - default=osetupcons.Defaults.DEFAULT_DB_DATABASE, - ) - - if user is None: - user = self.dialog.queryString( - name='OVESETUP_ENGINE_DB_USER', - note=_('Engine database user [@DEFAULT@]: '), - prompt=True, - default=osetupcons.Defaults.DEFAULT_DB_USER, - ) - - if password is None: - password = self.dialog.queryString( - name='OVESETUP_ENGINE_DB_PASSWORD', - note=_('Engine database password: '), - prompt=True, - hidden=True, - ) - - dbenv = { - osetupcons.DBEnv.HOST: host, - osetupcons.DBEnv.PORT: port, - osetupcons.DBEnv.SECURED: secured, - osetupcons.DBEnv.SECURED_HOST_VALIDATION: ( - securedHostValidation - ), - osetupcons.DBEnv.USER: user, - osetupcons.DBEnv.PASSWORD: password, - osetupcons.DBEnv.DATABASE: db, - } - - if interactive: - try: - dbovirtutils.tryDatabaseConnect(dbenv) - self._checkDbEncoding(dbenv) - self.environment.update(dbenv) - connectionValid = True - except RuntimeError as e: - self.logger.error( - _('Cannot connect to Engine database: {error}').format( - error=e, - ) - ) - else: - # this is usally reached in provisioning - # or if full ansewr file - self.environment.update(dbenv) - connectionValid = True - - try: - self.environment[ - osetupcons.DBEnv.NEW_DATABASE - ] = dbovirtutils.isNewDatabase() - except: - self.logger.debug('database connection failed', exc_info=True) @plugin.event( stage=plugin.Stages.STAGE_MISC, diff --git a/packaging/setup/plugins/ovirt-engine-setup/ovirt-engine/provisioning/postgres.py b/packaging/setup/plugins/ovirt-engine-setup/ovirt-engine/provisioning/postgres.py index f51ac81..0ac42b9 100644 --- a/packaging/setup/plugins/ovirt-engine-setup/ovirt-engine/provisioning/postgres.py +++ b/packaging/setup/plugins/ovirt-engine-setup/ovirt-engine/provisioning/postgres.py @@ -43,16 +43,7 @@ self._provisioning = postgres.Provisioning( plugin=self, dbenvkeys=osetupcons.Const.ENGINE_DB_ENV_KEYS, - defaults={ - 'user': osetupcons.Defaults.DEFAULT_DB_USER, - 'database': osetupcons.Defaults.DEFAULT_DB_DATABASE, - 'port': osetupcons.Defaults.DEFAULT_DB_PORT, - 'secured': osetupcons.Defaults.DEFAULT_DB_SECURED, - 'hostValidation': ( - osetupcons.Defaults. - DEFAULT_DB_SECURED_HOST_VALIDATION - ), - }, + defaults=osetupcons.Const.DEFAULT_ENGINE_DB_ENV_KEYS, ) @plugin.event( -- To view, visit http://gerrit.ovirt.org/28261 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I1451e581a89b750ab34c09e34faeb77403909f00 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Yedidyah Bar David <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
