Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / cls / rbd / cls_rbd_client.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- 
2 // vim: ts=8 sw=2 smarttab
3
4 #ifndef CEPH_LIBRBD_CLS_RBD_CLIENT_H
5 #define CEPH_LIBRBD_CLS_RBD_CLIENT_H
6
7 #include "cls/lock/cls_lock_types.h"
8 #include "cls/rbd/cls_rbd_types.h"
9 #include "common/bit_vector.hpp"
10 #include "common/snap_types.h"
11 #include "include/types.h"
12 #include "librbd/Types.h"
13
14 class Context;
15 namespace librados {
16   class ObjectReadOperation;
17   class IoCtx;
18   class ObjectWriteOperation;
19 }
20
21 namespace librbd {
22   namespace cls_client {
23     // high-level interface to the header
24     void get_immutable_metadata_start(librados::ObjectReadOperation *op);
25     int get_immutable_metadata_finish(bufferlist::iterator *it,
26                                       std::string *object_prefix,
27                                       uint8_t *order);
28     int get_immutable_metadata(librados::IoCtx *ioctx, const std::string &oid,
29                                std::string *object_prefix, uint8_t *order);
30
31     void get_mutable_metadata_start(librados::ObjectReadOperation *op,
32                                     bool read_only);
33     int get_mutable_metadata_finish(bufferlist::iterator *it,
34                                     uint64_t *size, uint64_t *features,
35                                     uint64_t *incompatible_features,
36                                     std::map<rados::cls::lock::locker_id_t,
37                                              rados::cls::lock::locker_info_t> *lockers,
38                                     bool *exclusive_lock, std::string *lock_tag,
39                                     ::SnapContext *snapc, ParentInfo *parent);
40     int get_mutable_metadata(librados::IoCtx *ioctx, const std::string &oid,
41                              bool read_only, uint64_t *size, uint64_t *features,
42                              uint64_t *incompatible_features,
43                              map<rados::cls::lock::locker_id_t,
44                                  rados::cls::lock::locker_info_t> *lockers,
45                              bool *exclusive_lock,
46                              std::string *lock_tag,
47                              ::SnapContext *snapc,
48                              ParentInfo *parent);
49
50     // low-level interface (mainly for testing)
51     void create_image(librados::ObjectWriteOperation *op, uint64_t size,
52                       uint8_t order, uint64_t features,
53                       const std::string &object_prefix, int64_t data_pool_id);
54     int create_image(librados::IoCtx *ioctx, const std::string &oid,
55                      uint64_t size, uint8_t order, uint64_t features,
56                      const std::string &object_prefix, int64_t data_pool_id);
57     int get_features(librados::IoCtx *ioctx, const std::string &oid,
58                      snapid_t snap_id, uint64_t *features);
59     void set_features(librados::ObjectWriteOperation *op, uint64_t features,
60                      uint64_t mask);
61     int set_features(librados::IoCtx *ioctx, const std::string &oid,
62                      uint64_t features, uint64_t mask);
63     int get_object_prefix(librados::IoCtx *ioctx, const std::string &oid,
64                           std::string *object_prefix);
65     void get_data_pool_start(librados::ObjectReadOperation *op);
66     int get_data_pool_finish(bufferlist::iterator *it, int64_t *data_pool_id);
67     int get_data_pool(librados::IoCtx *ioctx, const std::string &oid,
68                       int64_t *data_pool_id);
69     int get_size(librados::IoCtx *ioctx, const std::string &oid,
70                  snapid_t snap_id, uint64_t *size, uint8_t *order);
71     int set_size(librados::IoCtx *ioctx, const std::string &oid,
72                  uint64_t size);
73     void set_size(librados::ObjectWriteOperation *op, uint64_t size);
74     int get_parent(librados::IoCtx *ioctx, const std::string &oid,
75                    snapid_t snap_id, ParentSpec *pspec,
76                    uint64_t *parent_overlap);
77     int set_parent(librados::IoCtx *ioctx, const std::string &oid,
78                    const ParentSpec &pspec, uint64_t parent_overlap);
79     void set_parent(librados::ObjectWriteOperation *op,
80                     const ParentSpec &pspec, uint64_t parent_overlap);
81     void get_flags_start(librados::ObjectReadOperation *op,
82                          const std::vector<snapid_t> &snap_ids);
83     int get_flags_finish(bufferlist::iterator *it, uint64_t *flags,
84                          const std::vector<snapid_t> &snap_ids,
85                          std::vector<uint64_t> *snap_flags);
86     int get_flags(librados::IoCtx *ioctx, const std::string &oid,
87                   uint64_t *flags, const std::vector<snapid_t> &snap_ids,
88                   vector<uint64_t> *snap_flags);
89     void set_flags(librados::ObjectWriteOperation *op, snapid_t snap_id,
90                    uint64_t flags, uint64_t mask);
91     int remove_parent(librados::IoCtx *ioctx, const std::string &oid);
92     void remove_parent(librados::ObjectWriteOperation *op);
93     int add_child(librados::IoCtx *ioctx, const std::string &oid,
94                   const ParentSpec &pspec, const std::string &c_imageid);
95     void add_child(librados::ObjectWriteOperation *op,
96                   const ParentSpec pspec, const std::string &c_imageid);
97     void remove_child(librados::ObjectWriteOperation *op,
98                       const ParentSpec &pspec, const std::string &c_imageid);
99     int remove_child(librados::IoCtx *ioctx, const std::string &oid,
100                      const ParentSpec &pspec, const std::string &c_imageid);
101     void get_children_start(librados::ObjectReadOperation *op,
102                             const ParentSpec &pspec);
103     int get_children_finish(bufferlist::iterator *it,
104                             std::set<string> *children);
105     int get_children(librados::IoCtx *ioctx, const std::string &oid,
106                       const ParentSpec &pspec, set<string>& children);
107     void snapshot_add(librados::ObjectWriteOperation *op, snapid_t snap_id,
108                       const std::string &snap_name,
109                       const cls::rbd::SnapshotNamespace &snap_namespace);
110     void snapshot_remove(librados::ObjectWriteOperation *op, snapid_t snap_id);
111     void snapshot_rename(librados::ObjectWriteOperation *op,
112                         snapid_t src_snap_id,
113                         const std::string &dst_name);
114     int get_snapcontext(librados::IoCtx *ioctx, const std::string &oid,
115                         ::SnapContext *snapc);
116
117     void snapshot_list_start(librados::ObjectReadOperation *op,
118                              const std::vector<snapid_t> &ids);
119     int snapshot_list_finish(bufferlist::iterator *it,
120                              const std::vector<snapid_t> &ids,
121                              std::vector<string> *names,
122                              std::vector<uint64_t> *sizes,
123                              std::vector<ParentInfo> *parents,
124                              std::vector<uint8_t> *protection_statuses);
125     void snapshot_timestamp_list_start(librados::ObjectReadOperation *op,
126                                        const std::vector<snapid_t> &ids);
127
128     int snapshot_timestamp_list_finish(bufferlist::iterator *it,
129                                        const std::vector<snapid_t> &ids,
130                                        std::vector<utime_t> *timestamps);
131
132     int snapshot_timestamp_list(librados::IoCtx *ioctx, const std::string &oid,
133                                 const std::vector<snapid_t> &ids,
134                                 std::vector<utime_t> *timestamps);
135
136     int snapshot_list(librados::IoCtx *ioctx, const std::string &oid,
137                       const std::vector<snapid_t> &ids,
138                       std::vector<string> *names,
139                       std::vector<uint64_t> *sizes,
140                       std::vector<ParentInfo> *parents,
141                       std::vector<uint8_t> *protection_statuses);
142
143     void snapshot_namespace_list_start(librados::ObjectReadOperation *op,
144                                        const std::vector<snapid_t> &ids);
145     int snapshot_namespace_list_finish(bufferlist::iterator *it,
146                                        const std::vector<snapid_t> &ids,
147                                        std::vector<cls::rbd::SnapshotNamespace> *namespaces);
148     int snapshot_namespace_list(librados::IoCtx *ioctx, const std::string &oid,
149                                 const std::vector<snapid_t> &ids,
150                                 std::vector<cls::rbd::SnapshotNamespace> *namespaces);
151
152     void get_all_features_start(librados::ObjectReadOperation *op);
153     int get_all_features_finish(bufferlist::iterator *it,
154                                 uint64_t *all_features);
155     int get_all_features(librados::IoCtx *ioctx, const std::string &oid,
156                          uint64_t *all_features);
157
158     int copyup(librados::IoCtx *ioctx, const std::string &oid,
159                bufferlist data);
160     int get_protection_status(librados::IoCtx *ioctx, const std::string &oid,
161                               snapid_t snap_id, uint8_t *protection_status);
162     int set_protection_status(librados::IoCtx *ioctx, const std::string &oid,
163                               snapid_t snap_id, uint8_t protection_status);
164     void set_protection_status(librados::ObjectWriteOperation *op,
165                                snapid_t snap_id, uint8_t protection_status);
166     int snapshot_get_limit(librados::IoCtx *ioctx, const std::string &oid,
167                            uint64_t *limit);
168     void snapshot_set_limit(librados::ObjectWriteOperation *op,
169                             uint64_t limit);
170
171     void get_stripe_unit_count_start(librados::ObjectReadOperation *op);
172     int get_stripe_unit_count_finish(bufferlist::iterator *it,
173                                      uint64_t *stripe_unit,
174                                      uint64_t *stripe_count);
175     int get_stripe_unit_count(librados::IoCtx *ioctx, const std::string &oid,
176                               uint64_t *stripe_unit, uint64_t *stripe_count);
177
178     void set_stripe_unit_count(librados::ObjectWriteOperation *op,
179                                uint64_t stripe_unit, uint64_t stripe_count);
180     int set_stripe_unit_count(librados::IoCtx *ioctx, const std::string &oid,
181                               uint64_t stripe_unit, uint64_t stripe_count);
182     void get_create_timestamp_start(librados::ObjectReadOperation *op);
183     int get_create_timestamp_finish(bufferlist::iterator *it,
184                                     utime_t *timestamp);
185     int get_create_timestamp(librados::IoCtx *ioctx, const std::string &oid,
186                              utime_t *timestamp);
187     int metadata_list(librados::IoCtx *ioctx, const std::string &oid,
188                       const std::string &start, uint64_t max_return,
189                       map<string, bufferlist> *pairs);
190     void metadata_list_start(librados::ObjectReadOperation *op,
191                              const std::string &start, uint64_t max_return);
192     int metadata_list_finish(bufferlist::iterator *it,
193                              std::map<std::string, bufferlist> *pairs);
194     void metadata_set(librados::ObjectWriteOperation *op,
195                       const map<std::string, bufferlist> &data);
196     int metadata_set(librados::IoCtx *ioctx, const std::string &oid,
197                      const map<std::string, bufferlist> &data);
198     void metadata_remove(librados::ObjectWriteOperation *op,
199                          const std::string &key);
200     int metadata_remove(librados::IoCtx *ioctx, const std::string &oid,
201                         const std::string &key);
202     int metadata_get(librados::IoCtx *ioctx, const std::string &oid,
203                      const std::string &key, string *v);
204
205     // operations on rbd_id objects
206     void get_id_start(librados::ObjectReadOperation *op);
207     int get_id_finish(bufferlist::iterator *it, std::string *id);
208     int get_id(librados::IoCtx *ioctx, const std::string &oid, std::string *id);
209
210     void set_id(librados::ObjectWriteOperation *op, std::string id);
211     int set_id(librados::IoCtx *ioctx, const std::string &oid, std::string id);
212
213     // operations on rbd_directory objects
214     int dir_get_id(librados::IoCtx *ioctx, const std::string &oid,
215                    const std::string &name, std::string *id);
216     void dir_get_id_start(librados::ObjectReadOperation *op,
217                           const std::string &image_name);
218     int dir_get_id_finish(bufferlist::iterator *iter, std::string *image_id);
219     void dir_get_name_start(librados::ObjectReadOperation *op,
220                             const std::string &id);
221     int dir_get_name_finish(bufferlist::iterator *it, std::string *name);
222     int dir_get_name(librados::IoCtx *ioctx, const std::string &oid,
223                      const std::string &id, std::string *name);
224     void dir_list_start(librados::ObjectReadOperation *op,
225                         const std::string &start, uint64_t max_return);
226     int dir_list_finish(bufferlist::iterator *it, map<string, string> *images);
227     int dir_list(librados::IoCtx *ioctx, const std::string &oid,
228                  const std::string &start, uint64_t max_return,
229                  map<string, string> *images);
230     void dir_add_image(librados::ObjectWriteOperation *op,
231                        const std::string &name, const std::string &id);
232     int dir_add_image(librados::IoCtx *ioctx, const std::string &oid,
233                       const std::string &name, const std::string &id);
234     int dir_remove_image(librados::IoCtx *ioctx, const std::string &oid,
235                          const std::string &name, const std::string &id);
236     void dir_remove_image(librados::ObjectWriteOperation *op,
237                           const std::string &name, const std::string &id);
238     // atomic remove and add
239     void dir_rename_image(librados::ObjectWriteOperation *op,
240                           const std::string &src, const std::string &dest,
241                           const std::string &id);
242
243     // operations on the rbd_object_map.$image_id object
244     void object_map_load_start(librados::ObjectReadOperation *op);
245     int object_map_load_finish(bufferlist::iterator *it,
246                                ceph::BitVector<2> *object_map);
247     int object_map_load(librados::IoCtx *ioctx, const std::string &oid,
248                         ceph::BitVector<2> *object_map);
249     void object_map_save(librados::ObjectWriteOperation *rados_op,
250                          const ceph::BitVector<2> &object_map);
251     void object_map_resize(librados::ObjectWriteOperation *rados_op,
252                            uint64_t object_count, uint8_t default_state);
253     void object_map_update(librados::ObjectWriteOperation *rados_op,
254                            uint64_t start_object_no, uint64_t end_object_no,
255                            uint8_t new_object_state,
256                            const boost::optional<uint8_t> &current_object_state);
257     void object_map_snap_add(librados::ObjectWriteOperation *rados_op);
258     void object_map_snap_remove(librados::ObjectWriteOperation *rados_op,
259                                 const ceph::BitVector<2> &object_map);
260
261     // class operations on the old format, kept for
262     // backwards compatability
263     void old_snapshot_add(librados::ObjectWriteOperation *rados_op,
264                           snapid_t snap_id, const std::string &snap_name);
265     void old_snapshot_remove(librados::ObjectWriteOperation *rados_op,
266                             const std::string &snap_name);
267     void old_snapshot_rename(librados::ObjectWriteOperation *rados_op,
268                              snapid_t src_snap_id, const std::string &dst_name);
269
270     void old_snapshot_list_start(librados::ObjectReadOperation *op);
271     int old_snapshot_list_finish(bufferlist::iterator *it,
272                                  std::vector<string> *names,
273                                  std::vector<uint64_t> *sizes,
274                                  ::SnapContext *snapc);
275     int old_snapshot_list(librados::IoCtx *ioctx, const std::string &oid,
276                           std::vector<string> *names,
277                           std::vector<uint64_t> *sizes,
278                           ::SnapContext *snapc);
279
280     // operations on the rbd_mirroring object
281     void mirror_uuid_get_start(librados::ObjectReadOperation *op);
282     int mirror_uuid_get_finish(bufferlist::iterator *it,
283                                std::string *uuid);
284     int mirror_uuid_get(librados::IoCtx *ioctx, std::string *uuid);
285     int mirror_uuid_set(librados::IoCtx *ioctx, const std::string &uuid);
286     void mirror_mode_get_start(librados::ObjectReadOperation *op);
287     int mirror_mode_get_finish(bufferlist::iterator *it,
288                                cls::rbd::MirrorMode *mirror_mode);
289     int mirror_mode_get(librados::IoCtx *ioctx,
290                         cls::rbd::MirrorMode *mirror_mode);
291     int mirror_mode_set(librados::IoCtx *ioctx,
292                         cls::rbd::MirrorMode mirror_mode);
293     int mirror_peer_list(librados::IoCtx *ioctx,
294                          std::vector<cls::rbd::MirrorPeer> *peers);
295     int mirror_peer_add(librados::IoCtx *ioctx, const std::string &uuid,
296                         const std::string &cluster_name,
297                         const std::string &client_name,
298                         int64_t pool_id = -1);
299     int mirror_peer_remove(librados::IoCtx *ioctx,
300                            const std::string &uuid);
301     int mirror_peer_set_client(librados::IoCtx *ioctx,
302                                const std::string &uuid,
303                                const std::string &client_name);
304     int mirror_peer_set_cluster(librados::IoCtx *ioctx,
305                                 const std::string &uuid,
306                                 const std::string &cluster_name);
307     void mirror_image_list_start(librados::ObjectReadOperation *op,
308                                  const std::string &start, uint64_t max_return);
309     int mirror_image_list_finish(bufferlist::iterator *it,
310                                  std::map<string, string> *mirror_image_ids);
311     int mirror_image_list(librados::IoCtx *ioctx,
312                           const std::string &start, uint64_t max_return,
313                           std::map<std::string, std::string> *mirror_image_ids);
314     void mirror_image_get_image_id_start(librados::ObjectReadOperation *op,
315                                          const std::string &global_image_id);
316     int mirror_image_get_image_id_finish(bufferlist::iterator *it,
317                                          std::string *image_id);
318     int mirror_image_get_image_id(librados::IoCtx *ioctx,
319                                   const std::string &global_image_id,
320                                   std::string *image_id);
321     int mirror_image_get(librados::IoCtx *ioctx, const std::string &image_id,
322                          cls::rbd::MirrorImage *mirror_image);
323     void mirror_image_get_start(librados::ObjectReadOperation *op,
324                                 const std::string &image_id);
325     int mirror_image_get_finish(bufferlist::iterator *iter,
326                                 cls::rbd::MirrorImage *mirror_image);
327     void mirror_image_set(librados::ObjectWriteOperation *op,
328                           const std::string &image_id,
329                           const cls::rbd::MirrorImage &mirror_image);
330     int mirror_image_set(librados::IoCtx *ioctx, const std::string &image_id,
331                          const cls::rbd::MirrorImage &mirror_image);
332     void mirror_image_remove(librados::ObjectWriteOperation *op,
333                              const std::string &image_id);
334     int mirror_image_remove(librados::IoCtx *ioctx,
335                             const std::string &image_id);
336     int mirror_image_status_set(librados::IoCtx *ioctx,
337                                 const std::string &global_image_id,
338                                 const cls::rbd::MirrorImageStatus &status);
339     void mirror_image_status_set(librados::ObjectWriteOperation *op,
340                                  const std::string &global_image_id,
341                                  const cls::rbd::MirrorImageStatus &status);
342     int mirror_image_status_remove(librados::IoCtx *ioctx,
343                                    const std::string &global_image_id);
344     void mirror_image_status_remove(librados::ObjectWriteOperation *op,
345                                     const std::string &global_image_id);
346     int mirror_image_status_get(librados::IoCtx *ioctx,
347                                 const std::string &global_image_id,
348                                 cls::rbd::MirrorImageStatus *status);
349     void mirror_image_status_get_start(librados::ObjectReadOperation *op,
350                                        const std::string &global_image_id);
351     int mirror_image_status_get_finish(bufferlist::iterator *iter,
352                                        cls::rbd::MirrorImageStatus *status);
353     int mirror_image_status_list(librados::IoCtx *ioctx,
354         const std::string &start, uint64_t max_return,
355         std::map<std::string, cls::rbd::MirrorImage> *images,
356         std::map<std::string, cls::rbd::MirrorImageStatus> *statuses);
357     void mirror_image_status_list_start(librados::ObjectReadOperation *op,
358                                         const std::string &start,
359                                         uint64_t max_return);
360     int mirror_image_status_list_finish(bufferlist::iterator *iter,
361         std::map<std::string, cls::rbd::MirrorImage> *images,
362         std::map<std::string, cls::rbd::MirrorImageStatus> *statuses);
363     int mirror_image_status_get_summary(librados::IoCtx *ioctx,
364         std::map<cls::rbd::MirrorImageStatusState, int> *states);
365     void mirror_image_status_get_summary_start(librados::ObjectReadOperation *op);
366     int mirror_image_status_get_summary_finish(bufferlist::iterator *iter,
367         std::map<cls::rbd::MirrorImageStatusState, int> *states);
368     int mirror_image_status_remove_down(librados::IoCtx *ioctx);
369     void mirror_image_status_remove_down(librados::ObjectWriteOperation *op);
370
371     void mirror_instances_list_start(librados::ObjectReadOperation *op);
372     int mirror_instances_list_finish(bufferlist::iterator *iter,
373                                      std::vector<std::string> *instance_ids);
374     int mirror_instances_list(librados::IoCtx *ioctx,
375                               std::vector<std::string> *instance_ids);
376     void mirror_instances_add(librados::ObjectWriteOperation *op,
377                               const std::string &instance_id);
378     int mirror_instances_add(librados::IoCtx *ioctx,
379                              const std::string &instance_id);
380     void mirror_instances_remove(librados::ObjectWriteOperation *op,
381                                  const std::string &instance_id);
382     int mirror_instances_remove(librados::IoCtx *ioctx,
383                                 const std::string &instance_id);
384
385     // Consistency groups functions
386     int group_create(librados::IoCtx *ioctx, const std::string &oid);
387     int group_dir_list(librados::IoCtx *ioctx, const std::string &oid,
388                     const std::string &start, uint64_t max_return,
389                     map<string, string> *groups);
390     int group_dir_add(librados::IoCtx *ioctx, const std::string &oid,
391                    const std::string &name, const std::string &id);
392     int group_dir_remove(librados::IoCtx *ioctx, const std::string &oid,
393                       const std::string &name, const std::string &id);
394     int group_image_remove(librados::IoCtx *ioctx, const std::string &oid,
395                            const cls::rbd::GroupImageSpec &spec);
396     int group_image_list(librados::IoCtx *ioctx, const std::string &oid,
397                          const cls::rbd::GroupImageSpec &start,
398                          uint64_t max_return,
399                          std::vector<cls::rbd::GroupImageStatus> *images);
400     int group_image_set(librados::IoCtx *ioctx, const std::string &oid,
401                         const cls::rbd::GroupImageStatus &st);
402     int image_add_group(librados::IoCtx *ioctx, const std::string &oid,
403                         const cls::rbd::GroupSpec &group_spec);
404     int image_remove_group(librados::IoCtx *ioctx, const std::string &oid,
405                            const cls::rbd::GroupSpec &group_spec);
406     void image_get_group_start(librados::ObjectReadOperation *op);
407     int image_get_group_finish(bufferlist::iterator *iter,
408                                cls::rbd::GroupSpec *group_spec);
409     int image_get_group(librados::IoCtx *ioctx, const std::string &oid,
410                         cls::rbd::GroupSpec *group_spec);
411
412     // operations on rbd_trash object
413     void trash_add(librados::ObjectWriteOperation *op,
414                    const std::string &id,
415                    const cls::rbd::TrashImageSpec &trash_spec);
416     int trash_add(librados::IoCtx *ioctx, const std::string &id,
417                   const cls::rbd::TrashImageSpec &trash_spec);
418     void trash_remove(librados::ObjectWriteOperation *op,
419                       const std::string &id);
420     int trash_remove(librados::IoCtx *ioctx, const std::string &id);
421     void trash_list_start(librados::ObjectReadOperation *op,
422                           const std::string &start, uint64_t max_return);
423     int trash_list_finish(bufferlist::iterator *it,
424                           map<string, cls::rbd::TrashImageSpec> *entries);
425     int trash_list(librados::IoCtx *ioctx,
426                    const std::string &start, uint64_t max_return,
427                    map<string, cls::rbd::TrashImageSpec> *entries);
428     void trash_get_start(librados::ObjectReadOperation *op,
429                          const std::string &id);
430     int trash_get_finish(bufferlist::iterator *it,
431                          cls::rbd::TrashImageSpec *trash_spec);
432     int trash_get(librados::IoCtx *ioctx, const std::string &id,
433                   cls::rbd::TrashImageSpec *trash_spec);
434
435   } // namespace cls_client
436 } // namespace librbd
437 #endif // CEPH_LIBRBD_CLS_RBD_CLIENT_H