initial code repo
[stor4nfv.git] / src / ceph / src / tools / rbd / Utils.h
diff --git a/src/ceph/src/tools/rbd/Utils.h b/src/ceph/src/tools/rbd/Utils.h
new file mode 100644 (file)
index 0000000..d60a7b3
--- /dev/null
@@ -0,0 +1,216 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef CEPH_RBD_UTILS_H
+#define CEPH_RBD_UTILS_H
+
+#include "include/int_types.h"
+#include "include/rados/librados.hpp"
+#include "include/rbd/librbd.hpp"
+#include "tools/rbd/ArgumentTypes.h"
+#include <string>
+#include <boost/program_options.hpp>
+
+namespace rbd {
+namespace utils {
+
+namespace detail {
+
+template <typename T, void(T::*MF)(int)>
+void aio_completion_callback(librbd::completion_t completion,
+                                    void *arg) {
+  librbd::RBD::AioCompletion *aio_completion =
+    reinterpret_cast<librbd::RBD::AioCompletion*>(completion);
+
+  // complete the AIO callback in separate thread context
+  T *t = reinterpret_cast<T *>(arg);
+  int r = aio_completion->get_return_value();
+  aio_completion->release();
+
+  (t->*MF)(r);
+}
+
+} // namespace detail
+
+static const std::string RBD_DIFF_BANNER ("rbd diff v1\n");
+static const size_t RBD_DEFAULT_SPARSE_SIZE = 4096;
+
+static const std::string RBD_IMAGE_BANNER_V2 ("rbd image v2\n");
+static const std::string RBD_IMAGE_DIFFS_BANNER_V2 ("rbd image diffs v2\n");
+static const std::string RBD_DIFF_BANNER_V2 ("rbd diff v2\n");
+
+#define RBD_DIFF_FROM_SNAP     'f'
+#define RBD_DIFF_TO_SNAP       't'
+#define RBD_DIFF_IMAGE_SIZE    's'
+#define RBD_DIFF_WRITE         'w'
+#define RBD_DIFF_ZERO          'z'
+#define RBD_DIFF_END           'e'
+
+#define RBD_EXPORT_IMAGE_ORDER         'O'
+#define RBD_EXPORT_IMAGE_FEATURES      'T'
+#define RBD_EXPORT_IMAGE_STRIPE_UNIT   'U'
+#define RBD_EXPORT_IMAGE_STRIPE_COUNT  'C'
+#define RBD_EXPORT_IMAGE_END           'E'
+
+enum SnapshotPresence {
+  SNAPSHOT_PRESENCE_NONE,
+  SNAPSHOT_PRESENCE_PERMITTED,
+  SNAPSHOT_PRESENCE_REQUIRED
+};
+
+enum SpecValidation {
+  SPEC_VALIDATION_FULL,
+  SPEC_VALIDATION_SNAP,
+  SPEC_VALIDATION_NONE
+};
+
+struct ProgressContext : public librbd::ProgressContext {
+  const char *operation;
+  bool progress;
+  int last_pc;
+
+  ProgressContext(const char *o, bool no_progress)
+    : operation(o), progress(!no_progress), last_pc(0) {
+  }
+
+  int update_progress(uint64_t offset, uint64_t total) override;
+  void finish();
+  void fail();
+};
+
+template <typename T, void(T::*MF)(int)>
+librbd::RBD::AioCompletion *create_aio_completion(T *t) {
+  return new librbd::RBD::AioCompletion(
+    t, &detail::aio_completion_callback<T, MF>);
+}
+
+void aio_context_callback(librbd::completion_t completion, void *arg);
+
+int read_string(int fd, unsigned max, std::string *out);
+
+int extract_spec(const std::string &spec, std::string *pool_name,
+                 std::string *image_name, std::string *snap_name,
+                 SpecValidation spec_validation);
+
+int extract_group_spec(const std::string &spec,
+                      std::string *pool_name,
+                      std::string *group_name);
+
+int extract_image_id_spec(const std::string &spec, std::string *pool_name,
+                          std::string *image_id);
+
+std::string get_positional_argument(
+    const boost::program_options::variables_map &vm, size_t index);
+
+std::string get_default_pool_name();
+std::string get_pool_name(const boost::program_options::variables_map &vm,
+                          size_t *arg_index);
+
+int get_pool_image_snapshot_names(
+    const boost::program_options::variables_map &vm,
+    argument_types::ArgumentModifier mod, size_t *spec_arg_index,
+    std::string *pool_name, std::string *image_name, std::string *snap_name,
+    SnapshotPresence snapshot_presence, SpecValidation spec_validation,
+    bool image_required = true);
+
+int get_pool_snapshot_names(const boost::program_options::variables_map &vm,
+                            argument_types::ArgumentModifier mod,
+                            size_t *spec_arg_index, std::string *pool_name,
+                            std::string *snap_name,
+                            SnapshotPresence snapshot_presence,
+                            SpecValidation spec_validation);
+
+int get_special_pool_group_names(const boost::program_options::variables_map &vm,
+                                size_t *arg_index,
+                                std::string *group_pool_name,
+                                std::string *group_name);
+
+int get_special_pool_image_names(const boost::program_options::variables_map &vm,
+                                size_t *arg_index,
+                                std::string *image_pool_name,
+                                std::string *image_name);
+
+int get_pool_image_id(const boost::program_options::variables_map &vm,
+                     size_t *arg_index, std::string *image_pool_name,
+                     std::string *image_id);
+
+int get_pool_group_names(const boost::program_options::variables_map &vm,
+                        argument_types::ArgumentModifier mod,
+                        size_t *spec_arg_index,
+                        std::string *pool_name,
+                        std::string *group_name);
+
+int get_pool_journal_names(
+    const boost::program_options::variables_map &vm,
+    argument_types::ArgumentModifier mod, size_t *spec_arg_index,
+    std::string *pool_name, std::string *journal_name);
+
+int validate_snapshot_name(argument_types::ArgumentModifier mod,
+                           const std::string &snap_name,
+                           SnapshotPresence snapshot_presence,
+                          SpecValidation spec_validation);
+
+int get_image_options(const boost::program_options::variables_map &vm,
+                      bool get_format, librbd::ImageOptions* opts);
+
+int get_journal_options(const boost::program_options::variables_map &vm,
+                       librbd::ImageOptions *opts);
+
+int get_image_size(const boost::program_options::variables_map &vm,
+                   uint64_t *size);
+
+int get_path(const boost::program_options::variables_map &vm,
+             const std::string &positional_path, std::string *path);
+
+int get_formatter(const boost::program_options::variables_map &vm,
+                  argument_types::Format::Formatter *formatter);
+
+void init_context();
+
+int init(const std::string &pool_name, librados::Rados *rados,
+         librados::IoCtx *io_ctx);
+
+int init_io_ctx(librados::Rados &rados, const std::string &pool_name,
+                librados::IoCtx *io_ctx);
+
+int open_image(librados::IoCtx &io_ctx, const std::string &image_name,
+               bool read_only, librbd::Image *image);
+
+int open_image_by_id(librados::IoCtx &io_ctx, const std::string &image_id,
+                     bool read_only, librbd::Image *image);
+
+int init_and_open_image(const std::string &pool_name,
+                        const std::string &image_name,
+                        const std::string &image_id,
+                        const std::string &snap_name, bool read_only,
+                        librados::Rados *rados, librados::IoCtx *io_ctx,
+                        librbd::Image *image);
+
+int snap_set(librbd::Image &image, const std::string &snap_name);
+
+void calc_sparse_extent(const bufferptr &bp,
+                        size_t sparse_size,
+                       size_t buffer_offset,
+                        uint64_t length,
+                        size_t *write_length,
+                       bool *zeroed);
+
+bool check_if_image_spec_present(const boost::program_options::variables_map &vm,
+                                 argument_types::ArgumentModifier mod,
+                                 size_t spec_arg_index);
+
+std::string image_id(librbd::Image& image);
+
+std::string mirror_image_state(librbd::mirror_image_state_t mirror_image_state);
+std::string mirror_image_status_state(librbd::mirror_image_status_state_t state);
+std::string mirror_image_status_state(librbd::mirror_image_status_t status);
+
+std::string timestr(time_t t);
+
+// duplicate here to not include librbd_internal lib
+uint64_t get_rbd_default_features(CephContext* cct);
+
+} // namespace utils
+} // namespace rbd
+
+#endif // CEPH_RBD_UTILS_H