guest: Wait for a file of gRPC port number getting ready

Some debian services, such as forwarder_guest_launcher and
shutdown_runner, read a gRPC number from a file provided
via virtiofs.
However, since virtiofs and the port number's setup takes some time,
the file soetimes is not ready when systemd tries to start these
daemons. As a result, these daemons could fail to be started
especially at the VM's first boot after installation.

This CL adds a logic to wait for the file getting ready.

Bug: none
Test: Start a VM and check journalctl to ensure the daemons didn't
fail to start.

Change-Id: If5df480815da3ad18f3e412dcabe06e4e7f804ea
diff --git a/guest/shutdown_runner/src/main.rs b/guest/shutdown_runner/src/main.rs
index 397c205..4043002 100644
--- a/guest/shutdown_runner/src/main.rs
+++ b/guest/shutdown_runner/src/main.rs
@@ -26,10 +26,9 @@
 #[derive(Parser)]
 /// Flags for running command
 pub struct Args {
-    /// grpc port number
+    /// Path to a file where grpc port number is written
     #[arg(long)]
-    #[arg(alias = "grpc_port")]
-    grpc_port: String,
+    grpc_port_file: String,
 }
 
 #[tokio::main]
@@ -38,7 +37,17 @@
     let args = Args::parse();
     let gateway_ip_addr = netdev::get_default_gateway()?.ipv4[0];
 
-    let server_addr = format!("http://{}:{}", gateway_ip_addr.to_string(), args.grpc_port);
+    // Wait for `grpc_port_file` becomes available.
+    const GRPC_PORT_MAX_RETRY_COUNT: u32 = 10;
+    for _ in 0..GRPC_PORT_MAX_RETRY_COUNT {
+        if std::path::Path::new(&args.grpc_port_file).exists() {
+            break;
+        }
+        debug!("{} does not exist. Wait 1 second", args.grpc_port_file);
+        tokio::time::sleep(std::time::Duration::from_secs(1)).await;
+    }
+    let grpc_port = std::fs::read_to_string(&args.grpc_port_file)?.trim().to_string();
+    let server_addr = format!("http://{}:{}", gateway_ip_addr.to_string(), grpc_port);
 
     debug!("connect to grpc server {}", server_addr);