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

pearl11594 pushed a commit to branch nsx-integration
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 446dd837a5ea24dff278f20df96659c829211656
Author: Pearl Dsilva <[email protected]>
AuthorDate: Tue Aug 15 07:23:08 2023 -0400

    NSX integration - skeletal code
---
 api/src/main/java/com/cloud/network/Network.java   |   3 +
 .../java/com/cloud/offering/NetworkOffering.java   |   1 +
 client/pom.xml                                     |   5 +
 .../engine/orchestration/NetworkOrchestrator.java  |  19 ++-
 plugins/network-elements/nsx/pom.xml               |  32 ++++
 .../org/apache/cloudstack/service/NsxElement.java  | 178 +++++++++++++++++++++
 .../org/apache/cloudstack/service/NsxService.java  |   4 +
 .../apache/cloudstack/service/NsxServiceImpl.java  |   4 +
 .../META-INF.cloudstack.nsx/module.properties      |  21 +++
 .../META-INF.cloudstack.nsx/spring-nsx-context.xml |  32 ++++
 plugins/pom.xml                                    |   1 +
 .../java/com/cloud/network/NetworkServiceImpl.java |  17 ++
 12 files changed, 315 insertions(+), 2 deletions(-)

diff --git a/api/src/main/java/com/cloud/network/Network.java 
b/api/src/main/java/com/cloud/network/Network.java
index 458169c80aa..be0753e3e91 100644
--- a/api/src/main/java/com/cloud/network/Network.java
+++ b/api/src/main/java/com/cloud/network/Network.java
@@ -205,6 +205,9 @@ public interface Network extends ControlledEntity, 
StateObject<Network.State>, I
         //Add Tungsten Fabric provider
         public static final Provider Tungsten = new Provider("Tungsten", 
false);
 
+        //TODO: should it be true?
+        public static final Provider Nsx = new Provider("Nsx", false);
+
         private final String name;
         private final boolean isExternal;
 
diff --git a/api/src/main/java/com/cloud/offering/NetworkOffering.java 
b/api/src/main/java/com/cloud/offering/NetworkOffering.java
index 207880ea28c..7f0dc85b05f 100644
--- a/api/src/main/java/com/cloud/offering/NetworkOffering.java
+++ b/api/src/main/java/com/cloud/offering/NetworkOffering.java
@@ -52,6 +52,7 @@ public interface NetworkOffering extends 
InfrastructureEntity, InternalIdentity,
 
     public final static String DefaultSharedNetworkOfferingWithSGService = 
"DefaultSharedNetworkOfferingWithSGService";
     public static final String 
DEFAULT_TUNGSTEN_SHARED_NETWORK_OFFERING_WITH_SGSERVICE = 
"DefaultTungstenSharedNetworkOfferingWithSGService";
+    public static final String DEFAULT_NSX_OFFERING = 
"DefaultNSXNetworkOffering";
     public final static String QuickCloudNoServices = "QuickCloudNoServices";
     public final static String 
DefaultIsolatedNetworkOfferingWithSourceNatService = 
"DefaultIsolatedNetworkOfferingWithSourceNatService";
     public final static String OvsIsolatedNetworkOfferingWithSourceNatService 
= "OvsIsolatedNetworkOfferingWithSourceNatService";
diff --git a/client/pom.xml b/client/pom.xml
index cbe45d88b6c..5c84ce2c02b 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -226,6 +226,11 @@
             <artifactId>cloud-plugin-network-tungsten</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.cloudstack</groupId>
+            <artifactId>cloud-plugin-network-nsx</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <dependency>
             <groupId>org.apache.cloudstack</groupId>
             <artifactId>cloud-plugin-network-elb</artifactId>
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 4ff295be78a..77b14d31387 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
@@ -469,6 +469,7 @@ public class NetworkOrchestrator extends ManagerBase 
implements NetworkOrchestra
         final Map<Network.Service, Set<Network.Provider>> 
defaultSharedNetworkOfferingProviders = new HashMap<Network.Service, 
Set<Network.Provider>>();
         final Set<Network.Provider> defaultProviders = new 
HashSet<Network.Provider>();
         final Set<Network.Provider> tungstenProvider = new HashSet<>();
+        final Set<Network.Provider> nsxProvider = new HashSet<>();
 
         defaultProviders.add(Network.Provider.VirtualRouter);
         defaultSharedNetworkOfferingProviders.put(Service.Dhcp, 
defaultProviders);
@@ -502,6 +503,12 @@ public class NetworkOrchestrator extends ManagerBase 
implements NetworkOrchestra
         
defaultTungstenSharedSGEnabledNetworkOfferingProviders.put(Service.UserData, 
tungstenProvider);
         
