Merge pull request #561 from coreycb/master
Get OpenStack codename from /etc/openstack-release
This commit is contained in:
@@ -884,7 +884,24 @@ class TestOpenStackUtils(ut_utils.BaseTestCase):
|
||||
result = openstack_utils.get_current_os_release_pair()
|
||||
self.assertEqual(expected, result)
|
||||
|
||||
def test_get_openstack_release(self):
|
||||
def test_get_current_os_versions(self):
|
||||
self.patch_object(openstack_utils, "get_openstack_release")
|
||||
self.patch_object(openstack_utils.generic_utils, "get_pkg_version")
|
||||
|
||||
# Pre-Wallaby scenario where openstack-release package isn't installed
|
||||
self.get_openstack_release.return_value = None
|
||||
self.get_pkg_version.return_value = '18.0.0'
|
||||
expected = {'keystone': 'victoria'}
|
||||
result = openstack_utils.get_current_os_versions('keystone')
|
||||
self.assertEqual(expected, result)
|
||||
|
||||
# Wallaby+ scenario where openstack-release package is installed
|
||||
self.get_openstack_release.return_value = 'wallaby'
|
||||
expected = {'keystone': 'wallaby'}
|
||||
result = openstack_utils.get_current_os_versions('keystone')
|
||||
self.assertEqual(expected, result)
|
||||
|
||||
def test_get_os_release(self):
|
||||
self.patch(
|
||||
'zaza.openstack.utilities.openstack.get_current_os_release_pair',
|
||||
new_callable=mock.MagicMock(),
|
||||
@@ -936,6 +953,23 @@ class TestOpenStackUtils(ut_utils.BaseTestCase):
|
||||
self.get_application_config_option.return_value = None
|
||||
self.assertEqual(openstack_utils.get_keystone_api_version(), 3)
|
||||
|
||||
def test_get_openstack_release(self):
|
||||
self.patch_object(openstack_utils.model, "get_units")
|
||||
self.patch_object(openstack_utils.juju_utils, "remote_run")
|
||||
|
||||
# Test pre-Wallaby behavior where openstack-release pkg isn't installed
|
||||
self.get_units.return_value = []
|
||||
self.remote_run.return_value = "OPENSTACK_CODENAME=wallaby "
|
||||
|
||||
# Test Wallaby+ behavior where openstack-release package is installed
|
||||
unit1 = mock.MagicMock()
|
||||
unit1.entity_id = 1
|
||||
self.get_units.return_value = [unit1]
|
||||
self.remote_run.return_value = "OPENSTACK_CODENAME=wallaby "
|
||||
|
||||
result = openstack_utils.get_openstack_release("application", "model")
|
||||
self.assertEqual(result, "wallaby")
|
||||
|
||||
def test_get_project_id(self):
|
||||
# No domain
|
||||
self.patch_object(openstack_utils, "get_keystone_api_version")
|
||||
|
||||
@@ -1753,9 +1753,49 @@ def get_os_code_info(package, pkg_version):
|
||||
return OPENSTACK_CODENAMES[vers]
|
||||
|
||||
|
||||
def get_openstack_release(application, model_name=None):
|
||||
"""Return the openstack release codename based on /etc/openstack-release.
|
||||
|
||||
This will only return a codename if the openstack-release package is
|
||||
installed on the unit.
|
||||
|
||||
:param application: Application name
|
||||
:type application: string
|
||||
:param model_name: Name of model to query.
|
||||
:type model_name: str
|
||||
:returns: OpenStack release codename for application
|
||||
:rtype: string
|
||||
"""
|
||||
versions = []
|
||||
units = model.get_units(application, model_name=model_name)
|
||||
for unit in units:
|
||||
cmd = 'cat /etc/openstack-release | grep OPENSTACK_CODENAME'
|
||||
try:
|
||||
out = juju_utils.remote_run(unit.entity_id, cmd,
|
||||
model_name=model_name)
|
||||
except model.CommandRunFailed:
|
||||
logging.debug('Fall back to version check for OpenStack codename')
|
||||
else:
|
||||
codename = out.split('=')[1].strip()
|
||||
versions.append(codename)
|
||||
if len(set(versions)) == 0:
|
||||
return None
|
||||
elif len(set(versions)) > 1:
|
||||
raise Exception('Unexpected mix of OpenStack releases for {}: {}',
|
||||
application, versions)
|
||||
return versions[0]
|
||||
|
||||
|
||||
def get_current_os_versions(deployed_applications, model_name=None):
|
||||
"""Determine OpenStack codename of deployed applications.
|
||||
|
||||
Initially, see if the openstack-release pkg is available and use it
|
||||
instead.
|
||||
|
||||
If it isn't then it falls back to the existing method of checking the
|
||||
version of the package passed and then resolving the version from that
|
||||
using lookup tables.
|
||||
|
||||
:param deployed_applications: List of deployed applications
|
||||
:type deployed_applications: list
|
||||
:param model_name: Name of model to query.
|
||||
@@ -1769,11 +1809,16 @@ def get_current_os_versions(deployed_applications, model_name=None):
|
||||
continue
|
||||
logging.info("looking at application: {}".format(application))
|
||||
|
||||
version = generic_utils.get_pkg_version(application['name'],
|
||||
application['type']['pkg'],
|
||||
model_name=model_name)
|
||||
versions[application['name']] = (
|
||||
get_os_code_info(application['type']['pkg'], version))
|
||||
codename = get_openstack_release(application['name'],
|
||||
model_name=model_name)
|
||||
if codename:
|
||||
versions[application['name']] = codename
|
||||
else:
|
||||
version = generic_utils.get_pkg_version(application['name'],
|
||||
application['type']['pkg'],
|
||||
model_name=model_name)
|
||||
versions[application['name']] = (
|
||||
get_os_code_info(application['type']['pkg'], version))
|
||||
return versions
|
||||
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ UBUNTU_OPENSTACK_RELEASE = OrderedDict([
|
||||
('eoan', 'train'),
|
||||
('focal', 'ussuri'),
|
||||
('groovy', 'victoria'),
|
||||
('hirsute', 'wallaby'),
|
||||
])
|
||||
|
||||
|
||||
@@ -69,7 +70,8 @@ OPENSTACK_RELEASES_PAIRS = [
|
||||
'bionic_queens', 'bionic_rocky', 'cosmic_rocky',
|
||||
'bionic_stein', 'disco_stein', 'bionic_train',
|
||||
'eoan_train', 'bionic_ussuri', 'focal_ussuri',
|
||||
'focal_victoria', 'groovy_victoria']
|
||||
'focal_victoria', 'groovy_victoria',
|
||||
'focal_wallaby', 'hirsute_wallaby']
|
||||
|
||||
SWIFT_CODENAMES = OrderedDict([
|
||||
('diablo',
|
||||
|
||||
Reference in New Issue
Block a user