From 769594fa4f846114ead8250dc3721e5595b302d4 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 14 Jul 2015 18:08:55 +0200 Subject: [PATCH] Livestatus: Add zone object table w/ endpoint members refs #9286 --- doc/22-appendix.md | 12 +++- lib/livestatus/CMakeLists.txt | 2 +- lib/livestatus/endpointstable.cpp | 17 +++++ lib/livestatus/endpointstable.hpp | 1 + lib/livestatus/table.cpp | 3 + lib/livestatus/zonestable.cpp | 113 ++++++++++++++++++++++++++++++ lib/livestatus/zonestable.hpp | 57 +++++++++++++++ 7 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 lib/livestatus/zonestable.cpp create mode 100644 lib/livestatus/zonestable.hpp diff --git a/doc/22-appendix.md b/doc/22-appendix.md index f8a4f02be..49c66da37 100644 --- a/doc/22-appendix.md +++ b/doc/22-appendix.md @@ -214,7 +214,7 @@ Additional global custom variables populated from 'Vars' constant (object_id is Icinga 2 specific extensions are shown below: -New table: `endpoints` +New table: `endpoints`: Table | Column ----------|-------------- @@ -222,6 +222,16 @@ New table: `endpoints` endpoints | identity endpoints | node endpoints | is_connected + endpoints | zone + +New table: `zones`: + + Table | Column + ----------|-------------- + zone | name + zone | endpoints + zone | parent + zone | global New columns: diff --git a/lib/livestatus/CMakeLists.txt b/lib/livestatus/CMakeLists.txt index 2913c4ffa..7667e9930 100644 --- a/lib/livestatus/CMakeLists.txt +++ b/lib/livestatus/CMakeLists.txt @@ -28,7 +28,7 @@ set(livestatus_SOURCES minaggregator.cpp negatefilter.cpp orfilter.cpp servicegroupstable.cpp servicestable.cpp statehisttable.cpp statustable.cpp stdaggregator.cpp sumaggregator.cpp table.cpp - timeperiodstable.cpp + timeperiodstable.cpp zonestable.cpp ) if(ICINGA2_UNITY_BUILD) diff --git a/lib/livestatus/endpointstable.cpp b/lib/livestatus/endpointstable.cpp index a5cece345..ef8b1d290 100644 --- a/lib/livestatus/endpointstable.cpp +++ b/lib/livestatus/endpointstable.cpp @@ -22,6 +22,7 @@ #include "icinga/service.hpp" #include "icinga/icingaapplication.hpp" #include "remote/endpoint.hpp" +#include "remote/zone.hpp" #include "base/dynamictype.hpp" #include "base/objectlock.hpp" #include "base/convert.hpp" @@ -46,6 +47,7 @@ void EndpointsTable::AddColumns(Table *table, const String& prefix, table->AddColumn(prefix + "identity", Column(&EndpointsTable::IdentityAccessor, objectAccessor)); table->AddColumn(prefix + "node", Column(&EndpointsTable::NodeAccessor, objectAccessor)); table->AddColumn(prefix + "is_connected", Column(&EndpointsTable::IsConnectedAccessor, objectAccessor)); + table->AddColumn(prefix + "zone", Column(&EndpointsTable::ZoneAccessor, objectAccessor)); } String EndpointsTable::GetName(void) const @@ -111,3 +113,18 @@ Value EndpointsTable::IsConnectedAccessor(const Value& row) return is_connected; } + +Value EndpointsTable::ZoneAccessor(const Value& row) +{ + Endpoint::Ptr endpoint = static_cast(row); + + if (!endpoint) + return Empty; + + Zone::Ptr zone = endpoint->GetZone(); + + if (!zone) + return Empty; + + return zone->GetName(); +} diff --git a/lib/livestatus/endpointstable.hpp b/lib/livestatus/endpointstable.hpp index 9c7e88a82..90bcf8e41 100644 --- a/lib/livestatus/endpointstable.hpp +++ b/lib/livestatus/endpointstable.hpp @@ -50,6 +50,7 @@ protected: static Value IdentityAccessor(const Value& row); static Value NodeAccessor(const Value& row); static Value IsConnectedAccessor(const Value& row); + static Value ZoneAccessor(const Value& row); }; } diff --git a/lib/livestatus/table.cpp b/lib/livestatus/table.cpp index 0f8e0408f..ca677921e 100644 --- a/lib/livestatus/table.cpp +++ b/lib/livestatus/table.cpp @@ -29,6 +29,7 @@ #include "livestatus/commentstable.hpp" #include "livestatus/downtimestable.hpp" #include "livestatus/endpointstable.hpp" +#include "livestatus/zonestable.hpp" #include "livestatus/timeperiodstable.hpp" #include "livestatus/logtable.hpp" #include "livestatus/statehisttable.hpp" @@ -82,6 +83,8 @@ Table::Ptr Table::GetByName(const String& name, const String& compat_log_path, c return new StateHistTable(compat_log_path, from, until); else if (name == "endpoints") return new EndpointsTable(); + else if (name == "zones") + return new ZonesTable(); return Table::Ptr(); } diff --git a/lib/livestatus/zonestable.cpp b/lib/livestatus/zonestable.cpp new file mode 100644 index 000000000..89461d97e --- /dev/null +++ b/lib/livestatus/zonestable.cpp @@ -0,0 +1,113 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#include "livestatus/zonestable.hpp" +#include "remote/zone.hpp" +#include "base/dynamictype.hpp" +#include + +using namespace icinga; + +ZonesTable::ZonesTable(void) +{ + AddColumns(this); +} + +void ZonesTable::AddColumns(Table *table, const String& prefix, + const Column::ObjectAccessor& objectAccessor) +{ + table->AddColumn(prefix + "name", Column(&ZonesTable::NameAccessor, objectAccessor)); + table->AddColumn(prefix + "parent", Column(&ZonesTable::ParentAccessor, objectAccessor)); + table->AddColumn(prefix + "endpoints", Column(&ZonesTable::EndpointsAccessor, objectAccessor)); + table->AddColumn(prefix + "global", Column(&ZonesTable::GlobalAccessor, objectAccessor)); +} + +String ZonesTable::GetName(void) const +{ + return "zones"; +} + +String ZonesTable::GetPrefix(void) const +{ + return "zone"; +} + +void ZonesTable::FetchRows(const AddRowFunction& addRowFn) +{ + BOOST_FOREACH(const Zone::Ptr& zone, DynamicType::GetObjectsByType()) { + if (!addRowFn(zone, LivestatusGroupByNone, Empty)) + return; + } +} + +Value ZonesTable::NameAccessor(const Value& row) +{ + Zone::Ptr zone = static_cast(row); + + if (!zone) + return Empty; + + return zone->GetName(); +} + +Value ZonesTable::ParentAccessor(const Value& row) +{ + Zone::Ptr zone = static_cast(row); + + if (!zone) + return Empty; + + Zone::Ptr parent_zone = zone->GetParent(); + + if (!parent_zone) + return Empty; + + return parent_zone->GetName(); +} + +Value ZonesTable::EndpointsAccessor(const Value& row) +{ + Zone::Ptr zone = static_cast(row); + + if (!zone) + return Empty; + + std::set endpoints = zone->GetEndpoints(); + + Array::Ptr endpoint_names = new Array(); + + BOOST_FOREACH(const Endpoint::Ptr endpoint, endpoints) { + endpoint_names->Add(endpoint->GetName()); + } + + if (!endpoint_names) + return Empty; + + return endpoint_names; +} + +Value ZonesTable::GlobalAccessor(const Value& row) +{ + Zone::Ptr zone = static_cast(row); + + if (!zone) + return Empty; + + return zone->GetGlobal() ? 1 : 0; +} diff --git a/lib/livestatus/zonestable.hpp b/lib/livestatus/zonestable.hpp new file mode 100644 index 000000000..ab9b81a8d --- /dev/null +++ b/lib/livestatus/zonestable.hpp @@ -0,0 +1,57 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#ifndef ZONESTABLE_H +#define ZONESTABLE_H + +#include "livestatus/table.hpp" + +using namespace icinga; + +namespace icinga +{ + +/** + * @ingroup livestatus + */ +class I2_LIVESTATUS_API ZonesTable : public Table +{ +public: + DECLARE_PTR_TYPEDEFS(ZonesTable); + + ZonesTable(void); + + static void AddColumns(Table *table, const String& prefix = String(), + const Column::ObjectAccessor& objectAccessor = Column::ObjectAccessor()); + + virtual String GetName(void) const; + virtual String GetPrefix(void) const; + +protected: + virtual void FetchRows(const AddRowFunction& addRowFn); + + static Value NameAccessor(const Value& row); + static Value ParentAccessor(const Value& row); + static Value EndpointsAccessor(const Value& row); + static Value GlobalAccessor(const Value& row); +}; + +} + +#endif /* ZONESTABLE_H */