defaultTungstenSharedSGEnabledNetworkOfferingProviders.put(Service.SecurityGroup,
 tungstenProvider);
 
+        nsxProvider.add(Provider.Nsx);
+        final Map<Network.Service, Set<Network.Provider>> 
defaultNSXEnabledNetworkOfferingProviders = new HashMap<>();
+        defaultNSXEnabledNetworkOfferingProviders.put(Service.Connectivity, 
nsxProvider);
+        defaultNSXEnabledNetworkOfferingProviders.put(Service.Dhcp, 
nsxProvider);
+        defaultNSXEnabledNetworkOfferingProviders.put(Service.Dns, 
nsxProvider);
+
         final Map<Network.Service, Set<Network.Provider>> 
defaultIsolatedSourceNatEnabledNetworkOfferingProviders = new 
HashMap<Network.Service, Set<Network.Provider>>();
         defaultProviders.clear();
         defaultProviders.add(Network.Provider.VirtualRouter);
@@ -578,6 +585,14 @@ public class NetworkOrchestrator extends ManagerBase 
implements NetworkOrchestra
                             defaultVPCOffProviders, true, 
Network.GuestType.Isolated, false, null, false, null, false, false, null, 
false, null, true, true, false, null, null, true, null);
                 }
 
+                if 
(_networkOfferingDao.findByUniqueName(NetworkOffering.DEFAULT_NSX_OFFERING) == 
null) {
+                    offering = 
_configMgr.createNetworkOffering(NetworkOffering.DEFAULT_NSX_OFFERING, 
"Offering for Nsx networks",
+                            TrafficType.Guest, null, false, 
Availability.Optional, null,
+                            defaultNSXEnabledNetworkOfferingProviders, true, 
Network.GuestType.Isolated, false, null, false, null, false, false, null, 
false, null, true, true, false, null, null, true, null);
+                    offering.setState(NetworkOffering.State.Enabled);
+                    _networkOfferingDao.update(offering.getId(), offering);
+                }
+
                 //#6 - default vpc offering with no LB service
                 if 
