rbd group snap list $group_name
}
+rollback_snapshot()
+{
+ local group_name=$1
+ local snap_name=$2
+ rbd group snap rollback $group_name@$snap_name
+}
+
check_snapshot_in_group()
{
local group_name=$1
group="test_consistency_group"
snap="group_snap"
new_snap="new_group_snap"
+sec_snap="group_snap2"
create_image $image
create_group $group
add_image_to_group $image $group
check_snapshot_in_group $group $snap
rename_snapshot $group $snap $new_snap
check_snapshot_not_in_group $group $snap
+create_snapshot $group $sec_snap
+check_snapshot_in_group $group $sec_snap
+rollback_snapshot $group $new_snap
remove_snapshot $group $new_snap
check_snapshot_not_in_group $group $new_snap
+remove_snapshot $group $sec_snap
+check_snapshot_not_in_group $group $sec_snap
remove_group $group
remove_image $image
echo "PASSED"
group snap list (group snap ls) List snapshots of a group.
group snap remove (group snap rm) Remove a snapshot from a group.
group snap rename Rename group's snapshot.
+ group snap rollback Rollback group to snapshot.
image-meta get Image metadata get the value associated
with the key.
image-meta list (image-meta ls) Image metadata list keys with values.
--snap arg snapshot name
--dest-snap arg destination snapshot name
+ rbd help group snap rollback
+ usage: rbd group snap rollback [--no-progress] [--pool <pool>]
+ [--namespace <namespace>] [--group <group>]
+ [--snap <snap>]
+ <group-snap-spec>
+
+ Rollback group to snapshot.
+
+ Positional arguments
+ <group-snap-spec> group specification
+ (example:
+ [<pool-name>/[<namespace-name>/]]<group-name>@<snap-name>
+ )
+
+ Optional arguments
+ --no-progress disable progress output
+ -p [ --pool ] arg pool name
+ --namespace arg namespace name
+ --group arg group name
+ --snap arg snapshot name
+
rbd help image-meta get
usage: rbd image-meta get [--pool <pool>] [--namespace <namespace>]
[--image <image>]
return 0;
}
+int execute_group_snap_rollback(const po::variables_map &vm,
+ const std::vector<std::string> &global_args) {
+ size_t arg_index = 0;
+
+ std::string group_name;
+ std::string namespace_name;
+ std::string pool_name;
+ std::string snap_name;
+
+ int r = utils::get_pool_generic_snapshot_names(
+ vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, at::POOL_NAME, &pool_name,
+ &namespace_name, GROUP_NAME, "group", &group_name, &snap_name, true,
+ utils::SNAPSHOT_PRESENCE_REQUIRED, utils::SPEC_VALIDATION_FULL);
+ if (r < 0) {
+ return r;
+ }
+
+ librados::IoCtx io_ctx;
+ librados::Rados rados;
+
+ r = utils::init(pool_name, namespace_name, &rados, &io_ctx);
+ if (r < 0) {
+ return r;
+ }
+
+ librbd::RBD rbd;
+ utils::ProgressContext pc("Rolling back to group snapshot",
+ vm[at::NO_PROGRESS].as<bool>());
+ r = rbd.group_snap_rollback_with_progress(io_ctx, group_name.c_str(),
+ snap_name.c_str(), pc);
+ if (r < 0) {
+ pc.fail();
+ std::cerr << "rbd: rollback group to snapshot failed: "
+ << cpp_strerror(r) << std::endl;
+ return r;
+ }
+
+ pc.finish();
+ return 0;
+}
+
void get_create_arguments(po::options_description *positional,
po::options_description *options) {
add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE,
false);
}
+void get_group_snap_rollback_arguments(po::options_description *positional,
+ po::options_description *options) {
+ at::add_no_progress_option(options);
+ add_group_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE,
+ true);
+}
+
Shell::Action action_create(
{"group", "create"}, {}, "Create a group.",
"", &get_create_arguments, &execute_create);
{"group", "snap", "list"}, {"group", "snap", "ls"},
"List snapshots of a group.",
"", &get_group_snap_list_arguments, &execute_group_snap_list);
+Shell::Action action_group_snap_rollback(
+ {"group", "snap", "rollback"}, {},
+ "Rollback group to snapshot.",
+ "", &get_group_snap_rollback_arguments, &execute_group_snap_rollback);
} // namespace group
} // namespace action