198 lines
7.6 KiB
Python
198 lines
7.6 KiB
Python
# Copyright 2016 AT&T Corp
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import os
|
|
import yaml
|
|
|
|
from murano.packages import exceptions
|
|
import murano.packages.hot_package
|
|
import murano.packages.load_utils as load_utils
|
|
import murano.tests.unit.base as test_base
|
|
|
|
|
|
class TestHotPackage(test_base.MuranoTestCase):
|
|
|
|
def _get_hot_package(self, source_directory):
|
|
manifest = {
|
|
'FullName': 'FullTestName',
|
|
'Version': '1.0.0',
|
|
'Type': 'Application',
|
|
'Name': 'TestName',
|
|
'Description': 'TestDescription',
|
|
'Author': 'TestAuthor',
|
|
'Supplier': 'TestSupplier',
|
|
'Logo:': 'TestLogo',
|
|
'Tags': ['Tag1', 'Tag2']
|
|
}
|
|
return murano.packages.hot_package.HotPackage(
|
|
None, None, source_directory=source_directory,
|
|
manifest=manifest
|
|
)
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(TestHotPackage, cls).setUpClass()
|
|
this_dir = os.path.dirname(os.path.realpath(__file__))
|
|
cls.test_dirs = [
|
|
os.path.join(this_dir, 'test.hot.1'),
|
|
os.path.join(this_dir, 'test.hot.2'),
|
|
os.path.join(this_dir, 'test.hot.3')
|
|
]
|
|
|
|
manifest_path = os.path.join(cls.test_dirs[0], 'template.yaml')
|
|
cls.manifest = {}
|
|
with open(manifest_path) as manifest_file:
|
|
for key, value in yaml.safe_load(manifest_file).items():
|
|
cls.manifest[key] = value
|
|
|
|
properties_manifest_path = os.path.join(cls.test_dirs[0],
|
|
'properties_manifest.yaml')
|
|
cls.properties_manifest = {}
|
|
with open(properties_manifest_path) as manifest_file:
|
|
for key, value in yaml.safe_load(manifest_file).items():
|
|
cls.properties_manifest[key] = value
|
|
|
|
def test_heat_files_generated(self):
|
|
package_dir = os.path.abspath(
|
|
os.path.join(__file__,
|
|
'../../test_packages/test.hot.v1.app_with_files')
|
|
)
|
|
load_utils.load_from_dir(package_dir)
|
|
|
|
files = murano.packages.hot_package.HotPackage._translate_files(
|
|
package_dir)
|
|
expected_result = {
|
|
"testHeatFile",
|
|
"middle_file/testHeatFile",
|
|
"middle_file/inner_file/testHeatFile",
|
|
"middle_file/inner_file2/testHeatFile"
|
|
}
|
|
msg = "hot files were not generated correctly"
|
|
self.assertSetEqual(expected_result, set(files), msg)
|
|
|
|
def test_heat_files_generated_empty(self):
|
|
package_dir = os.path.abspath(
|
|
os.path.join(__file__,
|
|
'../../test_packages/test.hot.v1.app')
|
|
)
|
|
load_utils.load_from_dir(package_dir)
|
|
|
|
files = murano.packages.hot_package.HotPackage \
|
|
._translate_files(package_dir)
|
|
msg = "heat files were not generated correctly. Expected empty list"
|
|
self.assertEqual([], files, msg)
|
|
|
|
def test_build_properties(self):
|
|
result = murano.packages.hot_package.HotPackage._build_properties(
|
|
self.properties_manifest,
|
|
validate_hot_parameters=True)
|
|
|
|
self.assertIn('templateParameters', result)
|
|
params = result['templateParameters']
|
|
self.assertEqual(6, len(params['Contract']))
|
|
|
|
param1 = params['Contract']['param1']
|
|
param2 = params['Contract']['param2']
|
|
param3 = params['Contract']['param3']
|
|
param4 = params['Contract']['param4']
|
|
param5 = params['Contract']['param5']
|
|
param6 = params['Contract']['param6']
|
|
|
|
self.assertEqual("$.bool().check($ in list(True, False))", param1.expr)
|
|
self.assertEqual("$.string().check($ in list('bar'))."
|
|
"check(len($) <= 50).check(len($) >= 0)."
|
|
"check(matches($, '['A-Za-z0-9']'))", param2.expr)
|
|
self.assertEqual("$.int().check($ in list(0, 1, 2, 3, 4))"
|
|
".check(len($) >= 0 and len($) <= 5)."
|
|
"check($ >= 0 and $ <= 4)", param3.expr)
|
|
self.assertEqual("$.int().check($ >= -1000).check($ <= "
|
|
"1000)", param4.expr)
|
|
self.assertEqual("$.string()", param5.expr)
|
|
self.assertEqual("$.string()", param6.expr)
|
|
|
|
result = murano.packages.hot_package.HotPackage._build_properties(
|
|
self.properties_manifest,
|
|
validate_hot_parameters=False)
|
|
expected_result = {
|
|
'Contract': {},
|
|
'Default': {},
|
|
'Usage': 'In'
|
|
}
|
|
self.assertEqual(expected_result, result['templateParameters'])
|
|
|
|
def test_translate_param_to_contract_with_inappropriate_value(self):
|
|
self.assertRaisesRegex(
|
|
ValueError,
|
|
'Unsupported parameter type',
|
|
murano.packages.hot_package.HotPackage.
|
|
_translate_param_to_contract,
|
|
{'type': 'Inappropriate value'}
|
|
)
|
|
|
|
def test_get_class_name(self):
|
|
hot_package = self._get_hot_package(self.test_dirs[0])
|
|
translated_class, _ = hot_package.get_class(hot_package.full_name)
|
|
self.assertIsNotNone(translated_class)
|
|
self.assertEqual(translated_class, hot_package._translated_class)
|
|
|
|
def test_get_class_name_with_invalid_template_name(self):
|
|
hot_package = self._get_hot_package(self.test_dirs[0])
|
|
self.assertRaisesRegex(
|
|
exceptions.PackageClassLoadError,
|
|
'Class not defined in this package',
|
|
hot_package.get_class,
|
|
None)
|
|
|
|
def test_get_class_name_with_invalid_template_format(self):
|
|
hot_package = self._get_hot_package(self.test_dirs[1])
|
|
self.assertRaisesRegex(
|
|
exceptions.PackageFormatError,
|
|
'Not a HOT template',
|
|
hot_package.get_class,
|
|
hot_package.full_name)
|
|
|
|
def test_translate_ui(self):
|
|
hot_package = self._get_hot_package(self.test_dirs[0])
|
|
yaml = hot_package._translate_ui()
|
|
self.assertIsNotNone(yaml)
|
|
expected_application = '''
|
|
"Application":
|
|
"?":
|
|
"classVersion": "1.0.0"
|
|
"package": "FullTestName"
|
|
"type": "FullTestName"
|
|
"name": !yaql "$.group0.name"
|
|
"templateParameters":
|
|
"bar": !yaql "$.group1.bar"
|
|
"baz": !yaql "$.group1.baz"
|
|
"foo": !yaql "$.group1.foo"
|
|
'''
|
|
self.assertIn(expected_application.replace(' ', '').replace('\n', ''),
|
|
yaml.replace(' ', '').replace('\n', ''))
|
|
|
|
def test_translate_ui_with_nonexistent_template(self):
|
|
hot_package = self._get_hot_package(self.test_dirs[2])
|
|
self.assertRaisesRegex(
|
|
exceptions.PackageClassLoadError,
|
|
'File with class definition not found',
|
|
hot_package._translate_ui)
|
|
|
|
def test_translate_class_with_nonexistent_template(self):
|
|
hot_package = self._get_hot_package(self.test_dirs[2])
|
|
self.assertRaisesRegex(
|
|
exceptions.PackageClassLoadError,
|
|
'File with class definition not found',
|
|
hot_package._translate_class)
|