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 (verbose) printInternetGateway(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 (verbose) printInternetGateway(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 (verbose) printInternetGateway(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 }
|