fix races in vOLT and vCPE creating multiple slivers per object
diff --git a/xos/cord/models.py b/xos/cord/models.py
index 2f412c4..5a81109 100644
--- a/xos/cord/models.py
+++ b/xos/cord/models.py
@@ -2,7 +2,7 @@
 from core.models import Service, PlCoreBase, Slice, Sliver, Tenant, Node, Image, User, Flavor, Subscriber
 from core.models.plcorebase import StrippedCharField
 import os
-from django.db import models
+from django.db import models, transaction
 from django.forms.models import model_to_dict
 from django.db.models import Q
 from operator import itemgetter, attrgetter, methodcaller
@@ -381,14 +381,26 @@
                 raise XOSProgrammingError("VOLTTenant's self.creator was not set")
 
         super(VOLTTenant, self).save(*args, **kwargs)
-        self.manage_vcpe()
-        self.manage_subscriber()
-        self.cleanup_orphans()
+        model_policy_volt(self.pk)
+        #self.manage_vcpe()
+        #self.manage_subscriber()
+        #self.cleanup_orphans()
 
     def delete(self, *args, **kwargs):
         self.cleanup_vcpe()
         super(VOLTTenant, self).delete(*args, **kwargs)
 
+def model_policy_volt(pk):
+    # TODO: this should be made in to a real model_policy
+    with transaction.atomic():
+        volt = VOLTTenant.objects.select_for_update().filter(pk=pk)
+        if not volt:
+            return
+        volt = volt[0]
+        volt.manage_vcpe()
+        volt.manage_subscriber()
+        volt.cleanup_orphans()
+
 # -------------------------------------------
 # VCPE
 # -------------------------------------------
@@ -441,7 +453,7 @@
 
     @property
     def image(self):
-        LOOK_FOR_IMAGES=["ubuntu-vcpe3",        # ONOS demo machine -- preferred vcpe image
+        LOOK_FOR_IMAGES=["ubuntu-vcpe4",        # ONOS demo machine -- preferred vcpe image
                          "Ubuntu 14.04 LTS",    # portal
                          "Ubuntu-14.04-LTS",    # ONOS demo machine
                         ]
@@ -717,16 +729,29 @@
                 raise XOSProgrammingError("VCPETenant's self.creator was not set")
 
         super(VCPETenant, self).save(*args, **kwargs)
-        self.manage_sliver()
-        self.manage_vbng()
-        self.manage_bbs_account()
-        self.cleanup_orphans()
+        model_policy_vcpe(self.pk)
+        #self.manage_sliver()
+        #self.manage_vbng()
+        #self.manage_bbs_account()
+        #self.cleanup_orphans()
 
     def delete(self, *args, **kwargs):
         self.cleanup_vbng()
         self.cleanup_sliver()
         super(VCPETenant, self).delete(*args, **kwargs)
 
+def model_policy_vcpe(pk):
+    # TODO: this should be made in to a real model_policy
+    with transaction.atomic():
+        vcpe = VCPETenant.objects.select_for_update().filter(pk=pk)
+        if not vcpe:
+            return
+        vcpe = vcpe[0]
+        vcpe.manage_sliver()
+        vcpe.manage_vbng()
+        vcpe.manage_bbs_account()
+        vcpe.cleanup_orphans()
+
 #----------------------------------------------------------------------------
 # vBNG
 #----------------------------------------------------------------------------