Bug 5061: Integrate ApplicationPeerModule with blueprint 08/44008/2
authorMilos Fabian <milfabia@cisco.com>
Thu, 21 Jul 2016 10:56:10 +0000 (12:56 +0200)
committerMilos Fabian <milfabia@cisco.com>
Mon, 15 Aug 2016 21:52:38 +0000 (21:52 +0000)
Instead of instance creation in ApplicationPeerModule,
write BGP OpenConfig configuration into the config DS and BGP deployer takes care of instance creation.
Add mapping function ApplicationPeerModule -> OpenConfig Neighbor to BGPOpenConfigMappingService.

Change-Id: I393ddf7d1f6efad78abb4f64188fcdd49bc3f6b9
Signed-off-by: Milos Fabian <milfabia@cisco.com>
(cherry picked from commit e449830aba426de955bd2da5a487b9149486be3a)

bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/BGPOpenConfigMappingServiceImpl.java
bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPOpenConfigMappingService.java
bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPApplicationPeerModule.java
bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPApplicationPeerModuleFactory.java
bgp/rib-impl/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/AbstractRIBImplModuleTest.java
bgp/rib-impl/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPApplicationPeerModuleTest.java

index ccf252a85f5af22375c7b3a4d47d3567058e1a04..1d11044c8a7e4282016b72b52a450f95bafe1771 100644 (file)
@@ -24,6 +24,8 @@ import org.opendaylight.protocol.bgp.mode.impl.add.n.paths.AddPathBestNPathSelec
 import org.opendaylight.protocol.bgp.openconfig.impl.util.OpenConfigUtil;
 import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigMappingService;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.Config1;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.Config1Builder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.AfiSafisBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.ConfigBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflectorBuilder;
@@ -58,6 +60,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.open
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.ApplicationRibId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.SimpleRoutingPolicy;
@@ -207,4 +210,17 @@ public final class BGPOpenConfigMappingServiceImpl implements BGPOpenConfigMappi
         return null;
     }
 
+    @Override
+    public Neighbor fromApplicationPeer(final ApplicationRibId applicationRibId, final BgpId bgpId) {
+        final NeighborBuilder neighborBuilder = new NeighborBuilder();
+        neighborBuilder.setNeighborAddress(new IpAddress(bgpId));
+        neighborBuilder.setKey(new NeighborKey(neighborBuilder.getNeighborAddress()));
+        neighborBuilder.setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder()
+        .setDescription(applicationRibId.getValue())
+        .addAugmentation(Config1.class, new Config1Builder().setPeerGroup(APPLICATION_PEER_GROUP_NAME).build())
+        .build());
+
+        return neighborBuilder.build();
+    }
+
 }
index 9de22d9e90b88befd066407bc92af99010dc9e2b..9a616a3729b218dcbc4ce97ce81c27d8db6d9faf 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamilies;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.ApplicationRibId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.SimpleRoutingPolicy;
@@ -45,4 +46,6 @@ public interface BGPOpenConfigMappingService {
     Neighbor fromBgpPeer(List<AddressFamilies> addPathCapabilities,
             List<BgpTableType> advertisedTables, Integer holdTimer, IpAddress ipAddress, Boolean isActive,
             Rfc2385Key password, PortNumber portNumber, Integer retryTimer, AsNumber remoteAs, PeerRole peerRole, SimpleRoutingPolicy simpleRoutingPolicy);
+
+    Neighbor fromApplicationPeer(ApplicationRibId applicationRibId, BgpId bgpId);
 }
index fd9cb1452df47506c3ddcd499c62d3db197230c3..2a8fc0621878062a1e7197ca1d0219331cd068e5 100755 (executable)
@@ -7,37 +7,28 @@
  */
 package org.opendaylight.controller.config.yang.bgp.rib.impl;
 
-import com.google.common.base.Optional;
-import java.util.Collections;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
-import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier;
-import org.opendaylight.protocol.bgp.openconfig.spi.BGPConfigModuleTracker;
-import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigProvider;
-import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenconfigMapper;
-import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
-import org.opendaylight.protocol.bgp.openconfig.spi.pojo.BGPAppPeerInstanceConfiguration;
-import org.opendaylight.protocol.bgp.rib.impl.ApplicationPeer;
-import org.opendaylight.protocol.bgp.rib.impl.BGPPeer;
-import org.opendaylight.protocol.bgp.rib.impl.StrictBGPPeerRegistry;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
+import org.opendaylight.controller.config.api.osgi.WaitingServiceTracker;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BgpDeployer;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.ApplicationRib;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.SimpleRoutingPolicy;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.osgi.framework.BundleContext;
 
 /**
  * Application peer handler which handles translation from custom RIB into local RIB
  */
