From: Venky Shankar Date: Tue, 20 Oct 2020 06:04:58 +0000 (-0400) Subject: test: add tests for new snapshot APIs X-Git-Tag: v16.1.0~184^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7ed0134c9fd283dd6f4c284c292945ec3398746b;p=ceph.git test: add tests for new snapshot APIs Signed-off-by: Venky Shankar --- diff --git a/src/test/libcephfs/test.cc b/src/test/libcephfs/test.cc index ef43e1087050..a3b329a850b9 100644 --- a/src/test/libcephfs/test.cc +++ b/src/test/libcephfs/test.cc @@ -2420,3 +2420,80 @@ TEST(LibCephFS, Lseek) { ASSERT_EQ(0, ceph_close(cmount, fd)); ceph_shutdown(cmount); } + +TEST(LibCephFS, SnapInfoOnNonSnapshot) { + struct ceph_mount_info *cmount; + ASSERT_EQ(ceph_create(&cmount, NULL), 0); + ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); + ASSERT_EQ(0, ceph_conf_parse_env(cmount, NULL)); + ASSERT_EQ(ceph_mount(cmount, NULL), 0); + + struct snap_info info; + ASSERT_EQ(-EINVAL, ceph_get_snap_info(cmount, "/", &info)); + + ceph_shutdown(cmount); +} + +TEST(LibCephFS, EmptySnapInfo) { + struct ceph_mount_info *cmount; + ASSERT_EQ(ceph_create(&cmount, NULL), 0); + ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); + ASSERT_EQ(0, ceph_conf_parse_env(cmount, NULL)); + ASSERT_EQ(ceph_mount(cmount, NULL), 0); + + char snap_name[64]; + char snap_path[128]; + sprintf(snap_name, "%s_%d", "snap0", getpid()); + sprintf(snap_path, "/.snap/%s", snap_name); + + // snapshot without custom metadata + ASSERT_EQ(0, ceph_mkdir(cmount, snap_path, 0755)); + + struct snap_info info; + ASSERT_EQ(0, ceph_get_snap_info(cmount, snap_path, &info)); + ASSERT_GT(info.id, 0); + ASSERT_EQ(info.nr_snap_metadata, 0); + + ASSERT_EQ(0, ceph_rmdir(cmount, snap_path)); + ceph_shutdown(cmount); +} + +TEST(LibCephFS, SnapInfo) { + struct ceph_mount_info *cmount; + ASSERT_EQ(ceph_create(&cmount, NULL), 0); + ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); + ASSERT_EQ(0, ceph_conf_parse_env(cmount, NULL)); + ASSERT_EQ(ceph_mount(cmount, NULL), 0); + + char snap_name[64]; + char snap_path[128]; + sprintf(snap_name, "%s_%d", "snap0", getpid()); + sprintf(snap_path, "/.snap/%s", snap_name); + + // snapshot with custom metadata + struct snap_metadata snap_meta[] = {{"foo", "bar"},{"this", "that"},{"abcdefg", "12345"}}; + ASSERT_EQ(0, ceph_mksnap(cmount, "/", snap_name, 0755, snap_meta, std::size(snap_meta))); + + struct snap_info info; + ASSERT_EQ(0, ceph_get_snap_info(cmount, snap_path, &info)); + ASSERT_GT(info.id, 0); + ASSERT_EQ(info.nr_snap_metadata, std::size(snap_meta)); + for (size_t i = 0; i < info.nr_snap_metadata; ++i) { + auto &k1 = info.snap_metadata[i].key; + auto &v1 = info.snap_metadata[i].value; + bool found = false; + for (size_t j = 0; j < info.nr_snap_metadata; ++j) { + auto &k2 = snap_meta[j].key; + auto &v2 = snap_meta[j].value; + if (strncmp(k1, k2, strlen(k1)) == 0 && strncmp(v1, v2, strlen(v1)) == 0) { + found = true; + break; + } + } + ASSERT_TRUE(found); + } + ceph_free_snap_info_buffer(&info); + + ASSERT_EQ(0, ceph_rmsnap(cmount, "/", snap_name)); + ceph_shutdown(cmount); +} diff --git a/src/test/pybind/test_cephfs.py b/src/test/pybind/test_cephfs.py index 3cf32e5b3131..bdb8332ffe73 100644 --- a/src/test/pybind/test_cephfs.py +++ b/src/test/pybind/test_cephfs.py @@ -832,3 +832,34 @@ def test_disk_quota_exceeeded_error(): assert_raises(libcephfs.DiskQuotaExceeded, cephfs.write, fd, b"abcdeghiklmnopqrstuvwxyz", 0) cephfs.close(fd) cephfs.unlink(b"/dir-1/file-1") + +@with_setup(setup_test) +def test_empty_snapshot_info(): + cephfs.mkdir("/dir-1", 0o755) + + # snap without metadata + cephfs.mkdir("/dir-1/.snap/snap0", 0o755) + snap_info = cephfs.snap_info("/dir-1/.snap/snap0") + assert_equal(snap_info["metadata"], {}) + assert_greater(snap_info["id"], 0) + cephfs.rmdir("/dir-1/.snap/snap0") + + # remove directory + cephfs.rmdir("/dir-1") + +@with_setup(setup_test) +def test_snapshot_info(): + cephfs.mkdir("/dir-1", 0o755) + + # snap with custom metadata + md = {"foo": "bar", "zig": "zag", "abcdefg": "12345"} + cephfs.mksnap("/dir-1", "snap0", 0o755, metadata=md) + snap_info = cephfs.snap_info("/dir-1/.snap/snap0") + assert_equal(snap_info["metadata"]["foo"], md["foo"]) + assert_equal(snap_info["metadata"]["zig"], md["zig"]) + assert_equal(snap_info["metadata"]["abcdefg"], md["abcdefg"]) + assert_greater(snap_info["id"], 0) + cephfs.rmsnap("/dir-1", "snap0") + + # remove directory + cephfs.rmdir("/dir-1")