Skip to content

Commit 9ea1626

Browse files
author
Yi Fan
committed
support the stop/start on ADBS
1 parent 62e9b86 commit 9ea1626

File tree

4 files changed

+180
-6
lines changed

4 files changed

+180
-6
lines changed

examples/database/adb/autonomous_database.tf

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,19 @@ resource "oci_database_autonomous_database" "test_autonomous_database" {
5353
is_free_tier = "false"
5454
}
5555

56+
resource "oci_database_autonomous_database" "test_autonomous_database_actions" {
57+
admin_password = "${random_string.autonomous_database_admin_password.result}"
58+
compartment_id = "${var.compartment_ocid}"
59+
cpu_core_count = "1"
60+
data_storage_size_in_tbs = "1"
61+
db_name = "adbdb11"
62+
db_version = "19c"
63+
db_workload = "AJD"
64+
license_model = "LICENSE_INCLUDED"
65+
is_free_tier = "false"
66+
state = "STOPPED"
67+
}
68+
5669
resource "oci_database_autonomous_database_backup" "autonomous_database_backup" {
5770
#Required
5871
autonomous_database_id = "${oci_database_autonomous_database.autonomous_database.id}"

oci/database_autonomous_database_resource.go

Lines changed: 96 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -372,8 +372,14 @@ func DatabaseAutonomousDatabaseResource() *schema.Resource {
372372
},
373373
},
374374
"state": {
375-
Type: schema.TypeString,
376-
Computed: true,
375+
Type: schema.TypeString,
376+
Optional: true,
377+
Computed: true,
378+
DiffSuppressFunc: EqualIgnoreCaseSuppressDiff,
379+
ValidateFunc: validation.StringInSlice([]string{
380+
string(oci_database.AutonomousDatabaseLifecycleStateStopped),
381+
string(oci_database.AutonomousDatabaseLifecycleStateAvailable),
382+
}, true),
377383
},
378384
"system_tags": {
379385
Type: schema.TypeMap,
@@ -439,10 +445,22 @@ func createDatabaseAutonomousDatabase(d *schema.ResourceData, m interface{}) err
439445
configDataSafeStatus = oci_database.AutonomousDatabaseDataSafeStatusEnum(strings.ToUpper(dataSafeStatus.(string)))
440446
}
441447

448+
var isInactiveRequest = false
449+
if configState, ok := sync.D.GetOkExists("state"); ok {
450+
wantedState := oci_database.AutonomousDatabaseLifecycleStateEnum(strings.ToUpper(configState.(string)))
451+
if wantedState == oci_database.AutonomousDatabaseLifecycleStateStopped {
452+
isInactiveRequest = true
453+
}
454+
}
455+
442456
if e := CreateResource(d, sync); e != nil {
443457
return e
444458
}
445459

460+
if isInactiveRequest {
461+
return inactiveAutonomousDatabaseIfNeeded(d, sync)
462+
}
463+
446464
if configDataSafeStatus == oci_database.AutonomousDatabaseDataSafeStatusRegistered {
447465
err := sync.updateDataSafeStatus(sync.D.Id(), oci_database.AutonomousDatabaseDataSafeStatusRegistered)
448466
if err != nil {
@@ -473,7 +491,42 @@ func updateDatabaseAutonomousDatabase(d *schema.ResourceData, m interface{}) err
473491
return err
474492
}
475493

476-
return UpdateResource(d, sync)
494+
stateActive, stateInactive := false, false
495+
496+
if sync.D.HasChange("state") {
497+
wantedState := strings.ToUpper(sync.D.Get("state").(string))
498+
if oci_database.AutonomousDatabaseLifecycleStateAvailable == oci_database.AutonomousDatabaseLifecycleStateEnum(wantedState) {
499+
stateActive = true
500+
stateInactive = false
501+
} else if oci_database.AutonomousDatabaseLifecycleStateStopped == oci_database.AutonomousDatabaseLifecycleStateEnum(wantedState) {
502+
stateInactive = true
503+
stateActive = false
504+
}
505+
}
506+
507+
if stateActive {
508+
if err := sync.StartAutonomousDatabase(oci_database.AutonomousDatabaseLifecycleStateAvailable); err != nil {
509+
return err
510+
}
511+
if err := sync.D.Set("state", oci_database.AutonomousDatabaseLifecycleStateAvailable); err != nil {
512+
return err
513+
}
514+
}
515+
516+
if err := UpdateResource(d, sync); err != nil {
517+
return err
518+
}
519+
520+
if stateInactive {
521+
if err := sync.StopAutonomousDatabase(oci_database.AutonomousDatabaseLifecycleStateStopped); err != nil {
522+
return err
523+
}
524+
if err := sync.D.Set("state", oci_database.AutonomousDatabaseLifecycleStateStopped); err != nil {
525+
return err
526+
}
527+
}
528+
529+
return nil
477530
}
478531

