From 8b0cd2ca54576aec18793e21a97afa510562b4bf Mon Sep 17 00:00:00 2001 From: Gabriel P Santos Date: Thu, 5 Sep 2024 10:42:47 -0300 Subject: [PATCH 1/8] rebase --- .../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 | 121 +++++++ ui/src/components/view/ListView.vue | 2 +- ui/src/views/network/IpAddressesTab.vue | 296 ++++++------------ ui/src/views/network/VpcTiersTab.vue | 30 +- 10 files changed, 287 insertions(+), 219 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 4d4ead277e5d..3eb26b6010d9 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -996,6 +996,7 @@ public class ApiConstants { public static final String VPC_OFF_NAME = "vpcofferingname"; public static final String VPC_OFFERING_CONSERVE_MODE = "vpcofferingconservemode"; 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 VPC_GATEWAY_ID = "vpcgatewayid"; 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 79f2cf8c7449..aab11543f21d 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 @@ -240,7 +240,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 cdc3115c8293..ce2c0f36caf4 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; @@ -301,6 +305,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 3a3663af2551..ccf186dfe4f7 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 @@ -203,6 +203,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; @@ -523,6 +527,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 a8551b4c6693..0b1fb0e663c2 100644 --- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java +++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java @@ -1167,7 +1167,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 @@ -1242,20 +1242,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) { @@ -2799,7 +2803,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 c0c019f6dbd8..13384503370e 100644 --- a/server/src/test/java/com/cloud/api/ApiResponseHelperTest.java +++ b/server/src/test/java/com/cloud/api/ApiResponseHelperTest.java @@ -247,7 +247,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 996e30ead3b5..ded604c8f202 100644 --- a/ui/src/components/view/InfoCard.vue +++ b/ui/src/components/view/InfoCard.vue @@ -504,6 +504,127 @@ {{ resource.autoscalevmgroupname || resource.autoscalevmgroupid }} + + +
+
{{ $t('label.resource') }}
+
+ +
+
+
+
{{ $t('label.vmname') }}
+
+ + {{ resource.vmname || resource.vm || resource.virtualmachinename || resource.virtualmachineid }} + +
+
+
+
{{ $t('label.volume') }}
+
+ + {{ resource.volumename || resource.volume || resource.volumeid }} + {{ resource.volumename || resource.volume || resource.volumeid }} +
+
+
+
{{ $t('label.associatednetwork') }}
+
+ + {{ resource.associatednetworkname || resource.associatednetwork || resource.associatednetworkid }} +
+
+
+
{{ $t('label.network') }}
+
+ + {{ resource.sourceipaddressnetworkname || resource.sourceipaddressnetworkid }} +
+
+
+
{{ $t('label.guestnetwork') }}
+
+ + {{ resource.guestnetworkname || resource.guestnetworkid }} +
+
+
+
{{ $t('label.public.ip') }}
+
+ + {{ resource.publicip }} + + +
+
+
+
{{ $t('label.vpcname') }}
+
+ + + + + {{ resource.vpcname || resource.vpcid }} + {{ resource.vpcname || resource.vpcid }} +
+
+ +
+
{{ $t('label.aclid') }}
+
+ + + + + {{ resource.aclname || resource.aclid }} +
+
+ +
+
{{ $t('label.affinitygroup') }}
+ + + {{ group.name }} + , + +
+
+
{{ resource.templateformat === 'ISO'? $t('label.iso') : $t('label.templatename') }}
+
+ + + {{ resource.templatedisplaytext || resource.templatename || resource.templateid }} +
+
+
+
{{ $t('label.isoname') }}
+
+ + + {{ resource.isodisplaytext || resource.isoname || resource.isoid }} +
+
+
+
{{ $t('label.system.offering') }}
+
{{ $t('label.serviceofferingname') }}
+
+ + {{ resource.serviceofferingname || resource.serviceofferingid }} + {{ resource.serviceofferingname || resource.serviceofferingid }} + {{ resource.serviceofferingname || resource.serviceofferingid }} +
+
+
+
{{ $t('label.diskoffering') }}
+
+ +
+ {{ resource.rootdiskofferingdisplaytext }} + {{ resource.rootdiskofferingdisplaytext }}
{{ $t('label.keypairs') }}
diff --git a/ui/src/components/view/ListView.vue b/ui/src/components/view/ListView.vue index b03293efacae..8e46c1002fff 100644 --- a/ui/src/components/view/ListView.vue +++ b/ui/src/components/view/ListView.vue @@ -582,7 +582,7 @@ {{ text }}