ActiveTest Service Creation.

Onboarding is done by running 'make activetest'. fusion.img, qt600.img, vta.img, and vpma.img
should be in the corresponding service_profile's image/ folder in order for images to be
uploaded in glance.

The measurement agents can be created through the different agents tenants. For example, to
create a VPMA tenant, run 'make vpma 1' where '1' can be any numberical identifier for the
tenant to be created.

Measurement agents will automatically register with the fusion controller through the use of
the synchronizer. Furthermore, tests can be orchestrated through XOS by modifying the models
for the vpma agents.

Change-Id: I69bab4b5f771c87126781799217bb36fda478fd3
diff --git a/xos/tosca/resources/activetest.py b/xos/tosca/resources/activetest.py
new file mode 100644
index 0000000..9b734b5
--- /dev/null
+++ b/xos/tosca/resources/activetest.py
@@ -0,0 +1,105 @@
+from core.models import Service,User,CoarseTenant
+from services.activetest.models import ActiveTestService, Qt600Service, VpmaService, VtaService
+
+from xosresource import XOSResource
+
+class XOSActiveTestService(XOSResource):
+    provides = "tosca.nodes.ActiveTest"
+    xos_model = ActiveTestService
+    copyin_props = ["view_url", "icon_url", "enabled", "published", "public_key", "private_key_fn", "versionNumber"]
+
+    def postprocess(self, obj):
+        for provider_service_name in self.get_requirements("tosca.relationships.TenantOfService"):
+            provider_service = self.get_xos_object(ActiveTestService, name=provider_service_name)
+
+            existing_tenancy = CoarseTenant.get_tenant_objects().filter(provider_service = provider_service, subscriber_service = obj)
+            if existing_tenancy:
+                self.info("Tenancy relationship from %s to %s already exists" % (str(obj), str(provider_service)))
+            else:
+                tenancy = CoarseTenant(provider_service = provider_service,
+                                       subscriber_service = obj)
+                tenancy.save()
+
+                self.info("Created Tenancy relationship  from %s to %s" % (str(obj), str(provider_service)))
+
+    def can_delete(self, obj):
+        if obj.slices.exists():
+            self.info("Service %s has active slices; skipping delete" % obj.name)
+            return False
+        return super(XOSActiveTestService, self).can_delete(obj)
+
+class XOSQt600Service(XOSResource):
+    provides = "tosca.nodes.Qt600Service"
+    xos_model = Qt600Service
+    copyin_props = ["view_url", "icon_url", "enabled", "published", "public_key", "private_key_fn", "versionNumber"]
+
+    def postprocess(self, obj):
+        for provider_service_name in self.get_requirements("tosca.relationships.TenantOfService"):
+            provider_service = self.get_xos_object(Qt600Service, name=provider_service_name)
+
+            existing_tenancy = CoarseTenant.get_tenant_objects().filter(provider_service = provider_service, subscriber_service = obj)
+            if existing_tenancy:
+                self.info("Tenancy relationship from %s to %s already exists" % (str(obj), str(provider_service)))
+            else:
+                tenancy = CoarseTenant(provider_service = provider_service,
+                                       subscriber_service = obj)
+                tenancy.save()
+
+                self.info("Created Tenancy relationship  from %s to %s" % (str(obj), str(provider_service)))
+
+    def can_delete(self, obj):
+        if obj.slices.exists():
+            self.info("Service %s has active slices; skipping delete" % obj.name)
+            return False
+        return super(XOSQt600Service, self).can_delete(obj)
+
+class XOSVpmaService(XOSResource):
+    provides = "tosca.nodes.VpmaService"
+    xos_model = VpmaService
+    copyin_props = ["view_url", "icon_url", "enabled", "published", "public_key", "private_key_fn", "versionNumber"]
+
+    def postprocess(self, obj):
+        for provider_service_name in self.get_requirements("tosca.relationships.TenantOfService"):
+            provider_service = self.get_xos_object(VpmaService, name=provider_service_name)
+
+            existing_tenancy = CoarseTenant.get_tenant_objects().filter(provider_service = provider_service, subscriber_service = obj)
+            if existing_tenancy:
+                self.info("Tenancy relationship from %s to %s already exists" % (str(obj), str(provider_service)))
+            else:
+                tenancy = CoarseTenant(provider_service = provider_service,
+                                       subscriber_service = obj)
+                tenancy.save()
+
+                self.info("Created Tenancy relationship  from %s to %s" % (str(obj), str(provider_service)))
+
+    def can_delete(self, obj):
+        if obj.slices.exists():
+            self.info("Service %s has active slices; skipping delete" % obj.name)
+            return False
+        return super(XOSVpmaService, self).can_delete(obj)
+
+class XOSVtaService(XOSResource):
+    provides = "tosca.nodes.VtaService"
+    xos_model = VtaService
+    copyin_props = ["view_url", "icon_url", "enabled", "published", "public_key", "private_key_fn", "versionNumber"]
+
+    def postprocess(self, obj):
+        for provider_service_name in self.get_requirements("tosca.relationships.TenantOfService"):
+            provider_service = self.get_xos_object(VtaService, name=provider_service_name)
+
+            existing_tenancy = CoarseTenant.get_tenant_objects().filter(provider_service = provider_service, subscriber_service = obj)
+            if existing_tenancy:
+                self.info("Tenancy relationship from %s to %s already exists" % (str(obj), str(provider_service)))
+            else:
+                tenancy = CoarseTenant(provider_service = provider_service,
+                                       subscriber_service = obj)
+                tenancy.save()
+
+                self.info("Created Tenancy relationship  from %s to %s" % (str(obj), str(provider_service)))
+
+    def can_delete(self, obj):
+        if obj.slices.exists():
+            self.info("Service %s has active slices; skipping delete" % obj.name)
+            return False
+        return super(XOSVtaService, self).can_delete(obj)
+
diff --git a/xos/tosca/resources/activetesttenant.py b/xos/tosca/resources/activetesttenant.py
new file mode 100644
index 0000000..7b1a09d
--- /dev/null
+++ b/xos/tosca/resources/activetesttenant.py
@@ -0,0 +1,29 @@
+from core.models import Tenant, Service
+from services.activetest.models import ActiveTestTenant, ACTIVETEST_KIND as ACTIVETESTTENANT_KIND
+
+from xosresource import XOSResource
+
+class XOSActiveTestTenant(XOSResource):
+    provides = "tosca.nodes.ActiveTestTenant"
+    xos_model = ActiveTestTenant
+    name_field = "service_specific_id"
+    copyin_props = ("tenant_message",)
+
+    def get_xos_args(self, throw_exception=True):
+        args = super(XOSActiveTestTenant, self).get_xos_args()
+
+        # ActiveTestTenant must always have a provider_service
+        provider_name = self.get_requirement("tosca.relationships.TenantOfService", throw_exception=True)
+        if provider_name:
+            args["provider_service"] = self.get_xos_object(Service, throw_exception=True, name=provider_name)
+
+        return args
+
+    def get_existing_objs(self):
+        args = self.get_xos_args(throw_exception=False)
+        return ActiveTestTenant.get_tenant_objects().filter(provider_service=args["provider_service"], service_specific_id=args["service_specific_id"])
+        return []
+
+    def can_delete(self, obj):
+        return super(XOSActiveTestTenant, self).can_delete(obj)
+
diff --git a/xos/tosca/resources/qt600tenant.py b/xos/tosca/resources/qt600tenant.py
new file mode 100644
index 0000000..e223428
--- /dev/null
+++ b/xos/tosca/resources/qt600tenant.py
@@ -0,0 +1,28 @@
+from core.models import Tenant, Service
+from services.activetest.models import Qt600Tenant
+
+from xosresource import XOSResource
+
+class XOSQt600Tenant(XOSResource):
+    name_field = "service_specific_id"
+    provides = "tosca.nodes.Qt600Tenant"
+    copyin_props = ("is_reflector","is_initiator","reflector",)
+    xos_model = Qt600Tenant
+
+    def get_xos_args(self, throw_exception=True):
+        args = super(XOSQt600Tenant, self).get_xos_args()
+
+        # Qt600Tenant must always have a provider_service
+        provider_name = self.get_requirement("tosca.relationships.TenantOfService", throw_exception=True)
+        if provider_name:
+            args["provider_service"] = self.get_xos_object(Service, throw_exception=True, name=provider_name)
+
+        return args
+
+    def can_delete(self, obj):
+        return super(XOSQt600Tenant, self).can_delete(obj)
+
+    def get_existing_objs(self):
+        args = self.get_xos_args(throw_exception=False)
+        return Qt600Tenant.get_tenant_objects().filter(provider_service=args["provider_service"], service_specific_id=args["service_specific_id"])
+        return []
diff --git a/xos/tosca/resources/vpmatenant.py b/xos/tosca/resources/vpmatenant.py
new file mode 100644
index 0000000..3e45e26
--- /dev/null
+++ b/xos/tosca/resources/vpmatenant.py
@@ -0,0 +1,28 @@
+from core.models import Tenant, Service
+from services.activetest.models import VpmaTenant
+
+from xosresource import XOSResource
+
+class XOSVpmaTenant(XOSResource):
+    name_field = "service_specific_id"
+    provides = "tosca.nodes.VpmaTenant"
+    copyin_props = ("is_reflector","is_initiator","reflector",)
+    xos_model = VpmaTenant
+
+    def get_xos_args(self, throw_exception=True):
+        args = super(XOSVpmaTenant, self).get_xos_args()
+
+        # VpmaTenant must always have a provider_service
+        provider_name = self.get_requirement("tosca.relationships.TenantOfService", throw_exception=True)
+        if provider_name:
+            args["provider_service"] = self.get_xos_object(Service, throw_exception=True, name=provider_name)
+
+        return args
+
+    def can_delete(self, obj):
+        return super(XOSVpmaTenant, self).can_delete(obj)
+
+    def get_existing_objs(self):
+        args = self.get_xos_args(throw_exception=False)
+        return VpmaTenant.get_tenant_objects().filter(provider_service=args["provider_service"], service_specific_id=args["service_specific_id"])
+        return []
diff --git a/xos/tosca/resources/vtatenant.py b/xos/tosca/resources/vtatenant.py
new file mode 100644
index 0000000..e2ecf25
--- /dev/null
+++ b/xos/tosca/resources/vtatenant.py
@@ -0,0 +1,27 @@
+from core.models import Tenant, Service
+from services.activetest.models import VtaTenant
+
+from xosresource import XOSResource
+
+class XOSVtaTenant(XOSResource):
+    name_field = "service_specific_id"
+    provides = "tosca.nodes.VtaTenant"
+    xos_model = VtaTenant
+
+    def get_xos_args(self, throw_exception=True):
+        args = super(XOSVtaTenant, self).get_xos_args()
+
+        # VtaTenant must always have a provider_service
+        provider_name = self.get_requirement("tosca.relationships.TenantOfService", throw_exception=True)
+        if provider_name:
+            args["provider_service"] = self.get_xos_object(Service, throw_exception=True, name=provider_name)
+
+        return args
+
+    def can_delete(self, obj):
+        return super(XOSVtaTenant, self).can_delete(obj)
+
+    def get_existing_objs(self):
+        args = self.get_xos_args(throw_exception=False)
+        return VtaTenant.get_tenant_objects().filter(provider_service=args["provider_service"], service_specific_id=args["service_specific_id"])
+        return []