blob: 63a304ef0d408ab5a05bb30826c134411bc00aeb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
#pragma once
#include <ignite/client/ignite_client_authenticator.h>
#include <ignite/client/ignite_logger.h>
#include <ignite/client/ssl_mode.h>
#include <ignite/common/ignite_error.h>
#include <initializer_list>
#include <memory>
#include <chrono>
#include <string>
#include <vector>
#include <detail/config.h>
namespace ignite {
/**
* Ignite client configuration.
*/
class ignite_client_configuration {
public:
/**
* TCP port used by client by default if not specified explicitly.
*/
static constexpr std::uint16_t DEFAULT_PORT = 10800;
/**
* Default heartbeat interval.
*/
static constexpr std::chrono::microseconds DEFAULT_HEARTBEAT_INTERVAL = std::chrono::seconds(30);
// Default
ignite_client_configuration() = default;
/**
* Constructor.
*
* @param endpoints Endpoints list.
*/
ignite_client_configuration(std::initializer_list<std::string_view> endpoints)
: m_endpoints(endpoints.begin(), endpoints.end()) {
check_endpoints_non_empty(m_endpoints);
}
/**
* Constructor.
*
* @param endpoints Endpoints list.
*/
ignite_client_configuration(std::vector<std::string> endpoints) // NOLINT(google-explicit-constructor)
: m_endpoints(std::move(endpoints)) {
check_endpoints_non_empty(m_endpoints);
}
/**
* Get endpoints.
*
* @see set_endpoints() for more detailed description.
*
* @return Endpoints.
*/
[[nodiscard]] const std::vector<std::string> &get_endpoints() const { return m_endpoints; }
/**
* Set endpoints.
*
* Examples of supported formats:
* - 192.168.1.25 - Default port is used, see DEFAULT_PORT;
* - 192.168.1.25:780 - Custom port;
* - my-host.com - Default port is used, see DEFAULT_PORT;
* - my-host.com:780 - Custom port;
*
* Default is "localhost"
*
* @param endpoints Endpoints.
*/
void set_endpoints(std::initializer_list<std::string_view> endpoints) {
std::vector<std::string> endpoints0(endpoints.begin(), endpoints.end());
set_endpoints(endpoints0);
}
/**
* Set endpoints.
*
* Examples of supported formats:
* - 192.168.1.25 - Default port is used, see DEFAULT_PORT;
* - 192.168.1.25:780 - Custom port;
* - my-host.com - Default port is used, see DEFAULT_PORT;
* - my-host.com:780 - Custom port;
*
* Default is "localhost"
*
* @param endpoints Endpoints.
*/
void set_endpoints(std::vector<std::string> endpoints) {
check_endpoints_non_empty(endpoints);
m_endpoints = std::move(endpoints);
}
/**
* Get logger.
*
* @return Current logger.
*/
[[nodiscard]] const std::shared_ptr<ignite_logger> &get_logger() const { return m_logger; }
/**
* Set logger to be used by client.
*
* The logger is @c nullptr by default, which means no logging is performed.
*
* @param logger Logger to use.
*/
void set_logger(std::shared_ptr<ignite_logger> logger) { m_logger = std::move(logger); }
/**
* Get connection limit.
*
* By default, C++ client establishes a connection to every server node listed in @c end_points. Use
* this setting to limit the number of active connections. This reduces initial connection time and the
* resource usage, but can have a negative effect on cache operation performance.
*
* Zero value means that the number of active connections is not limited.
*
* The default value is zero.
*
* @return Active connection limit.
*/
[[nodiscard]] std::uint32_t get_connection_limit() const { return m_connection_limit; }
/**
* Set the connection limit.
*
* @see get_connections_limit for details.
*
* @param limit Connections limit to set.
*/
void set_connection_limit(std::uint32_t limit) { m_connection_limit = limit; }
/**
* Get a heartbeat interval.
* When server-side idle timeout is not zero, the effective heartbeat interval is set to
* min(heartbeat_interval, idle_timeout / 3)
*
* When thin client connection is idle (no operations are performed), heartbeat messages are sent periodically
* to keep the connection alive and detect potential half-open state.
*
* Zero value means heartbeats are disabled.
*
* The default value is DEFAULT_HEARTBEAT_INTERVAL.
*
* @return Heartbeat interval.
*/
[[nodiscard]] std::chrono::microseconds get_heartbeat_interval() const { return m_heartbeat_interval; }
/**
* Set a heartbeat interval.
*
* @see get_heartbeat_interval for details.
*
* @param heartbeat_interval Heartbeat interval.
*/
void set_heartbeat_interval(std::chrono::microseconds heartbeat_interval) {
if (heartbeat_interval.count() < 0) {
throw ignite_error(error::code::ILLEGAL_ARGUMENT, "Heartbeat interval can not be negative: "
+ std::to_string(heartbeat_interval.count()) + " microseconds");
}
m_heartbeat_interval = heartbeat_interval;
}
/**
* Gets the authenticator.
*
* @see Also see basic_authenticator.
*
* @return Authenticator
*/
[[nodiscard]] std::shared_ptr<ignite_client_authenticator> get_authenticator() const { return m_authenticator; }
/**
* Sets the authenticator.
*
* @param authenticator Authenticator. Do not use authentication if authenticator is @c nullptr.
*/
void set_authenticator(std::shared_ptr<ignite_client_authenticator> authenticator) {
m_authenticator = std::move(authenticator);
}
/**
* Get SSL mode.
*
* @see ssl_mode for details.
*
* @return SSL mode.
*/
[[nodiscard]] ssl_mode get_ssl_mode() const {
return m_ssl_mode;
}
/**
* Set SSL mode.
*
* @see ssl_mode for details.
*
* @param ssl_mode SSL mode.
*/
void set_ssl_mode(ssl_mode ssl_mode) {
m_ssl_mode = ssl_mode;
}
/**
* Get a file path to SSL certificate to use during a connection establishment.
*
* @return File path to SSL certificate.
*/
[[nodiscard]] const std::string& get_ssl_cert_file() const {
return m_ssl_cert_file;
}
/**
* Set file path to SSL certificate to use during a connection establishment.
*
* @param ssl_cert_file File path to SSL certificate.
*/
void set_ssl_cert_file(const std::string& ssl_cert_file) {
m_ssl_cert_file = ssl_cert_file;
}
/**
* Get a file path to the SSL private key to use during a connection establishment.
*
* @return File path to the SSL private key.
*/
[[nodiscard]] const std::string& get_ssl_key_file() const {
return m_ssl_key_file;
}
/**
* Set file path to the SSL private key to use during a connection establishment.
*
* @param ssl_key_file File path to the SSL private key.
*/
void set_ssl_key_file(const std::string& ssl_key_file) {
m_ssl_key_file = ssl_key_file;
}
/**
* Get a file path to SSL certificate authority to authenticate server certificate during a connection
* establishment.
*
* @return File path to SSL certificate authority.
*/
[[nodiscard]] const std::string& get_ssl_ca_file() const {
return m_ssl_ca_file;
}
/**
* Set file path to SSL certificate authority to authenticate server certificate during a connection
* establishment.
*
* @param ssl_ca_file File path to SSL certificate authority.
*/
void set_ssl_ca_file(const std::string& ssl_ca_file) {
m_ssl_ca_file = ssl_ca_file;
}
private:
/**
* Check that endpoints are not empty.
*
* @param endpoints Endpoint list.
*/
IGNITE_API static void check_endpoints_non_empty(const std::vector<std::string>& endpoints);
/** Endpoints. */
std::vector<std::string> m_endpoints{"localhost"};
/** Logger. */
std::shared_ptr<ignite_logger> m_logger{};
/** Authenticator. */
std::shared_ptr<ignite_client_authenticator> m_authenticator{};
/** Active connections limit. */
std::uint32_t m_connection_limit{0};
/** Heartbeat interval. */
std::chrono::microseconds m_heartbeat_interval{DEFAULT_HEARTBEAT_INTERVAL};
/** SSL Mode. */
ssl_mode m_ssl_mode{ssl_mode::DISABLE};
/** File path to SSL certificate. */
std::string m_ssl_cert_file;
/** File path to the SSL private key. */
std::string m_ssl_key_file;
/** File path to SSL certificate authority. */
std::string m_ssl_ca_file;
};
} // namespace ignite