2 * Copyright (c) 2018 AT&T Intellectual Property. 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
8 package org.opendaylight.protocol.bgp.rib.impl.config;
10 import static org.opendaylight.protocol.bgp.parser.GracefulRestartUtil.gracefulRestartCapability;
11 import static org.opendaylight.protocol.bgp.parser.GracefulRestartUtil.gracefulRestartTable;
13 import com.google.common.collect.Maps;
14 import java.util.ArrayList;
15 import java.util.HashMap;
16 import java.util.HashSet;
17 import java.util.List;
19 import java.util.Optional;
21 import java.util.stream.Collectors;
22 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
23 import org.opendaylight.protocol.bgp.rib.impl.BgpPeerUtil;
24 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
25 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.afi.safi.GracefulRestart;
26 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.afi.safi.graceful.restart.Config;
27 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.ll.graceful.restart.rev181112.Config1;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.ll.graceful.restart.rev181112.Config2;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.ll.graceful.restart.rev181112.afi.safi.ll.graceful.restart.LlGracefulRestart;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.BgpParameters;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.BgpParametersBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.OptionalCapabilities;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.OptionalCapabilitiesBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.optional.capabilities.CParameters;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.optional.capabilities.CParametersBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.CParameters1;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.CParameters1Builder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.LlGracefulRestartCapabilityBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.Tables;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.Tables.AfiFlags;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.TablesBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
48 * Helpers for dealing with Graceful Restart capabilities.
50 * @deprecated This class is competing with bgp-parser-api's view of GR and will be renamed and/or eliminated.
52 // FIXME: This functionality should live in bgp-parser-api, except the use of RIB version of TablesKey prevents that.
53 // We should be able to refactor this class by providing TablesKey translation somewhere.
55 public final class GracefulRestartUtil {
56 private static final Logger LOG = LoggerFactory.getLogger(GracefulRestartUtil.class);
58 private GracefulRestartUtil() {
62 public static CParameters getGracefulCapability(final Map<TablesKey, Boolean> tables,
63 final int restartTime,
64 final boolean localRestarting) {
65 return gracefulRestartCapability(tables.entrySet().stream()
67 final TablesKey key = entry.getKey();
68 return gracefulRestartTable(key.getAfi(), key.getSafi(), entry.getValue());
70 .collect(Collectors.toList()), restartTime, localRestarting);
73 public static CParameters getLlGracefulCapability(final Set<BgpPeerUtil.LlGracefulRestartDTO> llGracefulRestarts) {
74 final List<Tables> tablesList = llGracefulRestarts.stream()
75 .map(dto -> new TablesBuilder()
76 .setAfi(dto.getTableKey().getAfi())
77 .setSafi(dto.getTableKey().getSafi())
78 .setAfiFlags(new AfiFlags(dto.isForwarding()))
79 .setLongLivedStaleTime((long) dto.getStaleTime())
81 .collect(Collectors.toList());
82 return new CParametersBuilder().addAugmentation(CParameters1.class,
83 new CParameters1Builder().setLlGracefulRestartCapability(
84 new LlGracefulRestartCapabilityBuilder()
85 .setTables(tablesList)
86 .build()).build()).build();
89 static Set<TablesKey> getGracefulTables(final List<AfiSafi> afiSafis,
90 final BGPTableTypeRegistryConsumer tableTypeRegistry) {
91 Set<TablesKey> gracefulTables = new HashSet<>();
92 for (final AfiSafi afiSafi : afiSafis) {
93 if (afiSafi.getGracefulRestart() != null
94 && afiSafi.getGracefulRestart().getConfig() != null
95 && afiSafi.getGracefulRestart().getConfig().isEnabled()) {
96 final Class<? extends AfiSafiType> afiSafiName = afiSafi.getAfiSafiName();
97 if (afiSafiName != null) {
98 final Optional<TablesKey> tableKey = tableTypeRegistry.getTableKey(afiSafiName);
99 if (tableKey.isPresent()) {
100 final TablesKey tablesKey = tableKey.get();
101 gracefulTables.add(tablesKey);
106 return gracefulTables;
109 static Map<TablesKey, Integer> getLlGracefulTimers(final List<AfiSafi> afiSafis,
110 final BGPTableTypeRegistryConsumer tableTypeRegistry) {
111 final Map<TablesKey, Integer> timers = new HashMap<>();
112 afiSafis.forEach(afiSafi -> {
113 final GracefulRestart gracefulRestart = afiSafi.getGracefulRestart();
114 if (gracefulRestart != null) {
115 final Config gracefulRestartConfig = gracefulRestart.getConfig();
116 if (gracefulRestartConfig != null) {
117 final LlGracefulRestart llGracefulRestart;
118 final Config1 peerAug = gracefulRestartConfig.augmentation(Config1.class);
119 if (peerAug != null) {
120 llGracefulRestart = peerAug.getLlGracefulRestart();
122 final Config2 neighborAug = gracefulRestartConfig.augmentation(Config2.class);
123 if (neighborAug != null) {
124 llGracefulRestart = neighborAug.getLlGracefulRestart();
129 if (llGracefulRestart != null) {
130 final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.ll.graceful.restart
131 .rev181112.afi.safi.ll.graceful.restart.ll.graceful.restart.Config config =
132 llGracefulRestart.getConfig();
133 if (config != null) {
134 final Long staleTime = config.getLongLivedStaleTime();
135 if (staleTime != null && staleTime > 0) {
136 final Optional<TablesKey> key = tableTypeRegistry.getTableKey(afiSafi.getAfiSafiName());
137 if (key.isPresent()) {
138 timers.put(key.get(), staleTime.intValue());
140 LOG.debug("Skipping unsupported afi-safi {}",afiSafi.getAfiSafiName());
151 public static BgpParameters getGracefulBgpParameters(final List<OptionalCapabilities> fixedCapabilities,
152 final Set<TablesKey> gracefulTables,
153 final Set<TablesKey> preservedTables,
154 final int gracefulRestartTimer,
155 final boolean localRestarting,
156 final Set<BgpPeerUtil.LlGracefulRestartDTO> llGracefulDTOs) {
157 final List<OptionalCapabilities> capabilities = new ArrayList<>(fixedCapabilities);
158 capabilities.add(new OptionalCapabilitiesBuilder()
159 .setCParameters(getGracefulCapability(Maps.asMap(gracefulTables, preservedTables::contains),
160 gracefulRestartTimer, localRestarting))
162 capabilities.add(new OptionalCapabilitiesBuilder()
163 .setCParameters(getLlGracefulCapability(llGracefulDTOs))
166 return new BgpParametersBuilder().setOptionalCapabilities(capabilities).build();