RIFT OSM R1 Initial Submission
[osm/SO.git] / common / python / rift / mano / tosca_translator / rwmano / tosca / tosca_network_network.py
diff --git a/common/python/rift/mano/tosca_translator/rwmano/tosca/tosca_network_network.py b/common/python/rift/mano/tosca_translator/rwmano/tosca/tosca_network_network.py
new file mode 100644 (file)
index 0000000..b446e51
--- /dev/null
@@ -0,0 +1,136 @@
+#
+# 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.
+#
+# Copyright 2016 RIFT.io Inc
+
+
+from rift.mano.tosca_translator.common.utils import _
+from rift.mano.tosca_translator.common.utils import convert_keys_to_python
+from rift.mano.tosca_translator.rwmano.syntax.mano_resource import ManoResource
+
+
+# Name used to dynamically load appropriate map class.
+TARGET_CLASS_NAME = 'ToscaNetwork'
+
+
+class ToscaNetwork(ManoResource):
+    '''Translate TOSCA node type tosca.nodes.network.Network.'''
+
+    toscatype = 'tosca.nodes.network.Network'
+    NETWORK_PROPS = ['network_name', 'network_id']
+    REQUIRED_PROPS = ['name', 'id', 'type', 'version', 'short-name',
+                      'description', 'vendor']
+    OPTIONAL_PROPS = ['vnfd-connection-point-ref']
+    IGNORE_PROPS = ['ip_version', 'dhcp_enabled']
+    VALID_TYPES = ['ELAN']
+
+    def __init__(self, log, nodetemplate, metadata=None):
+        super(ToscaNetwork, self).__init__(log,
+                                           nodetemplate,
+                                           type_='vld',
+                                           metadata=metadata)
+
+    def handle_properties(self):
+        tosca_props = self.get_tosca_props()
+
+        if 'cidr' in tosca_props.keys():
+            self.log.warn(_("Support for subnet not yet "
+                            "available. Ignoring it"))
+        net_props = {}
+        for key, value in tosca_props.items():
+            if key in self.NETWORK_PROPS:
+                if key == 'network_name':
+                    net_props['name'] = value
+                elif key == 'network_id':
+                    net_props['id'] = value
+            else:
+                net_props[key] = value
+
+        net_props['type'] = self.get_type()
+
+        if 'name' not in net_props:
+            # Use the node name as network name
+            net_props['name'] = self.name
+
+        if 'short_name' not in net_props:
+            # Use the node name as network name
+            net_props['short-name'] = self.name
+
+        if 'id' not in net_props:
+            net_props['id'] = self.id
+
+        if 'description' not in net_props:
+            net_props['description'] = self.description
+
+        if 'vendor' not in net_props:
+            net_props['vendor'] = self.vendor
+
+        if 'version' not in net_props:
+            net_props['version'] = self.version
+
+        self.log.debug(_("Network {0} properties: {1}").
+                       format(self.name, net_props))
+        self.properties = net_props
+
+    def get_type(self):
+        """Get the network type based on propery or type derived from"""
+        node = self.nodetemplate
+        tosca_props = self.get_tosca_props()
+        try:
+            if tosca_props['network_type'] in ToscaNetwork.VALID_TYPES:
+                return tosca_props['network_type']
+        except KeyError:
+            pass
+
+        node_type = node.type_definition
+
+        while node_type.type:
+            self.log.debug(_("Node name {0} with type {1}").
+                           format(self.name, node_type.type))
+            prefix, nw_type = node_type.type.rsplit('.', 1)
+            if nw_type in ToscaNetwork.VALID_TYPES:
+                return nw_type
+            else:
+                # Get the parent
+                node_type = ManoResource.get_parent_type(node_type)
+
+        return "ELAN"
+
+    def generate_yang_model_gi(self, nsd, vnfds):
+        props = convert_keys_to_python(self.properties)
+        try:
+            nsd.vld.add().from_dict(props)
+        except Exception as e:
+            err_msg = _("{0} Exception vld from dict {1}: {2}"). \
+                      format(self, props, e)
+            self.log.error(err_msg)
+            raise e
+
+    def generate_yang_model(self, nsd, vnfds, use_gi=False):
+        """Generate yang model for the node"""
+        self.log.debug(_("Generate YANG model for {0}").
+                       format(self))
+
+        # Remove the props to be ignroed:
+        for key in ToscaNetwork.IGNORE_PROPS:
+            if key in self.properties:
+                self.properties.pop(key)
+
+        if use_gi:
+            return self.generate_yang_model_gi(nsd, vnfds)
+
+        vld = self.properties
+
+        if 'vld' not in nsd:
+            nsd['vld'] = []
+        nsd['vld'].append(vld)