From 56ef349b0e49d00d21c63d2c2ef7bee6669e82a2 Mon Sep 17 00:00:00 2001 From: Rakesh Date: Wed, 22 Sep 2021 11:24:34 +0200 Subject: [PATCH] Display capability info in listNetwork response (#3804) * Display capability info in listNetwork response Co-authored-by: Rakesh Venkatesh Co-authored-by: Rakesh Venkatesh --- .../java/com/cloud/api/ApiResponseHelper.java | 75 +++++++++++++++++-- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java b/server/src/main/java/com/cloud/api/ApiResponseHelper.java index af4402a6e45..95aebc815e7 100644 --- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java +++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java @@ -20,6 +20,7 @@ import static com.cloud.utils.NumbersUtil.toHumanReadableSize; import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.EnumSet; @@ -2166,6 +2167,27 @@ public class ApiResponseHelper implements ResponseGenerator { return response; } + private void createCapabilityResponse(List capabilityResponses, + String name, + String value, + boolean canChoose, + String objectName) { + CapabilityResponse capabilityResponse = new CapabilityResponse(); + capabilityResponse.setName(name); + capabilityResponse.setValue(value); + capabilityResponse.setCanChoose(canChoose); + capabilityResponse.setObjectName(objectName); + + capabilityResponses.add(capabilityResponse); + } + + private void createCapabilityResponse(List capabilityResponses, + String name, + String value, + boolean canChoose) { + createCapabilityResponse(capabilityResponses, name, value, canChoose, null); + } + @Override public NetworkResponse createNetworkResponse(ResponseView view, Network network) { // need to get network profile in order to retrieve dns information from @@ -2299,6 +2321,7 @@ public class ApiResponseHelper implements ResponseGenerator { response.setDns2(profile.getDns2()); // populate capability Map> serviceCapabilitiesMap = ApiDBUtils.getNetworkCapabilities(network.getId(), network.getDataCenterId()); + Map> serviceProviderMap = ApiDBUtils.listNetworkOfferingServices(network.getNetworkOfferingId()); List serviceResponses = new ArrayList(); if (serviceCapabilitiesMap != null) { for (Map.Entry>entry : serviceCapabilitiesMap.entrySet()) { @@ -2311,21 +2334,59 @@ public class ApiResponseHelper implements ResponseGenerator { serviceResponse.setName(service.getName()); // set list of capabilities for the service - List capabilityResponses = new ArrayList(); + List capabilityResponses = new ArrayList<>(); Map serviceCapabilities = entry.getValue(); if (serviceCapabilities != null) { for (Map.Entry ser_cap_entries : serviceCapabilities.entrySet()) { Capability capability = ser_cap_entries.getKey(); - CapabilityResponse capabilityResponse = new CapabilityResponse(); String capabilityValue = ser_cap_entries.getValue(); - capabilityResponse.setName(capability.getName()); - capabilityResponse.setValue(capabilityValue); - capabilityResponse.setObjectName("capability"); - capabilityResponses.add(capabilityResponse); + if (Service.Lb == service && capability.getName().equals(Capability.SupportedLBIsolation.getName())) { + capabilityValue = networkOffering.isDedicatedLB() ? "dedicated" : "shared"; + } + + Set capabilitySet = new HashSet<>(Arrays.asList(Capability.SupportedLBIsolation.getName(), + Capability.SupportedSourceNatTypes.getName(), + Capability.RedundantRouter.getName())); + boolean canChoose = capabilitySet.contains(capability.getName()); + + createCapabilityResponse(capabilityResponses, capability.getName(), + capabilityValue, canChoose, "capability"); } - serviceResponse.setCapabilities(capabilityResponses); } + if (Service.SourceNat == service) { + // overwrite + capabilityResponses = new ArrayList<>(); + createCapabilityResponse(capabilityResponses, Capability.SupportedSourceNatTypes.getName(), + networkOffering.isSharedSourceNat() ? "perzone" : "peraccount", true); + + createCapabilityResponse(capabilityResponses, Capability.RedundantRouter.getName(), + networkOffering.isRedundantRouter() ? "true" : "false", true); + } else if (service == Service.StaticNat) { + createCapabilityResponse(capabilityResponses, Capability.ElasticIp.getName(), + networkOffering.isElasticIp() ? "true" : "false", false); + + createCapabilityResponse(capabilityResponses, Capability.AssociatePublicIP.getName(), + networkOffering.isAssociatePublicIP() ? "true" : "false", false); + } else if (Service.Lb == service) { + createCapabilityResponse(capabilityResponses, Capability.ElasticLb.getName(), + networkOffering.isElasticLb() ? "true" : "false", false); + + createCapabilityResponse(capabilityResponses, Capability.InlineMode.getName(), + networkOffering.isInline() ? "true" : "false", false); + } + serviceResponse.setCapabilities(capabilityResponses); + + List providers = new ArrayList<>(); + for (Provider provider : serviceProviderMap.get(service)) { + if (provider != null) { + ProviderResponse providerRsp = new ProviderResponse(); + providerRsp.setName(provider.getName()); + providers.add(providerRsp); + } + } + serviceResponse.setProviders(providers); + serviceResponse.setObjectName("service"); serviceResponses.add(serviceResponse); }