From 1251e19d7a6d94e7906afe7b1838e7a27dbef3ad Mon Sep 17 00:00:00 2001 From: Hyunsun Moon Date: Tue, 7 Jun 2016 16:57:05 -0700 Subject: [PATCH] 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 --- .../openstacknode/OpenstackNodeManager.java | 13 +- .../vtn/manager/impl/VtnManager.java | 29 +- .../org/onosproject/vtn/util/VtnConfig.java | 13 +- .../net/behaviour/BridgeConfig.java | 14 + .../net/behaviour/BridgeDescription.java | 127 +++- .../behaviour/DefaultBridgeDescription.java | 161 +++-- .../drivers/ovsdb/OvsdbBridgeConfig.java | 111 ++-- .../drivers/ovsdb/OvsdbControllerConfig.java | 5 +- .../ovsdb/controller/OvsdbBridge.java | 238 +++++++- .../ovsdb/controller/OvsdbBridgeName.java | 72 --- .../ovsdb/controller/OvsdbClientService.java | 23 + .../ovsdb/controller/OvsdbConstant.java | 34 +- .../controller/driver/DefaultOvsdbClient.java | 566 ++++++------------ .../driver/OvsdbClientServiceAdapter.java | 10 + 14 files changed, 799 insertions(+), 617 deletions(-) delete mode 100644 protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridgeName.java diff --git a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/OpenstackNodeManager.java b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/OpenstackNodeManager.java index 165e665c00..c011fc3549 100644 --- a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/OpenstackNodeManager.java +++ b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/OpenstackNodeManager.java @@ -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()); } diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VtnManager.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VtnManager.java index 8f46dbea7f..2b794dc632 100644 --- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VtnManager.java +++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VtnManager.java @@ -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 bridgeDescriptions = bridgeConfig - .getBridges(); - Iterator it = bridgeDescriptions - .iterator(); - while (it.hasNext()) { - BridgeDescription sw = it.next(); - if (sw.bridgeName().name().equals(VtnConfig.DEFAULT_BRIDGE_NAME)) { - List ports = deviceService.getPorts(sw.deviceId()); - ports.stream() - .filter(p -> p.annotations().value(AnnotationKeys.PORT_NAME) - .equalsIgnoreCase(tunnelName)) - .forEach(p -> { - l2ForwardService.programTunnelOut(sw.deviceId(), - segmentationId, p.number(), - dstMac, type, ipAddress); - }); + BridgeConfig bridgeConfig = handler.behaviour(BridgeConfig.class); + Collection bridgeDescriptions = bridgeConfig.getBridges(); + for (BridgeDescription sw : bridgeDescriptions) { + if (sw.name().equals(VtnConfig.DEFAULT_BRIDGE_NAME) && + sw.deviceId().isPresent()) { + List ports = deviceService.getPorts(sw.deviceId().get()); + ports.stream().filter(p -> p.annotations().value(AnnotationKeys.PORT_NAME) + .equalsIgnoreCase(tunnelName)) + .forEach(p -> l2ForwardService.programTunnelOut( + sw.deviceId().get(), segmentationId, p.number(), + dstMac, type, ipAddress)); break; } } diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java index 33417796e5..7301a46e2e 100644 --- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java +++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java @@ -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); } /** diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/BridgeConfig.java b/core/api/src/main/java/org/onosproject/net/behaviour/BridgeConfig.java index 1461db341a..3b47079fd2 100644 --- a/core/api/src/main/java/org/onosproject/net/behaviour/BridgeConfig.java +++ b/core/api/src/main/java/org/onosproject/net/behaviour/BridgeConfig.java @@ -31,30 +31,44 @@ 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 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. * diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/BridgeDescription.java b/core/api/src/main/java/org/onosproject/net/behaviour/BridgeDescription.java index e945ade81b..a8c08327af 100644 --- a/core/api/src/main/java/org/onosproject/net/behaviour/BridgeDescription.java +++ b/core/api/src/main/java/org/onosproject/net/behaviour/BridgeDescription.java @@ -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 controller identifier that this bridge belongs to. + * Returns OpenFlow controllers of the bridge. + * If it's empty, then no OpenFlow controllers are used for the bridge. * - * @return controller identifier + * @return set of controllers */ - DeviceId cotrollerDeviceId(); + List controllers(); /** - * Returns bridge identifier . + * Returns whether to use local controller as an OpenFlow controller of the + * bridge if no controllers are specified. * - * @return bridge identifier + * @return true to set local controller, false otherwise */ - DeviceId deviceId(); + 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(); + + /** + * Returns OpenFlow datapath ID of the bridge. Valid only if OpenFlow controller + * is configured for the bridge. + * + * @return datapath id + */ + Optional datapathId(); + + /** + * Returns OpenFlow device ID. Valid only if OpenFlow controller is configured + * for the bridge. + * + * @return device id + */ + Optional 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 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 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 bridge description builder with in-band control disabled. + * + * @return bridge description builder + */ + Builder disableInBand(); + + /** + * Builds an immutable bridge description. + * + * @return bridge description + */ + BridgeDescription build(); + } } diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/DefaultBridgeDescription.java b/core/api/src/main/java/org/onosproject/net/behaviour/DefaultBridgeDescription.java index 6bd73a8567..f35b64633b 100644 --- a/core/api/src/main/java/org/onosproject/net/behaviour/DefaultBridgeDescription.java +++ b/core/api/src/main/java/org/onosproject/net/behaviour/DefaultBridgeDescription.java @@ -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 controllers; + private final boolean enableLocalController; + private final Optional failMode; + private final Optional datapathId; + private final Optional disableInBand; + + /* Adds more configurations */ + + private DefaultBridgeDescription(String name, + List controllers, + boolean enableLocalController, + Optional failMode, + Optional datapathId, + Optional 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 controllers() { + return controllers; } @Override - public DeviceId cotrollerDeviceId() { - return controllerId; + public boolean enableLocalController() { + return enableLocalController; } @Override - public int hashCode() { - return Objects.hash(name, deviceId, controllerId); + public Optional failMode() { + return failMode; } @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; + public Optional datapathId() { + return datapathId; + } + + @Override + public Optional 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 String toString() { - return MoreObjects.toStringHelper(getClass()).add("name", name) - .add("deviceId", deviceId).add("controllerId", controllerId) - .toString(); + public Optional 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 controllers = Lists.newArrayList(); + private boolean enableLocalController = false; + private Optional failMode = Optional.empty(); + private Optional datapathId = Optional.empty(); + private Optional disableInBand = Optional.empty(); + + private Builder() { + } + + @Override + 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 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; + } + } } diff --git a/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbBridgeConfig.java b/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbBridgeConfig.java index 20209bbd0b..5022799704 100644 --- a/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbBridgeConfig.java +++ b/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbBridgeConfig.java @@ -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 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(BridgeName bridgeName, String dpid, List controllers) { - DriverHandler handler = handler(); - OvsdbClientService clientService = getOvsdbClientService(handler); - return clientService.createBridge(bridgeName.name(), dpid, controllers); + 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 getBridges() { - DriverHandler handler = handler(); - DeviceId deviceId = handler.data().deviceId(); - OvsdbClientService clientService = getOvsdbClientService(handler); - Set bridges = clientService.getBridges(); + OvsdbClientService client = getOvsdbClientService(handler()); + Set 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 ovsdbSet = clientService.getBridges(); + OvsdbClientService client = getOvsdbClientService(handler()); + Set 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 ovsdbSet = clientService.getBridges(); + OvsdbClientService client = getOvsdbClientService(handler()); + Set 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 getPorts() { - DriverHandler handler = handler(); - OvsdbClientService clientService = getOvsdbClientService(handler); - Set ports = clientService.getPorts(); + OvsdbClientService client = getOvsdbClientService(handler()); + Set ports = client.getPorts(); return ports.stream() .map(x -> new DefaultPortDescription( @@ -174,8 +193,8 @@ public class OvsdbBridgeConfig extends AbstractHandlerBehaviour @Override public Set getPortNumbers() { DriverHandler handler = handler(); - OvsdbClientService clientService = getOvsdbClientService(handler); - Set ports = clientService.getPorts(); + OvsdbClientService client = getOvsdbClientService(handler); + Set ports = client.getPorts(); return ports.stream() .map(x -> PortNumber.portNumber( @@ -190,8 +209,8 @@ public class OvsdbBridgeConfig extends AbstractHandlerBehaviour public List getLocalPorts(Iterable ifaceIds) { List ports = new ArrayList<>(); DriverHandler handler = handler(); - OvsdbClientService clientService = getOvsdbClientService(handler); - Set ovsdbSet = clientService.getLocalPorts(ifaceIds); + OvsdbClientService client = getOvsdbClientService(handler); + Set ovsdbSet = client.getLocalPorts(ifaceIds); ovsdbSet.forEach(o -> { PortNumber port = PortNumber.portNumber(o.portNumber().value(), o.portName().value()); diff --git a/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbControllerConfig.java b/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbControllerConfig.java index 5b42b2db93..95971697d4 100644 --- a/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbControllerConfig.java +++ b/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbControllerConfig.java @@ -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); } diff --git a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridge.java b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridge.java index 73d7dd834e..00eb375b35 100644 --- a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridge.java +++ b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridge.java @@ -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 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; -import java.util.Objects; - /** - * 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; + private final List controllers; + + /* Adds more properties */ + + /* other optional configs */ + private final Map 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, + List controllers, + Map 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 controllers() { + return controllers; + } + + /** + * Returns fail mode of the bridge. + * + * @return fail mode + */ + public Optional failMode() { + return failMode; + } + + /** + * Returns other configurations of the bridge. + * + * @return map of configurations + */ + public Map 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 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 = Optional.empty(); + private List controllers = Lists.newArrayList(); + private Map 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 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 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; + } } } diff --git a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridgeName.java b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridgeName.java deleted file mode 100644 index dc905bb451..0000000000 --- a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridgeName.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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(); - } - -} diff --git a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java index 8db1dbc7ab..bf91497c44 100644 --- a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java +++ b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java @@ -72,30 +72,44 @@ 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 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. * @@ -118,6 +132,15 @@ public interface OvsdbClientService extends OvsdbRpc { */ Set 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. *

diff --git a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbConstant.java b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbConstant.java index c1d00a19f4..5bca1f9fb0 100644 --- a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbConstant.java +++ b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbConstant.java @@ -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; - } diff --git a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java index 3649866618..cbb94ac846 100644 --- a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java +++ b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java @@ -17,7 +17,6 @@ package org.onosproject.ovsdb.controller.driver; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.base.Function; -import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -29,12 +28,10 @@ import io.netty.channel.Channel; import org.onlab.packet.IpAddress; import org.onosproject.net.DeviceId; +import org.onosproject.net.behaviour.BridgeDescription; import org.onosproject.net.behaviour.ControllerInfo; import org.onosproject.ovsdb.controller.OvsdbBridge; -import org.onosproject.ovsdb.controller.OvsdbBridgeName; import org.onosproject.ovsdb.controller.OvsdbClientService; -import org.onosproject.ovsdb.controller.OvsdbConstant; -import org.onosproject.ovsdb.controller.OvsdbDatapathId; import org.onosproject.ovsdb.controller.OvsdbNodeId; import org.onosproject.ovsdb.controller.OvsdbPort; import org.onosproject.ovsdb.controller.OvsdbPortName; @@ -43,7 +40,6 @@ import org.onosproject.ovsdb.controller.OvsdbRowStore; import org.onosproject.ovsdb.controller.OvsdbStore; import org.onosproject.ovsdb.controller.OvsdbTableStore; import org.onosproject.ovsdb.controller.OvsdbTunnel; -import org.onosproject.ovsdb.rfc.exception.BridgeCreateException; import org.onosproject.ovsdb.rfc.jsonrpc.Callback; import org.onosproject.ovsdb.rfc.message.OperationResult; import org.onosproject.ovsdb.rfc.message.TableUpdates; @@ -77,7 +73,6 @@ import org.slf4j.LoggerFactory; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -88,28 +83,24 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; +import static org.onosproject.ovsdb.controller.OvsdbConstant.*; + /** * An representation of an ovsdb client. */ -public class DefaultOvsdbClient - implements OvsdbProviderService, OvsdbClientService { +public class DefaultOvsdbClient implements OvsdbProviderService, OvsdbClientService { - private final Logger log = LoggerFactory - .getLogger(DefaultOvsdbClient.class); + private final Logger log = LoggerFactory.getLogger(DefaultOvsdbClient.class); private Channel channel; - private OvsdbAgent agent; private boolean connected; private OvsdbNodeId nodeId; private Callback monitorCallBack; - private OvsdbStore ovsdbStore = new OvsdbStore(); private final Map requestMethod = Maps.newHashMap(); - private final Map> requestResult = Maps - .newHashMap(); - + private final Map> requestResult = Maps.newHashMap(); private final Map schema = Maps.newHashMap(); private final Set ovsdbTunnels = new HashSet(); @@ -245,11 +236,9 @@ public class DefaultOvsdbClient @Override public String getPortUuid(String portName, String bridgeUuid) { - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); - - Row bridgeRow = getRow(OvsdbConstant.DATABASENAME, - OvsdbConstant.BRIDGE, bridgeUuid); + DatabaseSchema dbSchema = schema.get(DATABASENAME); + Row bridgeRow = getRow(DATABASENAME, BRIDGE, bridgeUuid); Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, bridgeRow, OvsdbTable.BRIDGE); if (bridge != null) { @@ -262,27 +251,23 @@ public class DefaultOvsdbClient } for (Uuid uuid : ports) { - Row portRow = getRow(OvsdbConstant.DATABASENAME, - OvsdbConstant.PORT, uuid.value()); + Row portRow = getRow(DATABASENAME, PORT, uuid.value()); Port port = (Port) TableGenerator.getTable(dbSchema, portRow, OvsdbTable.PORT); if (port != null && portName.equalsIgnoreCase(port.getName())) { return uuid.value(); } } - } return null; } @Override public String getInterfaceUuid(String portUuid, String portName) { - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); + DatabaseSchema dbSchema = schema.get(DATABASENAME); - Row portRow = getRow(OvsdbConstant.DATABASENAME, OvsdbConstant.PORT, - portUuid); - Port port = (Port) TableGenerator.getTable(dbSchema, portRow, - OvsdbTable.PORT); + Row portRow = getRow(DATABASENAME, PORT, portUuid); + Port port = (Port) TableGenerator.getTable(dbSchema, portRow, OvsdbTable.PORT); if (port != null) { OvsdbSet setInterfaces = (OvsdbSet) port.getInterfacesColumn().data(); @@ -295,26 +280,22 @@ public class DefaultOvsdbClient } for (Uuid uuid : interfaces) { - Row intfRow = getRow(OvsdbConstant.DATABASENAME, - OvsdbConstant.INTERFACE, uuid.value()); + Row intfRow = getRow(DATABASENAME, INTERFACE, uuid.value()); Interface intf = (Interface) TableGenerator .getTable(dbSchema, intfRow, OvsdbTable.INTERFACE); if (intf != null && portName.equalsIgnoreCase(intf.getName())) { return uuid.value(); } } - } - return null; } @Override public String getBridgeUuid(String bridgeName) { - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); + DatabaseSchema dbSchema = schema.get(DATABASENAME); - OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME, - OvsdbConstant.BRIDGE); + OvsdbRowStore rowStore = getRowStore(DATABASENAME, BRIDGE); if (rowStore == null) { log.debug("The bridge uuid is null"); return null; @@ -328,23 +309,18 @@ public class DefaultOvsdbClient for (String uuid : bridgeTableRows.keySet()) { Bridge bridge = (Bridge) TableGenerator - .getTable(dbSchema, bridgeTableRows.get(uuid), - OvsdbTable.BRIDGE); - + .getTable(dbSchema, bridgeTableRows.get(uuid), OvsdbTable.BRIDGE); if (bridge.getName().equals(bridgeName)) { return uuid; } - } return null; } @Override - public String getControllerUuid(String controllerName, - String controllerTarget) { - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); - OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME, - OvsdbConstant.CONTROLLER); + public String getControllerUuid(String controllerName, String controllerTarget) { + DatabaseSchema dbSchema = schema.get(DATABASENAME); + OvsdbRowStore rowStore = getRowStore(DATABASENAME, CONTROLLER); if (rowStore == null) { log.debug("The controller uuid is null"); return null; @@ -353,7 +329,6 @@ public class DefaultOvsdbClient ConcurrentMap controllerTableRows = rowStore.getRowStore(); if (controllerTableRows != null) { for (String uuid : controllerTableRows.keySet()) { - Controller controller = (Controller) TableGenerator .getTable(dbSchema, controllerTableRows.get(uuid), OvsdbTable.CONTROLLER); @@ -361,7 +336,6 @@ public class DefaultOvsdbClient if (target.equalsIgnoreCase(controllerTarget)) { return uuid; } - } } return null; @@ -369,8 +343,7 @@ public class DefaultOvsdbClient @Override public String getOvsUuid(String dbName) { - OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME, - OvsdbConstant.DATABASENAME); + OvsdbRowStore rowStore = getRowStore(DATABASENAME, DATABASENAME); if (rowStore == null) { log.debug("The bridge uuid is null"); return null; @@ -392,26 +365,19 @@ public class DefaultOvsdbClient public void createPort(String bridgeName, String portName) { String bridgeUuid = getBridgeUuid(bridgeName); if (bridgeUuid == null) { - log.error("Can't find bridge {} in {}", bridgeName, - nodeId.getIpAddress()); + log.error("Can't find bridge {} in {}", bridgeName, nodeId.getIpAddress()); return; } - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); + DatabaseSchema dbSchema = schema.get(DATABASENAME); String portUuid = getPortUuid(portName, bridgeUuid); - - Port port = (Port) TableGenerator - .createTable(dbSchema, OvsdbTable.PORT); - + Port port = (Port) TableGenerator.createTable(dbSchema, OvsdbTable.PORT); port.setName(portName); if (portUuid == null) { - insertConfig(OvsdbConstant.PORT, "_uuid", OvsdbConstant.BRIDGE, - "ports", bridgeUuid, port.getRow()); + insertConfig(PORT, UUID, BRIDGE, PORTS, bridgeUuid, port.getRow()); } else { - updateConfig(OvsdbConstant.PORT, "_uuid", portUuid, port.getRow()); + updateConfig(PORT, UUID, portUuid, port.getRow()); } - - return; } @Override @@ -425,220 +391,103 @@ public class DefaultOvsdbClient String portUuid = getPortUuid(portName, bridgeUuid); if (portUuid != null) { log.info("Port {} delete", portName); - deleteConfig(OvsdbConstant.PORT, "_uuid", portUuid, - OvsdbConstant.BRIDGE, "ports"); + deleteConfig(PORT, UUID, portUuid, BRIDGE, PORTS); } } + @Deprecated @Override public void createBridge(String bridgeName) { - log.debug("create bridge {}", bridgeName); + OvsdbBridge ovsdbBridge = OvsdbBridge.builder() + .name(bridgeName) + .build(); - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); - if (dbSchema == null) { - log.warn("The schema is null"); - return; - } - - Bridge bridge = (Bridge) TableGenerator.createTable(dbSchema, - OvsdbTable.BRIDGE); - if (bridge == null) { - log.debug("Can not create bridge"); - return; - } - - Set failModes = new HashSet<>(); - failModes.add("secure"); - bridge.setFailMode(failModes); - - Set protocols = new HashSet<>(); - protocols.add(OvsdbConstant.OPENFLOW13); - bridge.setProtocols(protocols); - - String ovsUuid = getOvsUuid(OvsdbConstant.DATABASENAME); - if (ovsUuid == null) { - log.warn("The Open_vSwitch is null"); - return; - } - - Map options = new HashMap<>(); - options.put("disable-in-band", "true"); - bridge.setOtherConfig(options); - - String bridgeUuid = getBridgeUuid(bridgeName); - if (bridgeUuid == null) { - log.debug("Create a new bridge"); - - bridge.setName(bridgeName); - bridgeUuid = insertConfig(OvsdbConstant.BRIDGE, "_uuid", - OvsdbConstant.DATABASENAME, "bridges", - ovsUuid, bridge.getRow()); - - if (bridgeUuid != null) { - Port port = (Port) TableGenerator.createTable(dbSchema, - OvsdbTable.PORT); - if (port != null) { - log.debug("the port is not null"); - port.setName(bridgeName); - - insertConfig(OvsdbConstant.PORT, "_uuid", "Bridge", "ports", bridgeUuid, - port.getRow()); - } - } else { - String message = BridgeCreateException.createMessage(ovsUuid); - throw new BridgeCreateException(message); - } - - } else { - log.info("Update a bridge"); - updateConfig(OvsdbConstant.BRIDGE, "_uuid", bridgeUuid, bridge.getRow()); - } - - setControllerAuto(bridgeUuid); - log.info("Create bridge success"); + createBridge(ovsdbBridge); } + @Deprecated @Override public void createBridge(String bridgeName, String dpid, String exPortName) { - log.debug("create bridge {}", bridgeName); + OvsdbBridge ovsdbBridge = OvsdbBridge.builder() + .name(bridgeName) + .failMode(BridgeDescription.FailMode.SECURE) + .datapathId(dpid) + .disableInBand() + .controllers(Lists.newArrayList(localController())) + .build(); - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); - if (dbSchema == null) { - log.warn("The schema is null"); - return; - } + createBridge(ovsdbBridge); - Bridge bridge = (Bridge) TableGenerator.createTable(dbSchema, - OvsdbTable.BRIDGE); - if (bridge == null) { - log.debug("Can not create bridge"); - return; - } - - Set failModes = new HashSet<>(); - failModes.add("secure"); - bridge.setFailMode(failModes); - - Set protocols = new HashSet<>(); - protocols.add(OvsdbConstant.OPENFLOW13); - bridge.setProtocols(protocols); - - String ovsUuid = getOvsUuid(OvsdbConstant.DATABASENAME); - if (ovsUuid == null) { - log.warn("The Open_vSwitch is null"); - return; - } - - Map options = new HashMap<>(); - options.put("disable-in-band", "true"); - if (dpid != null) { - options.put("datapath-id", dpid); - } - bridge.setOtherConfig(options); - - String bridgeUuid = getBridgeUuid(bridgeName); - if (bridgeUuid == null) { - log.debug("Create a new bridge"); - - bridge.setName(bridgeName); - bridgeUuid = insertConfig(OvsdbConstant.BRIDGE, "_uuid", - OvsdbConstant.DATABASENAME, "bridges", - ovsUuid, bridge.getRow()); - - if (bridgeUuid != null) { - Port port = (Port) TableGenerator.createTable(dbSchema, - OvsdbTable.PORT); - if (port != null) { - log.debug("the port is not null"); - port.setName(bridgeName); - - insertConfig(OvsdbConstant.PORT, "_uuid", "Bridge", "ports", bridgeUuid, - port.getRow()); - } - } else { - String message = BridgeCreateException.createMessage(ovsUuid); - throw new BridgeCreateException(message); - } - - } else { - log.info("Update a bridge"); - updateConfig(OvsdbConstant.BRIDGE, "_uuid", bridgeUuid, bridge.getRow()); - } - // Create external port if (exPortName != null) { createPort(bridgeName, exPortName); } + } - setControllerAuto(bridgeUuid); - log.info("Create bridge success"); + @Deprecated + @Override + public boolean createBridge(String bridgeName, String dpid, List controllers) { + OvsdbBridge ovsdbBridge = OvsdbBridge.builder() + .name(bridgeName) + .failMode(BridgeDescription.FailMode.SECURE) + .datapathId(dpid) + .disableInBand() + .controllers(controllers) + .build(); + + return createBridge(ovsdbBridge); } @Override - public boolean createBridge(String bridgeName, String dpid, List controllers) { - - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); - String ovsUuid = getOvsUuid(OvsdbConstant.DATABASENAME); + public boolean createBridge(OvsdbBridge ovsdbBridge) { + DatabaseSchema dbSchema = schema.get(DATABASENAME); + String ovsUuid = getOvsUuid(DATABASENAME); if (dbSchema == null || ovsUuid == null) { - log.warn("Couldn't find database Open_vSwitch"); + log.error("Can't find database Open_vSwitch"); return false; } Bridge bridge = (Bridge) TableGenerator.createTable(dbSchema, OvsdbTable.BRIDGE); - Set failMode = new HashSet<>(Arrays.asList("secure")); - bridge.setFailMode(failMode); + bridge.setOtherConfig(ovsdbBridge.otherConfigs()); - Set protocols = new HashSet<>(Arrays.asList(OvsdbConstant.OPENFLOW13)); - bridge.setProtocols(protocols); - - Map options = new HashMap<>(); - options.put("disable-in-band", "true"); - if (dpid != null) { - options.put("datapath-id", dpid); + if (ovsdbBridge.failMode().isPresent()) { + String failMode = ovsdbBridge.failMode().get().name().toLowerCase(); + bridge.setFailMode(Sets.newHashSet(failMode)); } - bridge.setOtherConfig(options); - String bridgeUuid = getBridgeUuid(bridgeName); + String bridgeUuid = getBridgeUuid(ovsdbBridge.name()); if (bridgeUuid == null) { - bridge.setName(bridgeName); - bridgeUuid = insertConfig(OvsdbConstant.BRIDGE, "_uuid", - OvsdbConstant.DATABASENAME, "bridges", - ovsUuid, bridge.getRow()); + bridge.setName(ovsdbBridge.name()); + bridgeUuid = insertConfig( + BRIDGE, UUID, DATABASENAME, BRIDGES, + ovsUuid, bridge.getRow()); } else { - updateConfig(OvsdbConstant.BRIDGE, "_uuid", bridgeUuid, bridge.getRow()); + // update the bridge if it's already existing + updateConfig(BRIDGE, UUID, bridgeUuid, bridge.getRow()); } - if (bridgeUuid != null) { - createPort(bridgeName, bridgeName); - } else { - log.warn("Failed to create bridge {} on {}", bridgeName, nodeId.toString()); + if (bridgeUuid == null) { + log.warn("Failed to create bridge {} on {}", ovsdbBridge.name(), nodeId); return false; } - setControllersWithUuid(Uuid.uuid(bridgeUuid), controllers); + createPort(ovsdbBridge.name(), ovsdbBridge.name()); + setControllersWithUuid(Uuid.uuid(bridgeUuid), ovsdbBridge.controllers()); + + log.info("Created bridge {}", ovsdbBridge.name()); return true; } - /** - * Sets the bridge's controller automatically. - *

