]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/rbd_mirror/test_fixture.cc
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 "test/librados/test_cxx.h"
12 #include "tools/rbd_mirror/Threads.h"
17 std::string
TestFixture::_local_pool_name
;
18 std::string
TestFixture::_remote_pool_name
;
19 std::shared_ptr
<librados::Rados
> TestFixture::_rados
;
20 uint64_t TestFixture::_image_number
= 0;
21 std::string
TestFixture::_data_pool
;
23 TestFixture::TestFixture() {
26 void TestFixture::SetUpTestCase() {
27 _rados
= std::shared_ptr
<librados::Rados
>(new librados::Rados());
28 ASSERT_EQ("", connect_cluster_pp(*_rados
.get()));
29 ASSERT_EQ(0, _rados
->conf_set("rbd_cache", "false"));
31 _local_pool_name
= get_temp_pool_name("test-rbd-mirror-");
32 ASSERT_EQ(0, _rados
->pool_create(_local_pool_name
.c_str()));
34 librados::IoCtx local_ioctx
;
35 ASSERT_EQ(0, _rados
->ioctx_create(_local_pool_name
.c_str(), local_ioctx
));
36 local_ioctx
.application_enable("rbd", true);
38 _remote_pool_name
= get_temp_pool_name("test-rbd-mirror-");
39 ASSERT_EQ(0, _rados
->pool_create(_remote_pool_name
.c_str()));
41 librados::IoCtx remote_ioctx
;
42 ASSERT_EQ(0, _rados
->ioctx_create(_remote_pool_name
.c_str(), remote_ioctx
));
43 remote_ioctx
.application_enable("rbd", true);
45 ASSERT_EQ(0, create_image_data_pool(_data_pool
));
46 if (!_data_pool
.empty()) {
47 printf("using image data pool: %s\n", _data_pool
.c_str());
51 void TestFixture::TearDownTestCase() {
52 if (!_data_pool
.empty()) {
53 ASSERT_EQ(0, _rados
->pool_delete(_data_pool
.c_str()));
56 ASSERT_EQ(0, _rados
->pool_delete(_remote_pool_name
.c_str()));
57 ASSERT_EQ(0, _rados
->pool_delete(_local_pool_name
.c_str()));
61 void TestFixture::SetUp() {
62 static bool seeded
= false;
66 cout
<< "seed " << seed
<< std::endl
;
70 ASSERT_EQ(0, _rados
->ioctx_create(_local_pool_name
.c_str(), m_local_io_ctx
));
71 ASSERT_EQ(0, _rados
->ioctx_create(_remote_pool_name
.c_str(), m_remote_io_ctx
));
72 m_image_name
= get_temp_image_name();
74 m_threads
= new rbd::mirror::Threads
<>(reinterpret_cast<CephContext
*>(
75 m_local_io_ctx
.cct()));
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 int r
= image_ctx
->operations
->snap_create(cls::rbd::UserSnapshotNamespace(),
112 r
= image_ctx
->state
->refresh();
117 if (image_ctx
->snap_ids
.count({cls::rbd::UserSnapshotNamespace(),
122 if (snap_id
!= nullptr) {
123 *snap_id
= image_ctx
->snap_ids
[{cls::rbd::UserSnapshotNamespace(),
129 std::string
TestFixture::get_temp_image_name() {
131 return "image" + stringify(_image_number
);
134 int TestFixture::create_image_data_pool(std::string
&data_pool
) {
136 int r
= _rados
->conf_get("rbd_default_data_pool", pool
);
139 } else if (pool
.empty()) {
143 r
= _rados
->pool_create(pool
.c_str());
148 librados::IoCtx data_ioctx
;
149 r
= _rados
->ioctx_create(pool
.c_str(), data_ioctx
);
154 data_ioctx
.application_enable("rbd", true);
159 } // namespace mirror