@@ -101,20 +101,27 @@ impl OpenstackConfigDrive {
101
101
}
102
102
103
103
/// The metadata is stored as key:value pair in ec2/latest/meta-data.json file
104
- fn read_metadata_ec2 ( & self ) -> Result < MetadataEc2JSON > {
104
+ fn read_metadata_ec2 ( & self ) -> Result < Option < MetadataEc2JSON > > {
105
+ use std:: io:: ErrorKind :: NotFound ;
106
+
105
107
let filename = self . metadata_dir ( "ec2" ) . join ( "meta-data.json" ) ;
106
- let file =
107
- File :: open ( & filename) . with_context ( || format ! ( "failed to open file '{filename:?}'" ) ) ?;
108
+ let file = match File :: open ( & filename) {
109
+ Ok ( file) => file,
110
+ Err ( e) if e. kind ( ) == NotFound => return Ok ( None ) ,
111
+ Err ( e) => return Err ( anyhow:: Error :: new ( e) . context ( format ! ( "failed to open file '{filename:?}'" ) ) ) ,
112
+ } ;
108
113
let bufrd = BufReader :: new ( file) ;
109
- Self :: parse_metadata_ec2 ( bufrd)
110
- . with_context ( || format ! ( "failed to parse file '{filename:?}'" ) )
114
+ match Self :: parse_metadata_ec2 ( bufrd)
115
+ . with_context ( || format ! ( "failed to parse file '{filename:?}'" ) ) {
116
+ Ok ( metadata) => Ok ( Some ( metadata) ) ,
117
+ Err ( e) => Err ( e) ,
118
+ }
111
119
}
112
120
113
121
/// The metadata is stored as key:value pair in openstack/latest/meta_data.json file
114
122
fn read_metadata_openstack ( & self ) -> Result < MetadataOpenstackJSON > {
115
123
let filename = self . metadata_dir ( "openstack" ) . join ( "meta_data.json" ) ;
116
- let file =
117
- File :: open ( & filename) . with_context ( || format ! ( "failed to open file '{filename:?}'" ) ) ?;
124
+ let file = File :: open ( & filename) . with_context ( || format ! ( "failed to open file '{filename:?}'" ) ) ?;
118
125
let bufrd = BufReader :: new ( file) ;
119
126
Self :: parse_metadata_openstack ( bufrd)
120
127
. with_context ( || format ! ( "failed to parse file '{filename:?}'" ) )
@@ -144,17 +151,22 @@ impl OpenstackConfigDrive {
144
151
impl MetadataProvider for OpenstackConfigDrive {
145
152
fn attributes ( & self ) -> Result < HashMap < String , String > > {
146
153
let mut out = HashMap :: with_capacity ( 6 ) ;
147
- let metadata_ec2: MetadataEc2JSON = self . read_metadata_ec2 ( ) ?;
148
154
let metadata_openstack: MetadataOpenstackJSON = self . read_metadata_openstack ( ) ?;
149
155
if let Some ( hostname) = metadata_openstack. hostname {
150
156
out. insert ( "OPENSTACK_HOSTNAME" . to_string ( ) , hostname) ;
151
157
}
152
- if let Some ( instance_id) = metadata_ec2. instance_id {
153
- out. insert ( "OPENSTACK_INSTANCE_ID" . to_string ( ) , instance_id) ;
154
- }
155
158
if let Some ( uuid) = metadata_openstack. uuid {
156
159
out. insert ( "OPENSTACK_INSTANCE_UUID" . to_string ( ) , uuid) ;
157
160
}
161
+
162
+ let metadata_ec2 = match self . read_metadata_ec2 ( ) {
163
+ Ok ( Some ( metadata) ) => metadata,
164
+ Ok ( None ) => return Ok ( out) ,
165
+ Err ( e) => return Err ( e) ,
166
+ } ;
167
+ if let Some ( instance_id) = metadata_ec2. instance_id {
168
+ out. insert ( "OPENSTACK_INSTANCE_ID" . to_string ( ) , instance_id) ;
169
+ }
158
170
if let Some ( instance_type) = metadata_ec2. instance_type {
159
171
out. insert ( "OPENSTACK_INSTANCE_TYPE" . to_string ( ) , instance_type) ;
160
172
}
0 commit comments