]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: add support for the healthcheck feature of Swift API.
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Thu, 30 Jun 2016 15:39:35 +0000 (17:39 +0200)
committerRadoslaw Zarzynski <rzarzynski@mirantis.com>
Fri, 18 Nov 2016 19:48:25 +0000 (20:48 +0100)
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
(cherry picked from commit a3c04064a884fcb1d9897b9a5cb094829fee151d)

src/common/config_opts.h
src/rgw/rgw_common.h
src/rgw/rgw_main.cc
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rest.h
src/rgw/rgw_rest_swift.cc
src/rgw/rgw_rest_swift.h

index 3221291e5217d14d49470762292ec672e608bc6d..0f92cf055a5c65834eb42a09c4b47168a6c6fbd2 100644 (file)
@@ -1283,6 +1283,7 @@ OPTION(rgw_keystone_revocation_interval, OPT_INT, 15 * 60)  // seconds between t
 OPTION(rgw_keystone_verify_ssl, OPT_BOOL, true) // should we try to verify keystone's ssl
 OPTION(rgw_keystone_implicit_tenants, OPT_BOOL, false)  // create new users in their own tenants of the same name
 OPTION(rgw_cross_domain_policy, OPT_STR, "<allow-access-from domain=\"*\" secure=\"false\" />")
+OPTION(rgw_healthcheck_disabling_path, OPT_STR, "") // path that existence causes the healthcheck to respond 503
 OPTION(rgw_s3_auth_use_rados, OPT_BOOL, true)  // should we try to use the internal credentials for s3?
 OPTION(rgw_s3_auth_use_keystone, OPT_BOOL, false)  // should we try to use keystone for s3?
 
index 372d4091098499b8b0f3deee262e85f70747a1df..a72cccb43237530090c91a9a9be8b2450b4515fc 100644 (file)
@@ -424,6 +424,7 @@ enum RGWOpType {
   RGW_OP_BULK_DELETE,
   RGW_OP_SET_ATTRS,
   RGW_OP_GET_CROSS_DOMAIN_POLICY,
+  RGW_OP_GET_HEALTH_CHECK,
 
   /* rgw specific */
   RGW_OP_ADMIN_SET_METADATA
index 6c825d8b1eee080213f8d8cedcce4860837cadde..66b731faad2c01a14795081ccddd144021ecb91f 100644 (file)
@@ -349,6 +349,9 @@ int main(int argc, const char **argv)
                           set_logging(new RGWRESTMgr_SWIFT_CrossDomain));
     }
 
+    swift_resource->register_resource("healthcheck",
+                          set_logging(new RGWRESTMgr_SWIFT_HealthCheck));
+
     if (! swift_at_root) {
       rest.register_resource(g_conf->rgw_swift_url_prefix,
                           set_logging(swift_resource));
index ce94155ac701f4769d36b01a207cbb88d5b463ab..ea4319e1805e541800bb2d2a5323b58ae3135125 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <errno.h>
 #include <stdlib.h>
+#include <unistd.h>
 
 #include <sstream>
 
@@ -4369,6 +4370,16 @@ void RGWListBucketMultiparts::execute()
   }
 }
 
+void RGWGetHealthCheck::execute()
+{
+  if (! g_conf->rgw_healthcheck_disabling_path.empty() &&
+      ::access(g_conf->rgw_healthcheck_disabling_path.c_str(), F_OK )) {
+    op_ret = -ERR_SERVICE_UNAVAILABLE;
+  } else {
+    op_ret = 0; /* 200 OK */
+  }
+}
+
 int RGWDeleteMultiObj::verify_permission()
 {
   if (!verify_bucket_permission(s, RGW_PERM_WRITE))
index 07024afc84dfb832347c4f0d591a7d9aff4066a1..ce3255c4121e476d714d4c6d15b5c381d2d3b84a 100644 (file)
@@ -1329,6 +1329,31 @@ public:
 };
 
 
+class RGWGetHealthCheck : public RGWOp {
+public:
+  RGWGetHealthCheck() = default;
+  ~RGWGetHealthCheck() = default;
+
+  int verify_permission() override {
+    return 0;
+  }
+
+  void execute() override;
+
+  const string name() override {
+    return "get_health_check";
+  }
+
+  RGWOpType get_type() override {
+    return RGW_OP_GET_HEALTH_CHECK;
+  }
+
+  uint32_t op_mask() override {
+    return RGW_OP_TYPE_READ;
+  }
+};
+
+
 class RGWDeleteMultiObj : public RGWOp {
 protected:
   int max_to_delete;
index d476c7dd84dd069ebddfc622e36f4a9ef67f8b0d..24849aad086cb7717d8566e513ca230c750e4dc0 100644 (file)
@@ -263,6 +263,12 @@ public:
   ~RGWGetCrossDomainPolicy_ObjStore() = default;
 };
 
