//////////////////////////////////////////////////////////////////////////////// /// DISCLAIMER /// /// Copyright 2019 ArangoDB GmbH, Cologne, Germany /// /// Licensed under the Apache License, Version 2.0 (the "License"); /// you may not use this file except in compliance with the License. /// You may obtain a copy of the License at /// /// http://www.apache.org/licenses/LICENSE-2.0 /// /// Unless required by applicable law or agreed to in writing, software /// distributed under the License is distributed on an "AS IS" BASIS, /// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. /// See the License for the specific language governing permissions and /// limitations under the License. /// /// Copyright holder is ArangoDB GmbH, Cologne, Germany /// /// @author Tobias Gödderz //////////////////////////////////////////////////////////////////////////////// #ifndef ARANGOD_CLUSTER_AGENCYPATHS_H #define ARANGOD_CLUSTER_AGENCYPATHS_H #include "PathComponent.h" #include "Basics/debugging.h" #include "Cluster/ClusterTypes.h" #include #include #include #include #include /** * @brief Build agency paths in a compile-time safe manner. * * Usage: * * using namespace arangodb::cluster::paths; * * std::string path = root()->arango()->plan()->databases()->database("_system")->str(); * // path == "/arango/Plan/Databases/_system" * ... * std::vector path = root()->arango()->plan()->databases()->database("_system")->vec(); * // path == {"arango", "Plan", "Databases", "_system"} * ... * std::stringstream stream; * stream << *root()->arango()->plan()->databases()->database("_system"); * // stream.str() == "/arango/Plan/Databases/_system" * ... * std::stringstream stream; * root()->arango()->plan()->databases()->database("_system")->toStream(stream); * // stream.str() == "/arango/Plan/Databases/_system" * * Or use shorthands: * * using namespace arangodb::cluster::paths::aliases; * * arango()->initCollectionsDone(); * plan()->databases(); * current()->serversKnown(); * target()->pending(); * supervision()->health(); * * @details * Note that no class here may be instantiated directly! You can only call root() and work your way down from there. * * If you add anything, make sure to add tests in tests/Cluster/AgencyPathsTest.cpp. * * An example for a static component looks like this: * class SomeOuterClass { * ... * // Add your component * class YourComponent : public StaticComponent { * public: * constexpr char const* component() const noexcept { return "YourComponent"; } * * // Inherit constructors * using BaseType::StaticComponent; * * // Add possible inner classes here * }; * * // Add an accessor to it in the outer class * std::shared_ptr yourComponent() const { * return YourComponent::make_shared(shared_from_this()); * } * ... * } * * An example for a dynamic component looks like this, here holding a value of type SomeType: * class SomeOuterClass { * ... * // Add your component * class YourComponent : public DynamicComponent { * public: * // Access your SomeType value with value(): * char const* component() const noexcept { return value().c_str(); } * * // Inherit constructors * using BaseType::DynamicComponent; * }; * * // Add an accessor to it in the outer class * std::shared_ptr yourComponent(DatabaseID name) const { * return YourComponent::make_shared(shared_from_this(), std::move(name)); * } * ... * } * */ namespace arangodb { namespace cluster { namespace paths { class Root; inline std::shared_ptr root(); // The root is no StaticComponent, mainly because it has no parent and is the // base case for recursions. class Root : public std::enable_shared_from_this, public Path { public: void forEach(std::function const&) const final {} public: class Arango : public StaticComponent { public: constexpr char const* component() const noexcept { return "arango"; } using BaseType::StaticComponent; class Plan : public StaticComponent { public: constexpr char const* component() const noexcept { return "Plan"; } using BaseType::StaticComponent; class Version : public StaticComponent { public: constexpr char const* component() const noexcept { return "Version"; } using BaseType::StaticComponent; }; std::shared_ptr version() const { return Version::make_shared(shared_from_this()); } class Views : public StaticComponent { public: constexpr char const* component() const noexcept { return "Views"; } using BaseType::StaticComponent; class Database : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; }; std::shared_ptr database(DatabaseID name) const { return Database::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr views() const { return Views::make_shared(shared_from_this()); } class AsyncReplication : public StaticComponent { public: constexpr char const* component() const noexcept { return "AsyncReplication"; } using BaseType::StaticComponent; }; std::shared_ptr asyncReplication() const { return AsyncReplication::make_shared(shared_from_this()); } class Coordinators : public StaticComponent { public: constexpr char const* component() const noexcept { return "Coordinators"; } using BaseType::StaticComponent; class Server : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; }; std::shared_ptr server(ServerID name) const { return Server::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr coordinators() const { return Coordinators::make_shared(shared_from_this()); } class Lock : public StaticComponent { public: constexpr char const* component() const noexcept { return "Lock"; } using BaseType::StaticComponent; }; std::shared_ptr lock() const { return Lock::make_shared(shared_from_this()); } class Singles : public StaticComponent { public: constexpr char const* component() const noexcept { return "Singles"; } using BaseType::StaticComponent; }; std::shared_ptr singles() const { return Singles::make_shared(shared_from_this()); } class DbServers : public StaticComponent { public: constexpr char const* component() const noexcept { return "DBServers"; } using BaseType::StaticComponent; class Server : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; }; std::shared_ptr server(ServerID name) const { return Server::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr dBServers() const { return DbServers::make_shared(shared_from_this()); } class Collections : public StaticComponent { public: constexpr char const* component() const noexcept { return "Collections"; } using BaseType::StaticComponent; class Database : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; class Collection : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; class WaitForSync : public StaticComponent { public: constexpr char const* component() const noexcept { return "waitForSync"; } using BaseType::StaticComponent; }; std::shared_ptr waitForSync() const { return WaitForSync::make_shared(shared_from_this()); } class Type : public StaticComponent { public: constexpr char const* component() const noexcept { return "type"; } using BaseType::StaticComponent; }; std::shared_ptr type() const { return Type::make_shared(shared_from_this()); } class Status : public StaticComponent { public: constexpr char const* component() const noexcept { return "status"; } using BaseType::StaticComponent; }; std::shared_ptr status() const { return Status::make_shared(shared_from_this()); } class Shards : public StaticComponent { public: constexpr char const* component() const noexcept { return "shards"; } using BaseType::StaticComponent; class Shard : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; }; std::shared_ptr shard(ShardID name) const { return Shard::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr shards() const { return Shards::make_shared(shared_from_this()); } class StatusString : public StaticComponent { public: constexpr char const* component() const noexcept { return "statusString"; } using BaseType::StaticComponent; }; std::shared_ptr statusString() const { return StatusString::make_shared(shared_from_this()); } class ShardingStrategy : public StaticComponent { public: constexpr char const* component() const noexcept { return "shardingStrategy"; } using BaseType::StaticComponent; }; std::shared_ptr shardingStrategy() const { return ShardingStrategy::make_shared(shared_from_this()); } class ShardKeys : public StaticComponent { public: constexpr char const* component() const noexcept { return "shardKeys"; } using BaseType::StaticComponent; }; std::shared_ptr shardKeys() const { return ShardKeys::make_shared(shared_from_this()); } class ReplicationFactor : public StaticComponent { public: constexpr char const* component() const noexcept { return "replicationFactor"; } using BaseType::StaticComponent; }; std::shared_ptr replicationFactor() const { return ReplicationFactor::make_shared(shared_from_this()); } class NumberOfShards : public StaticComponent { public: constexpr char const* component() const noexcept { return "numberOfShards"; } using BaseType::StaticComponent; }; std::shared_ptr numberOfShards() const { return NumberOfShards::make_shared(shared_from_this()); } class KeyOptions : public StaticComponent { public: constexpr char const* component() const noexcept { return "keyOptions"; } using BaseType::StaticComponent; class Type : public StaticComponent { public: constexpr char const* component() const noexcept { return "type"; } using BaseType::StaticComponent; }; std::shared_ptr type() const { return Type::make_shared(shared_from_this()); } class AllowUserKeys : public StaticComponent { public: constexpr char const* component() const noexcept { return "allowUserKeys"; } using BaseType::StaticComponent; }; std::shared_ptr allowUserKeys() const { return AllowUserKeys::make_shared(shared_from_this()); } }; std::shared_ptr keyOptions() const { return KeyOptions::make_shared(shared_from_this()); } class IsSystem : public StaticComponent { public: constexpr char const* component() const noexcept { return "isSystem"; } using BaseType::StaticComponent; }; std::shared_ptr isSystem() const { return IsSystem::make_shared(shared_from_this()); } class Name : public StaticComponent { public: constexpr char const* component() const noexcept { return "name"; } using BaseType::StaticComponent; }; std::shared_ptr name() const { return Name::make_shared(shared_from_this()); } class Indexes : public StaticComponent { public: constexpr char const* component() const noexcept { return "indexes"; } using BaseType::StaticComponent; }; std::shared_ptr indexes() const { return Indexes::make_shared(shared_from_this()); } class IsSmart : public StaticComponent { public: constexpr char const* component() const noexcept { return "isSmart"; } using BaseType::StaticComponent; }; std::shared_ptr isSmart() const { return IsSmart::make_shared(shared_from_this()); } class Id : public StaticComponent { public: constexpr char const* component() const noexcept { return "id"; } using BaseType::StaticComponent; }; std::shared_ptr id() const { return Id::make_shared(shared_from_this()); } class DistributeShardsLike : public StaticComponent { public: constexpr char const* component() const noexcept { return "distributeShardsLike"; } using BaseType::StaticComponent; }; std::shared_ptr distributeShardsLike() const { return DistributeShardsLike::make_shared(shared_from_this()); } class Deleted : public StaticComponent { public: constexpr char const* component() const noexcept { return "deleted"; } using BaseType::StaticComponent; }; std::shared_ptr deleted() const { return Deleted::make_shared(shared_from_this()); } class WriteConcern : public StaticComponent { public: constexpr char const* component() const noexcept { return "writeConcern"; } using BaseType::StaticComponent; }; std::shared_ptr writeConcern() const { return WriteConcern::make_shared(shared_from_this()); } class CacheEnabled : public StaticComponent { public: constexpr char const* component() const noexcept { return "cacheEnabled"; } using BaseType::StaticComponent; }; std::shared_ptr cacheEnabled() const { return CacheEnabled::make_shared(shared_from_this()); } }; std::shared_ptr collection(CollectionID name) const { return Collection::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr database(DatabaseID name) const { return Database::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr collections() const { return Collections::make_shared(shared_from_this()); } class Databases : public StaticComponent { public: constexpr char const* component() const noexcept { return "Databases"; } using BaseType::StaticComponent; class Database : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; class Name : public StaticComponent { public: constexpr char const* component() const noexcept { return "name"; } using BaseType::StaticComponent; }; std::shared_ptr name() const { return Name::make_shared(shared_from_this()); } class Id : public StaticComponent { public: constexpr char const* component() const noexcept { return "id"; } using BaseType::StaticComponent; }; std::shared_ptr id() const { return Id::make_shared(shared_from_this()); } }; std::shared_ptr database(DatabaseID name) const { return Database::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr databases() const { return Databases::make_shared(shared_from_this()); } }; std::shared_ptr plan() const { return Plan::make_shared(shared_from_this()); } class Current : public StaticComponent { public: constexpr char const* component() const noexcept { return "Current"; } using BaseType::StaticComponent; class Version : public StaticComponent { public: constexpr char const* component() const noexcept { return "Version"; } using BaseType::StaticComponent; }; std::shared_ptr version() const { return Version::make_shared(shared_from_this()); } class ServersKnown : public StaticComponent { public: constexpr char const* component() const noexcept { return "ServersKnown"; } using BaseType::StaticComponent; class Server : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; class RebootId : public StaticComponent { public: constexpr char const* component() const noexcept { return "rebootId"; } using BaseType::StaticComponent; }; std::shared_ptr rebootId() const { return RebootId::make_shared(shared_from_this()); } }; std::shared_ptr server(ServerID name) const { return Server::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr serversKnown() const { return ServersKnown::make_shared(shared_from_this()); } class FoxxmasterQueueupdate : public StaticComponent { public: constexpr char const* component() const noexcept { return "FoxxmasterQueueupdate"; } using BaseType::StaticComponent; }; std::shared_ptr foxxmasterQueueupdate() const { return FoxxmasterQueueupdate::make_shared(shared_from_this()); } class ShardsCopied : public StaticComponent { public: constexpr char const* component() const noexcept { return "ShardsCopied"; } using BaseType::StaticComponent; }; std::shared_ptr shardsCopied() const { return ShardsCopied::make_shared(shared_from_this()); } class Foxxmaster : public StaticComponent { public: constexpr char const* component() const noexcept { return "Foxxmaster"; } using BaseType::StaticComponent; }; std::shared_ptr foxxmaster() const { return Foxxmaster::make_shared(shared_from_this()); } class ServersRegistered : public StaticComponent { public: constexpr char const* component() const noexcept { return "ServersRegistered"; } using BaseType::StaticComponent; class Version : public StaticComponent { public: constexpr char const* component() const noexcept { return "Version"; } using BaseType::StaticComponent; }; std::shared_ptr version() const { return Version::make_shared(shared_from_this()); } class Server : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; class Timestamp : public StaticComponent { public: constexpr char const* component() const noexcept { return "timestamp"; } using BaseType::StaticComponent; }; std::shared_ptr timestamp() const { return Timestamp::make_shared(shared_from_this()); } class Engine : public StaticComponent { public: constexpr char const* component() const noexcept { return "engine"; } using BaseType::StaticComponent; }; std::shared_ptr engine() const { return Engine::make_shared(shared_from_this()); } class Endpoint : public StaticComponent { public: constexpr char const* component() const noexcept { return "endpoint"; } using BaseType::StaticComponent; }; std::shared_ptr endpoint() const { return Endpoint::make_shared(shared_from_this()); } class Host : public StaticComponent { public: constexpr char const* component() const noexcept { return "host"; } using BaseType::StaticComponent; }; std::shared_ptr host() const { return Host::make_shared(shared_from_this()); } class VersionString : public StaticComponent { public: constexpr char const* component() const noexcept { return "versionString"; } using BaseType::StaticComponent; }; std::shared_ptr versionString() const { return VersionString::make_shared(shared_from_this()); } class AdvertisedEndpoint : public StaticComponent { public: constexpr char const* component() const noexcept { return "advertisedEndpoint"; } using BaseType::StaticComponent; }; std::shared_ptr advertisedEndpoint() const { return AdvertisedEndpoint::make_shared(shared_from_this()); } class Version : public StaticComponent { public: constexpr char const* component() const noexcept { return "version"; } using BaseType::StaticComponent; }; std::shared_ptr version() const { return Version::make_shared(shared_from_this()); } }; std::shared_ptr server(ServerID name) const { return Server::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr serversRegistered() const { return ServersRegistered::make_shared(shared_from_this()); } class NewServers : public StaticComponent { public: constexpr char const* component() const noexcept { return "NewServers"; } using BaseType::StaticComponent; }; std::shared_ptr newServers() const { return NewServers::make_shared(shared_from_this()); } class AsyncReplication : public StaticComponent { public: constexpr char const* component() const noexcept { return "AsyncReplication"; } using BaseType::StaticComponent; }; std::shared_ptr asyncReplication() const { return AsyncReplication::make_shared(shared_from_this()); } class Coordinators : public StaticComponent { public: constexpr char const* component() const noexcept { return "Coordinators"; } using BaseType::StaticComponent; class Server : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; }; std::shared_ptr server(ServerID name) const { return Server::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr coordinators() const { return Coordinators::make_shared(shared_from_this()); } class Lock : public StaticComponent { public: constexpr char const* component() const noexcept { return "Lock"; } using BaseType::StaticComponent; }; std::shared_ptr lock() const { return Lock::make_shared(shared_from_this()); } class Singles : public StaticComponent { public: constexpr char const* component() const noexcept { return "Singles"; } using BaseType::StaticComponent; }; std::shared_ptr singles() const { return Singles::make_shared(shared_from_this()); } class DbServers : public StaticComponent { public: constexpr char const* component() const noexcept { return "DBServers"; } using BaseType::StaticComponent; class Server : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; }; std::shared_ptr server(ServerID name) const { return Server::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr dBServers() const { return DbServers::make_shared(shared_from_this()); } class Collections : public StaticComponent { public: constexpr char const* component() const noexcept { return "Collections"; } using BaseType::StaticComponent; class Database : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; class Collection : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; class Shard : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; class Servers : public StaticComponent { public: constexpr char const* component() const noexcept { return "servers"; } using BaseType::StaticComponent; }; std::shared_ptr servers() const { return Servers::make_shared(shared_from_this()); } class Indexes : public StaticComponent { public: constexpr char const* component() const noexcept { return "indexes"; } using BaseType::StaticComponent; }; std::shared_ptr indexes() const { return Indexes::make_shared(shared_from_this()); } class FailoverCandidates : public StaticComponent { public: constexpr char const* component() const noexcept { return "failoverCandidates"; } using BaseType::StaticComponent; }; std::shared_ptr failoverCandidates() const { return FailoverCandidates::make_shared(shared_from_this()); } class ErrorNum : public StaticComponent { public: constexpr char const* component() const noexcept { return "errorNum"; } using BaseType::StaticComponent; }; std::shared_ptr errorNum() const { return ErrorNum::make_shared(shared_from_this()); } class ErrorMessage : public StaticComponent { public: constexpr char const* component() const noexcept { return "errorMessage"; } using BaseType::StaticComponent; }; std::shared_ptr errorMessage() const { return ErrorMessage::make_shared(shared_from_this()); } class Error : public StaticComponent { public: constexpr char const* component() const noexcept { return "error"; } using BaseType::StaticComponent; }; std::shared_ptr error() const { return Error::make_shared(shared_from_this()); } }; std::shared_ptr shard(ShardID name) const { return Shard::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr collection(CollectionID name) const { return Collection::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr database(DatabaseID name) const { return Database::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr collections() const { return Collections::make_shared(shared_from_this()); } class Databases : public StaticComponent { public: constexpr char const* component() const noexcept { return "Databases"; } using BaseType::StaticComponent; class Database : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; class Server : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; class Name : public StaticComponent { public: constexpr char const* component() const noexcept { return "name"; } using BaseType::StaticComponent; }; std::shared_ptr name() const { return Name::make_shared(shared_from_this()); } class ErrorNum : public StaticComponent { public: constexpr char const* component() const noexcept { return "errorNum"; } using BaseType::StaticComponent; }; std::shared_ptr errorNum() const { return ErrorNum::make_shared(shared_from_this()); } class Id : public StaticComponent { public: constexpr char const* component() const noexcept { return "id"; } using BaseType::StaticComponent; }; std::shared_ptr id() const { return Id::make_shared(shared_from_this()); } class Error : public StaticComponent { public: constexpr char const* component() const noexcept { return "error"; } using BaseType::StaticComponent; }; std::shared_ptr error() const { return Error::make_shared(shared_from_this()); } class ErrorMessage : public StaticComponent { public: constexpr char const* component() const noexcept { return "errorMessage"; } using BaseType::StaticComponent; }; std::shared_ptr errorMessage() const { return ErrorMessage::make_shared(shared_from_this()); } }; std::shared_ptr server(ServerID name) const { return Server::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr database(DatabaseID name) const { return Database::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr databases() const { return Databases::make_shared(shared_from_this()); } }; std::shared_ptr current() const { return Current::make_shared(shared_from_this()); } class Supervision : public StaticComponent { public: constexpr char const* component() const noexcept { return "Supervision"; } using BaseType::StaticComponent; class State : public StaticComponent { public: constexpr char const* component() const noexcept { return "State"; } using BaseType::StaticComponent; class Timestamp : public StaticComponent { public: constexpr char const* component() const noexcept { return "Timestamp"; } using BaseType::StaticComponent; }; std::shared_ptr timestamp() const { return Timestamp::make_shared(shared_from_this()); } class Mode : public StaticComponent { public: constexpr char const* component() const noexcept { return "Mode"; } using BaseType::StaticComponent; }; std::shared_ptr mode() const { return Mode::make_shared(shared_from_this()); } }; std::shared_ptr state() const { return State::make_shared(shared_from_this()); } class Shards : public StaticComponent { public: constexpr char const* component() const noexcept { return "Shards"; } using BaseType::StaticComponent; }; std::shared_ptr shards() const { return Shards::make_shared(shared_from_this()); } class DbServers : public StaticComponent { public: constexpr char const* component() const noexcept { return "DBServers"; } using BaseType::StaticComponent; }; std::shared_ptr dbServers() const { return DbServers::make_shared(shared_from_this()); } class Health : public StaticComponent { public: constexpr char const* component() const noexcept { return "Health"; } using BaseType::StaticComponent; class Server : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; class SyncTime : public StaticComponent { public: constexpr char const* component() const noexcept { return "SyncTime"; } using BaseType::StaticComponent; }; std::shared_ptr syncTime() const { return SyncTime::make_shared(shared_from_this()); } class Timestamp : public StaticComponent { public: constexpr char const* component() const noexcept { return "Timestamp"; } using BaseType::StaticComponent; }; std::shared_ptr timestamp() const { return Timestamp::make_shared(shared_from_this()); } class SyncStatus : public StaticComponent { public: constexpr char const* component() const noexcept { return "SyncStatus"; } using BaseType::StaticComponent; }; std::shared_ptr syncStatus() const { return SyncStatus::make_shared(shared_from_this()); } class LastAckedTime : public StaticComponent { public: constexpr char const* component() const noexcept { return "LastAckedTime"; } using BaseType::StaticComponent; }; std::shared_ptr lastAckedTime() const { return LastAckedTime::make_shared(shared_from_this()); } class Host : public StaticComponent { public: constexpr char const* component() const noexcept { return "Host"; } using BaseType::StaticComponent; }; std::shared_ptr host() const { return Host::make_shared(shared_from_this()); } class Engine : public StaticComponent { public: constexpr char const* component() const noexcept { return "Engine"; } using BaseType::StaticComponent; }; std::shared_ptr engine() const { return Engine::make_shared(shared_from_this()); } class Version : public StaticComponent { public: constexpr char const* component() const noexcept { return "Version"; } using BaseType::StaticComponent; }; std::shared_ptr version() const { return Version::make_shared(shared_from_this()); } class Status : public StaticComponent { public: constexpr char const* component() const noexcept { return "Status"; } using BaseType::StaticComponent; }; std::shared_ptr status() const { return Status::make_shared(shared_from_this()); } class ShortName : public StaticComponent { public: constexpr char const* component() const noexcept { return "ShortName"; } using BaseType::StaticComponent; }; std::shared_ptr shortName() const { return ShortName::make_shared(shared_from_this()); } class Endpoint : public StaticComponent { public: constexpr char const* component() const noexcept { return "Endpoint"; } using BaseType::StaticComponent; }; std::shared_ptr endpoint() const { return Endpoint::make_shared(shared_from_this()); } }; std::shared_ptr server(ServerID server) const { return Server::make_shared(shared_from_this(), std::move(server)); } }; std::shared_ptr health() const { return Health::make_shared(shared_from_this()); } }; std::shared_ptr supervision() const { return Supervision::make_shared(shared_from_this()); } class Target : public StaticComponent { public: constexpr char const* component() const noexcept { return "Target"; } using BaseType::StaticComponent; class ToDo : public StaticComponent { public: constexpr char const* component() const noexcept { return "ToDo"; } using BaseType::StaticComponent; }; std::shared_ptr toDo() const { return ToDo::make_shared(shared_from_this()); } class ToBeCleanedServers : public StaticComponent { public: constexpr char const* component() const noexcept { return "ToBeCleanedServers"; } using BaseType::StaticComponent; }; std::shared_ptr toBeCleanedServers() const { return ToBeCleanedServers::make_shared(shared_from_this()); } class Pending : public StaticComponent { public: constexpr char const* component() const noexcept { return "Pending"; } using BaseType::StaticComponent; }; std::shared_ptr pending() const { return Pending::make_shared(shared_from_this()); } class NumberOfDBServers : public StaticComponent { public: constexpr char const* component() const noexcept { return "NumberOfDBServers"; } using BaseType::StaticComponent; }; std::shared_ptr numberOfDBServers() const { return NumberOfDBServers::make_shared(shared_from_this()); } class LatestDbServerId : public StaticComponent { public: constexpr char const* component() const noexcept { return "LatestDBServerId"; } using BaseType::StaticComponent; }; std::shared_ptr latestDBServerId() const { return LatestDbServerId::make_shared(shared_from_this()); } class Failed : public StaticComponent { public: constexpr char const* component() const noexcept { return "Failed"; } using BaseType::StaticComponent; }; std::shared_ptr failed() const { return Failed::make_shared(shared_from_this()); } class CleanedServers : public StaticComponent { public: constexpr char const* component() const noexcept { return "CleanedServers"; } using BaseType::StaticComponent; }; std::shared_ptr cleanedServers() const { return CleanedServers::make_shared(shared_from_this()); } class LatestCoordinatorId : public StaticComponent { public: constexpr char const* component() const noexcept { return "LatestCoordinatorId"; } using BaseType::StaticComponent; }; std::shared_ptr latestCoordinatorId() const { return LatestCoordinatorId::make_shared(shared_from_this()); } class MapUniqueToShortId : public StaticComponent { public: constexpr char const* component() const noexcept { return "MapUniqueToShortID"; } using BaseType::StaticComponent; class Server : public DynamicComponent { public: char const* component() const noexcept { return value().c_str(); } using BaseType::DynamicComponent; class TransactionId : public StaticComponent { public: constexpr char const* component() const noexcept { return "TransactionID"; } using BaseType::StaticComponent; }; std::shared_ptr transactionID() const { return TransactionId::make_shared(shared_from_this()); } class ShortName : public StaticComponent { public: constexpr char const* component() const noexcept { return "ShortName"; } using BaseType::StaticComponent; }; std::shared_ptr shortName() const { return ShortName::make_shared(shared_from_this()); } }; std::shared_ptr server(ServerID name) const { return Server::make_shared(shared_from_this(), std::move(name)); } }; std::shared_ptr mapUniqueToShortID() const { return MapUniqueToShortId::make_shared(shared_from_this()); } class FailedServers : public StaticComponent { public: constexpr char const* component() const noexcept { return "FailedServers"; } using BaseType::StaticComponent; }; std::shared_ptr failedServers() const { return FailedServers::make_shared(shared_from_this()); } class MapLocalToId : public StaticComponent { public: constexpr char const* component() const noexcept { return "MapLocalToID"; } using BaseType::StaticComponent; }; std::shared_ptr mapLocalToID() const { return MapLocalToId::make_shared(shared_from_this()); } class NumberOfCoordinators : public StaticComponent { public: constexpr char const* component() const noexcept { return "NumberOfCoordinators"; } using BaseType::StaticComponent; }; std::shared_ptr numberOfCoordinators() const { return NumberOfCoordinators::make_shared(shared_from_this()); } class Finished : public StaticComponent { public: constexpr char const* component() const noexcept { return "Finished"; } using BaseType::StaticComponent; }; std::shared_ptr finished() const { return Finished::make_shared(shared_from_this()); } class Version : public StaticComponent { public: constexpr char const* component() const noexcept { return "Version"; } using BaseType::StaticComponent; }; std::shared_ptr version() const { return Version::make_shared(shared_from_this()); } class Lock : public StaticComponent { public: constexpr char const* component() const noexcept { return "Lock"; } using BaseType::StaticComponent; }; std::shared_ptr lock() const { return Lock::make_shared(shared_from_this()); } }; std::shared_ptr target() const { return Target::make_shared(shared_from_this()); } class SystemCollectionsCreated : public StaticComponent { public: constexpr char const* component() const noexcept { return "SystemCollectionsCreated"; } using BaseType::StaticComponent; }; std::shared_ptr systemCollectionsCreated() const { return SystemCollectionsCreated::make_shared(shared_from_this()); } class Sync : public StaticComponent { public: constexpr char const* component() const noexcept { return "Sync"; } using BaseType::StaticComponent; class UserVersion : public StaticComponent { public: constexpr char const* component() const noexcept { return "UserVersion"; } using BaseType::StaticComponent; }; std::shared_ptr userVersion() const { return UserVersion::make_shared(shared_from_this()); } class ServerStates : public StaticComponent { public: constexpr char const* component() const noexcept { return "ServerStates"; } using BaseType::StaticComponent; }; std::shared_ptr serverStates() const { return ServerStates::make_shared(shared_from_this()); } class Problems : public StaticComponent { public: constexpr char const* component() const noexcept { return "Problems"; } using BaseType::StaticComponent; }; std::shared_ptr problems() const { return Problems::make_shared(shared_from_this()); } class HeartbeatIntervalMs : public StaticComponent { public: constexpr char const* component() const noexcept { return "HeartbeatIntervalMs"; } using BaseType::StaticComponent; }; std::shared_ptr heartbeatIntervalMs() const { return HeartbeatIntervalMs::make_shared(shared_from_this()); } class LatestId : public StaticComponent { public: constexpr char const* component() const noexcept { return "LatestID"; } using BaseType::StaticComponent; }; std::shared_ptr latestID() const { return LatestId::make_shared(shared_from_this()); } }; std::shared_ptr sync() const { return Sync::make_shared(shared_from_this()); } class Bootstrap : public StaticComponent { public: constexpr char const* component() const noexcept { return "Bootstrap"; } using BaseType::StaticComponent; }; std::shared_ptr bootstrap() const { return Bootstrap::make_shared(shared_from_this()); } class Cluster : public StaticComponent { public: constexpr char const* component() const noexcept { return "Cluster"; } using BaseType::StaticComponent; }; std::shared_ptr cluster() const { return Cluster::make_shared(shared_from_this()); } class Agency : public StaticComponent { public: constexpr char const* component() const noexcept { return "Agency"; } using BaseType::StaticComponent; class Definition : public StaticComponent { public: constexpr char const* component() const noexcept { return "Definition"; } using BaseType::StaticComponent; }; std::shared_ptr definition() const { return Definition::make_shared(shared_from_this()); } }; std::shared_ptr agency() const { return Agency::make_shared(shared_from_this()); } class InitDone : public StaticComponent { public: constexpr char const* component() const noexcept { return "InitDone"; } using BaseType::StaticComponent; }; std::shared_ptr initDone() const { return InitDone::make_shared(shared_from_this()); } }; std::shared_ptr arango() const { return Arango::make_shared(shared_from_this()); } private: // May only be constructed by root() friend std::shared_ptr root(); Root() = default; static std::shared_ptr make_shared() { struct ConstructibleRoot : public Root { public: explicit ConstructibleRoot() noexcept = default; }; return std::make_shared(); } }; std::shared_ptr root() { return Root::make_shared(); } namespace aliases { std::shared_ptr arango() { return root()->arango(); } std::shared_ptr plan() { return root()->arango()->plan(); } std::shared_ptr current() { return root()->arango()->current(); } std::shared_ptr target() { return root()->arango()->target(); } std::shared_ptr supervision() { return root()->arango()->supervision(); } } // namespace aliases } // namespace paths } // namespace cluster } // namespace arangodb #endif // ARANGOD_CLUSTER_AGENCYPATHS_H