(_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB)
 == null) {
                     //remove LB service
@@ -3793,8 +3808,8 @@ public class NetworkOrchestrator extends ManagerBase 
implements NetworkOrchestra
 
         for (final NicVO nic : result) {
             if (_networkModel.isProviderForNetwork(Provider.NiciraNvp, 
nic.getNetworkId())) {
-                //For NSX Based networks, add nsxlogicalswitch, 
nsxlogicalswitchport to each result
-                s_logger.info("Listing NSX logical switch and logical switch 
por for each nic");
+                //For Nsx Based networks, add nsxlogicalswitch, 
nsxlogicalswitchport to each result
+                s_logger.info("Listing Nsx logical switch and logical switch 
por for each nic");
                 final NetworkVO network = 
_networksDao.findById(nic.getNetworkId());
                 final NetworkGuru guru = 
AdapterBase.getAdapterByName(networkGurus, network.getGuruName());
                 final NetworkGuruAdditionalFunctions guruFunctions = 
(NetworkGuruAdditionalFunctions) guru;
diff --git a/plugins/network-elements/nsx/pom.xml 
b/plugins/network-elements/nsx/pom.xml
new file mode 100644
index 00000000000..9350e2aedaf
--- /dev/null
+++ b/plugins/network-elements/nsx/pom.xml
@@ -0,0 +1,32 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>cloud-plugin-network-nsx</artifactId>
+    <name>Apache CloudStack Plugin - NSX Network</name>
+
+    <parent>
+        <groupId>org.apache.cloudstack</groupId>
+        <artifactId>cloudstack-plugins</artifactId>
+        <version>4.19.0.0-SNAPSHOT</version>
+        <relativePath>../../pom.xml</relativePath>
+    </parent>
+</project>
diff --git 
a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java
 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java
new file mode 100644
index 00000000000..c6c305c73e9
--- /dev/null
+++ 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java
@@ -0,0 +1,178 @@
+package org.apache.cloudstack.service;
+
+import com.cloud.deploy.DeployDestination;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.Network;
+import com.cloud.network.PhysicalNetworkServiceProvider;
+import com.cloud.network.element.DhcpServiceProvider;
+import com.cloud.network.element.DnsServiceProvider;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.utils.component.AdapterBase;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachineProfile;
+import org.apache.log4j.Logger;
+
+import javax.naming.ConfigurationException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+public class NsxElement extends AdapterBase implements DhcpServiceProvider, 
DnsServiceProvider {
+    private static final Logger LOGGER = Logger.getLogger(NsxElement.class);
+
+    private final Map<Network.Service, Map<Network.Capability, String>> 
capabilities = initCapabilities();
+
+
+    private static Map<Network.Service, Map<Network.Capability, String>> 
initCapabilities() {
+        Map<Network.Service, Map<Network.Capability, String>> capabilities = 
new HashMap<>();
+        Map<Network.Capability, String> dhcpCapabilities = 
Map.of(Network.Capability.DhcpAccrossMultipleSubnets, "true");
+        capabilities.put(Network.Service.Dhcp, dhcpCapabilities);
+        Map<Network.Capability, String> dnsCapabilities = new HashMap<>();
+        dnsCapabilities.put(Network.Capability.AllowDnsSuffixModification, 
"true");
+        capabilities.put(Network.Service.Dns, dnsCapabilities);
+        capabilities.put(Network.Service.Connectivity, null);
+        return capabilities;
+    }
+    @Override
+    public boolean addDhcpEntry(Network network, NicProfile nic, 
VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) 
throws ConcurrentOperationException, InsufficientCapacityException, 
ResourceUnavailableException {
+        return true;
+    }
+
+    @Override
+    public boolean configDhcpSupportForSubnet(Network network, NicProfile nic, 
VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) 
throws ConcurrentOperationException, InsufficientCapacityException, 
ResourceUnavailableException {
+        return true;
+    }
+
+    @Override
+    public boolean removeDhcpSupportForSubnet(Network network) throws 
ResourceUnavailableException {
+        return true;
+    }
+
+    @Override
+    public boolean setExtraDhcpOptions(Network network, long nicId, 
Map<Integer, String> dhcpOptions) {
+        return true;
+    }
+
+    @Override
+    public boolean removeDhcpEntry(Network network, NicProfile nic, 
VirtualMachineProfile vmProfile) throws ResourceUnavailableException {
+        return true;
+    }
+
+    @Override
+    public boolean addDnsEntry(Network network, NicProfile nic, 
VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) 
throws ConcurrentOperationException, InsufficientCapacityException, 
ResourceUnavailableException {
+        return true;
+    }
+
+    @Override
+    public boolean configDnsSupportForSubnet(Network network, NicProfile nic, 
VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) 
throws ConcurrentOperationException, InsufficientCapacityException, 
ResourceUnavailableException {
+        return true;
+    }
+
+    @Override
+    public boolean removeDnsSupportForSubnet(Network network) throws 
ResourceUnavailableException {
+        return true;
+    }
+
+    @Override
+    public Map<Network.Service, Map<Network.Capability, String>> 
getCapabilities() {
+        return capabilities;
+    }
+
+    @Override
+    public Network.Provider getProvider() {
+        return Network.Provider.Nsx;
+    }
+
+    @Override
+    public boolean implement(Network network, NetworkOffering offering, 
DeployDestination dest, ReservationContext context) throws 
ConcurrentOperationException, ResourceUnavailableException, 
InsufficientCapacityException {
+        return false;
+    }
+
+    @Override
+    public boolean prepare(Network network, NicProfile nic, 
VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) 
throws ConcurrentOperationException, ResourceUnavailableException, 
InsufficientCapacityException {
+        return false;
+    }
+
+    @Override
+    public boolean release(Network network, NicProfile nic, 
VirtualMachineProfile vm, ReservationContext context) throws 
ConcurrentOperationException, ResourceUnavailableException {
+        return false;
+    }
+
+    @Override
+    public boolean shutdown(Network network, ReservationContext context, 
boolean cleanup) throws ConcurrentOperationException, 
ResourceUnavailableException {
+        return false;
+    }
+
+    @Override
+    public boolean destroy(Network network, ReservationContext context) throws 
ConcurrentOperationException, ResourceUnavailableException {
+        return false;
+    }
+
+    @Override
+    public boolean isReady(PhysicalNetworkServiceProvider provider) {
+        return false;
+    }
+
+    @Override
+    public boolean shutdownProviderInstances(PhysicalNetworkServiceProvider 
provider, ReservationContext context) throws ConcurrentOperationException, 
ResourceUnavailableException {
+        return false;
+    }
+
+    @Override
+    public boolean canEnableIndividualServices() {
+        return false;
+    }
+
+    @Override
+    public boolean verifyServicesCombination(Set<Network.Service> services) {
+        return false;
+    }
+
+    @Override
+    public String getName() {
+        return null;
+    }
+
+    @Override
+    public void setName(String name) {
+
+    }
+
+    @Override
+    public void setConfigParams(Map<String, Object> params) {
+
+    }
+
+    @Override
+    public Map<String, Object> getConfigParams() {
+        return null;
+    }
+
+    @Override
+    public int getRunLevel() {
+        return 0;
+    }
+
+    @Override
+    public void setRunLevel(int level) {
+
+    }
+
+    @Override
+    public boolean configure(String name, Map<String, Object> params) throws 
ConfigurationException {
+        return false;
+    }
+
+    @Override
+    public boolean start() {
+        return false;
+    }
+
+    @Override
+    public boolean stop() {
+        return false;
+    }
+}
diff --git 
a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxService.java
 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxService.java
new file mode 100644
index 00000000000..2782c8f050a
--- /dev/null
+++ 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxService.java
@@ -0,0 +1,4 @@
+package org.apache.cloudstack.service;
+
+public interface NsxService {
+}
diff --git 
a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxServiceImpl.java
 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxServiceImpl.java
new file mode 100644
index 00000000000..079b35b51f7
--- /dev/null
+++ 
b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxServiceImpl.java
@@ -0,0 +1,4 @@
+package org.apache.cloudstack.service;
+
+public class NsxServiceImpl implements NsxService {
+}
diff --git 
a/plugins/network-elements/nsx/src/main/resources/META-INF.cloudstack.nsx/module.properties
 
b/plugins/network-elements/nsx/src/main/resources/META-INF.cloudstack.nsx/module.properties
new file mode 100644
index 00000000000..0126f2e007f
--- /dev/null
+++ 
b/plugins/network-elements/nsx/src/main/resources/META-INF.cloudstack.nsx/module.properties
@@ -0,0 +1,21 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+name=nsx
+parent=network
\ No newline at end of file
diff --git 
a/plugins/network-elements/nsx/src/main/resources/META-INF.cloudstack.nsx/spring-nsx-context.xml
 
b/plugins/network-elements/nsx/src/main/resources/META-INF.cloudstack.nsx/spring-nsx-context.xml
new file mode 100644
index 00000000000..c7be491e247
--- /dev/null
+++ 
b/plugins/network-elements/nsx/src/main/resources/META-INF.cloudstack.nsx/spring-nsx-context.xml
@@ -0,0 +1,32 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements. See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership. The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License. You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied. See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans";
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xmlns:context="http://www.springframework.org/schema/context";
+       xmlns:aop="http://www.springframework.org/schema/aop";
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+                      
http://www.springframework.org/schema/beans/spring-beans.xsd
+                      http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop.xsd
+                      http://www.springframework.org/schema/context
+                      
http://www.springframework.org/schema/context/spring-context.xsd";>
+    <bean id="Nsx" class="org.apache.cloudstack.service.NsxElement">
+        <property name="name" value="NsxElement"/>
+    </bean>
+
+</beans>
diff --git a/plugins/pom.xml b/plugins/pom.xml
index d0661c01a2c..bc28c777db7 100755
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -110,6 +110,7 @@
         <module>network-elements/brocade-vcs</module>
         <module>network-elements/vxlan</module>
         <module>network-elements/tungsten</module>
+        <module>network-elements/nsx</module>
 
         <module>outofbandmanagement-drivers/ipmitool</module>
         <module>outofbandmanagement-drivers/nested-cloudstack</module>
diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java 
b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
index ac698f69689..c527e6af9a4 100644
--- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
@@ -4021,6 +4021,7 @@ public class NetworkServiceImpl extends ManagerBase 
implements NetworkService, C
 
                     // Add the config drive provider
                     addConfigDriveToPhysicalNetwork(pNetwork.getId());
+                    addNSXProviderToPhysicalNetwork(pNetwork.getId());
 
                     
CallContext.current().putContextParameter(PhysicalNetwork.class, 
pNetwork.getUuid());
 
@@ -5417,6 +5418,22 @@ public class NetworkServiceImpl extends ManagerBase 
implements NetworkService, C
 
     }
 
+    private PhysicalNetworkServiceProvider 
addNSXProviderToPhysicalNetwork(long physicalNetworkId) {
+        PhysicalNetworkVO pvo = 
_physicalNetworkDao.findById(physicalNetworkId);
+        DataCenterVO dvo = _dcDao.findById(pvo.getDataCenterId());
+        if (dvo.getNetworkType() == NetworkType.Advanced) {
+
+            Provider provider = Network.Provider.getProvider("Nsx");
+            if (provider == null) {
+                return null;
+            }
+
+            addProviderToPhysicalNetwork(physicalNetworkId, 
Provider.Nsx.getName(), null, null);
+            enableProvider(Provider.Nsx.getName());
+        }
+        return null;
+    }
+
     protected boolean isNetworkSystem(Network network) {
         NetworkOffering no = 
_networkOfferingDao.findByIdIncludingRemoved(network.getNetworkOfferingId());
         if (no.isSystemOnly()) {

Reply via email to