GenerateAutonomousDatabaseWalletTask.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.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 }