Create an OSC plugin for heat-translator

Creating the framework for an OSC plugin for heat-translator.
This will make adding new commands easier, incorporates them into
OSC, and provides the capabilities of authentication should
it be required in the future (using heatclient after translating
a template).

partially implements bp openstack-client-heat-translator

Change-Id: Ie477eac9acd9ed26f00069947af0d25b3c7e67b1
This commit is contained in:
Steve Martinelli 2015-06-15 13:09:43 -04:00
parent 03afcc8cde
commit eb913cd991
7 changed files with 137 additions and 0 deletions

View File

@ -1,5 +1,6 @@
pbr>=0.6,!=0.7,<1.0
Babel>=1.3
cliff>=1.10.0 # Apache-2.0
PyYAML>=3.1.0
python_dateutil>=2.4.0
six>=1.9.0

View File

@ -23,6 +23,13 @@ classifier =
packages =
translator
[entry_points]
openstack.cli.extension =
translator = translator.osc.osc_plugin
openstack.translator.v1 =
translate_template = translator.osc.v1.translate:TranslateTemplate
[build_sphinx]
source-dir = doc/source
build-dir = doc/build

View File

View File

@ -0,0 +1,41 @@
# 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.
from translator.osc import utils
DEFAULT_TRANSLATOR_API_VERSION = '1'
API_VERSION_OPTION = 'os_translator_api_version'
API_NAME = 'translator'
API_VERSIONS = {
'1': 'translator.v1.client.Client',
}
def make_client(instance):
# NOTE(stevemar): We don't need a client because
# heat-translator itself is a command line tool
pass
def build_option_parser(parser):
"""Hook to add global options."""
parser.add_argument(
'--os-translator-api-version',
metavar='<translator-api-version>',
default=utils.env(
'OS_TRANSLATOR_API_VERSION',
default=DEFAULT_TRANSLATOR_API_VERSION),
help='Translator API version, default=' +
DEFAULT_TRANSLATOR_API_VERSION +
' (Env: OS_TRANSLATOR_API_VERSION)')
return parser

29
translator/osc/utils.py Normal file
View File

@ -0,0 +1,29 @@
# 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.
#
"""Common client utilities"""
import os
def env(*vars, **kwargs):
"""Search for the first defined of possibly many env vars
Returns the first environment variable defined in vars, or
returns the default defined in kwargs.
"""
for v in vars:
value = os.environ.get(v, None)
if value:
return value
return kwargs.get('default', '')

View File

View File

@ -0,0 +1,59 @@
# 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.
"""Translate action implementations"""
import logging
import os
import sys
from cliff import command
from translator.hot.tosca_translator import TOSCATranslator
from translator.toscalib.tosca_template import ToscaTemplate
class TranslateTemplate(command.Command):
"""Translate a template"""
log = logging.getLogger(__name__ + '.TranslateTemplate')
auth_required = False
def get_parser(self, prog_name):
parser = super(TranslateTemplate, self).get_parser(prog_name)
parser.add_argument(
'--template-file',
metavar='<template-file>',
required=True,
help='Path to the file that needs to be translated.')
parser.add_argument(
'--template-type',
metavar='<template-type>',
required=True,
choices=['tosca'],
help='Format of the template file.')
return parser
def take_action(self, parsed_args):
self.log.debug('take_action(%s)', parsed_args)
if not os.path.isfile(parsed_args.template_file):
sys.stdout.write('Could not find template file.')
raise SystemExit
# TODO(stevemar): parsed_params doesn't default nicely
parsed_params = {}
if parsed_args.template_type == "tosca":
tosca = ToscaTemplate(parsed_args.template_file)
translator = TOSCATranslator(tosca, parsed_params)
output = translator.translate()
print(output)