diff options
| author | Owen Jacobson <owen@grimoire.ca> | 2023-10-17 21:17:55 -0400 |
|---|---|---|
| committer | Owen Jacobson <owen@grimoire.ca> | 2023-10-17 22:32:21 -0400 |
| commit | 288205e302d9f6afa06b8602184e983d2080a5b6 (patch) | |
| tree | dfb307e8f3cb82d280e5a0392f11318194e09ef1 /src/apply.rs | |
CLI tool for updating Route53 DNS for an ASG.
Diffstat (limited to 'src/apply.rs')
| -rw-r--r-- | src/apply.rs | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/apply.rs b/src/apply.rs new file mode 100644 index 0000000..86e92b4 --- /dev/null +++ b/src/apply.rs @@ -0,0 +1,87 @@ +use aws_sdk_route53::types::{Change, ChangeAction, ChangeBatch, ResourceRecordSet}; + +use crate::result::Result; +use crate::route53::Route53; + +pub enum ApplyMode { + DryRun, + Apply, +} + +impl ApplyMode { + pub async fn apply<C, R, I>( + &self, + aws_context: &C, + zone_id: &str, + remove_records: R, + insert_records: I, + ) -> Result<()> + where + C: Route53, + R: IntoIterator<Item = ResourceRecordSet>, + I: IntoIterator<Item = ResourceRecordSet>, + { + match self { + ApplyMode::DryRun => dry_run(zone_id, remove_records, insert_records).await, + ApplyMode::Apply => apply(aws_context, zone_id, remove_records, insert_records).await, + } + } +} + +async fn dry_run<R, I>(zone_id: &str, remove_records: R, insert_records: I) -> Result<()> +where + R: IntoIterator<Item = ResourceRecordSet>, + I: IntoIterator<Item = ResourceRecordSet>, +{ + let remove_records: Vec<_> = remove_records.into_iter().collect(); + let insert_records: Vec<_> = insert_records.into_iter().collect(); + + println!("ZONE: {}", zone_id); + println!("REMOVE: {:#?}", remove_records); + println!("INSERT: {:#?}", insert_records); + + Ok(()) +} + +async fn apply<C, R, I>( + aws_context: &C, + zone_id: &str, + remove_records: R, + insert_records: I, +) -> Result<()> +where + C: Route53, + R: IntoIterator<Item = ResourceRecordSet>, + I: IntoIterator<Item = ResourceRecordSet>, +{ + let mut change_batch = ChangeBatch::builder(); + for remove_record in remove_records { + let change = Change::builder() + .action(ChangeAction::Delete) + .resource_record_set(remove_record) + .build(); + change_batch = change_batch.changes(change); + } + for insert_record in insert_records { + let change = Change::builder() + .action(ChangeAction::Create) + .resource_record_set(insert_record) + .build(); + change_batch = change_batch.changes(change); + } + let change_batch = change_batch.build(); + + if let Some(changes) = change_batch.changes() { + if !changes.is_empty() { + aws_context + .route53() + .change_resource_record_sets() + .hosted_zone_id(zone_id) + .change_batch(change_batch) + .send() + .await?; + } + } + + Ok(()) +} |
