Merge "TOSCA: Create a test CLI program"
This commit is contained in:
@@ -2,7 +2,30 @@
|
|||||||
Usage
|
Usage
|
||||||
=====
|
=====
|
||||||
|
|
||||||
Heat-Translator project is planned to be made available via Heat Client an
|
Heat-Translator project is planned to be made available via python-heatclient.
|
||||||
which then can be invoked on command line as,
|
|
||||||
|
For now, it can be tested on the command line as below::
|
||||||
|
|
||||||
|
git clone https://github.com/openstack/heat-translator
|
||||||
|
python heat_translator.py --template-file==<path to the YAML template> --template-type=<type of template e.g. tosca> --parameters="purpose=test"
|
||||||
|
|
||||||
|
The heat_translator.py test program is at the root level of the project. The program has currently tested with TOSCA templates.
|
||||||
|
It requires two arguments::
|
||||||
|
|
||||||
|
1. Path to the file that needs to be translated
|
||||||
|
2. Type of translation (e.g. tosca)
|
||||||
|
|
||||||
|
An optional argument can be provided to handle user inputs parameters.
|
||||||
|
|
||||||
|
For example, a TOSCA hello world template can be translated by running the following command from the directory where you have cloned the project::
|
||||||
|
|
||||||
|
python heat_translator.py --template-file=translator/toscalib/tests/data/tosca_helloworld.yaml --template-type=tosca
|
||||||
|
|
||||||
|
This should produce a translated Heat Orchestration Template on the command line. In the near future, new options will be added to save the output
|
||||||
|
to a file. When deploy the translated template with Heat, please keep in mind that you have image registered in the Glance. The Heat-Translator
|
||||||
|
project sets flavor and image from a pre-defined set of values (as listed in /home/openstack/heat-translator/translator/hot/tosca/tosca_compute.py)
|
||||||
|
with the best possible match to the constraints defined in the TOSCA template. If there is no possible match found, a null value is set for now.
|
||||||
|
Per the future plan, an image and flavor will be provided from an online repository.
|
||||||
|
|
||||||
|
Once the project is made available in python-heatclient, it will be enabled to deploy translated output template seamlessly via Heat.
|
||||||
|
|
||||||
heat-translator <type of template format e.g. tosca> <path to the input template>
|
|
||||||
101
heat_translator.py
Normal file
101
heat_translator.py
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
#
|
||||||
|
# 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 sys
|
||||||
|
|
||||||
|
from translator.hot.tosca_translator import TOSCATranslator
|
||||||
|
from translator.toscalib.tosca_template import ToscaTemplate
|
||||||
|
from translator.toscalib.utils.gettextutils import _
|
||||||
|
|
||||||
|
"""
|
||||||
|
Test the heat-translator from command line as:
|
||||||
|
#python heat_translator.py
|
||||||
|
--template-file=<path to the YAML template>
|
||||||
|
--template-type=<type of template e.g. tosca>
|
||||||
|
--parameters="purpose=test"
|
||||||
|
Takes three user arguments,
|
||||||
|
1. type of translation (e.g. tosca) (required)
|
||||||
|
2. Path to the file that needs to be translated (required)
|
||||||
|
3. Input parameters (optional)
|
||||||
|
|
||||||
|
This should be only used for testing purpose. The proper use of
|
||||||
|
Heat-Translator tool is via python-heatclient once it made available there.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) < 3:
|
||||||
|
msg = _("The program requires minimum two arguments. "
|
||||||
|
"Please refer to the usage documentation.")
|
||||||
|
raise ValueError(msg)
|
||||||
|
if "--template-file=" not in sys.argv[1]:
|
||||||
|
msg = _("The program expects --template-file as first argument. "
|
||||||
|
"Please refer to the usage documentation.")
|
||||||
|
raise ValueError(msg)
|
||||||
|
if "--template-type=" not in sys.argv[2]:
|
||||||
|
msg = _("The program expects --template-type as second argument. "
|
||||||
|
"Please refer to the usage documentation.")
|
||||||
|
raise ValueError(msg)
|
||||||
|
path = sys.argv[1].split('--template-file=')[1]
|
||||||
|
# e.g. --template_file=translator/toscalib/tests/data/tosca_helloworld.yaml
|
||||||
|
template_type = sys.argv[2].split('--template-type=')[1]
|
||||||
|
# e.g. --template_type=tosca
|
||||||
|
supported_types = ['tosca']
|
||||||
|
if not template_type:
|
||||||
|
raise ValueError(_("Template type is needed. For example, 'tosca'"))
|
||||||
|
elif template_type not in supported_types:
|
||||||
|
raise ValueError(_("%(value)s is not a valid template type.")
|
||||||
|
% {'value': template_type})
|
||||||
|
parsed_params = {}
|
||||||
|
if len(sys.argv) > 3:
|
||||||
|
parsed_params = parse_parameters(sys.argv[3])
|
||||||
|
if os.path.isfile(path):
|
||||||
|
heat_tpl = translate(template_type, path, parsed_params)
|
||||||
|
if heat_tpl:
|
||||||
|
write_output(heat_tpl)
|
||||||
|
else:
|
||||||
|
raise ValueError(_("%(path)s is not a valid file.") % {'path': path})
|
||||||
|
|
||||||
|
|
||||||
|
def parse_parameters(parameter_list):
|
||||||
|
parsed_inputs = {}
|
||||||
|
if parameter_list.startswith('--parameters'):
|
||||||
|
inputs = parameter_list.split('--parameters=')[1].\
|
||||||
|
replace('"', '').split(';')
|
||||||
|
for param in inputs:
|
||||||
|
keyvalue = param.split('=')
|
||||||
|
parsed_inputs[keyvalue[0]] = keyvalue[1]
|
||||||
|
else:
|
||||||
|
raise ValueError(_("%(param) is not a valid parameter.")
|
||||||
|
% parameter_list)
|
||||||
|
return parsed_inputs
|
||||||
|
|
||||||
|
|
||||||
|
def translate(sourcetype, path, parsed_params):
|
||||||
|
output = None
|
||||||
|
if sourcetype == "tosca":
|
||||||
|
tosca = ToscaTemplate(path)
|
||||||
|
translator = TOSCATranslator(tosca, parsed_params)
|
||||||
|
output = translator.translate()
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
def write_output(output):
|
||||||
|
print(output)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
@@ -49,10 +49,10 @@ IMAGES = {'ubuntu-software-config-os-init': {'architecture': 'x86_64',
|
|||||||
'type': 'Linux',
|
'type': 'Linux',
|
||||||
'distribution': 'CirrOS',
|
'distribution': 'CirrOS',
|
||||||
'version': '0.3.1'},
|
'version': '0.3.1'},
|
||||||
'cirros-0.3.2-x86_64-uec': {'architecture': 'x86_64',
|
'rhel-6.5-test-image': {'architecture': 'x86_64',
|
||||||
'type': 'Linux',
|
'type': 'Linux',
|
||||||
'distribution': 'CirrOS',
|
'distribution': 'RHEL',
|
||||||
'version': '0.3.2'}}
|
'version': '6.5'}}
|
||||||
|
|
||||||
|
|
||||||
class ToscaCompute(HotResource):
|
class ToscaCompute(HotResource):
|
||||||
|
|||||||
@@ -33,3 +33,14 @@ class ToscaHotTranslationTest(TestCase):
|
|||||||
params)
|
params)
|
||||||
self.assertEqual({}, diff, '<difference> : ' +
|
self.assertEqual({}, diff, '<difference> : ' +
|
||||||
json.dumps(diff, indent=4, separators=(', ', ': ')))
|
json.dumps(diff, indent=4, separators=(', ', ': ')))
|
||||||
|
|
||||||
|
def test_hot_translate_helloworld(self):
|
||||||
|
tosca_file = \
|
||||||
|
'../toscalib/tests/data/tosca_helloworld.yaml'
|
||||||
|
hot_file = '../toscalib/tests/data/hot_output/' \
|
||||||
|
'hot_tosca_helloworld.yaml'
|
||||||
|
diff = TranslationUtils.compare_tosca_translation_with_hot(tosca_file,
|
||||||
|
hot_file,
|
||||||
|
{})
|
||||||
|
self.assertEqual({}, diff, '<difference> : ' +
|
||||||
|
json.dumps(diff, indent=4, separators=(', ', ': ')))
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
heat_template_version: 2013-05-23
|
||||||
|
|
||||||
|
description: >
|
||||||
|
Template for deploying a single server with predefined properties.
|
||||||
|
|
||||||
|
parameters: {}
|
||||||
|
resources:
|
||||||
|
my_server:
|
||||||
|
type: OS::Nova::Server
|
||||||
|
properties:
|
||||||
|
flavor: m1.medium
|
||||||
|
image: rhel-6.5-test-image
|
||||||
|
key_name: userkey
|
||||||
|
user_data_format: SOFTWARE_CONFIG
|
||||||
|
outputs: {}
|
||||||
23
translator/toscalib/tests/data/tosca_helloworld.yaml
Normal file
23
translator/toscalib/tests/data/tosca_helloworld.yaml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
tosca_definitions_version: tosca_simple_yaml_1_0_0
|
||||||
|
|
||||||
|
description: Template for deploying a single server with predefined properties.
|
||||||
|
|
||||||
|
topology_template:
|
||||||
|
node_templates:
|
||||||
|
my_server:
|
||||||
|
type: tosca.nodes.Compute
|
||||||
|
capabilities:
|
||||||
|
# Host container properties
|
||||||
|
host:
|
||||||
|
properties:
|
||||||
|
num_cpus: 2
|
||||||
|
disk_size: 10 GB
|
||||||
|
mem_size: 4 MB
|
||||||
|
# Guest Operating System properties
|
||||||
|
os:
|
||||||
|
properties:
|
||||||
|
# host Operating System image properties
|
||||||
|
architecture: x86_64
|
||||||
|
type: Linux
|
||||||
|
distribution: RHEL
|
||||||
|
version: 6.5
|
||||||
Reference in New Issue
Block a user