DeleteAutonomousDatabaseTask.groovy
001 /*
002  * SPDX-License-Identifier: Apache-2.0
003  *
004  * Copyright 2019-2022 Andres Almiray.
005  *
006  * Licensed under the Apache License, Version 2.0 (the "License");
007  * you may not use this file except in compliance with the License.
008  * You may obtain a copy of the License at
009  *
010  *     http://www.apache.org/licenses/LICENSE-2.0
011  *
012  * Unless required by applicable law or agreed to in writing, software
013  * distributed under the License is distributed on an "AS IS" BASIS,
014  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015  * See the License for the specific language governing permissions and
016  * limitations under the License.
017  */
018 package org.kordamp.gradle.plugin.oci.tasks.delete
019 
020 
021 import com.oracle.bmc.database.DatabaseClient
022 import com.oracle.bmc.database.model.AutonomousDatabase
023 import com.oracle.bmc.database.model.AutonomousDatabaseSummary
024 import com.oracle.bmc.database.requests.DeleteAutonomousDatabaseRequest
025 import com.oracle.bmc.database.requests.GetAutonomousDatabaseRequest
026 import com.oracle.bmc.database.requests.ListAutonomousDatabasesRequest
027 import groovy.transform.CompileStatic
028 import org.kordamp.gradle.plugin.oci.tasks.AbstractOCITask
029 import org.kordamp.gradle.plugin.oci.tasks.interfaces.OCITask
030 import org.kordamp.gradle.plugin.oci.tasks.traits.CompartmentIdAwareTrait
031 import org.kordamp.gradle.plugin.oci.tasks.traits.OptionalDatabaseIdAwareTrait
032 import org.kordamp.gradle.plugin.oci.tasks.traits.OptionalDatabaseNameAwareTrait
033 import org.kordamp.gradle.plugin.oci.tasks.traits.WaitForCompletionAwareTrait
034 import org.kordamp.jipsy.annotations.TypeProviderFor
035 
036 import static org.kordamp.gradle.util.StringUtils.isBlank
037 import static org.kordamp.gradle.util.StringUtils.isNotBlank
038 
039 /**
040  @author Andres Almiray
041  @since 0.5.0
042  */
043 @CompileStatic
044 @TypeProviderFor(OCITask)
045 class DeleteAutonomousDatabaseTask extends AbstractOCITask implements CompartmentIdAwareTrait,
046     OptionalDatabaseIdAwareTrait,
047     OptionalDatabaseNameAwareTrait,
048     WaitForCompletionAwareTrait {
049     static final String TASK_DESCRIPTION = 'Deletes a Database.'
050 
051     @Override
052     protected void doExecuteTask() {
053         validateDatabaseId()
054 
055         if (isBlank(getResolvedDatabaseId().orNull&& isBlank(getResolvedDatabaseName().orNull)) {
056             throw new IllegalStateException("Missing value for either 'databaseId' or 'databaseName' in $path")
057         }
058 
059         DatabaseClient client = createDatabaseClient()
060 
061         // TODO: check if database exists
062         // TODO: check is database is in a 'deletable' state
063 
064         if (isNotBlank(getResolvedDatabaseId().orNull)) {
065             AutonomousDatabase database = client.getAutonomousDatabase(GetAutonomousDatabaseRequest.builder()
066                 .autonomousDatabaseId(getResolvedDatabaseId().get())
067                 .build())
068                 .autonomousDatabase
069 
070             if (database) {
071                 setDatabaseName(database.displayName)
072                 deleteDatabase(client, database)
073             }
074         else {
075             validateCompartmentId()
076 
077             client.listAutonomousDatabases(ListAutonomousDatabasesRequest.builder()
078                 .compartmentId(getResolvedCompartmentId().get())
079                 .displayName(getResolvedDatabaseName().get())
080                 .build())
081                 .items.each database ->
082                 setDatabaseId(database.id)
083                 deleteDatabase(client, database)
084             }
085         }
086     }
087 
088     private void deleteDatabase(DatabaseClient client, AutonomousDatabase database) {
089         println("Deleting Database '${database.displayName}' with id ${database.id}")
090         client.deleteAutonomousDatabase(DeleteAutonomousDatabaseRequest.builder()
091             .autonomousDatabaseId(database.id)
092             .build())
093 
094         if (getResolvedWaitForCompletion().get()) {
095             println("Waiting for Database to be ${state('Terminated')}")
096             client.waiters
097                 .forAutonomousDatabase(GetAutonomousDatabaseRequest.builder().autonomousDatabaseId(database.id).build(),
098                     AutonomousDatabase.LifecycleState.Terminated)
099                 .execute()
100         }
101     }
102 
103     private void deleteDatabase(DatabaseClient client, AutonomousDatabaseSummary database) {
104         println("Deleting Database '${database.displayName}' with id ${database.id}")
105         client.deleteAutonomousDatabase(DeleteAutonomousDatabaseRequest.builder()
106             .autonomousDatabaseId(database.id)
107             .build())
108 
109         if (getResolvedWaitForCompletion().get()) {
110             println("Waiting for Database to be ${state('Terminated')}")
111             client.waiters
112                 .forAutonomousDatabase(GetAutonomousDatabaseRequest.builder().autonomousDatabaseId(database.id).build(),
113                     AutonomousDatabase.LifecycleState.Terminated)
114                 .execute()
115         }
116     }
117 }