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

Reply via email to