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 (verbose) printAutonomousDatabase(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 (verbose) printAutonomousDatabase(owner, database, 0)
140 database
141 }
142 }
|