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 => {

Reply via email to