Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files
ARIA-199 Add "services outputs" CLI command
* Also add an output to hello world example
  • Loading branch information
tliron committed Jun 7, 2017
1 parent cd83073 commit 5afa2f7fe11977593009b6da25733fa8dd61a1e9
Showing 7 changed files with 76 additions and 27 deletions.
@@ -192,17 +192,16 @@ def outputs(service_name, model_storage, logger):
"""
logger.info('Showing outputs for service {0}...'.format(service_name))
service = model_storage.service.get_by_name(service_name)
#TODO fix this section..
outputs_def = service.outputs
response = model_storage.service.outputs.get(service_name)
outputs_ = StringIO()
for output_name, output in response.outputs.iteritems():
outputs_.write(' - "{0}":{1}'.format(output_name, os.linesep))
description = outputs_def[output_name].get('description', '')
outputs_.write(' Description: {0}{1}'.format(description,
os.linesep))
outputs_.write(' Value: {0}{1}'.format(output, os.linesep))
logger.info(outputs_.getvalue())

if service.outputs:
outputs_string = StringIO()
for output_name, output in service.outputs.iteritems():
outputs_string.write(' - "{0}":{1}'.format(output_name, os.linesep))
outputs_string.write(' Description: {0}{1}'.format(output.description, os.linesep))
outputs_string.write(' Value: {0}{1}'.format(output.value, os.linesep))
logger.info(outputs_string.getvalue())
else:
logger.info('\tNo outputs')


@services.command(name='inputs',
@@ -218,10 +217,12 @@ def inputs(service_name, model_storage, logger):
"""
logger.info('Showing inputs for service {0}...'.format(service_name))
service = model_storage.service.get_by_name(service_name)

if service.inputs:
inputs_string = StringIO()
for input_name, input_ in service.inputs.iteritems():
inputs_string.write(' - "{0}":{1}'.format(input_name, os.linesep))
inputs_string.write(' Description: {0}{1}'.format(input_.description, os.linesep))
inputs_string.write(' Value: {0}{1}'.format(input_.value, os.linesep))
logger.info(inputs_string.getvalue())
else:
@@ -268,7 +268,7 @@ class Argument(aria_declarative_base, orchestration.ArgumentBase):


# See also __all__ at the top of this file
models_to_register = [
models_to_register = (
# Service template models
ServiceTemplate,
NodeTemplate,
@@ -317,4 +317,4 @@ class Argument(aria_declarative_base, orchestration.ArgumentBase):
Task,
Log,
Argument
]
)
@@ -1,13 +1,14 @@
tosca_definitions_version: tosca_simple_yaml_1_0

node_types:
web_server:

WebServer:
derived_from: tosca.nodes.Root
capabilities:
host:
type: tosca.capabilities.Container

web_app:
WebApp:
derived_from: tosca.nodes.WebApplication
properties:
port:
@@ -17,10 +18,10 @@ topology_template:

node_templates:
web_server:
type: web_server
type: WebServer

web_app:
type: web_app
type: WebApp
properties:
port: 9090
requirements:
@@ -29,4 +30,9 @@ topology_template:
Standard:
configure: scripts/configure.sh
start: scripts/start.sh
stop: scripts/stop.sh
stop: scripts/stop.sh

