Initial commit of PassiveTest

Change-Id: Idcd9a0c72df5eae6b4eedc544e473ebc9763ccdb
(cherry picked from commit 9062322cffd03d2c56b66d040ad13bc562bb6544)
diff --git a/xos/models.py b/xos/models.py
new file mode 100644
index 0000000..53b0d0e
--- /dev/null
+++ b/xos/models.py
@@ -0,0 +1,67 @@
+# models.py -  ExampleService Models
+
+from core.models import Service, TenantWithContainer
+from django.db import models, transaction
+
+PASSIVETEST_KIND = 'PassiveTest'
+PASSIVETEST_SERVICE_NAME = 'passivetest'
+PASSIVETEST_SERVICE_NAME_VERBOSE = 'PASSIVETEST Service'
+PASSIVETEST_SERVICE_NAME_VERBOSE_PLURAL = 'PASSIVETEST Services'
+PASSIVETEST_TENANT_NAME_VERBOSE = 'PASSIVETEST Tenant'
+PASSIVETEST_TENANT_NAME_VERBOSE_PLURAL = 'PASSIVETEST Tenants'
+
+class PassiveTestService(Service):
+
+    KIND = PASSIVETEST_KIND
+
+    class Meta:
+        app_label = PASSIVETEST_SERVICE_NAME
+        verbose_name = PASSIVETEST_SERVICE_NAME_VERBOSE
+
+    tap_ports = models.CharField(max_length=254, help_text="Neutron Port ids of the ports we want to tap (comma delimited)")
+    reset_viv = models.BooleanField(default=False, help_text="Reset the VIV's input and output configurations!")
+    
+
+class PassiveTestTenant(TenantWithContainer):
+
+    KIND = PASSIVETEST_KIND
+
+    class Meta:
+        verbose_name = PASSIVETEST_TENANT_NAME_VERBOSE
+
+    def __init__(self, *args, **kwargs):
+        passivetestservice = PassiveTestService.get_service_objects().all()
+        if passivetestservice:
+            self._meta.get_field('provider_service').default = passivetestservice[0].id
+        super(PassiveTestTenant, self).__init__(*args, **kwargs)
+
+    def save(self, *args, **kwargs):
+        super(PassiveTestTenant, self).save(*args, **kwargs)
+        model_policy_passivetesttenant(self.pk)
+
+    def delete(self, *args, **kwargs):
+        self.cleanup_container()
+        super(PassiveTestTenant, self).delete(*args, **kwargs)
+
+    @property
+    def public_ip(self):
+        for port in self.instance.ports.all():
+            if "public" in port.network.name.lower():
+                return port.ip
+        return None
+
+    @property
+    def synchronizer_ip(self):
+        for port in self.instance.ports.all():
+            if "management" in port.network.name.lower():
+                return port.ip
+        return None
+
+def model_policy_passivetesttenant(pk):
+    with transaction.atomic():
+        tenant = PassiveTestTenant.objects.select_for_update().filter(pk=pk)
+        if not tenant:
+            return
+        tenant = tenant[0]
+        tenant.manage_container()
+