summaryrefslogtreecommitdiffstats
path: root/src/tools/rbd_mirror/image_map/Types.h
blob: 5a97430f3b630d738bfa696344e797c8defde0be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab

#ifndef CEPH_RBD_MIRROR_IMAGE_MAP_TYPES_H
#define CEPH_RBD_MIRROR_IMAGE_MAP_TYPES_H

#include <iosfwd>
#include <map>
#include <set>
#include <string>
#include <boost/variant.hpp>

#include "include/buffer.h"
#include "include/encoding.h"
#include "include/utime.h"
#include "tools/rbd_mirror/Types.h"

struct Context;

namespace ceph {
class Formatter;
}

namespace rbd {
namespace mirror {
namespace image_map {

extern const std::string UNMAPPED_INSTANCE_ID;

struct Listener {
  virtual ~Listener() {
  }

  virtual void acquire_image(const std::string &global_image_id,
                             const std::string &instance_id,
                             Context* on_finish) = 0;
  virtual void release_image(const std::string &global_image_id,
                             const std::string &instance_id,
                             Context* on_finish) = 0;
  virtual void remove_image(const std::string &mirror_uuid,
                            const std::string &global_image_id,
                            const std::string &instance_id,
                            Context* on_finish) = 0;
};

struct LookupInfo {
  std::string instance_id = UNMAPPED_INSTANCE_ID;
  utime_t mapped_time;
};

enum ActionType {
  ACTION_TYPE_NONE,
  ACTION_TYPE_MAP_UPDATE,
  ACTION_TYPE_MAP_REMOVE,
  ACTION_TYPE_ACQUIRE,
  ACTION_TYPE_RELEASE
};

typedef std::vector<std::string> InstanceIds;
typedef std::set<std::string> GlobalImageIds;
typedef std::map<std::string, ActionType> ImageActionTypes;

enum PolicyMetaType {
  POLICY_META_TYPE_NONE = 0,
};

struct PolicyMetaNone {
  static const PolicyMetaType TYPE = POLICY_META_TYPE_NONE;

  PolicyMetaNone() {
  }

  void encode(bufferlist& bl) const {
  }

  void decode(__u8 version, bufferlist::const_iterator& it) {
  }

  void dump(Formatter *f) const {
  }
};

struct PolicyMetaUnknown {
  static const PolicyMetaType TYPE = static_cast<PolicyMetaType>(-1);

  PolicyMetaUnknown() {
  }

  void encode(bufferlist& bl) const {
    ceph_abort();
  }

  void decode(__u8 version, bufferlist::const_iterator& it) {
  }

  void dump(Formatter *f) const {
  }
};

typedef boost::variant<PolicyMetaNone,
                       PolicyMetaUnknown> PolicyMeta;

struct PolicyData {
  PolicyData()
    : policy_meta(PolicyMetaUnknown()) {
  }
  PolicyData(const PolicyMeta &policy_meta)
    : policy_meta(policy_meta) {
  }

  PolicyMeta policy_meta;

  PolicyMetaType get_policy_meta_type() const;

  void encode(bufferlist& bl) const;
  void decode(bufferlist::const_iterator& it);
  void dump(Formatter *f) const;

  static void generate_test_instances(std::list<PolicyData *> &o);
};

WRITE_CLASS_ENCODER(PolicyData);

std::ostream &operator<<(std::ostream &os, const ActionType &action_type);

} // namespace image_map
} // namespace mirror
} // namespace rbd

#endif // CEPH_RBD_MIRROR_IMAGE_MAP_TYPES_H