This is an automated email from the ASF dual-hosted git repository. pearl11594 pushed a commit to branch netris-integration-upstream in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit f1f3450700adff593ece5fd991679025b5d15e33 Author: Nicolas Vazquez <[email protected]> AuthorDate: Tue Nov 26 15:25:46 2024 +0100 Fix VR Public IP address (#20) * Fix VR Public IP address * Do not set the Public IP range on Netris side that is not part of the Netris IP Public Pool * Leave only systemvms tag for the first element * Fix NSX compatibility --- .../service/NetrisProviderServiceImpl.java | 41 +++++++++++++--------- .../java/com/cloud/network/vpc/VpcManagerImpl.java | 5 ++- ui/src/views/infra/zone/IpAddressRangeForm.vue | 6 ++-- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisProviderServiceImpl.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisProviderServiceImpl.java index 2887e03a1f5..119a4c80f94 100644 --- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisProviderServiceImpl.java +++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisProviderServiceImpl.java @@ -18,9 +18,11 @@ package org.apache.cloudstack.service; import com.cloud.agent.api.Answer; import com.cloud.dc.DataCenterVO; +import com.cloud.dc.VlanDetailsVO; import com.cloud.dc.VlanVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.VlanDao; +import com.cloud.dc.dao.VlanDetailsDao; import com.cloud.exception.InvalidParameterValueException; import com.cloud.host.DetailVO; import com.cloud.host.Host; @@ -45,6 +47,7 @@ import com.google.common.annotations.VisibleForTesting; import inet.ipaddr.IPAddress; import inet.ipaddr.IPAddressString; import org.apache.cloudstack.agent.api.SetupNetrisPublicRangeCommand; +import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseResponse; import org.apache.cloudstack.api.command.AddNetrisProviderCmd; import org.apache.cloudstack.api.command.DeleteNetrisProviderCmd; @@ -87,6 +90,8 @@ public class NetrisProviderServiceImpl implements NetrisProviderService { private IPAddressDao ipAddressDao; @Inject private VlanDao vlanDao; + @Inject + private VlanDetailsDao vlanDetailsDao; @Override public NetrisProvider addProvider(AddNetrisProviderCmd cmd) { @@ -193,22 +198,26 @@ public class NetrisProviderServiceImpl implements NetrisProviderService { logger.error(msg); throw new CloudRuntimeException(msg); } - if (vlanDbIds.size() > 1) { - logger.warn("Expected one Netris Public IP range but found {}. Using the first one to create the Netris IPAM allocation and NAT subnet", vlanDbIds.size()); - } - VlanVO vlanRecord = vlanDao.findById(vlanDbIds.get(0)); - if (vlanRecord == null) { - logger.error("Cannot set up the Netris Public IP range as it cannot find the public range on database"); - return; - } - String gateway = vlanRecord.getVlanGateway(); - String netmask = vlanRecord.getVlanNetmask(); - String ipRange = vlanRecord.getIpRange(); - SetupNetrisPublicRangeCommand cmd = createSetupPublicRangeCommand(zoneId, gateway, netmask, ipRange); - Answer answer = netrisResource.executeRequest(cmd); - boolean result = answer != null && answer.getResult(); - if (!result) { - throw new CloudRuntimeException("Netris Public IP Range setup failed, please check the logs"); + for (Long vlanDbId : vlanDbIds) { + VlanVO vlanRecord = vlanDao.findById(vlanDbId); + if (vlanRecord == null) { + logger.error("Cannot set up the Netris Public IP range as it cannot find the public range on database"); + return; + } + VlanDetailsVO vlanDetail = vlanDetailsDao.findDetail(vlanDbId, ApiConstants.NETRIS_DETAIL_KEY); + if (vlanDetail == null) { + logger.debug("Skipping the Public IP range {} creation on Netris as it does not belong to the Netris Public IP Pool", vlanRecord.getIpRange()); + continue; + } + String gateway = vlanRecord.getVlanGateway(); + String netmask = vlanRecord.getVlanNetmask(); + String ipRange = vlanRecord.getIpRange(); + SetupNetrisPublicRangeCommand cmd = createSetupPublicRangeCommand(zoneId, gateway, netmask, ipRange); + Answer answer = netrisResource.executeRequest(cmd); + boolean result = answer != null && answer.getResult(); + if (!result) { + throw new CloudRuntimeException("Netris Public IP Range setup failed, please check the logs"); + } } } } diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java index 50c94148b71..39fbe9bb0fe 100644 --- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java @@ -3385,7 +3385,10 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis ipToReturn = PublicIp.createFromAddrAndVlan(sourceNatIp, _vlanDao.findById(sourceNatIp.getVlanId())); } else { if (forNsx || forNetris) { - ipToReturn = _ipAddrMgr.assignPublicIpAddress(dcId, podId, owner, Vlan.VlanType.VirtualNetwork, null, null, false, true); + // Assign VR (helper VM) public NIC IP address from the separate provider Public IP range/pool + // NSX: VR uses Public IP from the system VM range + // Netris: VR uses Public IP from the non system VM range + ipToReturn = _ipAddrMgr.assignPublicIpAddress(dcId, podId, owner, Vlan.VlanType.VirtualNetwork, null, null, false, forNsx); } else { ipToReturn = _ipAddrMgr.assignDedicateIpAddress(owner, null, vpc.getId(), dcId, true); } diff --git a/ui/src/views/infra/zone/IpAddressRangeForm.vue b/ui/src/views/infra/zone/IpAddressRangeForm.vue index 04d7ad4152f..4c9af84a8f8 100644 --- a/ui/src/views/infra/zone/IpAddressRangeForm.vue +++ b/ui/src/views/infra/zone/IpAddressRangeForm.vue @@ -30,12 +30,12 @@ :columns="columns" :pagination="false" style="margin-bottom: 24px; width: 100%" > - <template #bodyCell="{ column, record }"> + <template #bodyCell="{ column, record, index }"> <template v-if="column.key === 'gateway'"> <div> {{ record.gateway }}</div> <div v-if="record.fornsx"> <a-tag color="processing"> {{ $t('label.tag.nsx') }} </a-tag> </div> <div v-else-if="record.fornetris"> <a-tag color="processing"> {{ $t('label.tag.netris') }} </a-tag> </div> - <div v-else-if="isNsxZone || isNetrisZone"> <a-tag color="processing"> {{ $t('label.tag.systemvm') }} </a-tag> </div> + <div v-else-if="index === 0 && (isNsxZone || isNetrisZone)"> <a-tag color="processing"> {{ $t('label.tag.systemvm') }} </a-tag> </div> </template> <template v-if="column.key === 'actions'"> <tooltip-button @@ -281,7 +281,7 @@ export default { endIp: values.endIp, fornsx: this.forNsx, fornetris: this.forNetris, - forsystemvms: (this.isNsxZone && !this.forNsx) || (this.isNetrisZone && !this.forNetris) + forsystemvms: (this.isNsxZone && !this.forNsx) || (this.isNetrisZone && !this.forNetris && key === 0) // Set only the first public IP range for system VMs on a Netris Zone creation }) this.formRef.value.resetFields() }).catch(error => {
