This is not an interface, but rather a collections of various constants.
Refactor to a proper utility class and move non-shared constants to
their sole users.
Change-Id: Ibb21174ee18f92608ea2ac14f535558d609299fb
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
import static org.opendaylight.ovsdb.lib.operations.Operations.op;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableSet;
import com.google.common.util.concurrent.ListenableFuture;
import java.util.ArrayList;
import java.util.Collection;
public class OvsdbConnectionInstance {
private static final Logger LOG = LoggerFactory.getLogger(OvsdbConnectionInstance.class);
+
+ private static final ImmutableSet<String> SKIP_OVSDB_TABLE = ImmutableSet.of(
+ "Flow_Table",
+ "Mirror",
+ "NetFlow",
+ "sFlow",
+ "IPFIX",
+ "Flow_Sample_Collector_Set");
+
private final OvsdbClient client;
private ConnectionInfo connectionInfo;
private final TransactionInvoker txInvoker;
OvsdbConnectionInstance(final ConnectionInfo key, final OvsdbClient client, final TransactionInvoker txInvoker,
final InstanceIdentifier<Node> iid) {
- this.connectionInfo = key;
+ connectionInfo = key;
this.client = client;
this.txInvoker = txInvoker;
// this.key = key;
- this.instanceIdentifier = iid;
+ instanceIdentifier = iid;
}
- public void updatePort(UUID uuid, InstanceIdentifier<Node> iid) {
+ public void updatePort(final UUID uuid, final InstanceIdentifier<Node> iid) {
ports.put(uuid, iid);
}
- public void removePort(UUID uuid) {
+ public void removePort(final UUID uuid) {
ports.remove(uuid);
}
- public InstanceIdentifier<Node> getPort(UUID uuid) {
+ public InstanceIdentifier<Node> getPort(final UUID uuid) {
return ports.get(uuid);
}
- public void updatePortInterface(String name, InstanceIdentifier<Node> iid) {
+ public void updatePortInterface(final String name, final InstanceIdentifier<Node> iid) {
portInterfaces.put(name, iid);
}
- public void removePortInterface(String name) {
+ public void removePortInterface(final String name) {
portInterfaces.remove(name);
}
- public InstanceIdentifier<Node> getPortInterface(String name) {
+ public InstanceIdentifier<Node> getPortInterface(final String name) {
return portInterfaces.get(name);
}
}
public void registerCallbacks(final InstanceIdentifierCodec instanceIdentifierCodec) {
- if (this.callback == null) {
- if (this.initialCreateData != null) {
+ if (callback == null) {
+ if (initialCreateData != null) {
this.updateConnectionAttributes(instanceIdentifierCodec);
}
if (tables != null) {
List<MonitorRequest> monitorRequests = new ArrayList<>();
for (String tableName : tables) {
- if (!SouthboundConstants.SKIP_OVSDB_TABLE.contains(tableName)) {
+ if (!SKIP_OVSDB_TABLE.contains(tableName)) {
LOG.trace("Southbound monitoring OVSDB schema table {}", tableName);
GenericTableSchema tableSchema = dbSchema.table(tableName, GenericTableSchema.class);
// We copy the columns so we can clean the set up later
.with(new MonitorSelect(true, true, true, true)).build());
}
}
- this.callback.update(monitor(dbSchema, monitorRequests, callback), dbSchema);
+ callback.update(monitor(dbSchema, monitorRequests, callback), dbSchema);
} else {
LOG.warn("No tables for schema {} for database {} for key {}",dbSchema,database,connectionInfo);
}
private void updateConnectionAttributes(final InstanceIdentifierCodec instanceIdentifierCodec) {
LOG.debug("Update attributes of ovsdb node ip: {} port: {}",
- this.initialCreateData.getConnectionInfo().getRemoteIp(),
- this.initialCreateData.getConnectionInfo().getRemotePort());
+ initialCreateData.getConnectionInfo().getRemoteIp(),
+ initialCreateData.getConnectionInfo().getRemotePort());
for (Map.Entry<TypedDatabaseSchema, TransactInvoker> entry: transactInvokers.entrySet()) {
- TransactionBuilder transaction = new TransactionBuilder(this.client, entry.getKey());
+ TransactionBuilder transaction = new TransactionBuilder(client, entry.getKey());
// OpenVSwitchPart
OpenVSwitch ovs = transaction.getTypedRowWrapper(OpenVSwitch.class);
Map<OpenvswitchExternalIdsKey, OpenvswitchExternalIds> externalIds =
- this.initialCreateData.getOpenvswitchExternalIds();
+ initialCreateData.getOpenvswitchExternalIds();
- stampInstanceIdentifier(transaction, this.instanceIdentifier.firstIdentifierOf(Node.class),
+ stampInstanceIdentifier(transaction, instanceIdentifier.firstIdentifierOf(Node.class),
instanceIdentifierCodec);
try {
Map<OpenvswitchOtherConfigsKey, OpenvswitchOtherConfigs> otherConfigs =
- this.initialCreateData.getOpenvswitchOtherConfigs();
+ initialCreateData.getOpenvswitchOtherConfigs();
if (otherConfigs != null) {
try {
ovs.setOtherConfig(YangUtils.convertYangKeyValueListToMap(otherConfigs,
}
public void setMDConnectionInfo(final ConnectionInfo key) {
- this.connectionInfo = key;
+ connectionInfo = key;
}
public InstanceIdentifier<Node> getInstanceIdentifier() {
}
public void setInstanceIdentifier(final InstanceIdentifier<Node> iid) {
- this.instanceIdentifier = iid;
+ instanceIdentifier = iid;
}
public Entity getConnectedEntity() {
- return this.connectedEntity;
+ return connectedEntity;
}
public void setConnectedEntity(final Entity entity) {
- this.connectedEntity = entity;
+ connectedEntity = entity;
}
public Boolean hasOvsdbClient(final OvsdbClient otherClient) {
public void setDeviceOwnershipCandidateRegistration(
@NonNull final EntityOwnershipCandidateRegistration registration) {
- this.deviceOwnershipCandidateRegistration = registration;
+ deviceOwnershipCandidateRegistration = registration;
}
public void closeDeviceOwnershipCandidateRegistration() {
if (deviceOwnershipCandidateRegistration != null) {
- this.deviceOwnershipCandidateRegistration.close();
+ deviceOwnershipCandidateRegistration.close();
setHasDeviceOwnership(Boolean.FALSE);
}
}
public OvsdbNodeAugmentation getOvsdbNodeAugmentation() {
- return this.initialCreateData;
+ return initialCreateData;
}
public void setOvsdbNodeAugmentation(final OvsdbNodeAugmentation ovsdbNodeCreateData) {
- this.initialCreateData = ovsdbNodeCreateData;
+ initialCreateData = ovsdbNodeCreateData;
}
public OvsdbClient getOvsdbClient() {
this.db = db;
this.txInvoker = txInvoker;
this.entityOwnershipService = entityOwnershipService;
- this.ovsdbDeviceEntityOwnershipListener = new OvsdbDeviceEntityOwnershipListener(this, entityOwnershipService);
+ ovsdbDeviceEntityOwnershipListener = new OvsdbDeviceEntityOwnershipListener(this, entityOwnershipService);
this.ovsdbConnection = ovsdbConnection;
- this.reconciliationManager = new ReconciliationManager(db, instanceIdentifierCodec);
+ reconciliationManager = new ReconciliationManager(db, instanceIdentifierCodec);
this.instanceIdentifierCodec = instanceIdentifierCodec;
this.upgradeState = upgradeState;
}
if (ownershipChange.getState().isOwner() == ovsdbConnectionInstance.getHasDeviceOwnership()) {
LOG.info("Ovsdb handleOwnershipChanged: no change in ownership for {}. Ownership status is : {}",
ovsdbConnectionInstance.getConnectionInfo(), ovsdbConnectionInstance.getHasDeviceOwnership()
- ? SouthboundConstants.OwnershipStates.OWNER.getState()
- : SouthboundConstants.OwnershipStates.NONOWNER.getState());
+ ? OwnershipStates.OWNER.getState()
+ : OwnershipStates.NONOWNER.getState());
return;
}
readNodeFuture.addCallback(new FutureCallback<Boolean>() {
@Override
public void onSuccess(final Boolean node) {
- if (node.booleanValue()) {
+ if (node) {
LOG.info("Disconnected/Failed connection {} was controller initiated, attempting "
+ "reconnection", ovsdbNode.getConnectionInfo());
reconciliationManager.enqueue(task);
ON_DISCONNECT
}
+ private enum OwnershipStates {
+ OWNER("OWNER"),
+ NONOWNER("NON-OWNER");
+
+ private final String state;
+
+ OwnershipStates(final String state) {
+ this.state = state;
+ }
+
+ @Override
+ public String toString() {
+ return state;
+ }
+
+ String getState() {
+ return state;
+ }
+ }
+
public Map<ConnectionInfo, OvsdbConnectionInstance> getClients() {
return clients;
}
private final OvsdbConnectionManager ovsdbConnectionManager;
private final TransactionInvoker txInvoker;
- OvsdbOperGlobalListener(DataBroker db, OvsdbConnectionManager ovsdbConnectionManager,
- TransactionInvoker txInvoker) {
+ OvsdbOperGlobalListener(final DataBroker db, final OvsdbConnectionManager ovsdbConnectionManager,
+ final TransactionInvoker txInvoker) {
LOG.info("Registering OvsdbOperGlobalListener");
this.db = db;
this.ovsdbConnectionManager = ovsdbConnectionManager;
@Override
@SuppressWarnings("checkstyle:IllegalCatch")
- public void onDataTreeChanged(Collection<DataTreeModification<Node>> changes) {
- changes.forEach((change) -> {
+ public void onDataTreeChanged(final Collection<DataTreeModification<Node>> changes) {
+ changes.forEach(change -> {
try {
InstanceIdentifier<Node> key = change.getRootPath().getRootIdentifier();
DataObjectModification<Node> mod = change.getRootNode();
});
}
+ private static final int EOS_TIMEOUT = Integer.getInteger("southbound.eos.timeout.delay.secs", 240);
+
private static final Map<InstanceIdentifier<Node>, ScheduledFuture> TIMEOUT_FTS = new ConcurrentHashMap<>();
- public static void runAfterTimeoutIfNodeNotCreated(InstanceIdentifier<Node> iid, Runnable job) {
+ public static void runAfterTimeoutIfNodeNotCreated(final InstanceIdentifier<Node> iid, final Runnable job) {
ScheduledFuture<?> ft = TIMEOUT_FTS.get(iid);
if (ft != null) {
ft.cancel(false);
if (!OPER_NODE_CACHE.containsKey(iid)) {
job.run();
}
- }, SouthboundConstants.EOS_TIMEOUT, TimeUnit.SECONDS);
+ }, EOS_TIMEOUT, TimeUnit.SECONDS);
TIMEOUT_FTS.put(iid, ft);
}
- private static Node getCreated(DataObjectModification<Node> mod) {
+ private static Node getCreated(final DataObjectModification<Node> mod) {
if (mod.getModificationType() == DataObjectModification.ModificationType.WRITE
&& mod.getDataBefore() == null) {
return mod.getDataAfter();
return null;
}
- private static Node getRemoved(DataObjectModification<Node> mod) {
+ private static Node getRemoved(final DataObjectModification<Node> mod) {
if (mod.getModificationType() == DataObjectModification.ModificationType.DELETE) {
return mod.getDataBefore();
}
return null;
}
- private static Node getUpdated(DataObjectModification<Node> mod) {
+ private static Node getUpdated(final DataObjectModification<Node> mod) {
Node node = null;
switch (mod.getModificationType()) {
case SUBTREE_MODIFIED:
package org.opendaylight.ovsdb.southbound;
import com.google.common.collect.ImmutableBiMap;
-import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathTypeBase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathTypeNetdev;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathTypeSystem;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeBase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdk;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdkr;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdkvhost;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdkvhostuser;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdkvhostuserclient;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeGeneve;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeGre;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeGre64;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeInternal;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeIpsecGre;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeIpsecGre64;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeLisp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypePatch;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeStt;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeSystem;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeTap;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeVxlan;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeVxlanGpe;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolBase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolOpenflow10;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolOpenflow11;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbFailModeBase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbFailModeSecure;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbFailModeStandalone;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.QosTypeBase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.QosTypeEgressPolicer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.QosTypeLinuxCodel;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.QosTypeLinuxFqCodel;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.QosTypeLinuxHfsc;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.QosTypeLinuxHtb;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.QosTypeLinuxSfq;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.QosEntryKey;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
import org.opendaylight.yangtools.yang.common.Uint32;
-public interface SouthboundConstants {
-
- String OPEN_V_SWITCH = "Open_vSwitch";
- TopologyId OVSDB_TOPOLOGY_ID = new TopologyId(new Uri("ovsdb:1"));
- String OVSDB_URI_PREFIX = "ovsdb";
- String BRIDGE_URI_PREFIX = "bridge";
- String TP_URI_PREFIX = "terminationpoint";
- String QOS_URI_PREFIX = "qos";
- String QOS_NAMED_UUID_PREFIX = "QOS";
- QosEntryKey PORT_QOS_LIST_KEY = new QosEntryKey(Uint32.ONE);
- String QUEUE_URI_PREFIX = "queue";
- String QUEUE_NAMED_UUID_PREFIX = "QUEUE";
- String AUTOATTACH_URI_PREFIX = "autoattach";
- String AUTOATTACH_SUPPORTED_OVS_SCHEMA_VERSION = "7.11.2";
- Integer DEFAULT_OVSDB_PORT = 6640;
- String DEFAULT_OPENFLOW_PORT = "6653";
- String OPENFLOW_CONNECTION_PROTOCOL = "tcp";
- String UUID = "uuid";
- String QOS_LINUX_HTB = "linux-htb";
- String QOS_LINUX_HFSC = "linux-hfsc";
- // The following four QoS types are present in OVS 2.5+
- // Refer to http://openvswitch.org/support/dist-docs/ovs-vswitchd.conf.db.5.txt
- String QOS_LINUX_SFQ = "linux-sfq";
- String QOS_LINUX_CODEL = "linux-codel";
- String QOS_LINUX_FQ_CODEL = "linux-fq_codel";
- String QOS_EGRESS_POLICER = "egress-policer";
- String URI_SEPERATOR = "/";
- String CREATED_BY = "created_by";
- String ODL = "odl";
-
- ImmutableBiMap<Class<? extends QosTypeBase>,String> QOS_TYPE_MAP
- = new ImmutableBiMap.Builder<Class<? extends QosTypeBase>,String>()
- .put(QosTypeLinuxHtb.class,QOS_LINUX_HTB)
- .put(QosTypeLinuxHfsc.class,QOS_LINUX_HFSC)
- .put(QosTypeLinuxSfq.class,QOS_LINUX_SFQ)
- .put(QosTypeLinuxCodel.class,QOS_LINUX_CODEL)
- .put(QosTypeLinuxFqCodel.class,QOS_LINUX_FQ_CODEL)
- .put(QosTypeEgressPolicer.class,QOS_EGRESS_POLICER)
- .build();
-
- ImmutableBiMap<Class<? extends OvsdbBridgeProtocolBase>,String> OVSDB_PROTOCOL_MAP
- = new ImmutableBiMap.Builder<Class<? extends OvsdbBridgeProtocolBase>,String>()
- .put(OvsdbBridgeProtocolOpenflow10.class,"OpenFlow10")
- .put(OvsdbBridgeProtocolOpenflow11.class,"OpenFlow11")
- .put(OvsdbBridgeProtocolOpenflow12.class,"OpenFlow12")
- .put(OvsdbBridgeProtocolOpenflow13.class,"OpenFlow13")
- .put(OvsdbBridgeProtocolOpenflow14.class,"OpenFlow14")
- .put(OvsdbBridgeProtocolOpenflow15.class,"OpenFlow15")
- .build();
-
- ImmutableBiMap<Class<? extends OvsdbFailModeBase>,String> OVSDB_FAIL_MODE_MAP
- = new ImmutableBiMap.Builder<Class<? extends OvsdbFailModeBase>,String>()
- .put(OvsdbFailModeStandalone.class,"standalone")
- .put(OvsdbFailModeSecure.class,"secure")
- .build();
-
- ImmutableBiMap<String, Class<? extends InterfaceTypeBase>> OVSDB_INTERFACE_TYPE_MAP
- = new ImmutableBiMap.Builder<String, Class<? extends InterfaceTypeBase>>()
- .put("internal", InterfaceTypeInternal.class)
- .put("vxlan", InterfaceTypeVxlan.class)
- .put("vxlan-gpe", InterfaceTypeVxlanGpe.class)
- .put("patch", InterfaceTypePatch.class)
- .put("system", InterfaceTypeSystem.class)
- .put("tap", InterfaceTypeTap.class)
- .put("geneve", InterfaceTypeGeneve.class)
- .put("gre", InterfaceTypeGre.class)
- .put("ipsec_gre", InterfaceTypeIpsecGre.class)
- .put("gre64", InterfaceTypeGre64.class)
- .put("ipsec_gre64", InterfaceTypeIpsecGre64.class)
- .put("lisp", InterfaceTypeLisp.class)
- .put("dpdk", InterfaceTypeDpdk.class)
- .put("dpdkr", InterfaceTypeDpdkr.class)
- .put("dpdkvhost", InterfaceTypeDpdkvhost.class)
- .put("dpdkvhostuser", InterfaceTypeDpdkvhostuser.class)
- .put("dpdkvhostuserclient", InterfaceTypeDpdkvhostuserclient.class)
- .put("stt", InterfaceTypeStt.class)
- .build();
-
- ImmutableBiMap<Class<? extends DatapathTypeBase>,String> DATAPATH_TYPE_MAP
- = new ImmutableBiMap.Builder<Class<? extends DatapathTypeBase>,String>()
- .put(DatapathTypeSystem.class,"system")
- .put(DatapathTypeNetdev.class,"netdev")
- .build();
-
- String IID_EXTERNAL_ID_KEY = "opendaylight-iid";
- String QOS_ID_EXTERNAL_ID_KEY = "opendaylight-qos-id";
- String QUEUE_ID_EXTERNAL_ID_KEY = "opendaylight-queue-id";
- String AUTOATTACH_ID_EXTERNAL_ID_KEY = "opendaylight-autoattach-id";
-
- ImmutableCollection<String> SKIP_OVSDB_TABLE = new ImmutableSet.Builder<String>()
- .add("Flow_Table")
- .add("Mirror")
- .add("NetFlow")
- .add("sFlow")
- .add("IPFIX")
- .add("Flow_Sample_Collector_Set")
- .build();
-
- //Note: _version is an internal column of ovsdb schema, that gets updated
- //with every change in the row of the table.
- // The "Manager" entry needs to be a modifiable list, SouthboundProvider::setSkipManagerStatus() modifies it
- ImmutableMap<String,List<String>> SKIP_COLUMN_FROM_TABLE
- = new ImmutableMap.Builder<String,List<String>>()
- .put("Open_vSwitch", Arrays.asList("statistics","_version"))
- .put("Port", Arrays.asList("statistics","_version"))
- .put("Manager", new ArrayList<>(Collections.singletonList("_version")))
- .put("SSL", Collections.singletonList("_version"))
- .put("QoS", Collections.singletonList("_version"))
- .put("Queue", Collections.singletonList("_version"))
- .put("Bridge", Collections.singletonList("_version"))
- .put("Interface", Arrays.asList("statistics","_version"))
- .put("Controller", Arrays.asList("status","_version"))
- .build();
-
- enum VlanModes {
+public final class SouthboundConstants {
+ public enum VlanModes {
ACCESS("access"),
NATIVE_TAGGED("native-tagged"),
NATIVE_UNTAGGED("native-untagged"),
private final String mode;
- VlanModes(String mode) {
+ VlanModes(final String mode) {
this.mode = mode;
}
}
public String getMode() {
- return this.mode;
+ return mode;
}
}
- enum OwnershipStates {
- OWNER("OWNER"),
- NONOWNER("NON-OWNER");
-
- private final String state;
-
- OwnershipStates(String state) {
- this.state = state;
- }
+ public static final String OPEN_V_SWITCH = "Open_vSwitch";
+ public static final TopologyId OVSDB_TOPOLOGY_ID = new TopologyId(new Uri("ovsdb:1"));
+ public static final String OVSDB_URI_PREFIX = "ovsdb";
+ public static final String BRIDGE_URI_PREFIX = "bridge";
+ public static final String TP_URI_PREFIX = "terminationpoint";
+ public static final String QOS_URI_PREFIX = "qos";
+ public static final String QOS_NAMED_UUID_PREFIX = "QOS";
+ public static final QosEntryKey PORT_QOS_LIST_KEY = new QosEntryKey(Uint32.ONE);
+ public static final String QUEUE_URI_PREFIX = "queue";
+ public static final String QUEUE_NAMED_UUID_PREFIX = "QUEUE";
+ public static final String AUTOATTACH_URI_PREFIX = "autoattach";
+ public static final String AUTOATTACH_SUPPORTED_OVS_SCHEMA_VERSION = "7.11.2";
+ public static final Integer DEFAULT_OVSDB_PORT = 6640;
+ public static final String DEFAULT_OPENFLOW_PORT = "6653";
+ public static final String OPENFLOW_CONNECTION_PROTOCOL = "tcp";
+ public static final String UUID = "uuid";
+ public static final String QOS_LINUX_HTB = "linux-htb";
+ public static final String QOS_LINUX_HFSC = "linux-hfsc";
+ // The following four QoS types are present in OVS 2.5+
+ // Refer to http://openvswitch.org/support/dist-docs/ovs-vswitchd.conf.db.5.txt
+ public static final String QOS_LINUX_SFQ = "linux-sfq";
+ public static final String QOS_LINUX_CODEL = "linux-codel";
+ public static final String QOS_LINUX_FQ_CODEL = "linux-fq_codel";
+ public static final String QOS_EGRESS_POLICER = "egress-policer";
+ public static final String URI_SEPERATOR = "/";
+ public static final String CREATED_BY = "created_by";
+ public static final String ODL = "odl";
+
+ public static final ImmutableBiMap<Class<? extends OvsdbBridgeProtocolBase>, String> OVSDB_PROTOCOL_MAP =
+ ImmutableBiMap.<Class<? extends OvsdbBridgeProtocolBase>, String>builder()
+ .put(OvsdbBridgeProtocolOpenflow10.class, "OpenFlow10")
+ .put(OvsdbBridgeProtocolOpenflow11.class, "OpenFlow11")
+ .put(OvsdbBridgeProtocolOpenflow12.class, "OpenFlow12")
+ .put(OvsdbBridgeProtocolOpenflow13.class, "OpenFlow13")
+ .put(OvsdbBridgeProtocolOpenflow14.class, "OpenFlow14")
+ .put(OvsdbBridgeProtocolOpenflow15.class, "OpenFlow15")
+ .build();
- @Override
- public String toString() {
- return state;
- }
+ public static final ImmutableBiMap<Class<? extends OvsdbFailModeBase>, String> OVSDB_FAIL_MODE_MAP =
+ ImmutableBiMap.of(
+ OvsdbFailModeStandalone.class, "standalone",
+ OvsdbFailModeSecure.class, "secure");
+
+ public static final String IID_EXTERNAL_ID_KEY = "opendaylight-iid";
+ public static final String QOS_ID_EXTERNAL_ID_KEY = "opendaylight-qos-id";
+ public static final String QUEUE_ID_EXTERNAL_ID_KEY = "opendaylight-queue-id";
+ public static final String AUTOATTACH_ID_EXTERNAL_ID_KEY = "opendaylight-autoattach-id";
+
+ // Note: _version is an internal column of ovsdb schema, that gets updated with every change in the row
+ // of the table.
+ // The "Manager" entry needs to be a modifiable list, SouthboundProvider::setSkipManagerStatus() modifies it
+ static final ImmutableMap<String, List<String>> SKIP_COLUMN_FROM_TABLE =
+ ImmutableMap.<String,List<String>>builder()
+ .put("Open_vSwitch", Arrays.asList("statistics","_version"))
+ .put("Port", Arrays.asList("statistics","_version"))
+ .put("Manager", new ArrayList<>(Collections.singletonList("_version")))
+ .put("SSL", Collections.singletonList("_version"))
+ .put("QoS", Collections.singletonList("_version"))
+ .put("Queue", Collections.singletonList("_version"))
+ .put("Bridge", Collections.singletonList("_version"))
+ .put("Interface", Arrays.asList("statistics","_version"))
+ .put("Controller", Arrays.asList("status","_version"))
+ .build();
- public String getState() {
- return this.state;
- }
+ private SouthboundConstants() {
+ // Hidden on purpose
}
-
- int EOS_TIMEOUT = Integer.getInteger("southbound.eos.timeout.delay.secs", 240);
}
import static java.util.Objects.requireNonNull;
import static org.opendaylight.ovsdb.southbound.SouthboundUtil.schemaMismatchLog;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.base.Splitter;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathTypeBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathTypeNetdev;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathTypeSystem;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdk;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdkr;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdkvhost;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdkvhostuser;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeDpdkvhostuserclient;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeGeneve;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeGre;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeGre64;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeInternal;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeIpsecGre;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeIpsecGre64;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeLisp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypePatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeStt;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeSystem;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeTap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeVxlan;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeVxlanGpe;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolBase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.QosTypeBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.QosTypeEgressPolicer;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.QosTypeLinuxCodel;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.QosTypeLinuxFqCodel;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.QosTypeLinuxHfsc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.QosTypeLinuxHtb;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.QosTypeLinuxSfq;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntryBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntryKey;
private static final Logger LOG = LoggerFactory.getLogger(SouthboundMapper.class);
private static final String N_CONNECTIONS_STR = "n_connections";
+ @VisibleForTesting
+ public static final ImmutableBiMap<Class<? extends DatapathTypeBase>, String> DATAPATH_TYPE_MAP =
+ ImmutableBiMap.of(
+ DatapathTypeSystem.class, "system",
+ DatapathTypeNetdev.class, "netdev");
+ @VisibleForTesting
+ public static final ImmutableBiMap<String, Class<? extends InterfaceTypeBase>> OVSDB_INTERFACE_TYPE_MAP =
+ ImmutableBiMap.<String, Class<? extends InterfaceTypeBase>>builder()
+ .put("internal", InterfaceTypeInternal.class)
+ .put("vxlan", InterfaceTypeVxlan.class)
+ .put("vxlan-gpe", InterfaceTypeVxlanGpe.class)
+ .put("patch", InterfaceTypePatch.class)
+ .put("system", InterfaceTypeSystem.class)
+ .put("tap", InterfaceTypeTap.class)
+ .put("geneve", InterfaceTypeGeneve.class)
+ .put("gre", InterfaceTypeGre.class)
+ .put("ipsec_gre", InterfaceTypeIpsecGre.class)
+ .put("gre64", InterfaceTypeGre64.class)
+ .put("ipsec_gre64", InterfaceTypeIpsecGre64.class)
+ .put("lisp", InterfaceTypeLisp.class)
+ .put("dpdk", InterfaceTypeDpdk.class)
+ .put("dpdkr", InterfaceTypeDpdkr.class)
+ .put("dpdkvhost", InterfaceTypeDpdkvhost.class)
+ .put("dpdkvhostuser", InterfaceTypeDpdkvhostuser.class)
+ .put("dpdkvhostuserclient", InterfaceTypeDpdkvhostuserclient.class)
+ .put("stt", InterfaceTypeStt.class)
+ .build();
+ private static final ImmutableBiMap<Class<? extends QosTypeBase>, String> QOS_TYPE_MAP =
+ ImmutableBiMap.<Class<? extends QosTypeBase>, String>builder()
+ .put(QosTypeLinuxHtb.class, SouthboundConstants.QOS_LINUX_HTB)
+ .put(QosTypeLinuxHfsc.class, SouthboundConstants.QOS_LINUX_HFSC)
+ .put(QosTypeLinuxSfq.class, SouthboundConstants.QOS_LINUX_SFQ)
+ .put(QosTypeLinuxCodel.class, SouthboundConstants.QOS_LINUX_CODEL)
+ .put(QosTypeLinuxFqCodel.class, SouthboundConstants.QOS_LINUX_FQ_CODEL)
+ .put(QosTypeEgressPolicer.class, SouthboundConstants.QOS_EGRESS_POLICER)
+ .build();
+
private SouthboundMapper() {
}
}
public static String createDatapathType(final OvsdbBridgeAugmentation mdsalbridge) {
- String datapathtype = SouthboundConstants.DATAPATH_TYPE_MAP.get(DatapathTypeSystem.class);
+ String datapathtype = DATAPATH_TYPE_MAP.get(DatapathTypeSystem.class);
if (mdsalbridge.getDatapathType() != null && !mdsalbridge.getDatapathType().equals(DatapathTypeBase.class)) {
- datapathtype = SouthboundConstants.DATAPATH_TYPE_MAP.get(mdsalbridge.getDatapathType());
+ datapathtype = DATAPATH_TYPE_MAP.get(mdsalbridge.getDatapathType());
if (datapathtype == null) {
throw new IllegalArgumentException("Unknown datapath type " + mdsalbridge.getDatapathType().getName());
}
if (type.isEmpty()) {
return DatapathTypeSystem.class;
}
- return SouthboundConstants.DATAPATH_TYPE_MAP.inverse().get(type);
+ return DATAPATH_TYPE_MAP.inverse().get(type);
}
public static Set<String> createOvsdbBridgeProtocols(final OvsdbBridgeAugmentation ovsdbBridgeNode) {
}
public static Class<? extends InterfaceTypeBase> createInterfaceType(final String type) {
- return SouthboundConstants.OVSDB_INTERFACE_TYPE_MAP.get(requireNonNull(type));
+ return OVSDB_INTERFACE_TYPE_MAP.get(requireNonNull(type));
}
public static String createOvsdbInterfaceType(final Class<? extends InterfaceTypeBase> mdsaltype) {
- return SouthboundConstants.OVSDB_INTERFACE_TYPE_MAP.inverse().get(requireNonNull(mdsaltype));
+ return OVSDB_INTERFACE_TYPE_MAP.inverse().get(requireNonNull(mdsaltype));
}
public static List<ProtocolEntry> createMdsalProtocols(final Bridge bridge) {
LOG.info("QoS type not supplied");
return QosTypeBase.class;
} else {
- ImmutableBiMap<String, Class<? extends QosTypeBase>> mapper =
- SouthboundConstants.QOS_TYPE_MAP.inverse();
+ ImmutableBiMap<String, Class<? extends QosTypeBase>> mapper = QOS_TYPE_MAP.inverse();
if (mapper.get(type) == null) {
LOG.info("QoS type not found in model: {}", type);
return QosTypeBase.class;
}
public static String createQosType(final Class<? extends QosTypeBase> qosTypeClass) {
- String qosType = SouthboundConstants.QOS_TYPE_MAP.get(QosTypeBase.class);
+ String qosType = QOS_TYPE_MAP.get(QosTypeBase.class);
if (qosTypeClass != null && !qosTypeClass.equals(QosTypeBase.class)) {
- qosType = SouthboundConstants.QOS_TYPE_MAP.get(qosTypeClass);
+ qosType = QOS_TYPE_MAP.get(qosTypeClass);
if (qosType == null) {
throw new IllegalArgumentException("Unknown QoS type" + qosTypeClass.getName());
}
private NotifyingDataChangeListener(final LogicalDatastoreType type) {
this.type = type;
- this.iid = null;
+ iid = null;
}
private NotifyingDataChangeListener(final LogicalDatastoreType type, final InstanceIdentifier<?> iid) {
} else {
for (DatapathTypeEntry dpTypeEntry : datapathTypeEntries.values()) {
Class<? extends DatapathTypeBase> dpType = dpTypeEntry.getDatapathType();
- String dpTypeStr = SouthboundConstants.DATAPATH_TYPE_MAP.get(dpType);
+ String dpTypeStr = SouthboundMapper.DATAPATH_TYPE_MAP.get(dpType);
LOG.info("dp type is {}", dpTypeStr);
if (dpTypeStr.equals(NETDEV_DP_TYPE)) {
LOG.info("Found a DPDK node; adding a corresponding netdev device");
LOG.info("DPDK portname and type is {}, {}", testPortname, dpdkType);
OvsdbTerminationPointAugmentationBuilder ovsdbTerminationpointBuilder =
createSpecificDpdkOvsdbTerminationPointAugmentationBuilder(testPortname,
- SouthboundConstants.OVSDB_INTERFACE_TYPE_MAP.get(dpdkType));
+ SouthboundMapper.OVSDB_INTERFACE_TYPE_MAP.get(dpdkType));
assertTrue(addTerminationPoint(bridgeNodeId, testPortname, ovsdbTerminationpointBuilder));
}
for (String dpdkType : dpdkTypes) {
String testPortname = "test" + dpdkType + "port";
Class<? extends InterfaceTypeBase> dpdkIfType =
- SouthboundConstants.OVSDB_INTERFACE_TYPE_MAP.get(dpdkType);
+ SouthboundMapper.OVSDB_INTERFACE_TYPE_MAP.get(dpdkType);
for (TerminationPoint terminationPoint
: terminationPointNode.nonnullTerminationPoint().values()) {
OvsdbTerminationPointAugmentation ovsdbTerminationPointAugmentation = terminationPoint
private static OvsdbTerminationPointAugmentationBuilder createGenericDpdkOvsdbTerminationPointAugmentationBuilder(
final String portName) {
- OvsdbTerminationPointAugmentationBuilder ovsdbTerminationBuilder =
- createGenericOvsdbTerminationPointAugmentationBuilder();
- ovsdbTerminationBuilder.setName(portName);
- Class<? extends InterfaceTypeBase> ifType = SouthboundConstants.OVSDB_INTERFACE_TYPE_MAP
- .get("dpdk");
- ovsdbTerminationBuilder.setInterfaceType(ifType);
- return ovsdbTerminationBuilder;
+ return createGenericOvsdbTerminationPointAugmentationBuilder()
+ .setName(portName)
+ .setInterfaceType(SouthboundMapper.OVSDB_INTERFACE_TYPE_MAP.get("dpdk"));
}
private static OvsdbTerminationPointAugmentationBuilder createSpecificDpdkOvsdbTerminationPointAugmentationBuilder(
public void close() {
final InstanceIdentifier<Autoattach> iid = SouthboundUtils.createInstanceIdentifier(connectionInfo)
.augmentation(OvsdbNodeAugmentation.class)
- .child(Autoattach.class, new AutoattachKey(this.autoattachId));
+ .child(Autoattach.class, new AutoattachKey(autoattachId));
final NotifyingDataChangeListener aaOperationalListener =
new NotifyingDataChangeListener(LogicalDatastoreType.OPERATIONAL, iid);
aaOperationalListener.registerDataChangeListener();
public void close() {
final InstanceIdentifier<QosEntries> qeIid = SouthboundUtils.createInstanceIdentifier(connectionInfo)
.augmentation(OvsdbNodeAugmentation.class)
- .child(QosEntries.class, new QosEntriesKey(this.qosId));
+ .child(QosEntries.class, new QosEntriesKey(qosId));
final NotifyingDataChangeListener qosOperationalListener =
new NotifyingDataChangeListener(LogicalDatastoreType.OPERATIONAL, qeIid);
qosOperationalListener.registerDataChangeListener();
public void close() {
InstanceIdentifier<Queues> queuesIid = SouthboundUtils.createInstanceIdentifier(connectionInfo)
.augmentation(OvsdbNodeAugmentation.class)
- .child(Queues.class, new QueuesKey(this.queueId));
+ .child(Queues.class, new QueuesKey(queueId));
final NotifyingDataChangeListener queueOperationalListener =
new NotifyingDataChangeListener(LogicalDatastoreType.OPERATIONAL, queuesIid);
queueOperationalListener.registerDataChangeListener();