]> git.proxmox.com Git - ceph.git/blob - ceph/src/test/librbd/test_Trash.cc
import quincy beta 17.1.0
[ceph.git] / ceph / src / test / librbd / test_Trash.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
4 #include "cls/rbd/cls_rbd_client.h"
5 #include "cls/rbd/cls_rbd_types.h"
6 #include "test/librbd/test_fixture.h"
7 #include "test/librbd/test_support.h"
8 #include "librbd/api/Trash.h"
9 #include <set>
10 #include <vector>
11
12 void register_test_trash() {
13 }
14
15 namespace librbd {
16
17 static bool operator==(const trash_image_info_t& lhs,
18 const trash_image_info_t& rhs) {
19 return (lhs.id == rhs.id &&
20 lhs.name == rhs.name &&
21 lhs.source == rhs.source);
22 }
23
24 static bool operator==(const image_spec_t& lhs,
25 const image_spec_t& rhs) {
26 return (lhs.id == rhs.id && lhs.name == rhs.name);
27 }
28
29 class TestTrash : public TestFixture {
30 public:
31
32 TestTrash() {}
33 };
34
35 TEST_F(TestTrash, UserRemovingSource) {
36 REQUIRE_FORMAT_V2();
37
38 auto compare_lambda = [](const trash_image_info_t& lhs,
39 const trash_image_info_t& rhs) {
40 if (lhs.id != rhs.id) {
41 return lhs.id < rhs.id;
42 } else if (lhs.name != rhs.name) {
43 return lhs.name < rhs.name;
44 }
45 return lhs.source < rhs.source;
46 };
47 typedef std::set<trash_image_info_t, decltype(compare_lambda)> TrashEntries;
48
49 librbd::RBD rbd;
50 librbd::Image image;
51 auto image_name1 = m_image_name;
52 std::string image_id1;
53 ASSERT_EQ(0, rbd.open(m_ioctx, image, image_name1.c_str()));
54 ASSERT_EQ(0, image.get_id(&image_id1));
55 ASSERT_EQ(0, image.close());
56
57 auto image_name2 = get_temp_image_name();
58 ASSERT_EQ(0, create_image_pp(m_rbd, m_ioctx, image_name2, m_image_size));
59
60 std::string image_id2;
61 ASSERT_EQ(0, rbd.open(m_ioctx, image, image_name2.c_str()));
62 ASSERT_EQ(0, image.get_id(&image_id2));
63 ASSERT_EQ(0, image.close());
64
65 ASSERT_EQ(0, api::Trash<>::move(m_ioctx, RBD_TRASH_IMAGE_SOURCE_USER,
66 image_name1, image_id1, 0));
67 ASSERT_EQ(0, api::Trash<>::move(m_ioctx, RBD_TRASH_IMAGE_SOURCE_REMOVING,
68 image_name2, image_id2, 0));
69
70 TrashEntries trash_entries{compare_lambda};
71 TrashEntries expected_trash_entries{compare_lambda};
72
73 std::vector<trash_image_info_t> entries;
74 ASSERT_EQ(0, api::Trash<>::list(m_ioctx, entries, true));
75 trash_entries.insert(entries.begin(), entries.end());
76
77 expected_trash_entries = {
78 {.id = image_id1,
79 .name = image_name1,
80 .source = RBD_TRASH_IMAGE_SOURCE_USER},
81 };
82 ASSERT_EQ(expected_trash_entries, trash_entries);
83
84 std::vector<image_spec_t> expected_images = {
85 {.id = image_id2, .name = image_name2}
86 };
87 std::vector<image_spec_t> images;
88 ASSERT_EQ(0, rbd.list2(m_ioctx, &images));
89 ASSERT_EQ(expected_images, images);
90 }
91
92 TEST_F(TestTrash, RestoreMirroringSource) {
93 REQUIRE_FORMAT_V2();
94
95 librbd::RBD rbd;
96 librbd::Image image;
97 std::string image_id;
98 ASSERT_EQ(0, rbd.open(m_ioctx, image, m_image_name.c_str()));
99 ASSERT_EQ(0, image.get_id(&image_id));
100 ASSERT_EQ(0, image.close());
101
102 ASSERT_EQ(0, api::Trash<>::move(m_ioctx, RBD_TRASH_IMAGE_SOURCE_MIRRORING,
103 m_image_name, 0));
104 ASSERT_EQ(0, rbd.trash_restore(m_ioctx, image_id.c_str(),
105 m_image_name.c_str()));
106 }
107
108 } // namespace librbd