CreateVcnTask.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.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 (verboseprintVcn(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 (verboseprintVcn(owner, vcn, 0)
125         vcn
126     }
127 }