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) {