[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 08/11] xl: new global -N option for dry run
This sets a global dryrun_only variable, which individual commands are expected to honour. To avoid accidents, we introduce a new can_dryrun member in the command table, which is initially set to 0 for each command. Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> --- tools/libxl/xl.c | 17 +++++-- tools/libxl/xl.h | 2 + tools/libxl/xl_cmdimpl.c | 5 +- tools/libxl/xl_cmdtable.c | 124 ++++++++++++++++++++++---------------------- 4 files changed, 80 insertions(+), 68 deletions(-) diff --git a/tools/libxl/xl.c b/tools/libxl/xl.c index 5bab2ff..1f231a8 100644 --- a/tools/libxl/xl.c +++ b/tools/libxl/xl.c @@ -34,6 +34,7 @@ #include "xl.h" xentoollog_logger_stdiostream *logger; +int dryrun_only; int autoballoon = 1; char *lockfile; char *default_vifscript = NULL; @@ -90,11 +91,14 @@ int main(int argc, char **argv) void *config_data = 0; int config_len = 0; - while ((opt = getopt(argc, argv, "+v")) >= 0) { + while ((opt = getopt(argc, argv, "+vN")) >= 0) { switch (opt) { case 'v': if (minmsglevel > 0) minmsglevel--; break; + case 'N': + dryrun_only = 1; + break; default: fprintf(stderr, "unknown global option\n"); exit(2); @@ -138,9 +142,14 @@ int main(int argc, char **argv) optind = 1; cspec = cmdtable_lookup(cmd); - if (cspec) + if (cspec) { + if (dryrun_only && !cspec->can_dryrun) { + fprintf(stderr, "command does not implement -N (dryrun) option\n"); + ret = 1; + goto xit; + } ret = cspec->cmd_impl(argc, argv); - else if (!strcmp(cmd, "help")) { + } else if (!strcmp(cmd, "help")) { help(argv[1]); ret = 0; } else { @@ -148,8 +157,8 @@ int main(int argc, char **argv) ret = 1; } + xit: libxl_ctx_free(ctx); xtl_logger_destroy((xentoollog_logger*)logger); - return ret; } diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h index bce135a..04f9045 100644 --- a/tools/libxl/xl.h +++ b/tools/libxl/xl.h @@ -20,6 +20,7 @@ struct cmd_spec { char *cmd_name; int (*cmd_impl)(int argc, char **argv); + int can_dryrun; char *cmd_desc; char *cmd_usage; char *cmd_option; @@ -103,6 +104,7 @@ extern xentoollog_logger_stdiostream *logger; /* global options */ extern int autoballoon; +extern int dryrun_only; extern char *lockfile; extern char *default_vifscript; diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index d2e343d..208e745 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -1651,7 +1651,7 @@ void help(const char *command) struct cmd_spec *cmd; if (!command || !strcmp(command, "help")) { - printf("Usage xl [-v] <subcommand> [args]\n\n"); + printf("Usage xl [-vN] <subcommand> [args]\n\n"); printf("xl full list of subcommands:\n\n"); for (i = 0; i < cmdtable_len; i++) printf(" %-20s%s\n", @@ -1659,7 +1659,8 @@ void help(const char *command) } else { cmd = cmdtable_lookup(command); if (cmd) { - printf("Usage: xl [-v] %s %s\n\n%s.\n\n", + printf("Usage: xl [-v%s] %s %s\n\n%s.\n\n", + cmd->can_dryrun ? "N" : "", cmd->cmd_name, cmd->cmd_usage, cmd->cmd_desc); diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c index a899803..5308288 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -19,7 +19,7 @@ struct cmd_spec cmd_table[] = { { "create", - &main_create, + &main_create, 0, "Create a domain from config file <filename>", "<ConfigFile> [options] [vars]", "-h Print this help.\n" @@ -32,7 +32,7 @@ struct cmd_spec cmd_table[] = { "-e Do not wait in the background for the death of the domain." }, { "list", - &main_list, + &main_list, 0, "List information about all/some domains", "[options] [Domain]\n", "-l, --long Output all VM details\n" @@ -40,59 +40,59 @@ struct cmd_spec cmd_table[] = { "-Z, --context Prints out security context" }, { "destroy", - &main_destroy, + &main_destroy, 0, "Terminate a domain immediately", "<Domain>", }, { "shutdown", - &main_shutdown, + &main_shutdown, 0, "Issue a shutdown signal to a domain", "<Domain>", }, { "reboot", - &main_reboot, + &main_reboot, 0, "Issue a reboot signal to a domain", "<Domain>", }, { "pci-attach", - &main_pciattach, + &main_pciattach, 0, "Insert a new pass-through pci device", "<Domain> <BDF> [Virtual Slot]", }, { "pci-detach", - &main_pcidetach, + &main_pcidetach, 0, "Remove a domain's pass-through pci device", "<Domain> <BDF>", }, { "pci-list", - &main_pcilist, + &main_pcilist, 0, "List pass-through pci devices for a domain", "<Domain>", }, { "pci-list-assignable-devices", - &main_pcilist_assignable, + &main_pcilist_assignable, 0, "List all the assignable pci devices", "", }, { "pause", - &main_pause, + &main_pause, 0, "Pause execution of a domain", "<Domain>", }, { "unpause", - &main_unpause, + &main_unpause, 0, "Unpause a paused domain", "<Domain>", }, { "console", - &main_console, + &main_console, 0, "Attach to domain's console", "[options] <Domain>\n" "-t <type> console type, pv or serial\n" "-n <number> console number" }, { "vncviewer", - &main_vncviewer, + &main_vncviewer, 0, "Attach to domain's VNC server.", "[options] <Domain>\n" "--autopass Pass VNC password to viewer via stdin and\n" @@ -100,14 +100,14 @@ struct cmd_spec cmd_table[] = { "--vncviewer-autopass (consistency alias for --autopass)" }, { "save", - &main_save, + &main_save, 0, "Save a domain state to restore later", "[options] <Domain> <CheckpointFile> [<ConfigFile>]", "-h Print this help.\n" "-c Leave domain running after creating the snapshot." }, { "migrate", - &main_migrate, + &main_migrate, 0, "Save a domain state to restore later", "[options] <Domain> <host>", "-h Print this help.\n" @@ -119,12 +119,12 @@ struct cmd_spec cmd_table[] = { " of the domain." }, { "dump-core", - &main_dump_core, + &main_dump_core, 0, "Core dump a domain", "<Domain> <filename>" }, { "restore", - &main_restore, + &main_restore, 0, "Restore a domain from a saved state", "[options] [<ConfigFile>] <CheckpointFile>", "-h Print this help.\n" @@ -133,63 +133,63 @@ struct cmd_spec cmd_table[] = { "-d Enable debug messages." }, { "migrate-receive", - &main_migrate_receive, + &main_migrate_receive, 0, "Restore a domain from a saved state", "- for internal use only", }, { "cd-insert", - &main_cd_insert, + &main_cd_insert, 0, "Insert a cdrom into a guest's cd drive", "<Domain> <VirtualDevice> <type:path>", }, { "cd-eject", - &main_cd_eject, + &main_cd_eject, 0, "Eject a cdrom from a guest's cd drive", "<Domain> <VirtualDevice>", }, { "mem-max", - &main_memmax, + &main_memmax, 0, "Set the maximum amount reservation for a domain", "<Domain> <MemMB['b'[bytes]|'k'[KB]|'m'[MB]|'g'[GB]|'t'[TB]]>", }, { "mem-set", - &main_memset, + &main_memset, 0, "Set the current memory usage for a domain", "<Domain> <MemMB['b'[bytes]|'k'[KB]|'m'[MB]|'g'[GB]|'t'[TB]]>", }, { "button-press", - &main_button_press, + &main_button_press, 0, "Indicate an ACPI button press to the domain", "<Domain> <Button>", "<Button> may be 'power' or 'sleep'." }, { "vcpu-list", - &main_vcpulist, + &main_vcpulist, 0, "List the VCPUs for all/some domains", "[Domain, ...]", }, { "vcpu-pin", - &main_vcpupin, + &main_vcpupin, 0, "Set which CPUs a VCPU can use", "<Domain> <VCPU|all> <CPUs|all>", }, { "vcpu-set", - &main_vcpuset, + &main_vcpuset, 0, "Set the number of active VCPUs allowed for the domain", "<Domain> <vCPUs>", }, { "list-vm", - &main_list_vm, + &main_list_vm, 0, "List the VMs,without DOM0", "", }, { "info", - &main_info, + &main_info, 0, "Get information about Xen host", "-n, --numa List host NUMA topology information", }, { "sched-credit", - &main_sched_credit, + &main_sched_credit, 0, "Get/set credit scheduler parameters", "[-d <Domain> [-w[=WEIGHT]|-c[=CAP]]]", "-d DOMAIN, --domain=DOMAIN Domain to modify\n" @@ -197,109 +197,109 @@ struct cmd_spec cmd_table[] = { "-c CAP, --cap=CAP Cap (int)" }, { "domid", - &main_domid, + &main_domid, 0, "Convert a domain name to domain id", "<DomainName>", }, { "domname", - &main_domname, + &main_domname, 0, "Convert a domain id to domain name", "<DomainId>", }, { "rename", - &main_rename, + &main_rename, 0, "Rename a domain", "<Domain> <NewDomainName>", }, { "trigger", - &main_trigger, + &main_trigger, 0, "Send a trigger to a domain", "<Domain> <nmi|reset|init|power|sleep> [<VCPU>]", }, { "sysrq", - &main_sysrq, + &main_sysrq, 0, "Send a sysrq to a domain", "<Domain> <letter>", }, { "debug-keys", - &main_debug_keys, + &main_debug_keys, 0, "Send debug keys to Xen", "<Keys>", }, { "dmesg", - &main_dmesg, + &main_dmesg, 0, "Read and/or clear dmesg buffer", "[-c]", " -c Clear dmesg buffer as well as printing it", }, { "top", - &main_top, + &main_top, 0, "Monitor a host and the domains in real time", "", }, { "network-attach", - &main_networkattach, + &main_networkattach, 0, "Create a new virtual network device", "<Domain> [type=<type>] [mac=<mac>] [bridge=<bridge>] " "[ip=<ip>] [script=<script>] [backend=<BackDomain>] [vifname=<name>] " "[rate=<rate>] [model=<model>] [accel=<accel>]", }, { "network-list", - &main_networklist, + &main_networklist, 0, "List virtual network interfaces for a domain", "<Domain(s)>", }, { "network-detach", - &main_networkdetach, + &main_networkdetach, 0, "Destroy a domain's virtual network device", "<Domain> <DevId|mac>", }, { "block-attach", - &main_blockattach, + &main_blockattach, 0, "Create a new virtual block device", "<Domain> <disk-spec-component(s)>...", }, { "block-list", - &main_blocklist, + &main_blocklist, 0, "List virtual block devices for a domain", "<Domain(s)>", }, { "block-detach", - &main_blockdetach, + &main_blockdetach, 0, "Destroy a domain's virtual block device", "<Domain> <DevId>", }, { "uptime", - &main_uptime, + &main_uptime, 0, "Print uptime for all/some domains", "[-s] [Domain]", }, { "tmem-list", - &main_tmem_list, + &main_tmem_list, 0, "List tmem pools", "[-l] [<Domain>|-a]", " -l List tmem stats", }, { "tmem-freeze", - &main_tmem_freeze, + &main_tmem_freeze, 0, "Freeze tmem pools", "[<Domain>|-a]", " -a Freeze all tmem", }, { "tmem-destroy", - &main_tmem_destroy, + &main_tmem_destroy, 0, "Destroy tmem pools", "[<Domain>|-a]", " -a Destroy all tmem", }, { "tmem-thaw", - &main_tmem_thaw, + &main_tmem_thaw, 0, "Thaw tmem pools", "[<Domain>|-a]", " -a Thaw all tmem", }, { "tmem-set", - &main_tmem_set, + &main_tmem_set, 0, "Change tmem settings", "[<Domain>|-a] [-w[=WEIGHT]|-c[=CAP]|-p[=COMPRESS]]", " -a Operate on all tmem\n" @@ -308,7 +308,7 @@ struct cmd_spec cmd_table[] = { " -p COMPRESS Compress (int)", }, { "tmem-shared-auth", - &main_tmem_shared_auth, + &main_tmem_shared_auth, 0, "De/authenticate shared tmem pool", "[<Domain>|-a] [-u[=UUID] [-A[=AUTH]", " -a Authenticate for all tmem pools\n" @@ -317,12 +317,12 @@ struct cmd_spec cmd_table[] = { " -A AUTH 0=auth,1=deauth", }, { "tmem-freeable", - &main_tmem_freeable, + &main_tmem_freeable, 0, "Get information about how much freeable memory (MB) is in-use by tmem", "", }, { "cpupool-create", - &main_cpupoolcreate, + &main_cpupoolcreate, 0, "Create a CPU pool based an ConfigFile", "[options] <ConfigFile> [vars]", "-h, --help Print this help.\n" @@ -330,53 +330,53 @@ struct cmd_spec cmd_table[] = { "-n, --dryrun Dry run - prints the resulting configuration." }, { "cpupool-list", - &main_cpupoollist, + &main_cpupoollist, 0, "List CPU pools on host", "[-c|--cpus] [<CPU Pool>]", "-c, --cpus Output list of CPUs used by a pool" }, { "cpupool-destroy", - &main_cpupooldestroy, + &main_cpupooldestroy, 0, "Deactivates a CPU pool", "<CPU Pool>", }, { "cpupool-rename", - &main_cpupoolrename, + &main_cpupoolrename, 0, "Renames a CPU pool", "<CPU Pool> <new name>", }, { "cpupool-cpu-add", - &main_cpupoolcpuadd, + &main_cpupoolcpuadd, 0, "Adds a CPU to a CPU pool", "<CPU Pool> <CPU nr>|node:<node nr>", }, { "cpupool-cpu-remove", - &main_cpupoolcpuremove, + &main_cpupoolcpuremove, 0, "Removes a CPU from a CPU pool", "<CPU Pool> <CPU nr>|node:<node nr>", }, { "cpupool-migrate", - &main_cpupoolmigrate, + &main_cpupoolmigrate, 0, "Moves a domain into a CPU pool", "<Domain> <CPU Pool>", }, { "cpupool-numa-split", - &main_cpupoolnumasplit, + &main_cpupoolnumasplit, 0, "Splits up the machine into one CPU pool per NUMA node", "", }, { "getenforce", - &main_getenforce, + &main_getenforce, 0, "Returns the current enforcing mode of the Flask Xen security module", "", }, { "setenforce", - &main_setenforce, + &main_setenforce, 0, "Sets the current enforcing mode of the Flask Xen security module", "<1|0|Enforcing|Permissive>", }, { "loadpolicy", - &main_loadpolicy, + &main_loadpolicy, 0, "Loads a new policy int the Flask Xen security module", "<policy file>", }, -- 1.5.6.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |