Alon Bar-Lev has uploaded a new change for review.

Change subject: packaging: seutp: perform schema rollback using transaction
......................................................................

packaging: seutp: perform schema rollback using transaction

if new database - clean database.

if upgrade - clean and restore.

Change-Id: I869bc425ef6728a0e2a9ac5a9f17a22fc38bc958
Signed-off-by: Alon Bar-Lev <alo...@redhat.com>
---
M packaging/setup/plugins/ovirt-engine-setup/db/schema.py
1 file changed, 100 insertions(+), 61 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/56/17156/1

diff --git a/packaging/setup/plugins/ovirt-engine-setup/db/schema.py 
b/packaging/setup/plugins/ovirt-engine-setup/db/schema.py
index 48d4018..3dbb97b 100644
--- a/packaging/setup/plugins/ovirt-engine-setup/db/schema.py
+++ b/packaging/setup/plugins/ovirt-engine-setup/db/schema.py
@@ -27,6 +27,7 @@
 from otopi import constants as otopicons
 from otopi import util
 from otopi import plugin
+from otopi import transaction
 
 
 from ovirt_engine_setup import constants as osetupcons
@@ -36,6 +37,54 @@
 @util.export
 class Plugin(plugin.PluginBase):
     """Schema plugin."""
+
+    class SchemaTransaction(transaction.TransactionElement):
+        """yum transaction element."""
+
+        def __init__(self, parent, backup=None):
+            self._parent = parent
+            self._backup = backup
+
+        def __str__(self):
+            return _("Schema Transaction")
+
+        def prepare(self):
+            pass
+
+        def abort(self):
+            self._parent.logger.warning(_('Rolling back upgrade'))
+            try:
+                dbovirtutils = database.OvirtUtils(plugin=self._parent)
+                self._parent.logger.info(
+                    _('Clearing database {database}').format(
+                        database=self._parent.environment[
+                            osetupcons.DBEnv.DATABASE
+                        ],
+                    )
+                )
+                dbovirtutils.clearOvirtEngineDatabase()
+                if self._backup is not None and os.path.exists(self._backup):
+                    self._parent.logger.info(
+                        _('Restoring database {database}').format(
+                            database=self._parent.environment[
+                                osetupcons.DBEnv.DATABASE
+                            ],
+                        )
+                    )
+                    dbovirtutils.restore(backupFile=self._backup)
+            except Exception as e:
+                self._parent.logger.debug(
+                    'Exception during database restore',
+                    exc_info=True,
+                )
+                self._parent.logger.error(
+                    _('Database rollback failed: {error}').format(
+                        error=e,
+                    )
+                )
+
+        def commit(self):
+            pass
 
     def __init__(self, context):
         super(Plugin, self).__init__(context=context)
@@ -90,6 +139,12 @@
         ],
     )
     def _miscInstall(self):
+        self.environment[otopicons.CoreEnv.MAIN_TRANSACTION].append(
+            self.SchemaTransaction(
+                parent=self,
+            )
+        )
+
         self.logger.info(_('Creating database schema'))
         args = [
             os.path.join(
@@ -148,6 +203,13 @@
         dbovirtutils = database.OvirtUtils(plugin=self)
         backupFile = dbovirtutils.backup()
 
+        self.environment[otopicons.CoreEnv.MAIN_TRANSACTION].append(
+            self.SchemaTransaction(
+                parent=self,
+                backup=backupFile,
+            )
+        )
+
         #
         # TODO
         # rename database
@@ -155,71 +217,48 @@
         # consider doing that via python
         #
 
-        try:
-            self.logger.info(_('Updating database schema'))
-            args = [
-                osetupcons.FileLocations.OVIRT_ENGINE_DB_UPGRADE,
-                '-s', self.environment[osetupcons.DBEnv.HOST],
-                '-p', str(self.environment[osetupcons.DBEnv.PORT]),
-                '-u', self.environment[osetupcons.DBEnv.USER],
-                '-d', self.environment[osetupcons.DBEnv.DATABASE],
-                '-l', self.environment[otopicons.CoreEnv.LOG_FILE_NAME],
-            ]
-            if self.environment[
-                osetupcons.CoreEnv.DEVELOPER_MODE
-            ]:
-                if not os.path.exists(
+        self.logger.info(_('Updating database schema'))
+        args = [
+            osetupcons.FileLocations.OVIRT_ENGINE_DB_UPGRADE,
+            '-s', self.environment[osetupcons.DBEnv.HOST],
+            '-p', str(self.environment[osetupcons.DBEnv.PORT]),
+            '-u', self.environment[osetupcons.DBEnv.USER],
+            '-d', self.environment[osetupcons.DBEnv.DATABASE],
+            '-l', self.environment[otopicons.CoreEnv.LOG_FILE_NAME],
+        ]
+        if self.environment[
+            osetupcons.CoreEnv.DEVELOPER_MODE
+        ]:
+            if not os.path.exists(
+                osetupcons.FileLocations.OVIRT_ENGINE_DB_MD5_DIR
+            ):
+                os.makedirs(
                     osetupcons.FileLocations.OVIRT_ENGINE_DB_MD5_DIR
-                ):
-                    os.makedirs(
-                        osetupcons.FileLocations.OVIRT_ENGINE_DB_MD5_DIR
-                    )
-                args.extend(
-                    [
-                        '-m',
-                        osetupcons.FileLocations.OVIRT_ENGINE_DB_MD5_DIR,
-                    ]
                 )
-            else:
-                args.extend(
-                    [
-                        '-g',   # do not generate md5
-                    ]
-                )
-            self.execute(
-                args=args,
-                envAppend={
-                    'ENGINE_CERTIFICATE': (
-                        osetupcons.FileLocations.
-                        OVIRT_ENGINE_PKI_ENGINE_CA_CERT
-                    ),
-                    'ENGINE_PGPASS': self.environment[
-                        osetupcons.DBEnv.PGPASS_FILE
-                    ]
-                },
+            args.extend(
+                [
+                    '-m',
+                    osetupcons.FileLocations.OVIRT_ENGINE_DB_MD5_DIR,
+                ]
             )
-        except:
-            self.logger.debug(
-                'Exception during database upgrade',
-                exc_info=True
+        else:
+            args.extend(
+                [
+                    '-g',   # do not generate md5
+                ]
             )
-            self.logger.warning(_('Rolling back upgrade'))
-
-            try:
-                dbovirtutils.clearOvirtEngineDatabase()
-                dbovirtutils.restore(backupFile=backupFile)
-            except Exception as e:
-                self.logger.debug(
-                    'Exception during database restore',
-                    exc_info=True,
-                )
-                self.logger.error(
-                    _('Database rollback failed: {error}').format(
-                        error=e,
-                    )
-                )
-
-            raise
+        self.execute(
+            args=args,
+            envAppend={
+                'ENGINE_CERTIFICATE': (
+                    osetupcons.FileLocations.
+                    OVIRT_ENGINE_PKI_ENGINE_CA_CERT
+                ),
+                'ENGINE_PGPASS': self.environment[
+                    osetupcons.DBEnv.PGPASS_FILE
+                ]
+            },
+        )
 
 
 # vim: expandtab tabstop=4 shiftwidth=4


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I869bc425ef6728a0e2a9ac5a9f17a22fc38bc958
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Alon Bar-Lev <alo...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to