This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch 4.18
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.18 by this push:
     new 981d74825a8 Add L2 networks to Zones with SG (#7719)
981d74825a8 is described below

commit 981d74825a87727d7f8e397cad75877986c96d79
Author: Ben <[email protected]>
AuthorDate: Tue Jul 11 03:11:23 2023 -0400

    Add L2 networks to Zones with SG (#7719)
---
 .../api/command/user/network/CreateNetworkCmd.java     |  4 ++--
 .../api/command/user/network/CreateNetworkCmdTest.java | 18 +++++++++++++++++-
 .../engine/orchestration/NetworkOrchestrator.java      |  4 ++--
 .../src/main/java/com/cloud/vm/UserVmManagerImpl.java  |  6 ++++--
 ui/src/views/network/CreateL2NetworkForm.vue           |  2 +-
 ui/src/views/network/CreateNetwork.vue                 |  2 +-
 6 files changed, 27 insertions(+), 9 deletions(-)

diff --git 
a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java
 
b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java
index 8b8ce104076..5b814e77004 100644
--- 
a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java
@@ -311,10 +311,10 @@ public class CreateNetworkCmd extends BaseCmd implements 
UserCmd {
             }
         }
         if (physicalNetworkId != null) {
-            if (offering.getGuestType() == GuestType.Shared) {
+            if ((offering.getGuestType() == GuestType.Shared) || 
(offering.getGuestType() == GuestType.L2)) {
                 return physicalNetworkId;
             } else {
-                throw new InvalidParameterValueException("Physical network ID 
can be specified for networks of guest IP type " + GuestType.Shared + " only.");
+                throw new InvalidParameterValueException("Physical network ID 
can be specified for networks of guest IP type " + GuestType.Shared + " or " + 
GuestType.L2 + " only.");
             }
         } else {
             if (zoneId == null) {
diff --git 
a/api/src/test/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmdTest.java
 
b/api/src/test/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmdTest.java
index bab5688ae8a..3f5b7582802 100644
--- 
a/api/src/test/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmdTest.java
+++ 
b/api/src/test/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmdTest.java
@@ -251,7 +251,23 @@ public class CreateNetworkCmdTest {
         try {
             cmd.getPhysicalNetworkId();
         } catch (Exception e) {
-            Assert.assertTrue(e.getMessage().startsWith("Physical network ID 
can be specified for networks of guest IP type Shared only"));
+            Assert.assertTrue(e.getMessage().startsWith("Physical network ID 
can be specified for networks of guest IP type Shared or L2 only."));
+        }
+    }
+
+    @Test
+    public void testGetPhysicalNetworkIdForL2Net() {
+        Long physicalNetworkId = 1L;
+        Long networkOfferingId = 1L;
+        ReflectionTestUtils.setField(cmd, "networkOfferingId", 
networkOfferingId);
+        NetworkOffering networkOffering = Mockito.mock(NetworkOffering.class);
+        ReflectionTestUtils.setField(cmd, "physicalNetworkId", 
physicalNetworkId);
+        Mockito.when(_entityMgr.findById(NetworkOffering.class, 
networkOfferingId)).thenReturn(networkOffering);
+        
Mockito.when(networkOffering.getGuestType()).thenReturn(Network.GuestType.L2);
+        try {
+            Assert.assertEquals(cmd.getPhysicalNetworkId(), physicalNetworkId);
+        } catch (Exception e) {
+            Assert.fail("Failed to get physical network id");
         }
     }
 
diff --git 
a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
 
b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
index a3714ba79fc..2f3e128bcaa 100644
--- 
a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
+++ 
b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
@@ -2665,8 +2665,8 @@ public class NetworkOrchestrator extends ManagerBase 
implements NetworkOrchestra
                 }
                 // Only Account specific Isolated network with sourceNat 
service disabled are allowed in security group
                 // enabled zone
-                if (ntwkOff.getGuestType() != GuestType.Shared) {
-                    throw new InvalidParameterValueException("Only shared 
guest network can be created in security group enabled zone");
+                if ((ntwkOff.getGuestType() != GuestType.Shared) && 
(ntwkOff.getGuestType() != GuestType.L2)) {
+                    throw new InvalidParameterValueException("Only shared or 
L2 guest network can be created in security group enabled zone");
                 }
                 if 
(_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), 
Service.SourceNat)) {
                     throw new InvalidParameterValueException("Service 
SourceNat is not allowed in security group enabled zone");
diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index b4e8e137984..7ec3450acb1 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -236,6 +236,7 @@ import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
 import com.cloud.hypervisor.kvm.dpdk.DpdkHelper;
 import com.cloud.network.IpAddressManager;
 import com.cloud.network.Network;
+import com.cloud.network.Network.GuestType;
 import com.cloud.network.Network.IpAddresses;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
@@ -3584,13 +3585,14 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
 
             for (Long networkId : networkIdList) {
                 NetworkVO network = _networkDao.findById(networkId);
+                NetworkOffering ntwkOffering = 
_networkOfferingDao.findById(network.getNetworkOfferingId());
 
                 if (network == null) {
                     throw new InvalidParameterValueException("Unable to find 
network by id " + networkId);
                 }
 
-                if (!_networkModel.isSecurityGroupSupportedInNetwork(network)) 
{
-                    throw new InvalidParameterValueException("Network is not 
security group enabled: " + network.getId());
+                if (!_networkModel.isSecurityGroupSupportedInNetwork(network) 
&& (ntwkOffering.getGuestType() != GuestType.L2)) {
+                    throw new InvalidParameterValueException("Network is not 
security group enabled or not L2 network: " + network.getId());
                 }
 
                 _accountMgr.checkAccess(owner, AccessType.UseEntry, false, 
network);
diff --git a/ui/src/views/network/CreateL2NetworkForm.vue 
b/ui/src/views/network/CreateL2NetworkForm.vue
index 56d34b2a6bc..b5f5763e628 100644
--- a/ui/src/views/network/CreateL2NetworkForm.vue
+++ b/ui/src/views/network/CreateL2NetworkForm.vue
@@ -315,7 +315,7 @@ export default {
       api('listZones', params).then(json => {
         for (const i in json.listzonesresponse.zone) {
           const zone = json.listzonesresponse.zone[i]
-          if (zone.networktype === 'Advanced' && zone.securitygroupsenabled 
!== true) {
+          if (zone.networktype === 'Advanced') {
             this.zones.push(zone)
           }
         }
diff --git a/ui/src/views/network/CreateNetwork.vue 
b/ui/src/views/network/CreateNetwork.vue
index 82aef814037..4ead6ba6525 100644
--- a/ui/src/views/network/CreateNetwork.vue
+++ b/ui/src/views/network/CreateNetwork.vue
@@ -26,7 +26,7 @@
           @refresh-data="refreshParent"
           @refresh="handleRefresh"/>
       </a-tab-pane>
-      <a-tab-pane :tab="$t('label.l2')" key="3" 
v-if="isAdvancedZoneWithoutSGAvailable">
+      <a-tab-pane :tab="$t('label.l2')" key="3">
         <CreateL2NetworkForm
           :loading="loading"
           :resource="resource"

Reply via email to