[CORD-2715] making sure we are not deleting object with must-exist key set to true, as they are included for reference

Change-Id: I07587e6f57b4558554712d67cd21f161c4fe8df5
(cherry picked from commit 91d7aebf39a6e3fdc374eef59cb9e9536211c296)
diff --git a/src/tosca/parser.py b/src/tosca/parser.py
index b30f716..c7faa60 100644
--- a/src/tosca/parser.py
+++ b/src/tosca/parser.py
@@ -218,9 +218,15 @@
                     model = self.populate_dependencies(model, recipe.requirements, self.saved_model_by_name)
                     # [] save, update or delete
 
-                    if self.delete and not model.is_new:
+                    reference_only = False
+                    if 'must-exist' in data:
+                        reference_only = True
+
+                    if self.delete and not model.is_new and not reference_only:
+                        print "[XOS-Tosca] Deleting model %s[%s]" % (class_name, model.id)
                         model.delete()
                     elif not self.delete:
+                        print "[XOS-Tosca] Saving model %s[%s]" % (class_name, model.id)
                         model.save()
 
                     self.saved_model_by_name[recipe.name] = model
@@ -242,6 +248,7 @@
                 exception_msg = e._state.details
             raise Exception(exception_msg)
         except Exception, e:
+            print e
             raise Exception(e)
 
 
diff --git a/test/test_tosca_parser_e2e.py b/test/test_tosca_parser_e2e.py
index 6a44b6f..2d2649f 100644
--- a/test/test_tosca_parser_e2e.py
+++ b/test/test_tosca_parser_e2e.py
@@ -41,6 +41,9 @@
 class FakeUser:
     objects = FakeObj
 
+class FakeNode:
+    objects = FakeObj
+
 USERNAME = "username"
 PASSWORD = "pass"
 
@@ -49,7 +52,8 @@
     'XOSGuiExtension': FakeGuiExt,
     'Site': FakeSite,
     'User': FakeUser,
-    'Instance': FakeInstance
+    'Instance': FakeInstance,
+    'Node': FakeNode
 }
 
 class TOSCA_Parser_E2E(unittest.TestCase):
@@ -97,8 +101,9 @@
 
     @patch.dict(RESOURCES, mock_resources, clear=True)
     @patch.object(FakeGuiExt.objects, 'filter', MagicMock(return_value=[FakeModel]))
+    @patch.object(FakeNode.objects, 'filter', MagicMock(return_value=[FakeModel]))
     @patch.object(FakeModel, 'delete')
-    def test_basic_deletion(self, mock_delete):
+    def test_basic_deletion(self, mock_model):
         """
         [TOSCA_Parser] Should delete models defined in a TOSCA recipe
         """
@@ -108,12 +113,18 @@
     description: Persist xos-sample-gui-extension
 
     imports:
-       - custom_types/xosguiextension.yaml
+        - custom_types/node.yaml
+        - custom_types/xosguiextension.yaml
 
     topology_template:
       node_templates:
 
-        # UI Extension
+        should_stay:
+          type: tosca.nodes.Node
+          properties:
+            name: should_stay
+            must-exist: true
+
         test:
           type: tosca.nodes.XOSGuiExtension
           properties:
@@ -126,10 +137,10 @@
         parser.execute()
 
         # checking that the model has been saved
-        mock_delete.assert_called()
+        mock_model.assert_called_once()
 
         self.assertIsNotNone(parser.templates_by_model_name['test'])
-        self.assertEqual(parser.ordered_models_name, ['test'])
+        self.assertEqual(parser.ordered_models_name, ['test', 'should_stay'])
 
     @patch.dict(RESOURCES, mock_resources, clear=True)
     @patch.object(FakeSite.objects, 'filter', MagicMock(return_value=[FakeModel]))