You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mu...@apache.org on 2013/02/01 08:12:32 UTC

[1/2] bigswitch controller support

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/736b236e/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElement.java b/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElement.java
new file mode 100644
index 0000000..35e4bdb
--- /dev/null
+++ b/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElement.java
@@ -0,0 +1,543 @@
+// 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.
+package com.cloud.network.element;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.ejb.Local;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.CreateVnsPortAnswer;
+import com.cloud.agent.api.CreateVnsPortCommand;
+import com.cloud.agent.api.DeleteVnsPortAnswer;
+import com.cloud.agent.api.DeleteVnsPortCommand;
+import com.cloud.agent.api.StartupBigSwitchVnsCommand;
+import com.cloud.agent.api.StartupCommand;
+import com.cloud.api.ApiDBUtils;
+import com.cloud.api.commands.AddBigSwitchVnsDeviceCmd;
+import com.cloud.api.commands.DeleteBigSwitchVnsDeviceCmd;
+import com.cloud.api.commands.ListBigSwitchVnsDevicesCmd;
+import com.cloud.api.commands.VnsConstants;
+import com.cloud.api.response.BigSwitchVnsDeviceResponse;
+import com.cloud.configuration.ConfigurationManager;
+import com.cloud.dc.dao.VlanDao;
+import com.cloud.deploy.DeployDestination;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.host.DetailVO;
+import com.cloud.host.Host;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.host.dao.HostDetailsDao;
+import com.cloud.network.BigSwitchVnsDeviceVO;
+import com.cloud.network.Network;
+import com.cloud.network.Network.Capability;
+import com.cloud.network.Network.Provider;
+import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.NetworkVO;
+import com.cloud.network.Networks;
+import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.PhysicalNetworkServiceProvider;
+import com.cloud.network.PhysicalNetworkVO;
+import com.cloud.network.dao.BigSwitchVnsDao;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkServiceMapDao;
+import com.cloud.network.dao.PhysicalNetworkDao;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
+import com.cloud.network.resource.BigSwitchVnsResource;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.resource.ResourceManager;
+import com.cloud.resource.ResourceState;
+import com.cloud.resource.ResourceStateAdapter;
+import com.cloud.resource.ServerResource;
+import com.cloud.resource.UnableDeleteHostException;
+import com.cloud.utils.component.AdapterBase;
+import com.cloud.utils.component.Inject;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineProfile;
+
+@Local(value = {NetworkElement.class, ConnectivityProvider.class})
+public class BigSwitchVnsElement extends AdapterBase implements
+             BigSwitchVnsElementService, ConnectivityProvider, ResourceStateAdapter {
+    private static final Logger s_logger = Logger.getLogger(BigSwitchVnsElement.class);
+
+    private static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();
+
+    @Inject
+    ResourceManager _resourceMgr;
+    @Inject
+    PhysicalNetworkDao _physicalNetworkDao;
+    @Inject
+    PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao;
+    @Inject
+    BigSwitchVnsDao _bigswitchVnsDao;
+    @Inject
+    HostDetailsDao _hostDetailsDao;
+    @Inject
+    HostDao _hostDao;
+    @Inject
+    AgentManager _agentMgr;
+    @Inject
+    NetworkDao _networkDao;
+    @Inject
+    NetworkModel _networkModel;
+    @Inject
+    ConfigurationManager _configMgr;
+    @Inject
+    NetworkServiceMapDao _ntwkSrvcDao;
+    @Inject
+    VlanDao _vlanDao;
+
+    @Override
+    public Map<Service, Map<Capability, String>> getCapabilities() {
+        return capabilities;
+    }
+
+    @Override
+    public Provider getProvider() {
+        return VnsConstants.BigSwitchVns;
+    }
+
+    private boolean canHandle(Network network, Service service) {
+        s_logger.debug("Checking if BigSwitchVnsElement can handle service "
+                        + service.getName() + " on network " + network.getDisplayText());
+        if (network.getBroadcastDomainType() != BroadcastDomainType.Lswitch) {
+            return false;
+        }
+
+        if (!_networkModel.isProviderForNetwork(getProvider(),
+                network.getId())) {
+            s_logger.debug("BigSwitchVnsElement is not a provider for network "
+                    + network.getDisplayText());
+            return false;
+        }
+
+        if (!_ntwkSrvcDao.canProviderSupportServiceInNetwork(network.getId(),
+                service, VnsConstants.BigSwitchVns)) {
+            s_logger.debug("BigSwitchVnsElement can't provide the "
+                    + service.getName() + " service on network "
+                    + network.getDisplayText());
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean configure(String name, Map<String, Object> params)
+            throws ConfigurationException {
+        super.configure(name, params);
+        _resourceMgr.registerResourceStateAdapter(this.getClass()
+                .getSimpleName(), this);
+        return true;
+    }
+
+    @Override
+    public boolean implement(Network network, NetworkOffering offering,
+            DeployDestination dest, ReservationContext context)
+            throws ConcurrentOperationException, ResourceUnavailableException,
+            InsufficientCapacityException {
+        s_logger.debug("entering BigSwitchVnsElement implement function for network "
+                + network.getDisplayText()
+                + " (state "
+                + network.getState()
+                + ")");
+
+        return true;
+    }
+
+    @Override
+    public boolean prepare(Network network, NicProfile nic,
+            VirtualMachineProfile<? extends VirtualMachine> vm,
+            DeployDestination dest, ReservationContext context)
+            throws ConcurrentOperationException, ResourceUnavailableException,
+            InsufficientCapacityException {
+
+        if (!canHandle(network, Service.Connectivity)) {
+            return false;
+        }
+
+        if (network.getBroadcastUri() == null) {
+            s_logger.error("Nic has no broadcast Uri with the LSwitch Uuid");
+            return false;
+        }
+
+        String mac = nic.getMacAddress();
+        String tenantId = context.getDomain().getName() + "-" + context.getAccount().getAccountId();
+
+        List<BigSwitchVnsDeviceVO> devices = _bigswitchVnsDao
+                .listByPhysicalNetwork(network.getPhysicalNetworkId());
+        if (devices.isEmpty()) {
+            s_logger.error("No BigSwitch Controller on physical network "
+                    + network.getPhysicalNetworkId());
+            return false;
+        }
+        BigSwitchVnsDeviceVO bigswitchVnsDevice = devices.get(0);
+        HostVO bigswitchVnsHost = _hostDao.findById(bigswitchVnsDevice.getHostId());
+
+        CreateVnsPortCommand cmd = new CreateVnsPortCommand(
+                network.getBroadcastUri().getSchemeSpecificPart(),
+                vm.getUuid(),
+                tenantId,
+                nic.getName(),
+                mac);
+        CreateVnsPortAnswer answer = (CreateVnsPortAnswer) _agentMgr
+                .easySend(bigswitchVnsHost.getId(), cmd);
+
+        if (answer == null || !answer.getResult()) {
+            s_logger.error("CreatePortCommand failed");
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean release(Network network, NicProfile nic,
+            VirtualMachineProfile<? extends VirtualMachine> vm,
+            ReservationContext context) throws ConcurrentOperationException,
+            ResourceUnavailableException {
+
+        if (!canHandle(network, Service.Connectivity)) {
+            return false;
+        }
+
+        if (network.getBroadcastUri() == null) {
+            s_logger.error("Nic has no broadcast Uri with the LSwitch Uuid");
+            return false;
+        }
+
+        String tenantId = context.getDomain().getName() + "-" + context.getAccount().getAccountId();
+
+        List<BigSwitchVnsDeviceVO> devices = _bigswitchVnsDao
+                .listByPhysicalNetwork(network.getPhysicalNetworkId());
+        if (devices.isEmpty()) {
+            s_logger.error("No BigSwitch Controller on physical network "
+                    + network.getPhysicalNetworkId());
+            return false;
+        }
+        BigSwitchVnsDeviceVO bigswitchVnsDevice = devices.get(0);
+        HostVO bigswitchVnsHost = _hostDao.findById(bigswitchVnsDevice.getHostId());
+
+        DeleteVnsPortCommand cmd = new DeleteVnsPortCommand(
+                network.getBroadcastUri().getSchemeSpecificPart(),
+                vm.getUuid(),
+                tenantId);
+        DeleteVnsPortAnswer answer = (DeleteVnsPortAnswer) _agentMgr
+                .easySend(bigswitchVnsHost.getId(), cmd);
+
+        if (answer == null || !answer.getResult()) {
+            s_logger.error("DeletePortCommand failed");
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean shutdown(Network network, ReservationContext context,
+            boolean cleanup) throws ConcurrentOperationException,
+            ResourceUnavailableException {
+        if (!canHandle(network, Service.Connectivity)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean destroy(Network network, ReservationContext context)
+            throws ConcurrentOperationException, ResourceUnavailableException {
+        if (!canHandle(network, Service.Connectivity)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean isReady(PhysicalNetworkServiceProvider provider) {
+        return true;
+    }
+
+    @Override
+    public boolean shutdownProviderInstances(
+            PhysicalNetworkServiceProvider provider, ReservationContext context)
+            throws ConcurrentOperationException, ResourceUnavailableException {
+        // Nothing to do here.
+        return true;
+    }
+
+    @Override
+    public boolean canEnableIndividualServices() {
+        return true;
+    }
+
+    @Override
+    public boolean verifyServicesCombination(Set<Service> services) {
+        if (!services.contains(Service.Connectivity)) {
+            s_logger.warn("Unable to provide services without Connectivity service enabled for this element");
+            return false;
+        }
+        return true;
+    }
+
+    private static Map<Service, Map<Capability, String>> setCapabilities() {
+        Map<Service, Map<Capability, String>> capabilities = new HashMap<Service, Map<Capability, String>>();
+
+        // L2 Support : SDN provisioning
+        capabilities.put(Service.Connectivity, null);
+
+        return capabilities;
+    }
+
+    @Override
+    @DB
+    public BigSwitchVnsDeviceVO addBigSwitchVnsDevice(AddBigSwitchVnsDeviceCmd cmd) {
+        ServerResource resource = new BigSwitchVnsResource();
+        String deviceName = VnsConstants.BigSwitchVns.getName();
+        NetworkDevice networkDevice = NetworkDevice
+                .getNetworkDevice(deviceName);
+        Long physicalNetworkId = cmd.getPhysicalNetworkId();
+        BigSwitchVnsDeviceVO bigswitchVnsDevice = null;
+
+        PhysicalNetworkVO physicalNetwork = _physicalNetworkDao
+                .findById(physicalNetworkId);
+        if (physicalNetwork == null) {
+            throw new InvalidParameterValueException(
+                    "Could not find phyical network with ID: "
+                            + physicalNetworkId);
+        }
+        long zoneId = physicalNetwork.getDataCenterId();
+
+        PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao
+                .findByServiceProvider(physicalNetwork.getId(),
+                        networkDevice.getNetworkServiceProvder());
+        if (ntwkSvcProvider == null) {
+            throw new CloudRuntimeException("Network Service Provider: "
+                    + networkDevice.getNetworkServiceProvder()
+                    + " is not enabled in the physical network: "
+                    + physicalNetworkId + "to add this device");
+        } else if (ntwkSvcProvider.getState() == PhysicalNetworkServiceProvider.State.Shutdown) {
+            throw new CloudRuntimeException("Network Service Provider: "
+                    + ntwkSvcProvider.getProviderName()
+                    + " is in shutdown state in the physical network: "
+                    + physicalNetworkId + "to add this device");
+        }
+
+        if (_bigswitchVnsDao.listByPhysicalNetwork(physicalNetworkId).size() != 0) {
+            throw new CloudRuntimeException(
+                    "A BigSwitch controller device is already configured on this physical network");
+        }
+
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("guid", UUID.randomUUID().toString());
+        params.put("zoneId", String.valueOf(physicalNetwork.getDataCenterId()));
+        params.put("physicalNetworkId", String.valueOf(physicalNetwork.getId()));
+        params.put("name", "BigSwitch Controller - " + cmd.getHost());
+        params.put("ip", cmd.getHost());
+        // FIXME What to do with multiple isolation types
+        params.put("transportzoneisotype",
+                physicalNetwork.getIsolationMethods().get(0).toLowerCase());
+
+        Map<String, Object> hostdetails = new HashMap<String, Object>();
+        hostdetails.putAll(params);
+
+        Transaction txn = Transaction.currentTxn();
+        try {
+            resource.configure(cmd.getHost(), hostdetails);
+
+            Host host = _resourceMgr.addHost(zoneId, resource,
+                    Host.Type.L2Networking, params);
+            if (host != null) {
+                txn.start();
+
+                bigswitchVnsDevice = new BigSwitchVnsDeviceVO(host.getId(),
+                        physicalNetworkId, ntwkSvcProvider.getProviderName(),
+                        deviceName);
+                _bigswitchVnsDao.persist(bigswitchVnsDevice);
+
+                DetailVO detail = new DetailVO(host.getId(),
+                        "bigswitchvnsdeviceid",
+                        String.valueOf(bigswitchVnsDevice.getId()));
+                _hostDetailsDao.persist(detail);
+
+                txn.commit();
+                return bigswitchVnsDevice;
+            } else {
+                throw new CloudRuntimeException(
+                        "Failed to add BigSwitch Vns Device due to internal error.");
+            }
+        } catch (ConfigurationException e) {
+            txn.rollback();
+            throw new CloudRuntimeException(e.getMessage());
+        }
+    }
+
+    @Override
+    public BigSwitchVnsDeviceResponse createBigSwitchVnsDeviceResponse(
+            BigSwitchVnsDeviceVO bigswitchVnsDeviceVO) {
+        HostVO bigswitchVnsHost = _hostDao.findById(bigswitchVnsDeviceVO.getHostId());
+        _hostDao.loadDetails(bigswitchVnsHost);
+
+        BigSwitchVnsDeviceResponse response = new BigSwitchVnsDeviceResponse();
+        response.setDeviceName(bigswitchVnsDeviceVO.getDeviceName());
+        PhysicalNetwork pnw = ApiDBUtils.findPhysicalNetworkById(bigswitchVnsDeviceVO.getPhysicalNetworkId());
+        if (pnw != null) {
+            response.setPhysicalNetworkId(pnw.getUuid());
+        }
+		response.setId(bigswitchVnsDeviceVO.getUuid());
+        response.setProviderName(bigswitchVnsDeviceVO.getProviderName());
+        response.setHostName(bigswitchVnsHost.getDetail("ip"));
+        response.setObjectName("bigswitchvnsdevice");
+        return response;
+    }
+
+    @Override
+    public boolean deleteBigSwitchVnsDevice(DeleteBigSwitchVnsDeviceCmd cmd) {
+        Long bigswitchVnsDeviceId = cmd.getBigSwitchVnsDeviceId();
+        BigSwitchVnsDeviceVO bigswitchVnsDevice = _bigswitchVnsDao
+                .findById(bigswitchVnsDeviceId);
+        if (bigswitchVnsDevice == null) {
+            throw new InvalidParameterValueException(
+                    "Could not find a BigSwitch Controller with id " + bigswitchVnsDevice);
+        }
+
+        // Find the physical network we work for
+        Long physicalNetworkId = bigswitchVnsDevice.getPhysicalNetworkId();
+        PhysicalNetworkVO physicalNetwork = _physicalNetworkDao
+                .findById(physicalNetworkId);
+        if (physicalNetwork != null) {
+            List<NetworkVO> networkList = _networkDao
+                    .listByPhysicalNetwork(physicalNetworkId);
+
+            // Networks with broadcast type lswitch are ours
+            for (NetworkVO network : networkList) {
+                if (network.getBroadcastDomainType() == Networks.BroadcastDomainType.Lswitch) {
+                    if ((network.getState() != Network.State.Shutdown)
+                            && (network.getState() != Network.State.Destroy)) {
+                        throw new CloudRuntimeException(
+                                "This BigSwitch Controller device can not be deleted as there are one or more " +
+                                "logical networks provisioned by cloudstack.");
+                    }
+                }
+            }
+        }
+
+        HostVO bigswitchHost = _hostDao.findById(bigswitchVnsDevice.getHostId());
+        Long hostId = bigswitchHost.getId();
+
+        bigswitchHost.setResourceState(ResourceState.Maintenance);
+        _hostDao.update(hostId, bigswitchHost);
+        _resourceMgr.deleteHost(hostId, false, false);
+
+        _bigswitchVnsDao.remove(bigswitchVnsDeviceId);
+        return true;
+    }
+
+    @Override
+    public List<BigSwitchVnsDeviceVO> listBigSwitchVnsDevices(
+            ListBigSwitchVnsDevicesCmd cmd) {
+        Long physicalNetworkId = cmd.getPhysicalNetworkId();
+        Long bigswitchVnsDeviceId = cmd.getBigSwitchVnsDeviceId();
+        List<BigSwitchVnsDeviceVO> responseList = new ArrayList<BigSwitchVnsDeviceVO>();
+
+        if (physicalNetworkId == null && bigswitchVnsDeviceId == null) {
+            throw new InvalidParameterValueException(
+                    "Either physical network Id or bigswitch device Id must be specified");
+        }
+
+        if (bigswitchVnsDeviceId != null) {
+            BigSwitchVnsDeviceVO bigswitchVnsDevice = _bigswitchVnsDao
+                    .findById(bigswitchVnsDeviceId);
+            if (bigswitchVnsDevice == null) {
+                throw new InvalidParameterValueException(
+                        "Could not find BigSwitch controller with id: "
+                                + bigswitchVnsDevice);
+            }
+            responseList.add(bigswitchVnsDevice);
+        } else {
+            PhysicalNetworkVO physicalNetwork = _physicalNetworkDao
+                    .findById(physicalNetworkId);
+            if (physicalNetwork == null) {
+                throw new InvalidParameterValueException(
+                        "Could not find a physical network with id: "
+                                + physicalNetworkId);
+            }
+            responseList = _bigswitchVnsDao
+                    .listByPhysicalNetwork(physicalNetworkId);
+        }
+
+        return responseList;
+    }
+
+    @Override
+    public HostVO createHostVOForConnectedAgent(HostVO host,
+            StartupCommand[] cmd) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public HostVO createHostVOForDirectConnectAgent(HostVO host,
+            StartupCommand[] startup, ServerResource resource,
+            Map<String, String> details, List<String> hostTags) {
+        if (!(startup[0] instanceof StartupBigSwitchVnsCommand)) {
+            return null;
+        }
+        host.setType(Host.Type.L2Networking);
+        return host;
+    }
+
+    @Override
+    public DeleteHostAnswer deleteHost(HostVO host, boolean isForced,
+            boolean isForceDeleteStorage) throws UnableDeleteHostException {
+        if (!(host.getType() == Host.Type.L2Networking)) {
+            return null;
+        }
+        return new DeleteHostAnswer(true);
+    }
+
+	@Override
+	public List<Class<?>> getCommands() {
+		List<Class<?>> cmdList = new ArrayList<Class<?>>();
+        cmdList.add(AddBigSwitchVnsDeviceCmd.class);
+        cmdList.add(DeleteBigSwitchVnsDeviceCmd.class);
+        cmdList.add(ListBigSwitchVnsDevicesCmd.class);
+        return cmdList;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/736b236e/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElementService.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElementService.java b/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElementService.java
new file mode 100644
index 0000000..915a2c2
--- /dev/null
+++ b/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElementService.java
@@ -0,0 +1,39 @@
+// 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.
+package com.cloud.network.element;
+
+import java.util.List;
+
+import com.cloud.api.commands.AddBigSwitchVnsDeviceCmd;
+import com.cloud.api.commands.DeleteBigSwitchVnsDeviceCmd;
+import com.cloud.api.commands.ListBigSwitchVnsDevicesCmd;
+import com.cloud.api.response.BigSwitchVnsDeviceResponse;
+import com.cloud.network.BigSwitchVnsDeviceVO;
+import com.cloud.utils.component.PluggableService;
+
+public interface BigSwitchVnsElementService extends PluggableService {
+
+    public BigSwitchVnsDeviceVO addBigSwitchVnsDevice(AddBigSwitchVnsDeviceCmd cmd);
+
+    public BigSwitchVnsDeviceResponse createBigSwitchVnsDeviceResponse(
+            BigSwitchVnsDeviceVO bigswitchDeviceVO);
+
+    boolean deleteBigSwitchVnsDevice(DeleteBigSwitchVnsDeviceCmd cmd);
+
+    List<BigSwitchVnsDeviceVO> listBigSwitchVnsDevices(ListBigSwitchVnsDevicesCmd cmd);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/736b236e/plugins/network-elements/bigswitch-vns/src/com/cloud/network/guru/BigSwitchVnsGuestNetworkGuru.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch-vns/src/com/cloud/network/guru/BigSwitchVnsGuestNetworkGuru.java b/plugins/network-elements/bigswitch-vns/src/com/cloud/network/guru/BigSwitchVnsGuestNetworkGuru.java
new file mode 100644
index 0000000..fe21163
--- /dev/null
+++ b/plugins/network-elements/bigswitch-vns/src/com/cloud/network/guru/BigSwitchVnsGuestNetworkGuru.java
@@ -0,0 +1,261 @@
+/*
+ * 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.
+ */
+
+package com.cloud.network.guru;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.CreateVnsNetworkAnswer;
+import com.cloud.agent.api.CreateVnsNetworkCommand;
+import com.cloud.agent.api.DeleteVnsNetworkCommand;
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.DataCenter.NetworkType;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.deploy.DeployDestination;
+import com.cloud.deploy.DeploymentPlan;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.host.dao.HostDetailsDao;
+import com.cloud.network.BigSwitchVnsDeviceVO;
+import com.cloud.network.Network;
+import com.cloud.network.NetworkProfile;
+import com.cloud.network.NetworkVO;
+import com.cloud.network.Network.GuestType;
+import com.cloud.network.Network.State;
+import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.PhysicalNetwork.IsolationMethod;
+import com.cloud.network.PhysicalNetworkVO;
+import com.cloud.network.dao.BigSwitchVnsDao;
+import com.cloud.network.dao.PhysicalNetworkDao;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.resource.ResourceManager;
+import com.cloud.user.Account;
+import com.cloud.user.dao.AccountDao;
+import com.cloud.utils.component.Inject;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineProfile;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import javax.ejb.Local;
+
+
+@Local(value = NetworkGuru.class)
+public class BigSwitchVnsGuestNetworkGuru extends GuestNetworkGuru {
+    private static final Logger s_logger = Logger.getLogger(BigSwitchVnsGuestNetworkGuru.class);
+
+    @Inject
+    DataCenterDao _zoneDao;
+    @Inject
+    PhysicalNetworkDao _physicalNetworkDao;
+    @Inject
+    AccountDao _accountDao;
+    @Inject
+    BigSwitchVnsDao _bigswitchVnsDao;
+    @Inject
+    HostDao _hostDao;
+    @Inject
+    ResourceManager _resourceMgr;
+    @Inject
+    AgentManager _agentMgr;
+    @Inject
+    HostDetailsDao _hostDetailsDao;
+
+    public BigSwitchVnsGuestNetworkGuru() {
+        super();
+        _isolationMethods = new IsolationMethod[] { IsolationMethod.VNS };
+    }
+
+    @Override
+    protected boolean canHandle(NetworkOffering offering, NetworkType networkType,
+                                PhysicalNetwork physicalNetwork) {
+        if (networkType == NetworkType.Advanced
+                && isMyTrafficType(offering.getTrafficType())
+                && offering.getGuestType() == Network.GuestType.Isolated
+                && isMyIsolationMethod(physicalNetwork)) {
+            return true;
+        } else {
+            s_logger.trace("We only take care of Guest networks of type   " + GuestType.Isolated +
+                        " in zone of type " + NetworkType.Advanced);
+            return false;
+        }
+    }
+
+    @Override
+    public Network design(NetworkOffering offering, DeploymentPlan plan,
+            Network userSpecified, Account owner) {
+         // Check of the isolation type of the related physical network is VNS
+        PhysicalNetworkVO physnet = _physicalNetworkDao.findById(plan.getPhysicalNetworkId());
+        if (physnet == null ||
+                        physnet.getIsolationMethods() == null ||
+                        !physnet.getIsolationMethods().contains("VNS")) {
+            s_logger.debug("Refusing to design this network, the physical isolation type is not VNS");
+            return null;
+        }
+
+        List<BigSwitchVnsDeviceVO> devices = _bigswitchVnsDao.listByPhysicalNetwork(physnet.getId());
+        if (devices.isEmpty()) {
+            s_logger.error("No BigSwitxh Controller on physical network " + physnet.getName());
+            return null;
+        }
+        s_logger.debug("BigSwitch Controller " + devices.get(0).getUuid() +
+                        " found on physical network " + physnet.getId());
+
+        s_logger.debug("Physical isolation type is VNS, asking GuestNetworkGuru to design this network");
+        NetworkVO networkObject = (NetworkVO) super.design(offering, plan, userSpecified, owner);
+        if (networkObject == null) {
+            return null;
+        }
+        // Override the broadcast domain type
+        networkObject.setBroadcastDomainType(BroadcastDomainType.Lswitch);
+
+        return networkObject;
+    }
+
+    @Override
+    public Network implement(Network network, NetworkOffering offering,
+            DeployDestination dest, ReservationContext context)
+            throws InsufficientVirtualNetworkCapcityException {
+        assert (network.getState() == State.Implementing) : "Why are we implementing " + network;
+
+        long dcId = dest.getDataCenter().getId();
+
+        //get physical network id
+        long physicalNetworkId = _networkModel.findPhysicalNetworkId(dcId,
+                                                        offering.getTags(),
+                                                        offering.getTrafficType());
+
+        NetworkVO implemented = new NetworkVO(network.getTrafficType(), network.getMode(),
+                        network.getBroadcastDomainType(), network.getNetworkOfferingId(), State.Allocated,
+                network.getDataCenterId(), physicalNetworkId);
+
+        if (network.getGateway() != null) {
+            implemented.setGateway(network.getGateway());
+        }
+
+        if (network.getCidr() != null) {
+            implemented.setCidr(network.getCidr());
+        }
+
+        String vnet = _dcDao.allocateVnet(dcId, physicalNetworkId,
+                        network.getAccountId(), context.getReservationId());
+        if (vnet == null) {
+            throw new InsufficientVirtualNetworkCapcityException("Unable to allocate vnet as a " +
+                        "part of network " + network + " implement ", DataCenter.class, dcId);
+        }
+        int vlan = Integer.parseInt(vnet);
+
+        // Name is either the given name or the uuid
+        String name = network.getName();
+        String networkUuid = implemented.getUuid();
+        if (name == null || name.isEmpty()) {
+            name = ((NetworkVO)network).getUuid();
+        }
+        if (name.length() > 64 ) {
+            name = name.substring(0, 63); // max length 64
+        }
+
+        String tenantId = context.getDomain().getName() + "-" + context.getAccount().getAccountId();
+        List<BigSwitchVnsDeviceVO> devices = _bigswitchVnsDao.listByPhysicalNetwork(physicalNetworkId);
+        if (devices.isEmpty()) {
+            s_logger.error("No BigSwitch Controller on physical network " + physicalNetworkId);
+            return null;
+        }
+        BigSwitchVnsDeviceVO bigswitchVnsDevice = devices.get(0);
+        HostVO bigswitchVnsHost = _hostDao.findById(bigswitchVnsDevice.getHostId());
+        _hostDao.loadDetails(bigswitchVnsHost);
+
+        CreateVnsNetworkCommand cmd = new CreateVnsNetworkCommand(networkUuid, name, tenantId, vlan);
+        CreateVnsNetworkAnswer answer = (CreateVnsNetworkAnswer) _agentMgr.easySend(bigswitchVnsHost.getId(), cmd);
+
+        if (answer == null || !answer.getResult()) {
+            s_logger.error ("CreateNetworkCommand failed");
+            return null;
+        }
+
+        try {
+            implemented.setBroadcastUri(new URI("vns", cmd.getNetworkUuid(), null));
+            implemented.setBroadcastDomainType(BroadcastDomainType.Lswitch);
+            s_logger.info("Implemented OK, network " + networkUuid + " in tenant " +
+                        tenantId + " linked to " + implemented.getBroadcastUri().toString());
+        } catch (URISyntaxException e) {
+            s_logger.error("Unable to store network id in broadcast uri, uuid = " + implemented.getUuid(), e);
+        }
+
+        return implemented;
+    }
+
+    @Override
+    public void reserve(NicProfile nic, Network network,
+            VirtualMachineProfile<? extends VirtualMachine> vm,
+            DeployDestination dest, ReservationContext context)
+            throws InsufficientVirtualNetworkCapcityException,
+            InsufficientAddressCapacityException {
+        // TODO Auto-generated method stub
+        super.reserve(nic, network, vm, dest, context);
+    }
+
+    @Override
+    public boolean release(NicProfile nic,
+            VirtualMachineProfile<? extends VirtualMachine> vm,
+            String reservationId) {
+        // TODO Auto-generated method stub
+        return super.release(nic, vm, reservationId);
+    }
+
+    @Override
+    public void shutdown(NetworkProfile profile, NetworkOffering offering) {
+        NetworkVO networkObject = _networkDao.findById(profile.getId());
+        if (networkObject.getBroadcastDomainType() != BroadcastDomainType.Lswitch ||
+                networkObject.getBroadcastUri() == null) {
+            s_logger.warn("BroadcastUri is empty or incorrect for guestnetwork " + networkObject.getDisplayText());
+            return;
+        }
+
+        List<BigSwitchVnsDeviceVO> devices = _bigswitchVnsDao.listByPhysicalNetwork(networkObject.getPhysicalNetworkId());
+        if (devices.isEmpty()) {
+            s_logger.error("No BigSwitch Controller on physical network " + networkObject.getPhysicalNetworkId());
+            return;
+        }
+        BigSwitchVnsDeviceVO bigswitchVnsDevice = devices.get(0);
+        HostVO bigswitchVnsHost = _hostDao.findById(bigswitchVnsDevice.getHostId());
+
+        String tenantId = profile.getNetworkDomain() + "-" + profile.getAccountId();
+
+        DeleteVnsNetworkCommand cmd = new DeleteVnsNetworkCommand(tenantId,
+                        networkObject.getBroadcastUri().getSchemeSpecificPart());
+        _agentMgr.easySend(bigswitchVnsHost.getId(), cmd);
+
+        super.shutdown(profile, offering);
+    }
+
+    @Override
+    public boolean trash(Network network, NetworkOffering offering,
+            Account owner) {
+        return super.trash(network, offering, owner);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/736b236e/plugins/network-elements/bigswitch-vns/src/com/cloud/network/resource/BigSwitchVnsResource.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch-vns/src/com/cloud/network/resource/BigSwitchVnsResource.java b/plugins/network-elements/bigswitch-vns/src/com/cloud/network/resource/BigSwitchVnsResource.java
new file mode 100644
index 0000000..52c9ba7
--- /dev/null
+++ b/plugins/network-elements/bigswitch-vns/src/com/cloud/network/resource/BigSwitchVnsResource.java
@@ -0,0 +1,322 @@
+// 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.
+package com.cloud.network.resource;
+
+import java.util.Map;
+
+import javax.naming.ConfigurationException;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.IAgentControl;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.CreateVnsNetworkAnswer;
+import com.cloud.agent.api.CreateVnsNetworkCommand;
+import com.cloud.agent.api.CreateVnsPortAnswer;
+import com.cloud.agent.api.CreateVnsPortCommand;
+import com.cloud.agent.api.DeleteVnsNetworkAnswer;
+import com.cloud.agent.api.DeleteVnsNetworkCommand;
+import com.cloud.agent.api.DeleteVnsPortAnswer;
+import com.cloud.agent.api.DeleteVnsPortCommand;
+import com.cloud.agent.api.MaintainAnswer;
+import com.cloud.agent.api.MaintainCommand;
+import com.cloud.agent.api.PingCommand;
+import com.cloud.agent.api.ReadyAnswer;
+import com.cloud.agent.api.ReadyCommand;
+import com.cloud.agent.api.StartupCommand;
+import com.cloud.agent.api.StartupBigSwitchVnsCommand;
+import com.cloud.agent.api.UpdateVnsPortAnswer;
+import com.cloud.agent.api.UpdateVnsPortCommand;
+import com.cloud.host.Host;
+import com.cloud.host.Host.Type;
+import com.cloud.network.bigswitch.BigSwitchVnsApi;
+import com.cloud.network.bigswitch.BigSwitchVnsApiException;
+import com.cloud.network.bigswitch.ControlClusterStatus;
+import com.cloud.network.bigswitch.Attachment;
+import com.cloud.network.bigswitch.Network;
+import com.cloud.network.bigswitch.Port;
+import com.cloud.resource.ServerResource;
+
+public class BigSwitchVnsResource implements ServerResource {
+    private static final Logger s_logger = Logger.getLogger(BigSwitchVnsResource.class);
+
+    private String _name;
+    private String _guid;
+    private String _zoneId;
+    private int _numRetries;
+
+    private BigSwitchVnsApi _bigswitchVnsApi;
+
+    protected BigSwitchVnsApi createBigSwitchVnsApi() {
+        return new BigSwitchVnsApi();
+    }
+
+    @Override
+    public boolean configure(String name, Map<String, Object> params)
+            throws ConfigurationException {
+
+        _name = (String) params.get("name");
+        if (_name == null) {
+            throw new ConfigurationException("Unable to find name");
+        }
+
+        _guid = (String)params.get("guid");
+        if (_guid == null) {
+            throw new ConfigurationException("Unable to find the guid");
+        }
+
+        _zoneId = (String) params.get("zoneId");
+        if (_zoneId == null) {
+            throw new ConfigurationException("Unable to find zone");
+        }
+
+        _numRetries = 2;
+
+        String ip = (String) params.get("ip");
+        if (ip == null) {
+            throw new ConfigurationException("Unable to find IP");
+        }
+
+        _bigswitchVnsApi = createBigSwitchVnsApi();
+        _bigswitchVnsApi.setControllerAddress(ip);
+
+        return true;
+    }
+
+    @Override
+    public boolean start() {
+        return true;
+    }
+
+    @Override
+    public boolean stop() {
+        return true;
+    }
+
+    @Override
+    public String getName() {
+        return _name;
+    }
+
+    @Override
+    public Type getType() {
+        // Think up a better name for this Type?
+        return Host.Type.L2Networking;
+    }
+
+    @Override
+    public StartupCommand[] initialize() {
+        StartupBigSwitchVnsCommand sc = new StartupBigSwitchVnsCommand();
+        sc.setGuid(_guid);
+        sc.setName(_name);
+        sc.setDataCenter(_zoneId);
+        sc.setPod("");
+        sc.setPrivateIpAddress("");
+        sc.setStorageIpAddress("");
+        sc.setVersion("");
+        return new StartupCommand[] { sc };
+    }
+
+        @Override
+        public PingCommand getCurrentStatus(long id) {
+        try {
+            ControlClusterStatus ccs = _bigswitchVnsApi.getControlClusterStatus();
+            if (!ccs.getStatus()) {
+                s_logger.error("ControlCluster state is not ready: " + ccs.getStatus());
+                return null;
+            }
+        } catch (BigSwitchVnsApiException e) {
+                s_logger.error("getControlClusterStatus failed", e);
+                return null;
+        }
+        return new PingCommand(Host.Type.L2Networking, id);
+        }
+
+    @Override
+    public Answer executeRequest(Command cmd) {
+        return executeRequest(cmd, _numRetries);
+    }
+
+    public Answer executeRequest(Command cmd, int numRetries) {
+        if (cmd instanceof ReadyCommand) {
+            return executeRequest((ReadyCommand) cmd);
+        }
+        else if (cmd instanceof MaintainCommand) {
+            return executeRequest((MaintainCommand)cmd);
+        }
+        else if (cmd instanceof CreateVnsNetworkCommand) {
+            return executeRequest((CreateVnsNetworkCommand)cmd, numRetries);
+        }
+        else if (cmd instanceof DeleteVnsNetworkCommand) {
+            return executeRequest((DeleteVnsNetworkCommand) cmd, numRetries);
+        }
+        else if (cmd instanceof CreateVnsPortCommand) {
+            return executeRequest((CreateVnsPortCommand) cmd, numRetries);
+        }
+        else if (cmd instanceof DeleteVnsPortCommand) {
+            return executeRequest((DeleteVnsPortCommand) cmd, numRetries);
+        }
+        else if (cmd instanceof UpdateVnsPortCommand) {
+                return executeRequest((UpdateVnsPortCommand) cmd, numRetries);
+        }
+        s_logger.debug("Received unsupported command " + cmd.toString());
+        return Answer.createUnsupportedCommandAnswer(cmd);
+    }
+
+    @Override
+    public void disconnected() {
+    }
+
+    @Override
+    public IAgentControl getAgentControl() {
+        return null;
+    }
+
+    @Override
+    public void setAgentControl(IAgentControl agentControl) {
+    }
+
+    private Answer executeRequest(CreateVnsNetworkCommand cmd, int numRetries) {
+        Network network = new Network();
+        network.setTenant_id(cmd.getTenantUuid());
+        network.setUuid(cmd.getNetworkUuid());
+        network.setDisplay_name(truncate("vns-cloudstack-" + cmd.getName(), 64));
+        network.setVlan(cmd.getVlan());
+
+        try {
+            _bigswitchVnsApi.createNetwork(network);
+            return new CreateVnsNetworkAnswer(cmd, true, "VNS " + network.getUuid() + " created");
+        } catch (BigSwitchVnsApiException e) {
+                if (numRetries > 0) {
+                        return retry(cmd, --numRetries);
+                }
+                else {
+                        return new CreateVnsNetworkAnswer(cmd, e);
+                }
+        }
+
+    }
+
+    private Answer executeRequest(DeleteVnsNetworkCommand cmd, int numRetries) {
+        try {
+            _bigswitchVnsApi.deleteNetwork(cmd.get_tenantUuid(), cmd.getNetworkUuid());
+            return new DeleteVnsNetworkAnswer(cmd, true, "VNS " + cmd.getNetworkUuid() + " deleted");
+        } catch (BigSwitchVnsApiException e) {
+                if (numRetries > 0) {
+                        return retry(cmd, --numRetries);
+                }
+                else {
+                        return new DeleteVnsNetworkAnswer(cmd, e);
+                }
+        }
+    }
+
+    private Answer executeRequest(CreateVnsPortCommand cmd, int numRetries) {
+        Port port = new Port();
+        port.setId(cmd.getPortUuid());
+        port.setName(cmd.getPortName());
+        port.setTenant_id(cmd.getTenantUuid());
+
+        try {
+            _bigswitchVnsApi.createPort(cmd.getNetworkUuid(), port);
+            try {
+                Attachment attachment = new Attachment();
+                attachment.setId(cmd.getPortUuid());
+                attachment.setMac(cmd.getMac());
+                _bigswitchVnsApi.modifyPortAttachment(cmd.getTenantUuid(),
+                                cmd.getNetworkUuid(), cmd.getPortUuid(), attachment);
+
+            } catch (BigSwitchVnsApiException ex) {
+                s_logger.warn("modifyPortAttachment failed after switchport was created, removing switchport");
+                _bigswitchVnsApi.deletePort(cmd.getTenantUuid(), cmd.getNetworkUuid(), cmd.getPortUuid());
+                throw (ex); // Rethrow the original exception
+            }
+            return new CreateVnsPortAnswer(cmd, true, "network port " + cmd.getPortUuid() + " created");
+        } catch (BigSwitchVnsApiException e) {
+                if (numRetries > 0) {
+                        return retry(cmd, --numRetries);
+                }
+                else {
+                        return new CreateVnsPortAnswer(cmd, e);
+                }
+        }
+    }
+
+    private Answer executeRequest(DeleteVnsPortCommand cmd, int numRetries) {
+        try {
+                _bigswitchVnsApi.deletePortAttachment(cmd.getTenantUuid(), cmd.getNetworkUuid(), cmd.getPortUuid());
+                try {
+                        _bigswitchVnsApi.deletePort(cmd.getTenantUuid(), cmd.getNetworkUuid(), cmd.getPortUuid());
+                } catch (BigSwitchVnsApiException ex) {
+                s_logger.warn("deletePort failed after portAttachment was removed");
+                throw (ex); // Rethrow the original exception
+            }
+                return new DeleteVnsPortAnswer(cmd, true, "network port " + cmd.getPortUuid() + " deleted");
+        } catch (BigSwitchVnsApiException e) {
+                if (numRetries > 0) {
+                        return retry(cmd, --numRetries);
+                }
+                else {
+                        return new DeleteVnsPortAnswer(cmd, e);
+                }
+        }
+    }
+
+    private Answer executeRequest(UpdateVnsPortCommand cmd, int numRetries) {
+        Port port = new Port();
+        port.setId(cmd.getPortUuid());
+        port.setName(cmd.getPortName());
+        port.setTenant_id(cmd.getTenantUuid());
+
+        try {
+            _bigswitchVnsApi.modifyPort(cmd.getNetworkUuid(), port);
+            return new UpdateVnsPortAnswer(cmd, true, "Network Port  " + cmd.getPortUuid() + " updated");
+        } catch (BigSwitchVnsApiException e) {
+                if (numRetries > 0) {
+                        return retry(cmd, --numRetries);
+                }
+                else {
+                        return new UpdateVnsPortAnswer(cmd, e);
+                }
+        }
+
+    }
+
+    private Answer executeRequest(ReadyCommand cmd) {
+        return new ReadyAnswer(cmd);
+    }
+
+    private Answer executeRequest(MaintainCommand cmd) {
+        return new MaintainAnswer(cmd);
+    }
+
+    private Answer retry(Command cmd, int numRetries) {
+        s_logger.warn("Retrying " + cmd.getClass().getSimpleName() + ". Number of retries remaining: " + numRetries);
+        return executeRequest(cmd, numRetries);
+    }
+
+    private String truncate(String string, int length) {
+        if (string.length() <= length) {
+                return string;
+        }
+        else {
+                return string.substring(0, length);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/736b236e/plugins/network-elements/bigswitch-vns/test/com/cloud/network/bigswitch/BigSwitchApiTest.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch-vns/test/com/cloud/network/bigswitch/BigSwitchApiTest.java b/plugins/network-elements/bigswitch-vns/test/com/cloud/network/bigswitch/BigSwitchApiTest.java
new file mode 100644
index 0000000..cab06ba
--- /dev/null
+++ b/plugins/network-elements/bigswitch-vns/test/com/cloud/network/bigswitch/BigSwitchApiTest.java
@@ -0,0 +1,228 @@
+// 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.
+package com.cloud.network.bigswitch;
+
+import static org.mockito.Mockito.*;
+
+import java.io.IOException;
+import java.util.Collections;
+
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.methods.DeleteMethod;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.PutMethod;
+import org.apache.commons.httpclient.params.HttpClientParams;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Test;
+
+public class BigSwitchApiTest {
+    BigSwitchVnsApi _api;
+    HttpClient _client = mock(HttpClient.class);
+    HttpMethod _method;
+
+    @Before
+    public void setUp() {
+        HttpClientParams hmp = mock(HttpClientParams.class);
+        when (_client.getParams()).thenReturn(hmp);
+        _api = new BigSwitchVnsApi() {
+            @Override
+            protected HttpClient createHttpClient() {
+                return _client;
+            }
+
+            @Override
+            protected HttpMethod createMethod(String type, String uri, int port) {
+                return _method;
+            }
+        };
+    }
+
+    @Test (expected=BigSwitchVnsApiException.class)
+    public void testExecuteUpdateObjectWithoutHostname() throws BigSwitchVnsApiException {
+        _api.setControllerAddress(null);
+        _api.executeUpdateObject(new String(), "/", Collections.<String, String> emptyMap());
+    }
+
+    @Test (expected=BigSwitchVnsApiException.class)
+    public void testExecuteCreateObjectWithoutHostname() throws BigSwitchVnsApiException {
+        _api.setControllerAddress(null);
+        _api.executeCreateObject(new String(), String.class, "/", Collections.<String, String> emptyMap());
+    }
+
+    @Test (expected=BigSwitchVnsApiException.class)
+    public void testExecuteDeleteObjectWithoutHostname() throws BigSwitchVnsApiException {
+        _api.setControllerAddress(null);
+        _api.executeDeleteObject("/");
+    }
+
+    @Test
+    public void executeMethodTest() throws BigSwitchVnsApiException {
+        GetMethod gm = mock(GetMethod.class);
+
+        when(gm.getStatusCode()).thenReturn(HttpStatus.SC_OK);
+        _api.executeMethod(gm);
+        verify(gm, times(1)).getStatusCode();
+    }
+
+    /* Bit of a roundabout way to ensure that login is called after an un authorized result
+     * It not possible to properly mock login()
+     */
+    @Test (expected=BigSwitchVnsApiException.class)
+    public void executeMethodTestWithLogin() throws BigSwitchVnsApiException, HttpException, IOException {
+        GetMethod gm = mock(GetMethod.class);
+        when(_client.executeMethod((HttpMethod)any())).thenThrow(new HttpException());
+        when(gm.getStatusCode()).thenReturn(HttpStatus.SC_UNAUTHORIZED).thenReturn(HttpStatus.SC_UNAUTHORIZED);
+        _api.executeMethod(gm);
+        verify(gm, times(1)).getStatusCode();
+    }
+
+    @Test
+    public void testExecuteCreateObject() throws BigSwitchVnsApiException, IOException {
+        _api.setControllerAddress("10.10.0.10");
+        Network network = new Network();
+        _method = mock(PostMethod.class);
+        when(_method.getStatusCode()).thenReturn(HttpStatus.SC_OK);
+        _api.executeCreateObject(network, Network.class, "/", Collections.<String, String> emptyMap());
+        verify(_method, times(1)).releaseConnection();
+
+    }
+
+    @Test (expected=BigSwitchVnsApiException.class)
+    public void testExecuteCreateObjectFailure() throws BigSwitchVnsApiException, IOException {
+        _api.setControllerAddress("10.10.0.10");
+        Network network = new Network();
+        _method = mock(PostMethod.class);
+        when(_method.getStatusCode()).thenReturn(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+        Header header = mock(Header.class);
+        when(header.getValue()).thenReturn("text/html");
+        when(_method.getResponseHeader("Content-Type")).thenReturn(header);
+        when(_method.getResponseBodyAsString()).thenReturn("Off to timbuktu, won't be back later.");
+        when(_method.isRequestSent()).thenReturn(true);
+        try {
+            _api.executeCreateObject(network, Network.class, "/", Collections.<String, String> emptyMap());
+        } finally {
+            verify(_method, times(1)).releaseConnection();
+        }
+    }
+
+    @Test (expected=BigSwitchVnsApiException.class)
+    public void testExecuteCreateObjectException() throws BigSwitchVnsApiException, IOException {
+        _api.setControllerAddress("10.10.0.10");
+        Network network = new Network();
+        when(_client.executeMethod((HttpMethod) any())).thenThrow(new HttpException());
+        _method = mock(PostMethod.class);
+        when(_method.getStatusCode()).thenReturn(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+        Header header = mock(Header.class);
+        when(header.getValue()).thenReturn("text/html");
+        when(_method.getResponseHeader("Content-Type")).thenReturn(header);
+        when(_method.getResponseBodyAsString()).thenReturn("Off to timbuktu, won't be back later.");
+        try {
+            _api.executeCreateObject(network, Network.class, "/", Collections.<String, String> emptyMap());
+        } finally {
+            verify(_method, times(1)).releaseConnection();
+        }
+    }
+
+    @Test
+    public void testExecuteUpdateObject() throws BigSwitchVnsApiException, IOException {
+        _api.setControllerAddress("10.10.0.10");
+        Network network = new Network();
+        _method = mock(PutMethod.class);
+        when(_method.getStatusCode()).thenReturn(HttpStatus.SC_OK);
+        _api.executeUpdateObject(network, "/", Collections.<String, String> emptyMap());
+        verify(_method, times(1)).releaseConnection();
+        verify(_client, times(1)).executeMethod(_method);
+    }
+
+    @Test (expected=BigSwitchVnsApiException.class)
+    public void testExecuteUpdateObjectFailure() throws BigSwitchVnsApiException, IOException {
+        _api.setControllerAddress("10.10.0.10");
+        Network network = new Network();
+        _method = mock(PutMethod.class);
+        when(_method.getStatusCode()).thenReturn(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+        Header header = mock(Header.class);
+        when(header.getValue()).thenReturn("text/html");
+        when(_method.getResponseHeader("Content-Type")).thenReturn(header);
+        when(_method.getResponseBodyAsString()).thenReturn("Off to timbuktu, won't be back later.");
+        when(_method.isRequestSent()).thenReturn(true);
+        try {
+            _api.executeUpdateObject(network, "/", Collections.<String, String> emptyMap());
+        } finally {
+            verify(_method, times(1)).releaseConnection();
+        }
+    }
+
+    @Test (expected=BigSwitchVnsApiException.class)
+    public void testExecuteUpdateObjectException() throws BigSwitchVnsApiException, IOException {
+        _api.setControllerAddress("10.10.0.10");
+        Network network = new Network();
+        _method = mock(PutMethod.class);
+        when(_method.getStatusCode()).thenReturn(HttpStatus.SC_OK);
+        when(_client.executeMethod((HttpMethod) any())).thenThrow(new IOException());
+        try {
+            _api.executeUpdateObject(network, "/", Collections.<String, String> emptyMap());
+        } finally {
+            verify(_method, times(1)).releaseConnection();
+        }
+    }
+
+    @Test
+    public void testExecuteDeleteObject() throws BigSwitchVnsApiException, IOException {
+        _api.setControllerAddress("10.10.0.10");
+        _method = mock(DeleteMethod.class);
+        when(_method.getStatusCode()).thenReturn(HttpStatus.SC_OK);
+        _api.executeDeleteObject("/");
+        verify(_method, times(1)).releaseConnection();
+        verify(_client, times(1)).executeMethod(_method);
+    }
+
+    @Test (expected=BigSwitchVnsApiException.class)
+    public void testExecuteDeleteObjectFailure() throws BigSwitchVnsApiException, IOException {
+        _api.setControllerAddress("10.10.0.10");
+        _method = mock(DeleteMethod.class);
+        when(_method.getStatusCode()).thenReturn(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+        Header header = mock(Header.class);
+        when(header.getValue()).thenReturn("text/html");
+        when(_method.getResponseHeader("Content-Type")).thenReturn(header);
+        when(_method.getResponseBodyAsString()).thenReturn("Off to timbuktu, won't be back later.");
+        when(_method.isRequestSent()).thenReturn(true);
+        try {
+            _api.executeDeleteObject("/");
+        } finally {
+            verify(_method, times(1)).releaseConnection();
+        }
+    }
+
+    @Test (expected=BigSwitchVnsApiException.class)
+    public void testExecuteDeleteObjectException() throws BigSwitchVnsApiException, IOException {
+        _api.setControllerAddress("10.10.0.10");
+        _method = mock(DeleteMethod.class);
+        when(_method.getStatusCode()).thenReturn(HttpStatus.SC_OK);
+        when(_client.executeMethod((HttpMethod) any())).thenThrow(new HttpException());
+        try {
+            _api.executeDeleteObject("/");
+        } finally {
+            verify(_method, times(1)).releaseConnection();
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/736b236e/plugins/network-elements/bigswitch-vns/test/com/cloud/network/resource/BigSwitchVnsResourceTest.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/bigswitch-vns/test/com/cloud/network/resource/BigSwitchVnsResourceTest.java b/plugins/network-elements/bigswitch-vns/test/com/cloud/network/resource/BigSwitchVnsResourceTest.java
new file mode 100644
index 0000000..514385f
--- /dev/null
+++ b/plugins/network-elements/bigswitch-vns/test/com/cloud/network/resource/BigSwitchVnsResourceTest.java
@@ -0,0 +1,254 @@
+// 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.
+package com.cloud.network.resource;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.naming.ConfigurationException;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.cloud.agent.api.CreateVnsNetworkAnswer;
+import com.cloud.agent.api.CreateVnsNetworkCommand;
+import com.cloud.agent.api.CreateVnsPortAnswer;
+import com.cloud.agent.api.CreateVnsPortCommand;
+import com.cloud.agent.api.DeleteVnsNetworkAnswer;
+import com.cloud.agent.api.DeleteVnsNetworkCommand;
+import com.cloud.agent.api.DeleteVnsPortAnswer;
+import com.cloud.agent.api.DeleteVnsPortCommand;
+import com.cloud.agent.api.PingCommand;
+import com.cloud.agent.api.StartupCommand;
+import com.cloud.agent.api.UpdateVnsPortAnswer;
+import com.cloud.agent.api.UpdateVnsPortCommand;
+import com.cloud.host.Host;
+import com.cloud.network.bigswitch.Attachment;
+import com.cloud.network.bigswitch.ControlClusterStatus;
+import com.cloud.network.bigswitch.Network;
+import com.cloud.network.bigswitch.Port;
+import com.cloud.network.bigswitch.BigSwitchVnsApi;
+import com.cloud.network.bigswitch.BigSwitchVnsApiException;
+
+public class BigSwitchVnsResourceTest {
+    BigSwitchVnsApi _bigswitchVnsApi = mock(BigSwitchVnsApi.class);
+    BigSwitchVnsResource _resource;
+    Map<String,Object> _parameters;
+
+    @Before
+    public void setUp() throws ConfigurationException {
+        _resource = new BigSwitchVnsResource() {
+            protected BigSwitchVnsApi createBigSwitchVnsApi() {
+                return _bigswitchVnsApi;
+            }
+        };
+
+        _parameters = new HashMap<String,Object>();
+        _parameters.put("name","bigswitchvnstestdevice");
+        _parameters.put("ip","127.0.0.1");
+        _parameters.put("guid", "aaaaa-bbbbb-ccccc");
+        _parameters.put("zoneId", "blublub");
+    }
+
+    @Test (expected=ConfigurationException.class)
+    public void resourceConfigureFailure() throws ConfigurationException {
+        _resource.configure("BigSwitchVnsResource", Collections.<String,Object>emptyMap());
+    }
+
+    @Test
+    public void resourceConfigure() throws ConfigurationException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        verify(_bigswitchVnsApi).setControllerAddress("127.0.0.1");
+
+        assertTrue("bigswitchvnstestdevice".equals(_resource.getName()));
+
+        /* Pretty lame test, but here to assure this plugin fails
+         * if the type name ever changes from L2Networking
+         */
+        assertTrue(_resource.getType() == Host.Type.L2Networking);
+    }
+
+    @Test
+    public void testInitialization() throws ConfigurationException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        StartupCommand[] sc = _resource.initialize();
+        assertTrue(sc.length ==1);
+        assertTrue("aaaaa-bbbbb-ccccc".equals(sc[0].getGuid()));
+        assertTrue("bigswitchvnstestdevice".equals(sc[0].getName()));
+        assertTrue("blublub".equals(sc[0].getDataCenter()));
+    }
+
+    @Test
+    public void testPingCommandStatusOk() throws ConfigurationException, BigSwitchVnsApiException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        ControlClusterStatus ccs = mock(ControlClusterStatus.class);
+        when(ccs.getStatus()).thenReturn(true);
+        when(_bigswitchVnsApi.getControlClusterStatus()).thenReturn(ccs);
+
+        PingCommand ping = _resource.getCurrentStatus(42);
+        assertTrue(ping != null);
+        assertTrue(ping.getHostId() == 42);
+        assertTrue(ping.getHostType() == Host.Type.L2Networking);
+    }
+
+    @Test
+    public void testPingCommandStatusFail() throws ConfigurationException, BigSwitchVnsApiException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        ControlClusterStatus ccs = mock(ControlClusterStatus.class);
+        when(ccs.getStatus()).thenReturn(false);
+        when(_bigswitchVnsApi.getControlClusterStatus()).thenReturn(ccs);
+
+        PingCommand ping = _resource.getCurrentStatus(42);
+        assertTrue(ping == null);
+    }
+
+    @Test
+    public void testPingCommandStatusApiException() throws ConfigurationException, BigSwitchVnsApiException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        ControlClusterStatus ccs = mock(ControlClusterStatus.class);
+        when(ccs.getStatus()).thenReturn(false);
+        when(_bigswitchVnsApi.getControlClusterStatus()).thenThrow(new BigSwitchVnsApiException());
+
+        PingCommand ping = _resource.getCurrentStatus(42);
+        assertTrue(ping == null);
+    }
+
+    @Test
+    public void testRetries() throws ConfigurationException, BigSwitchVnsApiException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        Network network = mock(Network.class);
+        when(network.getUuid()).thenReturn("cccc").thenReturn("cccc");
+
+        CreateVnsNetworkCommand cntkc = new CreateVnsNetworkCommand((String)_parameters.get("guid"), "networkName", "tenantid", 1);
+        CreateVnsNetworkAnswer cntka = (CreateVnsNetworkAnswer) _resource.executeRequest(cntkc);
+        assertTrue(cntka.getResult());
+    }
+
+    @Test
+    public void testCreateNetwork() throws ConfigurationException, BigSwitchVnsApiException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        Network network = mock(Network.class);
+        when(network.getUuid()).thenReturn("cccc").thenReturn("cccc");
+
+        CreateVnsNetworkCommand cntkc = new CreateVnsNetworkCommand((String)_parameters.get("guid"), "networkName", "tenantid", 1);
+        CreateVnsNetworkAnswer cntka = (CreateVnsNetworkAnswer) _resource.executeRequest(cntkc);
+        assertTrue(cntka.getResult());
+    }
+
+    @Test
+    public void testCreateNetworkApiException() throws ConfigurationException, BigSwitchVnsApiException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        Network network = mock(Network.class);
+        when(network.getUuid()).thenReturn("cccc").thenReturn("cccc");
+        doThrow(new BigSwitchVnsApiException()).when(_bigswitchVnsApi).createNetwork((Network)any());
+
+        CreateVnsNetworkCommand cntkc = new CreateVnsNetworkCommand((String)_parameters.get("guid"), "networkName", "tenantid", 1);
+        CreateVnsNetworkAnswer cntka = (CreateVnsNetworkAnswer) _resource.executeRequest(cntkc);
+        assertFalse(cntka.getResult());
+    }
+
+    @Test
+    public void testDeleteNetwork() throws ConfigurationException, BigSwitchVnsApiException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        DeleteVnsNetworkCommand dntkc = new DeleteVnsNetworkCommand("tenantid", "networkid");
+        DeleteVnsNetworkAnswer dntka = (DeleteVnsNetworkAnswer) _resource.executeRequest(dntkc);
+        assertTrue(dntka.getResult());
+    }
+
+    @Test
+    public void testDeleteNetworkApiException() throws ConfigurationException, BigSwitchVnsApiException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        doThrow(new BigSwitchVnsApiException()).when(_bigswitchVnsApi).deleteNetwork((String)any(), (String)any());
+
+        DeleteVnsNetworkCommand dntkc = new DeleteVnsNetworkCommand("tenantid", "networkid");
+        DeleteVnsNetworkAnswer dntka = (DeleteVnsNetworkAnswer) _resource.executeRequest(dntkc);
+        assertFalse(dntka.getResult());
+    }
+
+    @Test
+    public void testCreatePort() throws ConfigurationException, BigSwitchVnsApiException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        Port networkp = mock(Port.class);
+        when(networkp.getId()).thenReturn("eeee");
+
+        CreateVnsPortCommand cntkc = new CreateVnsPortCommand("networkid", "portid", "tenantid", "portname", "aa:bb:cc:dd:ee:ff");
+        CreateVnsPortAnswer cntka = (CreateVnsPortAnswer) _resource.executeRequest(cntkc);
+        assertTrue(cntka.getResult());
+    }
+
+    @Test
+    public void testCreatePortApiExceptionInCreate() throws ConfigurationException, BigSwitchVnsApiException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        Port networkp = mock(Port.class);
+        when(networkp.getId()).thenReturn("eeee");
+        doThrow(new BigSwitchVnsApiException()).when(_bigswitchVnsApi).createPort((String)any(), (Port)any());
+
+        CreateVnsPortCommand cntkc = new CreateVnsPortCommand("networkid", "portid", "tenantid", "portname", "aa:bb:cc:dd:ee:ff");
+        CreateVnsPortAnswer cntka = (CreateVnsPortAnswer) _resource.executeRequest(cntkc);
+        assertFalse(cntka.getResult());
+    }
+
+    @Test
+    public void testCreatePortApiExceptionInModify() throws ConfigurationException, BigSwitchVnsApiException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        Port networkp = mock(Port.class);
+        when(networkp.getId()).thenReturn("eeee");
+        doThrow(new BigSwitchVnsApiException()).when(_bigswitchVnsApi).modifyPortAttachment((String)any(), (String)any(), (String)any(), (Attachment)any());
+
+        CreateVnsPortCommand cntkc = new CreateVnsPortCommand("networkid", "portid", "tenantid", "portname", "aa:bb:cc:dd:ee:ff");
+        CreateVnsPortAnswer cntka = (CreateVnsPortAnswer) _resource.executeRequest(cntkc);
+        assertFalse(cntka.getResult());
+        verify(_bigswitchVnsApi, atLeastOnce()).deletePort((String) any(), (String) any(), (String) any());
+    }
+
+    @Test
+    public void testDeletePortException() throws ConfigurationException, BigSwitchVnsApiException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        doThrow(new BigSwitchVnsApiException()).when(_bigswitchVnsApi).deletePort((String) any(), (String) any(), (String) any());
+        DeleteVnsPortAnswer dntkpa = (DeleteVnsPortAnswer) _resource.executeRequest(new DeleteVnsPortCommand("networkId",
+                "portid", "tenantid"));
+        assertFalse(dntkpa.getResult());
+    }
+
+    @Test
+    public void testUpdatePortException() throws ConfigurationException, BigSwitchVnsApiException {
+        _resource.configure("BigSwitchVnsResource", _parameters);
+
+        doThrow(new BigSwitchVnsApiException()).when(_bigswitchVnsApi).modifyPort((String) any(), (Port)any());
+        UpdateVnsPortAnswer dntkpa = (UpdateVnsPortAnswer) _resource.executeRequest(
+                new UpdateVnsPortCommand("networkId","portId","tenantId","portname"));
+        assertFalse(dntkpa.getResult());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/736b236e/plugins/pom.xml
----------------------------------------------------------------------
diff --git a/plugins/pom.xml b/plugins/pom.xml
index f91c6ee..198a632 100644
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -47,6 +47,7 @@
     <module>network-elements/elastic-loadbalancer</module>
     <module>network-elements/ovs</module>
     <module>network-elements/nicira-nvp</module>
+    <module>network-elements/bigswitch-vns</module>
     <module>storage-allocators/random</module>
     <module>user-authenticators/ldap</module>
     <module>user-authenticators/md5</module>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/736b236e/setup/db/create-schema.sql
----------------------------------------------------------------------
diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql
index ad19e0f..0a57bfd 100755
--- a/setup/db/create-schema.sql
+++ b/setup/db/create-schema.sql
@@ -150,6 +150,7 @@ DROP TABLE IF EXISTS `cloud`,`nicira_nvp_nic_map`;
 DROP TABLE IF EXISTS `cloud`,`s3`;
 DROP TABLE IF EXISTS `cloud`,`template_s3_ref`;
 DROP TABLE IF EXISTS `cloud`,`nicira_nvp_router_map`;
+DROP TABLE IF EXISTS `cloud`,`external_bigswitch_vns_devices`;
 DROP TABLE IF EXISTS `cloud`.`autoscale_vmgroup_policy_map`;
 DROP TABLE IF EXISTS `cloud`.`autoscale_policy_condition_map`;
 DROP TABLE IF EXISTS `cloud`.`autoscale_vmgroups`;
@@ -2442,6 +2443,18 @@ CREATE TABLE `cloud`.`nicira_nvp_router_map` (
   CONSTRAINT `fk_nicira_nvp_router_map__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
+CREATE TABLE `cloud`.`external_bigswitch_vns_devices` (
+  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
+  `uuid` varchar(255) UNIQUE,
+  `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network in to which bigswitch vns device is added',
+  `provider_name` varchar(255) NOT NULL COMMENT 'Service Provider name corresponding to this bigswitch vns device',
+  `device_name` varchar(255) NOT NULL COMMENT 'name of the bigswitch vns device',
+  `host_id` bigint unsigned NOT NULL COMMENT 'host id coresponding to the external bigswitch vns device',
+  PRIMARY KEY  (`id`),
+  CONSTRAINT `fk_external_bigswitch_vns_devices__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE,
+  CONSTRAINT `fk_external_bigswitch_vns_devices__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
 CREATE TABLE `cloud`.`counter` (
   `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id',
   `uuid` varchar(40),

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/736b236e/tools/apidoc/gen_toc.py
----------------------------------------------------------------------
diff --git a/tools/apidoc/gen_toc.py b/tools/apidoc/gen_toc.py
index b6bc8f2..2fd855d 100644
--- a/tools/apidoc/gen_toc.py
+++ b/tools/apidoc/gen_toc.py
@@ -126,6 +126,7 @@ known_categories = {
     'StaticRoute': 'VPC',
     'Tags': 'Resource tags',
     'NiciraNvpDevice': 'Nicira NVP',
+    'BigSwitchVnsDevice': 'BigSwitch VNS',
     'AutoScale': 'AutoScale',
     'Counter': 'AutoScale',
     'Condition': 'AutoScale',

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/736b236e/ui/scripts/ui-custom/zoneWizard.js
----------------------------------------------------------------------
diff --git a/ui/scripts/ui-custom/zoneWizard.js b/ui/scripts/ui-custom/zoneWizard.js
index ef606e9..47fa385 100644
--- a/ui/scripts/ui-custom/zoneWizard.js
+++ b/ui/scripts/ui-custom/zoneWizard.js
@@ -623,7 +623,10 @@
                                 }).html('GRE'),
                                                                 $('<option>').attr({
                                                                         value: 'STT'
-                                                                }).html('STT')
+                                                                }).html('STT'),
+                                                                $('<option>').attr({
+                                                                        value: 'VNS'
+                                                                }).html('VNS')
 
 							)
 						)

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/736b236e/wscript_configure
----------------------------------------------------------------------
diff --git a/wscript_configure b/wscript_configure
index 3b9377b..d586c9e 100644
--- a/wscript_configure
+++ b/wscript_configure
@@ -322,7 +322,7 @@ depsclasspath = [ in_javadir(_basename(x)) for x in _glob(_join(conf.srcdir,"dep
 conf.env.DEPSCLASSPATH = pathsep.join(depsclasspath)
 
 # the MS classpath points to JARs required to run the management server
-msclasspath = [ in_javadir("%s-%s.jar"%(conf.env.PACKAGE,x)) for x in "utils api core server server-extras core-extras vmware-base ovm dp-user-concentrated-pod dp-user-dispersing host-allocator-random plugin-f5 plugin-netscaler plugin-ovs plugin-srx storage-allocator-random user-authenticator-ldap user-authenticator-md5 user-authenticator-plaintext vmware plugin-hypervisor-xen plugin-nicira-nvp plugin-elb plugin-netapp".split() ]
+msclasspath = [ in_javadir("%s-%s.jar"%(conf.env.PACKAGE,x)) for x in "utils api core server server-extras core-extras vmware-base ovm dp-user-concentrated-pod dp-user-dispersing host-allocator-random plugin-f5 plugin-netscaler plugin-ovs plugin-srx storage-allocator-random user-authenticator-ldap user-authenticator-md5 user-authenticator-plaintext vmware plugin-hypervisor-xen plugin-nicira-nvp plugin-elb plugin-netapp plugin-bigswitch-vns".split() ]
 conf.env.MSCLASSPATH = pathsep.join(msclasspath)
 
 # the agent and simulator classpaths point to JARs required to run these two applications