*/
package org.opendaylight.controller.cluster.raft;
+import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import java.util.concurrent.TimeUnit;
+import javax.annotation.Nonnull;
import org.opendaylight.controller.cluster.raft.policy.DefaultRaftPolicy;
import org.opendaylight.controller.cluster.raft.policy.RaftPolicy;
import org.slf4j.Logger;
private long electionTimeoutFactor = 2;
private String customRaftPolicyImplementationClass;
- Supplier<RaftPolicy> policySupplier = Suppliers.memoize(new PolicySupplier());
+ private final Supplier<RaftPolicy> policySupplier = Suppliers.memoize(new PolicySupplier());
+
+ private PeerAddressResolver peerAddressResolver = NoopPeerAddressResolver.INSTANCE;
public void setHeartBeatInterval(FiniteDuration heartBeatInterval) {
this.heartBeatInterval = heartBeatInterval;
return DefaultRaftPolicy.INSTANCE;
}
}
+
+ @Override
+ public PeerAddressResolver getPeerAddressResolver() {
+ return peerAddressResolver;
+ }
+
+ public void setPeerAddressResolver(@Nonnull PeerAddressResolver peerAddressResolver) {
+ this.peerAddressResolver = Preconditions.checkNotNull(peerAddressResolver);
+ }
}
--- /dev/null
+/*
+ * Copyright (c) 2015 Brocade Communications Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.raft;
+
+/**
+ * Implementation of PeerAddressResolver that does nothing.
+ *
+ * @author Thomas Pantelis
+ */
+public final class NoopPeerAddressResolver implements PeerAddressResolver {
+ public static NoopPeerAddressResolver INSTANCE = new NoopPeerAddressResolver();
+
+ private NoopPeerAddressResolver() {
+ }
+
+ @Override
+ public String resolve(String peerId) {
+ return null;
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2015 Brocade Communications Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.raft;
+
+import javax.annotation.Nullable;
+
+/**
+ * Interface to resolve raft actor peer addresses.
+ *
+ * @author Thomas Pantelis
+ */
+public interface PeerAddressResolver {
+ /**
+ * Resolves a raft actor peer id to it's remote actor address.
+ *
+ * @param peerId the id of the peer to resolve
+ * @return the peer's actor path string or null if not found
+ */
+ @Nullable String resolve(String peerId);
+}
--- /dev/null
+/*
+ * Copyright (c) 2015 Brocade Communications Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.raft;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import akka.actor.Props;
+import akka.testkit.TestActorRef;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import org.junit.After;
+import org.junit.Test;
+import org.opendaylight.controller.cluster.NonPersistentDataProvider;
+import org.opendaylight.controller.cluster.raft.utils.DoNothingActor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Unit tests for RaftActorContextImpl.
+ *
+ * @author Thomas Pantelis
+ */
+public class RaftActorContextImplTest extends AbstractActorTest {
+ private final TestActorFactory actorFactory = new TestActorFactory(getSystem());
+
+ private final TestActorRef<DoNothingActor> actor = actorFactory.createTestActor(
+ Props.create(DoNothingActor.class), actorFactory.generateActorId("actor"));
+
+ private final Logger log = LoggerFactory.getLogger(RaftActorContextImplTest.class);
+
+ @After
+ public void tearDown() {
+ actorFactory.close();
+ }
+
+ @Test
+ public void testGetPeerAddress() {
+ DefaultConfigParamsImpl configParams = new DefaultConfigParamsImpl();
+ RaftActorContextImpl context = new RaftActorContextImpl(actor, actor.underlyingActor().getContext(),
+ "test", new ElectionTermImpl(new NonPersistentDataProvider(), "test", log), -1, -1,
+ Maps.newHashMap(ImmutableMap.<String, String>of("peer1", "peerAddress1")), configParams,
+ new NonPersistentDataProvider(), log);
+
+ assertEquals("getPeerAddress", "peerAddress1", context.getPeerAddress("peer1"));
+ assertEquals("getPeerAddress", null, context.getPeerAddress("peer2"));
+
+ PeerAddressResolver mockResolver = mock(PeerAddressResolver.class);
+ doReturn("peerAddress2").when(mockResolver).resolve("peer2");
+ configParams.setPeerAddressResolver(mockResolver);
+
+ assertEquals("getPeerAddress", "peerAddress2", context.getPeerAddress("peer2"));
+
+ reset(mockResolver);
+ assertEquals("getPeerAddress", "peerAddress2", context.getPeerAddress("peer2"));
+ assertEquals("getPeerAddress", "peerAddress1", context.getPeerAddress("peer1"));
+ verify(mockResolver, never()).resolve(anyString());
+ }
+}