[ACORD-18] CORD 3.0 integration for monitoring service
Adding the new files
-Updating models 
-Fixing synchronizer

Change-Id: I148e06d421a42acdeb8366a7816d0589f8a39e54
diff --git a/xos/attic/userservicemonitoringpublisher_model.py b/xos/attic/userservicemonitoringpublisher_model.py
new file mode 100644
index 0000000..29d9b86
--- /dev/null
+++ b/xos/attic/userservicemonitoringpublisher_model.py
@@ -0,0 +1,115 @@
+def __init__(self, *args, **kwargs):
+    self.cached_target_service = None
+    self.cached_tenancy_from_target_service = None
+    self.cached_service_monitoring_agent = None
+    super(UserServiceMonitoringPublisher, self).__init__(*args, **kwargs)
+
+def can_update(self, user):
+    #Don't allow creation of this model instances for non-admin users also
+    return True
+
+@property
+def target_service(self):
+    if getattr(self, "cached_target_service", None):
+        return self.cached_target_service
+    target_service_id = self.get_attribute("target_service_id")
+    if not target_service_id:
+        return None
+    services = Service.objects.filter(id=target_service_id)
+    if not services:
+        return None
+    target_service = services[0]
+    self.cached_target_service = target_service
+    return target_service
+
+@target_service.setter
+def target_service(self, value):
+    if value:
+        value = value.id
+    if (value != self.get_attribute("target_service_id", None)):
+        self.cached_target_service = None
+    self.set_attribute("target_service_id", value)
+
+@property
+def tenancy_from_target_service(self):
+    if getattr(self, "cached_tenancy_from_target_service", None):
+        return self.cached_tenancy_from_target_service
+    tenancy_from_target_service_id = self.get_attribute("tenancy_from_target_service_id")
+    if not tenancy_from_target_service_id:
+        return None
+    tenancy_from_target_services = ServiceDependency.objects.filter(id=tenancy_from_target_service_id)
+    if not tenancy_from_target_services:
+        return None
+    tenancy_from_target_service = tenancy_from_target_services[0]
+    self.cached_tenancy_from_target_service = tenancy_from_target_service
+    return tenancy_from_target_service
+
+@tenancy_from_target_service.setter
+def tenancy_from_target_service(self, value):
+    if value:
+        value = value.id
+    if (value != self.get_attribute("tenancy_from_target_service_id", None)):
+        self.cached_tenancy_from_target_service = None
+    self.set_attribute("tenancy_from_target_service_id", value)
+
+@property
+def service_monitoring_agent(self):
+    if getattr(self, "cached_service_monitoring_agent", None):
+        return self.cached_service_monitoring_agent
+    service_monitoring_agent_id = self.get_attribute("service_monitoring_agent")
+    if not service_monitoring_agent_id:
+        return None
+    service_monitoring_agents = ServiceDependency.objects.filter(id=service_monitoring_agent_id)
+    if not service_monitoring_agents:
+        return None
+    service_monitoring_agent = service_monitoring_agents[0]
+    self.cached_service_monitoring_agent = service_monitoring_agent
+    return service_monitoring_agent
+
+@service_monitoring_agent.setter
+def service_monitoring_agent(self, value):
+    if value:
+        value = value.id
+    if (value != self.get_attribute("service_monitoring_agent", None)):
+        self.cached_service_monitoring_agent = None
+    self.set_attribute("service_monitoring_agent", value)
+
+def save(self, *args, **kwargs):
+    if not self.creator:
+        if not getattr(self, "caller", None):
+            # caller must be set when creating a monitoring channel since it creates a slice
+            raise XOSProgrammingError("UserServiceMonitoringPublisher's self.caller was not set")
+        self.creator = self.caller
+        if not self.creator:
+            raise XOSProgrammingError("UserServiceMonitoringPublisher's self.creator was not set")
+
+    tenancy_from_target_service = None
+    if self.pk is None:
+        if self.target_service is None:
+            raise XOSValidationError("Target service is not specified in UserServiceMonitoringPublisher")
+        #Allow only one monitoring publisher for a given service 
+        publisher_count = sum ( [1 for publisher in UserServiceMonitoringPublisher.get_tenant_objects().all() if (publisher.target_service.id == self.target_service.id)] )
+        if publisher_count > 0:
+            raise XOSValidationError("Already %s publishers exist for service. Can only create max 1 UserServiceMonitoringPublisher instances" % str(publisher_count))
+        #Create Service composition object here
+        tenancy_from_target_service = ServiceDependency(provider_service = self.provider_service,
+                                               subscriber_service = self.target_service)
+        tenancy_from_target_service.save()
+        self.tenancy_from_target_service = tenancy_from_target_service
+
+        target_uri = CeilometerService.objects.get(id=self.provider_service.id).ceilometer_rabbit_uri
+        if target_uri is None:
+            raise XOSProgrammingError("Unable to get the Target_URI for Monitoring Agent")
+        service_monitoring_agent = ServiceMonitoringAgentInfo(service = self.target_service,
+                                                           target_uri = target_uri)
+        service_monitoring_agent.save()
+        self.service_monitoring_agent = service_monitoring_agent
+    
+    try:
+        super(UserServiceMonitoringPublisher, self).save(*args, **kwargs)
+    except:
+        if tenancy_from_target_service:
+            tenancy_from_target_service.delete()
+        if service_monitoring_agent:
+            service_monitoring_agent.delete()
+        raise
\ No newline at end of file