Skip to content
This repository was archived by the owner on Oct 23, 2025. It is now read-only.

Commit dc9c9d0

Browse files
angusy29zrfr
authored andcommitted
[DBInstance] Support for Oracle Multitenant SID
1 parent c316d58 commit dc9c9d0

File tree

8 files changed

+123
-6
lines changed

8 files changed

+123
-6
lines changed

aws-rds-dbinstance/aws-rds-dbinstance.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,7 @@
480480
"/properties/DBParameterGroupName": "$lowercase(DBParameterGroupName)",
481481
"/properties/DBSnapshotIdentifier": "$lowercase(DBSnapshotIdentifier)",
482482
"/properties/DBSubnetGroupName": "$lowercase(DBSubnetGroupName)",
483+
"/properties/DBSystemId": "$uppercase(DBSystemId)",
483484
"/properties/Engine": "$lowercase(Engine)",
484485
"/properties/EngineVersion": "$join([$string(EngineVersion), \".*\"])",
485486
"/properties/KmsKeyId": "$join([\"arn:.+?:kms:.+?:.+?:key\\/\", KmsKeyId])",
@@ -499,6 +500,7 @@
499500
"/properties/DBInstanceIdentifier",
500501
"/properties/DBName",
501502
"/properties/DBSubnetGroupName",
503+
"/properties/DBSystemId",
502504
"/properties/KmsKeyId",
503505
"/properties/MasterUsername",
504506
"/properties/NcharCharacterSetName",
@@ -551,7 +553,6 @@
551553
"/properties/Endpoint/HostedZoneId",
552554
"/properties/DbiResourceId",
553555
"/properties/DBInstanceArn",
554-
"/properties/DBSystemId",
555556
"/properties/MasterUserSecret/SecretArn",
556557
"/properties/CertificateDetails/CAIdentifier",
557558
"/properties/CertificateDetails/ValidTill"

aws-rds-dbinstance/docs/README.md

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ To declare this entity in your AWS CloudFormation template, use the following sy
3535
"<a href="#dbsecuritygroups" title="DBSecurityGroups">DBSecurityGroups</a>" : <i>[ String, ... ]</i>,
3636
"<a href="#dbsnapshotidentifier" title="DBSnapshotIdentifier">DBSnapshotIdentifier</a>" : <i>String</i>,
3737
"<a href="#dbsubnetgroupname" title="DBSubnetGroupName">DBSubnetGroupName</a>" : <i>String</i>,
38+
"<a href="#dbsystemid" title="DBSystemId">DBSystemId</a>" : <i>String</i>,
3839
"<a href="#dedicatedlogvolume" title="DedicatedLogVolume">DedicatedLogVolume</a>" : <i>Boolean</i>,
3940
"<a href="#deleteautomatedbackups" title="DeleteAutomatedBackups">DeleteAutomatedBackups</a>" : <i>Boolean</i>,
4041
"<a href="#deletionprotection" title="DeletionProtection">DeletionProtection</a>" : <i>Boolean</i>,
@@ -124,6 +125,7 @@ Properties:
124125
- String</i>
125126
<a href="#dbsnapshotidentifier" title="DBSnapshotIdentifier">DBSnapshotIdentifier</a>: <i>String</i>
126127
<a href="#dbsubnetgroupname" title="DBSubnetGroupName">DBSubnetGroupName</a>: <i>String</i>
128+
<a href="#dbsystemid" title="DBSystemId">DBSystemId</a>: <i>String</i>
127129
<a href="#dedicatedlogvolume" title="DedicatedLogVolume">DedicatedLogVolume</a>: <i>Boolean</i>
128130
<a href="#deleteautomatedbackups" title="DeleteAutomatedBackups">DeleteAutomatedBackups</a>: <i>Boolean</i>
129131
<a href="#deletionprotection" title="DeletionProtection">DeletionProtection</a>: <i>Boolean</i>
@@ -441,6 +443,16 @@ _Type_: String
441443

442444
_Update requires_: [Replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement)
443445

446+
#### DBSystemId
447+
448+
The Oracle system ID (Oracle SID) for a container database (CDB). The Oracle SID is also the name of the CDB. This setting is valid for RDS Custom only.
449+
450+
_Required_: No
451+
452+
_Type_: String
453+
454+
_Update requires_: [Replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement)
455+
444456
#### DedicatedLogVolume
445457

446458
Indicates whether the DB instance has a dedicated log volume (DLV) enabled.
@@ -587,7 +599,7 @@ _Required_: No
587599

588600
_Type_: String
589601

590-
_Update requires_: [Some interruptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-some-interrupt)
602+
_Update requires_: [No interruption](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt)
591603

592604
#### EngineVersion
593605

@@ -1027,10 +1039,6 @@ The AWS Region-unique, immutable identifier for the DB instance. This identifier
10271039

