]> granicus.if.org Git - icinga2/blob - lib/livestatus/servicegroupstable.cpp
Merge pull request #7591 from Icinga/feature/docs-api-joins
[icinga2] / lib / livestatus / servicegroupstable.cpp
1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
2
3 #include "livestatus/servicegroupstable.hpp"
4 #include "icinga/servicegroup.hpp"
5 #include "base/configtype.hpp"
6
7 using namespace icinga;
8
9 ServiceGroupsTable::ServiceGroupsTable()
10 {
11         AddColumns(this);
12 }
13
14 void ServiceGroupsTable::AddColumns(Table *table, const String& prefix,
15         const Column::ObjectAccessor& objectAccessor)
16 {
17         table->AddColumn(prefix + "name", Column(&ServiceGroupsTable::NameAccessor, objectAccessor));
18         table->AddColumn(prefix + "alias", Column(&ServiceGroupsTable::AliasAccessor, objectAccessor));
19         table->AddColumn(prefix + "notes", Column(&ServiceGroupsTable::NotesAccessor, objectAccessor));
20         table->AddColumn(prefix + "notes_url", Column(&ServiceGroupsTable::NotesUrlAccessor, objectAccessor));
21         table->AddColumn(prefix + "action_url", Column(&ServiceGroupsTable::ActionUrlAccessor, objectAccessor));
22         table->AddColumn(prefix + "members", Column(&ServiceGroupsTable::MembersAccessor, objectAccessor));
23         table->AddColumn(prefix + "members_with_state", Column(&ServiceGroupsTable::MembersWithStateAccessor, objectAccessor));
24         table->AddColumn(prefix + "worst_service_state", Column(&ServiceGroupsTable::WorstServiceStateAccessor, objectAccessor));
25         table->AddColumn(prefix + "num_services", Column(&ServiceGroupsTable::NumServicesAccessor, objectAccessor));
26         table->AddColumn(prefix + "num_services_ok", Column(&ServiceGroupsTable::NumServicesOkAccessor, objectAccessor));
27         table->AddColumn(prefix + "num_services_warn", Column(&ServiceGroupsTable::NumServicesWarnAccessor, objectAccessor));
28         table->AddColumn(prefix + "num_services_crit", Column(&ServiceGroupsTable::NumServicesCritAccessor, objectAccessor));
29         table->AddColumn(prefix + "num_services_unknown", Column(&ServiceGroupsTable::NumServicesUnknownAccessor, objectAccessor));
30         table->AddColumn(prefix + "num_services_pending", Column(&ServiceGroupsTable::NumServicesPendingAccessor, objectAccessor));
31         table->AddColumn(prefix + "num_services_hard_ok", Column(&ServiceGroupsTable::NumServicesHardOkAccessor, objectAccessor));
32         table->AddColumn(prefix + "num_services_hard_warn", Column(&ServiceGroupsTable::NumServicesHardWarnAccessor, objectAccessor));
33         table->AddColumn(prefix + "num_services_hard_crit", Column(&ServiceGroupsTable::NumServicesHardCritAccessor, objectAccessor));
34         table->AddColumn(prefix + "num_services_hard_unknown", Column(&ServiceGroupsTable::NumServicesHardUnknownAccessor, objectAccessor));
35 }
36
37 String ServiceGroupsTable::GetName() const
38 {
39         return "servicegroups";
40 }
41
42 String ServiceGroupsTable::GetPrefix() const
43 {
44         return "servicegroup";
45 }
46
47 void ServiceGroupsTable::FetchRows(const AddRowFunction& addRowFn)
48 {
49         for (const ServiceGroup::Ptr& sg : ConfigType::GetObjectsByType<ServiceGroup>()) {
50                 if (!addRowFn(sg, LivestatusGroupByNone, Empty))
51                         return;
52         }
53 }
54
55 Value ServiceGroupsTable::NameAccessor(const Value& row)
56 {
57         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
58
59         if (!sg)
60                 return Empty;
61
62         return sg->GetName();
63 }
64
65 Value ServiceGroupsTable::AliasAccessor(const Value& row)
66 {
67         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
68
69         if (!sg)
70                 return Empty;
71
72         return sg->GetDisplayName();
73 }
74
75 Value ServiceGroupsTable::NotesAccessor(const Value& row)
76 {
77         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
78
79         if (!sg)
80                 return Empty;
81
82         return sg->GetNotes();
83 }
84
85 Value ServiceGroupsTable::NotesUrlAccessor(const Value& row)
86 {
87         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
88
89         if (!sg)
90                 return Empty;
91
92         return sg->GetNotesUrl();
93 }
94
95 Value ServiceGroupsTable::ActionUrlAccessor(const Value& row)
96 {
97         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
98
99         if (!sg)
100                 return Empty;
101
102         return sg->GetActionUrl();
103 }
104
105 Value ServiceGroupsTable::MembersAccessor(const Value& row)
106 {
107         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
108
109         if (!sg)
110                 return Empty;
111
112         ArrayData result;
113
114         for (const Service::Ptr& service : sg->GetMembers()) {
115                 result.push_back(new Array({
116                         service->GetHost()->GetName(),
117                         service->GetShortName()
118                 }));
119         }
120
121         return new Array(std::move(result));
122 }
123
124 Value ServiceGroupsTable::MembersWithStateAccessor(const Value& row)
125 {
126         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
127
128         if (!sg)
129                 return Empty;
130
131         ArrayData result;
132
133         for (const Service::Ptr& service : sg->GetMembers()) {
134                 result.push_back(new Array({
135                         service->GetHost()->GetName(),
136                         service->GetShortName(),
137                         service->GetHost()->GetState(),
138                         service->GetState()
139                 }));
140         }
141
142         return new Array(std::move(result));
143 }
144
145 Value ServiceGroupsTable::WorstServiceStateAccessor(const Value& row)
146 {
147         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
148
149         if (!sg)
150                 return Empty;
151
152         Value worst_service = ServiceOK;
153
154         for (const Service::Ptr& service : sg->GetMembers()) {
155                 if (service->GetState() > worst_service)
156                         worst_service = service->GetState();
157         }
158
159         return worst_service;
160 }
161
162 Value ServiceGroupsTable::NumServicesAccessor(const Value& row)
163 {
164         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
165
166         if (!sg)
167                 return Empty;
168
169         return sg->GetMembers().size();
170 }
171
172 Value ServiceGroupsTable::NumServicesOkAccessor(const Value& row)
173 {
174         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
175
176         if (!sg)
177                 return Empty;
178
179         int num_services = 0;
180
181         for (const Service::Ptr& service : sg->GetMembers()) {
182                 if (service->GetState() == ServiceOK)
183                         num_services++;
184         }
185
186         return num_services;
187 }
188
189 Value ServiceGroupsTable::NumServicesWarnAccessor(const Value& row)
190 {
191         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
192
193         if (!sg)
194                 return Empty;
195
196         int num_services = 0;
197
198         for (const Service::Ptr& service : sg->GetMembers()) {
199                 if (service->GetState() == ServiceWarning)
200                         num_services++;
201         }
202
203         return num_services;
204 }
205
206 Value ServiceGroupsTable::NumServicesCritAccessor(const Value& row)
207 {
208         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
209
210         if (!sg)
211                 return Empty;
212
213         int num_services = 0;
214
215         for (const Service::Ptr& service : sg->GetMembers()) {
216                 if (service->GetState() == ServiceCritical)
217                         num_services++;
218         }
219
220         return num_services;
221 }
222
223 Value ServiceGroupsTable::NumServicesUnknownAccessor(const Value& row)
224 {
225         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
226
227         if (!sg)
228                 return Empty;
229
230         int num_services = 0;
231
232         for (const Service::Ptr& service : sg->GetMembers()) {
233                 if (service->GetState() == ServiceUnknown)
234                         num_services++;
235         }
236
237         return num_services;
238 }
239
240 Value ServiceGroupsTable::NumServicesPendingAccessor(const Value& row)
241 {
242         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
243
244         if (!sg)
245                 return Empty;
246
247         int num_services = 0;
248
249         for (const Service::Ptr& service : sg->GetMembers()) {
250                 if (!service->GetLastCheckResult())
251                         num_services++;
252         }
253
254         return num_services;
255 }
256
257 Value ServiceGroupsTable::NumServicesHardOkAccessor(const Value& row)
258 {
259         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
260
261         if (!sg)
262                 return Empty;
263
264         int num_services = 0;
265
266         for (const Service::Ptr& service : sg->GetMembers()) {
267                 if (service->GetStateType() == StateTypeHard && service->GetState() == ServiceOK)
268                         num_services++;
269         }
270
271         return num_services;
272 }
273
274 Value ServiceGroupsTable::NumServicesHardWarnAccessor(const Value& row)
275 {
276         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
277
278         if (!sg)
279                 return Empty;
280
281         int num_services = 0;
282
283         for (const Service::Ptr& service : sg->GetMembers()) {
284                 if (service->GetStateType() == StateTypeHard && service->GetState() == ServiceWarning)
285                         num_services++;
286         }
287
288         return num_services;
289 }
290
291 Value ServiceGroupsTable::NumServicesHardCritAccessor(const Value& row)
292 {
293         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
294
295         if (!sg)
296                 return Empty;
297
298         int num_services = 0;
299
300         for (const Service::Ptr& service : sg->GetMembers()) {
301                 if (service->GetStateType() == StateTypeHard && service->GetState() == ServiceCritical)
302                         num_services++;
303         }
304
305         return num_services;
306 }
307
308 Value ServiceGroupsTable::NumServicesHardUnknownAccessor(const Value& row)
309 {
310         ServiceGroup::Ptr sg = static_cast<ServiceGroup::Ptr>(row);
311
312         if (!sg)
313                 return Empty;
314
315         int num_services = 0;
316
317         for (const Service::Ptr& service : sg->GetMembers()) {
318                 if (service->GetStateType() == StateTypeHard && service->GetState() == ServiceUnknown)
319                         num_services++;
320         }
321
322         return num_services;
323 }