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 import policy
from dcmanager.common import consts
from dcmanager.common import exceptions
from dcmanager.common.i18n import _
from dcmanager.common import utils
@ -107,7 +108,15 @@ class SubcloudDeployController(object):
software_version = tsc.SW_VERSION
if request.POST.get('release'):
software_version = request.POST.get('release')
try:
utils.validate_release_version_supported(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
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'
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 subprocess
import tsconfig.tsconfig as tsc
import xml.etree.ElementTree as ElementTree
import yaml
from keystoneauth1 import exceptions as keystone_exceptions
@ -1105,3 +1106,57 @@ def subcloud_is_secondary_state(deploy_state):
def create_subcloud_rehome_data_template():
"""Create a subcloud rehome data template"""
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_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):
def setUp(self):
@ -65,9 +71,12 @@ class TestSubcloudDeploy(testroot.DCManagerApiTest):
fields.append((opt, webtest.Upload(fake_name, fake_content)))
mock_upload_files.return_value = True
params += fields
response = self.app.post(FAKE_URL,
headers=FAKE_HEADERS,
params=params)
with mock.patch('builtins.open', mock.mock_open(read_data=FAKE_UPGRADES_METADATA)):
response = self.app.post(FAKE_URL,
headers=FAKE_HEADERS,
params=params)
self.assertEqual(response.status_code, http_client.OK)
self.assertEqual(FAKE_SOFTWARE_VERSION, response.json['software_version'])