mirror of
https://github.com/apache/nifi.git
synced 2025-02-08 02:58:43 +00:00
NIFI-10643: Paging secrets in AwsSecretsManagerParameterProvider
This closes #6532 Signed-off-by: David Handermann <exceptionfactory@apache.org>
This commit is contained in:
parent
2d7f86b265
commit
704ca63cc7
@ -139,11 +139,20 @@ public class AwsSecretsManagerParameterProvider extends AbstractParameterProvide
|
|||||||
AWSSecretsManager secretsManager = this.configureClient(context);
|
AWSSecretsManager secretsManager = this.configureClient(context);
|
||||||
|
|
||||||
final List<ParameterGroup> groups = new ArrayList<>();
|
final List<ParameterGroup> groups = new ArrayList<>();
|
||||||
final ListSecretsRequest listSecretsRequest = new ListSecretsRequest();
|
ListSecretsRequest listSecretsRequest = new ListSecretsRequest();
|
||||||
final ListSecretsResult listSecretsResult = secretsManager.listSecrets(listSecretsRequest);
|
ListSecretsResult listSecretsResult = secretsManager.listSecrets(listSecretsRequest);
|
||||||
|
while(!listSecretsResult.getSecretList().isEmpty()) {
|
||||||
for (final SecretListEntry entry : listSecretsResult.getSecretList()) {
|
for (final SecretListEntry entry : listSecretsResult.getSecretList()) {
|
||||||
groups.addAll(fetchSecret(secretsManager, context, entry.getName()));
|
groups.addAll(fetchSecret(secretsManager, context, entry.getName()));
|
||||||
}
|
}
|
||||||
|
final String nextToken = listSecretsResult.getNextToken();
|
||||||
|
if (nextToken == null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
listSecretsRequest.setNextToken(nextToken);
|
||||||
|
listSecretsResult = secretsManager.listSecrets(listSecretsRequest);
|
||||||
|
}
|
||||||
|
|
||||||
return groups;
|
return groups;
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ import com.amazonaws.services.secretsmanager.AWSSecretsManager;
|
|||||||
import com.amazonaws.services.secretsmanager.model.AWSSecretsManagerException;
|
import com.amazonaws.services.secretsmanager.model.AWSSecretsManagerException;
|
||||||
import com.amazonaws.services.secretsmanager.model.GetSecretValueRequest;
|
import com.amazonaws.services.secretsmanager.model.GetSecretValueRequest;
|
||||||
import com.amazonaws.services.secretsmanager.model.GetSecretValueResult;
|
import com.amazonaws.services.secretsmanager.model.GetSecretValueResult;
|
||||||
|
import com.amazonaws.services.secretsmanager.model.ListSecretsRequest;
|
||||||
import com.amazonaws.services.secretsmanager.model.ListSecretsResult;
|
import com.amazonaws.services.secretsmanager.model.ListSecretsResult;
|
||||||
import com.amazonaws.services.secretsmanager.model.SecretListEntry;
|
import com.amazonaws.services.secretsmanager.model.SecretListEntry;
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
@ -46,6 +47,7 @@ import java.util.Collections;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
@ -64,7 +66,7 @@ public class TestAwsSecretsManagerParameterProvider {
|
|||||||
private AWSSecretsManager defaultSecretsManager;
|
private AWSSecretsManager defaultSecretsManager;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private ListSecretsResult listSecretsResult;
|
private ListSecretsResult emptyListSecretsResult;
|
||||||
|
|
||||||
final ObjectMapper objectMapper = new ObjectMapper();
|
final ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
|
||||||
@ -105,8 +107,9 @@ public class TestAwsSecretsManagerParameterProvider {
|
|||||||
@Test
|
@Test
|
||||||
public void testFetchParametersGetSecretFailure() throws InitializationException {
|
public void testFetchParametersGetSecretFailure() throws InitializationException {
|
||||||
final List<SecretListEntry> secretList = Collections.singletonList(new SecretListEntry().withName("MySecret"));
|
final List<SecretListEntry> secretList = Collections.singletonList(new SecretListEntry().withName("MySecret"));
|
||||||
|
final ListSecretsResult listSecretsResult = mock(ListSecretsResult.class);
|
||||||
when(listSecretsResult.getSecretList()).thenReturn(secretList);
|
when(listSecretsResult.getSecretList()).thenReturn(secretList);
|
||||||
when(defaultSecretsManager.listSecrets(any())).thenReturn(listSecretsResult);
|
when(defaultSecretsManager.listSecrets(argThat(ListSecretsRequestMatcher.hasToken(null)))).thenReturn(listSecretsResult);
|
||||||
when(defaultSecretsManager.getSecretValue(argThat(matchesGetSecretValueRequest("MySecret")))).thenThrow(new AWSSecretsManagerException("Fake exception"));
|
when(defaultSecretsManager.getSecretValue(argThat(matchesGetSecretValueRequest("MySecret")))).thenThrow(new AWSSecretsManagerException("Fake exception"));
|
||||||
runProviderTest(defaultSecretsManager, 0, ConfigVerificationResult.Outcome.FAILED);
|
runProviderTest(defaultSecretsManager, 0, ConfigVerificationResult.Outcome.FAILED);
|
||||||
}
|
}
|
||||||
@ -115,16 +118,24 @@ public class TestAwsSecretsManagerParameterProvider {
|
|||||||
return spy(new AwsSecretsManagerParameterProvider());
|
return spy(new AwsSecretsManagerParameterProvider());
|
||||||
}
|
}
|
||||||
|
|
||||||
private AWSSecretsManager mockSecretsManager(final List<ParameterGroup> mockGroup) {
|
private AWSSecretsManager mockSecretsManager(final List<ParameterGroup> mockParameterGroups) {
|
||||||
final AWSSecretsManager secretsManager = mock(AWSSecretsManager.class);
|
final AWSSecretsManager secretsManager = mock(AWSSecretsManager.class);
|
||||||
|
when(emptyListSecretsResult.getSecretList()).thenReturn(Collections.emptyList());
|
||||||
|
|
||||||
final List<SecretListEntry> secretList = mockGroup.stream()
|
String currentToken = null;
|
||||||
.map(group -> new SecretListEntry().withName(group.getGroupName()))
|
for (int i = 0; i < mockParameterGroups.size(); i++) {
|
||||||
.collect(Collectors.toList());
|
final ParameterGroup group = mockParameterGroups.get(i);
|
||||||
|
final List<SecretListEntry> secretList = Collections.singletonList(new SecretListEntry().withName(group.getGroupName()));
|
||||||
|
final ListSecretsResult listSecretsResult = mock(ListSecretsResult.class);
|
||||||
when(listSecretsResult.getSecretList()).thenReturn(secretList);
|
when(listSecretsResult.getSecretList()).thenReturn(secretList);
|
||||||
when(secretsManager.listSecrets(any())).thenReturn(listSecretsResult);
|
when(secretsManager.listSecrets(argThat(ListSecretsRequestMatcher.hasToken(currentToken)))).thenReturn(listSecretsResult);
|
||||||
|
|
||||||
mockGroup.forEach(group -> {
|
currentToken = "token-" + i;
|
||||||
|
when(listSecretsResult.getNextToken()).thenReturn(currentToken);
|
||||||
|
}
|
||||||
|
when(secretsManager.listSecrets(argThat(ListSecretsRequestMatcher.hasToken(currentToken)))).thenReturn(emptyListSecretsResult);
|
||||||
|
|
||||||
|
mockParameterGroups.forEach(group -> {
|
||||||
final String groupName = group.getGroupName();
|
final String groupName = group.getGroupName();
|
||||||
final Map<String, String> keyValues = group.getParameters().stream().collect(Collectors.toMap(
|
final Map<String, String> keyValues = group.getParameters().stream().collect(Collectors.toMap(
|
||||||
param -> param.getDescriptor().getName(),
|
param -> param.getDescriptor().getName(),
|
||||||
@ -196,4 +207,22 @@ public class TestAwsSecretsManagerParameterProvider {
|
|||||||
return argument != null && argument.getSecretId().equals(secretId);
|
return argument != null && argument.getSecretId().equals(secretId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class ListSecretsRequestMatcher implements ArgumentMatcher<ListSecretsRequest> {
|
||||||
|
|
||||||
|
private static ListSecretsRequestMatcher hasToken(final String token) {
|
||||||
|
return new ListSecretsRequestMatcher(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final String token;
|
||||||
|
|
||||||
|
private ListSecretsRequestMatcher(final String token) {
|
||||||
|
this.token = token;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(final ListSecretsRequest argument) {
|
||||||
|
return argument != null && Objects.equals(argument.getNextToken(), token);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user