]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: Add RGWSystemMetaObj class
authorOrit Wasserman <owasserm@redhat.com>
Fri, 19 Jun 2015 13:21:55 +0000 (15:21 +0200)
committerYehuda Sadeh <yehuda@redhat.com>
Tue, 9 Feb 2016 20:59:42 +0000 (12:59 -0800)
Signed-off-by: Orit Wasserman <owasserm@redhat.com>
Conflicts:
src/rgw/rgw_rados.cc

src/common/config_opts.h
src/rgw/rgw_json_enc.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index 3bdf1447df40c46aa3286f229d43de542a6a91a7..90c8d7a59a135a3749f241c24244d76166b7cf8b 100644 (file)
@@ -1206,6 +1206,9 @@ OPTION(rgw_zone_root_pool, OPT_STR, ".rgw.root")    // pool where zone specific
 OPTION(rgw_region, OPT_STR, "") // region name
 OPTION(rgw_region_root_pool, OPT_STR, ".rgw.root")  // pool where all region info is stored
 OPTION(rgw_default_region_info_oid, OPT_STR, "default.region")  // oid where default region info is stored
+OPTION(rgw_realm, OPT_STR, "") // realm name
+OPTION(rgw_realm_root_pool, OPT_STR, ".rgw.root")  // pool where all region info is stored
+OPTION(rgw_default_realm_info_oid, OPT_STR, "default.realm")  // oid where default region info is stored
 OPTION(rgw_log_nonexistent_bucket, OPT_BOOL, false)
 OPTION(rgw_log_object_name, OPT_STR, "%Y-%m-%d-%H-%i-%n")      // man date to see codes (a subset are supported)
 OPTION(rgw_log_object_name_utc, OPT_BOOL, false)
index 6ab27b493928d3609a97c585ae8a0bb6cdd3b05c..98594799c10926edf9bf10de137001b074050cb0 100644 (file)
@@ -716,6 +716,18 @@ void RGWNameToId::decode_json(JSONObj *obj) {
   JSONDecoder::decode_json("obj_id", obj_id, obj);
 }
 
+void RGWSystemMetaObj::dump(Formatter *f) const
+{
+  encode_json("id", id , f);
+  encode_json("name", name , f);
+}
+
+void RGWSystemMetaObj::decode_json(JSONObj *obj)
+{
+  JSONDecoder::decode_json("id", id, obj);
+  JSONDecoder::decode_json("name", name, obj);
+}
+
 void RGWZoneParams::dump(Formatter *f) const
 {
   encode_json("domain_root", domain_root.data_pool, f);
@@ -887,6 +899,31 @@ void RGWDataChangesLogInfo::decode_json(JSONObj *obj)
   JSONDecoder::decode_json("last_update", last_update, obj);
 }
 
