Sandro Bonazzola has uploaded a new change for review.

Change subject: packaging: setup: check database object ownership on upgrade
......................................................................

packaging: setup: check database object ownership on upgrade

check database object ownership to engine before upgrade.
If the owner is not engine, abort setup asking the user to run
changedbowner.sh script for fixing it.

Change-Id: I45b655e88c25dd51e567405cc6747b42dfd8a98b
Bug-Url: https://bugzilla.redhat.com/1022691
Signed-off-by: Sandro Bonazzola <[email protected]>
---
M packaging/setup/ovirt_engine_setup/constants.py
M packaging/setup/plugins/ovirt-engine-setup/db/schema.py
2 files changed, 56 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/35/20935/1

diff --git a/packaging/setup/ovirt_engine_setup/constants.py 
b/packaging/setup/ovirt_engine_setup/constants.py
index 193e6bb..f87e168 100644
--- a/packaging/setup/ovirt_engine_setup/constants.py
+++ b/packaging/setup/ovirt_engine_setup/constants.py
@@ -164,6 +164,10 @@
         OVIRT_ENGINE_DB_UTILS_DIR,
         'taskcleaner.sh'
     )
+    OVIRT_ENGINE_DB_CHANGE_OWNER = os.path.join(
+        OVIRT_ENGINE_DB_UTILS_DIR,
+        'changedbowner.sh'
+    )
 
     OVIRT_ENGINE_DB_DIR = os.path.join(
         OVIRT_ENGINE_DATADIR,
diff --git a/packaging/setup/plugins/ovirt-engine-setup/db/schema.py 
b/packaging/setup/plugins/ovirt-engine-setup/db/schema.py
index 70728ab..04e78e3 100644
--- a/packaging/setup/plugins/ovirt-engine-setup/db/schema.py
+++ b/packaging/setup/plugins/ovirt-engine-setup/db/schema.py
@@ -89,6 +89,57 @@
     def __init__(self, context):
         super(Plugin, self).__init__(context=context)
 
+    def _checkDatabaseOwnership(self):
+        statement = database.Statement(environment=self.environment)
+        result = statement.execute(
+            statement="""
+                SELECT nsp.nspname AS object_schema,
+                    cls.relname AS object_name,
+                    rol.rolname AS owner,
+                    CASE cls.relkind
+                        WHEN 'r' THEN 'TABLE'
+                        WHEN 'i' THEN 'INDEX'
+                        WHEN 'S' THEN 'SEQUENCE'
+                        WHEN 'v' THEN 'VIEW'
+                        WHEN 'c' THEN 'TYPE'
+                        ELSE cls.relkind::text
+                    END AS object_type
+                FROM pg_class cls
+                JOIN pg_roles rol ON rol.oid = cls.relowner
+                JOIN pg_namespace nsp ON nsp.oid = cls.relnamespace
+                WHERE nsp.nspname NOT IN ('information_schema', 'pg_catalog')
+                AND nsp.nspname NOT LIKE 'pg_toast%'
+                AND rol.rolname != 'engine'
+                ORDER BY nsp.nspname, cls.relname;
+            """,
+            ownConnection=True,
+            transaction=False,
+        )
+        if len(result) > 0:
+            command = (
+                '{cmd} '
+                '-s {server} '
+                '-p {port} '
+                '-d {db} '
+                '-f postgres '
+                '-t engine'
+            ).format(
+                cmd=osetupcons.FileLocations.OVIRT_ENGINE_DB_CHANGE_OWNER,
+                server=self.environment[osetupcons.DBEnv.HOST],
+                port=self.environment[osetupcons.DBEnv.PORT],
+                db=self.environment[osetupcons.DBEnv.DATABASE],
+            )
+
+            raise RuntimeError(
+                _(
+                    'Cannot upgrade the database schema due to wrong '
+                    'ownership of some database entities.\n'
+                    'Please execute: {command}'
+                ).format(
+                    command=command,
+                )
+            )
+
     def _checkSupportedVersionsPresent(self):
         # TODO: figure out a better way to do this for the future
         statement = database.Statement(environment=self.environment)
@@ -202,6 +253,7 @@
         ),
     )
     def _miscUpgrade(self):
+        self._checkDatabaseOwnership()
         self._checkSupportedVersionsPresent()
         dbovirtutils = database.OvirtUtils(plugin=self)
         backupFile = dbovirtutils.backup()


-- 
To view, visit http://gerrit.ovirt.org/20935
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I45b655e88c25dd51e567405cc6747b42dfd8a98b
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Sandro Bonazzola <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to