#![warn(missing_docs)]
#![warn(missing_doc_code_examples)]
use anyhow::Result;
use log::{error, info};
use rusoto_core::Region;
use rusoto_ssm::SsmClient;
use std::fs::File;
use std::io::prelude::Read;
use std::iter::Map;
use yaml_rust::YamlLoader;
pub use parameter::Parameter;
mod parameter;
pub async fn update_from_file(filename: &str) -> Result<()> {
let parameters_from_yaml = read_parameters_yaml(filename)?;
update_parameters(parameters_from_yaml).await
}
pub async fn update_parameter(
name: &str,
value: &str,
description: &str,
is_secure: bool,
) -> Result<()> {
update_parameters(vec![Parameter::new(name, value, description, is_secure)]).await
}
pub async fn update_parameters(parameters: Vec<Parameter>) -> Result<()> {
let client = SsmClient::new(Region::UsWest2);
for parameter in parameters {
match parameter.update(&client).await {
Ok(parameter_name) => info!("Parameter {} processed", parameter_name),
Err(_error) => error!("Parameter not updated"),
}
}
info!("Parameter update finished running");
Ok(())
}
fn read_parameters_yaml(filename: &str) -> Result<Vec<Parameter>> {
let mut file = File::open(filename).expect("Unable to open parameter input file");
let mut contents = String::new();
file.read_to_string(&mut contents)
.expect("Unable to read parameter input file");
let parameters = YamlLoader::load_from_str(&contents)?
.into_iter()
.map(|yaml_document| -> Map<_, _> {
yaml_document.into_iter().map(|param| -> Parameter {
Parameter::new(
param["name"].as_str().expect("name missing"),
param["value"].as_str().expect("value missing"),
param["description"].as_str().expect("description missing"),
param["is_secure"].as_bool().expect("is_secure missing"),
)
})
})
.flatten()
.collect::<Vec<_>>();
info!("Parameters YAML loaded");
Ok(parameters)
}
mod tests {
#[tokio::test]
#[should_panic]
async fn test_update_from_file() {
let result = crate::update_from_file("missing_file.yaml").await;
assert!(result.is_err());
}
#[tokio::test]
async fn test_update_parameter() {
let result = crate::update_parameter("name", "value", "description", true).await;
assert!(result.is_ok());
}
#[tokio::test]
async fn test_update_parameters() {
let result = crate::update_parameters(vec![crate::Parameter::new(
"name",
"value",
"description",
true,
)])
.await;
assert!(result.is_ok());
}
}