CreateInstanceConsoleConnectionTask.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.core.ComputeClient
021 import com.oracle.bmc.core.model.CreateInstanceConsoleConnectionDetails
022 import com.oracle.bmc.core.model.InstanceConsoleConnection
023 import com.oracle.bmc.core.requests.CreateInstanceConsoleConnectionRequest
024 import com.oracle.bmc.core.requests.GetInstanceConsoleConnectionRequest
025 import com.oracle.bmc.core.requests.ListInstanceConsoleConnectionsRequest
026 import groovy.transform.CompileStatic
027 import org.gradle.api.provider.Property
028 import org.gradle.api.tasks.Internal
029 import org.kordamp.gradle.plugin.oci.tasks.AbstractOCITask
030 import org.kordamp.gradle.plugin.oci.tasks.interfaces.OCITask
031 import org.kordamp.gradle.plugin.oci.tasks.traits.CompartmentIdAwareTrait
032 import org.kordamp.gradle.plugin.oci.tasks.traits.InstanceIdAwareTrait
033 import org.kordamp.gradle.plugin.oci.tasks.traits.PublicKeyFileAwareTrait
034 import org.kordamp.gradle.plugin.oci.tasks.traits.VerboseAwareTrait
035 import org.kordamp.gradle.plugin.oci.tasks.traits.WaitForCompletionAwareTrait
036 import org.kordamp.jipsy.annotations.TypeProviderFor
037 
038 import static org.kordamp.gradle.plugin.oci.tasks.printers.InstanceConsoleConnectionPrinter.printInstanceConsoleConnection
039 
040 /**
041  @author Andres Almiray
042  @since 0.1.0
043  */
044 @CompileStatic
045 @TypeProviderFor(OCITask)
046 class CreateInstanceConsoleConnectionTask extends AbstractOCITask implements CompartmentIdAwareTrait,
047     InstanceIdAwareTrait,
048     PublicKeyFileAwareTrait,
049     WaitForCompletionAwareTrait,
050     VerboseAwareTrait {
051     static final String TASK_DESCRIPTION = 'Creates an InstanceConsoleConnection.'
052 
053     private final Property<String> createdConnectionId = project.objects.property(String)
054 
055     @Internal
056     Property<String> getCreatedInstanceConsoleConnectionId() {
057         this.@createdConnectionId
058     }
059 
060     @Override
061     void doExecuteTask() {
062         validateCompartmentId()
063         validateInstanceId()
064         validatePublicKeyFile()
065 
066         ComputeClient client = createComputeClient()
067 
068         InstanceConsoleConnection connection = maybeCreateInstanceConsoleConnection(this,
069             client,
070             getResolvedCompartmentId().get(),
071             getResolvedInstanceId().get(),
072             getResolvedPublicKeyFile().get().asFile,
073             getResolvedWaitForCompletion().get(),
074             getResolvedVerbose().get())
075         createdConnectionId.set(connection.id)
076     }
077 
078     static InstanceConsoleConnection maybeCreateInstanceConsoleConnection(OCITask owner,
079                                                                           ComputeClient client,
080                                                                           String compartmentId,
081                                                                           String instanceId,
082                                                                           File publicKeyFile,
083                                                                           boolean waitForCompletion,
084                                                                           boolean verbose) {
085         // 1. Check if it exists
086         List<InstanceConsoleConnection> connections = client.listInstanceConsoleConnections(ListInstanceConsoleConnectionsRequest.builder()
087             .compartmentId(compartmentId)
088             .instanceId(instanceId)
089             .build())
090             .items
091 
092         if (!connections.empty) {
093             InstanceConsoleConnection connection = connections[0]
094             println("InstanceConsoleConnection for instance '${instanceId}' already exists. id = ${owner.console.yellow(connection.id)}")
095             if (verboseprintInstanceConsoleConnection(owner, connection, 0)
096             return connection
097         }
098 
099         // 2. Create
100         println('Provisioning InstanceConsoleConnection. This may take a while.')
101         CreateInstanceConsoleConnectionDetails details = CreateInstanceConsoleConnectionDetails.builder()
102             .publicKey(publicKeyFile.text)
103             .instanceId(instanceId)
104             .build()
105 
106         InstanceConsoleConnection connection = client.createInstanceConsoleConnection(CreateInstanceConsoleConnectionRequest.builder()
107             .createInstanceConsoleConnectionDetails(details)
108             .build())
109             .instanceConsoleConnection
110 
111         if (waitForCompletion) {
112             println("Waiting for InstanceConsoleConnection to be ${owner.state('Active')}")
113             client.waiters.forInstanceConsoleConnection(GetInstanceConsoleConnectionRequest.builder()
114                 .instanceConsoleConnectionId(connection.id)
115                 .build(),
116                 InstanceConsoleConnection.LifecycleState.Active)
117                 .execute()
118         }
119 
120         println("InstanceConsoleConnection has been provisioned. id = ${owner.console.yellow(connection.id)}")
121         if (verboseprintInstanceConsoleConnection(owner, connection, 0)
122         connection
123     }
124 }