#include "include/stringify.h"
#include "cls/rbd/cls_rbd.h"
#include "cls/rbd/cls_rbd_client.h"
+#include "cls/rbd/cls_rbd_types.h"
#include "gtest/gtest.h"
#include "test/librados/test.h"
#include <vector>
using namespace std;
-using ::librbd::cls_client::create_image;
-using ::librbd::cls_client::get_features;
-using ::librbd::cls_client::set_features;
-using ::librbd::cls_client::get_size;
-using ::librbd::cls_client::get_object_prefix;
-using ::librbd::cls_client::set_size;
-using ::librbd::cls_client::get_parent;
-using ::librbd::cls_client::set_parent;
-using ::librbd::cls_client::remove_parent;
-using ::librbd::cls_client::add_child;
-using ::librbd::cls_client::remove_child;
-using ::librbd::cls_client::get_children;
-using ::librbd::cls_client::get_snapcontext;
-using ::librbd::cls_client::snapshot_list;
-using ::librbd::cls_client::copyup;
-using ::librbd::cls_client::get_id;
-using ::librbd::cls_client::set_id;
-using ::librbd::cls_client::dir_get_id;
-using ::librbd::cls_client::dir_get_name;
-using ::librbd::cls_client::dir_list;
-using ::librbd::cls_client::dir_add_image;
-using ::librbd::cls_client::dir_remove_image;
-using ::librbd::cls_client::dir_rename_image;
+using namespace librbd::cls_client;
using ::librbd::parent_info;
using ::librbd::parent_spec;
-using ::librbd::cls_client::get_protection_status;
-using ::librbd::cls_client::set_protection_status;
-using ::librbd::cls_client::get_stripe_unit_count;
-using ::librbd::cls_client::set_stripe_unit_count;
-using ::librbd::cls_client::get_mutable_metadata;
-using ::librbd::cls_client::object_map_load;
-using ::librbd::cls_client::object_map_save;
-using ::librbd::cls_client::object_map_resize;
-using ::librbd::cls_client::object_map_update;
-using ::librbd::cls_client::object_map_snap_add;
-using ::librbd::cls_client::object_map_snap_remove;
-using ::librbd::cls_client::get_flags;
-using ::librbd::cls_client::set_flags;
-using ::librbd::cls_client::metadata_set;
-using ::librbd::cls_client::metadata_remove;
-using ::librbd::cls_client::metadata_list;
-using ::librbd::cls_client::metadata_get;
-using ::librbd::cls_client::snapshot_rename;
-
static int snapshot_add(librados::IoCtx *ioctx, const std::string &oid,
uint64_t snap_id, const std::string &snap_name) {
mask = RBD_FEATURE_LAYERING;
ASSERT_EQ(-EINVAL, set_features(&ioctx, oid, features, mask));
}
+
+TEST_F(TestClsRbd, mirror) {
+ librados::IoCtx ioctx;
+ ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
+
+ std::vector<cls::rbd::MirrorPeer> peers;
+ ASSERT_EQ(-ENOENT, mirror_peer_list(&ioctx, &peers));
+
+ ASSERT_EQ(-EINVAL, mirror_peer_add(&ioctx, "uuid1", "cluster1", "client"));
+
+ bool enabled;
+ ASSERT_EQ(0, mirror_is_enabled(&ioctx, &enabled));
+ ASSERT_FALSE(enabled);
+ ASSERT_EQ(0, mirror_set_enabled(&ioctx, true));
+ ASSERT_EQ(0, mirror_is_enabled(&ioctx, &enabled));
+ ASSERT_TRUE(enabled);
+
+ ASSERT_EQ(0, mirror_peer_add(&ioctx, "uuid1", "cluster1", "client"));
+ ASSERT_EQ(0, mirror_peer_add(&ioctx, "uuid2", "cluster2", "admin"));
+ ASSERT_EQ(-EEXIST, mirror_peer_add(&ioctx, "uuid2", "cluster3", "foo"));
+ ASSERT_EQ(-EEXIST, mirror_peer_add(&ioctx, "uuid3", "cluster1", "foo"));
+ ASSERT_EQ(0, mirror_peer_add(&ioctx, "uuid3", "cluster3", "admin"));
+
+ ASSERT_EQ(0, mirror_peer_list(&ioctx, &peers));
+ std::vector<cls::rbd::MirrorPeer> expected_peers = {
+ {"uuid1", "cluster1", "client"},
+ {"uuid2", "cluster2", "admin"},
+ {"uuid3", "cluster3", "admin"}};
+ ASSERT_EQ(expected_peers, peers);
+
+ ASSERT_EQ(0, mirror_peer_remove(&ioctx, "uuid4"));
+ ASSERT_EQ(0, mirror_peer_remove(&ioctx, "uuid2"));
+
+ ASSERT_EQ(-ENOENT, mirror_peer_set_client(&ioctx, "uuid4", "new client"));
+ ASSERT_EQ(0, mirror_peer_set_client(&ioctx, "uuid1", "new client"));
+
+ ASSERT_EQ(-ENOENT, mirror_peer_set_cluster(&ioctx, "uuid4", "new cluster"));
+ ASSERT_EQ(0, mirror_peer_set_cluster(&ioctx, "uuid3", "new cluster"));
+
+ ASSERT_EQ(0, mirror_peer_list(&ioctx, &peers));
+ expected_peers = {
+ {"uuid1", "cluster1", "new client"},
+ {"uuid3", "new cluster", "admin"}};
+ ASSERT_EQ(expected_peers, peers);
+ ASSERT_EQ(-EBUSY, mirror_set_enabled(&ioctx, false));
+
+ ASSERT_EQ(0, mirror_peer_remove(&ioctx, "uuid3"));
+ ASSERT_EQ(0, mirror_peer_remove(&ioctx, "uuid1"));
+ ASSERT_EQ(0, mirror_peer_list(&ioctx, &peers));
+ expected_peers = {};
+ ASSERT_EQ(expected_peers, peers);
+
+ ASSERT_EQ(0, mirror_set_enabled(&ioctx, false));
+ ASSERT_EQ(0, mirror_is_enabled(&ioctx, &enabled));
+ ASSERT_FALSE(enabled);
+}