]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: handle Keystone API version with dedicated enum.
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Wed, 3 Feb 2016 18:38:25 +0000 (19:38 +0100)
committerYehuda Sadeh <yehuda@redhat.com>
Fri, 19 Feb 2016 20:16:36 +0000 (12:16 -0800)
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
src/common/config_opts.h
src/rgw/rgw_json_enc.cc
src/rgw/rgw_keystone.cc
src/rgw/rgw_keystone.h
src/rgw/rgw_rest_s3.cc
src/rgw/rgw_rest_s3.h
src/rgw/rgw_swift.cc

index 5a6d1ce3a49fdbe4cd17faa63c29e651ed8daa8a..3190d19eaf7f8311ea20cb525478130abed31e0f 100644 (file)
@@ -1188,7 +1188,7 @@ OPTION(rgw_keystone_admin_password, OPT_STR, "")  // keystone admin user passwor
 OPTION(rgw_keystone_admin_tenant, OPT_STR, "")  // keystone admin user tenant (for keystone v2.0)
 OPTION(rgw_keystone_admin_project, OPT_STR, "")  // keystone admin user project (for keystone v3)
 OPTION(rgw_keystone_admin_domain, OPT_STR, "")  // keystone admin user domain
-OPTION(rgw_keystone_api_version, OPT_STR, "2.0") // Version of Keystone API to use ("2.0" or "3")
+OPTION(rgw_keystone_api_version, OPT_INT, 2) // Version of Keystone API to use (2 or 3)
 OPTION(rgw_keystone_accepted_roles, OPT_STR, "Member, admin")  // roles required to serve requests
 OPTION(rgw_keystone_token_cache_size, OPT_INT, 10000)  // max number of entries in keystone token cache
 OPTION(rgw_keystone_revocation_interval, OPT_INT, 15 * 60)  // seconds between tokens revocation check
