From 76673a76d796e49926518417cfd35e00ddec3dc4 Mon Sep 17 00:00:00 2001 From: zhengyin Date: Sun, 2 Sep 2018 09:44:32 -0400 Subject: [PATCH] rbd: add protected in snap list Signed-off-by: Zheng Yin --- .../cli-integration/rbd/formatted-output.t | 16 ++++++++++++---- src/tools/rbd/action/Snap.cc | 18 ++++++++++++++++-- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/test/cli-integration/rbd/formatted-output.t b/src/test/cli-integration/rbd/formatted-output.t index 1c3d96f1e8105..23a421de7e3e1 100644 --- a/src/test/cli-integration/rbd/formatted-output.t +++ b/src/test/cli-integration/rbd/formatted-output.t @@ -900,13 +900,14 @@ whenever it is run. grep -v to ignore it, but still work on other distros. $ rbd snap list foo - SNAPID*NAME*SIZE*TIMESTAMP* (glob) + SNAPID*NAME*SIZE*PROTECTED*TIMESTAMP* (glob) *snap*1 GiB* (glob) $ rbd snap list foo --format json | python -mjson.tool | sed 's/,$/, /' [ { "id": *, (glob) "name": "snap", + "protected": "false", "size": 1073741824, "timestamp": "" } @@ -917,24 +918,27 @@ whenever it is run. grep -v to ignore it, but still work on other distros. * (glob) snap 1073741824 + false $ rbd snap list bar - SNAPID*NAME*SIZE*TIMESTAMP* (glob) - *snap*512 MiB* (glob) + SNAPID*NAME*SIZE*PROTECTED*TIMESTAMP* (glob) + *snap*512 MiB*yes* (glob) *snap2*1 GiB* (glob) $ rbd snap list bar --format json | python -mjson.tool | sed 's/,$/, /' [ { "id": *, (glob) "name": "snap", + "protected": "true", "size": 536870912, "timestamp": * (glob) }, { "id": *, (glob) "name": "snap2", + "protected": "false", "size": 1073741824, "timestamp": * (glob) } @@ -945,12 +949,14 @@ whenever it is run. grep -v to ignore it, but still work on other distros. * (glob) snap 536870912 + true * (glob) * (glob) snap2 1073741824 + false * (glob) @@ -960,13 +966,14 @@ whenever it is run. grep -v to ignore it, but still work on other distros. $ rbd snap list baz --format xml | xml_pp 2>&1 | grep -v '^new version at /usr/bin/xml_pp' $ rbd snap list rbd_other/child - SNAPID*NAME*SIZE*TIMESTAMP* (glob) + SNAPID*NAME*SIZE*PROTECTED*TIMESTAMP* (glob) *snap*512 MiB* (glob) $ rbd snap list rbd_other/child --format json | python -mjson.tool | sed 's/,$/, /' [ { "id": *, (glob) "name": "snap", + "protected": "false", "size": 536870912, "timestamp": * (glob) } @@ -977,6 +984,7 @@ whenever it is run. grep -v to ignore it, but still work on other distros. * (glob) snap 536870912 + false * (glob) diff --git a/src/tools/rbd/action/Snap.cc b/src/tools/rbd/action/Snap.cc index df337b66b918d..10c13993e1a3a 100644 --- a/src/tools/rbd/action/Snap.cc +++ b/src/tools/rbd/action/Snap.cc @@ -47,7 +47,8 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados:: t.define_column("SNAPID", TextTable::LEFT, TextTable::RIGHT); t.define_column("NAME", TextTable::LEFT, TextTable::LEFT); t.define_column("SIZE", TextTable::LEFT, TextTable::RIGHT); - t.define_column("TIMESTAMP", TextTable::LEFT, TextTable::LEFT); + t.define_column("PROTECTED", TextTable::LEFT, TextTable::LEFT); + t.define_column("TIMESTAMP", TextTable::LEFT, TextTable::RIGHT); if (all_snaps) { t.define_column("NAMESPACE", TextTable::LEFT, TextTable::LEFT); } @@ -60,6 +61,7 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados:: for (std::vector::iterator s = snaps.begin(); s != snaps.end(); ++s) { struct timespec timestamp; + bool snap_protected = false; image.snap_get_timestamp(s->id, ×tamp); string tt_str = ""; if(timestamp.tv_sec != 0) { @@ -100,11 +102,22 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados:: s->id, &trash_original_name); } + std::string protected_str = ""; + if (snap_namespace == RBD_SNAP_NAMESPACE_TYPE_USER) { + r = image.snap_is_protected(s->name.c_str(), &snap_protected); + if (r < 0) { + std::cerr << "rbd: unable to retrieve snap protection" << std::endl; + return r; + } + } + if (f) { + protected_str = snap_protected ? "true" : "false"; f->open_object_section("snapshot"); f->dump_unsigned("id", s->id); f->dump_string("name", s->name); f->dump_unsigned("size", s->size); + f->dump_string("protected", protected_str); f->dump_string("timestamp", tt_str); if (all_snaps) { f->open_object_section("namespace"); @@ -121,7 +134,8 @@ int do_list_snaps(librbd::Image& image, Formatter *f, bool all_snaps, librados:: } f->close_section(); } else { - t << s->id << s->name << stringify(byte_u_t(s->size)) << tt_str; + protected_str = snap_protected ? "yes" : ""; + t << s->id << s->name << stringify(byte_u_t(s->size)) << protected_str << tt_str; if (all_snaps) { ostringstream oss; -- 2.39.5