vlanDbIds = publicIps.stream()
+ .filter(x -> !x.isForSystemVms())
+ .map(IPAddressVO::getVlanId)
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(vlanDbIds)) {
+ String msg = "Cannot find a public IP range VLAN range for the Netris Public traffic";
+ logger.error(msg);
+ throw new CloudRuntimeException(msg);
+ }
+ 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 false;
+ }
+ 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);
+ NetrisAnswer answer = sendNetrisCommand(cmd, zoneId);
+ if (!answer.getResult()) {
+ throw new CloudRuntimeException("Netris Public IP Range setup failed, please check the logs");
+ }
+ }
+ }
+ return true;
+ }
+
@Override
public boolean createVpcResource(long zoneId, long accountId, long domainId, Long vpcId, String vpcName, boolean sourceNatEnabled, String cidr, boolean isVpc) {
CreateNetrisVpcCommand cmd = new CreateNetrisVpcCommand(zoneId, accountId, domainId, vpcName, cidr, vpcId, isVpc);
diff --git a/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisProviderServiceImplTest.java b/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisServiceImplTest.java
similarity index 90%
rename from plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisProviderServiceImplTest.java
rename to plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisServiceImplTest.java
index 233787d9004..807324f404a 100644
--- a/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisProviderServiceImplTest.java
+++ b/plugins/network-elements/netris/src/test/java/org/apache/cloudstack/service/NetrisServiceImplTest.java
@@ -19,9 +19,9 @@ package org.apache.cloudstack.service;
import org.junit.Assert;
import org.junit.Test;
-public class NetrisProviderServiceImplTest {
+public class NetrisServiceImplTest {
- private NetrisProviderServiceImpl service = new NetrisProviderServiceImpl();
+ private NetrisServiceImpl service = new NetrisServiceImpl();
@Test
public void testCalculateSubnetCidrFromIpRange() {
diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
index 0f8f00faaa1..5db38ef83fc 100644
--- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -47,6 +47,7 @@ import javax.naming.ConfigurationException;
import com.cloud.network.dao.NetrisProviderDao;
import com.cloud.network.element.NetrisProviderVO;
+import com.cloud.network.netris.NetrisService;
import org.apache.cloudstack.acl.SecurityChecker;
import org.apache.cloudstack.affinity.AffinityGroup;
import org.apache.cloudstack.affinity.AffinityGroupService;
@@ -474,6 +475,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
NsxProviderDao nsxProviderDao;
@Inject
NetrisProviderDao netrisProviderDao;
+ @Inject
+ NetrisService netrisService;
// FIXME - why don't we have interface for DataCenterLinkLocalIpAddressDao?
@Inject
@@ -4577,6 +4580,17 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
throw new InvalidParameterValueException("Unable to find zone by id " + zoneId);
}
+ // If external provider is provided, verify zone has that provider enabled
+ Provider provider = cmd.getProvider();
+ if (Objects.nonNull(provider)) {
+ boolean unsupported =
+ (Provider.Nsx == provider && nsxProviderDao.findByZoneId(zoneId) == null) ||
+ (Provider.Netris == provider && netrisProviderDao.findByZoneId(zoneId) == null);
+ if (unsupported) {
+ throw new InvalidParameterValueException(String.format("Cannot add public IP range as the zone does not support provider: %s", provider.getName()));
+ }
+ }
+
// verify that physical network exists
PhysicalNetworkVO pNtwk = null;
if (physicalNetworkId != null) {
@@ -4748,6 +4762,9 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
}
});
+ if (provider == Provider.Netris) {
+ netrisService.createIPAMAllocationsForZoneLevelPublicRanges(zoneId);
+ }
messageBus.publish(_name, MESSAGE_CREATE_VLAN_IP_RANGE_EVENT, PublishScope.LOCAL, vlan);
return vlan;
diff --git a/ui/src/views/infra/network/IpRangesTabPublic.vue b/ui/src/views/infra/network/IpRangesTabPublic.vue
index 3955b8c0359..0f3610f5e05 100644
--- a/ui/src/views/infra/network/IpRangesTabPublic.vue
+++ b/ui/src/views/infra/network/IpRangesTabPublic.vue
@@ -244,6 +244,16 @@
+
+
+
+
+
+
+ {{ $t('label.nsx') }}
+ {{ $t('label.netris') }}
+
+
@@ -633,6 +643,7 @@ export default {
params.podid = values.podid
params.networkid = this.network.id
}
+ params.provider = values.provider
api('createVlanIpRange', params).then(() => {
this.$notification.success({
message: this.$t('message.success.add.iprange')