Skip to content

Commit

Permalink
[DBInstance] Ignore OptionGroup status on Delete (aws-cloudformation#521
Browse files Browse the repository at this point in the history
)

Co-authored-by: dbbh <hendiogo@amazon.com>
  • Loading branch information
dbbh and dbbh authored Apr 2, 2024
1 parent fb6da4a commit 6b13508
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -609,14 +609,12 @@ protected boolean isDbInstanceDeleted(
) {
DBInstance dbInstance;
try {
dbInstance = fetchDBInstance(rdsProxyClient, model);
fetchDBInstance(rdsProxyClient, model);
} catch (DbInstanceNotFoundException e) {
// the instance is gone, exactly what we need
return true;
}

assertNoTerminalStatusOnRdsResources(dbInstance);

return false;
}

Expand Down Expand Up @@ -659,13 +657,9 @@ private void assertNoDomainMembershipTerminalStatus(final DBInstance dbInstance)
}

private void assertNoTerminalStatus(final DBInstance dbInstance) throws CfnNotStabilizedException {
assertNoTerminalStatusOnRdsResources(dbInstance);
assertNoDomainMembershipTerminalStatus(dbInstance);
}

private void assertNoTerminalStatusOnRdsResources(final DBInstance dbInstance) throws CfnNotStabilizedException {
assertNoDBInstanceTerminalStatus(dbInstance);
assertNoOptionGroupTerminalStatus(dbInstance);
assertNoDomainMembershipTerminalStatus(dbInstance);
}

protected boolean isDBInstanceStabilizedAfterMutate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ public abstract class AbstractHandlerTest extends AbstractTestBase<DBInstance, R
protected static final DBInstance DB_INSTANCE_ACTIVE;
protected static final DBInstance DB_INSTANCE_SQLSERVER_ACTIVE;
protected static final DBInstance DB_INSTANCE_DELETING;
protected static final DBInstance DB_INSTANCE_FAILED;
protected static final DBInstance DB_INSTANCE_MODIFYING;
protected static final DBInstance DB_INSTANCE_EMPTY_PORT;
protected static final DBInstance DB_INSTANCE_STORAGE_FULL;
Expand Down Expand Up @@ -579,6 +580,10 @@ public abstract class AbstractHandlerTest extends AbstractTestBase<DBInstance, R
.dbInstanceStatus(DB_INSTANCE_STATUS_DELETING)
.build();

DB_INSTANCE_FAILED = DB_INSTANCE_ACTIVE.toBuilder()
.dbInstanceStatus(DB_INSTANCE_STATUS_FAILED)
.build();

DB_INSTANCE_MODIFYING = DB_INSTANCE_ACTIVE.toBuilder()
.dbInstanceStatus(DB_INSTANCE_STATUS_MODIFYING)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,15 @@
import software.amazon.awssdk.services.rds.model.DeleteDbInstanceResponse;
import software.amazon.awssdk.services.rds.model.DescribeDbInstancesRequest;
import software.amazon.awssdk.services.rds.model.InvalidDbInstanceStateException;
import software.amazon.awssdk.services.rds.model.OptionGroupMembership;
import software.amazon.cloudformation.proxy.AmazonWebServicesClientProxy;
import software.amazon.cloudformation.proxy.HandlerErrorCode;
import software.amazon.cloudformation.proxy.ProgressEvent;
import software.amazon.cloudformation.proxy.ProxyClient;
import software.amazon.cloudformation.proxy.ResourceHandlerRequest;
import software.amazon.rds.common.error.ErrorCode;
import software.amazon.rds.common.handler.HandlerConfig;
import software.amazon.rds.dbinstance.status.OptionGroupStatus;
import software.amazon.rds.test.common.core.HandlerName;
import software.amazon.rds.test.common.core.TestUtils;

Expand Down Expand Up @@ -319,6 +321,50 @@ public Stream<? extends Arguments> provideArguments(ExtensionContext extensionCo
}
}

@Test
public void handleRequest_DeleteDBInstance_DbInstanceInTerminalState() {
AtomicBoolean fetchedOnce = new AtomicBoolean(false);
test_handleRequest_base(
new CallbackContext(),
() -> {
if (fetchedOnce.compareAndSet(false, true)) {
return DB_INSTANCE_FAILED.toBuilder().build();
}
throw DbInstanceNotFoundException.builder().message(MSG_NOT_FOUND_ERR).build();
},
() -> RESOURCE_MODEL_BAREBONE_BLDR().build(),
expectSuccess()
);

final ArgumentCaptor<DeleteDbInstanceRequest> argument = ArgumentCaptor.forClass(DeleteDbInstanceRequest.class);
verify(rdsProxy.client(), times(1)).deleteDBInstance(argument.capture());
verify(rdsProxy.client(), times(2)).describeDBInstances(any(DescribeDbInstancesRequest.class));
}

@Test
public void handleRequest_DeleteDBInstance_OptionGroupInTerminalState() {
AtomicBoolean fetchedOnce = new AtomicBoolean(false);
test_handleRequest_base(
new CallbackContext(),
() -> {
if (fetchedOnce.compareAndSet(false, true)) {
return DB_INSTANCE_DELETING.toBuilder()
.optionGroupMemberships(OptionGroupMembership.builder()
.status(OptionGroupStatus.Failed.toString())
.optionGroupName(OPTION_GROUP_NAME_MYSQL_DEFAULT)
.build()).build();
}
throw DbInstanceNotFoundException.builder().message(MSG_NOT_FOUND_ERR).build();
},
() -> RESOURCE_MODEL_BAREBONE_BLDR().build(),
expectSuccess()
);

final ArgumentCaptor<DeleteDbInstanceRequest> argument = ArgumentCaptor.forClass(DeleteDbInstanceRequest.class);
verify(rdsProxy.client(), times(1)).deleteDBInstance(argument.capture());
verify(rdsProxy.client(), times(2)).describeDBInstances(any(DescribeDbInstancesRequest.class));
}

@ParameterizedTest
@ArgumentsSource(DeleteDBInstanceExceptionArgumentProvider.class)
public void handleRequest_DeleteDBInstance_HandleException(
Expand Down

0 comments on commit 6b13508

Please sign in to comment.