diff --git a/CHANGELOG.md b/CHANGELOG.md index 6902e12..c38f064 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,20 @@ # Amazon Neptune Export CHANGELOG +## Neptune Export v2.0.2 (Release Date: TBD): + +### New Features and Improvements: + + + +### Bug Fixes: + +- Fix --clone-cluster-enable-audit-logs overriding other Neptune cluster parameters + ## Neptune Export v2.0.2 (Release Date: June 16, 2025): ### Bug Fixes: -* Fix fallback for finding parameter group families via Neptune engine version +- Fix fallback for finding parameter group families via Neptune engine version ## Neptune Export v2.0.1 (Release Date: June 10, 2025): diff --git a/src/main/java/com/amazonaws/services/neptune/cluster/AddCloneTask.java b/src/main/java/com/amazonaws/services/neptune/cluster/AddCloneTask.java index e0c447f..78fa7b1 100644 --- a/src/main/java/com/amazonaws/services/neptune/cluster/AddCloneTask.java +++ b/src/main/java/com/amazonaws/services/neptune/cluster/AddCloneTask.java @@ -322,36 +322,60 @@ private DBClusterParameterGroup createDbClusterParameterGroup(NeptuneClusterMeta String neptuneStreamsParameterValue = sourceClusterMetadata.isStreamEnabled() ? "1" : "0"; try { - ModifyDbClusterParameterGroupRequest.Builder requestBuilder = ModifyDbClusterParameterGroupRequest.builder() - .dbClusterParameterGroupName(dbClusterParameterGroup.dbClusterParameterGroupName()) - .parameters( - Parameter.builder() - .parameterName("neptune_enforce_ssl") - .parameterValue("1") - .applyMethod(ApplyMethod.PENDING_REBOOT) - .build(), - Parameter.builder() - .parameterName("neptune_query_timeout") - .parameterValue("2147483647") - .applyMethod(ApplyMethod.PENDING_REBOOT) - .build(), - Parameter.builder() - .parameterName("neptune_streams") - .parameterValue(neptuneStreamsParameterValue) - .applyMethod(ApplyMethod.PENDING_REBOOT) - .build()); + Collection parameters = new ArrayList<>(4); + parameters.add(Parameter.builder() + .parameterName("neptune_enforce_ssl") + .parameterValue("1") + .applyMethod(ApplyMethod.PENDING_REBOOT) + .build()); + parameters.add(Parameter.builder() + .parameterName("neptune_query_timeout") + .parameterValue("2147483647") + .applyMethod(ApplyMethod.PENDING_REBOOT) + .build()); + parameters.add(Parameter.builder() + .parameterName("neptune_streams") + .parameterValue(neptuneStreamsParameterValue) + .applyMethod(ApplyMethod.PENDING_REBOOT) + .build()); if (this.enableAuditLogs) { logger.debug("Adding neptune_enable_audit_log parameter"); - requestBuilder = requestBuilder.parameters(Parameter.builder() + parameters.add(Parameter.builder() .parameterName("neptune_enable_audit_log") .parameterValue("1") .applyMethod(ApplyMethod.PENDING_REBOOT) .build()); } + ModifyDbClusterParameterGroupRequest.Builder requestBuilder = ModifyDbClusterParameterGroupRequest.builder() + .dbClusterParameterGroupName(dbClusterParameterGroup.dbClusterParameterGroupName()) + .parameters(parameters); + neptune.modifyDBClusterParameterGroup(requestBuilder.build()); } catch (NeptuneException e) { + Collection parameters = new ArrayList<>(3); + parameters.add(Parameter.builder() + .parameterName("neptune_query_timeout") + .parameterValue("2147483647") + .applyMethod(ApplyMethod.PENDING_REBOOT) + .build()); + parameters.add(Parameter.builder() + .parameterName("neptune_streams") + .parameterValue(neptuneStreamsParameterValue) + .applyMethod(ApplyMethod.PENDING_REBOOT) + .build()); + + if (this.enableAuditLogs) { + logger.debug("Adding neptune_enable_audit_log parameter"); + parameters.add(Parameter.builder() + .parameterName("neptune_enable_audit_log") + .parameterValue("1") + .applyMethod(ApplyMethod.PENDING_REBOOT) + .build()); + } + + ModifyDbClusterParameterGroupRequest.Builder requestBuilder = ModifyDbClusterParameterGroupRequest.builder() .dbClusterParameterGroupName(dbClusterParameterGroup.dbClusterParameterGroupName()) .parameters( @@ -383,9 +407,14 @@ private DBClusterParameterGroup createDbClusterParameterGroup(NeptuneClusterMeta .build() ).parameters(); + int count = 0; while (dbClusterParameters.stream().noneMatch(parameter -> parameter.parameterName().equals("neptune_query_timeout") && parameter.parameterValue().equals("2147483647"))) { + count++; + if (count >= 30) { + throw new IllegalStateException("Failed to create DB cluster parameter group: " + dbClusterParameterGroup.dbClusterParameterGroupName() + "after 5 minutes"); + } try { Thread.sleep(10000); } catch (InterruptedException e) { diff --git a/src/test/java/com/amazonaws/services/neptune/cluster/AddCloneTaskTest.java b/src/test/java/com/amazonaws/services/neptune/cluster/AddCloneTaskTest.java index 4ea8a75..b92343a 100644 --- a/src/test/java/com/amazonaws/services/neptune/cluster/AddCloneTaskTest.java +++ b/src/test/java/com/amazonaws/services/neptune/cluster/AddCloneTaskTest.java @@ -38,7 +38,9 @@ import software.amazon.awssdk.services.neptune.model.RestoreDbClusterToPointInTimeResponse; import java.util.Arrays; +import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; @@ -72,6 +74,21 @@ public void shouldNotSetAuditLogsWhenEnableAuditLogsIsFalse() { // Assert that "neptune_enable_audit_log" parameter has not been set assertEquals(0, capturedParamsRequest.parameters().stream().filter((p) -> (p.parameterName().equals("neptune_enable_audit_log"))).count()); + // Assert that standard parameters have been set + List queryTimeoutParams = capturedParamsRequest.parameters().stream() + .filter((p) -> (p.parameterName().equals("neptune_query_timeout"))) + .peek((parameter -> assertEquals("2147483647", parameter.parameterValue()))) + .collect(Collectors.toList()); + assertEquals(1, queryTimeoutParams.size()); + + List enforceSslParams = capturedParamsRequest.parameters().stream() + .filter((p) -> (p.parameterName().equals("neptune_enforce_ssl"))) + .peek((parameter -> assertEquals("1", parameter.parameterValue()))) + .collect(Collectors.toList()); + assertEquals(1, queryTimeoutParams.size()); + + assertEquals(1, capturedParamsRequest.parameters().stream().filter((p) -> (p.parameterName().equals("neptune_streams"))).count()); + RestoreDbClusterToPointInTimeRequest capturedCloneRequest = cloneClusterRequestCaptor.getValue(); // Assert that cluster log exports are disabled @@ -99,11 +116,26 @@ public void shouldSetAuditLogsWhenEnableAuditLogsIsTrue() { ModifyDbClusterParameterGroupRequest capturedParamsRequest = clusterParamsCaptor.getValue(); // Assert that "neptune_enable_audit_log" parameter exists and has been set to "1" - assertEquals(1, - capturedParamsRequest.parameters().stream() - .filter((p) -> (p.parameterName().equals("neptune_enable_audit_log"))) - .peek((parameter -> assertEquals("1", parameter.parameterValue()))) - .count()); + List auditLogParams = capturedParamsRequest.parameters().stream() + .filter((p) -> (p.parameterName().equals("neptune_enable_audit_log"))) + .peek((parameter -> assertEquals("1", parameter.parameterValue()))) + .collect(Collectors.toList()); + assertEquals(1, auditLogParams.size()); + + // Assert that standard parameters have been set + List queryTimeoutParams = capturedParamsRequest.parameters().stream() + .filter((p) -> (p.parameterName().equals("neptune_query_timeout"))) + .peek((parameter -> assertEquals("2147483647", parameter.parameterValue()))) + .collect(Collectors.toList()); + assertEquals(1, queryTimeoutParams.size()); + + List enforceSslParams = capturedParamsRequest.parameters().stream() + .filter((p) -> (p.parameterName().equals("neptune_enforce_ssl"))) + .peek((parameter -> assertEquals("1", parameter.parameterValue()))) + .collect(Collectors.toList()); + assertEquals(1, queryTimeoutParams.size()); + + assertEquals(1, capturedParamsRequest.parameters().stream().filter((p) -> (p.parameterName().equals("neptune_streams"))).count()); RestoreDbClusterToPointInTimeRequest capturedCloneRequest = cloneClusterRequestCaptor.getValue();