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
