1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
5 #include "include/assert.h"
6 #include "include/stringify.h"
7 #include "common/Formatter.h"
11 namespace instance_watcher {
15 class EncodePayloadVisitor : public boost::static_visitor<void> {
17 explicit EncodePayloadVisitor(bufferlist &bl) : m_bl(bl) {}
19 template <typename Payload>
20 inline void operator()(const Payload &payload) const {
21 ::encode(static_cast<uint32_t>(Payload::NOTIFY_OP), m_bl);
29 class DecodePayloadVisitor : public boost::static_visitor<void> {
31 DecodePayloadVisitor(__u8 version, bufferlist::iterator &iter)
32 : m_version(version), m_iter(iter) {}
34 template <typename Payload>
35 inline void operator()(Payload &payload) const {
36 payload.decode(m_version, m_iter);
41 bufferlist::iterator &m_iter;
44 class DumpPayloadVisitor : public boost::static_visitor<void> {
46 explicit DumpPayloadVisitor(Formatter *formatter) : m_formatter(formatter) {}
48 template <typename Payload>
49 inline void operator()(const Payload &payload) const {
50 NotifyOp notify_op = Payload::NOTIFY_OP;
51 m_formatter->dump_string("notify_op", stringify(notify_op));
52 payload.dump(m_formatter);
56 ceph::Formatter *m_formatter;
59 } // anonymous namespace
61 void PayloadBase::encode(bufferlist &bl) const {
62 ::encode(request_id, bl);
65 void PayloadBase::decode(__u8 version, bufferlist::iterator &iter) {
66 ::decode(request_id, iter);
69 void PayloadBase::dump(Formatter *f) const {
70 f->dump_unsigned("request_id", request_id);
73 void ImagePayloadBase::encode(bufferlist &bl) const {
74 PayloadBase::encode(bl);
75 ::encode(global_image_id, bl);
78 void ImagePayloadBase::decode(__u8 version, bufferlist::iterator &iter) {
79 PayloadBase::decode(version, iter);
80 ::decode(global_image_id, iter);
83 void ImagePayloadBase::dump(Formatter *f) const {
85 f->dump_string("global_image_id", global_image_id);
88 void PeerImageRemovedPayload::encode(bufferlist &bl) const {
89 PayloadBase::encode(bl);
90 ::encode(global_image_id, bl);
91 ::encode(peer_mirror_uuid, bl);
94 void PeerImageRemovedPayload::decode(__u8 version, bufferlist::iterator &iter) {
95 PayloadBase::decode(version, iter);
96 ::decode(global_image_id, iter);
97 ::decode(peer_mirror_uuid, iter);
100 void PeerImageRemovedPayload::dump(Formatter *f) const {
101 PayloadBase::dump(f);
102 f->dump_string("global_image_id", global_image_id);
103 f->dump_string("peer_mirror_uuid", peer_mirror_uuid);
106 void SyncPayloadBase::encode(bufferlist &bl) const {
107 PayloadBase::encode(bl);
108 ::encode(sync_id, bl);
111 void SyncPayloadBase::decode(__u8 version, bufferlist::iterator &iter) {
112 PayloadBase::decode(version, iter);
113 ::decode(sync_id, iter);
116 void SyncPayloadBase::dump(Formatter *f) const {
117 PayloadBase::dump(f);
118 f->dump_string("sync_id", sync_id);
121 void UnknownPayload::encode(bufferlist &bl) const {
125 void UnknownPayload::decode(__u8 version, bufferlist::iterator &iter) {
128 void UnknownPayload::dump(Formatter *f) const {
131 void NotifyMessage::encode(bufferlist& bl) const {
132 ENCODE_START(2, 2, bl);
133 boost::apply_visitor(EncodePayloadVisitor(bl), payload);
137 void NotifyMessage::decode(bufferlist::iterator& iter) {
138 DECODE_START(2, iter);
141 ::decode(notify_op, iter);
143 // select the correct payload variant based upon the encoded op
145 case NOTIFY_OP_IMAGE_ACQUIRE:
146 payload = ImageAcquirePayload();
148 case NOTIFY_OP_IMAGE_RELEASE:
149 payload = ImageReleasePayload();
151 case NOTIFY_OP_PEER_IMAGE_REMOVED:
152 payload = PeerImageRemovedPayload();
154 case NOTIFY_OP_SYNC_REQUEST:
155 payload = SyncRequestPayload();
157 case NOTIFY_OP_SYNC_START:
158 payload = SyncStartPayload();
161 payload = UnknownPayload();
165 apply_visitor(DecodePayloadVisitor(struct_v, iter), payload);
169 void NotifyMessage::dump(Formatter *f) const {
170 apply_visitor(DumpPayloadVisitor(f), payload);
173 void NotifyMessage::generate_test_instances(std::list<NotifyMessage *> &o) {
174 o.push_back(new NotifyMessage(ImageAcquirePayload()));
175 o.push_back(new NotifyMessage(ImageAcquirePayload(1, "gid")));
177 o.push_back(new NotifyMessage(ImageReleasePayload()));
178 o.push_back(new NotifyMessage(ImageReleasePayload(1, "gid")));
180 o.push_back(new NotifyMessage(PeerImageRemovedPayload()));
181 o.push_back(new NotifyMessage(PeerImageRemovedPayload(1, "gid", "uuid")));
183 o.push_back(new NotifyMessage(SyncRequestPayload()));
184 o.push_back(new NotifyMessage(SyncRequestPayload(1, "sync_id")));
186 o.push_back(new NotifyMessage(SyncStartPayload()));
187 o.push_back(new NotifyMessage(SyncStartPayload(1, "sync_id")));
190 std::ostream &operator<<(std::ostream &out, const NotifyOp &op) {
192 case NOTIFY_OP_IMAGE_ACQUIRE:
193 out << "ImageAcquire";
195 case NOTIFY_OP_IMAGE_RELEASE:
196 out << "ImageRelease";
198 case NOTIFY_OP_PEER_IMAGE_REMOVED:
199 out << "PeerImageRemoved";
201 case NOTIFY_OP_SYNC_REQUEST:
202 out << "SyncRequest";
204 case NOTIFY_OP_SYNC_START:
208 out << "Unknown (" << static_cast<uint32_t>(op) << ")";
214 void NotifyAckPayload::encode(bufferlist &bl) const {
215 ::encode(instance_id, bl);
216 ::encode(request_id, bl);
217 ::encode(ret_val, bl);
220 void NotifyAckPayload::decode(bufferlist::iterator &iter) {
221 ::decode(instance_id, iter);
222 ::decode(request_id, iter);
223 ::decode(ret_val, iter);
226 void NotifyAckPayload::dump(Formatter *f) const {
227 f->dump_string("instance_id", instance_id);
228 f->dump_unsigned("request_id", request_id);
229 f->dump_int("request_id", ret_val);
232 } // namespace instance_watcher
233 } // namespace mirror