|
1 | 1 | // Copyright (c) Microsoft Corporation. |
2 | 2 | // Licensed under the MIT License. |
3 | 3 |
|
4 | | -use crate::configure::config_doc::Metadata; |
| 4 | +use crate::configure::config_doc::{ExecutionKind, Metadata}; |
5 | 5 | use crate::configure::parameters::Input; |
6 | 6 | use crate::dscerror::DscError; |
7 | 7 | use crate::dscresources::dscresource::get_diff; |
@@ -59,7 +59,7 @@ pub fn add_resource_export_results_to_configuration(resource: &DscResource, adap |
59 | 59 |
|
60 | 60 | for (i, instance) in export_result.actual_state.iter().enumerate() { |
61 | 61 | let mut r = config_doc::Resource::new(); |
62 | | - r.resource_type = resource.type_name.clone(); |
| 62 | + r.resource_type.clone_from(&resource.type_name); |
63 | 63 | r.name = format!("{}-{i}", r.resource_type); |
64 | 64 | let props: Map<String, Value> = serde_json::from_value(instance.clone())?; |
65 | 65 | r.properties = escape_property_values(&props)?; |
@@ -309,73 +309,64 @@ impl Configurator { |
309 | 309 | let desired = add_metadata(&dsc_resource.kind, properties)?; |
310 | 310 | trace!("desired: {desired}"); |
311 | 311 |
|
| 312 | + let start_datetime; |
| 313 | + let end_datetime; |
| 314 | + let set_result; |
312 | 315 | if exist || dsc_resource.capabilities.contains(&Capability::SetHandlesExist) { |
313 | 316 | debug!("Resource handles _exist or _exist is true"); |
314 | | - let start_datetime = chrono::Local::now(); |
315 | | - let set_result = dsc_resource.set(&desired, skip_test)?; |
316 | | - let end_datetime = chrono::Local::now(); |
317 | | - self.context.outputs.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&set_result)?); |
318 | | - let resource_result = config_result::ResourceSetResult { |
319 | | - metadata: Some( |
320 | | - Metadata { |
321 | | - microsoft: Some( |
322 | | - MicrosoftDscMetadata { |
323 | | - duration: Some(end_datetime.signed_duration_since(start_datetime).to_string()), |
324 | | - ..Default::default() |
325 | | - } |
326 | | - ) |
327 | | - } |
328 | | - ), |
329 | | - name: resource.name.clone(), |
330 | | - resource_type: resource.resource_type.clone(), |
331 | | - result: set_result, |
332 | | - }; |
333 | | - result.results.push(resource_result); |
| 317 | + start_datetime = chrono::Local::now(); |
| 318 | + set_result = dsc_resource.set(&desired, skip_test, &self.context.execution_type)?; |
| 319 | + end_datetime = chrono::Local::now(); |
334 | 320 | } else if dsc_resource.capabilities.contains(&Capability::Delete) { |
| 321 | + if self.context.execution_type == ExecutionKind::WhatIf { |
| 322 | + // TODO: add delete what-if support |
| 323 | + return Err(DscError::NotSupported("What-if execution not supported for delete".to_string())); |
| 324 | + } |
335 | 325 | debug!("Resource implements delete and _exist is false"); |
336 | 326 | let before_result = dsc_resource.get(&desired)?; |
337 | | - let start_datetime = chrono::Local::now(); |
| 327 | + start_datetime = chrono::Local::now(); |
338 | 328 | dsc_resource.delete(&desired)?; |
339 | | - let end_datetime = chrono::Local::now(); |
340 | 329 | let after_result = dsc_resource.get(&desired)?; |
341 | 330 | // convert get result to set result |
342 | | - let set_result = match before_result { |
| 331 | + set_result = match before_result { |
343 | 332 | GetResult::Resource(before_response) => { |
344 | 333 | let GetResult::Resource(after_result) = after_result else { |
345 | 334 | return Err(DscError::NotSupported("Group resources not supported for delete".to_string())) |
346 | 335 | }; |
347 | 336 | let before_value = serde_json::to_value(&before_response.actual_state)?; |
348 | 337 | let after_value = serde_json::to_value(&after_result.actual_state)?; |
349 | | - ResourceSetResponse { |
| 338 | + SetResult::Resource(ResourceSetResponse { |
350 | 339 | before_state: before_response.actual_state, |
351 | 340 | after_state: after_result.actual_state, |
352 | 341 | changed_properties: Some(get_diff(&before_value, &after_value)), |
353 | | - } |
| 342 | + }) |
354 | 343 | }, |
355 | 344 | GetResult::Group(_) => { |
356 | 345 | return Err(DscError::NotSupported("Group resources not supported for delete".to_string())); |
357 | 346 | }, |
358 | 347 | }; |
359 | | - self.context.outputs.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&set_result)?); |
360 | | - let resource_result = config_result::ResourceSetResult { |
361 | | - metadata: Some( |
362 | | - Metadata { |
363 | | - microsoft: Some( |
364 | | - MicrosoftDscMetadata { |
365 | | - duration: Some(end_datetime.signed_duration_since(start_datetime).to_string()), |
366 | | - ..Default::default() |
367 | | - } |
368 | | - ) |
369 | | - } |
370 | | - ), |
371 | | - name: resource.name.clone(), |
372 | | - resource_type: resource.resource_type.clone(), |
373 | | - result: SetResult::Resource(set_result), |
374 | | - }; |
375 | | - result.results.push(resource_result); |
| 348 | + end_datetime = chrono::Local::now(); |
376 | 349 | } else { |
377 | 350 | return Err(DscError::NotImplemented(format!("Resource '{}' does not support `delete` and does not handle `_exist` as false", resource.resource_type))); |
378 | 351 | } |
| 352 | + |
| 353 | + self.context.outputs.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&set_result)?); |
| 354 | + let resource_result = config_result::ResourceSetResult { |
| 355 | + metadata: Some( |
| 356 | + Metadata { |
| 357 | + microsoft: Some( |
| 358 | + MicrosoftDscMetadata { |
| 359 | + duration: Some(end_datetime.signed_duration_since(start_datetime).to_string()), |
| 360 | + ..Default::default() |
| 361 | + } |
| 362 | + ) |
| 363 | + } |
| 364 | + ), |
| 365 | + name: resource.name.clone(), |
| 366 | + resource_type: resource.resource_type.clone(), |
| 367 | + result: set_result, |
| 368 | + }; |
| 369 | + result.results.push(resource_result); |
379 | 370 | } |
380 | 371 |
|
381 | 372 | result.metadata = Some( |
|
0 commit comments