import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableClassToInstanceMap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.attributes.unreach.mp.unreach.nlri.WithdrawnRoutesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.GracefulRestartCapability;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.add.path.capability.AddressFamilies;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.peer.rpc.rev180329.BgpPeerRpcService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.peer.rpc.rev180329.ResetSession;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.peer.rpc.rev180329.RestartGracefully;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.peer.rpc.rev180329.RouteRefreshRequest;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.PeerRole;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.rib.PeerKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv4AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.RouteTarget;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
import org.opendaylight.yangtools.yang.binding.Notification;
+import org.opendaylight.yangtools.yang.binding.Rpc;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
import org.slf4j.Logger;
private AdjRibInWriter ribWriter;
@GuardedBy("this")
private EffectiveRibInWriter effRibInWriter;
- private ObjectRegistration<BgpPeerRpcService> rpcRegistration;
+ private Registration rpcRegistration;
private ImmutableMap<TablesKey, SendReceive> addPathTableMaps = ImmutableMap.of();
// FIXME: This should be a constant co-located with ApplicationPeer.peerId
private YangInstanceIdentifier peerPath;
tables, addPathTableMaps);
if (rpcRegistry != null) {
- rpcRegistration = rpcRegistry.registerRpcImplementation(BgpPeerRpcService.class,
- new BgpPeerRpc(this, session, tables), ImmutableSet.of(rib.getInstanceIdentifier().child(
+ final var bgpPeerHandler = new BgpPeerRpc(this, session, tables);
+ rpcRegistration = rpcRegistry.registerRpcImplementations(
+ ImmutableClassToInstanceMap.<Rpc<?, ?>>builder()
+ .put(ResetSession.class, bgpPeerHandler::resetSession)
+ .put(RestartGracefully.class, bgpPeerHandler::restartGracefully)
+ .put(RouteRefreshRequest.class, bgpPeerHandler::routeRefreshRequest)
+ .build(),
+ ImmutableSet.of(rib.getInstanceIdentifier().child(
org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.rib
.Peer.class, new PeerKey(peerId))));
}
import java.util.Set;
import org.opendaylight.protocol.bgp.rib.spi.BGPSession;
import org.opendaylight.protocol.bgp.rib.spi.PeerRPCs;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.RouteRefresh;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.RouteRefreshBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.peer.rpc.rev180329.BgpPeerRpcService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.peer.rpc.rev180329.ResetSessionInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.peer.rpc.rev180329.ResetSessionOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.peer.rpc.rev180329.ResetSessionOutputBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class BgpPeerRpc implements BgpPeerRpcService {
-
+final class BgpPeerRpc {
private static final Logger LOG = LoggerFactory.getLogger(BgpPeerRpc.class);
- private static final String FAILURE_MSG = "Failed to send Route Refresh message";
- private static final String FAILURE_RESET_SESSION_MSG = "Failed to reset session";
private final BGPSession session;
private final Set<TablesKey> supportedFamilies;
this.supportedFamilies = requireNonNull(supportedFamilies);
}
- @Override
- public ListenableFuture<RpcResult<ResetSessionOutput>> resetSession(final ResetSessionInput input) {
- final ListenableFuture<?> f = peerRPCs.releaseConnection();
- return Futures.transform(f, input1 -> {
- if (f.isDone()) {
- return RpcResultBuilder.success(new ResetSessionOutputBuilder().build()).build();
- }
- return RpcResultBuilder.<ResetSessionOutput>failed().withError(ErrorType.RPC, FAILURE_RESET_SESSION_MSG)
- .build();
- }, MoreExecutors.directExecutor());
+ ListenableFuture<RpcResult<ResetSessionOutput>> resetSession(final ResetSessionInput input) {
+ final var f = peerRPCs.releaseConnection();
+ return Futures.transform(f,
+ input1 -> f.isDone() ? RpcResultBuilder.success(new ResetSessionOutputBuilder().build()).build()
+ : RpcResultBuilder.<ResetSessionOutput>failed()
+ .withError(ErrorType.RPC, "Failed to reset session")
+ .build(),
+ MoreExecutors.directExecutor());
}
- @Override
- public ListenableFuture<RpcResult<RestartGracefullyOutput>> restartGracefully(final RestartGracefullyInput input) {
- final SettableFuture<RpcResult<RestartGracefullyOutput>> ret = SettableFuture.create();
+ ListenableFuture<RpcResult<RestartGracefullyOutput>> restartGracefully(final RestartGracefullyInput input) {
+ final var ret = SettableFuture.<RpcResult<RestartGracefullyOutput>>create();
Futures.addCallback(peerRPCs.restartGracefully(input.getSelectionDeferralTime().toJava()),
new FutureCallback<Object>() {
@Override
return ret;
}
- @Override
- public ListenableFuture<RpcResult<RouteRefreshRequestOutput>> routeRefreshRequest(
- final RouteRefreshRequestInput input) {
- final ChannelFuture f = sendRRMessage(input);
+ ListenableFuture<RpcResult<RouteRefreshRequestOutput>> routeRefreshRequest(final RouteRefreshRequestInput input) {
+ final var f = sendRRMessage(input);
if (f == null) {
return RpcResultBuilder.<RouteRefreshRequestOutput>failed().withError(ErrorType.RPC,
- FAILURE_MSG + " due to unsupported address families.").buildFuture();
+ "Failed to send Route Refresh message due to unsupported address families.").buildFuture();
}
- final SettableFuture<RpcResult<RouteRefreshRequestOutput>> ret = SettableFuture.create();
- f.addListener(future -> {
- ret.set(future.isSuccess()
- ? RpcResultBuilder.success(new RouteRefreshRequestOutputBuilder().build()).build()
- : RpcResultBuilder.<RouteRefreshRequestOutput>failed().withError(ErrorType.RPC, FAILURE_MSG)
- .build());
- });
+ final var ret = SettableFuture.<RpcResult<RouteRefreshRequestOutput>>create();
+ f.addListener(future -> ret.set(future.isSuccess()
+ ? RpcResultBuilder.success(new RouteRefreshRequestOutputBuilder().build()).build()
+ : RpcResultBuilder.<RouteRefreshRequestOutput>failed()
+ .withError(ErrorType.RPC, "Failed to send Route Refresh message")
+ .build())
+ );
return ret;
}
LOG.info("Unsupported afi/safi: {}, {}.", input.getAfi(), input.getSafi());
return null;
}
- final RouteRefresh msg = new RouteRefreshBuilder().setAfi(input.getAfi()).setSafi(input.getSafi()).build();
- return ((BGPSessionImpl) session).getLimiter().writeAndFlush(msg);
+ return ((BGPSessionImpl) session).getLimiter()
+ .writeAndFlush(new RouteRefreshBuilder().setAfi(input.getAfi()).setSafi(input.getSafi()).build());
}
}