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