Hyunsun Moon
Committed by Gerrit Code Review

Refactored bridge config to take bridge description

OVSDB provides lots of bridge configuration options but the exisisting
bridge config implementation only allows some of them by overloading
addBridge method. Also some of the bridge properties were set static
and unable to configure. This patch fixes these limitations.

- Added some bridge config options to the bridge description
- Deprecated multiple overloaded addBridge methods
- Some code clean up

Change-Id: Ibc828177b210bd4b215aea0b63cc359776c13e03
......@@ -35,8 +35,10 @@ import org.onosproject.net.Device;
import org.onosproject.net.DeviceId;
import org.onosproject.net.Port;
import org.onosproject.net.behaviour.BridgeConfig;
import org.onosproject.net.behaviour.BridgeDescription;
import org.onosproject.net.behaviour.BridgeName;
import org.onosproject.net.behaviour.ControllerInfo;
import org.onosproject.net.behaviour.DefaultBridgeDescription;
import org.onosproject.net.behaviour.DefaultTunnelDescription;
import org.onosproject.net.behaviour.TunnelConfig;
import org.onosproject.net.behaviour.TunnelDescription;
......@@ -399,7 +401,16 @@ public class OpenstackNodeManager implements OpenstackNodeService {
try {
DriverHandler handler = driverService.createHandler(node.ovsdbId());
BridgeConfig bridgeConfig = handler.behaviour(BridgeConfig.class);
bridgeConfig.addBridge(BridgeName.bridgeName(DEFAULT_BRIDGE), dpid, controllers);
BridgeDescription bridgeDesc = DefaultBridgeDescription.builder()
.name(DEFAULT_BRIDGE)
.failMode(BridgeDescription.FailMode.SECURE)
.datapathId(dpid)
.disableInBand()
.controllers(controllers)
.build();
bridgeConfig.addBridge(bridgeDesc);
} catch (ItemNotFoundException e) {
log.warn("Failed to create integration bridge on {}", node.ovsdbId());
}
......
......@@ -715,24 +715,17 @@ public class VtnManager implements VtnService {
.filter(d -> !("ovsdb:" + ipAddress).equals(d.id().toString()))
.forEach(d -> {
DriverHandler handler = driverService.createHandler(d.id());
BridgeConfig bridgeConfig = handler
.behaviour(BridgeConfig.class);
Collection<BridgeDescription> bridgeDescriptions = bridgeConfig
.getBridges();
Iterator<BridgeDescription> it = bridgeDescriptions
.iterator();
while (it.hasNext()) {
BridgeDescription sw = it.next();
if (sw.bridgeName().name().equals(VtnConfig.DEFAULT_BRIDGE_NAME)) {
List<Port> ports = deviceService.getPorts(sw.deviceId());
ports.stream()
.filter(p -> p.annotations().value(AnnotationKeys.PORT_NAME)
BridgeConfig bridgeConfig = handler.behaviour(BridgeConfig.class);
Collection<BridgeDescription> bridgeDescriptions = bridgeConfig.getBridges();
for (BridgeDescription sw : bridgeDescriptions) {
if (sw.name().equals(VtnConfig.DEFAULT_BRIDGE_NAME) &&
sw.deviceId().isPresent()) {
List<Port> ports = deviceService.getPorts(sw.deviceId().get());
ports.stream().filter(p -> p.annotations().value(AnnotationKeys.PORT_NAME)
.equalsIgnoreCase(tunnelName))
.forEach(p -> {
l2ForwardService.programTunnelOut(sw.deviceId(),
segmentationId, p.number(),
dstMac, type, ipAddress);
});
.forEach(p -> l2ForwardService.programTunnelOut(
sw.deviceId().get(), segmentationId, p.number(),
dstMac, type, ipAddress));
break;
}
}
......
......@@ -23,7 +23,9 @@ import org.onlab.packet.IpAddress;
import org.onosproject.net.DefaultAnnotations;
import org.onosproject.net.PortNumber;
import org.onosproject.net.behaviour.BridgeConfig;
import org.onosproject.net.behaviour.BridgeDescription;
import org.onosproject.net.behaviour.BridgeName;
import org.onosproject.net.behaviour.DefaultBridgeDescription;
import org.onosproject.net.behaviour.DefaultTunnelDescription;
import org.onosproject.net.behaviour.IpTunnelEndPoint;
import org.onosproject.net.behaviour.TunnelConfig;
......@@ -62,7 +64,16 @@ public final class VtnConfig {
*/
public static void applyBridgeConfig(DriverHandler handler, String dpid, String exPortName) {
BridgeConfig bridgeConfig = handler.behaviour(BridgeConfig.class);
bridgeConfig.addBridge(BridgeName.bridgeName(DEFAULT_BRIDGE_NAME), dpid, exPortName);
BridgeDescription bridgeDesc = DefaultBridgeDescription.builder()
.name(DEFAULT_BRIDGE_NAME)
.failMode(BridgeDescription.FailMode.SECURE)
.datapathId(dpid)
.disableInBand()
.enableLocalController()
.build();
bridgeConfig.addBridge(bridgeDesc);
bridgeConfig.addPort(BridgeName.bridgeName(DEFAULT_BRIDGE_NAME), exPortName);
}
/**
......
......@@ -31,31 +31,45 @@ public interface BridgeConfig extends HandlerBehaviour {
/**
* Add a bridge.
*
* @deprecated version 1.7.0 - Hummingbird
* @param bridgeName bridge name
*/
@Deprecated
void addBridge(BridgeName bridgeName);
/**
* Adds a bridge with given bridge name, dpid and exPortName.
*
* @deprecated version 1.7.0 - Hummingbird
* @param bridgeName bridge name
* @param dpid dpid
* @param exPortName external port name
*/
@Deprecated
void addBridge(BridgeName bridgeName, String dpid, String exPortName);
/**
* Adds a bridge with given bridge name and dpid, and sets the controller
* of the bridge with given controllers.
*
* @deprecated version 1.7.0 - Hummingbird
* @param bridgeName bridge name
* @param dpid dpid
* @param controllers list of controller
* @return true if succeeds, fail otherwise
*/
@Deprecated
boolean addBridge(BridgeName bridgeName, String dpid, List<ControllerInfo> controllers);
/**
* Adds a bridge with a given description.
*
* @param bridgeDescription bridge description
* @return true if succeeds, or false
*/
boolean addBridge(BridgeDescription bridgeDescription);
/**
* Remove a bridge.
*
* @param bridgeName bridge name
......
......@@ -18,29 +18,140 @@ package org.onosproject.net.behaviour;
import org.onosproject.net.Description;
import org.onosproject.net.DeviceId;
import java.util.List;
import java.util.Optional;
/**
* The abstraction of bridge in OVSDB protocol.
* The abstraction of a bridge. Bridge represents an Ethernet switch with no or
* multiple OpenFlow controllers. Only OVSDB device provides bridge config behavior
* now and the bridge description is based on OVSDB schema.
*/
public interface BridgeDescription extends Description {
enum FailMode {
/**
* The bridge will not set up flows on its own when the controller
* connection fails or no controllers are defined.
*/
SECURE,
/**
* The bridge will take over responsibility of setting up flows.
*/
STANDALONE
}
/**
* Returns bridge name.
*
* @return bridge name
*/
BridgeName bridgeName();
String name();
/**
* Returns OpenFlow controllers of the bridge.
* If it's empty, then no OpenFlow controllers are used for the bridge.
*
* @return set of controllers
*/
List<ControllerInfo> controllers();
/**
* Returns whether to use local controller as an OpenFlow controller of the
* bridge if no controllers are specified.
*
* @return true to set local controller, false otherwise
*/
boolean enableLocalController();
/**
* Returns fail mode of the bridge.
* If it's not set, the default setting of the bridge is used.
*
* @return fail mode
*/
Optional<FailMode> failMode();
/**
* Returns OpenFlow datapath ID of the bridge. Valid only if OpenFlow controller
* is configured for the bridge.
*
* @return datapath id
*/
Optional<String> datapathId();
/**
* Returns OpenFlow device ID. Valid only if OpenFlow controller is configured
* for the bridge.
*
* @return device id
*/
Optional<DeviceId> deviceId();
/**
* Returns in band control is enabled or not. If set to true, disable in-band
* control on the bridge regardless of controller and manager settings.
* If it's not set, the default setting of the bridge is used.
*
* @return true if in-band is disabled, false if in-band is enabled
*/
Optional<Boolean> disableInBand();
/**
* Builder of bridge description entities.
*/
interface Builder {
/**
* Returns bridge description builder with a given name.
*
* @param name bridge name
* @return bridge description builder
*/
Builder name(String name);
/**
* Returns bridge description builder with given controllers.
*
* @param controllers set of controllers
* @return bridge description builder
*/
Builder controllers(List<ControllerInfo> controllers);
/**
* Returns bridge description builder with local controller enabled.
*
* @return bridge description builder
*/
Builder enableLocalController();
/**
* Returns bridge description builder with a given fail mode.
*
* @param failMode fail mode
* @return bridge description builder
*/
Builder failMode(FailMode failMode);
/**
* Returns bridge description builder with a given datapath ID.
*
* @param datapathId datapath id
* @return bridge description builder
*/
Builder datapathId(String datapathId);
/**
* Returns controller identifier that this bridge belongs to.
* Returns bridge description builder with in-band control disabled.
*
* @return controller identifier
* @return bridge description builder
*/
DeviceId cotrollerDeviceId();
Builder disableInBand();
/**
* Returns bridge identifier .
* Builds an immutable bridge description.
*
* @return bridge identifier
* @return bridge description
*/
DeviceId deviceId();
BridgeDescription build();
}
}
......
......@@ -15,73 +15,158 @@
*/
package org.onosproject.net.behaviour;
import java.util.Objects;
import org.onosproject.net.AbstractDescription;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import org.onosproject.net.DeviceId;
import org.onosproject.net.SparseAnnotations;
import com.google.common.base.MoreObjects;
import java.util.List;
import java.util.Optional;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* The default implementation of bridge.
*/
public final class DefaultBridgeDescription extends AbstractDescription
implements BridgeDescription {
public final class DefaultBridgeDescription implements BridgeDescription {
private final BridgeName name;
private final DeviceId deviceId;
private final DeviceId controllerId;
private final String name;
public DefaultBridgeDescription(BridgeName name, DeviceId controllerId,
DeviceId deviceId,
SparseAnnotations... annotations) {
super(annotations);
this.name = name;
this.deviceId = deviceId;
this.controllerId = controllerId;
/* Optional OpenFlow configurations */
private final List<ControllerInfo> controllers;
private final boolean enableLocalController;
private final Optional<FailMode> failMode;
private final Optional<String> datapathId;
private final Optional<Boolean> disableInBand;
/* Adds more configurations */
private DefaultBridgeDescription(String name,
List<ControllerInfo> controllers,
boolean enableLocalController,
Optional<FailMode> failMode,
Optional<String> datapathId,
Optional<Boolean> disableInBand) {
this.name = checkNotNull(name);
this.controllers = controllers;
this.enableLocalController = enableLocalController;
this.failMode = failMode;
this.datapathId = datapathId;
this.disableInBand = disableInBand;
}
@Override
public BridgeName bridgeName() {
public SparseAnnotations annotations() {
return null;
}
@Override
public String name() {
return name;
}
@Override
public DeviceId deviceId() {
return deviceId;
public List<ControllerInfo> controllers() {
return controllers;
}
@Override
public boolean enableLocalController() {
return enableLocalController;
}
@Override
public DeviceId cotrollerDeviceId() {
return controllerId;
public Optional<FailMode> failMode() {
return failMode;
}
@Override
public int hashCode() {
return Objects.hash(name, deviceId, controllerId);
public Optional<String> datapathId() {
return datapathId;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
public Optional<DeviceId> deviceId() {
if (datapathId.isPresent()) {
return Optional.of(DeviceId.deviceId("of:" + datapathId.get()));
} else {
return Optional.empty();
}
if (obj instanceof DefaultBridgeDescription) {
final DefaultBridgeDescription that = (DefaultBridgeDescription) obj;
return this.getClass() == that.getClass()
&& Objects.equals(this.name, that.name)
&& Objects.equals(this.deviceId, that.deviceId)
&& Objects.equals(this.controllerId, that.controllerId);
}
return false;
@Override
public Optional<Boolean> disableInBand() {
return disableInBand;
}
/**
* Creates and returns a new builder instance.
*
* @return new builder
*/
public static BridgeDescription.Builder builder() {
return new Builder();
}
public static final class Builder implements BridgeDescription.Builder {
private String name;
private List<ControllerInfo> controllers = Lists.newArrayList();
private boolean enableLocalController = false;
private Optional<FailMode> failMode = Optional.empty();
private Optional<String> datapathId = Optional.empty();
private Optional<Boolean> disableInBand = Optional.empty();
private Builder() {
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass()).add("name", name)
.add("deviceId", deviceId).add("controllerId", controllerId)
.toString();
public BridgeDescription build() {
return new DefaultBridgeDescription(name, controllers,
enableLocalController,
failMode,
datapathId,
disableInBand);
}
@Override
public Builder name(String name) {
checkArgument(!Strings.isNullOrEmpty(name));
this.name = name;
return this;
}
@Override
public Builder controllers(List<ControllerInfo> controllers) {
if (controllers != null) {
this.controllers = Lists.newArrayList(controllers);
}
return this;
}
@Override
public Builder enableLocalController() {
this.enableLocalController = true;
return this;
}
@Override
public Builder failMode(FailMode failMode) {
this.failMode = Optional.ofNullable(failMode);
return this;
}
@Override
public Builder datapathId(String datapathId) {
this.datapathId = Optional.ofNullable(datapathId);
return this;
}
@Override
public Builder disableInBand() {
this.disableInBand = Optional.of(Boolean.TRUE);
return this;
}
}
}
......
......@@ -49,48 +49,74 @@ import java.util.stream.Collectors;
public class OvsdbBridgeConfig extends AbstractHandlerBehaviour
implements BridgeConfig {
@Deprecated
@Override
public void addBridge(BridgeName bridgeName) {
DriverHandler handler = handler();
OvsdbClientService clientService = getOvsdbClientService(handler);
clientService.createBridge(bridgeName.name());
BridgeDescription bridgeDesc = DefaultBridgeDescription.builder()
.name(bridgeName.name())
.build();
addBridge(bridgeDesc);
}
@Deprecated
@Override
public void addBridge(BridgeName bridgeName, String dpid, String exPortName) {
DriverHandler handler = handler();
OvsdbClientService clientService = getOvsdbClientService(handler);
clientService.createBridge(bridgeName.name(), dpid, exPortName);
BridgeDescription bridgeDesc = DefaultBridgeDescription.builder()
.name(bridgeName.name())
.failMode(BridgeDescription.FailMode.SECURE)
.datapathId(dpid)
.disableInBand()
.enableLocalController()
.build();
addBridge(bridgeDesc);
OvsdbClientService client = getOvsdbClientService(handler());
client.createPort(bridgeName.name(), exPortName);
}
@Deprecated
@Override
public boolean addBridge(BridgeName bridgeName, String dpid, List<ControllerInfo> controllers) {
DriverHandler handler = handler();
OvsdbClientService clientService = getOvsdbClientService(handler);
return clientService.createBridge(bridgeName.name(), dpid, controllers);
BridgeDescription bridgeDesc = DefaultBridgeDescription.builder()
.name(bridgeName.name())
.failMode(BridgeDescription.FailMode.SECURE)
.datapathId(dpid)
.disableInBand()
.controllers(controllers)
.build();
return addBridge(bridgeDesc);
}
@Override
public boolean addBridge(BridgeDescription bridgeDesc) {
OvsdbClientService client = getOvsdbClientService(handler());
OvsdbBridge.Builder bridgeBuilder = OvsdbBridge.builder(bridgeDesc);
if (bridgeDesc.enableLocalController()) {
bridgeBuilder.controller(client.localController());
}
return client.createBridge(bridgeBuilder.build());
}
@Override
public void deleteBridge(BridgeName bridgeName) {
DriverHandler handler = handler();
OvsdbClientService clientService = getOvsdbClientService(handler);
clientService.dropBridge(bridgeName.name());
OvsdbClientService client = getOvsdbClientService(handler());
client.dropBridge(bridgeName.name());
}
@Override
public Collection<BridgeDescription> getBridges() {
DriverHandler handler = handler();
DeviceId deviceId = handler.data().deviceId();
OvsdbClientService clientService = getOvsdbClientService(handler);
Set<OvsdbBridge> bridges = clientService.getBridges();
OvsdbClientService client = getOvsdbClientService(handler());
Set<OvsdbBridge> bridges = client.getBridges();
return bridges.stream()
.map(x -> new DefaultBridgeDescription(
BridgeName.bridgeName(x.bridgeName().value()),
deviceId,
DeviceId.deviceId("of:" + x.datapathId().value())
)
)
.map(bridge -> DefaultBridgeDescription.builder()
.name(bridge.name())
.datapathId(bridge.datapathId().get())
.build())
.collect(Collectors.toSet());
}
......@@ -98,49 +124,42 @@ public class OvsdbBridgeConfig extends AbstractHandlerBehaviour
@Deprecated
@Override
public void addPort(PortDescription port) {
DriverHandler handler = handler();
OvsdbClientService clientService = getOvsdbClientService(handler);
Set<OvsdbBridge> ovsdbSet = clientService.getBridges();
OvsdbClientService client = getOvsdbClientService(handler());
Set<OvsdbBridge> ovsdbSet = client.getBridges();
if (ovsdbSet != null && ovsdbSet.size() > 0) {
OvsdbBridge bridge = ovsdbSet.iterator().next();
clientService.createPort(bridge.bridgeName().value(), port
.portNumber().toString());
client.createPort(bridge.name(), port.portNumber().toString());
}
}
@Override
public void addPort(BridgeName bridgeName, String portName) {
DriverHandler handler = handler();
OvsdbClientService clientService = getOvsdbClientService(handler);
clientService.createPort(bridgeName.name(), portName);
OvsdbClientService client = getOvsdbClientService(handler());
client.createPort(bridgeName.name(), portName);
}
//Deprecated from version 1.5.0 - Falcon
@Deprecated
@Override
public void deletePort(PortDescription port) {
DriverHandler handler = handler();
OvsdbClientService clientService = getOvsdbClientService(handler);
Set<OvsdbBridge> ovsdbSet = clientService.getBridges();
OvsdbClientService client = getOvsdbClientService(handler());
Set<OvsdbBridge> ovsdbSet = client.getBridges();
if (ovsdbSet != null && ovsdbSet.size() > 0) {
OvsdbBridge bridge = ovsdbSet.iterator().next();
clientService.dropPort(bridge.bridgeName().value(), port
.portNumber().toString());
client.dropPort(bridge.name(), port.portNumber().toString());
}
}
@Override
public void deletePort(BridgeName bridgeName, String portName) {
DriverHandler handler = handler();
OvsdbClientService clientService = getOvsdbClientService(handler);
clientService.dropPort(bridgeName.name(), portName);
OvsdbClientService client = getOvsdbClientService(handler());
client.dropPort(bridgeName.name(), portName);
}
@Override
public Collection<PortDescription> getPorts() {
DriverHandler handler = handler();
OvsdbClientService clientService = getOvsdbClientService(handler);
Set<OvsdbPort> ports = clientService.getPorts();
OvsdbClientService client = getOvsdbClientService(handler());
Set<OvsdbPort> ports = client.getPorts();
return ports.stream()
.map(x -> new DefaultPortDescription(
......@@ -174,8 +193,8 @@ public class OvsdbBridgeConfig extends AbstractHandlerBehaviour
@Override
public Set<PortNumber> getPortNumbers() {
DriverHandler handler = handler();
OvsdbClientService clientService = getOvsdbClientService(handler);
Set<OvsdbPort> ports = clientService.getPorts();
OvsdbClientService client = getOvsdbClientService(handler);
Set<OvsdbPort> ports = client.getPorts();
return ports.stream()
.map(x -> PortNumber.portNumber(
......@@ -190,8 +209,8 @@ public class OvsdbBridgeConfig extends AbstractHandlerBehaviour
public List<PortNumber> getLocalPorts(Iterable<String> ifaceIds) {
List<PortNumber> ports = new ArrayList<>();
DriverHandler handler = handler();
OvsdbClientService clientService = getOvsdbClientService(handler);
Set<OvsdbPort> ovsdbSet = clientService.getLocalPorts(ifaceIds);
OvsdbClientService client = getOvsdbClientService(handler);
Set<OvsdbPort> ovsdbSet = client.getLocalPorts(ifaceIds);
ovsdbSet.forEach(o -> {
PortNumber port = PortNumber.portNumber(o.portNumber().value(),
o.portName().value());
......
......@@ -36,6 +36,7 @@ import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkState;
import static org.onlab.util.Tools.delay;
......@@ -96,7 +97,9 @@ public class OvsdbControllerConfig extends AbstractHandlerBehaviour implements C
}
private static boolean dpidMatches(OvsdbBridge bridge, DeviceId deviceId) {
String bridgeDpid = "of:" + bridge.datapathId().value();
checkArgument(bridge.datapathId().isPresent());
String bridgeDpid = "of:" + bridge.datapathId().get();
String ofDpid = deviceId.toString();
return bridgeDpid.equals(ofDpid);
}
......
......@@ -15,32 +15,55 @@
*/
package org.onosproject.ovsdb.controller;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.onosproject.net.behaviour.BridgeDescription;
import org.onosproject.net.behaviour.BridgeDescription.FailMode;
import org.onosproject.net.behaviour.ControllerInfo;
import static com.google.common.base.MoreObjects.toStringHelper;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.onosproject.ovsdb.controller.OvsdbConstant.DATAPATH_ID;
import static org.onosproject.ovsdb.controller.OvsdbConstant.DISABLE_INBAND;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* The class representing an ovsdb bridge.
* The class representing an OVSDB bridge.
* This class is immutable.
*/
public final class OvsdbBridge {
private final OvsdbBridgeName bridgeName;
private final OvsdbDatapathId datapathId;
private final String name;
/* OpenFlow properties */
private final Optional<FailMode> failMode;
private final List<ControllerInfo> controllers;
/* Adds more properties */
/* other optional configs */
private final Map<String, String> otherConfigs;
/**
* Constructor from an OvsdbBridgeName bridgeName and an OvsdbDatapathId
* datapathId.
* Default constructor.
*
* @param bridgeName the bridgeName to use
* @param datapathId the datapathId to use
* @param name name of the bridge
* @param failMode openflow controller fail mode policy
* @param controllers list of openflow controllers
* @param otherConfigs other configs
*/
public OvsdbBridge(OvsdbBridgeName bridgeName, OvsdbDatapathId datapathId) {
checkNotNull(bridgeName, "bridgeName is not null");
checkNotNull(datapathId, "datapathId is not null");
this.bridgeName = bridgeName;
this.datapathId = datapathId;
private OvsdbBridge(String name, Optional<FailMode> failMode,
List<ControllerInfo> controllers,
Map<String, String> otherConfigs) {
this.name = checkNotNull(name);
this.failMode = failMode;
this.controllers = controllers;
this.otherConfigs = otherConfigs;
}
/**
......@@ -48,22 +71,49 @@ public final class OvsdbBridge {
*
* @return the bridge name of bridge
*/
public OvsdbBridgeName bridgeName() {
return bridgeName;
public String name() {
return name;
}
/**
* Returns the controllers of the bridge.
*
* @return list of controllers
*/
public List<ControllerInfo> controllers() {
return controllers;
}
/**
* Returns fail mode of the bridge.
*
* @return fail mode
*/
public Optional<FailMode> failMode() {
return failMode;
}
/**
* Returns other configurations of the bridge.
*
* @return map of configurations
*/
public Map<String, String> otherConfigs() {
return otherConfigs;
}
/**
* Gets the datapathId of bridge.
*
* @return datapathId the datapathId to use
* @return datapath id; null if not used
*/
public OvsdbDatapathId datapathId() {
return datapathId;
public Optional<String> datapathId() {
return Optional.ofNullable(otherConfigs.get(DATAPATH_ID));
}
@Override
public int hashCode() {
return Objects.hash(bridgeName, datapathId);
return Objects.hash(name);
}
@Override
......@@ -73,16 +123,154 @@ public final class OvsdbBridge {
}
if (obj instanceof OvsdbBridge) {
final OvsdbBridge otherOvsdbBridge = (OvsdbBridge) obj;
return Objects.equals(this.bridgeName, otherOvsdbBridge.bridgeName)
&& Objects.equals(this.datapathId,
otherOvsdbBridge.datapathId);
return Objects.equals(this.name, otherOvsdbBridge.name);
}
return false;
}
@Override
public String toString() {
return toStringHelper(this).add("bridgeName", bridgeName.value())
.add("datapathId", datapathId.value()).toString();
return toStringHelper(this)
.add("bridgeName", name)
.add("failMode", failMode)
.add("controllers", controllers)
.add("otherConfigs", otherConfigs)
.toString();
}
/**
* Returns a new builder instance.
*
* @return ovsdb bridge builder
*/
public static OvsdbBridge.Builder builder() {
return new Builder();
}
/**
* Returns OVSDB bridge object with a given bridge description.
*
* @param bridgeDesc bridge description
* @return ovsdb bridge
*/
public static OvsdbBridge.Builder builder(BridgeDescription bridgeDesc) {
return new Builder(bridgeDesc);
}
/**
* Builder of OVSDB bridge entities.
*/
public static final class Builder {
private String name;
private Optional<FailMode> failMode = Optional.empty();
private List<ControllerInfo> controllers = Lists.newArrayList();
private Map<String, String> otherConfigs = Maps.newHashMap();
private Builder() {
}
/**
* Constructs OVSDB bridge builder with a given bridge description.
*
* @param bridgeDesc bridge description
*/
private Builder(BridgeDescription bridgeDesc) {
if (bridgeDesc.datapathId().isPresent()) {
otherConfigs.put(DATAPATH_ID, bridgeDesc.datapathId().get());
}
if (bridgeDesc.disableInBand().isPresent()) {
otherConfigs.put(DISABLE_INBAND,
bridgeDesc.disableInBand().get().toString());
}
this.name = bridgeDesc.name();
this.failMode = bridgeDesc.failMode();
this.controllers = Lists.newArrayList(bridgeDesc.controllers());
}
/**
* Builds an immutable OVSDB bridge.
*
* @return ovsdb bridge
*/
public OvsdbBridge build() {
return new OvsdbBridge(name, failMode, controllers, otherConfigs);
}
/**
* Returns OVSDB bridge builder with a given name.
*
* @param name name of the bridge
* @return ovsdb bridge builder
*/
public Builder name(String name) {
this.name = name;
return this;
}
/**
* Returns OVSDB bridge builder with a given fail mode.
*
* @param failMode fail mode
* @return ovsdb bridge builder
*/
public Builder failMode(FailMode failMode) {
this.failMode = Optional.ofNullable(failMode);
return this;
}
/**
* Returns OVSDB bridge builder with given controllers.
*
* @param controllers list of controllers
* @return ovsdb bridge builder
*/
public Builder controllers(List<ControllerInfo> controllers) {
this.controllers = Lists.newArrayList(controllers);
return this;
}
/**
* Returns OVSDB bridge builder with a given controller.
*
* @param controller controller
* @return ovsdb bridge builder
*/
public Builder controller(ControllerInfo controller) {
this.controllers = Lists.newArrayList(controller);
return this;
}
/**
* Returns OVSDB bridge builder with given configs.
*
* @param otherConfigs other configs
* @return ovsdb bridge builder
*/
public Builder otherConfigs(Map<String, String> otherConfigs) {
this.otherConfigs = Maps.newHashMap(otherConfigs);
return this;
}
/**
* Returns OVSDB bridge builder with a given datapath ID.
*
* @param datapathId datapath id
* @return ovsdb bridge builder
*/
public Builder datapathId(String datapathId) {
otherConfigs.put(DATAPATH_ID, datapathId);
return this;
}
/**
* Returns OVSDB bridge builder with a given disable in-band config.
*
* @return ovsdb bridge builder
*/
public Builder disableInBand() {
otherConfigs.put(DATAPATH_ID, Boolean.TRUE.toString());
return this;
}
}
}
......
/*
* Copyright 2015-present Open Networking Laboratory
*
* Licensed 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 org.onosproject.ovsdb.controller;
import static com.google.common.base.MoreObjects.toStringHelper;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Objects;
/**
* The class representing a bridge name.
* This class is immutable.
*/
public final class OvsdbBridgeName {
private final String value;
/**
* Constructor from a String.
*
* @param value the bridge name to use
*/
public OvsdbBridgeName(String value) {
checkNotNull(value, "value is not null");
this.value = value;
}
/**
* Gets the value of bridge name.
*
* @return the value of the bridge name
*/
public String value() {
return value;
}
@Override
public int hashCode() {
return value.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof OvsdbBridgeName) {
final OvsdbBridgeName otherBridgeName = (OvsdbBridgeName) obj;
return Objects.equals(this.value, otherBridgeName.value);
}
return false;
}
@Override
public String toString() {
return toStringHelper(this).add("value", value).toString();
}
}
......@@ -72,31 +72,45 @@ public interface OvsdbClientService extends OvsdbRpc {
/**
* Creates a bridge.
*
* @deprecated version 1.7.0 - Hummingbird
* @param bridgeName bridge name
*/
@Deprecated
void createBridge(String bridgeName);
/**
* Creates a bridge.
*
* @deprecated version 1.7.0 - Hummingbird
* @param bridgeName bridge name
* @param dpid data path id
* @param exPortName external port name
*/
@Deprecated
void createBridge(String bridgeName, String dpid, String exPortName);
/**
* Creates a bridge with given name and dpid.
* Sets the bridge's controller with given controllers.
*
* @deprecated version 1.7.0 - Hummingbird
* @param bridgeName bridge name
* @param dpid data path id
* @param controllers controllers
* @return true if bridge creation is successful, false otherwise
*/
@Deprecated
boolean createBridge(String bridgeName, String dpid, List<ControllerInfo> controllers);
/**
* Creates a bridge with a given bridge description.
*
* @param ovsdbBridge ovsdb bridge description
* @return true if bridge creation is successful, otherwise false
*/
boolean createBridge(OvsdbBridge ovsdbBridge);
/**
* Drops a bridge.
*
* @param bridgeName bridge name
......@@ -119,6 +133,15 @@ public interface OvsdbClientService extends OvsdbRpc {
Set<ControllerInfo> getControllers(DeviceId openflowDeviceId);
/**
* Returns local controller information.
* The connection is a TCP connection to the local ONOS instance's IP
* and the default OpenFlow port.
*
* @return local controller
*/
ControllerInfo localController();
/**
* Sets the Controllers for the specified bridge.
* <p>
* This method will replace the existing controller list with the new controller
......
......@@ -29,40 +29,46 @@ public final class OvsdbConstant {
private OvsdbConstant() {
}
/** Common column names. */
public static final String UUID = "_uuid";
/** Ovsdb database Open_vSwitch. */
public static final String DATABASENAME = "Open_vSwitch";
/** Ovsdb table Bridge. */
/** Open_vSwitch table. */
public static final String BRIDGES = "bridges";
/** Bridge table. */
public static final String BRIDGE = "Bridge";
public static final String PORTS = "ports";
// other configs
public static final String DATAPATH_ID = "datapath-id";
public static final String DISABLE_INBAND = "disable-in-band";
/** Ovsdb table Interface. */
/** Interface table. */
public static final String INTERFACE = "Interface";
// type
public static final String TYPEVXLAN = "vxlan";
// virtual machine identifiers
public static final String EXTERNAL_ID_INTERFACE_ID = "iface-id";
public static final String EXTERNAL_ID_VM_MAC = "attached-mac";
/** Ovsdb table Controller. */
/** Controller table. */
public static final String CONTROLLER = "Controller";
/** Ovsdb table Port. */
/** Port table. */
public static final String PORT = "Port";
/** Ovsdb bridge name. */
// TODO remove this particular bridge name from OVSDB provider
public static final String INTEGRATION_BRIDGE = "br-int";
/** Ovsdb vxlan tunnel type. */
public static final String TYPEVXLAN = "vxlan";
/** Openflow version. */
public static final String OPENFLOW13 = "OpenFlow13";
/** Ovsdb external_id_interface_id.. */
public static final String EXTERNAL_ID_INTERFACE_ID = "iface-id";
/** Ovsdb external_id_vm_mac. */
public static final String EXTERNAL_ID_VM_MAC = "attached-mac";
/** Openflow port. */
public static final int OFPORT = 6653;
/** Ovsdb port. */
public static final int OVSDBPORT = 6640;
}
......
......@@ -74,6 +74,11 @@ public class OvsdbClientServiceAdapter implements OvsdbClientService {
}
@Override
public boolean createBridge(OvsdbBridge ovsdbBridge) {
return true;
}
@Override
public void dropBridge(String bridgeName) {
}
......@@ -89,6 +94,11 @@ public class OvsdbClientServiceAdapter implements OvsdbClientService {
}
@Override
public ControllerInfo localController() {
return null;
}
@Override
public void setControllersWithUuid(Uuid bridgeUuid, List<ControllerInfo> controllers) {
}
......