package org.opendaylight.openflowplugin.api.openflow;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
import org.opendaylight.openflowplugin.api.openflow.device.handlers.DeviceInitializationPhaseHandler;
import org.opendaylight.openflowplugin.api.openflow.device.handlers.DeviceLifecycleSupervisor;
import org.opendaylight.openflowplugin.api.openflow.device.handlers.DeviceRemovedHandler;
DeviceRemovedHandler,
AutoCloseable {
+ default void createContext(final DeviceInfo deviceInfo) {
+ //TODO: remove default after implementation in all managers !!!
+ }
+
@Override
void close();
}
import java.util.concurrent.Future;
import org.opendaylight.openflowplugin.api.openflow.OFPContext;
+import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
/**
* Chain of contexts, hold references to the contexts
@Override
void close();
+ /**
+ * Change connection if connection were drop and rebuild
+ * @param connectionContext
+ */
+ void changePrimaryConnection(final ConnectionContext connectionContext);
+
}
<T extends OFPManager> void addManager(final T manager);
Future<Void> createContextChain(final DeviceInfo deviceInfo);
- Future<Void> pairConnection(final DeviceInfo deviceInfo);
Future<Void> connectionLost(final DeviceInfo deviceInfo);
void destroyContextChain(final DeviceInfo deviceInfo);
- void addConnection(final ConnectionContext connectionContext);
+ /**
+ * This method will pair up connection with existing context chain
+ * If context chain doesn't exist will create context chain a set this connection as primary to the new created context chain
+ * If context chain cannot be created close connection and destroy context chain
+ * @param connectionContext new connection
+ */
+ void pairConnection(final ConnectionContext connectionContext);
}
enum WORKING_SLAVE {
description "Context chain is working as SLAVE";
}
+ enum ON_HOLD {
+ description "Context chain is on hold, after connection lost";
+ }
}
}
default WORKING_SLAVE;
}
+ leaf number-of-needed-managers {
+ description "chceck number for needed managers";
+ type uint16;
+ default 3;
+ }
+
}
}
*/
package org.opendaylight.openflowplugin.impl.lifecycle;
+import com.google.common.base.Verify;
+import com.google.common.util.concurrent.Futures;
import java.util.HashSet;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Future;
@Override
public <T extends OFPManager> void addManager(final T manager) {
+ managers.add(manager);
}
@Override
public Future<Void> createContextChain(final DeviceInfo deviceInfo) {
- return null;
- }
-
- @Override
- public Future<Void> pairConnection(final DeviceInfo deviceInfo) {
+ Verify.verify(this.checkAllManagers(),"Not all manager were set.");
return null;
}
@Override
public Future<Void> connectionLost(final DeviceInfo deviceInfo) {
+ if (!this.checkChainContext(deviceInfo)) {
+ return Futures.immediateFuture(null);
+ }
return null;
}
@Override
public void destroyContextChain(final DeviceInfo deviceInfo) {
+ ContextChain chain = contextChainMap.get(deviceInfo);
+ if (Objects.nonNull(chain)) {
+ chain.close();
+ }
}
@Override
- public void addConnection(final ConnectionContext connectionContext) {
+ public void pairConnection(final ConnectionContext connectionContext) {
+ DeviceInfo deviceInfo = connectionContext.getDeviceInfo();
+ latestConnections.put(deviceInfo, connectionContext);
+ if (checkChainContext(deviceInfo)) {
+ contextChainMap.get(deviceInfo).changePrimaryConnection(connectionContext);
+ }
+ }
+
+ private boolean checkAllManagers() {
+ return config.getNumberOfNeededManagers().equals(managers.size());
+ }
+ private boolean checkChainContext(final DeviceInfo deviceInfo) {
+ return contextChainMap.containsKey(deviceInfo);
}
}
import java.util.Set;
import java.util.concurrent.Future;
import org.opendaylight.openflowplugin.api.openflow.OFPContext;
+import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
import org.opendaylight.openflowplugin.api.openflow.lifecycle.ContextChain;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.provider.config.rev160510.ContextChainState;
private Set<OFPContext> contexts = new HashSet<>();
private final ContextChainState contextChainState;
+ private ConnectionContext primaryConnectionContext;
public ContextChainImpl(final ContextChainState contextChainState) {
this.contextChainState = contextChainState;
public void close() {
}
+
+ @Override
+ public void changePrimaryConnection(final ConnectionContext connectionContext) {
+ this.primaryConnectionContext = connectionContext;
+ }
}