diff --git a/docs/release-notes.md b/docs/release-notes.md index 251df6a6..efca055a 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -11,6 +11,7 @@ Major changes: Minor changes: - ProxmoxVE: Fixed instance boot without config drive +- OpenStack: do not fail if ec2 metadata is not found Packaging changes: diff --git a/src/providers/openstack/configdrive.rs b/src/providers/openstack/configdrive.rs index 3a633b91..c0fbfda7 100644 --- a/src/providers/openstack/configdrive.rs +++ b/src/providers/openstack/configdrive.rs @@ -101,13 +101,19 @@ impl OpenstackConfigDrive { } /// The metadata is stored as key:value pair in ec2/latest/meta-data.json file - fn read_metadata_ec2(&self) -> Result { + fn read_metadata_ec2(&self) -> Result> { + use std::io::ErrorKind::NotFound; + let filename = self.metadata_dir("ec2").join("meta-data.json"); - let file = - File::open(&filename).with_context(|| format!("failed to open file '{filename:?}'"))?; + let file = match File::open(&filename) { + Ok(file) => file, + Err(e) if e.kind() == NotFound => return Ok(None), + Err(e) => return Err(e).with_context(|| format!("failed to open file '{filename:?}'")), + }; let bufrd = BufReader::new(file); Self::parse_metadata_ec2(bufrd) .with_context(|| format!("failed to parse file '{filename:?}'")) + .map(Some) } /// The metadata is stored as key:value pair in openstack/latest/meta_data.json file @@ -144,17 +150,20 @@ impl OpenstackConfigDrive { impl MetadataProvider for OpenstackConfigDrive { fn attributes(&self) -> Result> { let mut out = HashMap::with_capacity(6); - let metadata_ec2: MetadataEc2JSON = self.read_metadata_ec2()?; let metadata_openstack: MetadataOpenstackJSON = self.read_metadata_openstack()?; if let Some(hostname) = metadata_openstack.hostname { out.insert("OPENSTACK_HOSTNAME".to_string(), hostname); } - if let Some(instance_id) = metadata_ec2.instance_id { - out.insert("OPENSTACK_INSTANCE_ID".to_string(), instance_id); - } if let Some(uuid) = metadata_openstack.uuid { out.insert("OPENSTACK_INSTANCE_UUID".to_string(), uuid); } + + let Some(metadata_ec2) = self.read_metadata_ec2()? else { + return Ok(out); + }; + if let Some(instance_id) = metadata_ec2.instance_id { + out.insert("OPENSTACK_INSTANCE_ID".to_string(), instance_id); + } if let Some(instance_type) = metadata_ec2.instance_type { out.insert("OPENSTACK_INSTANCE_TYPE".to_string(), instance_type); }