Allow upgrades only from supported versions

Introduces the `can_upgrade_from` field which is a list of supported
versions. We can control upgrade process now by this field, so user
won't start upgrade from the Fuel versions that we have not tested for
upgrade.

Change-Id: Id56a09845ade075fa4751c7eb164e065d5cad2ef
Closes-Bug: #1392756
This commit is contained in:
Igor Kalnitsky 2014-11-17 12:59:01 +02:00
parent 3e98ea8a04
commit ffbb4da300
5 changed files with 55 additions and 3 deletions

View File

@ -242,3 +242,25 @@ class CheckUpgradeVersions(BaseBeforeUpgradeChecker):
if err_msg:
raise errors.WrongVersionError(err_msg)
class CheckRequiredVersion(BaseBeforeUpgradeChecker):
"""Checks that user's going to upgrade Fuel from the required version.
:param context: a context object with config and required space info
"""
def __init__(self, context):
#: version of fuel which user wants to upgrade from
self.from_version = context.config.from_version
#: a list of versions from which user can upgrade
self.can_upgrade_from = context.config.can_upgrade_from
def check(self):
logger.info('Check required Fuel version')
if self.from_version not in self.can_upgrade_from:
raise errors.WrongVersionError(
'Cannot upgrade from Fuel {0}. You can upgrade only from '
'one of next versions: {1}'.format(
self.from_version, ', '.join(self.can_upgrade_from)))

View File

@ -26,6 +26,7 @@ from fuel_upgrade.engines.openstack import OpenStackUpgrader
from fuel_upgrade.before_upgrade_checker import CheckFreeSpace
from fuel_upgrade.before_upgrade_checker import CheckNoRunningOstf
from fuel_upgrade.before_upgrade_checker import CheckNoRunningTasks
from fuel_upgrade.before_upgrade_checker import CheckRequiredVersion
from fuel_upgrade.before_upgrade_checker import CheckUpgradeVersions
@ -51,6 +52,7 @@ class CheckerManager(object):
CHECKERS_MAPPING = {
DockerUpgrader: [
CheckUpgradeVersions,
CheckRequiredVersion,
CheckFreeSpace,
CheckNoRunningTasks,
CheckNoRunningOstf],

View File

@ -228,6 +228,8 @@ def config(update_path, admin_password):
"""
fuel_config_path = '/etc/fuel/'
can_upgrade_from = ['5.1.1']
current_fuel_version_path = '/etc/fuel/version.yaml'
new_upgrade_version_path = join(update_path, 'config/version.yaml')

View File

@ -260,16 +260,17 @@ class OpenStackUpgrader(UpgradeEngine):
metadata_path = self.config.openstack['metadata']
# do nothing in case of metadata.yaml absence - just assume
# that we full repos
# that we have full repos
if not os.path.exists(metadata_path):
return
with io.open(metadata_path, 'r', encoding='utf-8') as f:
metadata = yaml.load(f)
metadata = yaml.load(f) or {}
# keep diff-based releases
releases = filter(
lambda r: r['version'] in metadata['diff_releases'], releases)
lambda r: r['version'] in metadata.get('diff_releases', {}),
releases)
# inject repos from base releases
for release in releases:

View File

@ -17,10 +17,12 @@
import mock
import requests
import six
from fuel_upgrade.before_upgrade_checker import CheckFreeSpace
from fuel_upgrade.before_upgrade_checker import CheckNoRunningOstf
from fuel_upgrade.before_upgrade_checker import CheckNoRunningTasks
from fuel_upgrade.before_upgrade_checker import CheckRequiredVersion
from fuel_upgrade.before_upgrade_checker import CheckUpgradeVersions
from fuel_upgrade import errors
from fuel_upgrade.tests.base import BaseTestCase
@ -202,3 +204,26 @@ class TestCheckUpgradeVersions(BaseTestCase):
err_msg,
self.checker.check)
compare_mock.assert_called_once_with('0', '9999')
class TestCheckRequiredVersions(BaseTestCase):
def get_checker(self, user_conf={}):
config = self.fake_config
for key, value in six.iteritems(user_conf):
setattr(config, key, value)
return CheckRequiredVersion(mock.Mock(config=config))
def test_check_support_version(self):
checker = self.get_checker({
'from_version': '5.1.1',
'can_upgrade_from': ['5.1.1']})
checker.check()
def test_check_unsupport_version(self):
checker = self.get_checker({
'from_version': '5.1',
'can_upgrade_from': ['5.1.1']})
self.assertRaises(errors.WrongVersionError, checker.check)