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 }
|