+class  RGWGetHealthCheck_ObjStore : public RGWGetHealthCheck {
+public:
+  RGWGetHealthCheck_ObjStore() = default;
+  ~RGWGetHealthCheck_ObjStore() = default;
+};
+
 class RGWCopyObj_ObjStore : public RGWCopyObj {
 public:
   RGWCopyObj_ObjStore() {}
index e09a5580541067b9e4b4e45fd05a2816d1114a89..53cd18527e512787bcfc1b1bc24386df79c6dbba 100644 (file)
@@ -1249,7 +1249,6 @@ void RGWBulkDelete_ObjStore_SWIFT::send_response()
   rgw_flush_formatter_and_reset(s, s->formatter);
 }
 
-
 void RGWGetCrossDomainPolicy_ObjStore_SWIFT::send_response()
 {
   set_req_state_err(s, op_ret);
@@ -1268,6 +1267,17 @@ void RGWGetCrossDomainPolicy_ObjStore_SWIFT::send_response()
   STREAM_IO(s)->write(ss.str().c_str(), ss.str().length());
 }
 
+void RGWGetHealthCheck_ObjStore_SWIFT::send_response()
+{
+  set_req_state_err(s, op_ret);
+  dump_errno(s);
+  end_header(s, this, "application/xml");
+
+  if (op_ret) {
+    STREAM_IO(s)->print("DISABLED BY FILE");
+  }
+}
+
 RGWOp *RGWHandler_REST_Service_SWIFT::op_get()
 {
   return new RGWListBuckets_ObjStore_SWIFT;
index 51215ea00ca969a9df2fa4c7c9234bccdae7cf1a..977c1cceff39f58721e4845240b236b1a2d4d7cc 100644 (file)
@@ -280,6 +280,15 @@ public:
   void send_response() override;
 };
 
+class  RGWGetHealthCheck_ObjStore_SWIFT
+  : public RGWGetHealthCheck_ObjStore {
+public:
+  RGWGetHealthCheck_ObjStore_SWIFT() = default;
+  ~RGWGetHealthCheck_ObjStore_SWIFT() = default;
+
+  void send_response() override;
+};
+
 class RGWHandler_SWIFT_CrossDomain : public RGWHandler_REST {
 public:
   RGWHandler_SWIFT_CrossDomain() = default;
@@ -333,4 +342,57 @@ public:
 };
 
 
+class RGWHandler_SWIFT_HealthCheck : public RGWHandler_REST {
+public:
+  RGWHandler_SWIFT_HealthCheck() = default;
+  ~RGWHandler_SWIFT_HealthCheck() = default;
+
+  RGWOp *op_get() override {
+    return new RGWGetHealthCheck_ObjStore_SWIFT();
+  }
+
+  int init(RGWRados* const store,
+           struct req_state* const state,
+           RGWClientIO* const cio) override {
+    state->dialect = "swift";
+    state->formatter = new JSONFormatter;
+    state->format = RGW_FORMAT_JSON;
+
+    return RGWHandler::init(store, state, cio);
+  }
+
+  int authorize() override {
+    return 0;
+  }
+
+  int postauth_init() override {
+    return 0;
+  }
+
+  int read_permissions(RGWOp *) override {
+    return 0;
+  }
+
+  virtual RGWAccessControlPolicy *alloc_policy() { return nullptr; }
+  virtual void free_policy(RGWAccessControlPolicy *policy) {}
+};
+
+class RGWRESTMgr_SWIFT_HealthCheck : public RGWRESTMgr {
+public:
+  RGWRESTMgr_SWIFT_HealthCheck() = default;
+  ~RGWRESTMgr_SWIFT_HealthCheck() = default;
+
+  RGWRESTMgr *get_resource_mgr(struct req_state* const s,
+                               const std::string& uri,
+                               std::string* const out_uri) override {
+    return this;
+  }
+
+  RGWHandler_REST* get_handler(struct req_state* const s) override {
+    s->prot_flags |= RGW_REST_SWIFT;
+    return new RGWHandler_SWIFT_HealthCheck;
+  }
+};
+
+
 #endif