GetInstancePublicIpTask.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.get
019 
020 import com.oracle.bmc.core.ComputeClient
021 import com.oracle.bmc.core.VirtualNetworkClient
022 import com.oracle.bmc.core.model.GetPublicIpByPrivateIpIdDetails
023 import com.oracle.bmc.core.model.PrivateIp
024 import com.oracle.bmc.core.model.VnicAttachment
025 import com.oracle.bmc.core.requests.GetPublicIpByPrivateIpIdRequest
026 import com.oracle.bmc.core.requests.GetVnicRequest
027 import com.oracle.bmc.core.requests.ListPrivateIpsRequest
028 import com.oracle.bmc.core.requests.ListVnicAttachmentsRequest
029 import com.oracle.bmc.core.responses.GetPublicIpByPrivateIpIdResponse
030 import com.oracle.bmc.core.responses.GetVnicResponse
031 import com.oracle.bmc.model.BmcException
032 import groovy.transform.CompileStatic
033 import org.kordamp.gradle.plugin.oci.tasks.AbstractOCITask
034 import org.kordamp.gradle.plugin.oci.tasks.interfaces.OCITask
035 import org.kordamp.gradle.plugin.oci.tasks.traits.CompartmentIdAwareTrait
036 import org.kordamp.gradle.plugin.oci.tasks.traits.InstanceIdAwareTrait
037 import org.kordamp.jipsy.annotations.TypeProviderFor
038 
039 /**
040  @author Andres Almiray
041  @since 0.1.0
042  */
043 @CompileStatic
044 @TypeProviderFor(OCITask)
045 class GetInstancePublicIpTask extends AbstractOCITask implements CompartmentIdAwareTrait,
046     InstanceIdAwareTrait {
047     static final String TASK_DESCRIPTION = 'Displays public Ip addresses for a particular Instance.'
048 
049     @Override
050     protected void doExecuteTask() {
051         validateCompartmentId()
052         validateInstanceId()
053 
054         ComputeClient computeClient = createComputeClient()
055         VirtualNetworkClient vcnClient = createVirtualNetworkClient()
056 
057         Set<String> publicIps = getInstancePublicIp(this,
058             computeClient,
059             vcnClient,
060             getResolvedCompartmentId().get(),
061             getResolvedInstanceId().get())
062 
063         for (String publicIp : publicIps) {
064             println(publicIp)
065         }
066     }
067 
068     static Set<String> getInstancePublicIp(OCITask owner,
069                                            ComputeClient computeClient,
070                                            VirtualNetworkClient vcnClient,
071                                            String compartmentId,
072                                            String instanceId) {
073         Iterable<VnicAttachment> vnicAttachmentsIterable = computeClient.paginators
074             .listVnicAttachmentsRecordIterator(ListVnicAttachmentsRequest.builder()
075                 .compartmentId(compartmentId)
076                 .instanceId(instanceId)
077                 .build())
078 
079         List<String> vnicIds = new ArrayList<>()
080         for (VnicAttachment va : vnicAttachmentsIterable) {
081             vnicIds << va.vnicId
082         }
083 
084         final Set<String> publicIps = new HashSet<>()
085         for (String vnicId : vnicIds) {
086             GetVnicResponse getVnicResponse = vcnClient.getVnic(GetVnicRequest.builder()
087                 .vnicId(vnicId)
088                 .build())
089 
090             if (getVnicResponse.vnic.publicIp != null) {
091                 publicIps << getVnicResponse.vnic.publicIp
092             }
093 
094             Iterable<PrivateIp> privateIpsIterable = vcnClient.paginators
095                 .listPrivateIpsRecordIterator(ListPrivateIpsRequest.builder()
096                     .vnicId(vnicId)
097                     .build())
098 
099             for (PrivateIp privateIp : privateIpsIterable) {
100                 try {
101                     GetPublicIpByPrivateIpIdResponse getPublicIpResponse =
102                         vcnClient.getPublicIpByPrivateIpId(
103                             GetPublicIpByPrivateIpIdRequest.builder()
104                                 .getPublicIpByPrivateIpIdDetails(
105                                     GetPublicIpByPrivateIpIdDetails.builder()
106                                         .privateIpId(privateIp.id)
107                                         .build())
108                                 .build())
109                     publicIps << getPublicIpResponse.publicIp.ipAddress
110                 catch (BmcException e) {
111                     // A 404 is expected if the private IP address does not have a public IP
112                     if (e.statusCode != 404) {
113                         println(
114                             String.format(
115                                 "Exception when retrieving public IP for private IP %s (%s)",
116                                 privateIp.id,
117                                 privateIp.ipAddress))
118                     else {
119                         println(
120                             String.format(
121                                 "No public IP for private IP %s (%s)",
122                                 privateIp.id,
123                                 privateIp.ipAddress))
124                     }
125                 }
126             }
127         }
128 
129         publicIps
130     }
131 }