From 2aadd328cb4a3ea4174d118fa5cc1466c9c02fb2 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Fri, 20 Oct 2023 11:56:33 -0400 Subject: [PATCH 1/4] NSX: Add Step for Adding Public traffic network for NSX --- .../apache/cloudstack/api/ApiConstants.java | 2 ++ .../admin/vlan/CreateVlanIpRangeCmd.java | 11 +++++-- .../api/response/VlanIpRangeResponse.java | 8 +++++ .../configuration/ConfigurationManager.java | 2 +- .../META-INF/db/schema-41810to41900.sql | 2 ++ .../java/com/cloud/api/ApiResponseHelper.java | 7 +++++ .../ConfigurationManagerImpl.java | 31 ++++++++++++------- .../com/cloud/network/NetworkServiceImpl.java | 2 +- .../network/router/CommandSetupHelper.java | 21 +++++++++++-- .../network/router/NetworkHelperImpl.java | 4 +-- .../network/router/VpcNetworkHelperImpl.java | 2 +- ...VpcVirtualNetworkApplianceManagerImpl.java | 8 ++++- .../vpc/MockConfigurationManagerImpl.java | 2 +- ui/public/locales/en.json | 3 ++ .../views/infra/zone/IpAddressRangeForm.vue | 21 ++++++++++++- .../views/infra/zone/ZoneWizardLaunchZone.vue | 11 ++++++- .../infra/zone/ZoneWizardNetworkSetupStep.vue | 12 +++++-- 17 files changed, 121 insertions(+), 28 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 3329f42bfc98..479ca3470bf4 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -1054,6 +1054,8 @@ public class ApiConstants { public static final String SOURCE_NAT_IP_ID = "sourcenatipaddressid"; public static final String HAS_RULES = "hasrules"; + public static final String nsxDetail = "forNsx"; + /** * This enum specifies IO Drivers, each option controls specific policies on I/O. * Qemu guests support "threads" and "native" options Since 0.8.8 ; "io_uring" is supported Since 6.3.0 (QEMU 5.0). diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java index 66aefd46966b..204c24c0af4f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java @@ -42,7 +42,7 @@ @APICommand(name = "createVlanIpRange", description = "Creates a VLAN IP range.", responseObject = VlanIpRangeResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) -public class CreateVlanIpRangeCmd extends BaseCmd { + public class CreateVlanIpRangeCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(CreateVlanIpRangeCmd.class.getName()); @@ -114,6 +114,9 @@ public class CreateVlanIpRangeCmd extends BaseCmd { @Parameter(name = ApiConstants.FOR_SYSTEM_VMS, type = CommandType.BOOLEAN, description = "true if IP range is set to system vms, false if not") private Boolean forSystemVms; + @Parameter(name = ApiConstants.FOR_NSX, type = CommandType.BOOLEAN, description = "true if the IP range is used for NSX resource", since = "4.20.0") + private boolean forNsx; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -154,8 +157,12 @@ public String getStartIp() { return startIp; } + public boolean isForNsx() { + return forNsx; + } + public String getVlan() { - if (vlan == null || vlan.isEmpty()) { + if ((vlan == null || vlan.isEmpty()) && !forNsx) { vlan = "untagged"; } return vlan; diff --git a/api/src/main/java/org/apache/cloudstack/api/response/VlanIpRangeResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/VlanIpRangeResponse.java index a22e2eb7024d..aac6dd3c5776 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/VlanIpRangeResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/VlanIpRangeResponse.java @@ -123,6 +123,10 @@ public class VlanIpRangeResponse extends BaseResponse implements ControlledEntit @Param(description = "indicates whether VLAN IP range is dedicated to system vms or not") private Boolean forSystemVms; + @SerializedName(ApiConstants.FOR_NSX) + @Param(description = "indicates whether IP range is dedicated to NSX resources or not") + private Boolean forNsx; + public void setId(String id) { this.id = id; } @@ -235,4 +239,8 @@ public void setIp6Gateway(String ip6Gateway) { public void setIp6Cidr(String ip6Cidr) { this.ip6Cidr = ip6Cidr; } + + public void setForNsx(Boolean forNsx) { + this.forNsx = forNsx; + } } diff --git a/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java b/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java index 1146a33861d1..4fd1cab7c3f3 100644 --- a/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java +++ b/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java @@ -228,7 +228,7 @@ NetworkOfferingVO createNetworkOffering(String name, String displayText, Traffic Boolean forTungsten, Boolean forNsx, List domainIds, List zoneIds, boolean enableOffering, final NetUtils.InternetProtocol internetProtocol); Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, boolean forSystemVms, Long podId, String startIP, String endIP, - String vlanGateway, String vlanNetmask, String vlanId, boolean bypassVlanOverlapCheck, Domain domain, Account vlanOwner, String startIPv6, String endIPv6, String vlanIp6Gateway, String vlanIp6Cidr) + String vlanGateway, String vlanNetmask, String vlanId, boolean bypassVlanOverlapCheck, Domain domain, Account vlanOwner, String startIPv6, String endIPv6, String vlanIp6Gateway, String vlanIp6Cidr, boolean forNsx) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException; void createDefaultSystemNetworks(long zoneId) throws ConcurrentOperationException; diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41810to41900.sql b/engine/schema/src/main/resources/META-INF/db/schema-41810to41900.sql index a429c37d4d60..6231207daa56 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41810to41900.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41810to41900.sql @@ -285,3 +285,5 @@ GROUP BY -- Set removed state for all removed accounts UPDATE `cloud`.`account` SET state='removed' WHERE `removed` IS NOT NULL; + +-- \ No newline at end of file diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java b/server/src/main/java/com/cloud/api/ApiResponseHelper.java index 6d4972573ae4..ee080f28ed28 100644 --- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java +++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java @@ -31,6 +31,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.TimeZone; import java.util.function.Consumer; @@ -38,6 +39,8 @@ import javax.inject.Inject; +import com.cloud.dc.VlanDetailsVO; +import com.cloud.dc.dao.VlanDetailsDao; import com.cloud.hypervisor.Hypervisor; import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.acl.ControlledEntity.ACLType; @@ -467,6 +470,8 @@ public class ApiResponseHelper implements ResponseGenerator { FirewallRulesDao firewallRulesDao; @Inject UserDataDao userDataDao; + @Inject + VlanDetailsDao vlanDetailsDao; @Override public UserResponse createUserResponse(User user) { @@ -926,6 +931,8 @@ public VlanIpRangeResponse createVlanIpRangeResponse(Class> sameSubnet) { + final String ip6Gateway, final String ip6Cidr, final Domain domain, final Account vlanOwner, final Network network, final Pair> sameSubnet, boolean forNsx) { final GlobalLock commitVlanLock = GlobalLock.getInternLock("CommitVlan"); commitVlanLock.lock(5); s_logger.debug("Acquiring lock for committing vlan"); @@ -4549,7 +4553,7 @@ public Vlan doInTransaction(final TransactionStatus status) { newVlanNetmask = sameSubnet.second().second(); } final Vlan vlan = createVlanAndPublicIpRange(zoneId, networkId, physicalNetworkId, forVirtualNetwork, forSystemVms, podId, startIP, endIP, newVlanGateway, newVlanNetmask, vlanId, - false, domain, vlanOwner, startIPv6, endIPv6, ip6Gateway, ip6Cidr); + false, domain, vlanOwner, startIPv6, endIPv6, ip6Gateway, ip6Cidr, forNsx); // create an entry in the nic_secondary table. This will be the new // gateway that will be configured on the corresponding routervm. return vlan; @@ -4673,7 +4677,7 @@ public boolean hasSameSubnet(boolean ipv4, String vlanGateway, String vlanNetmas @Override @DB public Vlan createVlanAndPublicIpRange(final long zoneId, final long networkId, final long physicalNetworkId, final boolean forVirtualNetwork, final boolean forSystemVms, final Long podId, final String startIP, final String endIP, - final String vlanGateway, final String vlanNetmask, String vlanId, boolean bypassVlanOverlapCheck, Domain domain, final Account vlanOwner, final String startIPv6, final String endIPv6, final String vlanIp6Gateway, final String vlanIp6Cidr) { + final String vlanGateway, final String vlanNetmask, String vlanId, boolean bypassVlanOverlapCheck, Domain domain, final Account vlanOwner, final String startIPv6, final String endIPv6, final String vlanIp6Gateway, final String vlanIp6Cidr, boolean forNsx) { final Network network = _networkModel.getNetwork(networkId); boolean ipv4 = false, ipv6 = false; @@ -4755,11 +4759,11 @@ public Vlan createVlanAndPublicIpRange(final long zoneId, final long networkId, } else { vlanId = networkVlanId; } - } else if (network.getTrafficType() == TrafficType.Public && vlanId == null) { + } else if (network.getTrafficType() == TrafficType.Public && vlanId == null && !forNsx) { throw new InvalidParameterValueException("Unable to determine vlan id or untagged vlan for public network"); } - if (vlanId == null) { + if (vlanId == null && !forNsx) { vlanId = Vlan.UNTAGGED; } @@ -4856,7 +4860,7 @@ public Vlan createVlanAndPublicIpRange(final long zoneId, final long networkId, if (isSharedNetworkWithoutSpecifyVlan) { bypassVlanOverlapCheck = true; } - if (!bypassVlanOverlapCheck && _zoneDao.findVnet(zoneId, physicalNetworkId, BroadcastDomainType.getValue(BroadcastDomainType.fromString(vlanId))).size() > 0) { + if (!bypassVlanOverlapCheck && !forNsx && _zoneDao.findVnet(zoneId, physicalNetworkId, BroadcastDomainType.getValue(BroadcastDomainType.fromString(vlanId))).size() > 0) { throw new InvalidParameterValueException("The VLAN tag " + vlanId + " is already being used for dynamic vlan allocation for the guest network in zone " + zone.getName()); } @@ -4872,7 +4876,7 @@ public Vlan createVlanAndPublicIpRange(final long zoneId, final long networkId, // Everything was fine, so persist the VLAN final VlanVO vlan = commitVlanAndIpRange(zoneId, networkId, physicalNetworkId, podId, startIP, endIP, vlanGateway, vlanNetmask, vlanId, domain, vlanOwner, vlanIp6Gateway, vlanIp6Cidr, - ipv4, zone, vlanType, ipv6Range, ipRange, forSystemVms); + ipv4, zone, vlanType, ipv6Range, ipRange, forSystemVms, forNsx); return vlan; } @@ -4894,9 +4898,11 @@ private void checkZoneVlanIpOverlap(DataCenterVO zone, Network network, String n continue; } // from here, subnet overlaps - if (vlanId.toLowerCase().contains(Vlan.UNTAGGED) || UriUtils.checkVlanUriOverlap( + VlanDetailsVO vlanDetail = vlanDetailsDao.findDetail(vlan.getId(), ApiConstants.nsxDetail); + if ((Objects.isNull(vlanId) && Objects.nonNull(vlanDetail) && vlanDetail.getValue().equals("true")) || Objects.nonNull(vlanId) && + (vlanId.toLowerCase().contains(Vlan.UNTAGGED) || UriUtils.checkVlanUriOverlap( BroadcastDomainType.getValue(BroadcastDomainType.fromString(vlanId)), - BroadcastDomainType.getValue(BroadcastDomainType.fromString(vlan.getVlanTag())))) { + BroadcastDomainType.getValue(BroadcastDomainType.fromString(vlan.getVlanTag()))))) { // For untagged VLAN Id and overlapping URIs we need to expand and verify IP ranges final String[] otherVlanIpRange = vlan.getIpRange().split("\\-"); final String otherVlanStartIP = otherVlanIpRange[0]; @@ -4941,13 +4947,14 @@ private void checkZoneVlanIpOverlap(DataCenterVO zone, Network network, String n private VlanVO commitVlanAndIpRange(final long zoneId, final long networkId, final long physicalNetworkId, final Long podId, final String startIP, final String endIP, final String vlanGateway, final String vlanNetmask, final String vlanId, final Domain domain, final Account vlanOwner, final String vlanIp6Gateway, final String vlanIp6Cidr, - final boolean ipv4, final DataCenterVO zone, final VlanType vlanType, final String ipv6Range, final String ipRange, final boolean forSystemVms) { + final boolean ipv4, final DataCenterVO zone, final VlanType vlanType, final String ipv6Range, final String ipRange, final boolean forSystemVms, final boolean forNsx) { return Transaction.execute(new TransactionCallback() { @Override public VlanVO doInTransaction(final TransactionStatus status) { VlanVO vlan = new VlanVO(vlanType, vlanId, vlanGateway, vlanNetmask, zone.getId(), ipRange, networkId, physicalNetworkId, vlanIp6Gateway, vlanIp6Cidr, ipv6Range); s_logger.debug("Saving vlan range " + vlan); vlan = _vlanDao.persist(vlan); + vlanDetailsDao.addDetail(vlan.getId(), ApiConstants.nsxDetail, String.valueOf(forNsx), true); // IPv6 use a used ip map, is different from ipv4, no need to save // public ip range diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index cdd93e11db40..bd2e1a8983ec 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -2122,7 +2122,7 @@ public Network doInTransaction(TransactionStatus status) throws InsufficientCapa if (createVlan && network != null) { // Create vlan ip range _configMgr.createVlanAndPublicIpRange(pNtwk.getDataCenterId(), network.getId(), physicalNetworkId, false, false, null, startIP, endIP, gateway, netmask, vlanId, - bypassVlanOverlapCheck, null, null, startIPv6, endIPv6, ip6Gateway, ip6Cidr); + bypassVlanOverlapCheck, null, null, startIPv6, endIPv6, ip6Gateway, ip6Cidr, ntwkOff.isForNsx()); } if (associatedNetwork != null) { _networkDetailsDao.persist(new NetworkDetailVO(network.getId(), Network.AssociatedNetworkId, String.valueOf(associatedNetwork.getId()), true)); diff --git a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java index a7ed6478efa2..3fca22ad42bc 100644 --- a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java +++ b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import javax.inject.Inject; @@ -789,7 +790,10 @@ public void createVpcAssociatePublicIPCommands(final VirtualRouter router, final // vlan1, then all ip addresses of vlan2, etc.. final Map> vlanIpMap = new HashMap>(); for (final PublicIpAddress ipAddress : ips) { - final String vlanTag = ipAddress.getVlanTag(); + String vlanTag = ipAddress.getVlanTag(); + if (Objects.isNull(vlanTag)) { + vlanTag = "nsx-"+ipAddress.getAddress().addr(); + } ArrayList ipList = vlanIpMap.get(vlanTag); if (ipList == null) { ipList = new ArrayList(); @@ -840,10 +844,18 @@ public int compare(final PublicIpAddress o1, final PublicIpAddress o2) { for (final PublicIpAddress ipAddr : ipAddrList) { final boolean add = ipAddr.getState() == IpAddress.State.Releasing ? false : true; + String vlanTag = ipAddr.getVlanTag(); + String key = null; + if (Objects.isNull(vlanTag)) { + key = "nsx-" + ipAddr.getAddress().addr(); + } else { + key = BroadcastDomainType.getValue(BroadcastDomainType.fromString(ipAddr.getVlanTag())); + } - final String macAddress = vlanMacAddress.get(BroadcastDomainType.getValue(BroadcastDomainType.fromString(ipAddr.getVlanTag()))); + final String macAddress = vlanMacAddress.get(key); - final IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, ipAddr.isSourceNat(), BroadcastDomainType.fromString(ipAddr.getVlanTag()).toString(), ipAddr.getGateway(), + final IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, ipAddr.isSourceNat(), + Objects.isNull(vlanTag) ? null : BroadcastDomainType.fromString(ipAddr.getVlanTag()).toString(), ipAddr.getGateway(), ipAddr.getNetmask(), macAddress, networkRate, ipAddr.isOneToOneNat()); setIpAddressNetworkParams(ip, network, router); if (network.getPublicMtu() != null) { @@ -1047,6 +1059,9 @@ private Map getVlanLastIpMap(Long vpcId, Long guestNetworkId) { } for (IPAddressVO ip : userIps) { String vlanTag = _vlanDao.findById(ip.getVlanId()).getVlanTag(); + if (Objects.isNull(vlanTag)) { + vlanTag = "nsx-" + ip.getAddress().addr(); + } Boolean lastIp = vlanLastIpMap.get(vlanTag); if (lastIp != null && !lastIp) { continue; diff --git a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java index 6b242735e0ce..a03566b0e103 100644 --- a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java +++ b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java @@ -711,8 +711,8 @@ protected LinkedHashMap> configurePublicNic( defaultNic.setIsolationUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag())); } else { defaultNic.setBroadcastType(BroadcastDomainType.Vlan); - defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag())); - defaultNic.setIsolationUri(IsolationType.Vlan.toUri(sourceNatIp.getVlanTag())); + defaultNic.setBroadcastUri(sourceNatIp.getVlanTag() != null ? BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag()) : null); + defaultNic.setIsolationUri(sourceNatIp.getVlanTag() != null ? IsolationType.Vlan.toUri(sourceNatIp.getVlanTag()) : null); } //If guest nic has already been added we will have 2 devices in the list. diff --git a/server/src/main/java/com/cloud/network/router/VpcNetworkHelperImpl.java b/server/src/main/java/com/cloud/network/router/VpcNetworkHelperImpl.java index 3eb1d432a859..75a514aaa937 100644 --- a/server/src/main/java/com/cloud/network/router/VpcNetworkHelperImpl.java +++ b/server/src/main/java/com/cloud/network/router/VpcNetworkHelperImpl.java @@ -87,7 +87,7 @@ public void reallocateRouterNetworks(final RouterDeploymentDefinition vpcRouterD final TreeSet publicVlans = new TreeSet(); if (vpcRouterDeploymentDefinition.isPublicNetwork()) { publicVlans.add(vpcRouterDeploymentDefinition.getSourceNatIP() - .getVlanTag()); + .getVlanTag()+""); } //1) allocate nic for control and source nat public ip diff --git a/server/src/main/java/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java index 0141f4966569..86027357d468 100644 --- a/server/src/main/java/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java @@ -23,6 +23,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Objects; import javax.inject.Inject; import javax.naming.ConfigurationException; @@ -351,7 +352,12 @@ public boolean finalizeCommandsOnStart(final Commands cmds, final VirtualMachine } else if (network.getTrafficType() == TrafficType.Public) { final Pair publicNic = new Pair(routerNic, network); publicNics.add(publicNic); - final String vlanTag = BroadcastDomainType.getValue(routerNic.getBroadcastUri()); + String vlanTag = null; + if (Objects.nonNull(routerNic.getBroadcastUri())) { + vlanTag = BroadcastDomainType.getValue(routerNic.getBroadcastUri()); + } else { + vlanTag = "nsx-"+routerNic.getIPv4Address(); + } vlanMacAddress.put(vlanTag, routerNic.getMacAddress()); } } diff --git a/server/src/test/java/com/cloud/vpc/MockConfigurationManagerImpl.java b/server/src/test/java/com/cloud/vpc/MockConfigurationManagerImpl.java index 21bf3d57ff28..aba5a744559b 100644 --- a/server/src/test/java/com/cloud/vpc/MockConfigurationManagerImpl.java +++ b/server/src/test/java/com/cloud/vpc/MockConfigurationManagerImpl.java @@ -556,7 +556,7 @@ public NetworkOfferingVO createNetworkOffering(String name, String displayText, */ @Override public Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, boolean forSystemVms, Long podId, String startIP, String endIP, - String vlanGateway, String vlanNetmask, String vlanId, boolean bypassVlanOverlapCheck, Domain domain, Account vlanOwner, String startIPv6, String endIPv6, String vlanGatewayv6, String vlanCidrv6) + String vlanGateway, String vlanNetmask, String vlanId, boolean bypassVlanOverlapCheck, Domain domain, Account vlanOwner, String startIPv6, String endIPv6, String vlanGatewayv6, String vlanCidrv6, boolean forNsx) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException { // TODO Auto-generated method stub return null; diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index aa3b843780b1..94ecd52b61f5 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -1555,6 +1555,7 @@ "label.public.ips": "Public IP addresses", "label.public.lb": "Public LB", "label.public.traffic": "Public traffic", +"label.public.traffic.nsx": "NSX Public traffic", "label.publicinterface": "Public interface", "label.publicip": "IP address", "label.publicipid": "IP address ID", @@ -1969,7 +1970,9 @@ "label.systemvm": "System VM", "label.systemvmtype": "System VM type", "label.tag": "Tag", +"label.tag.nsx": "nsx", "label.tag.key": "Tag key", +"label.tag.systemvm": "systemvm", "label.tag.value": "Tag value", "label.tagged": "Tagged", "label.tags": "Tags", diff --git a/ui/src/views/infra/zone/IpAddressRangeForm.vue b/ui/src/views/infra/zone/IpAddressRangeForm.vue index 22332952622f..c1a42f3589ef 100644 --- a/ui/src/views/infra/zone/IpAddressRangeForm.vue +++ b/ui/src/views/infra/zone/IpAddressRangeForm.vue @@ -31,9 +31,15 @@ :pagination="false" style="margin-bottom: 24px; width: 100%" >