virsh: Add build flags to pool-create[-as] and pool-start

https://bugzilla.redhat.com/show_bug.cgi?id=830056

Utilize recently added VIR_STORAGE_POOL_CREATE_WITH_BUILD* flags in
order to pass the flags along to the virStoragePoolCreateXML and
virStoragePoolCreate API's.

This affects the 'virsh pool-create', 'virsh pool-create-as', and
'virsh pool-start' commands.  While it could be argued that pool-start
doesn't need the flags, they could prove useful for someone trying to
do one command build --overwrite and start command processing or
essentially starting with a clean slate.

NB:
This patch is loosely based upon code originally authored by Osier
Yang that were not reviewed and pushed, see:

https://www.redhat.com/archives/libvir-list/2012-July/msg00497.html
This commit is contained in:
John Ferlan 2015-11-25 09:51:51 -05:00
parent 5372d49b11
commit e193735450
2 changed files with 97 additions and 4 deletions

View File

@ -47,6 +47,13 @@
.help = N_("file containing an XML pool description") \ .help = N_("file containing an XML pool description") \
} \ } \
#define VSH_POOL_BUILD_OPT_COMMON \
{.name = "build", \
.type = VSH_OT_BOOL, \
.flags = 0, \
.help = N_("build the pool as normal") \
} \
#define VSH_POOL_NO_OVERWRITE_OPT_COMMON \ #define VSH_POOL_NO_OVERWRITE_OPT_COMMON \
{.name = "no-overwrite", \ {.name = "no-overwrite", \
.type = VSH_OT_BOOL, \ .type = VSH_OT_BOOL, \
@ -235,6 +242,9 @@ static const vshCmdInfo info_pool_create[] = {
static const vshCmdOptDef opts_pool_create[] = { static const vshCmdOptDef opts_pool_create[] = {
VSH_POOL_FILE_OPT_COMMON, VSH_POOL_FILE_OPT_COMMON,
VSH_POOL_BUILD_OPT_COMMON,
VSH_POOL_NO_OVERWRITE_OPT_COMMON,
VSH_POOL_OVERWRITE_OPT_COMMON,
{.name = NULL} {.name = NULL}
}; };
@ -246,15 +256,33 @@ cmdPoolCreate(vshControl *ctl, const vshCmd *cmd)
const char *from = NULL; const char *from = NULL;
bool ret = true; bool ret = true;
char *buffer; char *buffer;
bool build;
bool overwrite;
bool no_overwrite;
unsigned int flags = 0;
virshControlPtr priv = ctl->privData; virshControlPtr priv = ctl->privData;
if (vshCommandOptStringReq(ctl, cmd, "file", &from) < 0) if (vshCommandOptStringReq(ctl, cmd, "file", &from) < 0)
return false; return false;
build = vshCommandOptBool(cmd, "build");
overwrite = vshCommandOptBool(cmd, "overwrite");
no_overwrite = vshCommandOptBool(cmd, "no-overwrite");
VSH_EXCLUSIVE_OPTIONS_EXPR("overwrite", overwrite,
"no-overwrite", no_overwrite);
if (build)
flags |= VIR_STORAGE_POOL_CREATE_WITH_BUILD;
if (overwrite)
flags |= VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE;
if (no_overwrite)
flags |= VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE;
if (virFileReadAll(from, VSH_MAX_XML_FILE, &buffer) < 0) if (virFileReadAll(from, VSH_MAX_XML_FILE, &buffer) < 0)
return false; return false;
pool = virStoragePoolCreateXML(priv->conn, buffer, 0); pool = virStoragePoolCreateXML(priv->conn, buffer, flags);
VIR_FREE(buffer); VIR_FREE(buffer);
if (pool != NULL) { if (pool != NULL) {
@ -386,6 +414,9 @@ static const vshCmdInfo info_pool_create_as[] = {
static const vshCmdOptDef opts_pool_create_as[] = { static const vshCmdOptDef opts_pool_create_as[] = {
VSH_POOL_X_AS_OPT_COMMON, VSH_POOL_X_AS_OPT_COMMON,
VSH_POOL_BUILD_OPT_COMMON,
VSH_POOL_NO_OVERWRITE_OPT_COMMON,
VSH_POOL_OVERWRITE_OPT_COMMON,
{.name = NULL} {.name = NULL}
}; };
@ -397,8 +428,26 @@ cmdPoolCreateAs(vshControl *ctl, const vshCmd *cmd)
const char *name; const char *name;
char *xml; char *xml;
bool printXML = vshCommandOptBool(cmd, "print-xml"); bool printXML = vshCommandOptBool(cmd, "print-xml");
bool build;
bool overwrite;
bool no_overwrite;
unsigned int flags = 0;
virshControlPtr priv = ctl->privData; virshControlPtr priv = ctl->privData;
build = vshCommandOptBool(cmd, "build");
overwrite = vshCommandOptBool(cmd, "overwrite");
no_overwrite = vshCommandOptBool(cmd, "no-overwrite");
VSH_EXCLUSIVE_OPTIONS_EXPR("overwrite", overwrite,
"no-overwrite", no_overwrite);
if (build)
flags |= VIR_STORAGE_POOL_CREATE_WITH_BUILD;
if (overwrite)
flags |= VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE;
if (no_overwrite)
flags |= VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE;
if (!virshBuildPoolXML(ctl, cmd, &name, &xml)) if (!virshBuildPoolXML(ctl, cmd, &name, &xml))
return false; return false;
@ -406,7 +455,7 @@ cmdPoolCreateAs(vshControl *ctl, const vshCmd *cmd)
vshPrint(ctl, "%s", xml); vshPrint(ctl, "%s", xml);
VIR_FREE(xml); VIR_FREE(xml);
} else { } else {
pool = virStoragePoolCreateXML(priv->conn, xml, 0); pool = virStoragePoolCreateXML(priv->conn, xml, flags);
VIR_FREE(xml); VIR_FREE(xml);
if (pool != NULL) { if (pool != NULL) {
@ -1657,6 +1706,9 @@ static const vshCmdInfo info_pool_start[] = {
static const vshCmdOptDef opts_pool_start[] = { static const vshCmdOptDef opts_pool_start[] = {
VSH_POOL_OPT_COMMON, VSH_POOL_OPT_COMMON,
VSH_POOL_BUILD_OPT_COMMON,
VSH_POOL_NO_OVERWRITE_OPT_COMMON,
VSH_POOL_OVERWRITE_OPT_COMMON,
{.name = NULL} {.name = NULL}
}; };
@ -1667,11 +1719,29 @@ cmdPoolStart(vshControl *ctl, const vshCmd *cmd)
virStoragePoolPtr pool; virStoragePoolPtr pool;
bool ret = true; bool ret = true;
const char *name = NULL; const char *name = NULL;
bool build;
bool overwrite;
bool no_overwrite;
unsigned int flags = 0;
if (!(pool = virshCommandOptPool(ctl, cmd, "pool", &name))) if (!(pool = virshCommandOptPool(ctl, cmd, "pool", &name)))
return false; return false;
if (virStoragePoolCreate(pool, 0) == 0) { build = vshCommandOptBool(cmd, "build");
overwrite = vshCommandOptBool(cmd, "overwrite");
no_overwrite = vshCommandOptBool(cmd, "no-overwrite");
VSH_EXCLUSIVE_OPTIONS_EXPR("overwrite", overwrite,
"no-overwrite", no_overwrite);
if (build)
flags |= VIR_STORAGE_POOL_CREATE_WITH_BUILD;
if (overwrite)
flags |= VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE;
if (no_overwrite)
flags |= VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE;
if (virStoragePoolCreate(pool, flags) == 0) {
vshPrint(ctl, _("Pool %s started\n"), name); vshPrint(ctl, _("Pool %s started\n"), name);
} else { } else {
vshError(ctl, _("Failed to start pool %s"), name); vshError(ctl, _("Failed to start pool %s"), name);

View File

@ -3181,15 +3181,23 @@ specified or it's been determined that the disk doesn't already have one,
by the pool source format type or "dos" if not specified for the pool. by the pool source format type or "dos" if not specified for the pool.
=item B<pool-create> I<file> =item B<pool-create> I<file>
[I<--build>] [[I<--overwrite>] | [I<--no-overwrite>]]
Create and start a pool object from the XML I<file>. Create and start a pool object from the XML I<file>.
[I<--build>] [[I<--overwrite>] | [I<--no-overwrite>]] perform a
B<pool-build> after creation in order to remove the need for a
follow-up command to build the pool. The I<--overwrite> and
I<--no-overwrite> flags follow the same rules as B<pool-build>. If
just I<--build> is provided, then B<pool-build> is called with no flags.
=item B<pool-create-as> I<name> I<type> [I<--print-xml>] =item B<pool-create-as> I<name> I<type> [I<--print-xml>]
[I<--source-host hostname>] [I<--source-path path>] [I<--source-dev path>] [I<--source-host hostname>] [I<--source-path path>] [I<--source-dev path>]
[I<--source-name name>] [I<--target path>] [I<--source-format format>] [I<--source-name name>] [I<--target path>] [I<--source-format format>]
[I<--auth-type authtype> I<--auth-username username> I<--secret-usage usage>] [I<--auth-type authtype> I<--auth-username username> I<--secret-usage usage>]
[[I<--adapter-name name>] | [I<--adapter-wwnn> I<--adapter-wwpn>] [[I<--adapter-name name>] | [I<--adapter-wwnn> I<--adapter-wwpn>]
[I<--adapter-parent parent>]] [I<--adapter-parent parent>]]
[I<--build>] [[I<--overwrite>] | [I<--no-overwrite>]]
Create and start a pool object I<name> from the raw parameters. If Create and start a pool object I<name> from the raw parameters. If
@ -3233,6 +3241,12 @@ the wwnn and wwpn to be used for the fc_host adapter type pool. The parent
optionally provides the name of the scsi_hostN node device to be used for optionally provides the name of the scsi_hostN node device to be used for
the vHBA. the vHBA.
[I<--build>] [[I<--overwrite>] | [I<--no-overwrite>]] perform a
B<pool-build> after creation in order to remove the need for a
follow-up command to build the pool. The I<--overwrite> and
I<--no-overwrite> flags follow the same rules as B<pool-build>. If
just I<--build> is provided, then B<pool-build> is called with no flags.
=item B<pool-define> I<file> =item B<pool-define> I<file>
Define an inactive persistent storage pool or modify an existing persistent one Define an inactive persistent storage pool or modify an existing persistent one
@ -3250,7 +3264,8 @@ I<--print-xml> is specified, then print the XML of the pool object
without defining the pool. Otherwise, the pool has the specified without defining the pool. Otherwise, the pool has the specified
I<type>. I<type>.
Use the same arguments as B<pool-create-as>. Use the same arguments as B<pool-create-as>, except for the I<--build>,
I<--overwrite>, and I<--no-overwrite> options.
=item B<pool-destroy> I<pool-or-uuid> =item B<pool-destroy> I<pool-or-uuid>
@ -3326,9 +3341,17 @@ Convert the I<uuid> to a pool name.
Refresh the list of volumes contained in I<pool>. Refresh the list of volumes contained in I<pool>.
=item B<pool-start> I<pool-or-uuid> =item B<pool-start> I<pool-or-uuid>
[I<--build>] [[I<--overwrite>] | [I<--no-overwrite>]]
Start the storage I<pool>, which is previously defined but inactive. Start the storage I<pool>, which is previously defined but inactive.
[I<--build>] [[I<--overwrite>] | [I<--no-overwrite>]] perform a
B<pool-build> prior to B<pool-start> to ensure the pool environment is
in an expected state rather than needing to run the build command prior
to startup. The I<--overwrite> and I<--no-overwrite> flags follow the
same rules as B<pool-build>. If just I<--build> is provided, then
B<pool-build> is called with no flags.
B<Note>: A storage pool that relies on remote resources such as an B<Note>: A storage pool that relies on remote resources such as an
"iscsi" or a (v)HBA backed "scsi" pool may need to be refreshed multiple "iscsi" or a (v)HBA backed "scsi" pool may need to be refreshed multiple
times in order to have all the volumes detected (see B<pool-refresh>). times in order to have all the volumes detected (see B<pool-refresh>).