diff --git a/spring-credhub-core/src/main/java/org/springframework/credhub/core/CredHubOperations.java b/spring-credhub-core/src/main/java/org/springframework/credhub/core/CredHubOperations.java index faaaabd..e423774 100644 --- a/spring-credhub-core/src/main/java/org/springframework/credhub/core/CredHubOperations.java +++ b/spring-credhub-core/src/main/java/org/springframework/credhub/core/CredHubOperations.java @@ -57,6 +57,16 @@ public interface CredHubOperations { */ CredentialDetails generate(ParametersRequest

parametersRequest); + /** + * Regenerate a credential in CredHub. Only credentials that were previously generated can be + * re-generated. + * + * @param name the name of the credential; must not be {@literal null} + * @param the credential implementation type + * @return the details of the regenerated credential + */ + CredentialDetails regenerate(CredentialName name); + /** * Retrieve a credential using its ID, as returned in a write request. * diff --git a/spring-credhub-core/src/main/java/org/springframework/credhub/core/CredHubTemplate.java b/spring-credhub-core/src/main/java/org/springframework/credhub/core/CredHubTemplate.java index ce4677b..9770e6e 100644 --- a/spring-credhub-core/src/main/java/org/springframework/credhub/core/CredHubTemplate.java +++ b/spring-credhub-core/src/main/java/org/springframework/credhub/core/CredHubTemplate.java @@ -16,7 +16,9 @@ package org.springframework.credhub.core; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.springframework.core.ParameterizedTypeReference; import org.springframework.credhub.support.CredentialDetails; @@ -119,7 +121,7 @@ public class CredHubTemplate implements CredHubOperations { @Override @SuppressWarnings("unchecked") public CredentialDetails generate(final ParametersRequest

parametersRequest) { - Assert.notNull(parametersRequest, "generateRequest must not be null"); + Assert.notNull(parametersRequest, "parametersRequest must not be null"); final ParameterizedTypeReference> ref = new ParameterizedTypeReference>() {}; @@ -138,6 +140,31 @@ public class CredHubTemplate implements CredHubOperations { }); } + @Override + public CredentialDetails regenerate(final CredentialName name) { + Assert.notNull(name, "credential name must not be null"); + + final ParameterizedTypeReference> ref = + new ParameterizedTypeReference>() {}; + + return doWithRest(new RestOperationsCallback>() { + @Override + public CredentialDetails doWithRestOperations(RestOperations restOperations) { + Map request = new HashMap(2); + request.put("name", name.getName()); + request.put("regenerate", true); + + ResponseEntity> response = + restOperations.exchange(BASE_URL_PATH, POST, + new HttpEntity>(request), ref); + + throwExceptionOnError(response); + + return response.getBody(); + } + }); + } + @Override public CredentialDetails getById(final String id, Class credentialType) { Assert.notNull(id, "credential id must not be null"); diff --git a/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailCertificateUnitTests.java b/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailCertificateUnitTests.java index 7e2e5bb..b9ca351 100644 --- a/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailCertificateUnitTests.java +++ b/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailCertificateUnitTests.java @@ -88,6 +88,12 @@ public class CredHubTemplateDetailCertificateUnitTests verifyGenerate(expectedResponse); } + @Theory + public void regenerate(@FromDataPoints("detail-responses") + ResponseEntity> expectedResponse) { + verifyRegenerate(expectedResponse); + } + @Theory public void getById(@FromDataPoints("detail-responses") ResponseEntity> expectedResponse) { diff --git a/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailPasswordUnitTests.java b/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailPasswordUnitTests.java index 08685bf..50ef094 100644 --- a/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailPasswordUnitTests.java +++ b/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailPasswordUnitTests.java @@ -84,6 +84,12 @@ public class CredHubTemplateDetailPasswordUnitTests verifyGenerate(expectedResponse); } + @Theory + public void regenerate(@FromDataPoints("detail-responses") + ResponseEntity> expectedResponse) { + verifyRegenerate(expectedResponse); + } + @Theory public void getById(@FromDataPoints("detail-responses") ResponseEntity> expectedResponse) { diff --git a/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailRsaUnitTests.java b/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailRsaUnitTests.java index c627ba0..4c7bafe 100644 --- a/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailRsaUnitTests.java +++ b/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailRsaUnitTests.java @@ -85,6 +85,12 @@ public class CredHubTemplateDetailRsaUnitTests verifyGenerate(expectedResponse); } + @Theory + public void regenerate(@FromDataPoints("detail-responses") + ResponseEntity> expectedResponse) { + verifyRegenerate(expectedResponse); + } + @Theory public void getById(@FromDataPoints("detail-responses") ResponseEntity> expectedResponse) { diff --git a/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailSshUnitTests.java b/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailSshUnitTests.java index 9b9832a..4d6131e 100644 --- a/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailSshUnitTests.java +++ b/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailSshUnitTests.java @@ -85,6 +85,12 @@ public class CredHubTemplateDetailSshUnitTests verifyGenerate(expectedResponse); } + @Theory + public void regenerate(@FromDataPoints("detail-responses") + ResponseEntity> expectedResponse) { + verifyRegenerate(expectedResponse); + } + @Theory public void getById(@FromDataPoints("detail-responses") ResponseEntity> expectedResponse) { diff --git a/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailUnitTestsBase.java b/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailUnitTestsBase.java index a964d46..cbb72bb 100644 --- a/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailUnitTestsBase.java +++ b/spring-credhub-core/src/test/java/org/springframework/credhub/core/CredHubTemplateDetailUnitTestsBase.java @@ -17,7 +17,9 @@ package org.springframework.credhub.core; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.springframework.core.ParameterizedTypeReference; import org.springframework.credhub.support.CredentialDetails; @@ -56,7 +58,7 @@ public abstract class CredHubTemplateDetailUnitTestsBase extends CredHubTe protected abstract CredentialRequest getWriteRequest(); protected ParametersRequest

getGenerateRequest() { - return null; + throw new IllegalStateException("Tests that verify credential generation must override this method"); } static List>> buildDetailResponses(CredentialType type, T credential) { @@ -126,6 +128,32 @@ public abstract class CredHubTemplateDetailUnitTestsBase extends CredHubTe } } + void verifyRegenerate(ResponseEntity> expectedResponse) { + Map request = new HashMap() {{ + put("name", NAME.getName()); + put("regenerate", true); + }}; + + when(restTemplate.exchange(eq(BASE_URL_PATH), eq(POST), + eq(new HttpEntity>(request)), isA(ParameterizedTypeReference.class))) + .thenReturn(expectedResponse); + + if (!expectedResponse.getStatusCode().equals(HttpStatus.OK)) { + try { + credHubTemplate.regenerate(NAME); + fail("Exception should have been thrown"); + } + catch (CredHubException e) { + assertThat(e.getMessage(), containsString(expectedResponse.getStatusCode().toString())); + } + } + else { + CredentialDetails response = credHubTemplate.regenerate(NAME); + + assertResponseContainsExpectedCredentials(expectedResponse, response); + } + } + @SuppressWarnings("deprecation") void verifyGetById(ResponseEntity> expectedResponse) { when(restTemplate.exchange(eq(ID_URL_PATH), eq(GET), isNull(HttpEntity.class),