| 199 | } |
| 200 | |
| 201 | pub fn install_environment( |
| 202 | &self, |
| 203 | revision: u64, |
| 204 | env: HashMap<String, String>, |
| 205 | credential_expires_at_ms: HashMap<String, i64>, |
| 206 | dynamic_credentials: HashMap<String, crate::proto::ProviderProfileCredential>, |
| 207 | ) -> usize { |
| 208 | let (mut child_env, generation_resolver, current_resolver) = |
| 209 | SecretResolver::from_provider_env_for_current_revision( |
| 210 | env, |
| 211 | credential_expires_at_ms, |
| 212 | revision, |
| 213 | ); |
| 214 | let mut inner = self |
| 215 | .inner |
| 216 | .write() |
| 217 | .expect("provider credential state poisoned"); |
| 218 | |
| 219 | for key in &inner.suppressed_keys { |
| 220 | child_env.remove(key); |
| 221 | } |
| 222 | |
| 223 | inner.current = Arc::new(ProviderCredentialSnapshot { |
| 224 | revision, |
| 225 | child_env, |
| 226 | dynamic_credentials, |
| 227 | }); |
| 228 | inner.current_resolver = current_resolver.map(Arc::new); |
| 229 | |
| 230 | if let Some(resolver) = generation_resolver { |
| 231 | inner.generations.push_back(Arc::new(resolver)); |
| 232 | while inner.generations.len() > MAX_RETAINED_CREDENTIAL_GENERATIONS { |
| 233 | inner.generations.pop_front(); |
| 234 | } |
| 235 | } |
| 236 | inner.combined_resolver = |
| 237 | merge_resolvers(&inner.generations, inner.current_resolver.as_ref()); |
| 238 | inner.current.child_env.len() |
| 239 | } |
| 240 | } |
| 241 | |
| 242 | fn merge_resolvers( |