]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: add test instances for watch/notify messages
authorJason Dillaman <dillaman@redhat.com>
Thu, 19 Feb 2015 17:33:39 +0000 (12:33 -0500)
committerJason Dillaman <dillaman@redhat.com>
Mon, 23 Feb 2015 16:07:53 +0000 (11:07 -0500)
Ensure that the librbd watch/notify messages are tested
for backwards compatibility.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/Makefile-env.am
src/librbd/Makefile.am
src/librbd/WatchNotifyTypes.cc
src/librbd/WatchNotifyTypes.h
src/test/Makefile.am
src/test/encoding/types.h

index 9992b41d1d3c6cb57ccc79c07178dadde293ce82..aca2d399d449a73f0e9116cb8832541e1fe8622c 100644 (file)
@@ -153,6 +153,7 @@ LIBRADOS = librados.la
 LIBRADOSSTRIPER = libradosstriper.la
 LIBRGW = librgw.la
 LIBRBD = librbd.la
+LIBRBD_TYPES = librbd_types.la
 LIBKRBD = libkrbd.la
 LIBCEPHFS = libcephfs.la
 LIBERASURE_CODE = liberasure_code.la
index f18d7b00b3307b83db1f8658e4a5e3735025ad6b..ffed797760f91b1537bd4ad1d8d8657f5bf8f150 100644 (file)
@@ -1,3 +1,7 @@
+librbd_types_la_SOURCES = \
+       librbd/WatchNotifyTypes.cc
+noinst_LTLIBRARIES += librbd_types.la
+
 librbd_internal_la_SOURCES = \
        librbd/AioCompletion.cc \
        librbd/AioRequest.cc \
@@ -12,8 +16,7 @@ librbd_internal_la_SOURCES = \
        librbd/ImageWatcher.cc \
        librbd/internal.cc \
        librbd/LibrbdWriteback.cc \
-       librbd/ObjectMap.cc \
-       librbd/WatchNotifyTypes.cc
+       librbd/ObjectMap.cc
 noinst_LTLIBRARIES += librbd_internal.la
 
 librbd_api_la_SOURCES = \
@@ -23,7 +26,7 @@ noinst_LTLIBRARIES += librbd_api.la
 librbd_la_SOURCES = \
        librbd/librbd.cc
 librbd_la_LIBADD = \
-       librbd_internal.la \
+       librbd_internal.la $(LIBRBD_TYPES) \
        $(LIBRADOS) $(LIBCOMMON) $(LIBOSDC) \
        librados_internal.la \
        libcls_rbd_client.la \
index 4622ff67cebb17ccd7ae9dc8dfca338327313018..701846bd344bc945b5b90f51e1062f6e9181cc50 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "librbd/WatchNotifyTypes.h"
 #include "include/assert.h"
