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 (verbose) printInstanceConsoleConnection(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 (verbose) printInstanceConsoleConnection(owner, connection, 0)
122 connection
123 }
124 }
|