[CORD-2080] Adding 'tosca_key' support in xproto

Change-Id: Ib01c1cdcb81a51819c9e08703e6c76a4ffa09f17
diff --git a/src/tosca/default.py b/src/tosca/default.py
index 6bb789c..4de0975 100644
--- a/src/tosca/default.py
+++ b/src/tosca/default.py
@@ -17,4 +17,5 @@
 import os
 
 TOSCA_DEFS_DIR = os.path.dirname(os.path.realpath(__file__)) + "/custom_types"
-TOSCA_RECIPES_DIR = os.path.dirname(os.path.realpath(__file__)) + "/"
\ No newline at end of file
+TOSCA_RECIPES_DIR = os.path.dirname(os.path.realpath(__file__)) + "/"
+TOSCA_KEYS_DIR = os.path.abspath(os.path.dirname(os.path.realpath(__file__)) + "/../grpc_client")
\ No newline at end of file
diff --git a/src/tosca/generator.py b/src/tosca/generator.py
index 12e2442..6aa309c 100644
--- a/src/tosca/generator.py
+++ b/src/tosca/generator.py
@@ -15,7 +15,7 @@
 
 
 import os
-from default import TOSCA_DEFS_DIR
+from default import TOSCA_DEFS_DIR, TOSCA_KEYS_DIR
 from xosgenx.generator import XOSGenerator
 from xosapi.xos_grpc_client import Empty
 
@@ -36,7 +36,6 @@
         print "[XOS-TOSCA] Generating TOSCA"
         self._clean()
 
-
         try:
             xproto = client.utility.GetXproto(Empty())
             args = Args()
@@ -50,3 +49,17 @@
             print "[XOS-TOSCA] Failed to generate TOSCA"
             print e
 
+        try:
+            xproto = client.utility.GetXproto(Empty())
+            args = Args()
+            args.output = TOSCA_KEYS_DIR
+            args.inputs = str(xproto.xproto)
+            args.target = os.path.join(current_dir, 'xtarget/tosca_keys.xtarget')
+            args.write_to_file = 'single'
+            args.dest_file = 'KEYS.py'
+            XOSGenerator.generate(args)
+            print "[XOS-TOSCA] TOSCA Keys generated in %s" % args.output
+        except Exception as e:
+            print "[XOS-TOSCA] Failed to generate TOSCA Keys"
+            print e
+
diff --git a/src/tosca/parser.py b/src/tosca/parser.py
index acbd5f1..b30f716 100644
--- a/src/tosca/parser.py
+++ b/src/tosca/parser.py
@@ -147,6 +147,14 @@
             setattr(model, "%s_id" % class_name, related_model.id)
         return model
 
+    @staticmethod
+    def add_dependencies(data, requirements, saved_models):
+        for dep in requirements:
+            class_name = dep.keys()[0]
+            related_model = saved_models[dep[class_name]['node']]
+            data["%s_id" % class_name] = related_model.id
+        return data
+
     def __init__(self, recipe, username, password, **kwargs):
 
         self.delete = False
@@ -198,6 +206,10 @@
                             data = {}
                     # [] get model by class name
                     class_name = recipe.type.replace("tosca.nodes.", "")
+
+                    # augemnt data with relations
+                    data = self.add_dependencies(data, recipe.requirements, self.saved_model_by_name)
+
                     model = GRPCModelsAccessor.get_model_from_classname(class_name, data, self.username, self.password)
                     # [] populate model with data
                     model = self.populate_model(model, data)
diff --git a/src/tosca/xtarget/tosca_keys.xtarget b/src/tosca/xtarget/tosca_keys.xtarget
new file mode 100644
index 0000000..ad235e5
--- /dev/null
+++ b/src/tosca/xtarget/tosca_keys.xtarget
@@ -0,0 +1,5 @@
+TOSCA_KEYS = {
+{%- for m in proto.messages %}
+    '{{ m.name }}': {{ xproto_fields_to_tosca_keys(m.fields + xproto_base_fields(m, proto.message_table)) }},
+{%- endfor %}
+}
\ No newline at end of file