Skip to content

Commit 0aee70d

Browse files
author
Keynan Pratt
committed
[CFN-27] The 'safeAddTags' method is still c/p but the core change in pattern has finished resulting in a trim create step in the create handler (line 103).
1 parent 224e54d commit 0aee70d

File tree

19 files changed

+824
-138
lines changed

19 files changed

+824
-138
lines changed

aws-rds-dbcluster/docs/serverlessv2scalingconfiguration.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ _Type_: Double
4646

4747
_Update requires_: [No interruption](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt)
4848

49+
<<<<<<< HEAD
4950
#### SecondsUntilAutoPause
5051

5152
_Required_: No
@@ -54,3 +55,5 @@ _Type_: Integer
5455

5556
_Update requires_: [No interruption](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt)
5657

58+
=======
59+
>>>>>>> 77e00a3 ([CFN-27] The 'safeAddTags' method is still c/p but the core change in pattern has finished resulting in a trim create step in the create handler (line 103).)

aws-rds-dbinstance/pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<project
3-
xmlns="http://maven.apache.org/POM/4.0.0"
4-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
xmlns="http://maven.apache.org/POM/4.0.0"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
66
<modelVersion>4.0.0</modelVersion>
77

88
<groupId>software.amazon.rds.dbinstance</groupId>
@@ -267,7 +267,7 @@
267267
<limit>
268268
<counter>BRANCH</counter>
269269
<value>COVEREDRATIO</value>
270-
<minimum>0.8</minimum>
270+
<minimum>0.82</minimum>
271271
</limit>
272272
<limit>
273273
<counter>INSTRUCTION</counter>

aws-rds-dbinstance/src/main/java/software/amazon/rds/dbinstance/CreateHandler.java

Lines changed: 13 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,18 @@
11
package software.amazon.rds.dbinstance;
22

3-
import java.time.Instant;
4-
import java.util.Collection;
5-
import java.util.Collections;
6-
7-
import org.apache.commons.lang3.BooleanUtils;
8-
93
import com.amazonaws.util.StringUtils;
4+
import org.apache.commons.lang3.BooleanUtils;
105
import software.amazon.awssdk.services.ec2.Ec2Client;
116
import software.amazon.awssdk.services.rds.RdsClient;
127
import software.amazon.awssdk.services.rds.model.DBInstance;
13-
import software.amazon.awssdk.services.rds.model.DBSnapshot;
148
import software.amazon.awssdk.services.rds.model.SourceType;
159
import software.amazon.awssdk.utils.ImmutableMap;
1610
import software.amazon.cloudformation.exceptions.CfnInvalidRequestException;
1711
import software.amazon.cloudformation.proxy.AmazonWebServicesClientProxy;
1812
import software.amazon.cloudformation.proxy.ProgressEvent;
1913
import software.amazon.cloudformation.proxy.ProxyClient;
2014
import software.amazon.cloudformation.proxy.ResourceHandlerRequest;
21-
import software.amazon.rds.common.handler.Commons;
22-
import software.amazon.rds.common.handler.Events;
23-
import software.amazon.rds.common.handler.HandlerConfig;
24-
import software.amazon.rds.common.handler.HandlerMethod;
25-
import software.amazon.rds.common.handler.Tagging;
15+
import software.amazon.rds.common.handler.*;
2616
import software.amazon.rds.common.logging.LoggingProxyClient;
2717
import software.amazon.rds.common.request.RequestValidationException;
2818
import software.amazon.rds.common.request.ValidatedRequest;
@@ -36,6 +26,10 @@
3626
import software.amazon.rds.dbinstance.util.ResourceModelHelper;
3727
import software.amazon.rds.dbinstance.validators.OracleCustomSystemId;
3828

