1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "cls/rbd/cls_rbd_types.h"
5 #include "test/rbd_mirror/test_fixture.h"
6 #include "include/stringify.h"
7 #include "include/rbd/librbd.hpp"
8 #include "librbd/ImageCtx.h"
9 #include "librbd/ImageState.h"
10 #include "librbd/Operations.h"
11 #include "librbd/internal.h"
12 #include "test/librados/test_cxx.h"
13 #include "tools/rbd_mirror/Threads.h"
18 std::string
TestFixture::_local_pool_name
;
19 std::string
TestFixture::_remote_pool_name
;
20 std::shared_ptr
<librados::Rados
> TestFixture::_rados
;
21 uint64_t TestFixture::_image_number
= 0;
22 std::string
TestFixture::_data_pool
;
24 TestFixture::TestFixture() {
27 void TestFixture::SetUpTestCase() {
28 _rados
= std::shared_ptr
<librados::Rados
>(new librados::Rados());
29 ASSERT_EQ("", connect_cluster_pp(*_rados
.get()));
30 ASSERT_EQ(0, _rados
->conf_set("rbd_cache", "false"));
32 _local_pool_name
= get_temp_pool_name("test-rbd-mirror-");
33 ASSERT_EQ(0, _rados
->pool_create(_local_pool_name
.c_str()));
35 librados::IoCtx local_ioctx
;
36 ASSERT_EQ(0, _rados
->ioctx_create(_local_pool_name
.c_str(), local_ioctx
));
37 local_ioctx
.application_enable("rbd", true);
39 _remote_pool_name
= get_temp_pool_name("test-rbd-mirror-");
40 ASSERT_EQ(0, _rados
->pool_create(_remote_pool_name
.c_str()));
42 librados::IoCtx remote_ioctx
;
43 ASSERT_EQ(0, _rados
->ioctx_create(_remote_pool_name
.c_str(), remote_ioctx
));
44 remote_ioctx
.application_enable("rbd", true);
46 ASSERT_EQ(0, create_image_data_pool(_data_pool
));
47 if (!_data_pool
.empty()) {
48 printf("using image data pool: %s\n", _data_pool
.c_str());
52 void TestFixture::TearDownTestCase() {
53 if (!_data_pool
.empty()) {
54 ASSERT_EQ(0, _rados
->pool_delete(_data_pool
.c_str()));
57 ASSERT_EQ(0, _rados
->pool_delete(_remote_pool_name
.c_str()));
58 ASSERT_EQ(0, _rados
->pool_delete(_local_pool_name
.c_str()));
62 void TestFixture::SetUp() {
63 static bool seeded
= false;
67 std::cout
<< "seed " << seed
<< std::endl
;
71 ASSERT_EQ(0, _rados
->ioctx_create(_local_pool_name
.c_str(), m_local_io_ctx
));
72 ASSERT_EQ(0, _rados
->ioctx_create(_remote_pool_name
.c_str(), m_remote_io_ctx
));
73 m_image_name
= get_temp_image_name();
75 m_threads
= new rbd::mirror::Threads
<>(_rados
);
78 void TestFixture::TearDown() {
79 for (auto image_ctx
: m_image_ctxs
) {
80 image_ctx
->state
->close();
83 m_remote_io_ctx
.close();
84 m_local_io_ctx
.close();
89 int TestFixture::create_image(librbd::RBD
&rbd
, librados::IoCtx
&ioctx
,
90 const std::string
&name
, uint64_t size
) {
92 return rbd
.create2(ioctx
, name
.c_str(), size
, RBD_FEATURES_ALL
, &order
);
95 int TestFixture::open_image(librados::IoCtx
&io_ctx
,
96 const std::string
&image_name
,
97 librbd::ImageCtx
**image_ctx
) {
98 *image_ctx
= new librbd::ImageCtx(image_name
.c_str(), "", nullptr, io_ctx
,
100 m_image_ctxs
.insert(*image_ctx
);
101 return (*image_ctx
)->state
->open(0);
104 int TestFixture::create_snap(librbd::ImageCtx
*image_ctx
, const char* snap_name
,
105 librados::snap_t
*snap_id
) {
106 librbd::NoOpProgressContext prog_ctx
;
107 int r
= image_ctx
->operations
->snap_create(cls::rbd::UserSnapshotNamespace(),
108 snap_name
, 0, prog_ctx
);
113 r
= image_ctx
->state
->refresh();
118 if (image_ctx
->snap_ids
.count({cls::rbd::UserSnapshotNamespace(),
123 if (snap_id
!= nullptr) {
124 *snap_id
= image_ctx
->snap_ids
[{cls::rbd::UserSnapshotNamespace(),
130 std::string
TestFixture::get_temp_image_name() {
132 return "image" + stringify(_image_number
);
135 int TestFixture::create_image_data_pool(std::string
&data_pool
) {
137 int r
= _rados
->conf_get("rbd_default_data_pool", pool
);
140 } else if (pool
.empty()) {
144 r
= _rados
->pool_create(pool
.c_str());
149 librados::IoCtx data_ioctx
;
150 r
= _rados
->ioctx_create(pool
.c_str(), data_ioctx
);
155 data_ioctx
.application_enable("rbd", true);
160 } // namespace mirror