Eliminate blueprint from BGP linkstate extension 11/96111/4
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 10 May 2021 20:37:17 +0000 (22:37 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 12 May 2021 06:57:01 +0000 (08:57 +0200)
Switch the BGP-LS extension to use OSGi DS/Config Admin for activation
and configuration. This necessitates a change in operational procedure
to enable the legacy BGP-LS attribute type. This is a low-risk change,
as that type has been superseded 5 years ago.

JIRA: BGPCEP-949
Change-Id: Iac6da9ba7968e0a1efc86bede77018ff739fcd3b
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
bgp/extensions/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/impl/BGPActivator.java
bgp/extensions/linkstate/src/main/resources/OSGI-INF/blueprint/bgp-linkstate.xml [deleted file]
bgp/extensions/linkstate/src/main/yang/bgp-linkstate-app-config.yang [deleted file]
bgp/extensions/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/ActivatorTest.java
bgp/extensions/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateNlriParserTest.java
bgp/extensions/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/SrAttributeParserTest.java
docs/bgp/bgp-user-guide-linkstate-family.rst

index e48b8ff647b0c779151d669250c5b4220fe3a5fe..bcda58190bb8074a5661ebdc009af52e77dc35a3 100644 (file)
@@ -10,6 +10,9 @@ package org.opendaylight.protocol.bgp.linkstate.impl;
 import com.google.common.base.MoreObjects;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.ServiceLoader;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import org.kohsuke.MetaInfServices;
 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.LinkstateAttributeParser;
 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.LinkstateNlriParser;
@@ -17,6 +20,7 @@ import org.opendaylight.protocol.bgp.parser.spi.AbstractBGPExtensionProviderActi
 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator;
 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
 import org.opendaylight.protocol.bgp.parser.spi.NextHopParserSerializer;
+import org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionConsumerContext;
 import org.opendaylight.protocol.rsvp.parser.spi.RSVPTeObjectRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.Attributes1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.LinkstateAddressFamily;
@@ -25,12 +29,34 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.link
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.Ipv4NextHopCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.next.hop.c.next.hop.Ipv6NextHopCase;
 import org.opendaylight.yangtools.concepts.Registration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
 /**
  * Activator for registering linkstate extensions to BGP parser.
  */
+@Singleton
+@Component(immediate = true,
+           configurationPid = "org.opendaylight.bgp.extensions.linkstate",
+           service = BGPExtensionProviderActivator.class,
+           property = "type=org.opendaylight.protocol.bgp.linkstate.impl.BGPActivator")
+@Designate(ocd = BGPActivator.Configuration.class)
 @MetaInfServices(value = BGPExtensionProviderActivator.class)
 public final class BGPActivator extends AbstractBGPExtensionProviderActivator {
+    /**
+     * Configuration for BGP linkstate extension.
+     */
+    @ObjectClassDefinition(description = "Configuration for the RFC7752 (BGP-LS) extension")
+    public static @interface Configuration {
+        @AttributeDefinition(description = "If true (default) linkstate attribute type (=29) allocated by IANA is used,"
+            + " else type (=99) is used for parsing/serialization")
+        boolean ianaAttributeType() default true;
+    }
+
     private static final int LINKSTATE_AFI = 16388;
     private static final int LINKSTATE_SAFI = 71;
 
@@ -38,12 +64,22 @@ public final class BGPActivator extends AbstractBGPExtensionProviderActivator {
     private final RSVPTeObjectRegistry rsvpTeObjectRegistry;
 
     public BGPActivator() {
-        this(true, null);
+        this(ServiceLoader.load(RSVPExtensionConsumerContext.class).findFirst().orElseThrow(
+            () -> new IllegalStateException("Cannot find an RSVPExtensionConsumerContext implementation")));
+    }
+
+    @Inject
+    public BGPActivator(final RSVPExtensionConsumerContext rsvpExtensions) {
+        this(rsvpExtensions, true);
+    }
+
+    @Activate
+    public BGPActivator(final @Reference RSVPExtensionConsumerContext rsvpExtensions, final Configuration config) {
+        this(rsvpExtensions, config.ianaAttributeType());
     }
 
-    // FIXME: this should be properly injected
-    public BGPActivator(final boolean ianaLinkstateAttributeType, final RSVPTeObjectRegistry rsvpTeObjectRegistry) {
-        this.rsvpTeObjectRegistry = rsvpTeObjectRegistry;
+    public BGPActivator(final RSVPExtensionConsumerContext rsvpExtensions, final boolean ianaLinkstateAttributeType) {
+        this.rsvpTeObjectRegistry = rsvpExtensions.getRsvpRegistry();
         this.ianaLinkstateAttributeType = ianaLinkstateAttributeType;
     }
 
diff --git a/bgp/extensions/linkstate/src/main/resources/OSGI-INF/blueprint/bgp-linkstate.xml b/bgp/extensions/linkstate/src/main/resources/OSGI-INF/blueprint/bgp-linkstate.xml
deleted file mode 100644 (file)
index 2400d00..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright (c) 2016 Brocade Communications Systems, Inc. and others.  All rights reserved.
-  ~
-  ~ This program and the accompanying materials are made available under the
-  ~ terms of the Eclipse Public License v1.0 which accompanies this distribution,
-  ~ and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
-           xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
-
-  <reference id="rsvpExtensionContext" interface="org.opendaylight.protocol.rsvp.parser.spi.RSVPExtensionConsumerContext"/>
-
-  <odl:clustered-app-config id="linkStateAppConfig"
-      binding-class="org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.linkstate.app.config.rev160614.BgpLinkstateAppConfig"/>
-
-  <bean id="BGPActivator" class="org.opendaylight.protocol.bgp.linkstate.impl.BGPActivator">
-    <argument>
-      <bean factory-ref="linkStateAppConfig" factory-method="isIanaLinkstateAttributeType"/>
-    </argument>
-    <argument>
-      <bean factory-ref="rsvpExtensionContext" factory-method="getRsvpRegistry"/>
-    </argument>
-  </bean>
-
-  <service ref="BGPActivator" interface="org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator"
-          odl:type="org.opendaylight.protocol.bgp.linkstate.impl.BGPActivator"/>
-</blueprint>
diff --git a/bgp/extensions/linkstate/src/main/yang/bgp-linkstate-app-config.yang b/bgp/extensions/linkstate/src/main/yang/bgp-linkstate-app-config.yang
deleted file mode 100644 (file)
index 7472fdb..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-module bgp-linkstate-app-config {
-    yang-version 1;
-    namespace "urn:opendaylight:params:xml:ns:yang:controller:bgp:linkstate-app-config";
-    prefix "bgp-linkstate-app-config";
-
-    description
-      "Configuration for the BGP linkstate application.";
-
-    revision "2016-06-14" {
-        description
-            "Initial revision.
-
-            Copyright (c)2016 Brocade Communications Systems, Inc. and others.  All rights reserved.
-
-            This program and the accompanying materials are made available
-            under the terms of the Eclipse Public License v1.0 which
-            accompanies this distribution, and is available at
-            http://www.eclipse.org/legal/epl-v10.html";
-    }
-
-    container bgp-linkstate-app-config {
-        leaf iana-linkstate-attribute-type {
-            description "If true (default) linkstate attribute type (=29) allocated by IANA is used,
-                         else type (=99) is used for parsing/serialization";
-            type boolean;
-            default true;
-        }
-    }
-}
\ No newline at end of file
index ce9c606825d99b2a158cf15f92bb53952a9b28fe..66dede1bbf02b7b71475f6c0fadc282f086cba87 100644 (file)
@@ -26,8 +26,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.link
 public class ActivatorTest extends AbstractRIBActivatorTest {
     @Test
     public void testActivator() {
-        final BGPActivator act = new BGPActivator(true,
-                ServiceLoaderRSVPExtensionProviderContext.getSingletonInstance().getRsvpRegistry());
+        final BGPActivator act = new BGPActivator(ServiceLoaderRSVPExtensionProviderContext.getSingletonInstance());
         final BGPExtensionProviderContext context = new SimpleBGPExtensionProviderContext();
         assertNull(context.getAddressFamilyRegistry().classForFamily(16388));
         assertNull(context.getSubsequentAddressFamilyRegistry().classForFamily(71));
index d8d59a02da444565a31ab7b0572c083d31f426ab..cf8e292458d441efc3f9de320430da6e9bb2e1e6 100644 (file)
@@ -160,8 +160,7 @@ public class LinkstateNlriParserTest {
         final LinkstateNlriParser parser = new LinkstateNlriParser();
         final MpReachNlriBuilder builder = new MpReachNlriBuilder();
         this.registry = SimpleNlriTypeRegistry.getInstance();
-        final BGPActivator act = new BGPActivator(true,
-            ServiceLoaderRSVPExtensionProviderContext.getSingletonInstance().getRsvpRegistry());
+        final BGPActivator act = new BGPActivator(ServiceLoaderRSVPExtensionProviderContext.getSingletonInstance());
         final BGPExtensionProviderContext context = new SimpleBGPExtensionProviderContext();
         act.start(context);
 
index 8933ae1ef4d6141a03671dc798d5291e611b8817..6cce22521256202f706c81bab13738c845eb806b 100644 (file)
@@ -152,8 +152,7 @@ public class SrAttributeParserTest {
 
     @Before
     public void setUp() throws Exception {
-        final BGPActivator act = new BGPActivator(true,
-            ServiceLoaderRSVPExtensionProviderContext.getSingletonInstance().getRsvpRegistry());
+        final BGPActivator act = new BGPActivator(ServiceLoaderRSVPExtensionProviderContext.getSingletonInstance());
         final BGPExtensionProviderContext context = new SimpleBGPExtensionProviderContext();
         act.start(context);
     }
index 83a2e633879274c7a86fa9eced3bbb688712c69b..630ee48aa5bb5fba1bc49443072c7ef65d05ff6d 100644 (file)
@@ -88,43 +88,21 @@ To enable BGP-LS support in BGP plugin, first configure BGP speaker instance:
 
 Linkstate path attribute
 ''''''''''''''''''''''''
-IANA allocation for BGP-LS path attribute is TYPE 29.
-Some older BGP-LS implementations might still require earliest asigned allocation TYPE 99.
-To use TYPE = 99, you need to set value bellow to false.
+The BGP-LS specification has seen early field deployments before the code point assignments have been
+properly allocated. RFC7752 specifies this attribute to be TYPE 29, while earlier software is using
+TYPE 99.
 
-**URL:** ``/restconf/config/bgp-linkstate-app-config:bgp-linkstate-app-config``
+OpenDaylight defaults to using the RFC7752 allocation, but can be reconfigured to recognize the legacy
+code point allocation. This can be achieved through Karaf shell in a running instance:
 
-**RFC8040 URL:** ``/rests/data/bgp-linkstate-app-config:bgp-linkstate-app-config``
-
-**Method:** ``PUT``
-
-.. tabs::
-
-   .. tab:: XML
-
-      **Content-Type:** ``application/xml``
-
-      **Request Body:**
-
-      .. code-block:: xml
-
-         <bgp-linkstate-app-config xmlns="urn:opendaylight:params:xml:ns:yang:controller:bgp:linkstate-app-config">
-             <iana-linkstate-attribute-type>false</iana-linkstate-attribute-type>
-         </bgp-linkstate-app-config>
-
-   .. tab:: JSON
-
-      **Content-Type:** ``application/json``
-
-      **Request Body:**
+.. code-block:: console
 
-      .. code-block:: json
+   opendaylight-user@root>config:edit org.opendaylight.bgp.extensions.linkstate
+   opendaylight-user@root>config:property-set ianaAttributeType false
+   opendaylight-user@root>config:update
 
-         {
-             "bgp-linkstate-app-config": {
-                 "iana-linkstate-attribute-type": false
-             }
-         }
+Alternatively, the same effect can be achieved by placing the line ``ianaAttributeType = false`` into
+``etc/org.opendaylight.bgp.extensions.linkstate.cfg`` in the installation directory.
 
 BGP Peer
 ''''''''