+@Deprecated
 public class BGPApplicationPeerModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPApplicationPeerModule {
 
-    private static final QName APP_ID_QNAME = QName.create(ApplicationRib.QNAME, "id").intern();
+    private BundleContext bundleContext;
 
     public BGPApplicationPeerModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
         super(identifier, dependencyResolver);
@@ -54,80 +45,24 @@ public class BGPApplicationPeerModule extends org.opendaylight.controller.config
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        // add to peer-registry to catch any conflicting peer addresses
-        addToPeerRegistry();
-
-        final YangInstanceIdentifier id = YangInstanceIdentifier.builder().node(ApplicationRib.QNAME).nodeWithKey(ApplicationRib.QNAME, APP_ID_QNAME, getApplicationRibId().getValue()).node(Tables.QNAME).node(Tables.QNAME).build();
-        final DOMDataTreeChangeService service = (DOMDataTreeChangeService) getDataBrokerDependency().getSupportedExtensions().get(DOMDataTreeChangeService.class);
-        final AppPeerModuleTracker appPeerMT = new AppPeerModuleTracker(getTargetRibDependency().getOpenConfigProvider());
-        final ApplicationPeer appPeer = new ApplicationPeer(getApplicationRibId(), getBgpPeerId(), getTargetRibDependency(), appPeerMT);
-        final ListenerRegistration<ApplicationPeer> listenerRegistration = service.registerDataTreeChangeListener(
-                new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, id), appPeer);
+        final RIB rib = getTargetRibDependency();
+        final WaitingServiceTracker<BgpDeployer> bgpDeployerTracker =
+                WaitingServiceTracker.create(BgpDeployer.class, this.bundleContext);
+        final BgpDeployer bgpDeployer = bgpDeployerTracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
+        //map configuration to OpenConfig BGP
+        final Neighbor neighbor = bgpDeployer.getMappingService().fromApplicationPeer(getApplicationRibId(), getBgpPeerId());
+        //write to configuration DS
+        final KeyedInstanceIdentifier<Neighbor, NeighborKey> neighborIId = bgpDeployer.getInstanceIdentifier().child(Protocols.class).child(Protocol.class,
+                new ProtocolKey(BGP.class, rib.getInstanceIdentifier().getKey().getId().getValue()))
+                .augmentation(Protocol1.class).child(Bgp.class).child(Neighbors.class).child(Neighbor.class, neighbor.getKey());
+        bgpDeployer.writeConfiguration(neighbor, neighborIId);
 
         return () -> {
-            listenerRegistration.close();
-            appPeer.close();
-            removeFromPeerRegistry();
+            bgpDeployerTracker.close();
         };
     }
 
-    private interface CloseableNoEx extends AutoCloseable {
-        @Override
-        void close();
-    }
-
-    private void addToPeerRegistry() {
-        final RIB r = getTargetRibDependency();
-
-        final IpAddress bgpPeerId = new IpAddress(getBgpPeerId());
-        final BGPPeer bgpClientPeer = new BGPPeer(bgpPeerId.getIpv4Address().getValue(), r, PeerRole.Internal, SimpleRoutingPolicy.AnnounceNone, null);
-
-        final BGPSessionPreferences prefs = new BGPSessionPreferences(r.getLocalAs(), 0, r.getBgpIdentifier(),
-                r.getLocalAs(), Collections.emptyList(), Optional.absent());
-
-        final BGPPeerRegistry peerRegistry = getPeerRegistryBackwards();
-        peerRegistry.addPeer(bgpPeerId, bgpClientPeer, prefs);
-    }
-
-    private void removeFromPeerRegistry() {
-        final IpAddress bgpPeerId = new IpAddress(getBgpPeerId());
-        final BGPPeerRegistry peerRegistry = getPeerRegistryBackwards();
-        peerRegistry.removePeer(bgpPeerId);
-    }
-
-    private BGPPeerRegistry getPeerRegistryBackwards() {
-        return getBgpPeerRegistryDependency() == null ? StrictBGPPeerRegistry.GLOBAL : getBgpPeerRegistryDependency();
-    }
-
-    private final class AppPeerModuleTracker implements BGPConfigModuleTracker {
-
-        private final BGPOpenconfigMapper<BGPAppPeerInstanceConfiguration> appProvider;
-        private final BGPAppPeerInstanceConfiguration bgpAppPeerInstanceConfiguration;
-
-        AppPeerModuleTracker(final Optional<BGPOpenConfigProvider> openConfigProvider) {
-            if (openConfigProvider.isPresent()) {
-                this.appProvider = openConfigProvider.get().getOpenConfigMapper(BGPAppPeerInstanceConfiguration.class);
-            } else {
-                this.appProvider = null;
-            }
-            final InstanceConfigurationIdentifier identifier = new InstanceConfigurationIdentifier(getIdentifier().getInstanceName());
-            this.bgpAppPeerInstanceConfiguration = new BGPAppPeerInstanceConfiguration(identifier, getApplicationRibId().getValue(),
-                    getBgpPeerId());
-        }
-
-        @Override
-        public void onInstanceCreate() {
-            if (this.appProvider != null) {
-                this.appProvider.writeConfiguration(this.bgpAppPeerInstanceConfiguration);
-            }
-        }
-
-        @Override
-        public void onInstanceClose() {
-            if (this.appProvider != null) {
-                this.appProvider.removeConfiguration(this.bgpAppPeerInstanceConfiguration);
-            }
-        }
-
+    public void setBundleContext(final BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
     }
 }
