]> git.apps.os.sepia.ceph.com Git - teuthology.git/commitdiff
install.upgrade: implement pre-upgrade sanity check
authorNathan Cutler <ncutler@suse.com>
Wed, 29 Jun 2016 08:04:16 +0000 (10:04 +0200)
committerNathan Cutler <ncutler@suse.com>
Tue, 27 Jun 2017 20:58:01 +0000 (22:58 +0200)
Add a pre-upgrade sanity check to the install.upgrade task. This sanity check:

1. determines the version of Ceph installed on the remote ("installed_version")
2. determines the version of Ceph in the target gitbuilder repo
("upgrade_version")
3. if "installed_version" is greater than "upgrade_version", fail immediately

Since the upgrade itself cannot succeed if upgrade_version < installed_version,
it's better to fail before attempting the upgrade.

Before this patch, we were failing in the verify_package_version() sanity check
which is run after attempting (and failing) to upgrade the packages.

Fixes: http://tracker.ceph.com/issues/16521
Signed-off-by: Nathan Cutler <ncutler@suse.com>
Signed-off-by: Jan Fajerski <jfajerski@suse.com>
teuthology/task/install/__init__.py

index 44d926e769e4f0fc8640c711c0ed4172741b8b21..5e920bc260221c183aa46c19328d5b8f6dfae8bb 100644 (file)
@@ -11,6 +11,7 @@ from teuthology.parallel import parallel
 from teuthology.orchestra import run
 from teuthology.task import ansible
 
+from distutils.version import LooseVersion
 from .util import (
     _get_builder_project, get_flavor, ship_utilities,
 )
@@ -19,6 +20,10 @@ from . import rpm, deb, redhat
 
 log = logging.getLogger(__name__)
 
+def get_upgrade_version(ctx, config, remote):
+    gitbuilder = _get_gitbuilder_project(ctx, remote, config)
+    version = gitbuilder.version
+    return version
 
 def verify_package_version(ctx, config, remote):
     """
@@ -330,6 +335,10 @@ def upgrade_remote_to_config(ctx, config):
 
     return result
 
+def _upgrade_is_downgrade(installed_version, upgrade_version):
+    assert installed_version, "installed_version is empty"
+    assert upgrade_version, "upgrade_version is empty"
+    return LooseVersion(installed_version) > LooseVersion(upgrade_version)
 
 def upgrade_common(ctx, config, deploy_style):
     """
@@ -352,6 +361,20 @@ def upgrade_common(ctx, config, deploy_style):
         # FIXME: again, make extra_pkgs distro-agnostic
         pkgs += extra_pkgs
 
+        installed_version = packaging.get_package_version(remote, 'ceph-common')
+        upgrade_version = get_upgrade_version(ctx, remote, node)
+        log.info("Ceph {s} upgrade from {i} to {u}".format(
+            s=system_type,
+            i=installed_version,
+            u=upgrade_version
+        ))
+       if _upgrade_is_downgrade(installed_version, upgrade_version):
+            raise RuntimeError(
+                "An attempt to upgrade from a higher version to a lower one "
+                "will always fail. Hint: check tags in the target git branch."
+            )
+
+
         deploy_style(ctx, node, remote, pkgs, system_type)
         verify_package_version(ctx, node, remote)
     return len(remotes)