10281040
The Amazon Resource Name (ARN) for the DB instance.
10291041

1030-
#### DBSystemId
1031-
1032-
The Oracle system ID (Oracle SID) for a container database (CDB). The Oracle SID is also the name of the CDB. This setting is valid for RDS Custom only.
1033-
10341042
#### SecretArn
10351043

10361044
Returns the <code>SecretArn</code> value.

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import software.amazon.rds.dbinstance.client.RdsClientProvider;
3333
import software.amazon.rds.dbinstance.client.VersionedProxyClient;
3434
import software.amazon.rds.dbinstance.util.ResourceModelHelper;
35+
import software.amazon.rds.dbinstance.validators.OracleCustomSystemId;
3536

3637
public class CreateHandler extends BaseHandlerStd {
3738

@@ -56,6 +57,8 @@ protected void validateRequest(final ResourceHandlerRequest<ResourceModel> reque
5657
super.validateRequest(request);
5758
validateDeletionPolicyForClusterInstance(request);
5859
Validations.validateTimestamp(request.getDesiredResourceState().getRestoreTime());
60+
61+
OracleCustomSystemId.validateRequest(request.getDesiredResourceState());
5962
}
6063

6164
private void validateDeletionPolicyForClusterInstance(final ResourceHandlerRequest<ResourceModel> request) throws RequestValidationException {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ public static CreateDbInstanceRequest createDbInstanceRequest(
290290
.dbName(model.getDBName())
291291
.dbParameterGroupName(model.getDBParameterGroupName())
292292
.dbSubnetGroupName(model.getDBSubnetGroupName())
293+
.dbSystemId(model.getDBSystemId())
293294
.dedicatedLogVolume(model.getDedicatedLogVolume())
294295
.deletionProtection(model.getDeletionProtection())
295296
.domain(model.getDomain())

aws-rds-dbinstance/src/main/java/software/amazon/rds/dbinstance/client/RdsClientProvider.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import software.amazon.rds.common.client.BaseSdkClientProvider;
1818
import software.amazon.rds.common.client.RdsUserAgentProvider;
1919

20+
2021
public class RdsClientProvider extends BaseSdkClientProvider<RdsClientBuilder, RdsClient> {
2122

2223
public static final String VERSION_QUERY_PARAM = "Version";
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package software.amazon.rds.dbinstance.validators;
2+
3+
import software.amazon.rds.common.request.RequestValidationException;
4+
import software.amazon.rds.dbinstance.ResourceModel;
5+
import software.amazon.rds.dbinstance.util.ResourceModelHelper;
6+
7+
public class OracleCustomSystemId {
8+
public static void validateRequest(final ResourceModel model) throws RequestValidationException {
9+
if (ResourceModelHelper.isRestoreToPointInTime(model) && model.getDBSystemId() != null) {
10+
throw new RequestValidationException("The DBSystemId parameter cannot be specified when you create a DB instance from a point-in-time restore.");
11+
}
12+
13+
if (ResourceModelHelper.isDBInstanceReadReplica(model) && model.getDBSystemId() != null) {
14+
throw new RequestValidationException("The DBSystemId parameter cannot be specified when you create a read replica.");
15+
}
16+
17+
if (ResourceModelHelper.isRestoreFromSnapshot(model) && model.getDBSystemId() != null) {
18+
throw new RequestValidationException("The DBSystemId parameter cannot be specified when you create a DB instance from a snapshot restore.");
19+
}
20+
}
21+
}

aws-rds-dbinstance/src/test/java/software/amazon/rds/dbinstance/AbstractHandlerTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public abstract class AbstractHandlerTest extends AbstractTestBase<DBInstance, R
9595
protected static final String DB_INSTANCE_STATUS_MODIFYING = "modifying";
9696
protected static final String DB_INSTANCE_STATUS_FAILED = "failed";
9797
protected static final String DB_INSTANCE_STATUS_STORAGE_FULL = "storage-full";
98+
protected static final String DB_INSTANCE_SYSTEM_ID = "UNITTEST";
9899
protected static final String DB_NAME = "db-instance-db-name";
99100
protected static final String DB_PARAMETER_GROUP_NAME_DEFAULT = "default";
100101
protected static final String DB_PARAMETER_GROUP_NAME_ALTER = "alternative-parameter-group";
@@ -207,6 +208,7 @@ public abstract class AbstractHandlerTest extends AbstractTestBase<DBInstance, R
207208

208209
static final DBInstance DB_INSTANCE_BASE;
209210
static final DBInstance DB_INSTANCE_ACTIVE;
211+
static final DBInstance DB_INSTANCE_ACTIVE_SYSTEM_ID;
210212
static final DBInstance DB_INSTANCE_AURORA_ACTIVE;
211213
static final DBInstance DB_INSTANCE_SQLSERVER_ACTIVE;
212214
static final DBInstance DB_INSTANCE_READ_REPLICA_ACTIVE;
@@ -576,6 +578,8 @@ public abstract class AbstractHandlerTest extends AbstractTestBase<DBInstance, R
576578
.promotionTier(PROMOTION_TIER_DEFAULT)
577579
.build();
578580

581+
DB_INSTANCE_ACTIVE_SYSTEM_ID = DB_INSTANCE_ACTIVE.toBuilder().dbSystemId(DB_INSTANCE_SYSTEM_ID).build();
582+
579583
DB_INSTANCE_AURORA_ACTIVE = DB_INSTANCE_ACTIVE.toBuilder()
580584
.dbClusterIdentifier(DB_CLUSTER_IDENTIFIER_NON_EMPTY)
581585
.engine(ENGINE_AURORA_MYSQL)

aws-rds-dbinstance/src/test/java/software/amazon/rds/dbinstance/CreateHandlerTest.java

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2241,6 +2241,84 @@ public void fetchEngineForPointInTimeRestoreFromAutomatedBackup() {
22412241
Assertions.assertThat(captor.getValue().dbInstanceAutomatedBackupsArn()).isEqualTo("backup-arn");
22422242
}
22432243

2244+
@Test
2245+
public void handleRequest_CreateDBInstanceWithSid_IsSuccessful() {
2246+
when(rdsProxy.client().addTagsToResource(any(AddTagsToResourceRequest.class)))
2247+
.thenReturn(AddTagsToResourceResponse.builder().build());
2248+
2249+
final CallbackContext context = new CallbackContext();
2250+
context.setCreated(true);
2251+
context.setUpdated(true);
2252+
context.setRebooted(true);
2253+
context.setUpdatedRoles(true);
2254+
2255+
test_handleRequest_base(
2256+
context,
2257+
() -> DB_INSTANCE_ACTIVE_SYSTEM_ID,
2258+
() -> RESOURCE_MODEL_BLDR().dBSystemId("UNITTEST").build(),
2259+
expectSuccess()
2260+
);
2261+
2262+
verify(rdsProxy.client(), times(3)).describeDBInstances(any(DescribeDbInstancesRequest.class));
2263+
verify(rdsProxy.client(), times(1)).addTagsToResource(any(AddTagsToResourceRequest.class));
2264+
}
2265+
2266+
@Test
2267+
public void handleRequest_CreateReadReplicaWithSid_ThrowsRequestValidationException() {
2268+
expectServiceInvocation = false;
2269+
final CallbackContext context = new CallbackContext();
2270+
context.setCreated(false);
2271+
context.setUpdated(true);
2272+
context.setRebooted(true);
2273+
context.setUpdatedRoles(true);
2274+
context.setAddTagsComplete(true);
2275+
2276+
test_handleRequest_base(
2277+
context,
2278+
null,
2279+
() -> RESOURCE_MODEL_READ_REPLICA.toBuilder().dBSystemId("UNITTEST").build(),
2280+
expectFailed(HandlerErrorCode.InvalidRequest)
2281+
);
2282+
}
2283+
2284+
@Test
2285+
public void handleRequest_CreateDBInstanceFromSnapshotWithSid_ThrowsRequestValidationException() {
2286+
expectServiceInvocation = false;
2287+
final CallbackContext context = new CallbackContext();
2288+
context.setCreated(false);
2289+
context.setUpdated(true);
2290+
context.setRebooted(true);
2291+
context.setUpdatedRoles(true);
2292+
context.setAddTagsComplete(true);
2293+
2294+
test_handleRequest_base(
2295+
context,
2296+
null,
2297+
() -> RESOURCE_MODEL_RESTORING_FROM_SNAPSHOT.toBuilder().dBSystemId("UNITTEST").build(),
2298+
expectFailed(HandlerErrorCode.InvalidRequest)
2299+
);
2300+
}
2301+
2302+
@Test
2303+
public void handleRequest_CreateDBInstanceFromPitrWithSid_ThrowsRequestValidationException() {
2304+
expectServiceInvocation = false;
2305+
final CallbackContext context = new CallbackContext();
2306+
context.setCreated(false);
2307+
context.setUpdated(true);
2308+
context.setRebooted(true);
2309+
context.setUpdatedRoles(true);
2310+
context.setAddTagsComplete(true);
2311+
2312+
test_handleRequest_base(
2313+
context,
2314+
null,
2315+
() -> RESOURCE_MODEL_RESTORING_TO_POINT_IN_TIME.toBuilder()
2316+
.dBSystemId("UNITTEST")
2317+
.useLatestRestorableTime(true).build(),
2318+
expectFailed(HandlerErrorCode.InvalidRequest)
2319+
);
2320+
}
2321+
22442322
@Test
22452323
public void fetchEngineForUnknownScenario() {
22462324
expectServiceInvocation = false;

0 commit comments

Comments
 (0)