type string;
}
}
-
+
list manager-entry {
description "Node managers info";
config false;
description "Uri that user set to connect to the controller";
type inet:uri;
}
- leaf is-connected {
+ leaf connected {
type boolean;
}
+ leaf number_of_connections {
+ type uint32;
+ }
}
}
public class SouthboundMapper {
private static final Logger LOG = LoggerFactory.getLogger(SouthboundMapper.class);
+ private static final String N_CONNECTIONS_STR = "n_connections";
private static NodeId createNodeId(OvsdbConnectionInstance client) {
NodeKey key = client.getInstanceIdentifier().firstKeyOf(Node.class, NodeKey.class);
final Manager manager) {
if (manager != null && manager.getTargetColumn() != null) {
+ long numberOfConnections = 0;
final String targetString = (String)manager.getTargetColumn().getData();
+
+ final Map<String, String> statusAttributeMap = manager.getStatusColumn().getData();
+ if (statusAttributeMap.containsKey(N_CONNECTIONS_STR)) {
+ String numberOfConnectionValueStr = statusAttributeMap.get(N_CONNECTIONS_STR);
+ numberOfConnections = Integer.parseInt(numberOfConnectionValueStr);
+ } else {
+ final boolean isConnected = manager.getIsConnectedColumn().getData();
+ if (isConnected) {
+ numberOfConnections = 1;
+ }
+ }
managerEntries.add(new ManagerEntryBuilder()
.setTarget(new Uri(targetString))
- .setIsConnected(manager.getIsConnectedColumn().getData()).build());
+ .setNumberOfConnections(numberOfConnections)
+ .setConnected(manager.getIsConnectedColumn().getData()).build());
}
}
private Map<UUID, OpenVSwitch> oldOpenVSwitchRows;
private Map<UUID, Manager> removedManagerRows;
private Map<UUID, OpenVSwitch> updatedOpenVSwitchRows;
+ private Map<UUID, Manager> updatedManagerRows;
public OvsdbManagersRemovedCommand(OvsdbConnectionInstance key,
TableUpdates updates, DatabaseSchema dbSchema) {
super(key, updates, dbSchema);
updatedOpenVSwitchRows = TyperUtils.extractRowsUpdated(OpenVSwitch.class, getUpdates(), getDbSchema());
oldOpenVSwitchRows = TyperUtils.extractRowsOld(OpenVSwitch.class, getUpdates(), getDbSchema());
+ updatedManagerRows = TyperUtils.extractRowsUpdated(Manager.class, getUpdates(), getDbSchema());
removedManagerRows = TyperUtils.extractRowsRemoved(Manager.class,
getUpdates(), getDbSchema());
}
if (openVSwitch.getManagerOptionsColumn() == null
|| !openVSwitch.getManagerOptionsColumn().getData().contains(managerUuid)) {
Manager manager = removedManagerRows.get(managerUuid);
- if (manager != null && manager.getTargetColumn() != null) {
- InstanceIdentifier<ManagerEntry> iid = ovsdbNodeIid
- .augmentation(OvsdbNodeAugmentation.class)
- .child(ManagerEntry.class,
- new ManagerEntryKey(
- new Uri(manager.getTargetColumn().getData())));
- result.add(iid);
+ if (!checkIfManagerPresentInUpdatedManagersList(manager)) {
+ if (manager != null && manager.getTargetColumn() != null) {
+ InstanceIdentifier<ManagerEntry> iid = ovsdbNodeIid
+ .augmentation(OvsdbNodeAugmentation.class)
+ .child(ManagerEntry.class,
+ new ManagerEntryKey(
+ new Uri(manager.getTargetColumn().getData())));
+ result.add(iid);
+ }
+
}
}
}
return result;
}
+ private boolean checkIfManagerPresentInUpdatedManagersList(Manager removedManager) {
+ for (Map.Entry<UUID, Manager> updatedManager : updatedManagerRows.entrySet()) {
+ if (updatedManager.getValue().getTargetColumn().getData()
+ .equals(removedManager.getTargetColumn().getData())) {
+ return true;
+ }
+ }
+ return false;
+ }
}
public class OvsdbNodeRemoveCommand extends AbstractTransactionCommand {
private static final Logger LOG = LoggerFactory.getLogger(OvsdbNodeRemoveCommand.class);
+ private static final long ONE_CONNECTED_MANAGER = 1;
+ private static final long ONE_ACTIVE_CONNECTION_IN_PASSIVE_MODE = 1;
public OvsdbNodeRemoveCommand(OvsdbConnectionInstance key,TableUpdates updates,DatabaseSchema dbSchema) {
super(key,updates,dbSchema);
}
private boolean checkIfOnlyConnectedManager(OvsdbNodeAugmentation ovsdbNodeAugmentation) {
+ ManagerEntry onlyConnectedManager = null;
if (ovsdbNodeAugmentation != null) {
int connectedManager = 0;
for (ManagerEntry manager : ovsdbNodeAugmentation.getManagerEntry()) {
- if (manager.isIsConnected()) {
+ if (manager.isConnected()) {
connectedManager++;
- if (connectedManager > 1) {
+ if (connectedManager > ONE_CONNECTED_MANAGER) {
return false;
}
+ onlyConnectedManager = manager;
}
}
+ if (connectedManager == 0) {
+ return true;
+ }
+ }
+ /*When switch is listening in passive mode, this number represent number of active connection to the device
+ This is to handle the controller initiated connection scenario, where all the controller will connect, but
+ switch will have only one manager.
+ */
+ if (onlyConnectedManager.getNumberOfConnections().longValue() > ONE_ACTIVE_CONNECTION_IN_PASSIVE_MODE) {
+ return false;
}
return true;
}