CreateAutonomousDatabaseTask.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.create
019 
020 import com.oracle.bmc.database.DatabaseClient
021 import com.oracle.bmc.database.model.AutonomousDatabase
022 import com.oracle.bmc.database.model.AutonomousDatabaseSummary
023 import com.oracle.bmc.database.model.CreateAutonomousDatabaseDetails
024 import com.oracle.bmc.database.requests.CreateAutonomousDatabaseRequest
025 import com.oracle.bmc.database.requests.GetAutonomousDatabaseRequest
026 import com.oracle.bmc.database.requests.ListAutonomousDatabasesRequest
027 import groovy.transform.CompileStatic
028 import org.gradle.api.provider.Property
029 import org.gradle.api.tasks.Internal
030 import org.kordamp.gradle.plugin.oci.tasks.AbstractOCITask
031 import org.kordamp.gradle.plugin.oci.tasks.interfaces.OCITask
032 import org.kordamp.gradle.plugin.oci.tasks.traits.AdminPasswordAwareTrait
033 import org.kordamp.gradle.plugin.oci.tasks.traits.CompartmentIdAwareTrait
034 import org.kordamp.gradle.plugin.oci.tasks.traits.DatabaseNameAwareTrait
035 import org.kordamp.gradle.plugin.oci.tasks.traits.OptionalCpuCoreCountAwareTrait
036 import org.kordamp.gradle.plugin.oci.tasks.traits.OptionalDataStorageSizeAwareTrait
037 import org.kordamp.gradle.plugin.oci.tasks.traits.VerboseAwareTrait
038 import org.kordamp.gradle.plugin.oci.tasks.traits.WaitForCompletionAwareTrait
039 import org.kordamp.jipsy.annotations.TypeProviderFor
040 
041 import static org.kordamp.gradle.plugin.oci.tasks.printers.AutonomousDatabasePrinter.printAutonomousDatabase
042 
043 /**
044  @author Andres Almiray
045  @since 0.5.0
046  */
047 @CompileStatic
048 @TypeProviderFor(OCITask)
049 class CreateAutonomousDatabaseTask extends AbstractOCITask implements CompartmentIdAwareTrait,
050     DatabaseNameAwareTrait,
051     AdminPasswordAwareTrait,
052     OptionalCpuCoreCountAwareTrait,
053     OptionalDataStorageSizeAwareTrait,
054     WaitForCompletionAwareTrait,
055     VerboseAwareTrait {
056     static final String TASK_DESCRIPTION = 'Creates an Autonomous Database.'
057 
058     private final Property<String> createdAutonomousDatabaseId = project.objects.property(String)
059     private static final Random RANDOM = new Random()
060 
061     @Internal
062     Property<String> getCreatedAutonomousDatabaseId() {
063         this.@createdAutonomousDatabaseId
064     }
065 
066     @Override
067     void doExecuteTask() {
068         validateCompartmentId()
069         validateDatabaseName()
070         validateAdminPassword()
071 
072         DatabaseClient client = createDatabaseClient()
073 
074         AutonomousDatabase database = maybeCreateAutonomousDatabase(this,
075             client,
076             getResolvedCompartmentId().get(),
077             getResolvedDatabaseName().get(),
078             getResolvedAdminPassword().get(),
079             getResolvedCpuCoreCount().getOrElse(1),
080             getResolvedDataStorageSize().getOrElse(1),
081             getResolvedWaitForCompletion().get(),
082             getResolvedVerbose().get())
083         createdAutonomousDatabaseId.set(database.id)
084     }
085 
086     static AutonomousDatabase maybeCreateAutonomousDatabase(OCITask owner,
087                                                             DatabaseClient client,
088                                                             String compartmentId,
089                                                             String databaseName,
090                                                             String adminPassword,
091                                                             int cpuCoreCount,
092                                                             int dataStorageSize,
093                                                             boolean waitForCompletion,
094                                                             boolean verbose) {
095         // 1. Check if it exists
096         List<AutonomousDatabaseSummary> databases = client.listAutonomousDatabases(ListAutonomousDatabasesRequest.builder()
097             .compartmentId(compartmentId)
098             .displayName(databaseName)
099             .build())
100             .items
101 
102         if (!databases.empty) {
103             AutonomousDatabase database = client.getAutonomousDatabase(GetAutonomousDatabaseRequest.builder()
104                 .autonomousDatabaseId(databases[0].id)
105                 .build())
106                 .autonomousDatabase
107             println("Autonomous Database '${databaseName}' already exists. id = ${owner.console.yellow(database.id)}")
108             if (verboseprintAutonomousDatabase(owner, database, 0)
109             return database
110         }
111 
112         // 2. Create
113         println('Provisioning Autonomous Database. This may take a while.')
114         AutonomousDatabase database = client.createAutonomousDatabase(CreateAutonomousDatabaseRequest.builder()
115             .createAutonomousDatabaseDetails(CreateAutonomousDatabaseDetails.builder()
116                 .compartmentId(compartmentId)
117                 .displayName(databaseName)
118                 .adminPassword(adminPassword)
119                 .cpuCoreCount(cpuCoreCount)
120                 .dataStorageSizeInTBs(dataStorageSize)
121                 .dbName(databaseName + RANDOM.nextInt(500))
122                 .dbWorkload(CreateAutonomousDatabaseDetails.DbWorkload.Oltp)
123                 .licenseModel(CreateAutonomousDatabaseDetails.LicenseModel.LicenseIncluded)
124                 .build())
125             .build())
126             .autonomousDatabase
127 
128         if (waitForCompletion) {
129             println("Waiting for Autonomous Database to be ${owner.state('Available')}")
130             client.waiters
131                 .forAutonomousDatabase(GetAutonomousDatabaseRequest.builder()
132                     .autonomousDatabaseId(database.id)
133                     .build(),
134                     AutonomousDatabase.LifecycleState.Available)
135                 .execute()
136         }
137 
138         println("Autonomous Database '${databaseName}' has been provisioned. id = ${owner.console.yellow(database.id)}")
139         if (verboseprintAutonomousDatabase(owner, database, 0)
140         database
141     }
142 }