blob: 1940c5a5c8c79b798aa4f6a2f96025dc8d21fad1 [file] [log] [blame]
#ifndef DRBDVOLUME_H
#define DRBDVOLUME_H
#include <new>
#include <cstdint>
#include <string>
#include <StateFlags.h>
#include <map_types.h>
// https://github.com/raltnoeder/cppdsaext
#include <dsaext.h>
#include <utils.h>
#include <exceptions.h>
class DrbdConnection;
class DrbdVolume : private StateFlags
{
public:
enum class disk_state : uint16_t
{
DISKLESS,
ATTACHING,
DETACHING,
FAILED,
NEGOTIATING,
INCONSISTENT,
OUTDATED,
UNKNOWN,
CONSISTENT,
UP_TO_DATE
};
enum class repl_state : uint16_t
{
OFF,
ESTABLISHED,
STARTING_SYNC_SOURCE,
STARTING_SYNC_TARGET,
WF_BITMAP_SOURCE,
WF_BITMAP_TARGET,
WF_SYNC_UUID,
SYNC_SOURCE,
SYNC_TARGET,
PAUSED_SYNC_SOURCE,
PAUSED_SYNC_TARGET,
VERIFY_SOURCE,
VERIFY_TARGET,
AHEAD,
BEHIND,
UNKNOWN
};
enum class client_state : uint16_t
{
ENABLED,
DISABLED,
UNKNOWN
};
static const std::string PROP_KEY_VOL_NR;
static const std::string PROP_KEY_MINOR;
static const std::string PROP_KEY_DISK;
static const std::string PROP_KEY_PEER_DISK;
static const std::string PROP_KEY_REPLICATION;
static const std::string PROP_KEY_CLIENT;
static const std::string PROP_KEY_PEER_CLIENT;
static const char* DS_LABEL_DISKLESS;
static const char* DS_LABEL_ATTACHING;
static const char* DS_LABEL_DETACHING;
static const char* DS_LABEL_FAILED;
static const char* DS_LABEL_NEGOTIATING;
static const char* DS_LABEL_INCONSISTENT;
static const char* DS_LABEL_OUTDATED;
static const char* DS_LABEL_UNKNOWN;
static const char* DS_LABEL_CONSISTENT;
static const char* DS_LABEL_UP_TO_DATE;
static const char* RS_LABEL_OFF;
static const char* RS_LABEL_ESTABLISHED;
static const char* RS_LABEL_STARTING_SYNC_SOURCE;
static const char* RS_LABEL_STARTING_SYNC_TARGET;
static const char* RS_LABEL_WF_BITMAP_SOURCE;
static const char* RS_LABEL_WF_BITMAP_TARGET;
static const char* RS_LABEL_WF_SYNC_UUID;
static const char* RS_LABEL_SYNC_SOURCE;
static const char* RS_LABEL_SYNC_TARGET;
static const char* RS_LABEL_PAUSED_SYNC_SOURCE;
static const char* RS_LABEL_PAUSED_SYNC_TARGET;
static const char* RS_LABEL_VERIFY_SOURCE;
static const char* RS_LABEL_VERIFY_TARGET;
static const char* RS_LABEL_AHEAD;
static const char* RS_LABEL_BEHIND;
static const char* RS_LABEL_UNKNOWN;
static const char* CS_LABEL_ENABLED;
static const char* CS_LABEL_DISABLED;
static const char* CS_LABEL_UNKNOWN;
explicit DrbdVolume(uint16_t volume_nr);
DrbdVolume(const DrbdVolume& orig) = delete;
DrbdVolume& operator=(const DrbdVolume& orig) = delete;
DrbdVolume(DrbdVolume&& orig) = delete;
DrbdVolume& operator=(DrbdVolume&& orig) = delete;
virtual ~DrbdVolume() noexcept override
{
}
virtual const uint16_t get_volume_nr() const;
virtual int32_t get_minor_nr() const;
// @throws EventMessageException
virtual void set_minor_nr(int32_t value);
// @throws EventMessageException
virtual void update(PropsMap& event_props);
virtual disk_state get_disk_state() const;
virtual const char* get_disk_state_label() const;
virtual repl_state get_replication_state() const;
virtual const char* get_replication_state_label() const;
virtual void set_connection(DrbdConnection* conn);
using StateFlags::has_mark_state;
using StateFlags::has_warn_state;
using StateFlags::has_alert_state;
using StateFlags::set_mark;
using StateFlags::set_warn;
using StateFlags::set_alert;
using StateFlags::get_state;
virtual void clear_state_flags() override;
virtual StateFlags::state update_state_flags() override;
virtual bool has_disk_alert();
virtual bool has_replication_warning();
virtual bool has_replication_alert();
// Creates (allocates and initializes) a new DrbdVolume object from a map of properties
//
// @param event_props Reference to the map of properties from a 'drbdsetup events2' line
// @return Pointer to a newly created DrbdVolume object
// @throws std::bad_alloc, EventMessageException
static DrbdVolume* new_from_props(PropsMap& event_props);
// @throws EventMessageException
static disk_state parse_disk_state(std::string& state_name);
// @throws EventMessageException
static repl_state parse_repl_state(std::string& state_name);
// @throws NumberFormatException
static uint16_t parse_volume_nr(std::string& value_str);
// @throws NumberFormatException
static int32_t parse_minor_nr(std::string& value_str);
// @throws EventMessageException
static client_state parse_client_state(std::string& value_str);
private:
const uint16_t vol_nr;
int32_t minor_nr {-1};
disk_state vol_disk_state;
repl_state vol_repl_state;
client_state vol_client_state;
DrbdConnection* connection {nullptr};
bool disk_alert {false};
bool repl_warn {false};
bool repl_alert {false};
};
#endif /* DRBDVOLUME_H */