index f651bbda4af7a73a0dae5b895c08a22c0d5d919f..a16a59a92e0f562dcbd32b5649405314b6f07ff9 100644 (file)
@@ -6,6 +6,27 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 package org.opendaylight.controller.config.yang.bgp.rib.impl;
+
+import org.opendaylight.controller.config.api.DependencyResolver;
+import org.opendaylight.controller.config.api.DynamicMBeanWithInstance;
+import org.opendaylight.controller.config.spi.Module;
+import org.osgi.framework.BundleContext;
+
+@Deprecated
 public class BGPApplicationPeerModuleFactory extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPApplicationPeerModuleFactory {
 
+    @Override
+    public Module createModule(final String instanceName, final DependencyResolver dependencyResolver, final BundleContext bundleContext) {
+        final BGPApplicationPeerModule module = (BGPApplicationPeerModule) super.createModule(instanceName, dependencyResolver, bundleContext);
+        module.setBundleContext(bundleContext);
+        return module;
+    }
+
+    @Override
+    public Module createModule(final String instanceName, final DependencyResolver dependencyResolver,
+            final DynamicMBeanWithInstance old, final BundleContext bundleContext) throws Exception {
+        final BGPApplicationPeerModule module = (BGPApplicationPeerModule)  super.createModule(instanceName, dependencyResolver, old, bundleContext);
+        module.setBundleContext(bundleContext);
+        return module;
+    }
 }
index ed9aab31e60504ad1fd294c01aa50d808470dd69..ac21e0280666152e23d29972a5aa826039114a40 100755 (executable)
@@ -288,6 +288,7 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest {
         doNothing().when(this.bgpDeployer).onGlobalCreated(any(),any(),any());
         doReturn(NEIGHBOR).when(this.bgpMappingService).fromBgpPeer(any(), any(),
                 any(), any(), any(), any(), any(), any(), any(), any(), any());
+        doReturn(NEIGHBOR).when(this.bgpMappingService).fromApplicationPeer(any(), any());
         doReturn(this.mockedFuture).when(this.bgpDeployer).writeConfiguration(any(), any());
         doReturn(this.mockedFuture).when(this.bgpDeployer).removeConfiguration(any());
         doReturn(this.bgpMappingService).when(this.bgpDeployer).getMappingService();
index 2d1d335e4ab94a70f53ed3314b0e7d4a194758d5..4bdf2a6cff7368700a582e696bf131a812c5dcff 100755 (executable)
@@ -9,9 +9,7 @@
 package org.opendaylight.controller.config.yang.bgp.rib.impl;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+
 import java.util.List;
 import javax.management.InstanceNotFoundException;
 import javax.management.ObjectName;
@@ -72,21 +70,6 @@ public class BGPApplicationPeerModuleTest extends AbstractRIBImplModuleTest {
         assertEquals(NEW_APP_RIB_ID, getApplicationRibId());
     }
 
-    @Test
-    public void testConflictingPeerAddress() throws Exception {
-        createApplicationPeerInstance();
-        try {
-            createApplicationPeerInstance(INSTANCE_NAME2);
-            fail();
-        } catch (IllegalStateException e) {
-            assertTrue(e.getMessage().contains("getInstance() failed for ModuleIdentifier"));
-            final Throwable ex = e.getCause();
-            assertNotNull(ex);
-            assertTrue(ex.getMessage().contains("Peer for IpAddress"));
-            assertTrue(ex.getMessage().contains("already present"));
-        }
-    }
-
     private CommitStatus createApplicationPeerInstance() throws Exception {
         return createApplicationPeerInstance(INSTANCE_NAME);
     }