+
+void RGWRealm::dump(Formatter *f) const
+{
+  encode_json("name", name, f);
+  encode_json("id", id, f);
+  encode_json("master_zonegroup", master_zonegroup, f);
+  encode_json_map("zonegroups", zonegroups, f);
+}
+
+static void decode_zonegroups(map<string, RGWRegion>& zonegroups, JSONObj *o)
+{
+  RGWRegion zg;
+  zg.decode_json(o);
+  zonegroups[zg.name] = zg;
+}
+
+void RGWRealm::decode_json(JSONObj *obj)
+{
+  JSONDecoder::decode_json("name", name, obj);
+  JSONDecoder::decode_json("id", id, obj);
+  JSONDecoder::decode_json("master_zonegroup", master_zonegroup, obj);
+  JSONDecoder::decode_json("zonegroups", zonegroups, decode_zonegroups, obj);
+}
+
+
 void KeystoneToken::Metadata::decode_json(JSONObj *obj)
 {
   JSONDecoder::decode_json("is_admin", is_admin, obj);
index 53f44c78a5c0d366d7577f224e5b24f82278a410..22b842e3e9941c0d1fcd3a3d8514825dbb0cc6e4 100644 (file)
@@ -71,10 +71,12 @@ static string avail_pools = ".pools.avail";
 
 static string zone_info_oid_prefix = "zone_info.";
 static string region_info_oid_prefix = "region_info.";
-
+static string realm_names_oid_prefix = "realms_names.";
+static string realm_info_oid_prefix = "realms.";
 static string default_region_info_oid = "default.region";
 static string region_map_oid = "region_map";
 static string log_lock_name = "rgw_log_lock";
+static string default_realm_info_oid = "default.realm";
 
 static RGWObjCategory main_category = RGW_OBJ_CATEGORY_MAIN;
 
@@ -82,6 +84,7 @@ static RGWObjCategory main_category = RGW_OBJ_CATEGORY_MAIN;
 
 #define RGW_DEFAULT_ZONE_ROOT_POOL "rgw.root"
 #define RGW_DEFAULT_REGION_ROOT_POOL "rgw.root"
+#define RGW_DEFAULT_REALM_ROOT_POOL "rgw.root"
 
 #define RGW_STATELOG_OBJ_PREFIX "statelog."
 
@@ -305,6 +308,313 @@ int RGWRegion::equals(const string& other_region)
   return (name == other_region);
 }
 