479532
func deleteDatabaseAutonomousDatabase(d *schema.ResourceData, m interface{}) error {
@@ -525,6 +578,7 @@ func (s *DatabaseAutonomousDatabaseResourceCrud) DeletedTarget() []string {
525578

526579
func (s *DatabaseAutonomousDatabaseResourceCrud) UpdatedPending() []string {
527580
return []string{
581+
string(oci_database.AutonomousDatabaseLifecycleStateStarting),
528582
string(oci_database.AutonomousDatabaseLifecycleStateProvisioning),
529583
string(oci_database.AutonomousDatabaseLifecycleStateUnavailable),
530584
string(oci_database.AutonomousDatabaseLifecycleStateScaleInProgress),
@@ -1788,3 +1842,42 @@ func (s *DatabaseAutonomousDatabaseResourceCrud) switchoverDatabase() error {
17881842

17891843
return nil
17901844
}
1845+
1846+
func inactiveAutonomousDatabaseIfNeeded(d *schema.ResourceData, sync *DatabaseAutonomousDatabaseResourceCrud) error {
1847+
if err := sync.StopAutonomousDatabase(oci_database.AutonomousDatabaseLifecycleStateStopped); err != nil {
1848+
return err
1849+
}
1850+
return ReadResource(sync)
1851+
}
1852+
1853+
func (s *DatabaseAutonomousDatabaseResourceCrud) StartAutonomousDatabase(state oci_database.AutonomousDatabaseLifecycleStateEnum) error {
1854+
request := oci_database.StartAutonomousDatabaseRequest{}
1855+
1856+
tmp := s.D.Id()
1857+
request.AutonomousDatabaseId = &tmp
1858+
1859+
request.RequestMetadata.RetryPolicy = getRetryPolicy(s.DisableNotFoundRetries, "database")
1860+
1861+
if _, err := s.Client.StartAutonomousDatabase(context.Background(), request); err != nil {
1862+
return err
1863+
}
1864+
retentionPolicyFunc := func() bool { return s.Res.LifecycleState == state }
1865+
1866+
return WaitForResourceCondition(s, retentionPolicyFunc, s.D.Timeout(schema.TimeoutUpdate))
1867+
}
1868+
1869+
func (s *DatabaseAutonomousDatabaseResourceCrud) StopAutonomousDatabase(state oci_database.AutonomousDatabaseLifecycleStateEnum) error {
1870+
request := oci_database.StopAutonomousDatabaseRequest{}
1871+
1872+
tmp := s.D.Id()
1873+
request.AutonomousDatabaseId = &tmp
1874+
1875+
request.RequestMetadata.RetryPolicy = getRetryPolicy(s.DisableNotFoundRetries, "database")
1876+
1877+
if _, err := s.Client.StopAutonomousDatabase(context.Background(), request); err != nil {
1878+
return err
1879+
}
1880+
retentionPolicyFunc := func() bool { return s.Res.LifecycleState == state }
1881+
1882+
return WaitForResourceCondition(s, retentionPolicyFunc, s.D.Timeout(schema.TimeoutUpdate))
1883+
}

oci/database_autonomous_database_test.go

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ var (
6262
"license_model": Representation{repType: Optional, create: `LICENSE_INCLUDED`},
6363
"whitelisted_ips": Representation{repType: Optional, create: []string{`1.1.1.1/28`}},
6464
"timeouts": RepresentationGroup{Required, autonomousDatabaseTimeoutsRepresentation},
65+
"state": Representation{repType: Optional, create: `AVAILABLE`},
6566
}
6667

6768
autonomousDatabaseTimeoutsRepresentation = map[string]interface{}{
@@ -157,7 +158,7 @@ func TestDatabaseAutonomousDatabaseResource_basic(t *testing.T) {
157158
resource.TestCheckResourceAttr(resourceName, "is_dedicated", "false"),
158159
resource.TestCheckResourceAttr(resourceName, "is_preview_version_with_service_terms_accepted", "false"),
159160
resource.TestCheckResourceAttr(resourceName, "license_model", "LICENSE_INCLUDED"),
160-
resource.TestCheckResourceAttrSet(resourceName, "state"),
161+
resource.TestCheckResourceAttr(resourceName, "state", "AVAILABLE"),
161162
resource.TestCheckResourceAttr(resourceName, "whitelisted_ips.#", "1"),
162163

163164
func(s *terraform.State) (err error) {
@@ -196,7 +197,7 @@ func TestDatabaseAutonomousDatabaseResource_basic(t *testing.T) {
196197
resource.TestCheckResourceAttr(resourceName, "is_dedicated", "false"),
197198
resource.TestCheckResourceAttr(resourceName, "is_preview_version_with_service_terms_accepted", "false"),
198199
resource.TestCheckResourceAttr(resourceName, "license_model", "LICENSE_INCLUDED"),
199-
resource.TestCheckResourceAttrSet(resourceName, "state"),
200+
resource.TestCheckResourceAttr(resourceName, "state", "AVAILABLE"),
200201
resource.TestCheckResourceAttr(resourceName, "whitelisted_ips.#", "1"),
201202

202203
func(s *terraform.State) (err error) {
@@ -230,7 +231,73 @@ func TestDatabaseAutonomousDatabaseResource_basic(t *testing.T) {
230231
resource.TestCheckResourceAttr(resourceName, "is_dedicated", "false"),
231232
resource.TestCheckResourceAttr(resourceName, "is_preview_version_with_service_terms_accepted", "false"),
232233
resource.TestCheckResourceAttr(resourceName, "license_model", "LICENSE_INCLUDED"),
233-
resource.TestCheckResourceAttrSet(resourceName, "state"),
234+
resource.TestCheckResourceAttr(resourceName, "state", "AVAILABLE"),
235+
236+
func(s *terraform.State) (err error) {
237+
resId2, err = fromInstanceState(s, resourceName, "id")
238+
if resId != resId2 {
239+
return fmt.Errorf("Resource recreated when it was supposed to be updated.")
240+
}
241+
return err
242+
},
243+
),
244+
},
245+
// verify stop the autonomous database
246+
{
247+
Config: config + compartmentIdVariableStr + AutonomousDatabaseResourceDependencies +
248+
generateResourceFromRepresentationMap("oci_database_autonomous_database", "test_autonomous_database", Optional, Update,
249+
getUpdatedRepresentationCopy("state", Representation{repType: Optional, create: "STOPPED"}, autonomousDatabaseRepresentation)),
250+
Check: resource.ComposeAggregateTestCheckFunc(
251+
resource.TestCheckResourceAttr(resourceName, "admin_password", "BEstrO0ng_#12"),
252+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
253+
resource.TestCheckResourceAttr(resourceName, "cpu_core_count", "1"),
254+
resource.TestCheckResourceAttr(resourceName, "data_safe_status", "NOT_REGISTERED"),
255+
resource.TestCheckResourceAttr(resourceName, "data_storage_size_in_tbs", "1"),
256+
resource.TestCheckResourceAttrSet(resourceName, "db_version"),
257+
resource.TestCheckResourceAttr(resourceName, "db_name", adbName),
258+
resource.TestCheckResourceAttr(resourceName, "db_workload", "OLTP"),
259+
resource.TestCheckResourceAttr(resourceName, "defined_tags.%", "1"),
260+
resource.TestCheckResourceAttr(resourceName, "display_name", "displayName2"),
261+
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
262+
resource.TestCheckResourceAttrSet(resourceName, "id"),
263+
resource.TestCheckResourceAttr(resourceName, "is_auto_scaling_enabled", "false"),
264+
resource.TestCheckResourceAttr(resourceName, "is_dedicated", "false"),
265+
resource.TestCheckResourceAttr(resourceName, "is_preview_version_with_service_terms_accepted", "false"),
266+
resource.TestCheckResourceAttr(resourceName, "license_model", "LICENSE_INCLUDED"),
267+
resource.TestCheckResourceAttr(resourceName, "state", "STOPPED"),
268+
269+
func(s *terraform.State) (err error) {
270+
resId2, err = fromInstanceState(s, resourceName, "id")
271+
if resId != resId2 {
272+
return fmt.Errorf("Resource recreated when it was supposed to be updated.")
273+
}
274+
return err
275+
},
276+
),
277+
},
278+
// verify start the autonomous database
279+
{
280+
Config: config + compartmentIdVariableStr + AutonomousDatabaseResourceDependencies +
281+
generateResourceFromRepresentationMap("oci_database_autonomous_database", "test_autonomous_database", Optional, Update,
282+
getUpdatedRepresentationCopy("state", Representation{repType: Optional, create: "AVAILABLE"}, autonomousDatabaseRepresentation)),
283+
Check: resource.ComposeAggregateTestCheckFunc(
284+
resource.TestCheckResourceAttr(resourceName, "admin_password", "BEstrO0ng_#12"),
285+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
286+
resource.TestCheckResourceAttr(resourceName, "cpu_core_count", "1"),
287+
resource.TestCheckResourceAttr(resourceName, "data_safe_status", "NOT_REGISTERED"),
288+
resource.TestCheckResourceAttr(resourceName, "data_storage_size_in_tbs", "1"),
289+
resource.TestCheckResourceAttrSet(resourceName, "db_version"),
290+
resource.TestCheckResourceAttr(resourceName, "db_name", adbName),
291+
resource.TestCheckResourceAttr(resourceName, "db_workload", "OLTP"),
292+
resource.TestCheckResourceAttr(resourceName, "defined_tags.%", "1"),
293+
resource.TestCheckResourceAttr(resourceName, "display_name", "displayName2"),
294+
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
295+
resource.TestCheckResourceAttrSet(resourceName, "id"),
296+
resource.TestCheckResourceAttr(resourceName, "is_auto_scaling_enabled", "false"),
297+
resource.TestCheckResourceAttr(resourceName, "is_dedicated", "false"),
298+
resource.TestCheckResourceAttr(resourceName, "is_preview_version_with_service_terms_accepted", "false"),
299+
resource.TestCheckResourceAttr(resourceName, "license_model", "LICENSE_INCLUDED"),
300+
resource.TestCheckResourceAttr(resourceName, "state", "AVAILABLE"),
234301

235302
func(s *terraform.State) (err error) {
236303
resId2, err = fromInstanceState(s, resourceName, "id")

website/docs/r/database_autonomous_database.html.markdown

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ The following arguments are supported:
9191

9292
For Autonomous Databases on [shared Exadata infrastructure](https://docs.cloud.oracle.com/iaas/Content/Database/Concepts/adboverview.htm#AEI), the following cloning options are available: Use `BACKUP_FROM_ID` for creating a new Autonomous Database from a specified backup. Use `BACKUP_FROM_TIMESTAMP` for creating a point-in-time Autonomous Database clone using backups. For more information, see [Cloning an Autonomous Database](https://docs.cloud.oracle.com/iaas/Content/Database/Tasks/adbcloning.htm).
9393
* `source_id` - (Required when source=CLONE_TO_REFRESHABLE | DATABASE) The [OCID](https://docs.cloud.oracle.com/iaas/Content/General/Concepts/identifiers.htm) of the source Autonomous Database that you will clone to create a new Autonomous Database.
94+
* `state` - (Optional) (Updatable) The current state of the Autonomous Database. Could be set to AVAILABLE or STOPPED
9495
* `subnet_id` - (Optional) (Updatable) The [OCID](https://docs.cloud.oracle.com/iaas/Content/General/Concepts/identifiers.htm) of the subnet the resource is associated with.
9596

9697
**Subnet Restrictions:**

0 commit comments

Comments
 (0)