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:
parent
03afcc8cde
commit
eb913cd991
@ -1,5 +1,6 @@
|
|||||||
pbr>=0.6,!=0.7,<1.0
|
pbr>=0.6,!=0.7,<1.0
|
||||||
Babel>=1.3
|
Babel>=1.3
|
||||||
|
cliff>=1.10.0 # Apache-2.0
|
||||||
PyYAML>=3.1.0
|
PyYAML>=3.1.0
|
||||||
python_dateutil>=2.4.0
|
python_dateutil>=2.4.0
|
||||||
six>=1.9.0
|
six>=1.9.0
|
||||||
|
@ -23,6 +23,13 @@ classifier =
|
|||||||
packages =
|
packages =
|
||||||
translator
|
translator
|
||||||
|
|
||||||
|
[entry_points]
|
||||||
|
openstack.cli.extension =
|
||||||
|
translator = translator.osc.osc_plugin
|
||||||
|
|
||||||
|
openstack.translator.v1 =
|
||||||
|
translate_template = translator.osc.v1.translate:TranslateTemplate
|
||||||
|
|
||||||
[build_sphinx]
|
[build_sphinx]
|
||||||
source-dir = doc/source
|
source-dir = doc/source
|
||||||
build-dir = doc/build
|
build-dir = doc/build
|
||||||
|
0
translator/osc/__init__.py
Normal file
0
translator/osc/__init__.py
Normal file
41
translator/osc/osc_plugin.py
Normal file
41
translator/osc/osc_plugin.py
Normal 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
29
translator/osc/utils.py
Normal 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', '')
|
0
translator/osc/v1/__init__.py
Normal file
0
translator/osc/v1/__init__.py
Normal file
59
translator/osc/v1/translate.py
Normal file
59
translator/osc/v1/translate.py
Normal 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)
|
Loading…
Reference in New Issue
Block a user