Skip to content
Snippets Groups Projects

Better Error Handling and Logging

Merged Timm Fitschen requested to merge dev into main
12 files
+ 149
54
Compare changes
  • Side-by-side
  • Inline
Files
12
@@ -21,17 +21,20 @@
#ifndef CAOSDB_CONFIGURATION_H
#define CAOSDB_CONFIGURATION_H
#include <memory> // for unique_ptr
#include <string> // for string
#include "boost/filesystem/operations.hpp" // for exists
#include "boost/filesystem/path.hpp" // for path
#include "boost/json/object.hpp" // for object
#include "boost/json/value.hpp" // for value
#include "boost/json/value_ref.hpp" // for array, object
#include "boost/json/value_ref.hpp" // IWYU pragma: keep
#include "caosdb/authentication.h" // for Authenticator, PlainPassw...
#include "caosdb/connection.h" // for ConnectionConfiguration, Certifi...
#include "caosdb/exceptions.h" // for ConfigurationError
#include "caosdb/utility.h" // for load_json_file
#include "caosdb/certificate_provider.h" // for CertificateProvider, path
#include "caosdb/exceptions.h" // for ConfigurationError
#include "caosdb/logging.h"
#include "caosdb/utility.h" // for load_json_file
#include "grpcpp/security/credentials.h" // for ChannelCredentials
#include <iosfwd> // for ostream
#include <memory> // for unique_ptr, shared_ptr
#include <string> // for string
namespace caosdb::configuration {
using boost::filesystem::exists;
@@ -41,14 +44,89 @@ using boost::json::object;
using boost::json::value;
using caosdb::authentication::Authenticator;
using caosdb::authentication::PlainPasswordAuthenticator;
using caosdb::connection::CertificateProvider;
using caosdb::connection::ConnectionConfiguration;
using caosdb::connection::ConnectionManager;
using caosdb::connection::InsecureConnectionConfiguration;
using caosdb::connection::PemFileCertificateProvider;
using caosdb::connection::TlsConnectionConfiguration;
using caosdb::exceptions::ConfigurationError;
using caosdb::utility::load_json_file;
using grpc::ChannelCredentials;
const std::string logger_name = "caosdb::configuration";
/**
* @brief Configuration of the CaosDB connection.
*/
class ConnectionConfiguration {
private:
std::string host;
int port;
public:
ConnectionConfiguration(const std::string &host, int port);
virtual ~ConnectionConfiguration() = default;
friend auto operator<<(std::ostream &out,
const ConnectionConfiguration &configuration)
-> std::ostream &;
[[nodiscard]] auto virtual ToString() const -> std::string = 0;
[[nodiscard]] auto GetHost() const -> std::string;
[[nodiscard]] auto GetPort() const -> int;
[[nodiscard]] auto virtual GetChannelCredentials() const
-> std::shared_ptr<ChannelCredentials> = 0;
};
class InsecureConnectionConfiguration : public ConnectionConfiguration {
private:
std::shared_ptr<ChannelCredentials> credentials;
public:
InsecureConnectionConfiguration(const std::string &host, int port);
[[nodiscard]] auto GetChannelCredentials() const
-> std::shared_ptr<ChannelCredentials> override;
[[nodiscard]] auto ToString() const -> std::string override;
};
class TlsConnectionConfiguration : public ConnectionConfiguration {
private:
std::shared_ptr<ChannelCredentials> credentials;
std::string certificate_provider;
public:
TlsConnectionConfiguration(const std::string &host, int port);
TlsConnectionConfiguration(const std::string &host, int port,
const Authenticator &authenticator);
TlsConnectionConfiguration(const std::string &host, int port,
const CertificateProvider &certificate_provider);
TlsConnectionConfiguration(const std::string &host, int port,
const CertificateProvider &certificate_provider,
const Authenticator &authenticator);
[[nodiscard]] auto GetChannelCredentials() const
-> std::shared_ptr<ChannelCredentials> override;
[[nodiscard]] auto ToString() const -> std::string override;
};
/**
* Helper class (no state, just member functions) which should only be used by
* the ConfigurationManager to initialize the logging framework from the stored
* configuration.
*/
class LoggingConfigurationHelper {
public:
friend class ConfigurationManager;
private:
auto CreateConsoleSinkConfiguration(const object &from,
const std::string &name, int level) const
-> std::shared_ptr<caosdb::logging::SinkConfiguration>;
auto CreateSyslogSinkConfiguration(const object &from,
const std::string &name, int level) const
-> std::shared_ptr<caosdb::logging::SinkConfiguration>;
auto CreateFileSinkConfiguration(const object &from, const std::string &name,
int level) const
-> std::shared_ptr<caosdb::logging::SinkConfiguration>;
auto CreateSinkConfiguration(const object &from, const std::string &name,
int default_level) const
-> std::shared_ptr<caosdb::logging::SinkConfiguration>;
auto CreateLoggingConfiguration(const object &from) const
-> caosdb::logging::LoggingConfiguration;
};
/**
* Helper class (no state, just member functions) which should only be used by
@@ -63,7 +141,7 @@ private:
/**
* @param from - a single connection configuration.
*/
inline auto CreateCertificateProvider(const object &from) const
auto CreateCertificateProvider(const object &from) const
-> std::unique_ptr<CertificateProvider>;
/**
@@ -110,12 +188,12 @@ public:
/**
* See mReset.
*/
inline static auto Reset() -> void { GetInstance().mReset(); }
inline static auto Reset() noexcept -> int { return GetInstance().mReset(); }
/**
* See mClear.
*/
inline static auto Clear() -> void { GetInstance().mClear(); }
inline static auto Clear() noexcept -> int { return GetInstance().mClear(); }
/**
* See mLoadSingleJSONConfiguration.
@@ -155,6 +233,8 @@ public:
private:
value json_configuration;
ConnectionConfigurationHelper connection_configuration_helper;
LoggingConfigurationHelper logging_configuration_helper;
inline ConfigurationManager() { InitializeDefaults(); };
/**
@@ -164,7 +244,7 @@ private:
* first existing file from the LIBCAOSDB_CONFIGURATION_FILES_PRECEDENCE list
* of file locations.
*/
auto InitializeDefaults() -> void;
auto InitializeDefaults() -> int;
/**
* Return a json object representing the current configuration.
@@ -188,7 +268,7 @@ private:
* The current configuration is deleted and a new configuration is being
* loaded via InitializeDefaults.
*/
auto mReset() -> void;
auto mReset() noexcept -> int;
/**
* Clear this ConfigurationManager.
@@ -198,7 +278,7 @@ private:
* In contrast to mReset, this method only deletes the current configuration
* but does not load a new one via InitializeDefaults.
*/
auto mClear() -> void;
auto mClear() noexcept -> int;
/**
* Load a configuration from a json file.
Loading