Add method to get list of VMs for vm tool.

Bug: 181869875
Test: Ran on VIM3L
Change-Id: I90506962171d6c16469e265521b435bec905e0f4
diff --git a/vm/src/main.rs b/vm/src/main.rs
index 1e642cb..df375e4 100644
--- a/vm/src/main.rs
+++ b/vm/src/main.rs
@@ -35,25 +35,27 @@
     if args.len() < 2 {
         eprintln!("Usage:");
         eprintln!("  {} run <vm_config.json>", args[0]);
+        eprintln!("  {} list", args[0]);
         exit(1);
     }
 
     // We need to start the thread pool for Binder to work properly, especially link_to_death.
     ProcessState::start_thread_pool();
 
+    let virt_manager = get_interface(VIRT_MANAGER_BINDER_SERVICE_IDENTIFIER)
+        .context("Failed to find Virt Manager service")?;
+
     match args[1].as_ref() {
-        "run" if args.len() == 3 => command_run(&args[2]),
+        "run" if args.len() == 3 => command_run(virt_manager, &args[2]),
+        "list" if args.len() == 2 => command_list(virt_manager),
         command => bail!("Invalid command '{}' or wrong number of arguments", command),
     }
 }
 
 /// Run a VM from the given configuration file.
-fn command_run(config_filename: &str) -> Result<(), Error> {
-    let virt_manager: Strong<dyn IVirtManager> =
-        get_interface(VIRT_MANAGER_BINDER_SERVICE_IDENTIFIER)
-            .with_context(|| "Failed to find Virt Manager service")?;
-    let vm = virt_manager.startVm(config_filename).with_context(|| "Failed to start VM")?;
-    let cid = vm.getCid().with_context(|| "Failed to get CID")?;
+fn command_run(virt_manager: Strong<dyn IVirtManager>, config_filename: &str) -> Result<(), Error> {
+    let vm = virt_manager.startVm(config_filename).context("Failed to start VM")?;
+    let cid = vm.getCid().context("Failed to get CID")?;
     println!("Started VM from {} with CID {}.", config_filename, cid);
 
     // Wait until the VM dies. If we just returned immediately then the IVirtualMachine Binder
@@ -63,6 +65,13 @@
     Ok(())
 }
 
+/// List the VMs currently running.
+fn command_list(virt_manager: Strong<dyn IVirtManager>) -> Result<(), Error> {
+    let vms = virt_manager.debugListVms().context("Failed to get list of VMs")?;
+    println!("Running VMs: {:#?}", vms);
+    Ok(())
+}
+
 /// Block until the given Binder object dies.
 fn wait_for_death(binder: &mut impl IBinder) -> Result<(), Error> {
     let dead = AtomicFlag::default();