29+
import java.time.Instant;
30+
import java.util.Collection;
31+
import java.util.Collections;
32+
3933
public class CreateHandler extends BaseHandlerStd {
4034

4135
private static final IdentifierFactory instanceIdentifierFactory = new IdentifierFactory(
@@ -98,6 +92,7 @@ protected ProgressEvent<ResourceModel, CallbackContext> handleRequest(
9892
proxy, rdsProxyClient, allTags, requestLogger, config, getApiVersionDispatcher()
9993
);
10094

95+
final DBInstanceFactory dbInstanceFactory = factoryFactory.createFactory(model);
10196
return ProgressEvent.progress(model, callbackContext)
10297
.then(progress -> {
10398
if (StringUtils.isNullOrEmpty(progress.getResourceModel().getEngine())) {
@@ -109,21 +104,12 @@ proxy, rdsProxyClient, allTags, requestLogger, config, getApiVersionDispatcher()
109104
}
110105
return progress;
111106
})
112-
.then(progress -> Commons.execOnce(progress, () -> {
113-
final DBInstanceFactory dbInstanceFactory = factoryFactory.createFactory(progress);
114-
115-
if (ResourceModelHelper.isRestoreToPointInTime(progress.getResourceModel())) {
116-
// restoreDBInstanceToPointInTime is not a versioned call.
117-
return safeAddTags(this::restoreDbInstanceToPointInTimeRequest)
118-
.invoke(proxy, rdsProxyClient.defaultClient(), progress, allTags);
119-
} else if (ResourceModelHelper.isReadReplica(progress.getResourceModel())) {
120-
// createDBInstanceReadReplica is not a versioned call.
121-
return safeAddTags(this::createDbInstanceReadReplica)
122-
.invoke(proxy, rdsProxyClient.defaultClient(), progress, allTags);
123-
}
124-
// FIXME Currently only handling the fresh instance & snapshot. TODO Handle above cases in factory.
125-
return dbInstanceFactory.create(progress);
126-
}, CallbackContext::isCreated, CallbackContext::setCreated))
107+
.then(progress -> Commons.execOnce(
108+
progress,
109+
() -> dbInstanceFactory.create(progress),
110+
CallbackContext::isCreated,
111+
CallbackContext::setCreated
112+
))
127113
.then(progress -> Commons.execOnce(progress, () -> {
128114
final Tagging.TagSet extraTags = Tagging.TagSet.builder()
129115
.stackTags(allTags.getStackTags())
@@ -260,63 +246,6 @@ private String fetchEngine(final ProxyClient<RdsClient> client,
260246
throw new CfnInvalidRequestException("Cannot fetch the engine based on current template. Please add the Engine parameter to the template and try again.");
261247
}
262248

263-
private ProgressEvent<ResourceModel, CallbackContext> restoreDbInstanceToPointInTimeRequest(
264-
final AmazonWebServicesClientProxy proxy,
265-
final ProxyClient<RdsClient> rdsProxyClient,
266-
final ProgressEvent<ResourceModel, CallbackContext> progress,
267-
final Tagging.TagSet tagSet
268-
) {
269-
return proxy.initiate(
270-
"rds::restore-db-instance-to-point-in-time",
271-
rdsProxyClient,
272-
progress.getResourceModel(),
273-
progress.getCallbackContext()
274-
).translateToServiceRequest(model -> Translator.restoreDbInstanceToPointInTimeRequest(model, tagSet))
275-
.backoffDelay(config.getBackoff())
276-
.makeServiceCall((restoreRequest, proxyInvocation) -> proxyInvocation.injectCredentialsAndInvokeV2(
277-
restoreRequest,
278-
proxyInvocation.client()::restoreDBInstanceToPointInTime
279-
))
280-
.stabilize((request, response, proxyInvocation, model, context) ->
281-
isDBInstanceStabilizedAfterMutate(proxyInvocation, model, context))
282-
.handleError((request, exception, client, model, context) -> Commons.handleException(
283-
ProgressEvent.progress(model, context),
284-
exception,
285-
ErrorRuleSets.RESTORE_DB_INSTANCE,
286-
requestLogger
287-
))
288-
.progress();
289-
}
290-
291-
private ProgressEvent<ResourceModel, CallbackContext> createDbInstanceReadReplica(
292-
final AmazonWebServicesClientProxy proxy,
293-
final ProxyClient<RdsClient> rdsProxyClient,
294-
final ProgressEvent<ResourceModel, CallbackContext> progress,
295-
final Tagging.TagSet tagSet
296-
) {
297-
final String currentRegion = progress.getCallbackContext().getCurrentRegion();
298-
return proxy.initiate(
299-
"rds::create-db-instance-read-replica",
300-
rdsProxyClient,
301-
progress.getResourceModel(),
302-
progress.getCallbackContext()
303-
).translateToServiceRequest(model -> Translator.createDbInstanceReadReplicaRequest(model, tagSet, currentRegion))
304-
.backoffDelay(config.getBackoff())
305-
.makeServiceCall((createRequest, proxyInvocation) -> proxyInvocation.injectCredentialsAndInvokeV2(
306-
createRequest,
307-
proxyInvocation.client()::createDBInstanceReadReplica
308-
))
309-
.stabilize((request, response, proxyInvocation, model, context) ->
310-
isDBInstanceStabilizedAfterMutate(proxyInvocation, model, context))
311-
.handleError((request, exception, client, model, context) -> Commons.handleException(
312-
ProgressEvent.progress(model, context),
313-
exception,
314-
ErrorRuleSets.CREATE_DB_INSTANCE_READ_REPLICA,
315-
requestLogger
316-
))
317-
.progress();
318-
}
319-
320249
protected ProgressEvent<ResourceModel, CallbackContext> updateDbInstanceAfterCreateV12(
321250
final AmazonWebServicesClientProxy proxy,
322251
final ResourceHandlerRequest<ResourceModel> request,

aws-rds-dbinstance/src/main/java/software/amazon/rds/dbinstance/Translator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ public static CreateDbInstanceRequest createDbInstanceRequest(
345345
return builder.build();
346346
}
347347

348-
static RestoreDbInstanceToPointInTimeRequest restoreDbInstanceToPointInTimeRequest(
348+
public static RestoreDbInstanceToPointInTimeRequest restoreDbInstanceToPointInTimeRequest(
349349
final ResourceModel model,
350350
final Tagging.TagSet tagSet
351351
) {

aws-rds-dbinstance/src/main/java/software/amazon/rds/dbinstance/common/create/DBInstanceFactory.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
import software.amazon.cloudformation.proxy.ProgressEvent;
44
import software.amazon.rds.dbinstance.CallbackContext;
55
import software.amazon.rds.dbinstance.ResourceModel;
6+
import software.amazon.rds.dbinstance.util.ResourceModelHelper;
67

78
public interface DBInstanceFactory {
89

910
ProgressEvent<ResourceModel, CallbackContext> create(
10-
ProgressEvent<ResourceModel, CallbackContext> input
11+
ProgressEvent<ResourceModel, CallbackContext> input
1112
);
13+
14+
boolean modelSatisfiesConstructor(ResourceModel model);
1215
}

aws-rds-dbinstance/src/main/java/software/amazon/rds/dbinstance/common/create/DBInstanceFactoryFactory.java

Lines changed: 56 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import lombok.AllArgsConstructor;
44
import software.amazon.awssdk.services.rds.RdsClient;
55
import software.amazon.cloudformation.proxy.AmazonWebServicesClientProxy;
6-
import software.amazon.cloudformation.proxy.ProgressEvent;
76
import software.amazon.rds.common.handler.HandlerConfig;
87
import software.amazon.rds.common.handler.Tagging;
98
import software.amazon.rds.common.logging.RequestLogger;
@@ -13,54 +12,70 @@
1312
import software.amazon.rds.dbinstance.client.VersionedProxyClient;
1413
import software.amazon.rds.dbinstance.util.ResourceModelHelper;
1514

15+
import java.util.ArrayList;
16+
import java.util.Collection;
17+
import java.util.Optional;
18+
1619
@AllArgsConstructor
1720
public class DBInstanceFactoryFactory {
1821

19-
private final AmazonWebServicesClientProxy proxy;
20-
private final VersionedProxyClient<RdsClient> rdsProxyClient;
21-
private final Tagging.TagSet allTags;
22-
private final RequestLogger requestLogger;
23-
private final HandlerConfig config;
24-
private final ApiVersionDispatcher<ResourceModel, CallbackContext> apiVersionDispatcher;
22+
private final Collection<DBInstanceFactory> factories;
23+
private final DBInstanceFactory defaultFactory;
24+
25+
public DBInstanceFactoryFactory(
26+
final AmazonWebServicesClientProxy proxy,
27+
final VersionedProxyClient<RdsClient> rdsProxyClient,
28+
final Tagging.TagSet allTags,
29+
final RequestLogger requestLogger,
30+
final HandlerConfig config,
31+
final ApiVersionDispatcher<ResourceModel, CallbackContext> apiVersionDispatcher
32+
) {
33+
34+
factories = new ArrayList<>();
35+
// The order of this list matters. Do NOT re-order.
36+
factories.add(new FromPointInTime(
37+
proxy,
38+
rdsProxyClient,
39+
allTags,
40+
requestLogger,
41+
config
42+
));
43+
factories.add(new ReadReplica(
44+
proxy,
45+
rdsProxyClient,
46+
allTags,
47+
requestLogger,
48+
config
49+
));
50+
factories.add(new FromSnapshot(
51+
proxy,
52+
rdsProxyClient,
53+
allTags,
54+
requestLogger,
55+
config,
56+
apiVersionDispatcher
57+
));
2558

26-
private enum FactoryType {
27-
IS_READ_REPLICA,
28-
IS_FROM_SNAPSHOT,
29-
IS_FROM_POINT_IN_TIME,
30-
IS_FRESH_INSTANCE;
59+
defaultFactory = new FreshInstance(
60+
proxy,
61+
rdsProxyClient,
62+
allTags,
63+
requestLogger,
64+
config,
65+
apiVersionDispatcher
66+
);
3167
}
3268

33-
public DBInstanceFactory createFactory(
34-
ProgressEvent<ResourceModel, CallbackContext> progress
35-
) {
36-
switch (discernFactoryType(progress.getResourceModel())) {
37-
case IS_FROM_SNAPSHOT:
38-
return new FromSnapshot(
39-
proxy,
40-
rdsProxyClient,
41-
allTags,
42-
requestLogger,
43-
config,
44-
apiVersionDispatcher
45-
);
46-
case IS_FRESH_INSTANCE:
47-
default:
48-
return new FreshInstance(
49-
proxy,
50-
rdsProxyClient,
51-
allTags,
52-
requestLogger,
53-
config,
54-
apiVersionDispatcher
55-
);
56-
}
69+
public DBInstanceFactory createFactory(ResourceModel model) {
70+
return discernFactoryType(model).orElse(defaultFactory);
5771
}
5872

59-
private FactoryType discernFactoryType(ResourceModel model) {
60-
if(ResourceModelHelper.isRestoreFromSnapshot(model) || ResourceModelHelper.isRestoreFromClusterSnapshot(model)) {
61-
return FactoryType.IS_FROM_SNAPSHOT;
73+
private Optional<DBInstanceFactory> discernFactoryType(ResourceModel model) {
74+
for (DBInstanceFactory fac : factories) {
75+
if (fac.modelSatisfiesConstructor(model)) {
76+
return Optional.of(fac);
77+
}
6278
}
63-
64-
return FactoryType.IS_FRESH_INSTANCE;
79+
return Optional.empty();
6580
}
6681
}

aws-rds-dbinstance/src/main/java/software/amazon/rds/dbinstance/common/create/FreshInstance.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class FreshInstance implements DBInstanceFactory {
3131
private final HandlerConfig config;
3232
private final ApiVersionDispatcher<ResourceModel, CallbackContext> apiVersionDispatcher;
3333

34+
@Override
3435
public ProgressEvent<ResourceModel, CallbackContext> create(ProgressEvent<ResourceModel, CallbackContext> progress) {
3536
final ResourceModel model = progress.getResourceModel();
3637
final CallbackContext callbackContext = progress.getCallbackContext();
@@ -43,6 +44,11 @@ public ProgressEvent<ResourceModel, CallbackContext> create(ProgressEvent<Resour
4344
return safeAddTags(this::createDbInstance).invoke(proxy, rdsProxyClient.forVersion(apiVersion), progress, allTags);
4445
}
4546

47+
@Override
48+
public boolean modelSatisfiesConstructor(ResourceModel model) {
49+
return true;
50+
}
51+
4652
private ProgressEvent<ResourceModel, CallbackContext> createDbInstance(
4753
final AmazonWebServicesClientProxy proxy,
4854
final ProxyClient<RdsClient> rdsProxyClient,
@@ -61,8 +67,7 @@ private ProgressEvent<ResourceModel, CallbackContext> createDbInstance(
6167
createRequest,
6268
proxyInvocation.client()::createDBInstance
6369
))
64-
.stabilize((request, response, proxyInvocation, model, context) ->
65-
{
70+
.stabilize((request, response, proxyInvocation, model, context) -> {
6671
final DBInstance dbInstance = fetch.dbInstance(model);
6772
return DBInstancePredicates.isDBInstanceStabilizedAfterMutate(dbInstance, model, context, requestLogger);
6873
})

0 commit comments

Comments
 (0)