1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "test/rbd_mirror/test_mock_fixture.h"
5 #include "cls/rbd/cls_rbd_types.h"
6 #include "librbd/journal/TypeTraits.h"
7 #include "librbd/mirror/GetInfoRequest.h"
8 #include "tools/rbd_mirror/Threads.h"
9 #include "tools/rbd_mirror/image_replayer/GetMirrorImageIdRequest.h"
10 #include "tools/rbd_mirror/image_replayer/PrepareRemoteImageRequest.h"
11 #include "tools/rbd_mirror/image_replayer/StateBuilder.h"
12 #include "tools/rbd_mirror/image_replayer/journal/StateBuilder.h"
13 #include "tools/rbd_mirror/image_replayer/snapshot/StateBuilder.h"
14 #include "test/journal/mock/MockJournaler.h"
15 #include "test/librados_test_stub/MockTestMemIoCtxImpl.h"
16 #include "test/librbd/mock/MockImageCtx.h"
22 struct MockTestImageCtx
: public librbd::MockImageCtx
{
23 MockTestImageCtx(librbd::ImageCtx
&image_ctx
)
24 : librbd::MockImageCtx(image_ctx
) {
28 } // anonymous namespace
33 struct TypeTraits
<MockTestImageCtx
> {
34 typedef ::journal::MockJournalerProxy Journaler
;
37 } // namespace journal
42 struct GetInfoRequest
<librbd::MockTestImageCtx
> {
43 static GetInfoRequest
* s_instance
;
44 cls::rbd::MirrorImage
*mirror_image
;
45 PromotionState
*promotion_state
;
46 std::string
*primary_mirror_uuid
;
47 Context
*on_finish
= nullptr;
49 static GetInfoRequest
* create(librados::IoCtx
& io_ctx
,
50 librbd::asio::ContextWQ
* context_wq
,
51 const std::string
& image_id
,
52 cls::rbd::MirrorImage
*mirror_image
,
53 PromotionState
*promotion_state
,
54 std::string
* primary_mirror_uuid
,
56 ceph_assert(s_instance
!= nullptr);
57 s_instance
->mirror_image
= mirror_image
;
58 s_instance
->promotion_state
= promotion_state
;
59 s_instance
->primary_mirror_uuid
= primary_mirror_uuid
;
60 s_instance
->on_finish
= on_finish
;
65 ceph_assert(s_instance
== nullptr);
72 MOCK_METHOD0(send
, void());
75 GetInfoRequest
<librbd::MockTestImageCtx
>* GetInfoRequest
<librbd::MockTestImageCtx
>::s_instance
= nullptr;
84 struct Threads
<librbd::MockTestImageCtx
> {
85 ceph::mutex
&timer_lock
;
87 librbd::asio::ContextWQ
*work_queue
;
89 Threads(Threads
<librbd::ImageCtx
> *threads
)
90 : timer_lock(threads
->timer_lock
), timer(threads
->timer
),
91 work_queue(threads
->work_queue
) {
95 namespace image_replayer
{
98 struct GetMirrorImageIdRequest
<librbd::MockTestImageCtx
> {
99 static GetMirrorImageIdRequest
* s_instance
;
100 std::string
* image_id
= nullptr;
101 Context
* on_finish
= nullptr;
103 static GetMirrorImageIdRequest
* create(librados::IoCtx
& io_ctx
,
104 const std::string
& global_image_id
,
105 std::string
* image_id
,
106 Context
* on_finish
) {
107 ceph_assert(s_instance
!= nullptr);
108 s_instance
->image_id
= image_id
;
109 s_instance
->on_finish
= on_finish
;
113 GetMirrorImageIdRequest() {
117 MOCK_METHOD0(send
, void());
121 struct StateBuilder
<librbd::MockTestImageCtx
> {
122 std::string local_image_id
;
123 librbd::mirror::PromotionState local_promotion_state
=
124 librbd::mirror::PROMOTION_STATE_NON_PRIMARY
;
125 std::string remote_image_id
;
126 std::string remote_mirror_uuid
;
127 librbd::mirror::PromotionState remote_promotion_state
;
129 virtual ~StateBuilder() {}
131 MOCK_CONST_METHOD0(get_mirror_image_mode
, cls::rbd::MirrorImageMode());
134 GetMirrorImageIdRequest
<librbd::MockTestImageCtx
>* GetMirrorImageIdRequest
<librbd::MockTestImageCtx
>::s_instance
= nullptr;
139 struct StateBuilder
<librbd::MockTestImageCtx
>
140 : public image_replayer::StateBuilder
<librbd::MockTestImageCtx
> {
141 static StateBuilder
* s_instance
;
143 cls::rbd::MirrorImageMode mirror_image_mode
=
144 cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
;
146 ::journal::MockJournalerProxy
* remote_journaler
= nullptr;
147 cls::journal::ClientState remote_client_state
;
148 librbd::journal::MirrorPeerClientMeta remote_client_meta
;
150 static StateBuilder
* create(const std::string
&) {
151 ceph_assert(s_instance
!= nullptr);
160 StateBuilder
<librbd::MockTestImageCtx
>* StateBuilder
<librbd::MockTestImageCtx
>::s_instance
= nullptr;
162 } // namespace journal
167 struct StateBuilder
<librbd::MockTestImageCtx
>
168 : public image_replayer::StateBuilder
<librbd::MockTestImageCtx
> {
169 static StateBuilder
* s_instance
;
171 cls::rbd::MirrorImageMode mirror_image_mode
=
172 cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT
;
174 std::string remote_mirror_peer_uuid
;
176 static StateBuilder
* create(const std::string
&) {
177 ceph_assert(s_instance
!= nullptr);
186 StateBuilder
<librbd::MockTestImageCtx
>* StateBuilder
<librbd::MockTestImageCtx
>::s_instance
= nullptr;
188 } // namespace snapshot
189 } // namespace image_replayer
190 } // namespace mirror
193 // template definitions
194 #include "tools/rbd_mirror/image_replayer/PrepareRemoteImageRequest.cc"
198 namespace image_replayer
{
201 using ::testing::DoAll
;
202 using ::testing::InSequence
;
203 using ::testing::Invoke
;
204 using ::testing::Return
;
205 using ::testing::StrEq
;
206 using ::testing::WithArg
;
208 class TestMockImageReplayerPrepareRemoteImageRequest
: public TestMockFixture
{
210 typedef Threads
<librbd::MockTestImageCtx
> MockThreads
;
211 typedef PrepareRemoteImageRequest
<librbd::MockTestImageCtx
> MockPrepareRemoteImageRequest
;
212 typedef GetMirrorImageIdRequest
<librbd::MockTestImageCtx
> MockGetMirrorImageIdRequest
;
213 typedef StateBuilder
<librbd::MockTestImageCtx
> MockStateBuilder
;
214 typedef journal::StateBuilder
<librbd::MockTestImageCtx
> MockJournalStateBuilder
;
215 typedef snapshot::StateBuilder
<librbd::MockTestImageCtx
> MockSnapshotStateBuilder
;
216 typedef librbd::mirror::GetInfoRequest
<librbd::MockTestImageCtx
> MockGetMirrorInfoRequest
;
218 void expect_get_mirror_image_mode(MockStateBuilder
& mock_state_builder
,
219 cls::rbd::MirrorImageMode mirror_image_mode
) {
220 EXPECT_CALL(mock_state_builder
, get_mirror_image_mode())
221 .WillOnce(Return(mirror_image_mode
));
224 void expect_get_mirror_image_id(MockGetMirrorImageIdRequest
& mock_get_mirror_image_id_request
,
225 const std::string
& image_id
, int r
) {
226 EXPECT_CALL(mock_get_mirror_image_id_request
, send())
227 .WillOnce(Invoke([&mock_get_mirror_image_id_request
, image_id
, r
]() {
228 *mock_get_mirror_image_id_request
.image_id
= image_id
;
229 mock_get_mirror_image_id_request
.on_finish
->complete(r
);
233 void expect_get_mirror_info(
234 MockGetMirrorInfoRequest
&mock_get_mirror_info_request
,
235 const cls::rbd::MirrorImage
&mirror_image
,
236 librbd::mirror::PromotionState promotion_state
,
237 const std::string
& primary_mirror_uuid
, int r
) {
238 EXPECT_CALL(mock_get_mirror_info_request
, send())
239 .WillOnce(Invoke([this, &mock_get_mirror_info_request
, mirror_image
,
240 promotion_state
, primary_mirror_uuid
, r
]() {
241 *mock_get_mirror_info_request
.mirror_image
= mirror_image
;
242 *mock_get_mirror_info_request
.promotion_state
= promotion_state
;
243 *mock_get_mirror_info_request
.primary_mirror_uuid
=
245 m_threads
->work_queue
->queue(
246 mock_get_mirror_info_request
.on_finish
, r
);
250 void expect_journaler_get_client(::journal::MockJournaler
&mock_journaler
,
251 const std::string
&client_id
,
252 cls::journal::Client
&client
, int r
) {
253 EXPECT_CALL(mock_journaler
, get_client(StrEq(client_id
), _
, _
))
254 .WillOnce(DoAll(WithArg
<1>(Invoke([client
](cls::journal::Client
*out_client
) {
255 *out_client
= client
;
257 WithArg
<2>(Invoke([this, r
](Context
*on_finish
) {
258 m_threads
->work_queue
->queue(on_finish
, r
);
262 void expect_journaler_register_client(::journal::MockJournaler
&mock_journaler
,
263 const librbd::journal::ClientData
&client_data
,
266 encode(client_data
, bl
);
268 EXPECT_CALL(mock_journaler
, register_client(ContentsEqual(bl
), _
))
269 .WillOnce(WithArg
<1>(Invoke([this, r
](Context
*on_finish
) {
270 m_threads
->work_queue
->queue(on_finish
, r
);
275 TEST_F(TestMockImageReplayerPrepareRemoteImageRequest
, SuccessJournal
) {
276 ::journal::MockJournaler mock_remote_journaler
;
277 MockThreads
mock_threads(m_threads
);
280 MockGetMirrorImageIdRequest mock_get_mirror_image_id_request
;
281 expect_get_mirror_image_id(mock_get_mirror_image_id_request
,
282 "remote image id", 0);
284 MockGetMirrorInfoRequest mock_get_mirror_info_request
;
285 expect_get_mirror_info(mock_get_mirror_info_request
,
286 {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
,
288 cls::rbd::MIRROR_IMAGE_STATE_ENABLED
},
289 librbd::mirror::PROMOTION_STATE_PRIMARY
,
290 "remote mirror uuid", 0);
292 EXPECT_CALL(mock_remote_journaler
, construct());
294 librbd::journal::MirrorPeerClientMeta mirror_peer_client_meta
;
295 mirror_peer_client_meta
.image_id
= "local image id";
296 mirror_peer_client_meta
.state
= librbd::journal::MIRROR_PEER_STATE_SYNCING
;
297 librbd::journal::ClientData client_data
{mirror_peer_client_meta
};
298 cls::journal::Client client
;
299 client
.state
= cls::journal::CLIENT_STATE_DISCONNECTED
;
300 encode(client_data
, client
.data
);
301 expect_journaler_get_client(mock_remote_journaler
, "local mirror uuid",
304 MockJournalStateBuilder mock_journal_state_builder
;
305 MockStateBuilder
* mock_state_builder
= nullptr;
307 auto req
= MockPrepareRemoteImageRequest::create(&mock_threads
,
312 {"remote mirror uuid", ""},
318 ASSERT_EQ(0, ctx
.wait());
319 ASSERT_TRUE(mock_state_builder
!= nullptr);
320 ASSERT_EQ(cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
,
321 mock_journal_state_builder
.mirror_image_mode
);
322 ASSERT_EQ(std::string("remote mirror uuid"),
323 mock_journal_state_builder
.remote_mirror_uuid
);
324 ASSERT_EQ(std::string("remote image id"),
325 mock_journal_state_builder
.remote_image_id
);
326 ASSERT_EQ(librbd::mirror::PROMOTION_STATE_PRIMARY
,
327 mock_journal_state_builder
.remote_promotion_state
);
328 ASSERT_TRUE(mock_journal_state_builder
.remote_journaler
!= nullptr);
329 ASSERT_EQ(cls::journal::CLIENT_STATE_DISCONNECTED
,
330 mock_journal_state_builder
.remote_client_state
);
333 TEST_F(TestMockImageReplayerPrepareRemoteImageRequest
, SuccessSnapshot
) {
334 MockThreads
mock_threads(m_threads
);
337 MockGetMirrorImageIdRequest mock_get_mirror_image_id_request
;
338 expect_get_mirror_image_id(mock_get_mirror_image_id_request
,
339 "remote image id", 0);
341 MockGetMirrorInfoRequest mock_get_mirror_info_request
;
342 expect_get_mirror_info(mock_get_mirror_info_request
,
343 {cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT
,
345 cls::rbd::MIRROR_IMAGE_STATE_ENABLED
},
346 librbd::mirror::PROMOTION_STATE_PRIMARY
,
347 "remote mirror uuid", 0);
349 MockSnapshotStateBuilder mock_snapshot_state_builder
;
350 MockStateBuilder
* mock_state_builder
= nullptr;
352 auto req
= MockPrepareRemoteImageRequest::create(&mock_threads
,
357 {"remote mirror uuid",
358 "remote mirror peer uuid"},
364 ASSERT_EQ(0, ctx
.wait());
365 ASSERT_TRUE(mock_state_builder
!= nullptr);
366 ASSERT_EQ(cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT
,
367 mock_snapshot_state_builder
.mirror_image_mode
);
368 ASSERT_EQ(std::string("remote mirror uuid"),
369 mock_snapshot_state_builder
.remote_mirror_uuid
);
370 ASSERT_EQ(std::string("remote mirror peer uuid"),
371 mock_snapshot_state_builder
.remote_mirror_peer_uuid
);
372 ASSERT_EQ(std::string("remote image id"),
373 mock_snapshot_state_builder
.remote_image_id
);
374 ASSERT_EQ(librbd::mirror::PROMOTION_STATE_PRIMARY
,
375 mock_snapshot_state_builder
.remote_promotion_state
);
378 TEST_F(TestMockImageReplayerPrepareRemoteImageRequest
, SuccessNotRegistered
) {
379 ::journal::MockJournaler mock_remote_journaler
;
380 MockThreads
mock_threads(m_threads
);
383 MockGetMirrorImageIdRequest mock_get_mirror_image_id_request
;
384 expect_get_mirror_image_id(mock_get_mirror_image_id_request
,
385 "remote image id", 0);
387 MockGetMirrorInfoRequest mock_get_mirror_info_request
;
388 expect_get_mirror_info(mock_get_mirror_info_request
,
389 {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
,
391 cls::rbd::MIRROR_IMAGE_STATE_ENABLED
},
392 librbd::mirror::PROMOTION_STATE_PRIMARY
,
393 "remote mirror uuid", 0);
395 MockJournalStateBuilder mock_journal_state_builder
;
396 expect_get_mirror_image_mode(mock_journal_state_builder
,
397 cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
);
399 EXPECT_CALL(mock_remote_journaler
, construct());
401 cls::journal::Client client
;
402 expect_journaler_get_client(mock_remote_journaler
, "local mirror uuid",
405 librbd::journal::MirrorPeerClientMeta mirror_peer_client_meta
;
406 mirror_peer_client_meta
.image_id
= "local image id";
407 mirror_peer_client_meta
.state
= librbd::journal::MIRROR_PEER_STATE_REPLAYING
;
408 librbd::journal::ClientData client_data
{mirror_peer_client_meta
};
409 expect_journaler_register_client(mock_remote_journaler
, client_data
, 0);
411 mock_journal_state_builder
.local_image_id
= "local image id";
412 MockStateBuilder
* mock_state_builder
= &mock_journal_state_builder
;
414 auto req
= MockPrepareRemoteImageRequest::create(&mock_threads
,
419 {"remote mirror uuid", ""},
425 ASSERT_EQ(0, ctx
.wait());
426 ASSERT_TRUE(mock_state_builder
!= nullptr);
427 ASSERT_EQ(std::string("remote image id"),
428 mock_journal_state_builder
.remote_image_id
);
429 ASSERT_EQ(librbd::mirror::PROMOTION_STATE_PRIMARY
,
430 mock_journal_state_builder
.remote_promotion_state
);
431 ASSERT_TRUE(mock_journal_state_builder
.remote_journaler
!= nullptr);
432 ASSERT_EQ(cls::journal::CLIENT_STATE_CONNECTED
,
433 mock_journal_state_builder
.remote_client_state
);
436 TEST_F(TestMockImageReplayerPrepareRemoteImageRequest
, GetMirrorImageIdError
) {
437 MockThreads
mock_threads(m_threads
);
440 MockGetMirrorImageIdRequest mock_get_mirror_image_id_request
;
441 expect_get_mirror_image_id(mock_get_mirror_image_id_request
, "", -EINVAL
);
443 MockJournalStateBuilder mock_journal_state_builder
;
444 MockStateBuilder
* mock_state_builder
= &mock_journal_state_builder
;
446 auto req
= MockPrepareRemoteImageRequest::create(&mock_threads
,
451 {"remote mirror uuid", ""},
457 ASSERT_EQ(-EINVAL
, ctx
.wait());
458 ASSERT_TRUE(mock_journal_state_builder
.remote_journaler
== nullptr);
461 TEST_F(TestMockImageReplayerPrepareRemoteImageRequest
, GetMirrorInfoError
) {
462 MockThreads
mock_threads(m_threads
);
465 MockGetMirrorImageIdRequest mock_get_mirror_image_id_request
;
466 expect_get_mirror_image_id(mock_get_mirror_image_id_request
,
467 "remote image id", 0);
469 MockGetMirrorInfoRequest mock_get_mirror_info_request
;
470 expect_get_mirror_info(mock_get_mirror_info_request
,
471 {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
,
473 cls::rbd::MIRROR_IMAGE_STATE_ENABLED
},
474 librbd::mirror::PROMOTION_STATE_PRIMARY
,
475 "remote mirror uuid", -EINVAL
);
477 MockJournalStateBuilder mock_journal_state_builder
;
478 MockStateBuilder
* mock_state_builder
= nullptr;
480 auto req
= MockPrepareRemoteImageRequest::create(&mock_threads
,
485 {"remote mirror uuid", ""},
491 ASSERT_EQ(-EINVAL
, ctx
.wait());
492 ASSERT_TRUE(mock_state_builder
== nullptr);
495 TEST_F(TestMockImageReplayerPrepareRemoteImageRequest
, GetClientError
) {
496 ::journal::MockJournaler mock_remote_journaler
;
497 MockThreads
mock_threads(m_threads
);
500 MockGetMirrorImageIdRequest mock_get_mirror_image_id_request
;
501 expect_get_mirror_image_id(mock_get_mirror_image_id_request
,
502 "remote image id", 0);
504 MockGetMirrorInfoRequest mock_get_mirror_info_request
;
505 expect_get_mirror_info(mock_get_mirror_info_request
,
506 {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
,
508 cls::rbd::MIRROR_IMAGE_STATE_ENABLED
},
509 librbd::mirror::PROMOTION_STATE_PRIMARY
,
510 "remote mirror uuid", 0);
512 EXPECT_CALL(mock_remote_journaler
, construct());
514 cls::journal::Client client
;
515 expect_journaler_get_client(mock_remote_journaler
, "local mirror uuid",
518 MockJournalStateBuilder mock_journal_state_builder
;
519 MockStateBuilder
* mock_state_builder
= nullptr;
521 auto req
= MockPrepareRemoteImageRequest::create(&mock_threads
,
526 {"remote mirror uuid", ""},
532 ASSERT_EQ(-EINVAL
, ctx
.wait());
533 ASSERT_TRUE(mock_state_builder
== nullptr);
536 TEST_F(TestMockImageReplayerPrepareRemoteImageRequest
, RegisterClientError
) {
537 ::journal::MockJournaler mock_remote_journaler
;
538 MockThreads
mock_threads(m_threads
);
541 MockGetMirrorImageIdRequest mock_get_mirror_image_id_request
;
542 expect_get_mirror_image_id(mock_get_mirror_image_id_request
,
543 "remote image id", 0);
545 MockGetMirrorInfoRequest mock_get_mirror_info_request
;
546 expect_get_mirror_info(mock_get_mirror_info_request
,
547 {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
,
549 cls::rbd::MIRROR_IMAGE_STATE_ENABLED
},
550 librbd::mirror::PROMOTION_STATE_PRIMARY
,
551 "remote mirror uuid", 0);
553 MockJournalStateBuilder mock_journal_state_builder
;
554 expect_get_mirror_image_mode(mock_journal_state_builder
,
555 cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
);
557 EXPECT_CALL(mock_remote_journaler
, construct());
559 cls::journal::Client client
;
560 expect_journaler_get_client(mock_remote_journaler
, "local mirror uuid",
563 librbd::journal::MirrorPeerClientMeta mirror_peer_client_meta
;
564 mirror_peer_client_meta
.image_id
= "local image id";
565 mirror_peer_client_meta
.state
= librbd::journal::MIRROR_PEER_STATE_REPLAYING
;
566 librbd::journal::ClientData client_data
{mirror_peer_client_meta
};
567 expect_journaler_register_client(mock_remote_journaler
, client_data
, -EINVAL
);
569 mock_journal_state_builder
.local_image_id
= "local image id";
570 MockStateBuilder
* mock_state_builder
= &mock_journal_state_builder
;
572 auto req
= MockPrepareRemoteImageRequest::create(&mock_threads
,
577 {"remote mirror uuid", ""},
583 ASSERT_EQ(-EINVAL
, ctx
.wait());
586 TEST_F(TestMockImageReplayerPrepareRemoteImageRequest
, MirrorImageIdDNEJournal
) {
587 MockThreads
mock_threads(m_threads
);
590 MockGetMirrorImageIdRequest mock_get_mirror_image_id_request
;
591 expect_get_mirror_image_id(mock_get_mirror_image_id_request
, "", -ENOENT
);
593 MockJournalStateBuilder mock_journal_state_builder
;
594 MockStateBuilder
* mock_state_builder
= &mock_journal_state_builder
;
596 auto req
= MockPrepareRemoteImageRequest::create(&mock_threads
,
601 {"remote mirror uuid", ""},
607 ASSERT_EQ(-ENOENT
, ctx
.wait());
608 ASSERT_EQ(cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
,
609 mock_journal_state_builder
.mirror_image_mode
);
610 ASSERT_EQ("remote mirror uuid",
611 mock_journal_state_builder
.remote_mirror_uuid
);
612 ASSERT_EQ("", mock_journal_state_builder
.remote_image_id
);
615 TEST_F(TestMockImageReplayerPrepareRemoteImageRequest
, MirrorImageIdDNESnapshot
) {
616 MockThreads
mock_threads(m_threads
);
619 MockGetMirrorImageIdRequest mock_get_mirror_image_id_request
;
620 expect_get_mirror_image_id(mock_get_mirror_image_id_request
, "", -ENOENT
);
622 MockSnapshotStateBuilder mock_snapshot_state_builder
;
623 MockStateBuilder
* mock_state_builder
= &mock_snapshot_state_builder
;
625 auto req
= MockPrepareRemoteImageRequest::create(&mock_threads
,
630 {"remote mirror uuid",
631 "remote mirror peer uuid"},
637 ASSERT_EQ(-ENOENT
, ctx
.wait());
638 ASSERT_EQ(cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT
,
639 mock_snapshot_state_builder
.mirror_image_mode
);
640 ASSERT_EQ("remote mirror uuid",
641 mock_snapshot_state_builder
.remote_mirror_uuid
);
642 ASSERT_EQ("remote mirror peer uuid",
643 mock_snapshot_state_builder
.remote_mirror_peer_uuid
);
644 ASSERT_EQ("", mock_snapshot_state_builder
.remote_image_id
);
647 TEST_F(TestMockImageReplayerPrepareRemoteImageRequest
, MirrorInfoDNEJournal
) {
648 MockThreads
mock_threads(m_threads
);
651 MockGetMirrorImageIdRequest mock_get_mirror_image_id_request
;
652 expect_get_mirror_image_id(mock_get_mirror_image_id_request
,
653 "remote image id", 0);
655 MockGetMirrorInfoRequest mock_get_mirror_info_request
;
656 expect_get_mirror_info(mock_get_mirror_info_request
,
657 {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
,
659 cls::rbd::MIRROR_IMAGE_STATE_ENABLED
},
660 librbd::mirror::PROMOTION_STATE_PRIMARY
,
661 "remote mirror uuid", -ENOENT
);
663 MockJournalStateBuilder mock_journal_state_builder
;
664 MockStateBuilder
* mock_state_builder
= &mock_journal_state_builder
;
666 auto req
= MockPrepareRemoteImageRequest::create(&mock_threads
,
671 {"remote mirror uuid", ""},
677 ASSERT_EQ(-ENOENT
, ctx
.wait());
678 ASSERT_EQ(cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
,
679 mock_journal_state_builder
.mirror_image_mode
);
680 ASSERT_EQ("remote mirror uuid",
681 mock_journal_state_builder
.remote_mirror_uuid
);
682 ASSERT_EQ("", mock_journal_state_builder
.remote_image_id
);
685 TEST_F(TestMockImageReplayerPrepareRemoteImageRequest
, MirrorInfoDNESnapshot
) {
686 MockThreads
mock_threads(m_threads
);
689 MockGetMirrorImageIdRequest mock_get_mirror_image_id_request
;
690 expect_get_mirror_image_id(mock_get_mirror_image_id_request
,
691 "remote image id", 0);
693 MockGetMirrorInfoRequest mock_get_mirror_info_request
;
694 expect_get_mirror_info(mock_get_mirror_info_request
,
695 {cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT
,
697 cls::rbd::MIRROR_IMAGE_STATE_ENABLED
},
698 librbd::mirror::PROMOTION_STATE_PRIMARY
,
699 "remote mirror uuid", -ENOENT
);
701 MockSnapshotStateBuilder mock_snapshot_state_builder
;
702 MockStateBuilder
* mock_state_builder
= &mock_snapshot_state_builder
;
704 auto req
= MockPrepareRemoteImageRequest::create(&mock_threads
,
709 {"remote mirror uuid",
710 "remote mirror peer uuid"},
716 ASSERT_EQ(-ENOENT
, ctx
.wait());
717 ASSERT_EQ(cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT
,
718 mock_snapshot_state_builder
.mirror_image_mode
);
719 ASSERT_EQ("remote mirror uuid",
720 mock_snapshot_state_builder
.remote_mirror_uuid
);
721 ASSERT_EQ("remote mirror peer uuid",
722 mock_snapshot_state_builder
.remote_mirror_peer_uuid
);
723 ASSERT_EQ("", mock_snapshot_state_builder
.remote_image_id
);
726 TEST_F(TestMockImageReplayerPrepareRemoteImageRequest
, MirrorInfoDisablingJournal
) {
727 MockThreads
mock_threads(m_threads
);
730 MockGetMirrorImageIdRequest mock_get_mirror_image_id_request
;
731 expect_get_mirror_image_id(mock_get_mirror_image_id_request
,
732 "remote image id", 0);
734 MockGetMirrorInfoRequest mock_get_mirror_info_request
;
735 expect_get_mirror_info(mock_get_mirror_info_request
,
736 {cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
,
738 cls::rbd::MIRROR_IMAGE_STATE_DISABLING
},
739 librbd::mirror::PROMOTION_STATE_PRIMARY
,
740 "remote mirror uuid", 0);
742 MockJournalStateBuilder mock_journal_state_builder
;
743 expect_get_mirror_image_mode(mock_journal_state_builder
,
744 cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
);
745 MockStateBuilder
* mock_state_builder
= &mock_journal_state_builder
;
747 auto req
= MockPrepareRemoteImageRequest::create(&mock_threads
,
752 {"remote mirror uuid", ""},
758 ASSERT_EQ(-ENOENT
, ctx
.wait());
759 ASSERT_EQ(cls::rbd::MIRROR_IMAGE_MODE_JOURNAL
,
760 mock_journal_state_builder
.mirror_image_mode
);
761 ASSERT_EQ("remote mirror uuid",
762 mock_journal_state_builder
.remote_mirror_uuid
);
763 ASSERT_EQ("", mock_journal_state_builder
.remote_image_id
);
766 TEST_F(TestMockImageReplayerPrepareRemoteImageRequest
, MirrorInfoDisablingSnapshot
) {
767 MockThreads
mock_threads(m_threads
);
770 MockGetMirrorImageIdRequest mock_get_mirror_image_id_request
;
771 expect_get_mirror_image_id(mock_get_mirror_image_id_request
,
772 "remote image id", 0);
774 MockGetMirrorInfoRequest mock_get_mirror_info_request
;
775 expect_get_mirror_info(mock_get_mirror_info_request
,
776 {cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT
,
778 cls::rbd::MIRROR_IMAGE_STATE_DISABLING
},
779 librbd::mirror::PROMOTION_STATE_PRIMARY
,
780 "remote mirror uuid", 0);
782 MockSnapshotStateBuilder mock_snapshot_state_builder
;
783 expect_get_mirror_image_mode(mock_snapshot_state_builder
,
784 cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT
);
785 MockStateBuilder
* mock_state_builder
= &mock_snapshot_state_builder
;
787 auto req
= MockPrepareRemoteImageRequest::create(&mock_threads
,
792 {"remote mirror uuid",
793 "remote mirror peer uuid"},
799 ASSERT_EQ(-ENOENT
, ctx
.wait());
800 ASSERT_EQ(cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT
,
801 mock_snapshot_state_builder
.mirror_image_mode
);
802 ASSERT_EQ("remote mirror uuid",
803 mock_snapshot_state_builder
.remote_mirror_uuid
);
804 ASSERT_EQ("remote mirror peer uuid",
805 mock_snapshot_state_builder
.remote_mirror_peer_uuid
);
806 ASSERT_EQ("", mock_snapshot_state_builder
.remote_image_id
);
809 } // namespace image_replayer
810 } // namespace mirror