*/
package org.opendaylight.ovsdb.openstack.netvirt;
+import java.net.HttpURLConnection;
+import java.util.List;
+
import org.opendaylight.neutron.spi.INeutronNetworkAware;
import org.opendaylight.neutron.spi.INeutronNetworkCRUD;
import org.opendaylight.neutron.spi.NeutronNetwork;
-import org.opendaylight.controller.sal.core.Node;
-import org.opendaylight.ovsdb.lib.notation.Row;
-import org.opendaylight.ovsdb.lib.notation.UUID;
import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
-import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService;
+import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
+import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
+import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound;
import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
-import org.opendaylight.ovsdb.compatibility.plugin.api.OvsdbConfigurationService;
-import org.opendaylight.ovsdb.compatibility.plugin.api.OvsdbConnectionService;
-import org.opendaylight.ovsdb.compatibility.plugin.api.OvsdbInventoryListener;
-import org.opendaylight.ovsdb.schema.openvswitch.Interface;
-import org.opendaylight.ovsdb.schema.openvswitch.Port;
-
+import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.net.HttpURLConnection;
-import java.util.List;
-import java.util.concurrent.ConcurrentMap;
-
/**
* Handle requests for Neutron Network.
*/
-public class NetworkHandler extends AbstractHandler
- implements INeutronNetworkAware {
-
+public class NetworkHandler extends AbstractHandler implements INeutronNetworkAware, ConfigInterface {
+ private static final Logger logger = LoggerFactory.getLogger(NetworkHandler.class);
public static final String NETWORK_TYPE_VXLAN = "vxlan";
public static final String NETWORK_TYPE_GRE = "gre";
public static final String NETWORK_TYPE_VLAN = "vlan";
- /**
- * Logger instance.
- */
- static final Logger logger = LoggerFactory.getLogger(NetworkHandler.class);
-
// The implementation for each of these services is resolved by the OSGi Service Manager
private volatile TenantNetworkManager tenantNetworkManager;
private volatile BridgeConfigurationManager bridgeConfigurationManager;
- private volatile ConfigurationService configurationService;
- private volatile OvsdbConfigurationService ovsdbConfigurationService;
- private volatile OvsdbConnectionService connectionService;
+ private volatile NodeCacheManager nodeCacheManager;
private volatile INeutronNetworkCRUD neutronNetworkCache;
- private volatile OvsdbInventoryListener ovsdbInventoryListener;
private volatile NeutronL3Adapter neutronL3Adapter;
+ private volatile Southbound southbound;
/**
* Invoked when a network creation is requested
return HttpURLConnection.HTTP_NOT_ACCEPTABLE;
}
- return HttpURLConnection.HTTP_CREATED;
+ return HttpURLConnection.HTTP_OK;
}
/**
*/
@Override
public void neutronNetworkCreated(NeutronNetwork network) {
- int result = HttpURLConnection.HTTP_BAD_REQUEST;
- logger.trace("neutronNetworkCreated: network: {}", network);
- result = canCreateNetwork(network);
- if (result != HttpURLConnection.HTTP_CREATED) {
- logger.debug("Network creation failed {} ", result);
- return;
- }
-
enqueueEvent(new NorthboundEvent(network, Action.ADD));
}
private void doNeutronNetworkCreated(NeutronNetwork network) {
@Override
public int canUpdateNetwork(NeutronNetwork delta,
NeutronNetwork original) {
- logger.trace("canUpdateNetwork: network delta {} --- original {}", delta, original);
+ if (delta.isShared()) {
+ logger.error(" Network shared attribute not supported ");
+ return HttpURLConnection.HTTP_NOT_ACCEPTABLE;
+ }
+
return HttpURLConnection.HTTP_OK;
}
private void doNeutronNetworkDeleted(NeutronNetwork network) {
neutronL3Adapter.handleNeutronNetworkEvent(network, Action.DELETE);
- int result = canDeleteNetwork(network);
- logger.trace("canDeleteNetwork: network: {}", network);
- if (result != HttpURLConnection.HTTP_OK) {
- logger.error(" deleteNetwork validation failed for result - {} ",
- result);
- return;
- }
/* Is this the last Neutron tenant network */
List <NeutronNetwork> networks;
if (neutronNetworkCache != null) {
networks = neutronNetworkCache.getAllNetworks();
if (networks.isEmpty()) {
logger.trace("neutronNetworkDeleted: last tenant network, delete tunnel ports...");
- List<Node> nodes = connectionService.getNodes();
+ List<Node> nodes = nodeCacheManager.getNodes();
for (Node node : nodes) {
List<String> phyIfName = bridgeConfigurationManager.getAllPhysicalInterfaceNames(node);
try {
- ConcurrentMap<String, Row> ports =
- this.ovsdbConfigurationService.getRows(node,
- ovsdbConfigurationService.getTableName(node, Port.class));
- if (ports != null) {
- for (Row portRow : ports.values()) {
- Port port = ovsdbConfigurationService.getTypedRow(node, Port.class, portRow);
- for (UUID interfaceUuid : port.getInterfacesColumn().getData()) {
- Row ifaceRow = ovsdbConfigurationService
- .getRow(node,
- ovsdbConfigurationService.getTableName(node, Interface.class),
- interfaceUuid.toString());
- Interface iface = ovsdbConfigurationService.getTypedRow(node, Interface.class, ifaceRow);
- String interfaceType = iface.getTypeColumn().getData();
- if (interfaceType.equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN)
- || interfaceType.equalsIgnoreCase(
- NetworkHandler.NETWORK_TYPE_GRE)) {
- /* delete tunnel ports on this node */
- logger.trace("Delete tunnel interface {}", iface.getName());
- ovsdbConfigurationService.deleteRow(node,
- ovsdbConfigurationService.getTableName(node, Port.class),
- port.getUuid().toString());
- break;
- } else if (!phyIfName.isEmpty() && phyIfName.contains(iface.getName())) {
- logger.trace("Delete physical interface {}", iface.getName());
- ovsdbConfigurationService.deleteRow(node,
- ovsdbConfigurationService.getTableName(node, Port.class),
- port.getUuid().toString());
- break;
- }
- }
+ List<OvsdbTerminationPointAugmentation> ports = southbound.getTerminationPointsOfBridge(node);
+ for (OvsdbTerminationPointAugmentation port : ports) {
+ if (southbound.isTunnel(port)) {
+ logger.trace("Delete tunnel interface {}", port.getName());
+ southbound.deleteTerminationPoint(node, port.getName());
+ } else if (!phyIfName.isEmpty() && phyIfName.contains(port.getName())) {
+ logger.trace("Delete physical interface {}", port.getName());
+ southbound.deleteTerminationPoint(node, port.getName());
}
}
} catch (Exception e) {
}
}
+ @Override
+ public void setDependencies(BundleContext bundleContext, ServiceReference serviceReference) {
+ tenantNetworkManager =
+ (TenantNetworkManager) ServiceHelper.getGlobalInstance(TenantNetworkManager.class, this);
+ bridgeConfigurationManager =
+ (BridgeConfigurationManager) ServiceHelper.getGlobalInstance(BridgeConfigurationManager.class, this);
+ nodeCacheManager =
+ (NodeCacheManager) ServiceHelper.getGlobalInstance(NodeCacheManager.class, this);
+ neutronL3Adapter =
+ (NeutronL3Adapter) ServiceHelper.getGlobalInstance(NeutronL3Adapter.class, this);
+ southbound =
+ (Southbound) ServiceHelper.getGlobalInstance(Southbound.class, this);
+ eventDispatcher =
+ (EventDispatcher) ServiceHelper.getGlobalInstance(EventDispatcher.class, this);
+ eventDispatcher.eventHandlerAdded(
+ bundleContext.getServiceReference(INeutronNetworkAware.class.getName()), this);
+ }
+
+ @Override
+ public void setDependencies(Object impl) {
+ if (impl instanceof INeutronNetworkCRUD) {
+ neutronNetworkCache = (INeutronNetworkCRUD)impl;
+ }
+ }
}