From 8c04192af8640bcb0e91d0939538c10c45c567bb Mon Sep 17 00:00:00 2001 From: spzala Date: Thu, 9 Jul 2015 03:53:11 -0700 Subject: [PATCH] Add app in the nodejs mongodb template The current template does not make much sense as it's having nodejs and mongodb deployed on two different instances but without any connection between them. Add a nodejs app on the app server which uses mongodb database. Nodejs custom type is not needed as it can use webserver type. Also, a better test will be added with mapping to actual HOT template, not just resources, as part of generator side work. Partial-Bug: #1452545 Change-Id: I7f4ed72368bf7fcc89da6fbe9b322b8c6872e100 --- translator/tests/test_elk.py | 186 ------------------ translator/tests/test_template.py | 63 ++++++ .../tests/data/custom_types/nodejs.yaml | 16 -- .../tosca_nodejs_mongodb_two_instances.yaml | 47 +++-- 4 files changed, 92 insertions(+), 220 deletions(-) delete mode 100755 translator/tests/test_elk.py create mode 100755 translator/tests/test_template.py delete mode 100644 translator/toscalib/tests/data/custom_types/nodejs.yaml diff --git a/translator/tests/test_elk.py b/translator/tests/test_elk.py deleted file mode 100755 index 9d00da6a..00000000 --- a/translator/tests/test_elk.py +++ /dev/null @@ -1,186 +0,0 @@ -# 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. - -import os -from translator.hot.tosca_translator import TOSCATranslator -from translator.tests.base import TestCase -from translator.toscalib.tosca_template import ToscaTemplate -import translator.toscalib.utils.yamlparser - - -class ToscaMongoNodejsTest(TestCase): - parsed_params = {'storage_snapshot_id': 'test_id', - 'storage_location': '/test', 'cpus': '1', - 'storage_size': '1'} - - '''TOSCA template with nodejs, app and mongodb on 2 servers.''' - tosca_tpl = os.path.join( - os.path.dirname(os.path.abspath(__file__)), - "../toscalib/tests/data/tosca_nodejs_mongodb_two_instances.yaml") - tosca = ToscaTemplate(tosca_tpl) - - def test_relationship_def(self): - expected_relationship = ['tosca.relationships.HostedOn'] - expected_capabilities_names = ['node'] - for tpl in self.tosca.nodetemplates: - if tpl.name == 'nodejs': - def_keys = tpl.type_definition.relationship.keys() - self.assertEqual( - expected_relationship, - sorted([x.type for x in def_keys])) - self.assertEqual( - expected_capabilities_names, - sorted([x.capability_name for x in def_keys])) - - def test_relationships(self): - expected_relationship = ['tosca.relationships.HostedOn'] - expected_relatednodes = ['app_server'] - for tpl in self.tosca.nodetemplates: - rels = tpl.relationships - if rels: - if tpl.name == 'nodejs': - self.assertEqual( - expected_relationship, - sorted([x.type for x in tpl.relationships.keys()])) - self.assertEqual( - expected_relatednodes, - sorted([y.name for y in tpl.relationships.values()])) - - def test_related_nodes(self): - expected_nodejs = ['app_server'] - actual_nodejs = [] - for tpl in self.tosca.nodetemplates: - if tpl.name == 'nodejs': - for node in tpl.related_nodes: - actual_nodejs.append(node.name) - self.assertEqual(sorted(actual_nodejs), expected_nodejs) - - def test_translate_nodejs_mongodb(self): - translate = TOSCATranslator(self.tosca, self.parsed_params) - output = translate.translate() - - expected_resource = {'mongo_dbms_create_config': - {'properties': - {'config': - {'get_file': 'mongodb/create.sh'}, - 'group': 'script'}, - 'type': 'OS::Heat::SoftwareConfig'}, - 'mongo_dbms_configure_config': - {'properties': - {'config': - {'get_file': 'mongodb/config.sh'}, - 'group': 'script'}, - 'type': 'OS::Heat::SoftwareConfig'}, - 'mongo_dbms_start_config': - {'properties': - {'config': - {'get_file': 'mongodb/start.sh'}, - 'group': 'script'}, - 'type': 'OS::Heat::SoftwareConfig'}, - 'nodejs_create_config': - {'properties': - {'config': - {'get_file': 'nodejs/create.sh'}, - 'group': 'script'}, - 'type': 'OS::Heat::SoftwareConfig'}, - 'nodejs_configure_config': - {'properties': - {'config': - {'get_file': 'nodejs/config.sh'}, - 'group': 'script'}, - 'type': 'OS::Heat::SoftwareConfig'}, - 'nodejs_start_config': - {'properties': - {'config': - {'get_file': 'nodejs/start.sh'}, - 'group': 'script'}, - 'type': 'OS::Heat::SoftwareConfig'}, - 'mongo_dbms_create_deploy': - {'properties': - {'config': - {'get_resource': 'mongo_dbms_create_config'}, - 'server': - {'get_resource': 'mongo_server'}}, - 'type': 'OS::Heat::SoftwareDeployment'}, - 'mongo_dbms_configure_deploy': - {'type': 'OS::Heat::SoftwareDeployment', - 'depends_on': - ['mongo_dbms_create_deploy'], - 'properties': - {'config': - {'get_resource': 'mongo_dbms_configure_config'}, - 'input_values': - {'mongodb_ip': - {'get_attr': - ['mongo_server', 'networks', 'private', 0]}}, - 'server': - {'get_resource': 'mongo_server'}}}, - 'mongo_dbms_start_deploy': - {'type': 'OS::Heat::SoftwareDeployment', - 'depends_on': ['mongo_dbms_configure_deploy'], - 'properties': - {'config': - {'get_resource': 'mongo_dbms_start_config'}, - 'server': - {'get_resource': 'mongo_server'}}}, - 'nodejs_create_deploy': - {'properties': - {'config': - {'get_resource': 'nodejs_create_config'}, - 'server': - {'get_resource': 'app_server'}}, - 'type': 'OS::Heat::SoftwareDeployment'}, - 'nodejs_configure_deploy': - {'depends_on': - ['nodejs_create_deploy'], - 'properties': - {'config': - {'get_resource': 'nodejs_configure_config'}, - 'input_values': - {'github_url': - 'https://github.com/sample.git', - 'mongodb_ip': - {'get_attr': - ['mongo_server', 'networks', 'private', 0]}}, - 'server': - {'get_resource': 'app_server'}}, - 'type': 'OS::Heat::SoftwareDeployment'}, - 'nodejs_start_deploy': - {'depends_on': ['nodejs_configure_deploy'], - 'properties': - {'config': - {'get_resource': 'nodejs_start_config'}, - 'server': - {'get_resource': 'app_server'}}, - 'type': 'OS::Heat::SoftwareDeployment'}, - 'app_server': - {'properties': - {'flavor': 'm1.medium', - 'image': 'ubuntu-software-config-os-init', - 'key_name': 'userkey', - 'user_data_format': 'SOFTWARE_CONFIG'}, - 'type': 'OS::Nova::Server'}, - 'mongo_server': - {'properties': - {'flavor': 'm1.medium', - 'image': 'ubuntu-software-config-os-init', - 'key_name': 'userkey', - 'user_data_format': 'SOFTWARE_CONFIG'}, - 'type': 'OS::Nova::Server'}} - - output_dict = translator.toscalib.utils.yamlparser.simple_parse(output) - - resources = output_dict.get('resources') - for resource_name in resources: - translated_value = resources.get(resource_name) - expected_value = expected_resource.get(resource_name) - self.assertEqual(translated_value, expected_value) diff --git a/translator/tests/test_template.py b/translator/tests/test_template.py new file mode 100755 index 00000000..3c8e775e --- /dev/null +++ b/translator/tests/test_template.py @@ -0,0 +1,63 @@ +# 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. + +import os +from translator.tests.base import TestCase +from translator.toscalib.tosca_template import ToscaTemplate + + +class ToscaMongoNodejsTest(TestCase): + parsed_params = {'storage_snapshot_id': 'test_id', + 'storage_location': '/test', 'cpus': '1', + 'storage_size': '1'} + + '''TOSCA template with nodejs, app and mongodb on 2 servers.''' + tosca_tpl = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "../toscalib/tests/data/tosca_nodejs_mongodb_two_instances.yaml") + tosca = ToscaTemplate(tosca_tpl) + + def test_relationship_def(self): + expected_relationship = ['tosca.relationships.HostedOn'] + expected_capabilities_names = ['node'] + for tpl in self.tosca.nodetemplates: + if tpl.name == 'nodejs': + def_keys = tpl.type_definition.relationship.keys() + self.assertEqual( + expected_relationship, + sorted([x.type for x in def_keys])) + self.assertEqual( + expected_capabilities_names, + sorted([x.capability_name for x in def_keys])) + + def test_relationships(self): + expected_relationship = ['tosca.relationships.HostedOn'] + expected_relatednodes = ['app_server'] + for tpl in self.tosca.nodetemplates: + rels = tpl.relationships + if rels: + if tpl.name == 'nodejs': + self.assertEqual( + expected_relationship, + sorted([x.type for x in tpl.relationships.keys()])) + self.assertEqual( + expected_relatednodes, + sorted([y.name for y in tpl.relationships.values()])) + + def test_related_nodes(self): + expected_nodejs = ['app_server'] + actual_nodejs = [] + for tpl in self.tosca.nodetemplates: + if tpl.name == 'nodejs': + for node in tpl.related_nodes: + actual_nodejs.append(node.name) + self.assertEqual(sorted(actual_nodejs), expected_nodejs) diff --git a/translator/toscalib/tests/data/custom_types/nodejs.yaml b/translator/toscalib/tests/data/custom_types/nodejs.yaml deleted file mode 100644 index dfa9e6fb..00000000 --- a/translator/toscalib/tests/data/custom_types/nodejs.yaml +++ /dev/null @@ -1,16 +0,0 @@ -tosca_definitions_version: tosca_simple_yaml_1_0_0 - -node_types: - tosca.nodes.SoftwareComponent.Nodejs: - derived_from: tosca.nodes.SoftwareComponent - properties: - github_url: - required: no - type: string - description: location of the application on the github. - default: https://github.com/mmm/testnode.git - interfaces: - Standard: - inputs: - github_url: - type: string diff --git a/translator/toscalib/tests/data/tosca_nodejs_mongodb_two_instances.yaml b/translator/toscalib/tests/data/tosca_nodejs_mongodb_two_instances.yaml index d27c62fd..276752af 100644 --- a/translator/toscalib/tests/data/tosca_nodejs_mongodb_two_instances.yaml +++ b/translator/toscalib/tests/data/tosca_nodejs_mongodb_two_instances.yaml @@ -4,7 +4,7 @@ description: > TOSCA simple profile with nodejs and mongodb. imports: - - custom_types/nodejs.yaml + - custom_types/paypalpizzastore_nodejs_app.yaml dsl_definitions: host_capabilities: &host_capabilities @@ -28,36 +28,47 @@ topology_template: github_url: type: string description: The URL to download nodejs. - default: https://github.com/sample.git + default: http://github.com/paypal/rest-api-sample-app-nodejs.git node_templates: - nodejs: - type: tosca.nodes.SoftwareComponent.Nodejs + paypal_pizzastore: + type: tosca.nodes.WebApplication.PayPalPizzaStore properties: - github_url: https://github.com/sample.git + github_url: { get_input: github_url } + requirements: + - host: + node: nodejs + - database_connection: + node: mongo_db + interfaces: + Standard: + configure: + implementation: nodejs/config.sh + inputs: + github_url: http://github.com/paypal/rest-api-sample-app-nodejs.git + mongodb_ip: { get_attribute: [mongo_server, private_address] } + start: nodejs/start.sh + nodejs: + type: tosca.nodes.WebServer requirements: - host: - capability: tosca.capabilities.Container node: app_server - relationship: tosca.relationships.HostedOn interfaces: Standard: create: nodejs/create.sh - configure: - implementation: nodejs/config.sh - inputs: - github_url: { get_property: [ SELF, github_url ] } - mongodb_ip: { get_attribute: [mongo_server, private_address] } - start: nodejs/start.sh + mongo_db: + type: tosca.nodes.Database + requirements: + - host: + node: mongo_dbms + interfaces: + Standard: + create: mongodb/create_database.sh mongo_dbms: type: tosca.nodes.DBMS requirements: - - host: - capability: tosca.capabilities.Container + - host: node: mongo_server - relationship: tosca.relationships.HostedOn - properties: - port: 27017 interfaces: Standard: create: mongodb/create.sh