- * The connection is a TCP connection to the local ONOS instance's IP - * and the default OpenFlow port. - * - * @param bridgeUuid bridge uuid - */ - private void setControllerAuto(String bridgeUuid) { - IpAddress ipAddress = IpAddress.valueOf(((InetSocketAddress) channel.localAddress()).getAddress()); - ControllerInfo controllerInfo = new ControllerInfo(ipAddress, OvsdbConstant.OFPORT, "tcp"); - log.debug("Automatically setting controller for bridge {} to {}", - bridgeUuid, controllerInfo.target()); - setControllersWithUuid(Uuid.uuid(bridgeUuid), ImmutableList.of(controllerInfo)); + @Override + public ControllerInfo localController() { + IpAddress ipAddress = IpAddress.valueOf(((InetSocketAddress) + channel.localAddress()).getAddress()); + return new ControllerInfo(ipAddress, OFPORT, "tcp"); } @Override public void setControllersWithUuid(Uuid bridgeUuid, List controllers) { - - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); + DatabaseSchema dbSchema = schema.get(DATABASENAME); if (dbSchema == null) { log.debug("There is no schema"); return; @@ -662,31 +511,27 @@ public class DefaultOvsdbClient removeControllers.add(controller); } }); - OvsdbRowStore controllerRowStore = getRowStore(OvsdbConstant.DATABASENAME, - OvsdbConstant.CONTROLLER); + OvsdbRowStore controllerRowStore = getRowStore(DATABASENAME, CONTROLLER); if (controllerRowStore == null) { log.debug("There is no controller table"); return; } - removeControllers.forEach(c -> deleteConfig(OvsdbConstant.CONTROLLER, "_uuid", c.getRow().uuid().value(), - OvsdbConstant.BRIDGE, "controller")); - + removeControllers.forEach(c -> deleteConfig(CONTROLLER, UUID, c.getRow().uuid().value(), + BRIDGE, "controller")); newControllers.stream().map(c -> { Controller controller = (Controller) TableGenerator .createTable(dbSchema, OvsdbTable.CONTROLLER); controller.setTarget(c.target()); return controller; }).forEach(c -> { - String uuid = insertConfig(OvsdbConstant.CONTROLLER, "_uuid", - OvsdbConstant.BRIDGE, "controller", bridgeUuid.value(), + String uuid = insertConfig(CONTROLLER, UUID, BRIDGE, "controller", bridgeUuid.value(), c.getRow()); newControllerUuids.add(Uuid.uuid(uuid)); }); - OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME, - OvsdbConstant.BRIDGE); + OvsdbRowStore rowStore = getRowStore(DATABASENAME, BRIDGE); if (rowStore == null) { log.debug("There is no bridge table"); return; @@ -695,7 +540,7 @@ public class DefaultOvsdbClient Row bridgeRow = rowStore.getRow(bridgeUuid.value()); Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, bridgeRow, OvsdbTable.BRIDGE); bridge.setController(OvsdbSet.ovsdbSet(newControllerUuids)); - updateConfig(OvsdbConstant.BRIDGE, "_uuid", bridgeUuid.value(), bridge.getRow()); + updateConfig(BRIDGE, UUID, bridgeUuid.value(), bridge.getRow()); } @Override @@ -710,13 +555,11 @@ public class DefaultOvsdbClient log.warn("Could not find bridge in node", nodeId.getIpAddress()); return; } - deleteConfig(OvsdbConstant.BRIDGE, "_uuid", bridgeUuid, - OvsdbConstant.DATABASENAME, "bridges"); + deleteConfig(BRIDGE, UUID, bridgeUuid, DATABASENAME, "bridges"); } @Override public boolean createTunnel(String bridgeName, String portName, String tunnelType, Map options) { - String bridgeUuid = getBridgeUuid(bridgeName); if (bridgeUuid == null) { log.warn("Couldn't find bridge {} in {}", bridgeName, nodeId.getIpAddress()); @@ -730,7 +573,7 @@ public class DefaultOvsdbClient } ArrayList operations = Lists.newArrayList(); - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); + DatabaseSchema dbSchema = schema.get(DATABASENAME); // insert a new port to the port table Port port = (Port) TableGenerator.createTable(dbSchema, OvsdbTable.PORT); @@ -740,8 +583,8 @@ public class DefaultOvsdbClient operations.add(portInsert); // update the bridge table - Condition condition = ConditionUtil.isEqual("_uuid", Uuid.uuid(bridgeUuid)); - Mutation mutation = MutationUtil.insert("ports", Uuid.uuid("Port")); + Condition condition = ConditionUtil.isEqual(UUID, Uuid.uuid(bridgeUuid)); + Mutation mutation = MutationUtil.insert(PORTS, Uuid.uuid("Port")); List conditions = new ArrayList<>(Arrays.asList(condition)); List mutations = new ArrayList<>(Arrays.asList(mutation)); operations.add(new Mutate(dbSchema.getTableSchema("Bridge"), conditions, mutations)); @@ -754,15 +597,15 @@ public class DefaultOvsdbClient Insert intfInsert = new Insert(dbSchema.getTableSchema("Interface"), "Interface", intf.getRow()); operations.add(intfInsert); - transactConfig(OvsdbConstant.DATABASENAME, operations); + transactConfig(DATABASENAME, operations); return true; } @Override public void dropTunnel(IpAddress srcIp, IpAddress dstIp) { - String bridgeName = OvsdbConstant.INTEGRATION_BRIDGE; - String portName = getTunnelName(OvsdbConstant.TYPEVXLAN, dstIp); - String bridgeUuid = getBridgeUuid(OvsdbConstant.INTEGRATION_BRIDGE); + String bridgeName = INTEGRATION_BRIDGE; + String portName = getTunnelName(TYPEVXLAN, dstIp); + String bridgeUuid = getBridgeUuid(INTEGRATION_BRIDGE); if (bridgeUuid == null) { log.warn("Could not find bridge {} in {}", bridgeName, nodeId.getIpAddress()); @@ -772,11 +615,8 @@ public class DefaultOvsdbClient String portUuid = getPortUuid(portName, bridgeUuid); if (portUuid != null) { log.info("Delete tunnel"); - deleteConfig(OvsdbConstant.PORT, "_uuid", portUuid, - OvsdbConstant.BRIDGE, "ports"); + deleteConfig(PORT, UUID, portUuid, BRIDGE, PORTS); } - - return; } /** @@ -791,7 +631,7 @@ public class DefaultOvsdbClient private void deleteConfig(String childTableName, String childColumnName, String childUuid, String parentTableName, String parentColumnName) { - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); + DatabaseSchema dbSchema = schema.get(DATABASENAME); TableSchema childTableSchema = dbSchema.getTableSchema(childTableName); ArrayList operations = Lists.newArrayList(); @@ -817,9 +657,7 @@ public class DefaultOvsdbClient conditions.add(condition); Delete del = new Delete(childTableSchema, conditions); operations.add(del); - transactConfig(OvsdbConstant.DATABASENAME, operations); - - return; + transactConfig(DATABASENAME, operations); } /** @@ -832,7 +670,7 @@ public class DefaultOvsdbClient */ private void updateConfig(String tableName, String columnName, String uuid, Row row) { - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); + DatabaseSchema dbSchema = schema.get(DATABASENAME); TableSchema tableSchema = dbSchema.getTableSchema(tableName); List conditions = Lists.newArrayList(); @@ -844,7 +682,7 @@ public class DefaultOvsdbClient ArrayList operations = Lists.newArrayList(); operations.add(update); - transactConfig(OvsdbConstant.DATABASENAME, operations); + transactConfig(DATABASENAME, operations); } /** @@ -861,7 +699,7 @@ public class DefaultOvsdbClient private String insertConfig(String childTableName, String childColumnName, String parentTableName, String parentColumnName, String parentUuid, Row row) { - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); + DatabaseSchema dbSchema = schema.get(DATABASENAME); TableSchema tableSchema = dbSchema.getTableSchema(childTableName); Insert insert = new Insert(tableSchema, childTableName, row); @@ -881,32 +719,27 @@ public class DefaultOvsdbClient mutations.add(mutation); List conditions = Lists.newArrayList(); - Condition condition = ConditionUtil.isEqual("_uuid", - Uuid.uuid(parentUuid)); + Condition condition = ConditionUtil.isEqual(UUID, Uuid.uuid(parentUuid)); conditions.add(condition); Mutate op = new Mutate(parentTableSchema, conditions, mutations); operations.add(op); } - if (childTableName.equalsIgnoreCase(OvsdbConstant.PORT)) { - log.info("Handle port insert"); - Insert intfInsert = handlePortInsertTable(OvsdbConstant.INTERFACE, - row); + if (childTableName.equalsIgnoreCase(PORT)) { + log.debug("Handle port insert"); + Insert intfInsert = handlePortInsertTable(INTERFACE, row); if (intfInsert != null) { operations.add(intfInsert); } Insert ins = (Insert) operations.get(0); - ins.getRow().put("interfaces", - Uuid.uuid(OvsdbConstant.INTERFACE)); + ins.getRow().put("interfaces", Uuid.uuid(INTERFACE)); } List results; try { - results = transactConfig(OvsdbConstant.DATABASENAME, operations) - .get(); - + results = transactConfig(DATABASENAME, operations).get(); return results.get(0).getUuid().value(); } catch (InterruptedException e) { log.warn("Interrupted while waiting to get result"); @@ -926,30 +759,23 @@ public class DefaultOvsdbClient * @return insert, empty if null */ private Insert handlePortInsertTable(String tableName, Row portRow) { - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); + DatabaseSchema dbSchema = schema.get(DATABASENAME); - TableSchema portTableSchema = dbSchema - .getTableSchema(OvsdbConstant.PORT); + TableSchema portTableSchema = dbSchema.getTableSchema(PORT); ColumnSchema portColumnSchema = portTableSchema.getColumnSchema("name"); String portName = (String) portRow.getColumn(portColumnSchema.name()).data(); - - Interface inf = (Interface) TableGenerator - .createTable(dbSchema, OvsdbTable.INTERFACE); - + Interface inf = (Interface) TableGenerator.createTable(dbSchema, OvsdbTable.INTERFACE); inf.setName(portName); - TableSchema intfTableSchema = dbSchema - .getTableSchema(OvsdbConstant.INTERFACE); - Insert insert = new Insert(intfTableSchema, OvsdbConstant.INTERFACE, - inf.getRow()); - return insert; + TableSchema intfTableSchema = dbSchema.getTableSchema(INTERFACE); + return new Insert(intfTableSchema, INTERFACE, inf.getRow()); } /** * Gets tunnel name. * - * @param tunnelType + * @param tunnelType tunnel type * @param dstIp the remote ip address * @return tunnel name */ @@ -966,20 +792,15 @@ public class DefaultOvsdbClient if (databaseSchema == null) { List dbNames = new ArrayList(); dbNames.add(dbName); - Function rowFunction = new Function() { - @Override - public DatabaseSchema apply(JsonNode input) { - log.info("Get ovsdb database schema {}", dbName); - DatabaseSchema dbSchema = FromJsonUtil - .jsonNodeToDbSchema(dbName, input); - if (dbSchema == null) { - log.debug("Get ovsdb database schema error"); - return null; - } - schema.put(dbName, dbSchema); - - return dbSchema; + Function rowFunction = input -> { + log.debug("Get ovsdb database schema {}", dbName); + DatabaseSchema dbSchema = FromJsonUtil.jsonNodeToDbSchema(dbName, input); + if (dbSchema == null) { + log.debug("Get ovsdb database schema error"); + return null; } + schema.put(dbName, dbSchema); + return dbSchema; }; ListenableFuture input = getSchema(dbNames); @@ -999,18 +820,14 @@ public class DefaultOvsdbClient } DatabaseSchema dbSchema = schema.get(dbName); if (dbSchema != null) { - Function rowFunction = new Function() { - @Override - public TableUpdates apply(JsonNode input) { - log.info("Get table updates"); - TableUpdates updates = FromJsonUtil - .jsonNodeToTableUpdates(input, dbSchema); - if (updates == null) { - log.debug("Get table updates error"); - return null; - } - return updates; + Function rowFunction = input -> { + log.debug("Get table updates"); + TableUpdates updates = FromJsonUtil.jsonNodeToTableUpdates(input, dbSchema); + if (updates == null) { + log.debug("Get table updates error"); + return null; } + return updates; }; return Futures.transform(monitor(dbSchema, id), rowFunction); } @@ -1026,18 +843,15 @@ public class DefaultOvsdbClient DatabaseSchema dbSchema = schema.get(dbName); if (dbSchema != null) { Function, List> rowFunction = (input -> { - log.info("Get ovsdb operation result"); - List result = FromJsonUtil - .jsonNodeToOperationResult(input, operations); - + log.debug("Get ovsdb operation result"); + List result = FromJsonUtil.jsonNodeToOperationResult(input, operations); if (result == null) { log.debug("The operation result is null"); return null; } return result; }); - return Futures.transform(transact(dbSchema, operations), - rowFunction); + return Futures.transform(transact(dbSchema, operations), rowFunction); } return null; } @@ -1053,7 +867,6 @@ public class DefaultOvsdbClient channel.writeAndFlush(getSchemaString); return sf; - } @Override @@ -1067,7 +880,6 @@ public class DefaultOvsdbClient channel.writeAndFlush(echoString); return sf; - } @Override @@ -1083,7 +895,6 @@ public class DefaultOvsdbClient channel.writeAndFlush(monitorString); return sf; - } @Override @@ -1097,7 +908,6 @@ public class DefaultOvsdbClient channel.writeAndFlush(listDbsString); return sf; - } @Override @@ -1113,7 +923,6 @@ public class DefaultOvsdbClient channel.writeAndFlush(transactString); return sf; - } @SuppressWarnings({"rawtypes", "unchecked"}) @@ -1127,12 +936,7 @@ public class DefaultOvsdbClient return; } String methodName = requestMethod.get(requestId); - - Object result; - result = FromJsonUtil.jsonResultParser(response, methodName); - - sf.set(result); - return; + sf.set(FromJsonUtil.jsonResultParser(response, methodName)); } @Override @@ -1143,12 +947,8 @@ public class DefaultOvsdbClient String replyString = FromJsonUtil.getEchoRequestStr(requestJson); channel.writeAndFlush(replyString); - - return; } else { - FromJsonUtil - .jsonCallbackRequestParser(requestJson, monitorCallBack); - return; + FromJsonUtil.jsonCallbackRequestParser(requestJson, monitorCallBack); } } @@ -1164,19 +964,18 @@ public class DefaultOvsdbClient @Override public Set getBridges() { - Set ovsdbBridges = new HashSet(); - OvsdbTableStore tableStore = getTableStore(OvsdbConstant.DATABASENAME); + Set ovsdbBridges = new HashSet<>(); + OvsdbTableStore tableStore = getTableStore(DATABASENAME); if (tableStore == null) { return null; } - OvsdbRowStore rowStore = tableStore.getRows(OvsdbConstant.BRIDGE); + OvsdbRowStore rowStore = tableStore.getRows(BRIDGE); if (rowStore == null) { return null; } ConcurrentMap rows = rowStore.getRowStore(); for (String uuid : rows.keySet()) { - Row row = getRow(OvsdbConstant.DATABASENAME, OvsdbConstant.BRIDGE, - uuid); + Row row = getRow(DATABASENAME, BRIDGE, uuid); OvsdbBridge ovsdbBridge = getOvsdbBridge(row); if (ovsdbBridge != null) { ovsdbBridges.add(ovsdbBridge); @@ -1197,19 +996,17 @@ public class DefaultOvsdbClient log.warn("bad list of controllers"); return null; } - return controllers.stream(). - map(controller -> new ControllerInfo( - (String) controller.getTargetColumn() - .data())).collect(Collectors.toSet()); + return controllers.stream().map(controller -> new ControllerInfo( + (String) controller.getTargetColumn() + .data())).collect(Collectors.toSet()); } private List getControllers(Uuid bridgeUuid) { - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); + DatabaseSchema dbSchema = schema.get(DATABASENAME); if (dbSchema == null) { return null; } - OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME, - OvsdbConstant.BRIDGE); + OvsdbRowStore rowStore = getRowStore(DATABASENAME, BRIDGE); if (rowStore == null) { log.debug("There is no bridge table"); return null; @@ -1224,10 +1021,8 @@ public class DefaultOvsdbClient .data().getClass()); Set controllerUuids = (Set) ((OvsdbSet) bridge .getControllerColumn().data()).set(); -// Set controllerUuidStrings = (Set) bridge.getControllerColumn().data(); - OvsdbRowStore controllerRowStore = getRowStore(OvsdbConstant.DATABASENAME, - OvsdbConstant.CONTROLLER); + OvsdbRowStore controllerRowStore = getRowStore(DATABASENAME, CONTROLLER); if (controllerRowStore == null) { log.debug("There is no controller table"); return null; @@ -1248,12 +1043,11 @@ public class DefaultOvsdbClient private Uuid getBridgeUuid(DeviceId openflowDeviceId) { - DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME); + DatabaseSchema dbSchema = schema.get(DATABASENAME); if (dbSchema == null) { return null; } - OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME, - OvsdbConstant.BRIDGE); + OvsdbRowStore rowStore = getRowStore(DATABASENAME, BRIDGE); if (rowStore == null) { log.debug("There is no bridge table"); return null; @@ -1262,10 +1056,12 @@ public class DefaultOvsdbClient ConcurrentMap bridgeTableRows = rowStore.getRowStore(); final AtomicReference uuid = new AtomicReference<>(); for (Map.Entry entry : bridgeTableRows.entrySet()) { - Bridge b = (Bridge) TableGenerator.getTable(dbSchema, - entry.getValue(), - OvsdbTable.BRIDGE); - if (matchesDpid(b, openflowDeviceId)) { + Bridge bridge = (Bridge) TableGenerator.getTable( + dbSchema, + entry.getValue(), + OvsdbTable.BRIDGE); + + if (matchesDpid(bridge, openflowDeviceId)) { uuid.set(Uuid.uuid(entry.getKey())); break; } @@ -1274,7 +1070,6 @@ public class DefaultOvsdbClient log.debug("There is no bridge for {}", openflowDeviceId); } return uuid.get(); - } private static boolean matchesDpid(Bridge b, DeviceId deviceId) { @@ -1286,19 +1081,18 @@ public class DefaultOvsdbClient @Override public Set getPorts() { - Set ovsdbPorts = new HashSet(); - OvsdbTableStore tableStore = getTableStore(OvsdbConstant.DATABASENAME); + Set ovsdbPorts = new HashSet<>(); + OvsdbTableStore tableStore = getTableStore(DATABASENAME); if (tableStore == null) { return null; } - OvsdbRowStore rowStore = tableStore.getRows(OvsdbConstant.INTERFACE); + OvsdbRowStore rowStore = tableStore.getRows(INTERFACE); if (rowStore == null) { return null; } ConcurrentMap rows = rowStore.getRowStore(); for (String uuid : rows.keySet()) { - Row row = getRow(OvsdbConstant.DATABASENAME, - OvsdbConstant.INTERFACE, uuid); + Row row = getRow(DATABASENAME, INTERFACE, uuid); OvsdbPort ovsdbPort = getOvsdbPort(row); if (ovsdbPort != null) { ovsdbPorts.add(ovsdbPort); @@ -1312,9 +1106,8 @@ public class DefaultOvsdbClient return schema.get(dbName); } - //Gets ovsdb port. private OvsdbPort getOvsdbPort(Row row) { - DatabaseSchema dbSchema = getDatabaseSchema(OvsdbConstant.DATABASENAME); + DatabaseSchema dbSchema = getDatabaseSchema(DATABASENAME); Interface intf = (Interface) TableGenerator .getTable(dbSchema, row, OvsdbTable.INTERFACE); if (intf == null) { @@ -1325,17 +1118,12 @@ public class DefaultOvsdbClient if ((ofPort < 0) || (portName == null)) { return null; } - - OvsdbPort ovsdbPort = new OvsdbPort(new OvsdbPortNumber(ofPort), - new OvsdbPortName(portName)); - return ovsdbPort; + return new OvsdbPort(new OvsdbPortNumber(ofPort), new OvsdbPortName(portName)); } - ////Gets ovsdb bridge. private OvsdbBridge getOvsdbBridge(Row row) { - DatabaseSchema dbSchema = getDatabaseSchema(OvsdbConstant.DATABASENAME); - Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, row, - OvsdbTable.BRIDGE); + DatabaseSchema dbSchema = getDatabaseSchema(DATABASENAME); + Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, row, OvsdbTable.BRIDGE); if (bridge == null) { return null; } @@ -1351,18 +1139,14 @@ public class DefaultOvsdbClient if ((datapathId == null) || (bridgeName == null)) { return null; } - - OvsdbBridge ovsdbBridge = new OvsdbBridge(new OvsdbBridgeName(bridgeName), - new OvsdbDatapathId(datapathId)); - return ovsdbBridge; + return OvsdbBridge.builder().name(bridgeName).datapathId(datapathId).build(); } - //Gets ofPort in the interface. private long getOfPort(Interface intf) { OvsdbSet ofPortSet = (OvsdbSet) intf.getOpenFlowPortColumn().data(); @SuppressWarnings("unchecked") Set ofPorts = ofPortSet.set(); - while (ofPorts == null || ofPorts.size() <= 0) { + if (ofPorts == null || ofPorts.size() <= 0) { log.debug("The ofport is null in {}", intf.getName()); return -1; } @@ -1373,41 +1157,38 @@ public class DefaultOvsdbClient @Override public Set getLocalPorts(Iterable ifaceids) { - Set ovsdbPorts = new HashSet(); - OvsdbTableStore tableStore = getTableStore(OvsdbConstant.DATABASENAME); + Set ovsdbPorts = new HashSet<>(); + OvsdbTableStore tableStore = getTableStore(DATABASENAME); if (tableStore == null) { return null; } - OvsdbRowStore rowStore = tableStore.getRows(OvsdbConstant.INTERFACE); + OvsdbRowStore rowStore = tableStore.getRows(INTERFACE); if (rowStore == null) { return null; } ConcurrentMap rows = rowStore.getRowStore(); for (String uuid : rows.keySet()) { - Row row = getRow(OvsdbConstant.DATABASENAME, - OvsdbConstant.INTERFACE, uuid); - DatabaseSchema dbSchema = getDatabaseSchema(OvsdbConstant.DATABASENAME); + Row row = getRow(DATABASENAME, INTERFACE, uuid); + DatabaseSchema dbSchema = getDatabaseSchema(DATABASENAME); Interface intf = (Interface) TableGenerator .getTable(dbSchema, row, OvsdbTable.INTERFACE); if (intf == null || getIfaceid(intf) == null) { continue; } String portName = intf.getName(); + if (portName == null) { + continue; + } Set ifaceidSet = Sets.newHashSet(ifaceids); - if (portName.startsWith("vxlan") - || !ifaceidSet.contains(getIfaceid(intf))) { + if (portName.startsWith(TYPEVXLAN) || !ifaceidSet.contains(getIfaceid(intf))) { continue; } long ofPort = getOfPort(intf); - if ((ofPort < 0) || (portName == null)) { + if (ofPort < 0) { continue; } - - OvsdbPort ovsdbPort = new OvsdbPort(new OvsdbPortNumber(ofPort), - new OvsdbPortName(portName)); - if (ovsdbPort != null) { - ovsdbPorts.add(ovsdbPort); - } + ovsdbPorts.add(new OvsdbPort(new OvsdbPortNumber(ofPort), + new OvsdbPortName(portName))); } return ovsdbPorts; } @@ -1420,8 +1201,7 @@ public class DefaultOvsdbClient log.warn("The external_ids is null"); return null; } - String ifaceid = externalIds - .get(OvsdbConstant.EXTERNAL_ID_INTERFACE_ID); + String ifaceid = externalIds.get(EXTERNAL_ID_INTERFACE_ID); if (ifaceid == null) { log.warn("The ifaceid is null"); return null; diff --git a/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java b/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java index a1f719c8f3..c0aaf91d27 100644 --- a/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java +++ b/protocols/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java @@ -73,6 +73,11 @@ public class OvsdbClientServiceAdapter implements OvsdbClientService { return true; } + @Override + public boolean createBridge(OvsdbBridge ovsdbBridge) { + return true; + } + @Override public void dropBridge(String bridgeName) { @@ -88,6 +93,11 @@ public class OvsdbClientServiceAdapter implements OvsdbClientService { return null; } + @Override + public ControllerInfo localController() { + return null; + } + @Override public void setControllersWithUuid(Uuid bridgeUuid, List controllers) {