Merge "Add release version parameter validation"
This commit is contained in:
commit
ee49b840a9
|
@ -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)
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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'])
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue