main: Group cli options logically

With the API server socket option, we will be able to support a model
where the user can start cloud-hypervisor with no options or an
alternative API server socket path. In this case, we don't want to try
to start a new guest VM, and for that we need to know if the user has
set any VM configuration at all. Grouping all VM configuration specific
options together is one way to be able to know about it.

If the user has not set any VM configuration, we only start the API
server. If it has set anything, we will verify that the overall
configuration is valid and will implicitly convert that configuration
into a request to the API server.

Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
Samuel Ortiz 2019-09-19 08:41:00 +02:00
parent 2371325f9c
commit fe5561df50

View File

@ -9,7 +9,7 @@ extern crate vmm_sys_util;
#[macro_use(crate_version, crate_authors)] #[macro_use(crate_version, crate_authors)]
extern crate clap; extern crate clap;
use clap::{App, Arg}; use clap::{App, Arg, ArgGroup};
use libc::EFD_NONBLOCK; use libc::EFD_NONBLOCK;
use log::LevelFilter; use log::LevelFilter;
use std::process; use std::process;
@ -67,11 +67,14 @@ fn main() {
.version(crate_version!()) .version(crate_version!())
.author(crate_authors!()) .author(crate_authors!())
.about("Launch a cloud-hypervisor VMM.") .about("Launch a cloud-hypervisor VMM.")
.group(ArgGroup::with_name("vm-config").multiple(true))
.group(ArgGroup::with_name("vmm-config").multiple(true))
.arg( .arg(
Arg::with_name("cpus") Arg::with_name("cpus")
.long("cpus") .long("cpus")
.help("Number of virtual CPUs") .help("Number of virtual CPUs")
.default_value(config::DEFAULT_VCPUS), .default_value(config::DEFAULT_VCPUS)
.group("vm-config"),
) )
.arg( .arg(
Arg::with_name("memory") Arg::with_name("memory")
@ -80,26 +83,30 @@ fn main() {
"Memory parameters \"size=<guest_memory_size>,\ "Memory parameters \"size=<guest_memory_size>,\
file=<backing_file_path>\"", file=<backing_file_path>\"",
) )
.default_value(config::DEFAULT_MEMORY), .default_value(config::DEFAULT_MEMORY)
.group("vm-config"),
) )
.arg( .arg(
Arg::with_name("kernel") Arg::with_name("kernel")
.long("kernel") .long("kernel")
.help("Path to kernel image (vmlinux)") .help("Path to kernel image (vmlinux)")
.takes_value(true), .takes_value(true)
.group("vm-config"),
) )
.arg( .arg(
Arg::with_name("cmdline") Arg::with_name("cmdline")
.long("cmdline") .long("cmdline")
.help("Kernel command line") .help("Kernel command line")
.takes_value(true), .takes_value(true)
.group("vm-config"),
) )
.arg( .arg(
Arg::with_name("disk") Arg::with_name("disk")
.long("disk") .long("disk")
.help("Path to VM disk image") .help("Path to VM disk image")
.takes_value(true) .takes_value(true)
.min_values(1), .min_values(1)
.group("vm-config"),
) )
.arg( .arg(
Arg::with_name("net") Arg::with_name("net")
@ -109,13 +116,15 @@ fn main() {
ip=<ip_addr>,mask=<net_mask>,mac=<mac_addr>\"", ip=<ip_addr>,mask=<net_mask>,mac=<mac_addr>\"",
) )
.takes_value(true) .takes_value(true)
.min_values(1), .min_values(1)
.group("vm-config"),
) )
.arg( .arg(
Arg::with_name("rng") Arg::with_name("rng")
.long("rng") .long("rng")
.help("Path to entropy source") .help("Path to entropy source")
.default_value(config::DEFAULT_RNG_SOURCE), .default_value(config::DEFAULT_RNG_SOURCE)
.group("vm-config"),
) )
.arg( .arg(
Arg::with_name("fs") Arg::with_name("fs")
@ -127,7 +136,8 @@ fn main() {
cache_size=<DAX cache size: default 8Gib>\"", cache_size=<DAX cache size: default 8Gib>\"",
) )
.takes_value(true) .takes_value(true)
.min_values(1), .min_values(1)
.group("vm-config"),
) )
.arg( .arg(
Arg::with_name("pmem") Arg::with_name("pmem")
@ -137,26 +147,30 @@ fn main() {
size=<persistent_memory_size>\"", size=<persistent_memory_size>\"",
) )
.takes_value(true) .takes_value(true)
.min_values(1), .min_values(1)
.group("vm-config"),
) )
.arg( .arg(
Arg::with_name("serial") Arg::with_name("serial")
.long("serial") .long("serial")
.help("Control serial port: off|null|tty|file=/path/to/a/file") .help("Control serial port: off|null|tty|file=/path/to/a/file")
.default_value("null"), .default_value("null")
.group("vm-config"),
) )
.arg( .arg(
Arg::with_name("console") Arg::with_name("console")
.long("console") .long("console")
.help("Control (virtio) console: off|null|tty|file=/path/to/a/file") .help("Control (virtio) console: off|null|tty|file=/path/to/a/file")
.default_value("tty"), .default_value("tty")
.group("vm-config"),
) )
.arg( .arg(
Arg::with_name("device") Arg::with_name("device")
.long("device") .long("device")
.help("Direct device assignment parameter") .help("Direct device assignment parameter")
.takes_value(true) .takes_value(true)
.min_values(1), .min_values(1)
.group("vm-config"),
) )
.arg( .arg(
Arg::with_name("vhost-user-net") Arg::with_name("vhost-user-net")
@ -167,7 +181,8 @@ fn main() {
queue_size=<size_of_each_queue>\"", queue_size=<size_of_each_queue>\"",
) )
.takes_value(true) .takes_value(true)
.min_values(1), .min_values(1)
.group("vm-config"),
) )
.arg( .arg(
Arg::with_name("vsock") Arg::with_name("vsock")
@ -177,7 +192,8 @@ fn main() {
sock=<socket_path>\"", sock=<socket_path>\"",
) )
.takes_value(true) .takes_value(true)
.min_values(1), .min_values(1)
.group("vm-config"),
) )
.arg( .arg(
Arg::with_name("vhost-user-blk") Arg::with_name("vhost-user-blk")
@ -195,14 +211,16 @@ fn main() {
Arg::with_name("v") Arg::with_name("v")
.short("v") .short("v")
.multiple(true) .multiple(true)
.help("Sets the level of debugging output"), .help("Sets the level of debugging output")
.group("vmm-config"),
) )
.arg( .arg(
Arg::with_name("log-file") Arg::with_name("log-file")
.long("log-file") .long("log-file")
.help("Log file. Standard error is used if not specified") .help("Log file. Standard error is used if not specified")
.takes_value(true) .takes_value(true)
.min_values(1), .min_values(1)
.group("vmm-config"),
) )
.get_matches(); .get_matches();