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.autonomous
019
020 import com.oracle.bmc.database.DatabaseClient
021 import com.oracle.bmc.database.model.GenerateAutonomousDatabaseWalletDetails
022 import com.oracle.bmc.database.requests.GenerateAutonomousDatabaseWalletRequest
023 import com.oracle.bmc.database.requests.ListAutonomousDatabasesRequest
024 import com.oracle.bmc.database.responses.GenerateAutonomousDatabaseWalletResponse
025 import groovy.transform.CompileStatic
026 import org.apache.commons.io.FileUtils
027 import org.gradle.api.file.RegularFile
028 import org.gradle.api.provider.Provider
029 import org.gradle.api.tasks.OutputFile
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.CompartmentIdAwareTrait
033 import org.kordamp.gradle.plugin.oci.tasks.traits.OptionalDatabaseIdAwareTrait
034 import org.kordamp.gradle.plugin.oci.tasks.traits.OptionalDatabaseNameAwareTrait
035 import org.kordamp.gradle.plugin.oci.tasks.traits.WaitForCompletionAwareTrait
036 import org.kordamp.gradle.plugin.oci.tasks.traits.WalletPasswordAwareTrait
037 import org.kordamp.jipsy.annotations.TypeProviderFor
038
039 import static org.kordamp.gradle.util.StringUtils.isBlank
040 import static org.kordamp.gradle.util.StringUtils.isNotBlank
041
042 /**
043 * @author Andres Almiray
044 * @since 0.5.0
045 */
046 @CompileStatic
047 @TypeProviderFor(OCITask)
048 class GenerateAutonomousDatabaseWalletTask extends AbstractOCITask implements CompartmentIdAwareTrait,
049 OptionalDatabaseIdAwareTrait,
050 OptionalDatabaseNameAwareTrait,
051 WalletPasswordAwareTrait,
052 WaitForCompletionAwareTrait {
053 static final String TASK_DESCRIPTION = 'Generates and downloads a Wallet for a Database.'
054
055 private final Provider<RegularFile> output
056
057 GenerateAutonomousDatabaseWalletTask() {
058 output = project.layout.buildDirectory.file('oci/autonomous/wallet.zip')
059 }
060
061 @OutputFile
062 Provider<RegularFile> getOutput() {
063 this.@output
064 }
065
066 @Override
067 protected void doExecuteTask() {
068 validateWalletPassword()
069 validateDatabaseId()
070
071 if (isBlank(getResolvedDatabaseId().orNull) && isBlank(getResolvedDatabaseName().orNull)) {
072 throw new IllegalStateException("Missing value for either 'databaseId' or 'databaseName' in $path")
073 }
074
075 DatabaseClient client = createDatabaseClient()
076
077 if (isNotBlank(getResolvedDatabaseId().orNull)) {
078 generateAutonomousDatabaseWallet(client,
079 getResolvedDatabaseId().get(),
080 getResolvedWalletPassword().get(),
081 output.get().asFile)
082 } else {
083 validateCompartmentId()
084
085 client.listAutonomousDatabases(ListAutonomousDatabasesRequest.builder()
086 .compartmentId(getResolvedCompartmentId().get())
087 .displayName(getResolvedDatabaseName().get())
088 .build())
089 .items.each { database ->
090 setDatabaseId(database.id)
091 generateAutonomousDatabaseWallet(client,
092 database.id,
093 getResolvedWalletPassword().get(),
094 output.get().asFile)
095 }
096 }
097 }
098
099 static void generateAutonomousDatabaseWallet(DatabaseClient client,
100 String databaseId,
101 String password,
102 File output) {
103 GenerateAutonomousDatabaseWalletResponse response = client.generateAutonomousDatabaseWallet(GenerateAutonomousDatabaseWalletRequest.builder()
104 .autonomousDatabaseId(databaseId)
105 .generateAutonomousDatabaseWalletDetails(GenerateAutonomousDatabaseWalletDetails.builder()
106 .password(password)
107 .build())
108 .build())
109
110 FileUtils.copyInputStreamToFile(response.inputStream, output)
111 println("Wallet for database with id ${databaseId} has been saved to ${output.absolutePath}")
112 }
113 }
|