Merge "Add release version parameter validation"

This commit is contained in:
Zuul 2023-08-25 21:44:21 +00:00 committed by Gerrit Code Review
commit ee49b840a9
4 changed files with 79 additions and 4 deletions

View File

@ -32,6 +32,7 @@ from dcmanager.api.controllers import restcomm
from dcmanager.api.policies import subcloud_deploy as subcloud_deploy_policy from dcmanager.api.policies import subcloud_deploy as subcloud_deploy_policy
from dcmanager.api import policy from dcmanager.api import policy
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common import exceptions
from dcmanager.common.i18n import _ from dcmanager.common.i18n import _
from dcmanager.common import utils from dcmanager.common import utils
@ -107,7 +108,15 @@ class SubcloudDeployController(object):
software_version = tsc.SW_VERSION software_version = tsc.SW_VERSION
if request.POST.get('release'): if request.POST.get('release'):
try:
utils.validate_release_version_supported(request.POST.get('release'))
software_version = request.POST.get('release') software_version = request.POST.get('release')
except exceptions.ValidateFail as e:
pecan.abort(httpclient.BAD_REQUEST,
_("Error: invalid release version parameter. %s" % e))
except Exception:
pecan.abort(httpclient.INTERNAL_SERVER_ERROR,
_('Error: unable to validate the release version.'))
deploy_dicts['software_version'] = software_version deploy_dicts['software_version'] = software_version
dir_path = os.path.join(dccommon_consts.DEPLOY_DIR, software_version) dir_path = os.path.join(dccommon_consts.DEPLOY_DIR, software_version)

View File

@ -416,3 +416,5 @@ HELM_CHART_POSTFIX = 'deployment-manager'
ALTERNATE_DEPLOY_PLAYBOOK_DIR = ALTERNATE_DEPLOY_FILES_DIR + '/playbooks' ALTERNATE_DEPLOY_PLAYBOOK_DIR = ALTERNATE_DEPLOY_FILES_DIR + '/playbooks'
DEPLOY_PLAYBOOK_POSTFIX = 'deployment-manager.yaml' DEPLOY_PLAYBOOK_POSTFIX = 'deployment-manager.yaml'
SUPPORTED_UPGRADES_METADATA_FILE_PATH = '/usr/rootdirs/opt/upgrades/metadata.xml'

View File

@ -28,6 +28,7 @@ import six.moves
import string import string
import subprocess import subprocess
import tsconfig.tsconfig as tsc import tsconfig.tsconfig as tsc
import xml.etree.ElementTree as ElementTree
import yaml import yaml
from keystoneauth1 import exceptions as keystone_exceptions from keystoneauth1 import exceptions as keystone_exceptions
@ -1105,3 +1106,57 @@ def subcloud_is_secondary_state(deploy_state):
def create_subcloud_rehome_data_template(): def create_subcloud_rehome_data_template():
"""Create a subcloud rehome data template""" """Create a subcloud rehome data template"""
return {'saved_payload': {}} return {'saved_payload': {}}
def validate_release_version_supported(release_version_to_check):
"""Given a release version, check whether it's supported by the current active version.
:param release_version_to_check: version string to validate
returns True to indicate that the version is valid
raise ValidateFail for an invalid/unsupported release version
"""
current_version = tsc.SW_VERSION
if current_version == release_version_to_check:
return True
supported_versions = get_current_supported_upgrade_versions()
if release_version_to_check not in supported_versions:
msg = "%s is not a supported release version" % release_version_to_check
raise exceptions.ValidateFail(msg)
return True
def get_current_supported_upgrade_versions():
"""Parse the upgrades metadata file to build a list of supported versions.
returns a list of supported upgrade versions
raise InternalError exception for a missing/invalid metadata file
"""
supported_versions = []
try:
with open(consts.SUPPORTED_UPGRADES_METADATA_FILE_PATH) as file:
root = ElementTree.fromstring(file.read())
except Exception:
LOG.exception("Error reading the supported upgrades metadata file")
raise exceptions.InternalError()
supported_upgrades = root.find('supported_upgrades')
if not supported_upgrades:
LOG.error("Missing supported upgrades information")
raise exceptions.InternalError()
upgrades = supported_upgrades.findall("upgrade")
for upgrade in upgrades:
version = upgrade.findtext("version")
supported_versions.append(version.strip())
return supported_versions

View File

@ -48,6 +48,12 @@ FAKE_DEPLOY_FILES = {
FAKE_DEPLOY_CHART_PREFIX: FAKE_DEPLOY_CHART_FILE, FAKE_DEPLOY_CHART_PREFIX: FAKE_DEPLOY_CHART_FILE,
} }
FAKE_UPGRADES_METADATA = '''
<build>\n<version>0.2</version>\n<supported_upgrades>
\n<upgrade>\n<version>%s</version>\n<required_patches>PATCH_0001</required_patches>
\n</upgrade>\n</supported_upgrades>\n</build>
''' % FAKE_SOFTWARE_VERSION
class TestSubcloudDeploy(testroot.DCManagerApiTest): class TestSubcloudDeploy(testroot.DCManagerApiTest):
def setUp(self): def setUp(self):
@ -65,9 +71,12 @@ class TestSubcloudDeploy(testroot.DCManagerApiTest):
fields.append((opt, webtest.Upload(fake_name, fake_content))) fields.append((opt, webtest.Upload(fake_name, fake_content)))
mock_upload_files.return_value = True mock_upload_files.return_value = True
params += fields params += fields
with mock.patch('builtins.open', mock.mock_open(read_data=FAKE_UPGRADES_METADATA)):
response = self.app.post(FAKE_URL, response = self.app.post(FAKE_URL,
headers=FAKE_HEADERS, headers=FAKE_HEADERS,
params=params) params=params)
self.assertEqual(response.status_code, http_client.OK) self.assertEqual(response.status_code, http_client.OK)
self.assertEqual(FAKE_SOFTWARE_VERSION, response.json['software_version']) self.assertEqual(FAKE_SOFTWARE_VERSION, response.json['software_version'])