blob: f567aa8f53e425cb92eaafd4bf2636436022c88b [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
"""
CLI ``service-templates`` sub-commands.
"""
import os
from .. import csar
from .. import service_template_utils
from .. import table
from .. import utils
from ..core import aria
from ...core import Core
from ...storage import exceptions as storage_exceptions
from ...parser import consumption
from ...utils import (formatting, collections, console)
DESCRIPTION_FIELD_LENGTH_LIMIT = 20
SERVICE_TEMPLATE_COLUMNS = \
('id', 'name', 'description', 'main_file_name', 'created_at', 'updated_at')
@aria.group(name='service-templates')
@aria.options.verbose()
def service_templates():
"""
Manage service templates
"""
pass
@service_templates.command(name='show',
short_help='Show information for a stored service template')
@aria.argument('service-template-name')
@aria.options.verbose()
@aria.pass_model_storage
@aria.options.service_template_mode_full
@aria.options.mode_types
@aria.options.format_json
@aria.options.format_yaml
@aria.pass_logger
def show(service_template_name, model_storage, mode_full, mode_types, format_json, format_yaml,
logger):
"""
Show information for a stored service template
SERVICE_TEMPLATE_NAME is the unique name of the stored service template.
"""
service_template = model_storage.service_template.get_by_name(service_template_name)
if format_json or format_yaml:
mode_full = True
if mode_full:
consumption.ConsumptionContext()
if format_json:
console.puts(formatting.json_dumps(collections.prune(service_template.as_raw)))
elif format_yaml:
console.puts(formatting.yaml_dumps(collections.prune(service_template.as_raw)))
else:
service_template.dump()
elif mode_types:
consumption.ConsumptionContext()
service_template.dump_types()
else:
logger.info('Showing service template {0}...'.format(service_template_name))
service_template_dict = service_template.to_dict()
service_template_dict['#services'] = len(service_template.services)
columns = SERVICE_TEMPLATE_COLUMNS + ('#services',)
column_formatters = \
dict(description=table.trim_formatter_generator(DESCRIPTION_FIELD_LENGTH_LIMIT))
table.print_data(columns, service_template_dict, 'Service-template:',
column_formatters=column_formatters, col_max_width=50)
if service_template_dict['description'] is not None:
logger.info('Description:')
logger.info('{0}{1}'.format(service_template_dict['description'].encode('UTF-8') or '',
os.linesep))
if service_template.services:
logger.info('Existing services:')
for service_name in service_template.services:
logger.info('\t{0}'.format(service_name))
@service_templates.command(name='list',
short_help='List all stored service templates')
@aria.options.sort_by()
@aria.options.descending
@aria.options.verbose()
@aria.pass_model_storage
@aria.pass_logger
def list(sort_by, descending, model_storage, logger):
"""
List all stored service templates
"""
logger.info('Listing all service templates...')
service_templates_list = model_storage.service_template.list(
sort=utils.storage_sort_param(sort_by, descending))
column_formatters = \
dict(description=table.trim_formatter_generator(DESCRIPTION_FIELD_LENGTH_LIMIT))
table.print_data(SERVICE_TEMPLATE_COLUMNS, service_templates_list, 'Service templates:',
column_formatters=column_formatters)
@service_templates.command(name='store',
short_help='Parse and store a service template archive')
@aria.argument('service-template-path')
@aria.argument('service-template-name')
@aria.options.service_template_filename
@aria.options.verbose()
@aria.pass_model_storage
@aria.pass_resource_storage
@aria.pass_plugin_manager
@aria.pass_logger
def store(service_template_path, service_template_name, service_template_filename,
model_storage, resource_storage, plugin_manager, logger):
"""
Parse and store a service template archive
SERVICE_TEMPLATE_PATH is the path to the service template archive.
SERVICE_TEMPLATE_NAME is the unique name to give to the service template in storage.
"""
logger.info('Storing service template {0}...'.format(service_template_name))
service_template_path = service_template_utils.get(service_template_path,
service_template_filename)
core = Core(model_storage, resource_storage, plugin_manager)
try:
core.create_service_template(service_template_path,
os.path.dirname(service_template_path),
service_template_name)
except storage_exceptions.StorageError as e:
utils.check_overriding_storage_exceptions(e, 'service template', service_template_name)
raise
logger.info('Service template {0} stored'.format(service_template_name))
@service_templates.command(name='delete',
short_help='Delete a stored service template')
@aria.argument('service-template-name')
@aria.options.verbose()
@aria.pass_model_storage
@aria.pass_resource_storage
@aria.pass_plugin_manager
@aria.pass_logger
def delete(service_template_name, model_storage, resource_storage, plugin_manager, logger):
"""
Delete a stored service template
SERVICE_TEMPLATE_NAME is the unique name of the stored service template.
"""
logger.info('Deleting service template {0}...'.format(service_template_name))
service_template = model_storage.service_template.get_by_name(service_template_name)
core = Core(model_storage, resource_storage, plugin_manager)
core.delete_service_template(service_template.id)
logger.info('Service template {0} deleted'.format(service_template_name))
@service_templates.command(name='inputs',
short_help='Show stored service template inputs')
@aria.argument('service-template-name')
@aria.options.verbose()
@aria.pass_model_storage
@aria.pass_logger
def inputs(service_template_name, model_storage, logger):
"""
Show stored service template inputs
SERVICE_TEMPLATE_NAME is the unique name of the stored service template.
"""
logger.info('Showing inputs for service template {0}...'.format(service_template_name))
print_service_template_inputs(model_storage, service_template_name, logger)
@service_templates.command(name='validate',
short_help='Validate a service template archive')
@aria.argument('service-template')
@aria.options.service_template_filename
@aria.options.verbose()
@aria.pass_model_storage
@aria.pass_resource_storage
@aria.pass_plugin_manager
@aria.pass_logger
def validate(service_template, service_template_filename,
model_storage, resource_storage, plugin_manager, logger):
"""
Validate a service template archive
SERVICE_TEMPLATE_PATH is the path to the service template archive.
"""
logger.info('Validating service template: {0}'.format(service_template))
service_template_path = service_template_utils.get(service_template, service_template_filename)
core = Core(model_storage, resource_storage, plugin_manager)
core.validate_service_template(service_template_path)
logger.info('Service template validated successfully')
@service_templates.command(name='create-archive',
short_help='Create a CSAR archive from a service template source')
@aria.argument('service-template-path')
@aria.argument('destination')
@aria.options.verbose()
@aria.pass_logger
def create_archive(service_template_path, destination, logger):
"""
Create a CSAR archive from a service template source
SERVICE_TEMPLATE_PATH is the path to the service template source.
DESTINATION is the path to the created CSAR archive.
"""
logger.info('Creating a CSAR archive')
if not destination.endswith(csar.CSAR_FILE_EXTENSION):
destination += csar.CSAR_FILE_EXTENSION
csar.write(service_template_path, destination, logger)
logger.info('CSAR archive created at {0}'.format(destination))
def print_service_template_inputs(model_storage, service_template_name, logger):
service_template = model_storage.service_template.get_by_name(service_template_name)
logger.info('Service template inputs:')
if service_template.inputs:
logger.info(utils.get_parameter_templates_as_string(service_template.inputs))
else:
logger.info('\tNo inputs')