Commit c3cf9ec2 authored by Ziye Yang's avatar Ziye Yang Committed by Tomasz Zawadzki
Browse files

rbd/rpc: Add a rpc call to get the info of the clusters.



Purpose: Let the users know the current available registered Rados
cluster and the related info.

Change-Id: I115c129ae6e4b0372579aad168fd88f8be136357
Signed-off-by: default avatarZiye Yang <ziye.yang@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7990


Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent f90eaf16
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -30,6 +30,9 @@ device.
Revised `bdev_rbd_create` parameter, it allows to use an optional parameter --cluster-name
to create a rbd bdev with  an already registered Rados Cluster Object.

New RPC `bdev_rbd_get_clusters_info` was added, it allows to get the info of the registered
Rados Cluster names.

## v21.04:

### accel
+39 −0
Original line number Diff line number Diff line
@@ -3405,6 +3405,45 @@ Example response:
}
~~

## bdev_rbd_get_clusters_info {#rpc_bdev_rbd_get_clusters_info}

This method is available only if SPDK was build with Ceph RBD support.

### Result

Returns the cluster info of the Rados Cluster name if provided. Otherwise, it
returns the cluster info of every registered Raods Cluster name.

### Parameters

Name                    | Optional | Type        | Description
----------------------- | -------- | ----------- | -------------------------
name                    | Optional | string      | Rados cluster object name

### Example

Example request:

~~
{
  "params": {
    "name": "rbd_cluster"
  },
  "jsonrpc": "2.0",
  "method": "bdev_rbd_get_clusters_info",
  "id": 1
}
~~

Example response:

~~
{
  "jsonrpc": "2.0",
  "cluster_name": "rbd_cluster"
}
~~

## bdev_rbd_create {#rpc_bdev_rbd_create}

Create @ref bdev_config_rbd bdev
+70 −0
Original line number Diff line number Diff line
@@ -790,6 +790,76 @@ bdev_rbd_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w
	spdk_json_write_object_end(w);
}

static void
dump_single_cluster_entry(struct bdev_rbd_cluster *entry, struct spdk_json_write_ctx *w)
{
	assert(entry != NULL);

	spdk_json_write_object_begin(w);
	spdk_json_write_named_string(w, "cluster_name", entry->name);

	if (entry->user_id) {
		spdk_json_write_named_string(w, "user_id", entry->user_id);
	}

	if (entry->config_param) {
		char **config_entry = entry->config_param;

		spdk_json_write_named_object_begin(w, "config_param");
		while (*config_entry) {
			spdk_json_write_named_string(w, config_entry[0], config_entry[1]);
			config_entry += 2;
		}
		spdk_json_write_object_end(w);
	} else if (entry->config_file) {
		spdk_json_write_named_string(w, "config_file", entry->config_file);
	}

	spdk_json_write_object_end(w);
}

int
bdev_rbd_get_clusters_info(struct spdk_jsonrpc_request *request, const char *name)
{
	struct bdev_rbd_cluster *entry;
	struct spdk_json_write_ctx *w;

	pthread_mutex_lock(&g_map_bdev_rbd_cluster_mutex);

	if (STAILQ_EMPTY(&g_map_bdev_rbd_cluster)) {
		pthread_mutex_unlock(&g_map_bdev_rbd_cluster_mutex);
		return -ENOENT;
	}

	/* If cluster name is provided */
	if (name) {
		STAILQ_FOREACH(entry, &g_map_bdev_rbd_cluster, link) {
			if (strcmp(name, entry->name) == 0) {
				w = spdk_jsonrpc_begin_result(request);
				dump_single_cluster_entry(entry, w);
				spdk_jsonrpc_end_result(request, w);

				pthread_mutex_unlock(&g_map_bdev_rbd_cluster_mutex);
				return 0;
			}
		}

		pthread_mutex_unlock(&g_map_bdev_rbd_cluster_mutex);
		return -ENOENT;
	}

	w = spdk_jsonrpc_begin_result(request);
	spdk_json_write_array_begin(w);
	STAILQ_FOREACH(entry, &g_map_bdev_rbd_cluster, link) {
		dump_single_cluster_entry(entry, w);
	}
	spdk_json_write_array_end(w);
	spdk_jsonrpc_end_result(request, w);
	pthread_mutex_unlock(&g_map_bdev_rbd_cluster_mutex);

	return 0;
}

static const struct spdk_bdev_fn_table rbd_fn_table = {
	.destruct		= bdev_rbd_destruct,
	.submit_request		= bdev_rbd_submit_request,
+10 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@
#include "spdk/stdinc.h"

#include "spdk/bdev.h"
#include "spdk/rpc.h"

struct cluster_register_info {
	char *name;
@@ -86,4 +87,13 @@ int bdev_rbd_register_cluster(struct cluster_register_info *info);
 */
int bdev_rbd_unregister_cluster(const char *name);

/**
 * Show the cluster info of a given name. If given name is empty,
 * the info of every registered cluster name will be showed.
 *
 * \param request the json request.
 * \param name the name of the cluster.
 */
int bdev_rbd_get_clusters_info(struct spdk_jsonrpc_request *request, const char *name);

#endif /* SPDK_BDEV_RBD_H */
+40 −1
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@
 */

#include "bdev_rbd.h"
#include "spdk/rpc.h"
#include "spdk/util.h"
#include "spdk/string.h"
#include "spdk/log.h"
@@ -336,3 +335,43 @@ cleanup:
	free_rpc_bdev_cluster_unregister(&req);
}
SPDK_RPC_REGISTER("bdev_rbd_unregister_cluster", rpc_bdev_rbd_unregister_cluster, SPDK_RPC_RUNTIME)

struct rpc_bdev_rbd_get_cluster_info {
	char *name;
};

static void
free_rpc_bdev_rbd_get_cluster_info(struct rpc_bdev_rbd_get_cluster_info *req)
{
	free(req->name);
}

static const struct spdk_json_object_decoder rpc_bdev_rbd_get_cluster_info_decoders[] = {
	{"name", offsetof(struct rpc_bdev_rbd_get_cluster_info, name), spdk_json_decode_string, true},
};

static void
rpc_bdev_rbd_get_clusters_info(struct spdk_jsonrpc_request *request,
			       const struct spdk_json_val *params)
{
	struct rpc_bdev_rbd_get_cluster_info req = {NULL};
	int rc;

	if (params && spdk_json_decode_object(params, rpc_bdev_rbd_get_cluster_info_decoders,
					      SPDK_COUNTOF(rpc_bdev_rbd_get_cluster_info_decoders),
					      &req)) {
		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
						 "spdk_json_decode_object failed");
		goto cleanup;
	}

	rc = bdev_rbd_get_clusters_info(request, req.name);
	if (rc) {
		spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
		goto cleanup;
	}

cleanup:
	free_rpc_bdev_rbd_get_cluster_info(&req);
}
SPDK_RPC_REGISTER("bdev_rbd_get_clusters_info", rpc_bdev_rbd_get_clusters_info, SPDK_RPC_RUNTIME)
Loading