[CORD-2760] Cleanup R-CORD chain
Change-Id: I7d2246c61416ea97f657cb5b018e0efd7f8241d3
diff --git a/xos/synchronizer/model_policies/model_policy_volttenant.py b/xos/synchronizer/model_policies/model_policy_volttenant.py
index 32bc036..a7da0bd 100644
--- a/xos/synchronizer/model_policies/model_policy_volttenant.py
+++ b/xos/synchronizer/model_policies/model_policy_volttenant.py
@@ -24,8 +24,15 @@
return self.handle_update(tenant)
def handle_update(self, tenant):
+
+ if (tenant.link_deleted_count > 0) and (not tenant.provided_links.exists()):
+ # If this instance has no links pointing to it, delete
+ self.handle_delete(tenant)
+ if VOLTTenant.objects.filter(id=tenant.id).exists():
+ tenant.delete()
+ return
+
self.manage_vsg(tenant)
- self.manage_subscriber(tenant)
self.cleanup_orphans(tenant)
def handle_delete(self, tenant):
@@ -76,27 +83,6 @@
if cur_vsg is None:
self.create_vsg(tenant)
- def manage_subscriber(self, tenant):
- # check for existing link to a root
- links = tenant.provided_links.all()
- for link in links:
- roots = CordSubscriberRoot.objects.filter(id = link.subscriber_service_instance.id)
- if roots:
- return
-
- subs = CordSubscriberRoot.objects.filter(service_specific_id = tenant.service_specific_id)
- if subs:
- self.logger.info("MODEL_POLICY: volttenant %s using existing subscriber root" % tenant)
- sub = subs[0]
- else:
- self.logger.info("MODEL_POLICY: volttenant %s creating new subscriber root" % tenant)
- sub = CordSubscriberRoot(service_specific_id = tenant.service_specific_id,
- name = "autogenerated-for-vOLT-%s" % tenant.id)
- sub.save()
-
- link = ServiceInstanceLink(provider_service_instance = tenant, subscriber_service_instance = sub)
- link.save()
-
def cleanup_orphans(self, tenant):
# ensure vOLT only has one vCPE
cur_vsg = self.get_current_vsg(tenant)
diff --git a/xos/synchronizer/model_policies/test_model_policy_volttenant.py b/xos/synchronizer/model_policies/test_model_policy_volttenant.py
index b3edf3f..3e27dee 100644
--- a/xos/synchronizer/model_policies/test_model_policy_volttenant.py
+++ b/xos/synchronizer/model_policies/test_model_policy_volttenant.py
@@ -81,10 +81,8 @@
def test_handle_create(self):
with patch.object(VOLTTenantPolicy, "manage_vsg") as manage_vsg, \
- patch.object(VOLTTenantPolicy, "manage_subscriber") as manage_subscriber, \
patch.object(VOLTTenantPolicy, "cleanup_orphans") as cleanup_orphans:
self.policy.handle_create(self.tenant)
- manage_subscriber.assert_called_with(self.tenant)
manage_vsg.assert_called_with(self.tenant)
cleanup_orphans.assert_called_with(self.tenant)
@@ -136,63 +134,6 @@
self.assertEqual(link.provider_service_instance, vsg)
self.assertEqual(link.subscriber_service_instance, self.tenant)
- def test_manage_subscriber(self):
- with patch.object(ServiceInstanceLink, "save", autospec=True) as save_link, \
- patch.object(CordSubscriberRoot, "save", autospec=True) as save_csr:
-
- self.tenant.provided_links = MockObjectList()
-
- self.policy.manage_subscriber(self.tenant)
-
- self.assertEqual(save_csr.call_count, 1)
- csr = save_csr.call_args[0][0]
-
- self.assertEqual(save_link.call_count, 1)
- link = save_link.call_args[0][0]
- self.assertEqual(link.provider_service_instance, self.tenant)
- self.assertEqual(link.subscriber_service_instance, csr)
-
- def test_manage_subscriber_exists(self):
- with patch.object(ServiceInstanceLink, "save", autospec=True) as save_link, \
- patch.object(CordSubscriberRoot, "save", autospec=True) as save_csr, \
- patch.object(CordSubscriberRoot.objects, "get_items") as csr_items, \
- patch.object(ServiceInstanceLink.objects, "get_items") as link_items:
- self.tenant.provided_links = MockObjectList()
-
- subscriber = CordSubscriberRoot(service_specific_id=1234)
- csr_items.return_value = [subscriber]
-
- link = ServiceInstanceLink(provider_service_instance= self.tenant, subscriber_service_instance = subscriber)
- link_items.return_value = [link]
-
- self.tenant.provided_links = MockObjectList(initial=[link])
-
- self.policy.manage_subscriber(self.tenant)
-
- self.assertEqual(save_csr.call_count, 0)
- self.assertEqual(save_link.call_count, 0)
-
- def test_manage_subscriber_exists_nolink(self):
- with patch.object(ServiceInstanceLink, "save", autospec=True) as save_link, \
- patch.object(CordSubscriberRoot, "save", autospec=True) as save_csr, \
- patch.object(CordSubscriberRoot.objects, "get_items") as csr_items, \
- patch.object(ServiceInstanceLink.objects, "get_items") as link_items:
- self.tenant.provided_links = MockObjectList()
-
- subscriber = CordSubscriberRoot(service_specific_id=1234)
- csr_items.return_value = [subscriber]
-
- self.tenant.provided_links = MockObjectList()
-
- self.policy.manage_subscriber(self.tenant)
-
- self.assertEqual(save_csr.call_count, 0)
-
- self.assertEqual(save_link.call_count, 1)
- link = save_link.call_args[0][0]
- self.assertEqual(link.provider_service_instance, self.tenant)
- self.assertEqual(link.subscriber_service_instance, subscriber)
-
def test_handle_delete(self):
self.policy.handle_delete(self.tenant)
# handle delete does nothing, and should trivially succeed