X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Frole%2FRoleContextImpl.java;h=0a1f81095baed3b82ea9f2da1522271bd1a2472c;hb=277d201d5db47620b29a6a69fd99aec539e537eb;hp=888a4e9590f5853bde315c33c6bf9094465093cd;hpb=888fadc5d77ea2b4d020cd1bcaf62e7aa39f0a2c;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/role/RoleContextImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/role/RoleContextImpl.java index 888a4e9590..0a1f81095b 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/role/RoleContextImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/role/RoleContextImpl.java @@ -7,6 +7,7 @@ */ package org.opendaylight.openflowplugin.impl.role; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.util.concurrent.FutureCallback; @@ -22,8 +23,10 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext; import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo; import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; +import org.opendaylight.openflowplugin.api.openflow.device.handlers.ClusterInitializationPhaseHandler; import org.opendaylight.openflowplugin.api.openflow.role.RoleContext; import org.opendaylight.openflowplugin.api.openflow.role.RoleManager; import org.opendaylight.openflowplugin.impl.rpc.AbstractRequestContext; @@ -39,8 +42,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Role context hold information about entity ownership registration, - * register and unregister candidate (main and tx) + * Role context try to make change device role on device */ class RoleContextImpl implements RoleContext { @@ -53,6 +55,7 @@ class RoleContextImpl implements RoleContext { private final DeviceInfo deviceInfo; private CONTEXT_STATE state; private final RoleManager myManager; + private ClusterInitializationPhaseHandler clusterInitializationPhaseHandler; RoleContextImpl(final DeviceInfo deviceInfo, final HashedWheelTimer hashedWheelTimer, @@ -79,11 +82,6 @@ class RoleContextImpl implements RoleContext { this.salRoleService = salRoleService; } - @Override - public SalRoleService getSalRoleService() { - return this.salRoleService; - } - @Override public CONTEXT_STATE getState() { return this.state; @@ -159,7 +157,8 @@ class RoleContextImpl implements RoleContext { return sendRoleChangeToDevice(OfpRole.BECOMESLAVE); } - private ListenableFuture> sendRoleChangeToDevice(final OfpRole newRole) { + @VisibleForTesting + ListenableFuture> sendRoleChangeToDevice(final OfpRole newRole) { LOG.debug("Sending new role {} to device {}", newRole, deviceInfo.getNodeId()); final Future> setRoleOutputFuture; final Short version = deviceInfo.getVersion(); @@ -173,7 +172,7 @@ class RoleContextImpl implements RoleContext { } else { final SetRoleInput setRoleInput = (new SetRoleInputBuilder()).setControllerRole(newRole) .setNode(new NodeRef(DeviceStateUtil.createNodeInstanceIdentifier(deviceInfo.getNodeId()))).build(); - setRoleOutputFuture = getSalRoleService().setRole(setRoleInput); + setRoleOutputFuture = this.salRoleService.setRole(setRoleInput); final TimerTask timerTask = timeout -> { if (!setRoleOutputFuture.isDone()) { LOG.warn("New role {} was not propagated to device {} during 10 sec", newRole, deviceInfo.getLOGValue()); @@ -185,4 +184,33 @@ class RoleContextImpl implements RoleContext { return JdkFutureAdapters.listenInPoolThread(setRoleOutputFuture); } + @Override + public void setLifecycleInitializationPhaseHandler(final ClusterInitializationPhaseHandler handler) { + this.clusterInitializationPhaseHandler = handler; + } + + @Override + public boolean onContextInstantiateService(final ConnectionContext connectionContext) { + + if (connectionContext.getConnectionState().equals(ConnectionContext.CONNECTION_STATE.RIP)) { + LOG.warn("Connection on device {} was interrupted, will stop starting master services.", deviceInfo.getLOGValue()); + return false; + } + + Futures.addCallback(sendRoleChangeToDevice(OfpRole.BECOMEMASTER), new FutureCallback>() { + @Override + public void onSuccess(@Nullable RpcResult setRoleOutputRpcResult) { + if (LOG.isDebugEnabled()) { + LOG.debug("Role MASTER was successfully set on device, node {}", deviceInfo.getLOGValue()); + } + } + + @Override + public void onFailure(final Throwable throwable) { + LOG.warn("Was not able to set MASTER role on device, node {}", deviceInfo.getLOGValue()); + } + }); + + return this.clusterInitializationPhaseHandler.onContextInstantiateService(connectionContext); + } }