From 7ccbc878af11e9ea9b44845780580885fa8b908f Mon Sep 17 00:00:00 2001 From: Saju Madhavan Date: Sat, 4 Mar 2017 23:44:15 +0530 Subject: [PATCH] Assign floating IP to the vdu Assign floating IP to the vdu using TOSCA template Change-Id: Iee4ab0c4f6e47f64ac43e8a57d6775ea7939e5e1 Partial-Bug: 1537636 --- .../hot/tosca/tests/test_tosca_floatingip.py | 71 +++++++++++++++++++ translator/hot/tosca/tosca_floating.py | 48 +++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 translator/hot/tosca/tests/test_tosca_floatingip.py create mode 100644 translator/hot/tosca/tosca_floating.py diff --git a/translator/hot/tosca/tests/test_tosca_floatingip.py b/translator/hot/tosca/tests/test_tosca_floatingip.py new file mode 100644 index 00000000..445390db --- /dev/null +++ b/translator/hot/tosca/tests/test_tosca_floatingip.py @@ -0,0 +1,71 @@ +# 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. + +from toscaparser.nodetemplate import NodeTemplate +from toscaparser.tests.base import TestCase +import toscaparser.utils.yamlparser +from translator.hot.tosca.tosca_floating import ToscaFloatingIP + + +class ToscaFloatingIPTest(TestCase): + + def _tosca_floatingip_test(self, tpl_snippet, expectedprops, name=None): + nodetemplates = (toscaparser.utils.yamlparser. + simple_parse(tpl_snippet)['node_templates']) + if not name: + name = list(nodetemplates.keys())[0] + nodetemplate = NodeTemplate(name, nodetemplates, custom_def=[]) + nodetemplate.validate() + tosca_floatingip = ToscaFloatingIP(nodetemplate) + tosca_floatingip.handle_properties() + self.assertEqual(expectedprops, tosca_floatingip.properties) + + def test_node_floatingip_with_properties(self): + tpl_snippet = ''' + node_templates: + floating_ip: + type: tosca.nodes.network.FloatingIP + properties: + floating_network: public + floating_ip_address: 192.168.56.8 + port_id: abcd + ''' + expectedprops = {'floating_network': 'public', + 'floating_ip_address': '192.168.56.8', + 'port_id': 'abcd'} + self._tosca_floatingip_test( + tpl_snippet, + expectedprops) + + def test_node_floatingip_with_properties_and_link_requirements(self): + tpl_snippet = ''' + node_templates: + floating_ip: + type: tosca.nodes.network.FloatingIP + properties: + floating_network: public + floating_ip_address: 192.168.56.8 + requirements: + - link: + node: port1 + port1: + type: tosca.nodes.network.Port + properties: + ip_address: 10.0.0.6 + ''' + expectedprops = {'floating_network': 'public', + 'floating_ip_address': '192.168.56.8', + 'port_id': '{ get_resource: port1 }'} + self._tosca_floatingip_test( + tpl_snippet, + expectedprops, + name='floating_ip') diff --git a/translator/hot/tosca/tosca_floating.py b/translator/hot/tosca/tosca_floating.py new file mode 100644 index 00000000..6126653f --- /dev/null +++ b/translator/hot/tosca/tosca_floating.py @@ -0,0 +1,48 @@ +# +# 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. + +from translator.hot.syntax.hot_resource import HotResource + +# Name used to dynamically load appropriate map class. +TARGET_CLASS_NAME = 'ToscaFloatingIP' +TOSCA_LINKS_TO = 'tosca.relationships.network.LinksTo' + + +class ToscaFloatingIP(HotResource): + '''Translate TOSCA node type tosca.nodes.network.FloatingIP''' + + toscatype = 'tosca.nodes.network.FloatingIP' + + def __init__(self, nodetemplate, csar_dir=None): + super(ToscaFloatingIP, self).__init__(nodetemplate, + type='OS::Neutron::FloatingIP', + csar_dir=csar_dir) + + def handle_properties(self): + tosca_props = self.get_tosca_props() + fip_props = {} + for key, value in tosca_props.items(): + fip_props[key] = value + + links_to = None + for rel, node in self.nodetemplate.relationships.items(): + if not links_to and rel.is_derived_from(TOSCA_LINKS_TO): + links_to = node + for hot_resource in self.depends_on_nodes: + if links_to.name == hot_resource.name: + self.depends_on.remove(hot_resource) + break + fip_props['port_id'] =\ + '{ get_resource: %s }' % (links_to.name) + + self.properties = fip_props