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.mvpn.impl;
10 import com.google.common.collect.ImmutableCollection;
11 import com.google.common.collect.ImmutableSet;
12 import java.util.ArrayList;
13 import java.util.Collection;
14 import java.util.Collections;
15 import java.util.List;
16 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
17 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
18 import org.opendaylight.protocol.bgp.rib.spi.AbstractRIBSupport;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.rev200120.McastVpnSubsequentAddressFamily;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.rev200120.MvpnRoutes;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.rev200120.mvpn.MvpnChoice;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mvpn.rev200120.mvpn.routes.MvpnRoute;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.Tables;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.tables.Routes;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.AddressFamily;
26 import org.opendaylight.yangtools.yang.binding.BindingObject;
27 import org.opendaylight.yangtools.yang.binding.ChildOf;
28 import org.opendaylight.yangtools.yang.binding.ChoiceIn;
29 import org.opendaylight.yangtools.yang.binding.DataObject;
30 import org.opendaylight.yangtools.yang.common.QName;
31 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
32 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
33 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
34 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
35 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
36 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
37 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
38 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
43 * Abstract Mvpn RIBSupport.
45 * @author Claudio D. Gasparini
47 abstract class AbstractMvpnRIBSupport<C extends Routes & DataObject & ChoiceIn<Tables>,
48 S extends ChildOf<? super C> & MvpnRoutes> extends AbstractRIBSupport<C, S, MvpnRoute> {
49 private static final Logger LOG = LoggerFactory.getLogger(AbstractMvpnRIBSupport.class);
50 private final NodeIdentifier nlriRoutesList;
51 private final ImmutableCollection<Class<? extends BindingObject>> cacheableNlriObjects;
54 * Default constructor. Requires the QName of the container augmented under the routes choice
55 * node in instantiations of the rib grouping. It is assumed that this container is defined by
56 * the same model which populates it with route grouping instantiation, and by extension with
57 * the route attributes container.
59 * @param mappingService Serialization service
60 * @param cazeClass Binding class of the AFI/SAFI-specific case statement, must not be null
61 * @param afiClass address Family Class
62 * @param destContainerQname destination container Qname
63 * @param destListQname destinations list Qname
65 AbstractMvpnRIBSupport(
66 final BindingNormalizedNodeSerializer mappingService,
67 final Class<C> cazeClass,
68 final Class<S> containerClass,
69 final Class<? extends AddressFamily> afiClass,
70 final QName destContainerQname,
71 final QName destListQname) {
72 super(mappingService, cazeClass, containerClass, MvpnRoute.class, afiClass,
73 McastVpnSubsequentAddressFamily.class, destContainerQname);
74 this.nlriRoutesList = NodeIdentifier.create(destListQname);
75 this.cacheableNlriObjects = ImmutableSet.of(cazeClass);
80 public final ImmutableCollection<Class<? extends BindingObject>> cacheableNlriObjects() {
81 return this.cacheableNlriObjects;
84 final MvpnChoice extractMvpnChoice(final DataContainerNode route) {
85 final DataObject nn = this.mappingService.fromNormalizedNode(this.routeDefaultYii, route).getValue();
86 return ((MvpnRoute) nn).getMvpnChoice();
90 protected final Collection<NodeIdentifierWithPredicates> processDestination(
91 final DOMDataTreeWriteTransaction tx,
92 final YangInstanceIdentifier routesPath,
93 final ContainerNode destination,
94 final ContainerNode attributes,
95 final ApplyRoute function) {
96 if (destination != null) {
97 final DataContainerChild routes = destination.childByArg(this.nlriRoutesList);
99 if (routes instanceof UnkeyedListNode) {
100 final YangInstanceIdentifier base = routesYangInstanceIdentifier(routesPath);
101 final Collection<UnkeyedListEntryNode> routesList = ((UnkeyedListNode) routes).body();
102 final List<NodeIdentifierWithPredicates> keys = new ArrayList<>(routesList.size());
103 for (final UnkeyedListEntryNode mvpnDest : routesList) {
104 final NodeIdentifierWithPredicates routeKey = createRouteKey(mvpnDest);
105 function.apply(tx, base, routeKey, mvpnDest, attributes);
110 LOG.warn("Routes {} are not a map", routes);
113 return Collections.emptyList();
116 abstract NodeIdentifierWithPredicates createRouteKey(UnkeyedListEntryNode mvpn);