+#include "common/Formatter.h"
 
 namespace librbd {
 namespace WatchNotify {
@@ -37,6 +38,19 @@ private:
   bufferlist::iterator &m_iter;
 };
 
+class DumpPayloadVisitor : public boost::static_visitor<void> {
+public:
+  DumpPayloadVisitor(Formatter *formatter) : m_formatter(formatter) {}
+
+  template <typename Payload>
+  inline void operator()(const Payload &payload) const {
+    payload.dump(m_formatter);
+  }
+
+private:
+  ceph::Formatter *m_formatter;
+};
+
 }
 
 void ClientId::encode(bufferlist &bl) const {
@@ -49,6 +63,11 @@ void ClientId::decode(bufferlist::iterator &iter) {
   ::decode(handle, iter);
 }
 
+void ClientId::dump(Formatter *f) const {
+  f->dump_unsigned("gid", gid);
+  f->dump_unsigned("handle", handle);
+}
+
 void AsyncRequestId::encode(bufferlist &bl) const {
   ::encode(client_id, bl);
   ::encode(request_id, bl);
@@ -59,6 +78,13 @@ void AsyncRequestId::decode(bufferlist::iterator &iter) {
   ::decode(request_id, iter);
 }
 
+void AsyncRequestId::dump(Formatter *f) const {
+  f->open_object_section("client_id");
+  client_id.dump(f);
+  f->close_section();
+  f->dump_unsigned("request_id", request_id);
+}
+
 void AcquiredLockPayload::encode(bufferlist &bl) const {
   ::encode(static_cast<uint32_t>(NOTIFY_OP_ACQUIRED_LOCK), bl);
 }
@@ -66,6 +92,10 @@ void AcquiredLockPayload::encode(bufferlist &bl) const {
 void AcquiredLockPayload::decode(__u8 version, bufferlist::iterator &iter) {
 }
 
+void AcquiredLockPayload::dump(Formatter *f) const {
+  f->dump_string("notify_op", "AcquiredLock");
+}
+
 void ReleasedLockPayload::encode(bufferlist &bl) const {
   ::encode(static_cast<uint32_t>(NOTIFY_OP_RELEASED_LOCK), bl);
 }
@@ -73,6 +103,10 @@ void ReleasedLockPayload::encode(bufferlist &bl) const {
 void ReleasedLockPayload::decode(__u8 version, bufferlist::iterator &iter) {
 }
 
+void ReleasedLockPayload::dump(Formatter *f) const {
+  f->dump_string("notify_op", "ReleasedLock");
+}
+
 void RequestLockPayload::encode(bufferlist &bl) const {
   ::encode(static_cast<uint32_t>(NOTIFY_OP_REQUEST_LOCK), bl);
 }
@@ -80,6 +114,10 @@ void RequestLockPayload::encode(bufferlist &bl) const {
 void RequestLockPayload::decode(__u8 version, bufferlist::iterator &iter) {
 }
 
+void RequestLockPayload::dump(Formatter *f) const {
+  f->dump_string("notify_op", "RequestLock");
+}
+
 void HeaderUpdatePayload::encode(bufferlist &bl) const {
   ::encode(static_cast<uint32_t>(NOTIFY_OP_HEADER_UPDATE), bl);
 }
@@ -87,6 +125,10 @@ void HeaderUpdatePayload::encode(bufferlist &bl) const {
 void HeaderUpdatePayload::decode(__u8 version, bufferlist::iterator &iter) {
 }
 
+void HeaderUpdatePayload::dump(Formatter *f) const {
+  f->dump_string("notify_op", "HeaderUpdate");
+}
+
 void AsyncProgressPayload::encode(bufferlist &bl) const {
   ::encode(static_cast<uint32_t>(NOTIFY_OP_ASYNC_PROGRESS), bl);
   ::encode(async_request_id, bl);
@@ -100,6 +142,15 @@ void AsyncProgressPayload::decode(__u8 version, bufferlist::iterator &iter) {
   ::decode(total, iter);
 }
 
+void AsyncProgressPayload::dump(Formatter *f) const {
+  f->dump_string("notify_op", "AsyncProgress");
+  f->open_object_section("async_request_id");
+  async_request_id.dump(f);
+  f->close_section();
+  f->dump_unsigned("offset", offset);
+  f->dump_unsigned("total", total);
+}
+
 void AsyncCompletePayload::encode(bufferlist &bl) const {
   ::encode(static_cast<uint32_t>(NOTIFY_OP_ASYNC_COMPLETE), bl);
   ::encode(async_request_id, bl);
@@ -111,6 +162,14 @@ void AsyncCompletePayload::decode(__u8 version, bufferlist::iterator &iter) {
   ::decode(result, iter);
 }
 
+void AsyncCompletePayload::dump(Formatter *f) const {
+  f->dump_string("notify_op", "AsyncComplete");
+  f->open_object_section("async_request_id");
+  async_request_id.dump(f);
+  f->close_section();
+  f->dump_int("result", result);
+}
+
 void FlattenPayload::encode(bufferlist &bl) const {
   ::encode(static_cast<uint32_t>(NOTIFY_OP_FLATTEN), bl);
   ::encode(async_request_id, bl);
@@ -120,6 +179,13 @@ void FlattenPayload::decode(__u8 version, bufferlist::iterator &iter) {
   ::decode(async_request_id, iter);
 }
 
+void FlattenPayload::dump(Formatter *f) const {
+  f->dump_string("notify_op", "Flatten");
+  f->open_object_section("async_request_id");
+  async_request_id.dump(f);
+  f->close_section();
+}
+
 void ResizePayload::encode(bufferlist &bl) const {
   ::encode(static_cast<uint32_t>(NOTIFY_OP_RESIZE), bl);
   ::encode(size, bl);
@@ -131,6 +197,14 @@ void ResizePayload::decode(__u8 version, bufferlist::iterator &iter) {
   ::decode(async_request_id, iter);
 }
 
+void ResizePayload::dump(Formatter *f) const {
+  f->dump_string("notify_op", "Resize");
+  f->dump_unsigned("size", size);
+  f->open_object_section("async_request_id");
+  async_request_id.dump(f);
+  f->close_section();
+}
+
 void SnapCreatePayload::encode(bufferlist &bl) const {
   ::encode(static_cast<uint32_t>(NOTIFY_OP_SNAP_CREATE), bl);
   ::encode(snap_name, bl);
@@ -140,6 +214,11 @@ void SnapCreatePayload::decode(__u8 version, bufferlist::iterator &iter) {
   ::decode(snap_name, iter);
 }
 
+void SnapCreatePayload::dump(Formatter *f) const {
+  f->dump_string("notify_op", "SnapCreate");
+  f->dump_string("snap_name", snap_name);
+}
+
 void UnknownPayload::encode(bufferlist &bl) const {
   assert(false);
 }
@@ -147,6 +226,9 @@ void UnknownPayload::encode(bufferlist &bl) const {
 void UnknownPayload::decode(__u8 version, bufferlist::iterator &iter) {
 }
 
+void UnknownPayload::dump(Formatter *f) const {
+}
+
 void NotifyMessage::encode(bufferlist& bl) const {
   ENCODE_START(1, 1, bl);
   boost::apply_visitor(EncodePayloadVisitor(bl), payload);
@@ -197,6 +279,22 @@ void NotifyMessage::decode(bufferlist::iterator& iter) {
   DECODE_FINISH(iter);
 }
 
+void NotifyMessage::dump(Formatter *f) const {
+  apply_visitor(DumpPayloadVisitor(f), payload);
+}
+
+void NotifyMessage::generate_test_instances(std::list<NotifyMessage *> &o) {
+  o.push_back(new NotifyMessage(AcquiredLockPayload()));
+  o.push_back(new NotifyMessage(ReleasedLockPayload()));
+  o.push_back(new NotifyMessage(RequestLockPayload()));
+  o.push_back(new NotifyMessage(HeaderUpdatePayload()));
+  o.push_back(new NotifyMessage(AsyncProgressPayload(AsyncRequestId(ClientId(0, 1), 2), 3, 4)));
+  o.push_back(new NotifyMessage(AsyncCompletePayload(AsyncRequestId(ClientId(0, 1), 2), 3)));
+  o.push_back(new NotifyMessage(FlattenPayload(AsyncRequestId(ClientId(0, 1), 2))));
+  o.push_back(new NotifyMessage(ResizePayload(123, AsyncRequestId(ClientId(0, 1), 2))));
+  o.push_back(new NotifyMessage(SnapCreatePayload("foo")));
+}
+
 void ResponseMessage::encode(bufferlist& bl) const {
   ENCODE_START(1, 1, bl);
   ::encode(result, bl);
@@ -209,6 +307,14 @@ void ResponseMessage::decode(bufferlist::iterator& iter) {
   DECODE_FINISH(iter);
 }
 
+void ResponseMessage::dump(Formatter *f) const {
+  f->dump_int("result", result);
+}
+
+void ResponseMessage::generate_test_instances(std::list<ResponseMessage *> &o) {
+  o.push_back(new ResponseMessage(1));
+}
+
 } // namespace WatchNotify
 } // namespace librbd
 
index abb36d60188ffd51e396303ed7f2633e536c3631..d3b27efa78e73103841b63be1926493d88a05b2f 100644 (file)
@@ -7,9 +7,14 @@
 #include "include/buffer.h"
 #include "include/encoding.h"
 #include <iostream>
+#include <list>
 #include <string>
 #include <boost/variant.hpp>
 
+namespace ceph {
+class Formatter;
+}
+
 namespace librbd {
 namespace WatchNotify {
 
@@ -22,6 +27,7 @@ struct ClientId {
 
   void encode(bufferlist& bl) const;
   void decode(bufferlist::iterator& it);
+  void dump(Formatter *f) const;
 
   inline bool operator==(const ClientId &rhs) const {
     return (gid == rhs.gid && handle == rhs.handle);
@@ -48,6 +54,7 @@ struct AsyncRequestId {
 
   void encode(bufferlist& bl) const;
   void decode(bufferlist::iterator& it);
+  void dump(Formatter *f) const;
 
   inline bool operator<(const AsyncRequestId &rhs) const {
     if (client_id != rhs.client_id) {
@@ -73,21 +80,25 @@ enum NotifyOp {
 struct AcquiredLockPayload {
   void encode(bufferlist &bl) const;
   void decode(__u8 version, bufferlist::iterator &iter);
+  void dump(Formatter *f) const;
 };
 
 struct ReleasedLockPayload {
   void encode(bufferlist &bl) const;
   void decode(__u8 version, bufferlist::iterator &iter);
+  void dump(Formatter *f) const;
 };
 
 struct RequestLockPayload {
   void encode(bufferlist &bl) const;
   void decode(__u8 version, bufferlist::iterator &iter);
+  void dump(Formatter *f) const;
 };
 
 struct HeaderUpdatePayload {
   void encode(bufferlist &bl) const;
   void decode(__u8 version, bufferlist::iterator &iter);
+  void dump(Formatter *f) const;
 };
 
 struct AsyncProgressPayload {
@@ -101,6 +112,7 @@ struct AsyncProgressPayload {
 
   void encode(bufferlist &bl) const;
   void decode(__u8 version, bufferlist::iterator &iter);
+  void dump(Formatter *f) const;
 };
 
 struct AsyncCompletePayload {
@@ -113,6 +125,7 @@ struct AsyncCompletePayload {
 
   void encode(bufferlist &bl) const;
   void decode(__u8 version, bufferlist::iterator &iter);
+  void dump(Formatter *f) const;
 };
 
 struct FlattenPayload {
@@ -123,6 +136,7 @@ struct FlattenPayload {
 
   void encode(bufferlist &bl) const;
   void decode(__u8 version, bufferlist::iterator &iter);
+  void dump(Formatter *f) const;
 };
 
 struct ResizePayload {
@@ -135,6 +149,7 @@ struct ResizePayload {
 
   void encode(bufferlist &bl) const;
   void decode(__u8 version, bufferlist::iterator &iter);
+  void dump(Formatter *f) const;
 };
 
 struct SnapCreatePayload {
@@ -145,11 +160,13 @@ struct SnapCreatePayload {
  
   void encode(bufferlist &bl) const;
   void decode(__u8 version, bufferlist::iterator &iter);
+  void dump(Formatter *f) const;
 };
 
 struct UnknownPayload {
   void encode(bufferlist &bl) const;
   void decode(__u8 version, bufferlist::iterator &iter);
+  void dump(Formatter *f) const;
 };
 
 typedef boost::variant<AcquiredLockPayload,
@@ -171,6 +188,9 @@ struct NotifyMessage {
 
   void encode(bufferlist& bl) const;
   void decode(bufferlist::iterator& it);
+  void dump(Formatter *f) const;
+
+  static void generate_test_instances(std::list<NotifyMessage *> &o);
 };
 
 struct ResponseMessage {
@@ -181,6 +201,9 @@ struct ResponseMessage {
 
   void encode(bufferlist& bl) const;
   void decode(bufferlist::iterator& it);
+  void dump(Formatter *f) const;
+
+  static void generate_test_instances(std::list<ResponseMessage *> &o);
 };
 
 } // namespace WatchNotify
index ebedb4cabf05dcc47ec00bcf2ff050a60016ad70..023e797bd29b5b1ec178ab83f9ee44330e4f4a74 100644 (file)
@@ -60,6 +60,7 @@ ceph_dencoder_SOURCES = \
        test/encoding/ceph_dencoder.cc \
        $(DENCODER_SOURCES)
 ceph_dencoder_LDADD = \
+       $(LIBRBD_TYPES) \
        $(LIBOSD_TYPES) \
        $(LIBOS_TYPES) \
        $(LIBMDS) \
@@ -781,7 +782,7 @@ noinst_LTLIBRARIES += librbd_test.la
 unittest_librbd_SOURCES =
 nodist_EXTRA_unittest_librbd_SOURCES = dummy.cc
 unittest_librbd_LDADD = \
-       librbd_test.la librbd_api.la librbd_internal.la \
+       librbd_test.la librbd_api.la librbd_internal.la $(LIBRBD_TYPES) \
        libcls_rbd_client.la libcls_lock_client.la \
        librados_test_stub.la librados_internal.la \
        $(LIBOSDC) $(UNITTEST_LDADD) \
@@ -791,7 +792,7 @@ check_PROGRAMS += unittest_librbd
 ceph_test_librbd_SOURCES =
 nodist_EXTRA_ceph_test_librbd_SOURCES = dummy.cc
 ceph_test_librbd_LDADD = \
-       librbd_test.la librbd_api.la librbd_internal.la \
+       librbd_test.la librbd_api.la librbd_internal.la $(LIBRBD_TYPES) \
         libcls_rbd_client.la libcls_lock_client.la \
        librados_api.la $(LIBRADOS_DEPS) $(UNITTEST_LDADD) \
        $(CEPH_GLOBAL) $(RADOS_TEST_LDADD)
index 7c28e0db3f442f67e940769ca9b52bcf29151e24..bcc03472c2d9a11fd6bc0f07efc1ce7bb4c10710 100644 (file)
@@ -222,6 +222,10 @@ TYPE(ETableServer)
 #include "mds/events/EUpdate.h"
 TYPE(EUpdate)
 
+#include "librbd/WatchNotifyTypes.h"
+TYPE(librbd::WatchNotify::NotifyMessage)
+TYPE(librbd::WatchNotify::ResponseMessage)
+
 #ifdef WITH_RADOSGW
 
 #include "rgw/rgw_rados.h"