outputs:
port:
type: integer
value: { get_property: [ web_app, port ] }
@@ -174,7 +174,30 @@ def test_delete_available_nodes_error_with_force(self, monkeypatch, mock_storage


class TestServicesOutputs(TestCliBase):
pass

def test_header_string(self, monkeypatch, mock_storage):
monkeypatch.setattr(_Environment, 'model_storage', mock_storage)
self.invoke('services outputs test_s')
assert 'Showing outputs for service test_s...' in self.logger_output_string

def test_outputs_no_outputs(self, monkeypatch, mock_storage):
monkeypatch.setattr(_Environment, 'model_storage', mock_storage)
self.invoke('services outputs service_with_no_outputs')

assert 'No outputs' in self.logger_output_string
assert 'output1' not in self.logger_output_string
assert 'value1' not in self.logger_output_string

def test_outputs_one_output(self, monkeypatch, mock_storage):
monkeypatch.setattr(_Environment, 'model_storage', mock_storage)
s = mock_models.create_service_with_dependencies(include_output=True)
monkeypatch.setattr(mock_storage.service, 'get_by_name', mock.MagicMock(return_value=s))

self.invoke('services outputs test_s')

assert 'output1' in self.logger_output_string
assert 'value1' in self.logger_output_string
assert 'No outputs' not in self.logger_output_string


class TestServicesInputs(TestCliBase):
@@ -193,7 +216,6 @@ def test_inputs_no_inputs(self, monkeypatch, mock_storage):
assert 'value1' not in self.logger_output_string

def test_inputs_one_input(self, monkeypatch, mock_storage):

monkeypatch.setattr(_Environment, 'model_storage', mock_storage)
s = mock_models.create_service_with_dependencies(include_input=True)
monkeypatch.setattr(mock_storage.service, 'get_by_name', mock.MagicMock(return_value=s))
@@ -56,5 +56,6 @@ def _verify_deployed_service_in_storage(service_name, model_storage):
assert service.name == service_name
assert len(service.executions) == 1
assert len(service.nodes) == 2
assert service.outputs['port'].value == 9090
assert all(node.state == node.STARTED for node in service.nodes.values())
assert len(service.executions[0].logs) > 0
@@ -86,6 +86,7 @@ def create_service(service_template, name=SERVICE_NAME, inputs=None):

def create_service_with_dependencies(include_execution=False,
include_input=False,
include_output=False,
include_node=False):
service_template = create_service_template()
service = create_service(service_template=service_template)
@@ -96,6 +97,9 @@ def create_service_with_dependencies(include_execution=False,
if include_input:
input = create_input(name='input1', value='value1')
service.inputs = {'input1': input}
if include_output:
output = create_output(name='output1', value='value1')
service.outputs = {'output1': output}
if include_node:
node_template = create_node_template(service_template=service_template)
node = create_node(node_template, service, state=models.Node.STARTED)
@@ -290,6 +294,10 @@ def create_input(name, value):
return _create_parameter(name, value, model_cls=models.Input)


def create_output(name, value):
return _create_parameter(name, value, model_cls=models.Output)


def _dictify(item):
return dict(((item.name, item),))

@@ -300,8 +308,8 @@ def get_standard_interface_template(service_template):
op_templates = dict(
(op_name, models.OperationTemplate(
name=op_name, implementation='{0}.{1}'.format(__file__, mock_operation.__name__)))
for op_name in [NORMATIVE_CREATE, NORMATIVE_CONFIGURE, NORMATIVE_START,
NORMATIVE_STOP, NORMATIVE_DELETE]
for op_name in (NORMATIVE_CREATE, NORMATIVE_CONFIGURE, NORMATIVE_START,
NORMATIVE_STOP, NORMATIVE_DELETE)
)
return models.InterfaceTemplate(name=NORMATIVE_STANDARD_INTERFACE,
operation_templates=op_templates,
@@ -314,8 +322,8 @@ def get_standard_interface(service):
ops = dict(
(op_name, models.Operation(
name=op_name, implementation='{0}.{1}'.format(__file__, mock_operation.__name__)))
for op_name in [NORMATIVE_CREATE, NORMATIVE_CONFIGURE, NORMATIVE_START,
NORMATIVE_STOP, NORMATIVE_DELETE]
for op_name in (NORMATIVE_CREATE, NORMATIVE_CONFIGURE, NORMATIVE_START,
NORMATIVE_STOP, NORMATIVE_DELETE)
)
return {
NORMATIVE_STANDARD_INTERFACE:
@@ -329,16 +337,15 @@ def get_configure_interfaces(service):
operations = dict(
(op_name, models.Operation(
name=op_name, implementation='{0}.{1}'.format(__file__, mock_operation.__name__)))
for op_name in [NORMATIVE_PRE_CONFIGURE_SOURCE,
for op_name in (NORMATIVE_PRE_CONFIGURE_SOURCE,
NORMATIVE_POST_CONFIGURE_SOURCE,
NORMATIVE_ADD_SOURCE,
NORMATIVE_REMOVE_SOURCE,

NORMATIVE_PRE_CONFIGURE_TARGET,
NORMATIVE_POST_CONFIGURE_TARGET,
NORMATIVE_ADD_TARGET,
NORMATIVE_REMOVE_TARGET
]
NORMATIVE_REMOVE_TARGET)
)
interface = {
NORMATIVE_CONFIGURE_INTERFACE: models.Interface(
@@ -144,6 +144,10 @@ topology_template:
type: nodejs.Server
requirements:
- host: application_host
capabilities:
data_endpoint:
properties:
url_path: /app
node_filter: # cannot be validated
properties:
#- flavor_name: { valid_values: [ {concat:[m1,.,small]} ] } # won't work because not validated :/
@@ -302,6 +306,14 @@ topology_template:
capabilities:
app_endpoint: [ loadbalancer, client ]

outputs:

endpoint:
description: >-
The application endpoint.
type: string
value: { get_property: [ nodejs, data_endpoint, url_path ] }

policy_types:

MaintenanceWorkflow:

0 comments on commit 5afa2f7

Please sign in to comment.