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
This commit is contained in:
spzala 2015-07-09 03:53:11 -07:00
parent 3adf9474c7
commit 8c04192af8
4 changed files with 92 additions and 220 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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