microdroid_manager: waits for a config file

Ideally, microdroid_manager should start zipfuse only if necessary and
access the VM config file from the APK via fusefs when it's ready.

But for now zipfuse doesn't report when it's ready to access files in a
zip file. So, microdroid_manager should wait a while to access the
config file when it is from the APK.

Bug: 189301496
Test: MicrodroidHostTestCases
Test: microdroid_manager_test
Change-Id: I0dc304a8f135f52a846fc1bb6f4e476f6162697a
diff --git a/microdroid_manager/src/payload_config.rs b/microdroid_manager/src/payload_config.rs
index 1dd6d92..bac841a 100644
--- a/microdroid_manager/src/payload_config.rs
+++ b/microdroid_manager/src/payload_config.rs
@@ -16,8 +16,13 @@
 
 use log::info;
 use serde::{Deserialize, Serialize};
-use std::fs::File;
 use std::io;
+use std::path::Path;
+use std::time::Duration;
+
+use crate::ioutil;
+
+const WAIT_TIMEOUT: Duration = Duration::from_secs(10);
 
 #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
 pub struct VmPayloadConfig {
@@ -33,9 +38,9 @@
 }
 
 impl VmPayloadConfig {
-    pub fn load_from(path: &str) -> io::Result<VmPayloadConfig> {
-        info!("loading config from {}...", path);
-        let file = File::open(path)?;
+    pub fn load_from(path: &Path) -> io::Result<VmPayloadConfig> {
+        info!("loading config from {:?}...", path);
+        let file = ioutil::wait_for_file(path, WAIT_TIMEOUT)?;
         Ok(serde_json::from_reader(file)?)
     }
 }