RIFT OSM R1 Initial Submission
[osm/SO.git] / common / python / rift / mano / yang_translator / rwmano / syntax / tosca_resource.py
diff --git a/common/python/rift/mano/yang_translator/rwmano/syntax/tosca_resource.py b/common/python/rift/mano/yang_translator/rwmano/syntax/tosca_resource.py
new file mode 100644 (file)
index 0000000..f05933b
--- /dev/null
@@ -0,0 +1,221 @@
+# Copyright 2016 RIFT.io Inc
+#
+# 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 rift.mano.yang_translator.common.utils import _
+
+
+class ToscaResource(object):
+    '''Base class for YANG node type translation to RIFT.io TOSCA type.'''
+
+    # Used when creating the resource, so keeping separate
+    # from REQUIRED_FIELDS below
+    NAME = 'name'
+
+    REQUIRED_FIELDS = (DESC, VERSION, VENDOR, ID) = \
+                      ('description', 'version', 'vendor', 'id')
+
+    COMMON_FIELDS = (PATH, PORT, HOST, XPATH, TYPE, COUNT, FILE) = \
+                    ('path', 'port', 'host', 'xpath', 'type', 'count', 'file')
+
+    IGNORE_FIELDS = ['short_name']
+
+    FIELD_TYPES = (STRING, MAP, INTEGER, BOOL) = \
+                  ('string', 'map', 'integer', 'boolean',)
+
+    YANG_KEYS = (VLD, NSD, VNFD, VDU, DASHBOARD_PARAMS,
+                 CONFIG_ATTR, CONFIG_TMPL,
+                 CONFIG_TYPE, CONFIG_DETAILS, EXT_INTF,
+                 VIRT_INTF, POLL_INTVL_SECS,
+                 MEM_VNF_INDEX_REF, VNFD_ID_REF,
+                 MEM_VNF_INDEX, VNF_CONFIG, TYPE_Y,
+                 USER_DEF_SCRIPT, SEQ, PARAM,
+                 VALUE, START_BY_DFLT,) = \
+                ('vld', 'nsd', 'vnfd', 'vdu', 'dashboard_params',
+                 'config_attributes', 'config_template',
+                 'config_type', 'config_details', 'external_interface',
+                 'virtual_interface', 'polling_interval_secs',
+                 'member_vnf_index_ref', 'vnfd_id_ref',
+                 'member_vnf_index', 'vnf_configuration', 'type_yang',
+                 'user_defined_script', 'seq', 'parameter',
+                 'value', 'start_by_default',)
+
+    TOSCA_FIELDS = (DERIVED_FROM, PROPERTIES, DEFAULT, REQUIRED,
+                    NO, CONSTRAINTS, REALTIONSHIPS,
+                    REQUIREMENTS, UNBOUND, NODE,
+                    OCCURENCES, PRIMITIVES, MEMBERS,
+                    POLL_INTVL, DEFAULT, TRUE, FALSE,) = \
+                   ('derived_from', 'properties', 'default', 'required',
+                    'no', 'constraints', 'relationships',
+                    'requirements', 'UNBOUND', 'node',
+                    'occurences', 'primitives', 'members',
+                    'polling_interval', 'default', 'true', 'false')
+
+    TOSCA_SEC = (DATA_TYPES, CAPABILITY_TYPES, NODE_TYPES,
+                 GROUP_TYPES, POLICY_TYPES, REQUIREMENTS,
+                 ARTIFACTS, PROPERTIES, INTERFACES,
+                 CAPABILITIES, RELATIONSHIP,
+                 ARTIFACT_TYPES) = \
+                ('data_types', 'capability_types', 'node_types',
+                 'group_types', 'policy_types', 'requirements',
+                 'artifacts', 'properties', 'interfaces',
+                 'capabilities', 'relationship',
+                 'artifact_types')
+
+    TOSCA_TMPL = (INPUTS, NODE_TMPL, GROUPS, POLICIES,
+                  METADATA, TOPOLOGY_TMPL, OUTPUTS) = \
+                 ('inputs', 'node_templates', 'groups', 'policies',
+                  'metadata', 'topology_template', 'outputs')
+
+    TOSCA_DERIVED = (
+        T_VNF_CONFIG,
+        T_HTTP_EP,
+        T_MGMT_INTF,
+        T_MON_PARAM,
+        T_VNF1,
+        T_VDU1,
+        T_CP1,
+        T_VL1,
+        T_CONF_PRIM,
+        T_SCALE_GRP,
+        T_ARTF_QCOW2,
+        T_INITIAL_CFG,
+    ) = \
+        ('tosca.datatypes.network.riftio.vnf_configuration',
+         'tosca.capabilities.riftio.http_endpoint_type',
+         'tosca.capabilities.riftio.mgmt_interface_type',
+         'tosca.capabilities.riftio.monitoring_param',
+         'tosca.nodes.riftio.VNF1',
+         'tosca.nodes.riftio.VDU1',
+         'tosca.nodes.riftio.CP1',
+         'tosca.nodes.riftio.VL1',
+         'tosca.groups.riftio.ConfigPrimitives',
+         'tosca.policies.riftio.ScalingGroup',
+         'tosca.artifacts.Deployment.Image.riftio.QCOW2',
+         'tosca.policies.riftio.InitialConfigPrimitive'
+        )
+
+    SUPPORT_FILES = ( SRC, DEST, EXISTING) = \
+                    ('source', 'destination', 'existing')
+
+    SUPPORT_DIRS = (IMAGE_DIR, SCRIPT_DIR,) = \
+                   ('images', 'scripts',)
+
+    def __init__(self,
+                 log,
+                 name,
+                 type_,
+                 yang):
+        self.log = log
+        self.name = name
+        self.type_ = type_
+        self.yang = yang
+        self.id_ = None
+        log.debug(_('Translating YANG node %(name)s of type %(type)s') %
+                  {'name': self.name,
+                   'type': self.type_})
+
+    # Added the below property menthods to support methods that
+    # works on both toscaparser.NodeType and translator.ToscaResource
+    @property
+    def type(self):
+        return self.type_
+
+    @type.setter
+    def type(self, value):
+        self.type_ = value
+
+    def get_type(self):
+        return self.type_
+
+    @property
+    def id(self):
+        return self.id_
+
+    @id.setter
+    def id(self, value):
+        self.id_ = value
+
+    @property
+    def description(self):
+        return _("Translated from YANG")
+
+    @property
+    def vendor(self):
+        if self._vendor is None:
+            if self.metadata and 'vendor' in self.metadata:
+                self._vendor = self.metadata['vendor']
+            else:
+                self._vendor = "RIFT.io"
+        return self._vendor
+
+    @property
+    def version(self):
+        if self._version is None:
+            if self.metadata and 'version' in self.metadata:
+                self._version = str(self.metadata['version'])
+            else:
+                self._version = '1.0'
+        return self._version
+
+    def __str__(self):
+        return "%s(%s)" % (self.name, self.type)
+
+    def map_yang_name_to_tosca(self, name):
+        new_name = name.replace("_", "-")
+        return new_name
+
+    def map_keys_to_tosca(self, d):
+        if isinstance(d, dict):
+            for key in d.keys():
+                d[self.map_yang_name_to_tosca(key)] = \
+                                    self.map_keys_to_tosca(d.pop(key))
+            return d
+        elif isinstance(d, list):
+            arr = []
+            for memb in d:
+                arr.append(self.map_keys_to_tosca(memb))
+            return arr
+        else:
+            return d
+
+    def handle_yang(self):
+        self.log.debug(_("Need to implement handle_yang for {0}").
+                       format(self))
+
+    def remove_ignored_fields(self, d):
+        '''Remove keys in dict not used'''
+        for key in self.IGNORE_FIELDS:
+            if key in d:
+                d.pop(key)
+
+    def generate_tosca_type(self, tosca):
+        self.log.debug(_("Need to implement generate_tosca_type for {0}").
+                       format(self))
+
+    def generate_tosca_model(self, tosca):
+        self.log.debug(_("Need to implement generate_tosca_model for {0}").
+                       format(self))
+
+    def get_supporting_files(self):
+        """Get list of other required files for each resource"""
+        pass
+
+    def get_matching_item(self, name, items, key=None):
+        if key is None:
+            key = 'name'
+        for entry in items:
+            if entry[key] == name:
+                return entry
+        return None