Support JSON output in vitastor-disk prepare and purge
This commit is contained in:
@@ -68,6 +68,7 @@ static const char *help_text =
|
||||
" --data_device_block 4k Override data device block size\n"
|
||||
" --meta_device_block 4k Override metadata device block size\n"
|
||||
" --journal_device_block 4k Override journal device block size\n"
|
||||
" --json Enable JSON output\n"
|
||||
" \n"
|
||||
" immediate_commit setting is automatically derived from \"disable fsync\" options.\n"
|
||||
" It's set to \"all\" when fsync is disabled on all devices, and to \"small\" if fsync\n"
|
||||
@@ -102,6 +103,7 @@ static const char *help_text =
|
||||
" --move-meta TARGET move metadata to TARGET\n"
|
||||
" --journal-size NEW_SIZE resize journal to NEW_SIZE\n"
|
||||
" --data-size NEW_SIZE resize data device to NEW_SIZE\n"
|
||||
" --json enable JSON output\n"
|
||||
" --dry-run only show new layout, do not apply it\n"
|
||||
" \n"
|
||||
" NEW_SIZE may include k/m/g/t suffixes.\n"
|
||||
@@ -131,10 +133,11 @@ static const char *help_text =
|
||||
" Commands are passed to systemctl with vitastor-osd@<num> units as arguments.\n"
|
||||
" When --now is added to enable/disable, OSDs are also immediately started/stopped.\n"
|
||||
"\n"
|
||||
"vitastor-disk purge [--force] [--allow-data-loss] <device> [device2 device3 ...]\n"
|
||||
"vitastor-disk purge [--json] [--force] [--allow-data-loss] <device> [device2 device3 ...]\n"
|
||||
" Purge Vitastor OSD(s) on specified device(s). Uses vitastor-cli rm-osd to check\n"
|
||||
" if deletion is possible without data loss and to actually remove metadata from etcd.\n"
|
||||
" --force and --allow-data-loss options may be used to ignore safety check results.\n"
|
||||
" --json enables JSON output.\n"
|
||||
" \n"
|
||||
" Requires `vitastor-cli`, `sfdisk` and `partprobe` (from parted) utilities.\n"
|
||||
"\n"
|
||||
|
||||
@@ -42,7 +42,7 @@ struct disk_tool_t
|
||||
|
||||
std::map<std::string, std::string> options;
|
||||
bool test_mode = false;
|
||||
bool all, json, now;
|
||||
bool all = false, json = false, now = false;
|
||||
bool dump_with_blocks, dump_with_data;
|
||||
blockstore_disk_t dsk;
|
||||
|
||||
@@ -127,7 +127,7 @@ struct disk_tool_t
|
||||
json11::Json read_osd_superblock(std::string device, bool expect_exist = true, bool ignore_nonref = false);
|
||||
uint32_t write_osd_superblock(std::string device, json11::Json params);
|
||||
|
||||
int prepare_one(std::map<std::string, std::string> options, int is_hdd = -1);
|
||||
int prepare_one(std::map<std::string, std::string> options, int is_hdd, json11::Json::object & result);
|
||||
int check_existing_partition(std::string & dev_by_uuid);
|
||||
int fix_partition_type(std::string & dev_by_uuid);
|
||||
int prepare(std::vector<std::string> devices);
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include "json_util.h"
|
||||
#include "osd_id.h"
|
||||
|
||||
int disk_tool_t::prepare_one(std::map<std::string, std::string> options, int is_hdd)
|
||||
int disk_tool_t::prepare_one(std::map<std::string, std::string> options, int is_hdd, json11::Json::object & result)
|
||||
{
|
||||
static const char *allow_additional_params[] = {
|
||||
"autosync_writes",
|
||||
@@ -203,12 +203,14 @@ int disk_tool_t::prepare_one(std::map<std::string, std::string> options, int is_
|
||||
fprintf(stderr, "Initialized OSD %ju on %s\n", osd_num, desc.c_str());
|
||||
if (!test_mode || options.find("no_init") == options.end())
|
||||
{
|
||||
if (shell_exec({ "systemctl", "enable", "--now", "vitastor-osd@"+std::to_string(osd_num) }, "", NULL, NULL) != 0)
|
||||
std::string out;
|
||||
if (shell_exec({ "systemctl", "enable", "--now", "vitastor-osd@"+std::to_string(osd_num) }, "", json ? &out : NULL, NULL) != 0)
|
||||
{
|
||||
fprintf(stderr, "Failed to enable systemd unit vitastor-osd@%ju\n", osd_num);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
result = sb;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -578,7 +580,13 @@ int disk_tool_t::prepare(std::vector<std::string> devices)
|
||||
fprintf(stderr, "Device list (positional arguments), --osd_per_disk, --hybrid and --fast-devices are incompatible with --data_device\n");
|
||||
return 1;
|
||||
}
|
||||
return prepare_one(options, options.find("hdd") != options.end() ? 1 : 0);
|
||||
json11::Json::object result;
|
||||
int r = prepare_one(options, options.find("hdd") != options.end() ? 1 : 0, result);
|
||||
if (r)
|
||||
return r;
|
||||
if (json)
|
||||
printf("%s\n", json11::Json(result).dump().c_str());
|
||||
return 0;
|
||||
}
|
||||
if (!devices.size())
|
||||
{
|
||||
@@ -669,6 +677,7 @@ int disk_tool_t::prepare(std::vector<std::string> devices)
|
||||
options.erase("disable_meta_fsync");
|
||||
options.erase("disable_journal_fsync");
|
||||
}
|
||||
json11::Json::array all_results, errors;
|
||||
auto journal_size = options["journal_size"];
|
||||
for (auto & dev: devinfo)
|
||||
{
|
||||
@@ -688,7 +697,15 @@ int disk_tool_t::prepare(std::vector<std::string> devices)
|
||||
options.erase("journal_size");
|
||||
}
|
||||
// Treat all disks as SSDs if not in the hybrid mode
|
||||
prepare_one(options, dev.is_hdd ? 1 : 0);
|
||||
json11::Json::object result;
|
||||
int r = prepare_one(options, dev.is_hdd ? 1 : 0, result);
|
||||
if (json)
|
||||
{
|
||||
if (!r)
|
||||
all_results.push_back(std::move(result));
|
||||
else
|
||||
errors.push_back(options);
|
||||
}
|
||||
if (hybrid)
|
||||
{
|
||||
options["journal_size"] = journal_size;
|
||||
@@ -697,5 +714,9 @@ int disk_tool_t::prepare(std::vector<std::string> devices)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (json)
|
||||
{
|
||||
printf("%s\n", json11::Json(json11::Json::object{ { "osds", all_results }, { "errors", errors } }).dump().c_str());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -427,8 +427,12 @@ int disk_tool_t::purge_devices(const std::vector<std::string> & devices)
|
||||
}
|
||||
}
|
||||
}
|
||||
json11::Json::object result;
|
||||
result["removed_osds"] = std::vector<uint64_t>(osd_numbers.begin(), osd_numbers.end());
|
||||
if (!osd_numbers.size())
|
||||
{
|
||||
if (json)
|
||||
printf("%s\n", json11::Json(result).dump().c_str());
|
||||
return 0;
|
||||
}
|
||||
std::vector<std::string> rm_osd_cli = { "vitastor-cli", "rm-osd" };
|
||||
@@ -457,17 +461,18 @@ int disk_tool_t::purge_devices(const std::vector<std::string> & devices)
|
||||
{
|
||||
systemctl_cli.push_back("vitastor-osd@"+std::to_string(osd_num));
|
||||
}
|
||||
if (shell_exec(systemctl_cli, "", NULL, NULL) != 0)
|
||||
if (shell_exec(systemctl_cli, "", json ? &dry_run_ignore_stdout : NULL, NULL) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
// Remove OSD metadata
|
||||
rm_osd_cli.pop_back();
|
||||
if (shell_exec(rm_osd_cli, "", NULL, NULL) != 0)
|
||||
if (shell_exec(rm_osd_cli, "", json ? &dry_run_ignore_stdout : NULL, NULL) != 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
// Destroy OSD superblocks
|
||||
json11::Json::array removed_devices;
|
||||
for (auto & sb: superblocks)
|
||||
{
|
||||
for (auto dev_type: std::vector<std::string>{ "data", "meta", "journal" })
|
||||
@@ -521,9 +526,15 @@ int disk_tool_t::purge_devices(const std::vector<std::string> & devices)
|
||||
break;
|
||||
}
|
||||
}
|
||||
removed_devices.push_back(dev);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (json)
|
||||
{
|
||||
result["removed_devices"] = removed_devices;
|
||||
printf("%s\n", json11::Json(result).dump().c_str());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user