SEBA-108 call acquire_service_instance on fc service

Change-Id: I1cc26b8a25eefbf6b9f49f17326b0f23608e80d6
diff --git a/xos/synchronizer/model_policies/model_policy_voltserviceinstance.py b/xos/synchronizer/model_policies/model_policy_voltserviceinstance.py
index 227efa9..1321955 100644
--- a/xos/synchronizer/model_policies/model_policy_voltserviceinstance.py
+++ b/xos/synchronizer/model_policies/model_policy_voltserviceinstance.py
@@ -39,34 +39,17 @@
         pass
 
     def create_eastbound_instance(self, si):
-
-        chain = si.subscribed_links.all()
-
-        # Already has a chain
-        if len(chain) > 0 and not si.is_new:
-            self.logger.debug("MODEL_POLICY: VOLTServiceInstance %s is already part of a chain" % si.id)
-            return
-
-        # if it does not have a chain,
-        # Find links to the next element in the service chain
-        # and create one
-
         links = si.owner.subscribed_dependencies.all()
-
         for link in links:
             # SEBA-216 prevent any attempt to create an ONOSServiceInstance
             if "onos" in link.provider_service.name.lower():
                 continue
 
-            si_class = link.provider_service.get_service_instance_class_name()
-            self.logger.info("MODEL_POLICY: VOLTServiceInstance %s creating %s" % (si, si_class))
+            provider_service = link.provider_service.leaf_model
 
-            eastbound_si_class = model_accessor.get_model_class(si_class)
-            eastbound_si = eastbound_si_class()
-            eastbound_si.owner_id = link.provider_service_id
-            eastbound_si.save()
-            link = ServiceInstanceLink(provider_service_instance=eastbound_si, subscriber_service_instance=si)
-            link.save()
+            valid_provider_service_instance = provider_service.validate_links(si)
+            if not valid_provider_service_instance:
+                provider_service.acquire_service_instance(si)
 
     def associate_onu_device(self, si):
 
diff --git a/xos/synchronizer/model_policies/test_model_policy_voltserviceinstance.py b/xos/synchronizer/model_policies/test_model_policy_voltserviceinstance.py
index e6fb171..f129de5 100644
--- a/xos/synchronizer/model_policies/test_model_policy_voltserviceinstance.py
+++ b/xos/synchronizer/model_policies/test_model_policy_voltserviceinstance.py
@@ -88,9 +88,14 @@
         with patch.object(ServiceInstanceLink, "save", autospec=True) as save_link, \
             patch.object(VSGServiceInstance, "save", autospec=True) as save_vsg:
 
+            subscriber_si = Mock()
+
             link = Mock()
             link.provider_service.get_service_instance_class_name.return_value = "VSGServiceInstance"
             link.provider_service.name = "FabricCrossconnect"
+            link.provider_service.validate_links = Mock(return_value=[])
+            link.provider_service.acquire_service_instance = Mock(return_value=subscriber_si)
+            link.provider_service.leaf_model = link.provider_service
 
             si = Mock()
             si.subscribed_links.all.return_value = []
@@ -98,17 +103,30 @@
 
             self.policy.create_eastbound_instance(si)
 
-            # Should have created a vsg
+            link.provider_service.validate_links.assert_called_with(si)
+            link.provider_service.acquire_service_instance.assert_called_with(si)
 
-            self.assertEqual(save_vsg.call_count, 1)
-            vsg = save_vsg.call_args[0][0]
+    def test_create_vsg_already_exists(self):
+        with patch.object(ServiceInstanceLink, "save", autospec=True) as save_link, \
+            patch.object(VSGServiceInstance, "save", autospec=True) as save_vsg:
 
-            # Should have created a link from OLT to vsg
+            subscriber_si = Mock()
 
-            self.assertEqual(save_link.call_count, 1)
-            link = save_link.call_args[0][0]
-            self.assertEqual(link.provider_service_instance, vsg)
-            self.assertEqual(link.subscriber_service_instance, si)
+            link = Mock()
+            link.provider_service.get_service_instance_class_name.return_value = "VSGServiceInstance"
+            link.provider_service.name = "FabricCrossconnect"
+            link.provider_service.validate_links = Mock(return_value=subscriber_si)
+            link.provider_service.acquire_service_instance = Mock()
+            link.provider_service.leaf_model = link.provider_service
+
+            si = Mock()
+            si.subscribed_links.all.return_value = []
+            si.owner.subscribed_dependencies.all.return_value = [link]
+
+            self.policy.create_eastbound_instance(si)
+
+            link.provider_service.validate_links.assert_called_with(si)
+            link.provider_service.acquire_service_instance.assert_not_called()
 
     def test_associate_onu(self):
         with patch.object(ServiceInstance.objects, "get") as get_si, \