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.VirtualNetworkClient
021 import com.oracle.bmc.core.model.CreateVcnDetails
022 import com.oracle.bmc.core.model.Vcn
023 import com.oracle.bmc.core.requests.CreateVcnRequest
024 import com.oracle.bmc.core.requests.GetVcnRequest
025 import com.oracle.bmc.core.requests.ListVcnsRequest
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.DnsLabelAwareTrait
033 import org.kordamp.gradle.plugin.oci.tasks.traits.VcnNameAwareTrait
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.VcnPrinter.printVcn
039
040 /**
041 * @author Andres Almiray
042 * @since 0.1.0
043 */
044 @CompileStatic
045 @TypeProviderFor(OCITask)
046 class CreateVcnTask extends AbstractOCITask implements CompartmentIdAwareTrait,
047 VcnNameAwareTrait,
048 DnsLabelAwareTrait,
049 WaitForCompletionAwareTrait,
050 VerboseAwareTrait {
051 static final String TASK_DESCRIPTION = 'Creates a Vcn.'
052
053 private final Property<String> createdVcnId = project.objects.property(String)
054
055 @Internal
056 Property<String> getCreatedVcnId() {
057 this.@createdVcnId
058 }
059
060 @Override
061 void doExecuteTask() {
062 validateCompartmentId()
063 validateDnsLabel(getResolvedCompartmentId().get())
064 validateVcnName()
065
066 VirtualNetworkClient client = createVirtualNetworkClient()
067
068 Vcn vcn = maybeCreateVcn(this,
069 client,
070 getResolvedCompartmentId().get(),
071 getResolvedVcnName().get(),
072 getResolvedDnsLabel().get(),
073 '10.0.0.0/16',
074 getResolvedWaitForCompletion().get(),
075 getResolvedVerbose().get())
076 createdVcnId.set(vcn.id)
077 }
078
079 static Vcn maybeCreateVcn(OCITask owner,
080 VirtualNetworkClient client,
081 String compartmentId,
082 String vcnName,
083 String dnsLabel,
084 String cidrBlock,
085 boolean waitForCompletion,
086 boolean verbose) {
087 // 1. Check if it exists
088 List<Vcn> vcns = client.listVcns(ListVcnsRequest.builder()
089 .compartmentId(compartmentId)
090 .displayName(vcnName)
091 .build())
092 .items
093
094 if (!vcns.empty) {
095 Vcn vcn = vcns[0]
096 println("Vcn '${vcnName}' already exists. id = ${owner.console.yellow(vcn.id)}")
097 if (verbose) printVcn(owner, vcn, 0)
098 return vcn
099 }
100
101 // 2. Create
102 println('Provisioning Vcn. This may take a while.')
103 Vcn vcn = client.createVcn(CreateVcnRequest.builder()
104 .createVcnDetails(CreateVcnDetails.builder()
105 .cidrBlock(cidrBlock)
106 .compartmentId(compartmentId)
107 .displayName(vcnName)
108 .dnsLabel(dnsLabel)
109 .build())
110 .build())
111 .vcn
112
113 if (waitForCompletion) {
114 println("Waiting for Vcn to be ${owner.state('Available')}")
115 client.waiters
116 .forVcn(GetVcnRequest.builder()
117 .vcnId(vcn.id)
118 .build(),
119 Vcn.LifecycleState.Available)
120 .execute()
121 }
122
123 println("Vcn '${vcnName}' has been provisioned. id = ${owner.console.yellow(vcn.id)}")
124 if (verbose) printVcn(owner, vcn, 0)
125 vcn
126 }
127 }
|