From: Pan Liu Date: Sat, 28 Jan 2017 16:44:48 +0000 (+0800) Subject: test: Add unit test for getting rbd snapshot timestamp info X-Git-Tag: v12.0.0~57^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bd4e36632af7d2cd9274b5e098928bb8a41d19b6;p=ceph.git test: Add unit test for getting rbd snapshot timestamp info Signed-off-by: Pan Liu --- diff --git a/src/test/cls_rbd/test_cls_rbd.cc b/src/test/cls_rbd/test_cls_rbd.cc index 30f51202bda..fc1b30fa0aa 100644 --- a/src/test/cls_rbd/test_cls_rbd.cc +++ b/src/test/cls_rbd/test_cls_rbd.cc @@ -783,16 +783,19 @@ TEST_F(TestClsRbd, snapshots) SnapContext snapc; vector parents; vector protection_status; + vector snap_timestamps; ASSERT_EQ(0, get_snapcontext(&ioctx, oid, &snapc)); ASSERT_EQ(0u, snapc.snaps.size()); ASSERT_EQ(0u, snapc.seq); ASSERT_EQ(0, snapshot_list(&ioctx, oid, snapc.snaps, &snap_names, &snap_sizes, &parents, &protection_status)); - ASSERT_EQ(0, snap_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); + ASSERT_EQ(0, snapshot_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); ASSERT_EQ(0u, snap_names.size()); ASSERT_EQ(0u, snap_namespaces.size()); ASSERT_EQ(0u, snap_sizes.size()); + ASSERT_EQ(0, snapshot_timestamp_list(&ioctx, oid, snapc.snaps, &snap_timestamps)); + ASSERT_EQ(0u, snap_timestamps.size()); ASSERT_EQ(0, snapshot_add(&ioctx, oid, 0, "snap1")); ASSERT_EQ(0, get_snapcontext(&ioctx, oid, &snapc)); @@ -801,12 +804,14 @@ TEST_F(TestClsRbd, snapshots) ASSERT_EQ(0u, snapc.seq); ASSERT_EQ(0, snapshot_list(&ioctx, oid, snapc.snaps, &snap_names, &snap_sizes, &parents, &protection_status)); - ASSERT_EQ(0, snap_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); + ASSERT_EQ(0, snapshot_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); ASSERT_EQ(1u, snap_names.size()); ASSERT_EQ("snap1", snap_names[0]); ASSERT_EQ(1u, snap_namespaces.size()); ASSERT_EQ(userSnapNamespace, snap_namespaces[0]); ASSERT_EQ(10u, snap_sizes[0]); + ASSERT_EQ(0, snapshot_timestamp_list(&ioctx, oid, snapc.snaps, &snap_timestamps)); + ASSERT_EQ(1u, snap_timestamps.size()); // snap with same id and name ASSERT_EQ(-EEXIST, snapshot_add(&ioctx, oid, 0, "snap1")); @@ -816,12 +821,15 @@ TEST_F(TestClsRbd, snapshots) ASSERT_EQ(0u, snapc.seq); ASSERT_EQ(0, snapshot_list(&ioctx, oid, snapc.snaps, &snap_names, &snap_sizes, &parents, &protection_status)); - ASSERT_EQ(0, snap_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); + ASSERT_EQ(0, snapshot_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); ASSERT_EQ(1u, snap_names.size()); ASSERT_EQ("snap1", snap_names[0]); ASSERT_EQ(1u, snap_namespaces.size()); ASSERT_EQ(userSnapNamespace, snap_namespaces[0]); ASSERT_EQ(10u, snap_sizes[0]); + ASSERT_EQ(0, snapshot_timestamp_list(&ioctx, oid, snapc.snaps, &snap_timestamps)); + ASSERT_EQ(1u, snap_timestamps.size()); + // snap with same id, different name ASSERT_EQ(-EEXIST, snapshot_add(&ioctx, oid, 0, "snap2")); @@ -831,12 +839,14 @@ TEST_F(TestClsRbd, snapshots) ASSERT_EQ(0u, snapc.seq); ASSERT_EQ(0, snapshot_list(&ioctx, oid, snapc.snaps, &snap_names, &snap_sizes, &parents, &protection_status)); - ASSERT_EQ(0, snap_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); + ASSERT_EQ(0, snapshot_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); ASSERT_EQ(1u, snap_names.size()); ASSERT_EQ("snap1", snap_names[0]); ASSERT_EQ(1u, snap_namespaces.size()); ASSERT_EQ(userSnapNamespace, snap_namespaces[0]); ASSERT_EQ(10u, snap_sizes[0]); + ASSERT_EQ(0, snapshot_timestamp_list(&ioctx, oid, snapc.snaps, &snap_timestamps)); + ASSERT_EQ(1u, snap_timestamps.size()); // snap with different id, same name ASSERT_EQ(-EEXIST, snapshot_add(&ioctx, oid, 1, "snap1")); @@ -846,12 +856,14 @@ TEST_F(TestClsRbd, snapshots) ASSERT_EQ(0u, snapc.seq); ASSERT_EQ(0, snapshot_list(&ioctx, oid, snapc.snaps, &snap_names, &snap_sizes, &parents, &protection_status)); - ASSERT_EQ(0, snap_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); + ASSERT_EQ(0, snapshot_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); ASSERT_EQ(snap_names.size(), 1u); ASSERT_EQ(snap_names[0], "snap1"); ASSERT_EQ(1u, snap_namespaces.size()); ASSERT_EQ(userSnapNamespace, snap_namespaces[0]); ASSERT_EQ(snap_sizes[0], 10u); + ASSERT_EQ(0, snapshot_timestamp_list(&ioctx, oid, snapc.snaps, &snap_timestamps)); + ASSERT_EQ(1u, snap_timestamps.size()); // snap with different id, different name ASSERT_EQ(0, snapshot_add(&ioctx, oid, 1, "snap2")); @@ -862,7 +874,7 @@ TEST_F(TestClsRbd, snapshots) ASSERT_EQ(1u, snapc.seq); ASSERT_EQ(0, snapshot_list(&ioctx, oid, snapc.snaps, &snap_names, &snap_sizes, &parents, &protection_status)); - ASSERT_EQ(0, snap_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); + ASSERT_EQ(0, snapshot_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); ASSERT_EQ(2u, snap_names.size()); ASSERT_EQ(2u, snap_namespaces.size()); ASSERT_EQ("snap2", snap_names[0]); @@ -871,11 +883,13 @@ TEST_F(TestClsRbd, snapshots) ASSERT_EQ("snap1", snap_names[1]); ASSERT_EQ(userSnapNamespace, snap_namespaces[1]); ASSERT_EQ(10u, snap_sizes[1]); + ASSERT_EQ(0, snapshot_timestamp_list(&ioctx, oid, snapc.snaps, &snap_timestamps)); + ASSERT_EQ(2u, snap_timestamps.size()); ASSERT_EQ(0, snapshot_rename(&ioctx, oid, 0, "snap1-rename")); ASSERT_EQ(0, snapshot_list(&ioctx, oid, snapc.snaps, &snap_names, &snap_sizes, &parents, &protection_status)); - ASSERT_EQ(0, snap_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); + ASSERT_EQ(0, snapshot_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); ASSERT_EQ(2u, snap_names.size()); ASSERT_EQ(2u, snap_namespaces.size()); ASSERT_EQ("snap2", snap_names[0]); @@ -884,6 +898,9 @@ TEST_F(TestClsRbd, snapshots) ASSERT_EQ("snap1-rename", snap_names[1]); ASSERT_EQ(userSnapNamespace, snap_namespaces[1]); ASSERT_EQ(10u, snap_sizes[1]); + ASSERT_EQ(0, snapshot_timestamp_list(&ioctx, oid, snapc.snaps, &snap_timestamps)); + ASSERT_EQ(2u, snap_timestamps.size()); + ASSERT_EQ(0, snapshot_remove(&ioctx, oid, 0)); ASSERT_EQ(0, get_snapcontext(&ioctx, oid, &snapc)); ASSERT_EQ(1u, snapc.snaps.size()); @@ -891,12 +908,14 @@ TEST_F(TestClsRbd, snapshots) ASSERT_EQ(1u, snapc.seq); ASSERT_EQ(0, snapshot_list(&ioctx, oid, snapc.snaps, &snap_names, &snap_sizes, &parents, &protection_status)); - ASSERT_EQ(0, snap_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); + ASSERT_EQ(0, snapshot_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); ASSERT_EQ(1u, snap_names.size()); ASSERT_EQ(1u, snap_namespaces.size()); ASSERT_EQ("snap2", snap_names[0]); ASSERT_EQ(userSnapNamespace, snap_namespaces[0]); ASSERT_EQ(10u, snap_sizes[0]); + ASSERT_EQ(0, snapshot_timestamp_list(&ioctx, oid, snapc.snaps, &snap_timestamps)); + ASSERT_EQ(1u, snap_timestamps.size()); uint64_t size; uint8_t order; @@ -914,7 +933,7 @@ TEST_F(TestClsRbd, snapshots) ASSERT_EQ(large_snap_id, snapc.seq); ASSERT_EQ(0, snapshot_list(&ioctx, oid, snapc.snaps, &snap_names, &snap_sizes, &parents, &protection_status)); - ASSERT_EQ(0, snap_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); + ASSERT_EQ(0, snapshot_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); ASSERT_EQ(2u, snap_names.size()); ASSERT_EQ(2u, snap_namespaces.size()); ASSERT_EQ("snap3", snap_names[0]); @@ -923,6 +942,8 @@ TEST_F(TestClsRbd, snapshots) ASSERT_EQ("snap2", snap_names[1]); ASSERT_EQ(userSnapNamespace, snap_namespaces[1]); ASSERT_EQ(10u, snap_sizes[1]); + ASSERT_EQ(0, snapshot_timestamp_list(&ioctx, oid, snapc.snaps, &snap_timestamps)); + ASSERT_EQ(2u, snap_timestamps.size()); ASSERT_EQ(0, get_size(&ioctx, oid, large_snap_id, &size, &order)); ASSERT_EQ(0u, size); @@ -939,12 +960,14 @@ TEST_F(TestClsRbd, snapshots) ASSERT_EQ(large_snap_id, snapc.seq); ASSERT_EQ(0, snapshot_list(&ioctx, oid, snapc.snaps, &snap_names, &snap_sizes, &parents, &protection_status)); - ASSERT_EQ(0, snap_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); + ASSERT_EQ(0, snapshot_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); ASSERT_EQ(1u, snap_names.size()); ASSERT_EQ(1u, snap_namespaces.size()); ASSERT_EQ("snap2", snap_names[0]); ASSERT_EQ(userSnapNamespace, snap_namespaces[0]); ASSERT_EQ(10u, snap_sizes[0]); + ASSERT_EQ(0, snapshot_timestamp_list(&ioctx, oid, snapc.snaps, &snap_timestamps)); + ASSERT_EQ(1u, snap_timestamps.size()); ASSERT_EQ(-ENOENT, snapshot_remove(&ioctx, oid, large_snap_id)); ASSERT_EQ(0, snapshot_remove(&ioctx, oid, 1)); @@ -953,10 +976,12 @@ TEST_F(TestClsRbd, snapshots) ASSERT_EQ(large_snap_id, snapc.seq); ASSERT_EQ(0, snapshot_list(&ioctx, oid, snapc.snaps, &snap_names, &snap_sizes, &parents, &protection_status)); - ASSERT_EQ(0, snap_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); + ASSERT_EQ(0, snapshot_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); ASSERT_EQ(0u, snap_names.size()); ASSERT_EQ(0u, snap_namespaces.size()); ASSERT_EQ(0u, snap_sizes.size()); + ASSERT_EQ(0, snapshot_timestamp_list(&ioctx, oid, snapc.snaps, &snap_timestamps)); + ASSERT_EQ(0u, snap_timestamps.size()); ioctx.close(); } @@ -979,7 +1004,7 @@ TEST_F(TestClsRbd, snapshots_namespaces) ASSERT_EQ(0, get_snapcontext(&ioctx, oid, &snapc)); ASSERT_EQ(0u, snapc.snaps.size()); ASSERT_EQ(0u, snapc.seq); - ASSERT_EQ(0, snap_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); + ASSERT_EQ(0, snapshot_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); ASSERT_EQ(0u, snap_namespaces.size()); ASSERT_EQ(0, snapshot_add(&ioctx, oid, 0, "snap1")); @@ -994,11 +1019,42 @@ TEST_F(TestClsRbd, snapshots_namespaces) ASSERT_EQ(1u, snapc.snaps[0]); ASSERT_EQ(0u, snapc.snaps[1]); ASSERT_EQ(1u, snapc.seq); - ASSERT_EQ(0, snap_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); + ASSERT_EQ(0, snapshot_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces)); ASSERT_EQ(groupSnapNamespace, snap_namespaces[0]); ASSERT_EQ(userSnapNamespace, snap_namespaces[1]); + + ioctx.close(); } +TEST_F(TestClsRbd, snapshots_timestamps) +{ + librados::IoCtx ioctx; + ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx)); + + string oid = get_temp_image_name(); + + ASSERT_EQ(0, create_image(&ioctx, oid, 10, 22, 0, oid, -1)); + + vector snap_names; + vector snap_timestamps; + SnapContext snapc; + + ASSERT_EQ(0, get_snapcontext(&ioctx, oid, &snapc)); + ASSERT_EQ(0u, snapc.snaps.size()); + ASSERT_EQ(0u, snapc.seq); + ASSERT_EQ(0, snapshot_timestamp_list(&ioctx, oid, snapc.snaps, &snap_timestamps)); + ASSERT_EQ(0u, snap_timestamps.size()); + + ASSERT_EQ(0, snapshot_add(&ioctx, oid, 0, "snap1")); + + ASSERT_EQ(0, get_snapcontext(&ioctx, oid, &snapc)); + ASSERT_EQ(1u, snapc.snaps.size()); + ASSERT_EQ(0, snapshot_timestamp_list(&ioctx, oid, snapc.snaps, &snap_timestamps)); + ASSERT_LT(0, snap_timestamps[0].tv.tv_sec); + ioctx.close(); +} + + TEST_F(TestClsRbd, snapid_race) { librados::IoCtx ioctx; diff --git a/src/test/librbd/test_librbd.cc b/src/test/librbd/test_librbd.cc index c3c6be4749b..adee4e6483b 100644 --- a/src/test/librbd/test_librbd.cc +++ b/src/test/librbd/test_librbd.cc @@ -992,6 +992,49 @@ TEST_F(TestLibRBD, TestCreateLsDeleteSnap) rados_ioctx_destroy(ioctx); } +int test_get_snapshot_timestamp(rbd_image_t image, uint64_t snap_id) +{ + struct timespec timestamp; + EXPECT_EQ(0, rbd_snap_get_timestamp(image, snap_id, ×tamp)); + EXPECT_LT(0, timestamp.tv_sec); + return 0; +} + +TEST_F(TestLibRBD, TestGetSnapShotTimeStamp) +{ + REQUIRE_FORMAT_V2(); + + rados_ioctx_t ioctx; + rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx); + + rbd_image_t image; + int order = 0; + std::string name = get_temp_image_name(); + uint64_t size = 2 << 20; + int num_snaps, max_size = 10; + rbd_snap_info_t snaps[max_size]; + + ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order)); + ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL)); + + ASSERT_EQ(0, rbd_snap_create(image, "snap1")); + num_snaps = rbd_snap_list(image, snaps, &max_size); + ASSERT_EQ(1, num_snaps); + ASSERT_EQ(0, test_get_snapshot_timestamp(image, snaps[0].id)); + + + ASSERT_EQ(0, rbd_snap_create(image, "snap2")); + num_snaps = rbd_snap_list(image, snaps, &max_size); + ASSERT_EQ(2, num_snaps); + ASSERT_EQ(0, test_get_snapshot_timestamp(image, snaps[0].id)); + ASSERT_EQ(0, test_get_snapshot_timestamp(image, snaps[1].id)); + + ASSERT_EQ(0, rbd_close(image)); + + rados_ioctx_destroy(ioctx); +} + + int test_ls_snaps(librbd::Image& image, size_t num_expected, ...) { int r; diff --git a/src/test/pybind/test_rbd.py b/src/test/pybind/test_rbd.py index dec3aec46f0..e6d4c659153 100644 --- a/src/test/pybind/test_rbd.py +++ b/src/test/pybind/test_rbd.py @@ -5,6 +5,7 @@ import os import time import sys +from datetime import datetime from nose import with_setup, SkipTest from nose.tools import eq_ as eq, assert_raises, assert_not_equal from rados import (Rados, @@ -524,6 +525,17 @@ class TestImage(object): assert_raises(ImageNotFound, self.image.unprotect_snap, 'snap1') assert_raises(ImageNotFound, self.image.is_protected_snap, 'snap1') + def test_snap_timestamp(self): + self.image.create_snap('snap1') + eq(['snap1'], [snap['name'] for snap in self.image.list_snaps()]) + for snap in self.image.list_snaps(): + snap_id = snap["id"] + time = self.image.get_snap_timestamp(snap_id) + assert_not_equal(b'', time.year) + assert_not_equal(0, time.year) + assert_not_equal(time.year, '1970') + self.image.remove_snap('snap1') + def test_limit_snaps(self): self.image.set_snap_limit(2) eq(2, self.image.get_snap_limit())