Add support for vlan tenant isolation to ovsdb using OpenFlow 1.0.
[netvirt.git] / neutron / src / main / java / org / opendaylight / ovsdb / neutron / provider / ProviderNetworkManager.java
1 /*
2  * Copyright (C) 2013 Red Hat, Inc.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Authors : Madhu Venugopal, Brent Salisbury
9  */
10 package org.opendaylight.ovsdb.neutron.provider;
11
12 import java.util.Map;
13
14 import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork;
15 import org.opendaylight.controller.sal.core.Node;
16 import org.opendaylight.controller.sal.utils.ServiceHelper;
17 import org.opendaylight.controller.sal.utils.Status;
18 import org.opendaylight.ovsdb.lib.table.Bridge;
19 import org.opendaylight.ovsdb.lib.table.Interface;
20 import org.opendaylight.ovsdb.lib.table.internal.Table;
21 import org.opendaylight.ovsdb.plugin.OVSDBConfigService;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 public abstract class ProviderNetworkManager {
26     static final Logger logger = LoggerFactory.getLogger(ProviderNetworkManager.class);
27     private static ProviderNetworkManager provider;
28     protected static final int LLDP_PRIORITY = 1000;
29     protected static final int NORMAL_PRIORITY = 0;
30     protected static final String OPENFLOW_10 = "1.0";
31     protected static final String OPENFLOW_13 = "1.3";
32
33     public static ProviderNetworkManager getManager() {
34         if (provider != null) return provider;
35         String ofVersion = System.getProperty("ovsdb.of.version", OPENFLOW_10);
36         switch (ofVersion) {
37             case OPENFLOW_13:
38                 provider = new OF13ProviderManager();
39                 break;
40             case OPENFLOW_10:
41             default:
42                 provider = new OF10ProviderManager();
43                 break;
44         }
45         return provider;
46     }
47
48     protected String getInternalBridgeUUID (Node node, String bridgeName) {
49         try {
50             OVSDBConfigService ovsdbTable = (OVSDBConfigService)ServiceHelper.getGlobalInstance(OVSDBConfigService.class, this);
51             Map<String, Table<?>> bridgeTable = ovsdbTable.getRows(node, Bridge.NAME.getName());
52             if (bridgeTable == null) return null;
53             for (String key : bridgeTable.keySet()) {
54                 Bridge bridge = (Bridge)bridgeTable.get(key);
55                 if (bridge.getName().equals(bridgeName)) return key;
56             }
57         } catch (Exception e) {
58             logger.error("Error getting Bridge Identifier for {} / {}", node, bridgeName, e);
59         }
60         return null;
61     }
62
63     public abstract boolean hasPerTenantTunneling();
64     public abstract Status handleInterfaceUpdate(String tunnelType, String tunnelKey);
65     public abstract Status handleInterfaceUpdate(NeutronNetwork network, Node source, Interface intf);
66     public abstract Status handleInterfaceDelete(String tunnelType, NeutronNetwork network, Node source, Interface intf, boolean isLastInstanceOnNode);
67     /*
68      * Initialize the Flow rules given the OVSDB node.
69      * This method provides a set of common functionalities to initialize the Flow rules of an OVSDB node
70      * that are Openflow Version specific. Hence we have this method in addition to the following
71      * Openflow Node specific initialization method.
72      */
73     public abstract void initializeFlowRules(Node node);
74
75     /*
76      * Initialize the Flow rules given the Openflow node
77      */
78     public abstract void initializeOFFlowRules(Node openflowNode);
79 }