blob: 29d9b86a2bf741d863382cece1b2f9ac82f0bf4d [file] [log] [blame]
Murat Parlakisik638c65f2017-05-31 11:10:24 +03001def __init__(self, *args, **kwargs):
2 self.cached_target_service = None
3 self.cached_tenancy_from_target_service = None
4 self.cached_service_monitoring_agent = None
5 super(UserServiceMonitoringPublisher, self).__init__(*args, **kwargs)
6
7def can_update(self, user):
8 #Don't allow creation of this model instances for non-admin users also
9 return True
10
11@property
12def target_service(self):
13 if getattr(self, "cached_target_service", None):
14 return self.cached_target_service
15 target_service_id = self.get_attribute("target_service_id")
16 if not target_service_id:
17 return None
18 services = Service.objects.filter(id=target_service_id)
19 if not services:
20 return None
21 target_service = services[0]
22 self.cached_target_service = target_service
23 return target_service
24
25@target_service.setter
26def target_service(self, value):
27 if value:
28 value = value.id
29 if (value != self.get_attribute("target_service_id", None)):
30 self.cached_target_service = None
31 self.set_attribute("target_service_id", value)
32
33@property
34def tenancy_from_target_service(self):
35 if getattr(self, "cached_tenancy_from_target_service", None):
36 return self.cached_tenancy_from_target_service
37 tenancy_from_target_service_id = self.get_attribute("tenancy_from_target_service_id")
38 if not tenancy_from_target_service_id:
39 return None
40 tenancy_from_target_services = ServiceDependency.objects.filter(id=tenancy_from_target_service_id)
41 if not tenancy_from_target_services:
42 return None
43 tenancy_from_target_service = tenancy_from_target_services[0]
44 self.cached_tenancy_from_target_service = tenancy_from_target_service
45 return tenancy_from_target_service
46
47@tenancy_from_target_service.setter
48def tenancy_from_target_service(self, value):
49 if value:
50 value = value.id
51 if (value != self.get_attribute("tenancy_from_target_service_id", None)):
52 self.cached_tenancy_from_target_service = None
53 self.set_attribute("tenancy_from_target_service_id", value)
54
55@property
56def service_monitoring_agent(self):
57 if getattr(self, "cached_service_monitoring_agent", None):
58 return self.cached_service_monitoring_agent
59 service_monitoring_agent_id = self.get_attribute("service_monitoring_agent")
60 if not service_monitoring_agent_id:
61 return None
62 service_monitoring_agents = ServiceDependency.objects.filter(id=service_monitoring_agent_id)
63 if not service_monitoring_agents:
64 return None
65 service_monitoring_agent = service_monitoring_agents[0]
66 self.cached_service_monitoring_agent = service_monitoring_agent
67 return service_monitoring_agent
68
69@service_monitoring_agent.setter
70def service_monitoring_agent(self, value):
71 if value:
72 value = value.id
73 if (value != self.get_attribute("service_monitoring_agent", None)):
74 self.cached_service_monitoring_agent = None
75 self.set_attribute("service_monitoring_agent", value)
76
77def save(self, *args, **kwargs):
78 if not self.creator:
79 if not getattr(self, "caller", None):
80 # caller must be set when creating a monitoring channel since it creates a slice
81 raise XOSProgrammingError("UserServiceMonitoringPublisher's self.caller was not set")
82 self.creator = self.caller
83 if not self.creator:
84 raise XOSProgrammingError("UserServiceMonitoringPublisher's self.creator was not set")
85
86 tenancy_from_target_service = None
87 if self.pk is None:
88 if self.target_service is None:
89 raise XOSValidationError("Target service is not specified in UserServiceMonitoringPublisher")
90 #Allow only one monitoring publisher for a given service
91 publisher_count = sum ( [1 for publisher in UserServiceMonitoringPublisher.get_tenant_objects().all() if (publisher.target_service.id == self.target_service.id)] )
92 if publisher_count > 0:
93 raise XOSValidationError("Already %s publishers exist for service. Can only create max 1 UserServiceMonitoringPublisher instances" % str(publisher_count))
94 #Create Service composition object here
95 tenancy_from_target_service = ServiceDependency(provider_service = self.provider_service,
96 subscriber_service = self.target_service)
97 tenancy_from_target_service.save()
98 self.tenancy_from_target_service = tenancy_from_target_service
99
100 target_uri = CeilometerService.objects.get(id=self.provider_service.id).ceilometer_rabbit_uri
101 if target_uri is None:
102 raise XOSProgrammingError("Unable to get the Target_URI for Monitoring Agent")
103 service_monitoring_agent = ServiceMonitoringAgentInfo(service = self.target_service,
104 target_uri = target_uri)
105 service_monitoring_agent.save()
106 self.service_monitoring_agent = service_monitoring_agent
107
108 try:
109 super(UserServiceMonitoringPublisher, self).save(*args, **kwargs)
110 except:
111 if tenancy_from_target_service:
112 tenancy_from_target_service.delete()
113 if service_monitoring_agent:
114 service_monitoring_agent.delete()
115 raise