2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
11 * Generated from: yang module name: bgp-rib-impl yang module local name: bgp-peer
12 * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
13 * Generated at: Sat Jan 25 11:00:14 CET 2014
15 * Do not modify this file unless it is present under src/main directory
17 package org.opendaylight.controller.config.yang.bgp.rib.impl;
19 import com.google.common.base.Optional;
20 import com.google.common.base.Preconditions;
21 import com.google.common.net.InetAddresses;
22 import io.netty.channel.epoll.Epoll;
23 import io.netty.util.concurrent.Future;
24 import java.net.InetSocketAddress;
25 import java.util.ArrayList;
26 import java.util.HashMap;
27 import java.util.List;
29 import org.opendaylight.controller.config.api.JmxAttributeValidationException;
30 import org.opendaylight.protocol.bgp.openconfig.spi.BGPConfigModuleTracker;
31 import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigProvider;
32 import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenconfigMapper;
33 import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
34 import org.opendaylight.protocol.bgp.openconfig.spi.pojo.BGPPeerInstanceConfiguration;
35 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
36 import org.opendaylight.protocol.bgp.parser.spi.MultiprotocolCapabilitiesUtil;
37 import org.opendaylight.protocol.bgp.rib.impl.BGPPeer;
38 import org.opendaylight.protocol.bgp.rib.impl.StrictBGPPeerRegistry;
39 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry;
40 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
41 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
42 import org.opendaylight.protocol.concepts.KeyMapping;
43 import org.opendaylight.protocol.util.Ipv6Util;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParameters;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParametersBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.OptionalCapabilities;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.OptionalCapabilitiesBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParametersBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.As4BytesCapabilityBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1Builder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.AddPathCapabilityBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.GracefulRestartCapabilityBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.MultiprotocolCapabilityBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamilies;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.rfc2385.cfg.rev160324.Rfc2385Key;
62 import org.slf4j.Logger;
63 import org.slf4j.LoggerFactory;
68 public final class BGPPeerModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPPeerModule {
69 private static final Logger LOG = LoggerFactory.getLogger(BGPPeerModule.class);
71 public BGPPeerModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier,
72 final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
73 super(identifier, dependencyResolver);
76 public BGPPeerModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier,
77 final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final BGPPeerModule oldModule,
78 final java.lang.AutoCloseable oldInstance) {
80 super(identifier, dependencyResolver, oldModule, oldInstance);
84 protected void customValidation() {
85 final IpAddress host = getHost();
86 JmxAttributeValidationException.checkNotNull(host, "value is not set.", hostJmxAttribute);
87 JmxAttributeValidationException.checkCondition(host.getIpv4Address() != null || host.getIpv6Address() != null,
88 "Unexpected host", hostJmxAttribute);
90 JmxAttributeValidationException.checkNotNull(getPort(), "value is not set.", portJmxAttribute);
92 if (getPeerRole() != null) {
93 final boolean isNotPeerRoleInternal= getPeerRole() != PeerRole.Internal;
94 JmxAttributeValidationException.checkCondition(isNotPeerRoleInternal,
95 "Internal Peer Role is reserved for Application Peer use.", peerRoleJmxAttribute);
98 if (getOptionalPassword(getPassword()).isPresent()) {
99 JmxAttributeValidationException.checkCondition(Epoll.isAvailable(),
100 "BGP Peer is configured with password but native transport is not available", passwordJmxAttribute);
105 private InetSocketAddress createAddress() {
106 final IpAddress ip = getHost();
107 Preconditions.checkArgument(ip.getIpv4Address() != null || ip.getIpv6Address() != null, "Failed to handle host %s", ip);
108 if (ip.getIpv4Address() != null) {
109 return new InetSocketAddress(InetAddresses.forString(ip.getIpv4Address().getValue()), getPort().getValue());
111 return new InetSocketAddress(InetAddresses.forString(ip.getIpv6Address().getValue()), getPort().getValue());
115 public java.lang.AutoCloseable createInstance() {
116 final RIB r = getRibDependency();
118 final List<BgpParameters> tlvs = getTlvs(r);
119 final AsNumber remoteAs = getAsOrDefault(r);
120 final BGPSessionPreferences prefs = new BGPSessionPreferences(r.getLocalAs(), getHoldtimer(), r.getBgpIdentifier(), remoteAs, tlvs);
121 final BGPPeer bgpClientPeer;
122 final IpAddress host = getNormalizedHost();
123 if (getPeerRole() != null) {
124 bgpClientPeer = new BGPPeer(peerName(host), r, getPeerRole(), getSimpleRoutingPolicy(), getRpcRegistryDependency());
126 bgpClientPeer = new BGPPeer(peerName(host), r, PeerRole.Ibgp, getSimpleRoutingPolicy(), getRpcRegistryDependency());
129 bgpClientPeer.registerRootRuntimeBean(getRootRuntimeBeanRegistratorWrapper());
131 getPeerRegistryBackwards().addPeer(host, bgpClientPeer, prefs);
133 final BGPPeerModuleTracker moduleTracker = new BGPPeerModuleTracker(r.getOpenConfigProvider());
134 moduleTracker.onInstanceCreate();
136 final CloseableNoEx peerCloseable = new CloseableNoEx() {
138 public void close() {
139 bgpClientPeer.close();
140 getPeerRegistryBackwards().removePeer(host);
141 moduleTracker.onInstanceClose();
145 // Initiate connection
146 if(getInitiateConnection()) {
147 final Future<Void> cf = initiateConnection(createAddress(), getOptionalPassword(getPassword()), getPeerRegistryBackwards());
148 return new CloseableNoEx() {
150 public void close() {
152 peerCloseable.close();
156 return peerCloseable;
160 private interface CloseableNoEx extends AutoCloseable {
165 private AsNumber getAsOrDefault(final RIB r) {
166 // Remote AS number defaults to our local AS
167 final AsNumber remoteAs;
168 if (getRemoteAs() != null) {
169 remoteAs = new AsNumber(getRemoteAs());
171 remoteAs = r.getLocalAs();
176 private List<BgpParameters> getTlvs(final RIB r) {
177 final List<BgpParameters> tlvs = new ArrayList<>();
178 final List<OptionalCapabilities> caps = new ArrayList<>();
179 caps.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().setAs4BytesCapability(
180 new As4BytesCapabilityBuilder().setAsNumber(r.getLocalAs()).build()).build()).build());
181 caps.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().addAugmentation(CParameters1.class,
182 new CParameters1Builder().setGracefulRestartCapability(new GracefulRestartCapabilityBuilder().build()).build()).build()).build());
184 if (getRouteRefresh()) {
185 caps.add(new OptionalCapabilitiesBuilder().setCParameters(MultiprotocolCapabilitiesUtil.RR_CAPABILITY).build());
188 if (!getAddPathDependency().isEmpty()) {
189 final List<AddressFamilies> addPathFamilies = filterAddPathDependency(getAddPathDependency());
190 caps.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().addAugmentation(CParameters1.class,
191 new CParameters1Builder().setAddPathCapability(new AddPathCapabilityBuilder().setAddressFamilies(addPathFamilies).build()).build()).build()).build());
194 for (final BgpTableType t : getAdvertizedTableDependency()) {
195 if (!r.getLocalTables().contains(t)) {
196 LOG.info("RIB instance does not list {} in its local tables. Incoming data will be dropped.", t);
199 caps.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().addAugmentation(CParameters1.class,
200 new CParameters1Builder().setMultiprotocolCapability(new MultiprotocolCapabilityBuilder(t).build()).build()).build()).build());
202 tlvs.add(new BgpParametersBuilder().setOptionalCapabilities(caps).build());
206 private List<AddressFamilies> filterAddPathDependency(final List<AddressFamilies> addPathDependency) {
207 final Map<BgpTableType, AddressFamilies> filteredFamilies = new HashMap<BgpTableType, AddressFamilies>();
208 for (final AddressFamilies family : addPathDependency) {
209 final BgpTableType key = new BgpTableTypeImpl(family.getAfi(), family.getSafi());
210 if (!filteredFamilies.containsKey(key)) {
211 filteredFamilies.put(key, family);
213 LOG.info("Ignoring Add-path dependency {}", family);
216 return new ArrayList<AddressFamilies>(filteredFamilies.values());
219 public IpAddress getNormalizedHost() {
220 final IpAddress host = getHost();
221 if(host.getIpv6Address() != null){
222 return new IpAddress(Ipv6Util.getFullForm(host.getIpv6Address()));
227 private io.netty.util.concurrent.Future<Void> initiateConnection(final InetSocketAddress address, final Optional<Rfc2385Key> password, final BGPPeerRegistry registry) {
228 KeyMapping keys = KeyMapping.getKeyMapping(address.getAddress(), password);
229 final RIB rib = getRibDependency();
230 final Optional<KeyMapping> optionalKey = Optional.fromNullable(keys);
231 return rib.getDispatcher().createReconnectingClient(address, registry, getRetrytimer(), optionalKey);
234 private BGPPeerRegistry getPeerRegistryBackwards() {
235 return getPeerRegistry() == null ? StrictBGPPeerRegistry.GLOBAL : getPeerRegistryDependency();
238 private static String peerName(final IpAddress host) {
239 if (host.getIpv4Address() != null) {
240 return host.getIpv4Address().getValue();
242 if (host.getIpv6Address() != null) {
243 return host.getIpv6Address().getValue();
249 private final class BGPPeerModuleTracker implements BGPConfigModuleTracker {
251 private final BGPOpenconfigMapper<BGPPeerInstanceConfiguration> neighborProvider;
252 private final BGPPeerInstanceConfiguration bgpPeerInstanceConfiguration;
254 public BGPPeerModuleTracker(final Optional<BGPOpenConfigProvider> openconfigProvider) {
255 if (openconfigProvider.isPresent()) {
256 this.neighborProvider = openconfigProvider.get().getOpenConfigMapper(BGPPeerInstanceConfiguration.class);
258 this.neighborProvider = null;
260 final InstanceConfigurationIdentifier identifier = new InstanceConfigurationIdentifier(getIdentifier().getInstanceName());
261 this.bgpPeerInstanceConfiguration = new BGPPeerInstanceConfiguration(identifier, getNormalizedHost(),
262 getPort(), getHoldtimer(), getPeerRole(), getInitiateConnection(),
263 getAdvertizedTableDependency(), getAsOrDefault(getRibDependency()),
264 getOptionalPassword(getPassword()), getAddPathDependency());
268 public void onInstanceCreate() {
269 if (this.neighborProvider != null) {
270 this.neighborProvider.writeConfiguration(this.bgpPeerInstanceConfiguration);
275 public void onInstanceClose() {
276 if (this.neighborProvider != null) {
277 this.neighborProvider.removeConfiguration(this.bgpPeerInstanceConfiguration);
283 private Optional<Rfc2385Key> getOptionalPassword(final Rfc2385Key password) {
284 return password != null && ! password.getValue().isEmpty() ? Optional.of(password) : Optional.<Rfc2385Key>absent();