main/migration/plaintext_to_awsdbe/awsdbe/
migration_step_2.rs1use crate::migration::plaintext_to_awsdbe::awsdbe::common::create_table_configs;
5use crate::migration::plaintext_to_awsdbe::migration_utils::{
6 verify_returned_item, DO_NOTHING_VALUE, ENCRYPTED_AND_SIGNED_VALUE, SIGN_ONLY_VALUE,
7};
8use aws_db_esdk::dynamodb::types::PlaintextOverride;
9use aws_db_esdk::intercept::DbEsdkInterceptor;
10use aws_sdk_dynamodb::types::AttributeValue;
11use std::collections::HashMap;
12
13pub async fn migration_step_2_example(
37 kms_key_id: &str,
38 ddb_table_name: &str,
39 partition_key_value: &str,
40 sort_key_write_value: &str,
41 sort_key_read_value: &str,
42) -> Result<bool, Box<dyn std::error::Error>> {
43 let table_configs = create_table_configs(
51 kms_key_id,
52 ddb_table_name,
53 PlaintextOverride::ForbidPlaintextWriteAllowPlaintextRead,
54 )
55 .await?;
56
57 let sdk_config = aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await;
59 let dynamo_config = aws_sdk_dynamodb::config::Builder::from(&sdk_config)
60 .interceptor(DbEsdkInterceptor::new(table_configs)?)
61 .build();
62 let ddb = aws_sdk_dynamodb::Client::from_conf(dynamo_config);
63
64 let partition_key_name = "partition_key";
67 let sort_key_name = "sort_key";
68 let encrypted_and_signed_value = ENCRYPTED_AND_SIGNED_VALUE;
69 let sign_only_value = SIGN_ONLY_VALUE;
70 let do_nothing_value = DO_NOTHING_VALUE;
71 let item = HashMap::from([
72 (
73 partition_key_name.to_string(),
74 AttributeValue::S(partition_key_value.to_string()),
75 ),
76 (
77 sort_key_name.to_string(),
78 AttributeValue::N(sort_key_write_value.to_string()),
79 ),
80 (
81 "attribute1".to_string(),
82 AttributeValue::S(encrypted_and_signed_value.to_string()),
83 ),
84 (
85 "attribute2".to_string(),
86 AttributeValue::S(sign_only_value.to_string()),
87 ),
88 (
89 "attribute3".to_string(),
90 AttributeValue::S(do_nothing_value.to_string()),
91 ),
92 ]);
93
94 ddb.put_item()
95 .table_name(ddb_table_name)
96 .set_item(Some(item))
97 .send()
98 .await?;
99
100 let key = HashMap::from([
107 (
108 partition_key_name.to_string(),
109 AttributeValue::S(partition_key_value.to_string()),
110 ),
111 (
112 sort_key_name.to_string(),
113 AttributeValue::N(sort_key_read_value.to_string()),
114 ),
115 ]);
116
117 let response = ddb
118 .get_item()
119 .table_name(ddb_table_name)
120 .set_key(Some(key))
121 .consistent_read(true)
125 .send()
126 .await?;
127
128 if let Some(item) = response.item {
130 let success = verify_returned_item(&item, partition_key_value, sort_key_read_value)?;
131 if success {
132 println!("MigrationStep2 completed successfully");
133 }
134 Ok(success)
135 } else {
136 Err("No item found".into())
137 }
138}
139
140#[tokio::test(flavor = "multi_thread")]
141async fn test_migration_step_2() -> Result<(), Box<dyn std::error::Error>> {
142 use crate::migration::plaintext_to_awsdbe::awsdbe::migration_step_1::migration_step_1_example;
143 use crate::migration::plaintext_to_awsdbe::awsdbe::migration_step_3::migration_step_3_example;
144 use crate::migration::plaintext_to_awsdbe::plaintext::migration_step_0::migration_step_0_example;
145 use crate::test_utils;
146 use uuid::Uuid;
147
148 let kms_key_id = test_utils::TEST_KMS_KEY_ID;
149 let table_name = test_utils::TEST_DDB_TABLE_NAME;
150 let partition_key = Uuid::new_v4().to_string();
151 let sort_keys = ["0", "1", "2", "3"];
152
153 let success = migration_step_2_example(
155 kms_key_id,
156 table_name,
157 &partition_key,
158 sort_keys[2],
159 sort_keys[2],
160 )
161 .await?;
162 assert!(success, "MigrationStep2 should complete successfully");
163
164 let success =
166 migration_step_0_example(table_name, &partition_key, sort_keys[0], sort_keys[0]).await?;
167 assert!(success, "MigrationStep0 should complete successfully");
168
169 let success = migration_step_2_example(
171 kms_key_id,
172 table_name,
173 &partition_key,
174 sort_keys[2],
175 sort_keys[0],
176 )
177 .await?;
178 assert!(
179 success,
180 "MigrationStep2 should be able to read items written by Step 0"
181 );
182
183 let success = migration_step_1_example(
185 kms_key_id,
186 table_name,
187 &partition_key,
188 sort_keys[1],
189 sort_keys[1],
190 )
191 .await?;
192 assert!(success, "MigrationStep1 should complete successfully");
193
194 let success = migration_step_2_example(
196 kms_key_id,
197 table_name,
198 &partition_key,
199 sort_keys[2],
200 sort_keys[1],
201 )
202 .await?;
203 assert!(
204 success,
205 "MigrationStep2 should be able to read items written by Step 1"
206 );
207
208 let success = migration_step_3_example(
210 kms_key_id,
211 table_name,
212 &partition_key,
213 sort_keys[3],
214 sort_keys[3],
215 )
216 .await?;
217 assert!(success, "MigrationStep3 should complete successfully");
218
219 let success = migration_step_2_example(
221 kms_key_id,
222 table_name,
223 &partition_key,
224 sort_keys[2],
225 sort_keys[3],
226 )
227 .await?;
228 assert!(
229 success,
230 "MigrationStep2 should be able to read items written by Step 3"
231 );
232
233 for sort_key in &sort_keys {
235 test_utils::cleanup_items(table_name, &partition_key, sort_key).await?;
236 }
237
238 Ok(())
239}