You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ariatosca.apache.org by av...@apache.org on 2017/06/07 20:02:00 UTC
[02/13] incubator-ariatosca git commit: ARIA-199 Add "services
outputs" CLI command
ARIA-199 Add "services outputs" CLI command
* Also add an output to hello world example
Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/5afa2f7f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/5afa2f7f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/5afa2f7f
Branch: refs/heads/ARIA-275-update-NFV-profile-to-csd04
Commit: 5afa2f7fe11977593009b6da25733fa8dd61a1e9
Parents: cd83073
Author: Tal Liron <ta...@gmail.com>
Authored: Fri Jun 2 14:20:28 2017 -0500
Committer: Tal Liron <ta...@gmail.com>
Committed: Wed Jun 7 14:42:35 2017 -0500
----------------------------------------------------------------------
aria/cli/commands/services.py | 23 ++++++++---------
aria/modeling/models.py | 4 +--
examples/hello-world/helloworld.yaml | 16 ++++++++----
tests/cli/test_services.py | 26 ++++++++++++++++++--
tests/end2end/test_hello_world.py | 1 +
tests/mock/models.py | 21 ++++++++++------
.../node-cellar/node-cellar.yaml | 12 +++++++++
7 files changed, 76 insertions(+), 27 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/5afa2f7f/aria/cli/commands/services.py
----------------------------------------------------------------------
diff --git a/aria/cli/commands/services.py b/aria/cli/commands/services.py
index 476387c..ae5895a 100644
--- a/aria/cli/commands/services.py
+++ b/aria/cli/commands/services.py
@@ -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:
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/5afa2f7f/aria/modeling/models.py
----------------------------------------------------------------------
diff --git a/aria/modeling/models.py b/aria/modeling/models.py
index 4102090..f30b86f 100644
--- a/aria/modeling/models.py
+++ b/aria/modeling/models.py
@@ -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 @@ models_to_register = [
Task,
Log,
Argument
-]
+)
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/5afa2f7f/examples/hello-world/helloworld.yaml
----------------------------------------------------------------------
diff --git a/examples/hello-world/helloworld.yaml b/examples/hello-world/helloworld.yaml
index be78401..d3369b7 100644
--- a/examples/hello-world/helloworld.yaml
+++ b/examples/hello-world/helloworld.yaml
@@ -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
\ No newline at end of file
+ stop: scripts/stop.sh
+
+ outputs:
+ port:
+ type: integer
+ value: { get_property: [ web_app, port ] }
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/5afa2f7f/tests/cli/test_services.py
----------------------------------------------------------------------
diff --git a/tests/cli/test_services.py b/tests/cli/test_services.py
index e5717cc..7dc84bc 100644
--- a/tests/cli/test_services.py
+++ b/tests/cli/test_services.py
@@ -174,7 +174,30 @@ class TestServicesDelete(TestCliBase):
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 @@ class TestServicesInputs(TestCliBase):
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))
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/5afa2f7f/tests/end2end/test_hello_world.py
----------------------------------------------------------------------
diff --git a/tests/end2end/test_hello_world.py b/tests/end2end/test_hello_world.py
index 71792dd..b55b9a8 100644
--- a/tests/end2end/test_hello_world.py
+++ b/tests/end2end/test_hello_world.py
@@ -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
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/5afa2f7f/tests/mock/models.py
----------------------------------------------------------------------
diff --git a/tests/mock/models.py b/tests/mock/models.py
index 56a6e3e..7f6bbea 100644
--- a/tests/mock/models.py
+++ b/tests/mock/models.py
@@ -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,7 +337,7 @@ 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,
@@ -337,8 +345,7 @@ def get_configure_interfaces(service):
NORMATIVE_PRE_CONFIGURE_TARGET,
NORMATIVE_POST_CONFIGURE_TARGET,
NORMATIVE_ADD_TARGET,
- NORMATIVE_REMOVE_TARGET
- ]
+ NORMATIVE_REMOVE_TARGET)
)
interface = {
NORMATIVE_CONFIGURE_INTERFACE: models.Interface(
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/5afa2f7f/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml
----------------------------------------------------------------------
diff --git a/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml b/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml
index 4d53f9b..a34301c 100644
--- a/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml
+++ b/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml
@@ -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: