From aa08323409fa92fa6e934c246eada59d933d1a89 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 26 Jul 2018 12:20:46 -0400 Subject: [PATCH] librbd: new ParentImageSpec type to support parent namespaces Signed-off-by: Jason Dillaman --- src/cls/rbd/cls_rbd_types.cc | 31 +++++++++++++++++++++++++++ src/cls/rbd/cls_rbd_types.h | 38 +++++++++++++++++++++++++++++++++ src/tools/ceph-dencoder/types.h | 1 + 3 files changed, 70 insertions(+) diff --git a/src/cls/rbd/cls_rbd_types.cc b/src/cls/rbd/cls_rbd_types.cc index a4613c2d1ee..24d63d72d8d 100644 --- a/src/cls/rbd/cls_rbd_types.cc +++ b/src/cls/rbd/cls_rbd_types.cc @@ -212,6 +212,37 @@ std::ostream& operator<<(std::ostream& os, const MirrorImageStatus& status) { return os; } +void ParentImageSpec::encode(bufferlist& bl) const { + ENCODE_START(1, 1, bl); + encode(pool_id, bl); + encode(pool_namespace, bl); + encode(image_id, bl); + encode(snap_id, bl); + ENCODE_FINISH(bl); +} + +void ParentImageSpec::decode(bufferlist::const_iterator& bl) { + DECODE_START(1, bl); + decode(pool_id, bl); + decode(pool_namespace, bl); + decode(image_id, bl); + decode(snap_id, bl); + DECODE_FINISH(bl); +} + +void ParentImageSpec::dump(Formatter *f) const { + f->dump_int("pool_id", pool_id); + f->dump_string("pool_namespace", pool_namespace); + f->dump_string("image_id", image_id); + f->dump_unsigned("snap_id", snap_id); +} + +void ParentImageSpec::generate_test_instances(std::list& o) { + o.push_back(new ParentImageSpec{}); + o.push_back(new ParentImageSpec{1, "", "foo", 3}); + o.push_back(new ParentImageSpec{1, "ns", "foo", 3}); +} + void ChildImageSpec::encode(bufferlist &bl) const { ENCODE_START(1, 1, bl); encode(pool_id, bl); diff --git a/src/cls/rbd/cls_rbd_types.h b/src/cls/rbd/cls_rbd_types.h index cd8b01038bf..03fe4750f0f 100644 --- a/src/cls/rbd/cls_rbd_types.h +++ b/src/cls/rbd/cls_rbd_types.h @@ -181,6 +181,44 @@ std::ostream& operator<<(std::ostream& os, const MirrorImageStatusState& state); WRITE_CLASS_ENCODER(MirrorImageStatus); +struct ParentImageSpec { + int64_t pool_id = -1; + std::string pool_namespace; + std::string image_id; + snapid_t snap_id = CEPH_NOSNAP; + + ParentImageSpec() { + } + ParentImageSpec(int64_t pool_id, const std::string& pool_namespace, + const std::string& image_id, snapid_t snap_id) + : pool_id(pool_id), pool_namespace(pool_namespace), image_id(image_id), + snap_id(snap_id) { + } + + bool exists() const { + return (pool_id >= 0 && !image_id.empty() && snap_id != CEPH_NOSNAP); + } + + bool operator==(const ParentImageSpec& rhs) const { + return ((pool_id == rhs.pool_id) && + (pool_namespace == rhs.pool_namespace) && + (image_id == rhs.image_id) && + (snap_id == rhs.snap_id)); + } + + bool operator!=(const ParentImageSpec& rhs) const { + return !(*this == rhs); + } + + void encode(bufferlist &bl) const; + void decode(bufferlist::const_iterator &it); + void dump(Formatter *f) const; + + static void generate_test_instances(std::list &o); +}; + +WRITE_CLASS_ENCODER(ParentImageSpec); + struct ChildImageSpec { int64_t pool_id = -1; std::string image_id; diff --git a/src/tools/ceph-dencoder/types.h b/src/tools/ceph-dencoder/types.h index 28e72d7da1b..d8a5dd00d3c 100644 --- a/src/tools/ceph-dencoder/types.h +++ b/src/tools/ceph-dencoder/types.h @@ -465,6 +465,7 @@ TYPE(cls_rbd_parent) TYPE(cls_rbd_snap) #include "cls/rbd/cls_rbd_types.h" +TYPE(cls::rbd::ParentImageSpec) TYPE(cls::rbd::ChildImageSpec) TYPE(cls::rbd::MigrationSpec) TYPE(cls::rbd::MirrorPeer) -- 2.39.5