CreateInternetGatewayTask.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.CreateInternetGatewayDetails
022 import com.oracle.bmc.core.model.InternetGateway
023 import com.oracle.bmc.core.model.RouteRule
024 import com.oracle.bmc.core.model.RouteTable
025 import com.oracle.bmc.core.model.UpdateRouteTableDetails
026 import com.oracle.bmc.core.model.Vcn
027 import com.oracle.bmc.core.requests.CreateInternetGatewayRequest
028 import com.oracle.bmc.core.requests.GetInternetGatewayRequest
029 import com.oracle.bmc.core.requests.GetRouteTableRequest
030 import com.oracle.bmc.core.requests.GetVcnRequest
031 import com.oracle.bmc.core.requests.ListInternetGatewaysRequest
032 import com.oracle.bmc.core.requests.UpdateRouteTableRequest
033 import groovy.transform.CompileStatic
034 import org.gradle.api.provider.Property
035 import org.gradle.api.tasks.Internal
036 import org.kordamp.gradle.plugin.oci.tasks.AbstractOCITask
037 import org.kordamp.gradle.plugin.oci.tasks.interfaces.OCITask
038 import org.kordamp.gradle.plugin.oci.tasks.traits.CompartmentIdAwareTrait
039 import org.kordamp.gradle.plugin.oci.tasks.traits.InternetGatewayNameAwareTrait
040 import org.kordamp.gradle.plugin.oci.tasks.traits.VcnIdAwareTrait
041 import org.kordamp.gradle.plugin.oci.tasks.traits.VerboseAwareTrait
042 import org.kordamp.gradle.plugin.oci.tasks.traits.WaitForCompletionAwareTrait
043 import org.kordamp.jipsy.annotations.TypeProviderFor
044 
045 import static org.kordamp.gradle.plugin.oci.tasks.printers.InternetGatewayPrinter.printInternetGateway
046 
047 /**
048  @author Andres Almiray
049  @since 0.1.0
050  */
051 @CompileStatic
052 @TypeProviderFor(OCITask)
053 class CreateInternetGatewayTask extends AbstractOCITask implements CompartmentIdAwareTrait,
054     VcnIdAwareTrait,
055     InternetGatewayNameAwareTrait,
056     WaitForCompletionAwareTrait,
057     VerboseAwareTrait {
058     static final String TASK_DESCRIPTION = 'Creates a InternetGateway.'
059 
060     private final Property<String> createdInternetGatewayId = project.objects.property(String)
061 
062     @Internal
063     Property<String> getCreatedInternetGatewayId() {
064         this.@createdInternetGatewayId
065     }
066 
067     @Override
068     void doExecuteTask() {
069         validateCompartmentId()
070         validateVcnId()
071         validateInternetGatewayName()
072 
073         VirtualNetworkClient client = createVirtualNetworkClient()
074 
075         InternetGateway internetGateway = maybeCreateInternetGateway(this,
076             client,
077             getResolvedCompartmentId().get(),
078             getResolvedVcnId().get(),
079             getResolvedInternetGatewayName().get(),
080             getResolvedWaitForCompletion().get(),
081             getResolvedVerbose().get())
082         createdInternetGatewayId.set(internetGateway.id)
083     }
084 
085     static InternetGateway maybeCreateInternetGateway(OCITask owner,
086                                                       VirtualNetworkClient client,
087                                                       String compartmentId,
088                                                       String vcnId,
089                                                       String internetGatewayName,
090                                                       boolean waitForCompletion,
091                                                       boolean verbose) {
092         InternetGateway internetGateway = doMaybeCreateInternetGateway(owner,
093             client,
094             compartmentId,
095             vcnId,
096             internetGatewayName,
097             waitForCompletion,
098             verbose)
099 
100         maybeAddInternetGatewayToVcn(owner, client, vcnId, internetGateway)
101 
102         internetGateway
103     }
104 
105     static InternetGateway doMaybeCreateInternetGateway(OCITask owner,
106                                                         VirtualNetworkClient client,
107                                                         String compartmentId,
108                                                         String vcnId,
109                                                         String internetGatewayName,
110                                                         boolean waitForCompletion,
111                                                         boolean verbose) {
112         // 1. Check if it exists
113         List<InternetGateway> internetGateways = client.listInternetGateways(ListInternetGatewaysRequest.builder()
114             .compartmentId(compartmentId)
115             .vcnId(vcnId)
116             .build())
117             .items
118 
119         InternetGateway internetGateway = internetGateways.find InternetGateway ig -> ig.displayName == internetGatewayName }
120 
121         if (internetGateway) {
122             println("InternetGateway '${internetGatewayName}' already exists. id = ${internetGateway.id}")
123             if (verboseprintInternetGateway(owner, internetGateway, 0)
124             return internetGateway
125         }
126 
127         if (!internetGateways.empty) {
128             internetGateway = internetGateways[0]
129             println("InternetGateway '${internetGateway.displayName}' exists. id = ${internetGateway.id}")
130             if (verboseprintInternetGateway(owner, internetGateway, 0)
131             return internetGateway
132         }
133 
134         internetGateway = client.createInternetGateway(CreateInternetGatewayRequest.builder()
135             .createInternetGatewayDetails(CreateInternetGatewayDetails.builder()
136                 .compartmentId(compartmentId)
137                 .vcnId(vcnId)
138                 .displayName(internetGatewayName)
139                 .isEnabled(true)
140                 .build())
141             .build())
142             .internetGateway
143 
144         if (waitForCompletion) {
145             println("Waiting for InternetGateway to be ${owner.state('Available')}")
146             client.waiters.forInternetGateway(GetInternetGatewayRequest.builder()
147                 .igId(internetGateway.id)
148                 .build(),
149                 InternetGateway.LifecycleState.Available)
150                 .execute()
151         }
152 
153         println("InternetGateway '${internetGatewayName}' has been provisioned. id = ${owner.console.yellow(internetGateway.id)}")
154         if (verboseprintInternetGateway(owner, internetGateway, 0)
155         internetGateway
156     }
157 
158     static void maybeAddInternetGatewayToVcn(OCITask owner,
159                                              VirtualNetworkClient client,
160                                              String vcnId,
161                                              InternetGateway internetGateway) {
162         // 1. fetch the VCN
163         Vcn vcn = client.getVcn(GetVcnRequest.builder()
164             .vcnId(vcnId)
165             .build())
166             .vcn
167 
168         // 2. fetch RouteTable
169         RouteTable routeTable = client.getRouteTable(GetRouteTableRequest.builder()
170             .rtId(vcn.defaultRouteTableId)
171             .build())
172             .routeTable
173 
174         // 3. is the IG already in the RT?
175         if (!routeTable.routeRules.find RouteRule rr -> rr.networkEntityId == internetGateway.id }) {
176             List<RouteRule> routeRules = []
177             routeRules << RouteRule.builder()
178                 .destination('0.0.0.0/0')
179                 .destinationType(RouteRule.DestinationType.CidrBlock)
180                 .networkEntityId(internetGateway.id)
181                 .build()
182 
183             println("Adding InternetGateway '${internetGateway.displayName}' to RouteTable. vcnId = ${owner.console.yellow(vcnId)}")
184             client.updateRouteTable(UpdateRouteTableRequest.builder()
185                 .updateRouteTableDetails(UpdateRouteTableDetails.builder()
186                     .routeRules(routeRules).build())
187                 .rtId(vcn.defaultRouteTableId)
188                 .build())
189         }
190     }
191 }