+int RGWSystemMetaObj::init(CephContext *_cct, RGWRados *_store, bool setup_obj)
+{
+  cct = _cct;
+  store = _store;
+
+  if (!setup_obj)
+    return 0;
+
+  if (id.empty()) {
+    int r;
+    if (name.empty()) {
+      r = use_default();
+      if (r < 0) {
+       return r;
+      }
+    } else {
+      r = read_id(name, id);
+      if (r < 0) {
+       lderr(cct) << "error in read_id fir id " << id << " : " << cpp_strerror(-r) << dendl;
+       return r;
+      }
+    }
+  }
+
+  return read_info(id);
+}
+
+int RGWSystemMetaObj::read_default(RGWDefaultSystemMetaObjInfo& default_info)
+{
+  string pool_name = get_pool_name(cct);
+  string oid =  get_default_oid();
+
+  rgw_bucket pool(pool_name.c_str());
+  bufferlist bl;
+  RGWObjectCtx obj_ctx(store);
+  int ret = rgw_get_system_obj(store, obj_ctx, pool, oid, bl, NULL, NULL);
+  if (ret < 0)
+    return ret;
+
+  try {
+    bufferlist::iterator iter = bl.begin();
+    ::decode(default_info, iter);
+  } catch (buffer::error& err) {
+    derr << "error decoding data from " << pool << ":" << oid << dendl;
+    return -EIO;
+  }
+
+  return 0;
+}
+
+int RGWSystemMetaObj::read_default_id(string& default_id)
+{
+  RGWDefaultSystemMetaObjInfo default_info;
+
+  int ret = read_default(default_info);
+  if (ret < 0) {
+    return ret;
+  }
+
+  default_id = default_info.default_id;
+
+  return 0;
+}
+
+int RGWSystemMetaObj::use_default()
+{
+  RGWDefaultSystemMetaObjInfo default_info;
+  int ret = read_default(default_info);
+  if (ret < 0)
+    return ret;
+
+  id = default_info.default_id;
+
+  return 0;
+}
+
+int RGWSystemMetaObj::set_as_default()
+{
+  string pool_name = get_pool_name(cct);
+  string oid  = get_default_oid();
+
+  rgw_bucket pool(pool_name.c_str());
+  bufferlist bl;
+
+  RGWDefaultSystemMetaObjInfo default_info;
+  default_info.default_id = id;
+
+  ::encode(default_info, bl);
+
+  int ret = rgw_put_system_obj(store, pool, oid, bl.c_str(), bl.length(), false, NULL, 0, NULL);
+  if (ret < 0)
+    return ret;
+
+  return 0;
+}
+
+int RGWSystemMetaObj::read_id(const string& obj_name, string& object_id)
+{
+  string pool_name = get_pool_name(cct);
+  rgw_bucket pool(pool_name.c_str());
+  bufferlist bl;
+
+  string oid = get_names_oid_prefix() + obj_name;
+
+  RGWObjectCtx obj_ctx(store);
+  int ret = rgw_get_system_obj(store, obj_ctx, pool, oid, bl, NULL, NULL);
+  if (ret < 0) {
+    return ret;
+  }
+
+  RGWNameToId nameToId;
+  try {
+    bufferlist::iterator iter = bl.begin();
+    ::decode(nameToId, iter);
+  } catch (buffer::error& err) {
+    ldout(cct, 0) << "ERROR: failed to decode obj from " << pool << ":" << oid << dendl;
+    return -EIO;
+  }
+  object_id = nameToId.obj_id;
+  return 0;
+}
+
+int RGWSystemMetaObj::delete_obj()
+{
+  string pool_name = get_pool_name(cct);
+  rgw_bucket pool(pool_name.c_str());
+
+  /* check to see if obj is the default */
+  RGWDefaultSystemMetaObjInfo default_info;
+  int ret = read_default(default_info);
+  if (ret < 0 && ret != -ENOENT)
+    return ret;
+  if (default_info.default_id == id) {
+    string oid = get_default_oid();
+    rgw_obj default_named_obj(pool, oid);
+    ret = store->delete_system_obj(default_named_obj);
+    if (ret < 0) {
+      lderr(cct) << "Error delete default obj name  " << name << ": " << cpp_strerror(-ret) << dendl;
+      return ret;
+    }
+  }
+  string oid  = get_names_oid_prefix() + name;
+  rgw_obj object_name(pool, oid);
+  ret = store->delete_system_obj(object_name);
+  if (ret < 0) {
+    lderr(cct) << "Error delete obj name  " << name << ": " << cpp_strerror(-ret) << dendl;
+    return ret;
+  }
+
+  oid  = get_info_oid_prefix() + id;
+  rgw_obj object_id(pool, oid);
+  ret = store->delete_system_obj(object_id);
+  if (ret < 0) {
+    lderr(cct) << "Error delete object id " << id << ": " << cpp_strerror(-ret) << dendl;
+  }
+
+  return ret;
+}
+
+int RGWSystemMetaObj::store_name(bool exclusive)
+{
+  string pool_name = get_pool_name(cct);
+
+  rgw_bucket pool(pool_name.c_str());
+  string oid = get_names_oid_prefix() + name;
+
+  RGWNameToId nameToId;
+  nameToId.obj_id = id;
+
+  bufferlist bl;
+  ::encode(nameToId, bl);
+  return  rgw_put_system_obj(store, pool, oid, bl.c_str(), bl.length(), exclusive, NULL, 0, NULL);
+}
+
+int RGWSystemMetaObj::rename(const string& new_name)
+{
+  string new_id;
+  int ret = read_id(new_name, new_id);
+  if (!ret) {
+    return -EEXIST;
+  }
+  if (ret < 0) {
+    lderr(cct) << "Error read_id " << new_name << ": " << cpp_strerror(-ret) << dendl;
+    return ret;
+  }
+  string old_name = name;
+  name = new_name;
+  ret = store_info(true);
+  if (ret < 0) {
+    lderr(cct) << "Error storing new obj info " << new_name << ": " << cpp_strerror(-ret) << dendl;
+    return ret;
+  }
+  ret = store_name(true);
+  if (ret < 0) {
+    lderr(cct) << "Error storing new name " << new_name << ": " << cpp_strerror(-ret) << dendl;
+    return ret;
+  }
+  /* delete old name */
+  string pool_name = get_pool_name(cct);
+  rgw_bucket pool(pool_name.c_str());
+  string oid = get_names_oid_prefix() + old_name;
+  rgw_obj old_name_obj(pool, oid);
+  ret = store->delete_system_obj(old_name_obj);
+  if (ret < 0) {
+    lderr(cct) << "Error delete old obj name  " << old_name << ": " << cpp_strerror(-ret) << dendl;
+    return ret;
+  }
+
+  return ret;
+}
+
+int RGWSystemMetaObj::read_info(const string& obj_id)
+{
+  string pool_name = get_pool_name(cct);
+
+  rgw_bucket pool(pool_name.c_str());
+  bufferlist bl;
+
+  string oid= get_info_oid_prefix() + obj_id;
+
+  RGWObjectCtx obj_ctx(store);
+  int ret = rgw_get_system_obj(store, obj_ctx, pool, oid, bl, NULL, NULL);
+  if (ret < 0) {
+    lderr(cct) << "failed reading obj info from " << pool << ":" << oid << ": " << cpp_strerror(-ret) << dendl;
+    return ret;
+  }
+
+  try {
+    bufferlist::iterator iter = bl.begin();
+    ::decode(*this, iter);
+  } catch (buffer::error& err) {
+    ldout(cct, 0) << "ERROR: failed to decode obj from " << pool << ":" << oid << dendl;
+    return -EIO;
+  }
+
+  return 0;
+}
+
+int RGWSystemMetaObj::create()
+{
+  int ret;
+
+  /* check to see the name is not used */
+  ret = read_id(name, id);
+  if (ret == 0) {
+    ldout(cct, 0) << "ERROR: name already in use for obj id " << id << dendl;
+    return -EEXIST;
+  } else if ( ret != -ENOENT) {
+    lderr(cct) << "failed reading obj id  " << id << ": " << cpp_strerror(-ret) << dendl;
+    return ret;
+  }
+
+  /* create unique id */
+  uuid_d new_uuid;
+  char uuid_str[37];
+  new_uuid.generate_random();
+  new_uuid.print(uuid_str);
+  id = uuid_str;
+
+  ret = store_info(true);
+  if (ret < 0) {
+    ldout(cct, 0) << "ERROR:  storing info for " << id << ": " << cpp_strerror(-ret) << dendl;
+    return ret;
+  }
+
+  return store_name(true);
+}
+
+int RGWSystemMetaObj::store_info(bool exclusive)
+{
+  string pool_name = get_pool_name(cct);
+
+  rgw_bucket pool(pool_name.c_str());
+
+  string oid = get_info_oid_prefix() + id;
+
+  bufferlist bl;
+  ::encode(*this, bl);
+  return  rgw_put_system_obj(store, pool, oid, bl.c_str(), bl.length(), exclusive, NULL, 0, NULL);
+}
+
+const string& RGWRealm::get_pool_name(CephContext *cct)
+{
+  if (cct->_conf->rgw_realm_root_pool.empty()) {
+    return RGW_DEFAULT_REALM_ROOT_POOL;
+  }
+  return cct->_conf->rgw_realm_root_pool;
+}
+
+const string& RGWRealm::get_default_oid()
+{
+  if (cct->_conf->rgw_default_realm_info_oid.empty()) {
+    return default_realm_info_oid;
+  }
+  return cct->_conf->rgw_default_realm_info_oid;
+}
+
+const string& RGWRealm::get_names_oid_prefix()
+{
+  return realm_names_oid_prefix;
+}
+
+const string& RGWRealm::get_info_oid_prefix()
+{
+  return realm_info_oid_prefix;
+}
+
 void RGWZoneParams::init_default(RGWRados *store)
 {
   domain_root = "rgw.data.root";
index 3c12f04b765291dc6c5d2f5c61d03bc1232917a6..a1941704021a36ad05e39d7872fed19bb0980898 100644 (file)
@@ -731,6 +731,68 @@ struct RGWNameToId {
 };
 WRITE_CLASS_ENCODER(RGWNameToId)
 
+class RGWSystemMetaObj {
+protected:
+  string id;
+  string name;
+
+  CephContext *cct;
+  RGWRados *store;
+
+  int store_name(bool exclusive);
+  int store_info(bool exclusive);
+  int read_info(const string& obj_id);
+  int read_id(const string& obj_name, string& obj_id);
+  int read_default(RGWDefaultSystemMetaObjInfo& default_info);
+  /* read and use default id */
+  int use_default();
+
+public:
+  RGWSystemMetaObj() {}
+  RGWSystemMetaObj(const string& _name): name(_name)  {}
+  RGWSystemMetaObj(const string& _id, const string& _name) : id(_id), name(_name) {}
+  RGWSystemMetaObj(CephContext *_cct, RGWRados *_store): cct(_cct), store(_store){}
+  RGWSystemMetaObj(const string& _name, CephContext *_cct, RGWRados *_store): name(_name), cct(_cct), store(_store){}
+  const string& get_name() { return name; }
+  const string& get_id() { return id; }
+
+  virtual ~RGWSystemMetaObj() {}
+
+  void encode(bufferlist& bl) const {
+    ENCODE_START(1, 1, bl);
+    ::encode(id, bl);
+    ::encode(name, bl);
+    ENCODE_FINISH(bl);
+  }
+
+  void decode(bufferlist::iterator& bl) {
+    DECODE_START(1, bl);
+    ::decode(id, bl);
+    ::decode(name, bl);
+    DECODE_FINISH(bl);
+  }
+
+  int init(CephContext *_cct, RGWRados *_store, bool setup_obj = true);
+  int read_default_id(string& default_id);
+  int set_as_default();
+  int delete_default();
+  int create();
+  int delete_obj();
+  int rename(const string& new_name);
+  int update() { return store_info(false);}
+
+
+  virtual const string& get_pool_name(CephContext *cct) = 0;
+
+  virtual const string& get_default_oid() = 0;
+  virtual const string& get_names_oid_prefix() = 0;
+  virtual const string& get_info_oid_prefix() = 0;
+
+  void dump(Formatter *f) const;
+  void decode_json(JSONObj *obj);
+};
+WRITE_CLASS_ENCODER(RGWSystemMetaObj)
+
 struct RGWRegion;
 
 struct RGWZonePlacementInfo {
@@ -1092,6 +1154,42 @@ struct objexp_hint_entry {
 };
 WRITE_CLASS_ENCODER(objexp_hint_entry)
 
+class RGWRealm : public RGWSystemMetaObj
+{
+  string master_zonegroup;
+  map<string, RGWRegion> zonegroups;
+
+public:
+  RGWRealm(const string& _id, const string& _name) : RGWSystemMetaObj(_id, _name) {}
+  RGWRealm(CephContext *_cct, RGWRados *_store): RGWSystemMetaObj(_cct, _store) {}
+  RGWRealm(const string& _name, CephContext *_cct, RGWRados *_store): RGWSystemMetaObj(_name, _cct, _store){}
+
+  void encode(bufferlist& bl) const {
+    ENCODE_START(1, 1, bl);
+    RGWSystemMetaObj::encode(bl);
+    ::encode(master_zonegroup, bl);
+    ::encode(zonegroups, bl);
+    ENCODE_FINISH(bl);
+  }
+
+  void decode(bufferlist::iterator& bl) {
+    DECODE_START(1, bl);
+    RGWSystemMetaObj::decode(bl);
+    ::decode(master_zonegroup, bl);
+    ::decode(zonegroups, bl);
+    DECODE_FINISH(bl);
+  }
+
+  const string& get_pool_name(CephContext *cct);
+  const string& get_default_oid();
+  const string& get_names_oid_prefix();
+  const string& get_info_oid_prefix();
+
+  void dump(Formatter *f) const;
+  void decode_json(JSONObj *obj);
+};
+WRITE_CLASS_ENCODER(RGWRealm)
+
 class RGWDataChangesLog;
 class RGWReplicaLogger;