index e7c6615cd20df8551ff3c2dba8073d2bdd800bb8..57c76770adc0fdd21b2d2c235d73679349efb51b 100644 (file)
@@ -1094,10 +1094,14 @@ void KeystoneToken::User::decode_json(JSONObj *obj)
 
 void KeystoneToken::decode_json(JSONObj *root_obj)
 {
-  if (version == "2.0") {
+  JSONDecoder::decode_json("user", user, root_obj, true);
+
+  if (version == KeystoneApiVersion::VER_2) {
     JSONDecoder::decode_json("token", token, root_obj, true);
-  }
-  if (version == "3") {
+
+    roles = user.roles_v2;
+    project = token.tenant_v2;
+  } else if (version == KeystoneApiVersion::VER_3) {
     string expires_iso8601;
     struct tm t;
 
@@ -1112,12 +1116,6 @@ void KeystoneToken::decode_json(JSONObj *root_obj)
     JSONDecoder::decode_json("roles", roles, root_obj, true);
     JSONDecoder::decode_json("project", project, root_obj, true);
   }
-
-  JSONDecoder::decode_json("user", user, root_obj, true);
-  if (version == "2.0") {
-    roles = user.roles_v2;
-    project = token.tenant_v2;
-  }
 }
 
 void rgw_slo_entry::decode_json(JSONObj *obj)
index 5188ec81b5a7d59e7cf798f43f6ae9e8a93c7fe6..2171d1ec7e915408afb0e94baccbcbeb28c15646 100644 (file)
 
 #define dout_subsys ceph_subsys_rgw
 
-bool KeystoneToken::has_role(const string& r) {
+KeystoneApiVersion KeystoneService::get_api_version()
+{
+  const int keystone_version = g_ceph_context->_conf->rgw_keystone_api_version;
+
+  if (keystone_version == 3) {
+    return KeystoneApiVersion::VER_3;
+  } else if (keystone_version == 2) {
+    return KeystoneApiVersion::VER_2;
+  } else {
+    dout(0) << "ERROR: wrong Keystone API version: " << keystone_version
+            << "; falling back to v2" <<  dendl;
+    return KeystoneApiVersion::VER_2;
+  }
+}
+
+bool KeystoneToken::has_role(const string& r)
+{
   list<Role>::iterator iter;
   for (iter = roles.begin(); iter != roles.end(); ++iter) {
       if (fnmatch(r.c_str(), ((*iter).name.c_str()), 0) == 0) {
@@ -33,10 +49,9 @@ int KeystoneToken::parse(CephContext *cct, bufferlist& bl)
   }
 
   try {
-    if (version == "2.0") {
+    if (version == KeystoneApiVersion::VER_2) {
       JSONDecoder::decode_json("access", *this, &parser);
-    }
-    if (version == "3") {
+    } else if (version == KeystoneApiVersion::VER_3) {
       JSONDecoder::decode_json("token", *this, &parser);
     }
   } catch (JSONDecoder::err& err) {
index 23e76720a13bc1b18e681ef0a502e4538cebacec..af829e335411aa144219e20af4698358202ccc6a 100644 (file)
@@ -6,9 +6,19 @@
 
 #include "rgw_common.h"
 
+enum class KeystoneApiVersion {
+  VER_2,
+  VER_3
+};
+
+class KeystoneService {
+public:
+  static KeystoneApiVersion get_api_version();
+};
+
 class KeystoneToken {
 protected:
-  string version;
+  KeystoneApiVersion version;
 
 public:
   class Domain {
@@ -56,8 +66,9 @@ public:
   list<Role> roles;
 
 public:
-  KeystoneToken() : version("") {};
-  KeystoneToken(string _version) : version(_version) {};
+  // FIXME: default ctor needs to be eradicated here
+  KeystoneToken() : version(KeystoneApiVersion::VER_2) {};
+  KeystoneToken(KeystoneApiVersion _version) : version(_version) {};
   time_t get_expires() { return token.expires; }
   string get_domain_id() {return project.domain.id;};
   string get_domain_name()  {return project.domain.name;};
index 1e5c883e89d2380e0fa7a0bd3888764c84a13dd4..3a0203eae3f81702854704304bae941cc483fbab 100644 (file)
@@ -2673,7 +2673,7 @@ int RGW_Auth_S3_Keystone_ValidateToken::validate_s3token(
   string keystone_version = cct->_conf->rgw_keystone_api_version;
   if (keystone_url[keystone_url.size() - 1] != '/')
     keystone_url.append("/");
-  if (keystone_version == "3") {
+  if (KeystoneService::get_api_version() == KeystoneApiVersion::VER_3) {
     keystone_url.append("v3/s3tokens");
   }
   else {
index e0ce93609fbab26399fb41b23df26e6a1e52fb46..97dbaf4b1abde0963744e2c3967c9a3654d90ce0 100644 (file)
@@ -357,7 +357,7 @@ private:
 public:
   explicit RGW_Auth_S3_Keystone_ValidateToken(CephContext *_cct)
       : RGWHTTPClient(_cct),
-        response(KeystoneToken(_cct->_conf->rgw_keystone_api_version)) {
+        response(KeystoneToken(KeystoneService::get_api_version())) {
     get_str_list(cct->_conf->rgw_keystone_accepted_roles, roles_list);
   }
 
index 9660fa5f0b1efaa73578f21812f94f95a31e9314..3dd51e6b1c809855cf9973a5d80598df9f013f63 100644 (file)
@@ -287,8 +287,9 @@ int RGWSwift::get_keystone_admin_token(CephContext * const cct,
   RGWGetKeystoneAdminToken token_req(cct, &token_bl);
   token_req.append_header("Content-Type", "application/json");
   JSONFormatter jf;
-  std::string keystone_version = cct->_conf->rgw_keystone_api_version;
-  if (keystone_version == "2.0") {
+
+  const auto keystone_version = KeystoneService::get_api_version();
+  if (keystone_version == KeystoneApiVersion::VER_2) {
     KeystoneAdminTokenRequestVer2 req_serializer(cct);
     req_serializer.dump(&jf);
 
@@ -305,7 +306,7 @@ int RGWSwift::get_keystone_admin_token(CephContext * const cct,
       return -EINVAL;
     token = t.token.id;
     return 0;
-  } else if (keystone_version == "3") {
+  } else if (keystone_version == KeystoneApiVersion::VER_3) {
     KeystoneAdminTokenRequestVer3 req_serializer(cct);
     req_serializer.dump(&jf);
 
@@ -337,11 +338,11 @@ int RGWSwift::check_revoked()
   if (get_keystone_url(url) < 0)
     return -EINVAL;
   req.append_header("X-Auth-Token", token);
-  std::string keystone_version = cct->_conf->rgw_keystone_api_version;
-  if (keystone_version == "2.0") {
+
+  const auto keystone_version = KeystoneService::get_api_version();
+  if (keystone_version == KeystoneApiVersion::VER_2) {
     url.append("v2.0/tokens/revoked");
-  }
-  if (keystone_version == "3") {
+  } else if (keystone_version == KeystoneApiVersion::VER_3) {
     url.append("v3/auth/tokens/OS-PKI/revoked");
   }
   req.set_send_length(0);
@@ -510,7 +511,7 @@ static bool decode_pki_token(CephContext *cct, const string& token, bufferlist&
 int RGWSwift::validate_keystone_token(RGWRados *store, const string& token, struct rgw_swift_auth_info *info,
                                      RGWUserInfo& rgw_user)
 {
-  KeystoneToken t(g_conf->rgw_keystone_api_version);
+  KeystoneToken t(KeystoneService::get_api_version());
 
   string token_id;
   get_token_id(token, token_id);
@@ -554,12 +555,12 @@ int RGWSwift::validate_keystone_token(RGWRados *store, const string& token, stru
 
     validate.append_header("X-Auth-Token", admin_token);
 
-    std::string keystone_version = cct->_conf->rgw_keystone_api_version;
-    if (keystone_version == "2.0") {
+    const auto keystone_version = KeystoneService::get_api_version();
+    if (keystone_version == KeystoneApiVersion::VER_2) {
       url.append("v2.0/tokens/");
       url.append(token);
     }
-    if (keystone_version == "3") {
+    if (keystone_version == KeystoneApiVersion::VER_3) {
       url.append("v3/auth/tokens");
       validate.append_header("X-Subject-Token", token);
     }