Remove hand-written ServiceLoader services
[bgpcep.git] / bgp / extensions / linkstate / src / main / java / org / opendaylight / protocol / bgp / linkstate / impl / BGPActivator.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  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.linkstate.impl;
9
10 import com.google.common.base.MoreObjects;
11 import java.util.ArrayList;
12 import java.util.List;
13 import org.kohsuke.MetaInfServices;
14 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.LinkstateAttributeParser;
15 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.BackupUnnumberedParser;
16 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.EroMetricParser;
17 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv4BackupEro;
18 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv4EroParser;
19 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv4PrefixSidParser;
20 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv6BackupEro;
21 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv6EroParser;
22 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv6PrefixSidParser;
23 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.SIDParser;
24 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.UnnumberedEroParser;
25 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.Ipv4PrefixNlriParser;
26 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.Ipv6PrefixNlriParser;
27 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.LinkNlriParser;
28 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.LinkstateNlriParser;
29 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.NodeNlriParser;
30 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.TeLspIpv4NlriParser;
31 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.TeLspIpv6NlriParser;
32 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.AdvertisingNodeDescriptorTlvParser;
33 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.AreaIdTlvParser;
34 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.AsNumTlvParser;
35 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.BgpRouterIdTlvParser;
36 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.DomainIdTlvParser;
37 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.Ipv4InterfaceTlvParser;
38 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.Ipv4NeighborTlvParser;
39 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.Ipv6InterfaceTlvParser;
40 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.Ipv6NeighborTlvParser;
41 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.LinkIdTlvParser;
42 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.LocalNodeDescriptorTlvParser;
43 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.MemAsNumTlvParser;
44 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.MultiTopoIdTlvParser;
45 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.NodeDescriptorTlvParser;
46 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.OspfRouteTlvParser;
47 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.ReachTlvParser;
48 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.RemoteNodeDescriptorTlvParser;
49 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.RouterIdTlvParser;
50 import org.opendaylight.protocol.bgp.linkstate.spi.pojo.SimpleBindingSubTlvsRegistry;
51 import org.opendaylight.protocol.bgp.linkstate.spi.pojo.SimpleNlriTypeRegistry;
52 import org.opendaylight.protocol.bgp.parser.spi.AbstractBGPExtensionProviderActivator;
53 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator;
54 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
55 import org.opendaylight.protocol.bgp.parser.spi.NextHopParserSerializer;
56 import org.opendaylight.protocol.rsvp.parser.spi.RSVPTeObjectRegistry;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.Attributes1;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.LinkstateAddressFamily;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.LinkstateSubsequentAddressFamily;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.object.type.LinkCase;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.object.type.NodeCase;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.object.type.PrefixCase;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.object.type.TeLspCase;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.routes.LinkstateRoutes;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.EroMetricCase;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv4EroBackupCase;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv4EroCase;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv6EroBackupCase;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv6EroCase;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv6PrefixSidCase;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.PrefixSidCase;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.SidLabelCase;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdBackupEroCase;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdEroCase;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.Ipv4NextHopCase;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.Ipv6NextHopCase;
77 import org.opendaylight.yangtools.concepts.Registration;
78
79 /**
80  * Activator for registering linkstate extensions to BGP parser.
81  */
82 @MetaInfServices(value = BGPExtensionProviderActivator.class)
83 public final class BGPActivator extends AbstractBGPExtensionProviderActivator {
84     private static final int LINKSTATE_AFI = 16388;
85     private static final int LINKSTATE_SAFI = 71;
86
87     private final boolean ianaLinkstateAttributeType;
88     private final RSVPTeObjectRegistry rsvpTeObjectRegistry;
89
90     public BGPActivator() {
91         this(true, null);
92     }
93
94     // FIXME: this should be properly injected
95     public BGPActivator(final boolean ianaLinkstateAttributeType, final RSVPTeObjectRegistry rsvpTeObjectRegistry) {
96         this.rsvpTeObjectRegistry = rsvpTeObjectRegistry;
97         this.ianaLinkstateAttributeType = ianaLinkstateAttributeType;
98     }
99
100     @Override
101     protected List<Registration> startImpl(final BGPExtensionProviderContext context) {
102         final List<Registration> regs = new ArrayList<>();
103
104         final SimpleNlriTypeRegistry nlriTypeReg = SimpleNlriTypeRegistry.getInstance();
105
106         regs.add(context.registerAddressFamily(LinkstateAddressFamily.class, LINKSTATE_AFI));
107         regs.add(context.registerSubsequentAddressFamily(LinkstateSubsequentAddressFamily.class, LINKSTATE_SAFI));
108
109         final NextHopParserSerializer linkstateNextHopParser = new NextHopParserSerializer() {
110         };
111         final LinkstateNlriParser parser = new LinkstateNlriParser();
112         regs.add(context.registerNlriParser(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class,
113             parser, linkstateNextHopParser, Ipv4NextHopCase.class, Ipv6NextHopCase.class));
114         regs.add(context.registerNlriSerializer(LinkstateRoutes.class, parser));
115
116         regs.add(context.registerAttributeSerializer(Attributes1.class,
117             new LinkstateAttributeParser(this.ianaLinkstateAttributeType, this.rsvpTeObjectRegistry)));
118         final LinkstateAttributeParser linkstateAttributeParser = new LinkstateAttributeParser(
119             this.ianaLinkstateAttributeType, this.rsvpTeObjectRegistry);
120         regs.add(context.registerAttributeParser(linkstateAttributeParser.getType(), linkstateAttributeParser));
121
122         registerNlriCodecs(regs, nlriTypeReg);
123         registerNlriTlvCodecs(regs, nlriTypeReg);
124         registerBindingSubTlvs(regs);
125         return regs;
126     }
127
128     private static void registerBindingSubTlvs(final List<Registration> regs) {
129         final SimpleBindingSubTlvsRegistry simpleReg = SimpleBindingSubTlvsRegistry.getInstance();
130
131         final SIDParser sidParser = new SIDParser();
132         regs.add(simpleReg.registerBindingSubTlvsParser(sidParser.getType(), sidParser));
133         regs.add(simpleReg.registerBindingSubTlvsSerializer(SidLabelCase.class, sidParser));
134
135         final Ipv4PrefixSidParser prefixSidParser = new Ipv4PrefixSidParser();
136         regs.add(simpleReg.registerBindingSubTlvsParser(prefixSidParser.getType(), prefixSidParser));
137         regs.add(simpleReg.registerBindingSubTlvsSerializer(PrefixSidCase.class, prefixSidParser));
138
139         final Ipv6PrefixSidParser ipv6PrefixSidParser = new Ipv6PrefixSidParser();
140         regs.add(simpleReg.registerBindingSubTlvsParser(ipv6PrefixSidParser.getType(), ipv6PrefixSidParser));
141         regs.add(simpleReg.registerBindingSubTlvsSerializer(Ipv6PrefixSidCase.class, ipv6PrefixSidParser));
142
143         final EroMetricParser eroMetricParser = new EroMetricParser();
144         regs.add(simpleReg.registerBindingSubTlvsParser(eroMetricParser.getType(), eroMetricParser));
145         regs.add(simpleReg.registerBindingSubTlvsSerializer(EroMetricCase.class, eroMetricParser));
146
147         final Ipv4EroParser ipv4EroParser = new Ipv4EroParser();
148         regs.add(simpleReg.registerBindingSubTlvsParser(ipv4EroParser.getType(), ipv4EroParser));
149         regs.add(simpleReg.registerBindingSubTlvsSerializer(Ipv4EroCase.class, ipv4EroParser));
150
151         final Ipv4BackupEro ipv4BackupEro = new Ipv4BackupEro();
152         regs.add(simpleReg.registerBindingSubTlvsParser(ipv4BackupEro.getType(), ipv4BackupEro));
153         regs.add(simpleReg.registerBindingSubTlvsSerializer(Ipv4EroBackupCase.class, ipv4BackupEro));
154
155         final Ipv6EroParser ipv6EroParser = new Ipv6EroParser();
156         regs.add(simpleReg.registerBindingSubTlvsParser(ipv6EroParser.getType(), ipv6EroParser));
157         regs.add(simpleReg.registerBindingSubTlvsSerializer(Ipv6EroCase.class, ipv6EroParser));
158
159         final Ipv6BackupEro ipv6BackupEro = new Ipv6BackupEro();
160         regs.add(simpleReg.registerBindingSubTlvsParser(ipv6BackupEro.getType(), ipv6BackupEro));
161         regs.add(simpleReg.registerBindingSubTlvsSerializer(Ipv6EroBackupCase.class, ipv6BackupEro));
162
163         final UnnumberedEroParser unnumberedEroParser = new UnnumberedEroParser();
164         regs.add(simpleReg.registerBindingSubTlvsParser(unnumberedEroParser.getType(), unnumberedEroParser));
165         regs.add(simpleReg.registerBindingSubTlvsSerializer(UnnumberedInterfaceIdEroCase.class,
166             unnumberedEroParser));
167
168         final BackupUnnumberedParser backupUnnumberedParser = new BackupUnnumberedParser();
169         regs.add(simpleReg.registerBindingSubTlvsParser(backupUnnumberedParser.getType(), backupUnnumberedParser));
170         regs.add(simpleReg.registerBindingSubTlvsSerializer(UnnumberedInterfaceIdBackupEroCase.class,
171             backupUnnumberedParser));
172     }
173
174     private static void registerNlriCodecs(final List<Registration> regs, final SimpleNlriTypeRegistry nlriTypeReg) {
175
176         final NodeNlriParser nodeParser = new NodeNlriParser();
177         regs.add(nlriTypeReg.registerNlriParser(nodeParser.getNlriType(), nodeParser));
178         regs.add(nlriTypeReg.registerNlriSerializer(NodeCase.class, nodeParser));
179
180         final LinkNlriParser linkParser = new LinkNlriParser();
181         regs.add(nlriTypeReg.registerNlriParser(linkParser.getNlriType(), linkParser));
182         regs.add(nlriTypeReg.registerNlriSerializer(LinkCase.class, linkParser));
183
184         final Ipv4PrefixNlriParser ipv4PrefixParser = new Ipv4PrefixNlriParser();
185         regs.add(nlriTypeReg.registerNlriParser(ipv4PrefixParser.getNlriType(), ipv4PrefixParser));
186         regs.add(nlriTypeReg.registerNlriSerializer(PrefixCase.class, ipv4PrefixParser));
187         final Ipv6PrefixNlriParser ipv6PrefixParser = new Ipv6PrefixNlriParser();
188         regs.add(nlriTypeReg.registerNlriParser(ipv6PrefixParser.getNlriType(), ipv6PrefixParser));
189
190         final TeLspIpv4NlriParser teLspIpv4Parser = new TeLspIpv4NlriParser();
191         regs.add(nlriTypeReg.registerNlriParser(teLspIpv4Parser.getNlriType(), teLspIpv4Parser));
192         regs.add(nlriTypeReg.registerNlriSerializer(TeLspCase.class, teLspIpv4Parser));
193         final TeLspIpv6NlriParser teLspIpv6Parser = new TeLspIpv6NlriParser();
194         regs.add(nlriTypeReg.registerNlriParser(teLspIpv6Parser.getNlriType(), teLspIpv6Parser));
195     }
196
197     private static void registerNlriTlvCodecs(final List<Registration> regs, final SimpleNlriTypeRegistry nlriTypeReg) {
198
199         final LocalNodeDescriptorTlvParser localParser = new LocalNodeDescriptorTlvParser();
200         regs.add(nlriTypeReg.registerTlvParser(localParser.getType(), localParser));
201         regs.add(nlriTypeReg.registerTlvSerializer(localParser.getTlvQName(), localParser));
202
203         final NodeDescriptorTlvParser nodeParser = new NodeDescriptorTlvParser();
204         regs.add(nlriTypeReg.registerTlvSerializer(nodeParser.getTlvQName(), nodeParser));
205
206         final AdvertisingNodeDescriptorTlvParser advParser = new AdvertisingNodeDescriptorTlvParser();
207         regs.add(nlriTypeReg.registerTlvSerializer(advParser.getTlvQName(), advParser));
208
209         final RemoteNodeDescriptorTlvParser remoteParser = new RemoteNodeDescriptorTlvParser();
210         regs.add(nlriTypeReg.registerTlvParser(remoteParser.getType(), remoteParser));
211         regs.add(nlriTypeReg.registerTlvSerializer(remoteParser.getTlvQName(), remoteParser));
212
213         final RouterIdTlvParser bgpCrouterIdParser = new RouterIdTlvParser();
214         regs.add(nlriTypeReg.registerTlvParser(bgpCrouterIdParser.getType(), bgpCrouterIdParser));
215         regs.add(nlriTypeReg.registerTlvSerializer(bgpCrouterIdParser.getTlvQName(), bgpCrouterIdParser));
216
217         final AsNumTlvParser asNumParser = new AsNumTlvParser();
218         regs.add(nlriTypeReg.registerTlvParser(asNumParser.getType(), asNumParser));
219         regs.add(nlriTypeReg.registerTlvSerializer(asNumParser.getTlvQName(), asNumParser));
220
221         final DomainIdTlvParser bgpDomainIdParser = new DomainIdTlvParser();
222         regs.add(nlriTypeReg.registerTlvParser(bgpDomainIdParser.getType(), bgpDomainIdParser));
223         regs.add(nlriTypeReg.registerTlvSerializer(bgpDomainIdParser.getTlvQName(), bgpDomainIdParser));
224
225         final AreaIdTlvParser areaIdParser = new AreaIdTlvParser();
226         regs.add(nlriTypeReg.registerTlvParser(areaIdParser.getType(), areaIdParser));
227         regs.add(nlriTypeReg.registerTlvSerializer(areaIdParser.getTlvQName(), areaIdParser));
228
229         final BgpRouterIdTlvParser bgpRouterIdParser = new BgpRouterIdTlvParser();
230         regs.add(nlriTypeReg.registerTlvParser(bgpRouterIdParser.getType(), bgpRouterIdParser));
231         regs.add(nlriTypeReg.registerTlvSerializer(bgpRouterIdParser.getTlvQName(), bgpRouterIdParser));
232
233         final MemAsNumTlvParser memAsnParser = new MemAsNumTlvParser();
234         regs.add(nlriTypeReg.registerTlvParser(memAsnParser.getType(), memAsnParser));
235         regs.add(nlriTypeReg.registerTlvSerializer(memAsnParser.getTlvQName(), memAsnParser));
236
237         final LinkIdTlvParser linkIdParser = new LinkIdTlvParser();
238         regs.add(nlriTypeReg.registerTlvParser(linkIdParser.getType(), linkIdParser));
239         regs.add(nlriTypeReg.registerTlvSerializer(linkIdParser.getTlvQName(), linkIdParser));
240
241         final Ipv4NeighborTlvParser ipv4nNeighborParser = new Ipv4NeighborTlvParser();
242         regs.add(nlriTypeReg.registerTlvParser(ipv4nNeighborParser.getType(), ipv4nNeighborParser));
243         regs.add(nlriTypeReg.registerTlvSerializer(ipv4nNeighborParser.getTlvQName(), ipv4nNeighborParser));
244
245         final Ipv6NeighborTlvParser ipv6NeighborParser = new Ipv6NeighborTlvParser();
246         regs.add(nlriTypeReg.registerTlvParser(ipv6NeighborParser.getType(), ipv6NeighborParser));
247         regs.add(nlriTypeReg.registerTlvSerializer(ipv6NeighborParser.getTlvQName(), ipv6NeighborParser));
248
249         final Ipv4InterfaceTlvParser ipv4InterfaceParser = new Ipv4InterfaceTlvParser();
250         regs.add(nlriTypeReg.registerTlvParser(ipv4InterfaceParser.getType(), ipv4InterfaceParser));
251         regs.add(nlriTypeReg.registerTlvSerializer(ipv4InterfaceParser.getTlvQName(), ipv4InterfaceParser));
252
253         final Ipv6InterfaceTlvParser ipv6InterfaceParser = new Ipv6InterfaceTlvParser();
254         regs.add(nlriTypeReg.registerTlvParser(ipv6InterfaceParser.getType(), ipv6InterfaceParser));
255         regs.add(nlriTypeReg.registerTlvSerializer(ipv6InterfaceParser.getTlvQName(), ipv6InterfaceParser));
256
257         final MultiTopoIdTlvParser multiTopoIdParser = new MultiTopoIdTlvParser();
258         regs.add(nlriTypeReg.registerTlvParser(multiTopoIdParser.getType(), multiTopoIdParser));
259         regs.add(nlriTypeReg.registerTlvSerializer(multiTopoIdParser.getTlvQName(), multiTopoIdParser));
260
261         final ReachTlvParser ipv4ReachParser = new ReachTlvParser();
262         regs.add(nlriTypeReg.registerTlvParser(ipv4ReachParser.getType(), ipv4ReachParser));
263         regs.add(nlriTypeReg.registerTlvSerializer(ipv4ReachParser.getTlvQName(), ipv4ReachParser));
264
265         final OspfRouteTlvParser ospfRouterParser = new OspfRouteTlvParser();
266         regs.add(nlriTypeReg.registerTlvParser(ospfRouterParser.getType(), ospfRouterParser));
267         regs.add(nlriTypeReg.registerTlvSerializer(ospfRouterParser.getTlvQName(), ospfRouterParser));
268     }
269
270     @Override
271     public String toString() {
272         return MoreObjects.toStringHelper(this).add("ianaLinkstateAttribute", ianaLinkstateAttributeType).toString();
273     }
274 }