From c3d62ecc12141466dc5de18dbe93e4ef5372e722 Mon Sep 17 00:00:00 2001 From: Gabriel P Santos Date: Thu, 5 Sep 2024 10:42:47 -0300 Subject: [PATCH 1/6] pr --- .../apache/cloudstack/api/ApiConstants.java | 1 + .../command/user/network/ListNetworksCmd.java | 2 +- .../api/response/IPAddressResponse.java | 8 +++ .../api/response/NetworkResponse.java | 12 ++++ .../java/com/cloud/api/ApiResponseHelper.java | 32 ++++++----- .../com/cloud/api/ApiResponseHelperTest.java | 2 +- ui/src/components/view/InfoCard.vue | 3 +- ui/src/components/view/ListView.vue | 2 +- ui/src/views/network/IpAddressesTab.vue | 55 ++++++++++++++++++- ui/src/views/network/VpcTiersTab.vue | 30 +++++++++- 10 files changed, 124 insertions(+), 23 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java index 2f0e4f16797d..e5b567d1aa91 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -829,6 +829,7 @@ public class ApiConstants { public static final String VPC_OFF_ID = "vpcofferingid"; public static final String VPC_OFF_NAME = "vpcofferingname"; public static final String NETWORK = "network"; + public static final String VPC_ACCESS = "vpcaccess"; public static final String VPC_ID = "vpcid"; public static final String VPC_NAME = "vpcname"; public static final String GATEWAY_ID = "gatewayid"; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java index 0e8425b14b4b..000ab48bb08f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java @@ -233,7 +233,7 @@ public void execute() { private void updateNetworkResponse(List response) { for (NetworkResponse networkResponse : response) { ResourceIcon resourceIcon = resourceIconManager.getByResourceTypeAndUuid(ResourceTag.ResourceObjectType.Network, networkResponse.getId()); - if (resourceIcon == null && networkResponse.getVpcId() != null) { + if (resourceIcon == null && networkResponse.getVpcId() != null && networkResponse.getVpcAccess()) { resourceIcon = resourceIconManager.getByResourceTypeAndUuid(ResourceTag.ResourceObjectType.Vpc, networkResponse.getVpcId()); } if (resourceIcon == null) { diff --git a/api/src/main/java/org/apache/cloudstack/api/response/IPAddressResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/IPAddressResponse.java index 0018edc86388..be0cdde17232 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/IPAddressResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/IPAddressResponse.java @@ -143,6 +143,10 @@ public class IPAddressResponse extends BaseResponseWithAnnotations implements Co @Param(description = "purpose of the IP address. In Acton this value is not null for Ips with isSystem=true, and can have either StaticNat or LB value") private String purpose; + @SerializedName(ApiConstants.VPC_ACCESS) + @Param(description = "Whether the calling account has access to this network's VPC", since = "4.20") + private boolean vpcAccess; + @SerializedName(ApiConstants.VPC_ID) @Param(description = "VPC id the ip belongs to") private String vpcId; @@ -297,6 +301,10 @@ public void setPurpose(String purpose) { this.purpose = purpose; } + public void setVpcAccess(boolean vpcAccess) { + this.vpcAccess = vpcAccess; + } + public void setVpcId(String vpcId) { this.vpcId = vpcId; } diff --git a/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java index 1049740bf55a..5d3f713300d5 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java @@ -191,6 +191,10 @@ public class NetworkResponse extends BaseResponseWithAssociatedNetwork implement @Param(description = "true if network supports specifying ip ranges, false otherwise") private Boolean specifyIpRanges; + @SerializedName(ApiConstants.VPC_ACCESS) + @Param(description = "Whether the calling account has access to this network's VPC", since = "4.20") + private boolean vpcAccess; + @SerializedName(ApiConstants.VPC_ID) @Param(description = "VPC the network belongs to") private String vpcId; @@ -491,6 +495,14 @@ public void setSpecifyIpRanges(Boolean specifyIpRanges) { this.specifyIpRanges = specifyIpRanges; } + public void setVpcAccess(boolean vpcAccess) { + this.vpcAccess = vpcAccess; + } + + public boolean getVpcAccess() { + return vpcAccess; + } + public void setVpcId(String vpcId) { this.vpcId = vpcId; } diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java b/server/src/main/java/com/cloud/api/ApiResponseHelper.java index 01334c5d4c5a..75aa649e2ff2 100644 --- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java +++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java @@ -1072,7 +1072,7 @@ public IPAddressResponse createIPAddressResponse(ResponseView view, IpAddress ip } - setVpcIdInResponse(ipAddr.getVpcId(), ipResponse::setVpcId, ipResponse::setVpcName); + setVpcIdInResponse(ipAddr.getVpcId(), ipResponse::setVpcId, ipResponse::setVpcName, ipResponse::setVpcAccess); // Network id the ip is associated with (if associated networkId is @@ -1144,20 +1144,24 @@ public IPAddressResponse createIPAddressResponse(ResponseView view, IpAddress ip return ipResponse; } + private void setVpcIdInResponse(Long vpcId, Consumer vpcUuidSetter, Consumer vpcNameSetter, Consumer vpcAccessSetter) { + if (vpcId == null) { + return; + } + Vpc vpc = ApiDBUtils.findVpcById(vpcId); + if (vpc == null) { + return; + } - private void setVpcIdInResponse(Long vpcId, Consumer vpcUuidSetter, Consumer vpcNameSetter) { - if (vpcId != null) { - Vpc vpc = ApiDBUtils.findVpcById(vpcId); - if (vpc != null) { - try { - _accountMgr.checkAccess(CallContext.current().getCallingAccount(), null, false, vpc); - vpcUuidSetter.accept(vpc.getUuid()); - } catch (PermissionDeniedException e) { - logger.debug("Not setting the vpcId to the response because the caller does not have access to the VPC"); - } - vpcNameSetter.accept(vpc.getName()); - } + try { + _accountMgr.checkAccess(CallContext.current().getCallingAccount(), null, false, vpc); + vpcAccessSetter.accept(true); + } catch (PermissionDeniedException e) { + vpcAccessSetter.accept(false); + logger.debug("Setting [%s] as false because the caller does not have access to the VPC [%s].", ApiConstants.VPC_ACCESS, vpc); } + vpcNameSetter.accept(vpc.getName()); + vpcUuidSetter.accept(vpc.getUuid()); } private void showVmInfoForSharedNetworks(boolean forVirtualNetworks, IpAddress ipAddr, IPAddressResponse ipResponse) { @@ -2657,7 +2661,7 @@ public NetworkResponse createNetworkResponse(ResponseView view, Network network) response.setSpecifyIpRanges(network.getSpecifyIpRanges()); - setVpcIdInResponse(network.getVpcId(), response::setVpcId, response::setVpcName); + setVpcIdInResponse(network.getVpcId(), response::setVpcId, response::setVpcName, response::setVpcAccess); setResponseAssociatedNetworkInformation(response, network.getId()); diff --git a/server/src/test/java/com/cloud/api/ApiResponseHelperTest.java b/server/src/test/java/com/cloud/api/ApiResponseHelperTest.java index a68623aa1443..aef53dd4261c 100644 --- a/server/src/test/java/com/cloud/api/ApiResponseHelperTest.java +++ b/server/src/test/java/com/cloud/api/ApiResponseHelperTest.java @@ -202,7 +202,7 @@ public void testUsageRecordResponse(){ public void setResponseIpAddressTestIpv4() { NicSecondaryIp result = Mockito.mock(NicSecondaryIp.class); NicSecondaryIpResponse response = new NicSecondaryIpResponse(); - setResult(result, "ipv4", "ipv6"); + setResult(result, "ipv4", ""); ApiResponseHelper.setResponseIpAddress(result, response); diff --git a/ui/src/components/view/InfoCard.vue b/ui/src/components/view/InfoCard.vue index 24b7cce0feb2..ed1a8016a6b2 100644 --- a/ui/src/components/view/InfoCard.vue +++ b/ui/src/components/view/InfoCard.vue @@ -489,7 +489,8 @@ - {{ resource.vpcname || resource.vpcid }} + {{ resource.vpcname || resource.vpcid }} + {{ resource.vpcname || resource.vpcid }} diff --git a/ui/src/components/view/ListView.vue b/ui/src/components/view/ListView.vue index 2f94d6436a40..2b354dfdbd1d 100644 --- a/ui/src/components/view/ListView.vue +++ b/ui/src/components/view/ListView.vue @@ -270,7 +270,7 @@ {{ text }}