Rework BGP configuration 94/4794/23
authorRobert Varga <rovarga@cisco.com>
Sat, 25 Jan 2014 16:05:47 +0000 (17:05 +0100)
committerRobert Varga <rovarga@cisco.com>
Fri, 28 Feb 2014 09:31:28 +0000 (10:31 +0100)
This patch reworks the structure of BGP configuration so that it follows
the logical organization of the RIB.

The core change is the creation of BGPPeer as a full-blown configuration
item. This encapsulates the previous proposal configuration and has the
inverse relationship with the RIB: the RIB is its dependency and it
pulls things like the local AS and BGP identifier from it.

Futher improvement is the introduction of bgp-table-type, which allows
explicit listing of tables which should be advertized in the BGP Open
message as well as specification of which tables should be tracked in
the local RIB.

Change-Id: I905759a3d9e780394579238d48ff0aee009a5544
Signed-off-by: Robert Varga <rovarga@cisco.com>
Signed-off-by: Maros Marsalek <mmarsale@cisco.com>
40 files changed:
bgp/controller-config/src/main/resources/initial/31-bgp.xml
bgp/controller-config/src/main/resources/initial/41-bgp-example.xml
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAdjRIBsIn.java
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/RIBActivator.java
bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPSession.java
bgp/pom.xml
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPImplModule.java [deleted file]
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPImplModuleFactory.java [deleted file]
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModule.java [new file with mode: 0644]
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModuleFactory.java [new file with mode: 0644]
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPSessionProposalImplModule.java [deleted file]
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPSessionProposalImplModuleFactory.java [deleted file]
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModule.java [new file with mode: 0644]
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModuleFactory.java [new file with mode: 0644]
bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModule.java
bgp/rib-impl-config/src/main/yang/bgp-rib-impl.yang
bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPImplModuleTest.java [deleted file]
bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModuleTest.java [new file with mode: 0644]
bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPSessionProposalImplModuleTest.java [deleted file]
bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModuleTest.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGP.java [deleted file]
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPImpl.java [deleted file]
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPObjectComparator.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/Ipv4AdjRIBsIn.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/Ipv6AdjRIBsIn.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBActivator.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBTables.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPSessionPreferences.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java [new file with mode: 0644]
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BGPImplTest.java [deleted file]
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BestPathSelectionTest.java
bgp/rib-mock/src/main/java/org/opendaylight/protocol/bgp/rib/mock/BGPMock.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractAdjRIBsIn.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AdjRIBsInFactory.java
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/Peer.java
bgp/update-api-config/pom.xml
bgp/update-api-config/src/main/yang/bgp-listener.yang [deleted file]
integration-tests/src/test/java/org/opendaylight/protocol/integration/bgp/ParserToSalTest.java

index 8a349aea61b010b0b057831e8a9f350e3d8636da..35e826f56114935c44f2b7136f711934d65ed253 100644 (file)
@@ -1,14 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- vi: set et smarttab sw=4 tabstop=4: -->
 <!--
-      Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+    Copyright (c) 2013 Cisco 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
   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
 -->
 <snapshot>
-       <required-capabilities>
+    <required-capabilities>
+        <capability>urn:opendaylight:params:xml:ns:yang:bgp-linkstate?module=bgp-linkstate&amp;revision=2013-11-25</capability>
+        <capability>urn:opendaylight:params:xml:ns:yang:bgp-types?module=bgp-types&amp;revision=2013-09-19</capability>
+        <capability>urn:opendaylight:params:xml:ns:yang:controller:bgp:linkstate?module=config-bgp-linkstate&amp;revision=2013-11-15</capability>
                <capability>urn:opendaylight:params:xml:ns:yang:controller:bgp:parser:spi?module=config-bgp-parser-spi&amp;revision=2013-11-15</capability>
                <capability>urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi?module=config-bgp-rib-spi&amp;revision=2013-11-15</capability>
                <capability>urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl?module=bgp-rib-impl&amp;revision=2013-04-09</capability>
                                                <type xmlns:netty="urn:opendaylight:params:xml:ns:yang:controller:netty">netty:netty-threadgroup</type>
                                                <name>global-worker-group</name>
                                        </worker-group>
-                               </module>
+                </module>
+
+                <module>
+                    <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-table-type-impl</type>
+                    <name>ipv4-unicast</name>
+                    <afi xmlns:bgp="urn:opendaylight:params:xml:ns:yang:bgp-types">bgp:ipv4-address-family</afi>
+                    <safi xmlns:bgp="urn:opendaylight:params:xml:ns:yang:bgp-types">bgp:unicast-subsequent-address-family</safi>
+                </module>
+                <module>
+                    <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-table-type-impl</type>
+                    <name>ipv6-unicast</name>
+                    <afi xmlns:bgp="urn:opendaylight:params:xml:ns:yang:bgp-types">bgp:ipv6-address-family</afi>
+                    <safi xmlns:bgp="urn:opendaylight:params:xml:ns:yang:bgp-types">bgp:unicast-subsequent-address-family</safi>
+                </module>
+                <module>
+                    <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-table-type-impl</type>
+                    <name>linkstate</name>
+                    <afi xmlns:linkstate="urn:opendaylight:params:xml:ns:yang:bgp-linkstate">linkstate:linkstate-address-family</afi>
+                    <safi xmlns:linkstate="urn:opendaylight:params:xml:ns:yang:bgp-linkstate">linkstate:linkstate-subsequent-address-family</safi>
+                </module>
                        </modules>
 
                        <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
                                                <provider>/modules/module[type='bgp-linkstate'][name='bgp-linkstate']</provider>
                                        </instance>
                                </service>
+                <service>
+                    <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-table-type</type>
+                    <instance>
+                        <name>ipv4-unicast</name>
+                        <provider>/modules/module[type='bgp-table-type-impl'][name='ipv4-unicast']</provider>
+                    </instance>
+                    <instance>
+                        <name>ipv6-unicast</name>
+                        <provider>/modules/module[type='bgp-table-type-impl'][name='ipv6-unicast']</provider>
+                    </instance>
+                    <instance>
+                        <name>linkstate</name>
+                        <provider>/modules/module[type='bgp-table-type-impl'][name='linkstate']</provider>
+                    </instance>
+                </service>
                                <service>
                                        <type xmlns:ribspi="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi">ribspi:extension</type>
                                        <instance>
index 8b6722f2fd0d78148e1936a026afdb499d7c2de6..8cb1a201d006e08a0430f4e508390c78a5c5839a 100644 (file)
@@ -12,7 +12,6 @@
                <capability>urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:cfg?module=config-bgp-rib&amp;revision=2013-07-01</capability>
                <capability>urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi?module=config-bgp-rib-spi&amp;revision=2013-11-15</capability>
                <capability>urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl?module=bgp-rib-impl&amp;revision=2013-04-09</capability>
-               <capability>urn:opendaylight:params:xml:ns:yang:controller:bgp:listener?module=bgp-listener&amp;revision=2013-04-09</capability>
                <capability>urn:opendaylight:params:xml:ns:yang:controller:bgp:topology:provider?module=config-bgp-topology-provider&amp;revision=2013-11-15</capability>
                <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&amp;revision=2013-10-28</capability>
                <capability>urn:opendaylight:params:xml:ns:yang:controller:netty?module=netty&amp;revision=2013-11-19</capability>
 
                <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
                        <modules xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
-                               <module>
-                                       <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-proposal-impl</type>
-                                       <name>example-bgp-proposal</name>
-                                       <as-number>64496</as-number>
-                                       <bgp-id>192.0.2.2</bgp-id>
-                               </module>
                                <module>
                                        <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:reconnectstrategy">prefix:timed-reconnect-strategy</type>
                                        <name>example-reconnect-strategy</name>
                                        </executor>
                                </module>
                                <!--module>
-                                       <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-impl</type>
-                                       <name>example-bgp-peer</name>
-                                       <bgp-dispatcher>
-                                               <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-dispatcher</type>
-                                               <name>global-bgp-dispatcher</name>
-                                       </bgp-dispatcher>
-                                       <bgp-proposal>
-                                               <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-proposal</type>
-                                               <name>example-bgp-proposal</name>
-                                       </bgp-proposal>
-                                       <host>route-reflector.example.org</host>
+                                       <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-peer</type>
+                    <name>example-bgp-peer</name>
+                    <host>192.0.2.1</host>
+                    <holdtimer>180</holdtimer>
+                    <rib>
+                                               <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:cfg">prefix:rib</type>
+                                               <name>example-bgp-rib</name>
+                    </rib>
+                    <advertized-table>
+                        <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-table-type</type>
+                        <name>ipv4-unicast</name>
+                    </advertized-table>
+                    <advertized-table>
+                        <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-table-type</type>
+                        <name>ipv6-unicast</name>
+                    </advertized-table>
+                    <advertized-table>
+                        <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-table-type</type>
+                        <name>linkstate</name>
+                    </advertized-table>
                                </module-->
                                <module>
                                        <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:rib-impl</type>
                                        <rib-id>example-bgp-rib</rib-id>
                                        <local-as>64496</local-as>
                                        <bgp-id>192.0.2.2</bgp-id>
-                                       <!--bgp>
-                                               <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:listener">prefix:listener</type>
-                                               <name>example-bgp-peer</name>
-                                       </bgp-->
+                    <local-table>
+                        <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-table-type</type>
+                        <name>ipv4-unicast</name>
+                    </local-table>
+                    <local-table>
+                        <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-table-type</type>
+                        <name>ipv6-unicast</name>
+                    </local-table>
+                    <local-table>
+                        <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-table-type</type>
+                        <name>linkstate</name>
+                    </local-table>
                                        <extensions>
                                                <type xmlns:ribspi="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi">ribspi:extensions</type>
                                                <name>global-rib-extensions</name>
                                        </extensions>
+                    <bgp-dispatcher>
+                        <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-dispatcher</type>
+                                               <name>global-bgp-dispatcher</name>
+                    </bgp-dispatcher>
                                        <data-provider>
                                                <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-data-broker</type>
                                                <name>binding-data-broker</name>
@@ -75,7 +89,7 @@
                                        <session-reconnect-strategy>
                                                <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:reconnectstrategy">prefix:reconnect-strategy</type>
                                                <name>example-reconnect-strategy</name>
-                                       </session-reconnect-strategy>
+                    </session-reconnect-strategy>
                                        <tcp-reconnect-strategy>
                                                <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:reconnectstrategy">prefix:reconnect-strategy</type>
                                                <name>example-reconnect-strategy</name>
                        </modules>
 
                        <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
-                               <service>
-                                       <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-proposal</type>
-                                       <instance>
-                                               <name>example-bgp-proposal</name>
-                                               <provider>/config/modules/module[name='bgp-proposal-impl']/instance[name='example-bgp-proposal']</provider>
-                                       </instance>
-                               </service>
-                               <!--service>
-                                       <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:listener">prefix:listener</type>
-                                       <instance>
-                                               <name>example-bgp-peer</name>
-                                                                       <provider>/config/modules/module[name='bgp-impl']/instance[name='example-bgp-peer']</provider>
-                                       </instance>
-                               </service-->
                                <service>
                                        <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:reconnectstrategy">prefix:reconnect-strategy</type>
                                        <instance>
                                                <provider>/config/modules/module[name='rib-impl']/instance[name='example-bgp-rib']</provider>
                                        </instance>
                                </service>
+                <service>
+                    <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:rib-instance</type>
+                    <instance>
+                        <name>example-bgp-rib</name>
+                                               <provider>/config/modules/module[name='rib-impl']/instance[name='example-bgp-rib']</provider>
+                                       </instance>
+                               </service>
                                <service>
                                        <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:topology">prefix:topology-reference</type>
                                        <instance>
index 826ba1c87b2fc8bb98ea61293048c0bfd3ed94dd..dd7eb4352287fc00a4c9089193d79c0c340ca396 100644 (file)
@@ -7,8 +7,6 @@
  */
 package org.opendaylight.protocol.bgp.linkstate;
 
-import java.util.Comparator;
-
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.protocol.bgp.rib.RibReference;
 import org.opendaylight.protocol.bgp.rib.spi.AbstractAdjRIBsIn;
@@ -61,7 +59,7 @@ import com.google.common.base.Preconditions;
 final class LinkstateAdjRIBsIn extends AbstractAdjRIBsIn<CLinkstateDestination, LinkstateRoute> {
 
        private abstract static class LinkstateRIBEntryData<A extends LinkStateAttribute> extends
-                       RIBEntryData<CLinkstateDestination, LinkstateRoute> {
+       RIBEntryData<CLinkstateDestination, LinkstateRoute> {
                private final A lsattr;
 
                protected LinkstateRIBEntryData(final PathAttributes attributes, final A lsattr) {
@@ -95,9 +93,8 @@ final class LinkstateAdjRIBsIn extends AbstractAdjRIBsIn<CLinkstateDestination,
 
        private static final Logger LOG = LoggerFactory.getLogger(LinkstateAdjRIBsIn.class);
 
-       LinkstateAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final Comparator<PathAttributes> comparator,
-                       final TablesKey key) {
-               super(trans, rib, comparator, key);
+       LinkstateAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) {
+               super(trans, rib, key);
        }
 
        @Override
index b97d4f64891d75e549fecb7c1bb58d150b7d9ad7..cff4e004df98d077201e81807bc7525edf9569b7 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.protocol.bgp.linkstate;
 
-import java.util.Comparator;
 import java.util.List;
 
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
@@ -18,7 +17,6 @@ import org.opendaylight.protocol.bgp.rib.spi.AdjRIBsInFactory;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.PathAttributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
 
 import com.google.common.collect.Lists;
@@ -31,11 +29,10 @@ public final class RIBActivator extends AbstractRIBExtensionProviderActivator {
        protected List<AutoCloseable> startRIBExtensionProviderImpl(final RIBExtensionProviderContext context) {
                return Lists.newArrayList(context.registerAdjRIBsInFactory(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class,
                                new AdjRIBsInFactory() {
-                                       @Override
-                                       public AdjRIBsIn createAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib,
-                                                       final Comparator<PathAttributes> comparator, final TablesKey key) {
-                                               return new LinkstateAdjRIBsIn(trans, rib, comparator, key);
-                                       }
-                               }));
+                       @Override
+                       public AdjRIBsIn createAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) {
+                               return new LinkstateAdjRIBsIn(trans, rib, key);
+                       }
+               }));
        }
 }
index c284fee38e6f3170930ef5b45149e712765efff8..9c0de8f7390c0023c8e44af9260e2f11ee508513 100644 (file)
@@ -21,8 +21,18 @@ import org.opendaylight.yangtools.yang.binding.Notification;
  * If the session is up, it has to redirect messages to/from user. Handles also malformed messages and unknown requests.
  */
 public interface BGPSession extends ProtocolSession<Notification> {
+       /**
+        * Return the list of tables which the peer has advertized to support.
+        * 
+        * @return Set of tables which it supports.
+        */
 
        Set<BgpTableType> getAdvertisedTableTypes();
 
+       /**
+        * Return the BGP router ID advertized by the peer.
+        * 
+        * @return Peer's BGP Router ID.
+        */
        byte[] getBgpId();
 }
index c913f6d9b62e4c586f11a25df43f8a4d64fd1fbd..d7e55a4d8c12af85318480ff168b1a9ee93bc573 100644 (file)
         <module>rib-spi-config</module>
         <module>rib-impl</module>
         <module>rib-impl-config</module>
-        <module>testtool</module>
         <module>rib-mock</module>
+        <module>testtool</module>
         <module>topology-provider</module>
         <module>topology-provider-config</module>
         <module>util</module>
         <module>update-api-config</module>
-        <module>update-mock-config</module>
 
         <module>controller-config</module>
     </modules>
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPImplModule.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPImplModule.java
deleted file mode 100644 (file)
index 7a9ac37..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco 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
- */
-/**
- * Generated file
-
- * Generated from: yang module name: bgp-rib-impl  yang module local name: bgp-impl
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Wed Nov 06 13:02:31 CET 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
-package org.opendaylight.controller.config.yang.bgp.rib.impl;
-
-import java.net.InetSocketAddress;
-
-import org.opendaylight.controller.config.api.JmxAttributeValidationException;
-import org.opendaylight.protocol.bgp.rib.impl.BGPImpl;
-
-/**
-*
-*/
-public final class BGPImplModule
-               extends
-               org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPImplModule {
-
-       public BGPImplModule(
-                       org.opendaylight.controller.config.api.ModuleIdentifier name,
-                       org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
-               super(name, dependencyResolver);
-       }
-
-       public BGPImplModule(
-                       org.opendaylight.controller.config.api.ModuleIdentifier name,
-                       org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
-                       BGPImplModule oldModule, java.lang.AutoCloseable oldInstance) {
-               super(name, dependencyResolver, oldModule, oldInstance);
-       }
-
-       @Override
-       public void validate() {
-               super.validate();
-               JmxAttributeValidationException.checkNotNull(getHost(),
-                               "value is not set.", hostJmxAttribute);
-
-               JmxAttributeValidationException.checkNotNull(getPort(),
-                               "value is not set.", portJmxAttribute);
-               JmxAttributeValidationException.checkCondition((getPort() >= 0)
-                               && (getPort() <= 65535), "value" + getPort()
-                               + " is out of range (0-65535).", portJmxAttribute);
-       }
-
-       @Override
-       public java.lang.AutoCloseable createInstance() {
-               InetSocketAddress address = new InetSocketAddress(getHost(), getPort());
-               return new BGPImpl(getBgpDispatcherDependency(), address,
-                               getBgpProposalDependency());
-       }
-}
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPImplModuleFactory.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPImplModuleFactory.java
deleted file mode 100644 (file)
index 10f323f..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco 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
- */
-/**
- * Generated file
-
- * Generated from: yang module name: bgp-rib-impl  yang module local name: bgp-impl
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Wed Nov 06 13:02:31 CET 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
-package org.opendaylight.controller.config.yang.bgp.rib.impl;
-
-/**
-*
-*/
-public class BGPImplModuleFactory
-               extends
-               org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPImplModuleFactory {
-
-}
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModule.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModule.java
new file mode 100644 (file)
index 0000000..093901b
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2013 Cisco 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
+ */
+/**
+ * Generated file
+
+ * Generated from: yang module name: bgp-rib-impl  yang module local name: bgp-peer
+ * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+ * Generated at: Sat Jan 25 11:00:14 CET 2014
+ *
+ * Do not modify this file unless it is present under src/main directory
+ */
+package org.opendaylight.controller.config.yang.bgp.rib.impl;
+
+import java.net.InetSocketAddress;
+import java.util.List;
+
+import org.opendaylight.controller.config.api.JmxAttributeValidationException;
+import org.opendaylight.protocol.bgp.rib.impl.BGPPeer;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
+import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParametersBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.c.parameters.As4BytesCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.c.parameters.as4.bytes._case.As4BytesCapabilityBuilder;
+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.open.bgp.parameters.c.parameters.MultiprotocolCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.c.parameters.multiprotocol._case.MultiprotocolCapabilityBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.Lists;
+import com.google.common.net.InetAddresses;
+
+/**
+ *
+ */
+public final class BGPPeerModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPPeerModule
+{
+       private static final Logger LOG = LoggerFactory.getLogger(BGPPeerModule.class);
+
+       public BGPPeerModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+               super(identifier, dependencyResolver);
+       }
+
+       public BGPPeerModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+                       final BGPPeerModule oldModule, final java.lang.AutoCloseable oldInstance) {
+
+               super(identifier, dependencyResolver, oldModule, oldInstance);
+       }
+
+       @Override
+       protected void customValidation(){
+               JmxAttributeValidationException.checkNotNull(getHost(),
+                               "value is not set.", hostJmxAttribute);
+               JmxAttributeValidationException.checkNotNull(getPort(),
+                               "value is not set.", portJmxAttribute);
+       }
+
+       private InetSocketAddress createAddress() {
+               final IpAddress ip = getHost();
+               if (ip.getIpv4Address() != null) {
+                       return new InetSocketAddress(InetAddresses.forString(ip.getIpv4Address().getValue()), getPort().getValue());
+               } else if (ip.getIpv6Address() != null) {
+                       return new InetSocketAddress(InetAddresses.forString(ip.getIpv6Address().getValue()), getPort().getValue());
+               } else {
+                       throw new IllegalStateException("Failed to handle host " + getHost());
+               }
+       }
+
+       private static String peerName(final IpAddress host) {
+               if (host.getIpv4Address() != null) {
+                       return host.getIpv4Address().getValue();
+               }
+               if (host.getIpv6Address() != null) {
+                       return host.getIpv6Address().getValue();
+               }
+
+               return null;
+       }
+
+       @Override
+       public java.lang.AutoCloseable createInstance() {
+               final RIB r = getRibDependency();
+
+               final List<BgpParameters> tlvs = Lists.newArrayList();
+               tlvs.add(new BgpParametersBuilder().setCParameters(
+                               new As4BytesCaseBuilder().setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(r.getLocalAs()).build()).build()).build());
+
+               for (final BgpTableType t : getAdvertizedTableDependency()) {
+                       if (!r.getLocalTables().contains(t)) {
+                               LOG.info("RIB instance does not list {} in its local tables. Incoming data will be dropped.", t);
+                       }
+
+                       tlvs.add(new BgpParametersBuilder().setCParameters(
+                                       new MultiprotocolCaseBuilder().setMultiprotocolCapability(
+                                                       new MultiprotocolCapabilityBuilder(t).build()).build()).build());
+               }
+
+               return new BGPPeer(peerName(getHost()), createAddress(),
+                               new BGPSessionPreferences(r.getLocalAs(), getHoldtimer(), r.getBgpIdentifier(), tlvs), r);
+       }
+}
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModuleFactory.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModuleFactory.java
new file mode 100644 (file)
index 0000000..2a92986
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2013 Cisco 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
+ */
+/**
+* Generated file
+
+* Generated from: yang module name: bgp-rib-impl  yang module local name: bgp-peer
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Sat Jan 25 11:00:14 CET 2014
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.controller.config.yang.bgp.rib.impl;
+
+/**
+*
+*/
+public class BGPPeerModuleFactory extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPPeerModuleFactory
+{
+
+
+}
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPSessionProposalImplModule.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPSessionProposalImplModule.java
deleted file mode 100644 (file)
index 5b6854a..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco 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
- */
-/**
- * Generated file
-
- * Generated from: yang module name: bgp-rib-impl  yang module local name: bgp-proposal-impl
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Wed Nov 06 13:02:32 CET 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
-package org.opendaylight.controller.config.yang.bgp.rib.impl;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.opendaylight.controller.config.api.JmxAttributeValidationException;
-import org.opendaylight.protocol.bgp.rib.impl.BGPSessionProposalImpl;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionProposal;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
-
-/**
-*
-*/
-public final class BGPSessionProposalImplModule extends
-               org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPSessionProposalImplModule {
-
-       public BGPSessionProposalImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier name,
-                       final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
-               super(name, dependencyResolver);
-       }
-
-       public BGPSessionProposalImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier name,
-                       final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
-                       final BGPSessionProposalImplModule oldModule, final java.lang.AutoCloseable oldInstance) {
-               super(name, dependencyResolver, oldModule, oldInstance);
-       }
-
-       @Override
-       public void validate() {
-               super.validate();
-               JmxAttributeValidationException.checkNotNull(getBgpId(), "value is not set.", this.bgpIdJmxAttribute);
-               JmxAttributeValidationException.checkCondition(isValidIPv4Address(getBgpId()),
-                               "value " + getBgpId() + " is not valid IPv4 address", this.bgpIdJmxAttribute);
-
-               JmxAttributeValidationException.checkNotNull(getAsNumber(), "value is not set.", this.asNumberJmxAttribute);
-               JmxAttributeValidationException.checkCondition(getAsNumber().intValue() > 0, "value must be greater than 0",
-                               this.asNumberJmxAttribute);
-
-               JmxAttributeValidationException.checkNotNull(getHoldtimer(), "value is not set.", this.holdtimerJmxAttribute);
-               JmxAttributeValidationException.checkCondition((getHoldtimer() == 0) || (getHoldtimer() >= 3), "value must be 0 or 3 and more",
-                               this.holdtimerJmxAttribute);
-       }
-
-       @Override
-       public java.lang.AutoCloseable createInstance() {
-               final Ipv4Address bgpId = new Ipv4Address(getBgpId());
-               final Map<Class<? extends AddressFamily>, Class<? extends SubsequentAddressFamily>> tables = new HashMap<>();
-               tables.put(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class);
-               tables.put(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
-               tables.put(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class);
-               final BGPSessionProposalImpl bgpSessionProposal = new BGPSessionProposalImpl(getHoldtimer(), new AsNumber(getAsNumber()), bgpId, tables);
-               return new BgpSessionProposalCloseable(bgpSessionProposal);
-       }
-
-       private static final class BgpSessionProposalCloseable implements BGPSessionProposal, AutoCloseable {
-
-               private final BGPSessionProposalImpl inner;
-
-               public BgpSessionProposalCloseable(final BGPSessionProposalImpl bgpSessionProposal) {
-                       this.inner = bgpSessionProposal;
-               }
-
-               @Override
-               public void close() throws Exception {
-                       // NOOP
-               }
-
-               @Override
-               public BGPSessionPreferences getProposal() {
-                       return this.inner.getProposal();
-               }
-       }
-
-       private boolean isValidIPv4Address(final String address) {
-               final Pattern pattern = Pattern.compile(Ipv4Address.PATTERN_CONSTANTS.get(0));
-               final Matcher matcher = pattern.matcher(address);
-               return matcher.matches();
-       }
-}
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPSessionProposalImplModuleFactory.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPSessionProposalImplModuleFactory.java
deleted file mode 100644 (file)
index 3e288b3..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco 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
- */
-/**
- * Generated file
-
- * Generated from: yang module name: bgp-rib-impl  yang module local name: bgp-proposal-impl
- * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- * Generated at: Wed Nov 06 13:02:32 CET 2013
- *
- * Do not modify this file unless it is present under src/main directory
- */
-package org.opendaylight.controller.config.yang.bgp.rib.impl;
-
-/**
-*
-*/
-public class BGPSessionProposalImplModuleFactory
-               extends
-               org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPSessionProposalImplModuleFactory {
-
-}
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModule.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModule.java
new file mode 100644 (file)
index 0000000..de8d4f1
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2013 Cisco 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
+ */
+/**
+ * Generated file
+
+ * Generated from: yang module name: bgp-rib-impl  yang module local name: bgp-table-type-impl
+ * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+ * Generated at: Sat Jan 25 20:28:03 CET 2014
+ *
+ * Do not modify this file unless it is present under src/main directory
+ */
+package org.opendaylight.controller.config.yang.bgp.rib.impl;
+
+import org.opendaylight.controller.config.api.JmxAttributeValidationException;
+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.types.rev130919.AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
+
+import com.google.common.base.Preconditions;
+
+/**
+ *
+ */
+public final class BGPTableTypeImplModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPTableTypeImplModule
+{
+
+       public BGPTableTypeImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+               super(identifier, dependencyResolver);
+       }
+
+       public BGPTableTypeImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+                       final BGPTableTypeImplModule oldModule, final java.lang.AutoCloseable oldInstance) {
+
+               super(identifier, dependencyResolver, oldModule, oldInstance);
+       }
+
+       @Override
+       protected void customValidation(){
+               JmxAttributeValidationException.checkNotNull(getAfi(),
+                               "value is not set.", afiJmxAttribute);
+               JmxAttributeValidationException.checkNotNull(getSafi(),
+                               "value is not set.", safiJmxAttribute);
+       }
+
+       @Override
+       public java.lang.AutoCloseable createInstance() {
+               return new AutoCloseableBgpTableType(getAfiIdentity(), getSafiIdentity());
+       }
+
+       private static final class AutoCloseableBgpTableType implements AutoCloseable, BgpTableType {
+               private final Class<? extends AddressFamily> afi;
+               private final Class<? extends SubsequentAddressFamily> safi;
+
+               public AutoCloseableBgpTableType(final Class<? extends AddressFamily> afi, final Class<? extends SubsequentAddressFamily> safi) {
+                       this.afi = Preconditions.checkNotNull(afi);
+                       this.safi = Preconditions.checkNotNull(safi);
+               }
+
+               @Override
+               public Class<? extends DataContainer> getImplementedInterface() {
+                       return BgpTableType.class;
+               }
+
+               @Override
+               public Class<? extends AddressFamily> getAfi() {
+                       return afi;
+               }
+
+               @Override
+               public Class<? extends SubsequentAddressFamily> getSafi() {
+                       return safi;
+               }
+
+               @Override
+               public void close() {
+                       // Nothing to do
+               }
+       }
+}
diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModuleFactory.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModuleFactory.java
new file mode 100644 (file)
index 0000000..945226e
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2013 Cisco 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
+ */
+/**
+* Generated file
+
+* Generated from: yang module name: bgp-rib-impl  yang module local name: bgp-table-type-impl
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Sat Jan 25 20:28:03 CET 2014
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.controller.config.yang.bgp.rib.impl;
+
+/**
+*
+*/
+public class BGPTableTypeImplModuleFactory extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPTableTypeImplModuleFactory
+{
+
+
+}
index 2c2e70759bb1dfb1a538906b09498a57a6d2a43b..a48d3a51cf57ec719eb31089028d75f9e1416b93 100644 (file)
  */
 package org.opendaylight.controller.config.yang.bgp.rib.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-
 import org.opendaylight.controller.config.api.JmxAttributeValidationException;
-import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
-import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
-import org.opendaylight.protocol.bgp.rib.impl.BGP;
-import org.opendaylight.protocol.bgp.rib.impl.BGPPeer;
 import org.opendaylight.protocol.bgp.rib.impl.RIBImpl;
-import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
 import org.opendaylight.protocol.framework.ReconnectStrategy;
 import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-
-import com.google.common.base.Preconditions;
 
 /**
  *
@@ -58,47 +45,19 @@ public final class RIBImplModule extends org.opendaylight.controller.config.yang
                JmxAttributeValidationException.checkNotNull(getRibId(), "is not set.", this.ribIdJmxAttribute);
                JmxAttributeValidationException.checkNotNull(getLocalAs(), "is not set.", this.localAsJmxAttribute);
                JmxAttributeValidationException.checkNotNull(getBgpId(), "is not set.", this.localAsJmxAttribute);
+               JmxAttributeValidationException.checkNotNull(getTcpReconnectStrategy(), "is not set.", this.tcpReconnectStrategyJmxAttribute);
+               JmxAttributeValidationException.checkNotNull(getSessionReconnectStrategy(), "is not set.", this.sessionReconnectStrategyJmxAttribute);
+               JmxAttributeValidationException.checkNotNull(getLocalTable(), "is not set.", this.sessionReconnectStrategyJmxAttribute);
        }
 
        @Override
        public java.lang.AutoCloseable createInstance() {
-               final RibImplCloseable rib = new RibImplCloseable(getRibId(), new AsNumber(getLocalAs()), getBgpId().getBytes(), getExtensionsDependency(), getDataProviderDependency());
-               final List<ListenerRegistration<BGPSessionListener>> regs = new ArrayList<>();
-               for (final BGP bgp : getBgpDependency()) {
-                       final BGPPeer peer = new BGPPeer(rib, "peer-" + bgp.toString());
-
-                       regs.add(Preconditions.checkNotNull(bgp.registerUpdateListener(peer, new ReconnectStrategyFactory() {
-                               @Override
-                               public ReconnectStrategy createReconnectStrategy() {
-                                       return getTcpReconnectStrategyDependency();
-                               }
-                       }, getSessionReconnectStrategyDependency())));
-               }
-               rib.setListenerRegistrations(regs);
-               return rib;
-       }
-
-       private static final class RibImplCloseable extends RIBImpl implements AutoCloseable {
-               private List<ListenerRegistration<BGPSessionListener>> regs;
-
-               private RibImplCloseable(final RibId ribId, final AsNumber localAs, final byte[] bgpId,
-                               final RIBExtensionConsumerContext extensions, final DataProviderService dps) {
-                       super(ribId, localAs, bgpId, extensions, dps);
-               }
-
-               @Override
-               public void close() throws InterruptedException, ExecutionException {
-                       try {
-                               super.close();
-                       } finally {
-                               for (final ListenerRegistration<BGPSessionListener> r : this.regs) {
-                                       r.close();
-                               }
+               return new RIBImpl(getRibId(), new AsNumber(getLocalAs()), getBgpId(), getExtensionsDependency(),
+                               getBgpDispatcherDependency(), new ReconnectStrategyFactory() {
+                       @Override
+                       public ReconnectStrategy createReconnectStrategy() {
+                               return getTcpReconnectStrategyDependency();
                        }
-               }
-
-               public void setListenerRegistrations(final List<ListenerRegistration<BGPSessionListener>> regs) {
-                       this.regs = Preconditions.checkNotNull(regs);
-               }
+               }, getSessionReconnectStrategyDependency(), getDataProviderDependency(), getLocalTableDependency());
        }
 }
index 849e4ad64b7488a079ddbcee15d25793cc4e86d2..d671a05121529fb1b0009c8945405be3e2b1bab7 100644 (file)
@@ -4,11 +4,13 @@ module bgp-rib-impl {
     namespace "urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl";
     prefix "bgprib-impl";
 
-    import bgp-listener { prefix bgpl; revision-date 2013-04-09; }
+    import bgp-multiprotocol { prefix bgp-mp; revision-date 2013-09-19; }
     import bgp-rib { prefix rib; revision-date 2013-09-25; }
+    import bgp-types { prefix bgp-t; revision-date 2013-09-19; }
     import config-bgp-rib { prefix bgprib; revision-date 2013-07-01; }
     import config-bgp-parser-spi { prefix bgpspi; revision-date 2013-11-15; }
     import config-bgp-rib-spi { prefix ribspi; revision-date 2013-11-15; }
+    import ietf-inet-types { prefix inet; revision-date 2010-09-24; }
     import opendaylight-md-sal-binding {prefix mdsb; revision-date 2013-10-28; }
     import netty { prefix netty; revision-date 2013-11-19; }
     import reconnect-strategy { prefix rs; revision-date 2013-11-09; }
@@ -46,41 +48,6 @@ module bgp-rib-impl {
         }
     }
 
-    identity bgp-proposal {
-        description
-            "Service representing a BGP proposal.";
-
-        base "config:service-type";
-        config:java-class "org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionProposal";
-    }
-
-    identity bgp-proposal-impl {
-        base config:module-type;
-        config:provided-service bgp-proposal;
-        config:java-name-prefix BGPSessionProposalImpl;
-    }
-
-    augment "/config:modules/config:module/config:configuration" {
-        case bgp-proposal-impl {
-            when "/config:modules/config:module/config:type = 'bgp-proposal-impl'";
-
-            leaf holdtimer {
-                type int16;
-                default 180;
-            }
-
-            leaf bgp-id {
-                mandatory true;
-                type string;
-            }
-
-            leaf as-number {
-                mandatory true;
-                type uint32;
-            }
-        }
-    }
-
     identity bgp-dispatcher {
         description
             "Service representing a BGP Dispatcher.";
@@ -128,61 +95,115 @@ module bgp-rib-impl {
         }
     }
 
-    identity bgp-impl {
+    identity base-bgp-rib {
         base config:module-type;
-        config:provided-service bgpl:listener;
-        config:java-name-prefix BGPImpl;
+        config:provided-service ribspi:extension;
+        config:java-name-prefix BaseBGPRIB;
     }
 
     augment "/config:modules/config:module/config:configuration" {
-        case bgp-impl {
-            when "/config:modules/config:module/config:type = 'bgp-impl'";
+        case base-bgp-rib {
+            when "/config:modules/config:module/config:type = 'base-bgp-rib'";
+        }
+    }
 
-            container bgp-dispatcher {
+    identity rib-instance {
+        description
+            "Service representing a RIB instance";
+
+        base "config:service-type";
+        config:java-class "org.opendaylight.protocol.bgp.rib.impl.spi.RIB";
+    }
+
+    identity bgp-peer {
+        description
+            "BGP peer instance.";
+
+        base config:module-type;
+        config:java-name-prefix BGPPeer;
+    }
+
+    identity bgp-table-type {
+        description
+            "Service representing a AFI/SAFI pair";
+
+        base "config:service-type";
+        config:java-class "org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType";
+    }
+
+    identity bgp-table-type-impl {
+        description
+            "Simple provider for bgp-table-type.";
+
+        config:provided-service bgp-table-type;
+        base config:module-type;
+        config:java-name-prefix BGPTableTypeImpl;
+    }
+
+    augment "/config:modules/config:module/config:configuration" {
+        case bgp-table-type-impl {
+            when "/config:modules/config:module/config:type = 'bgp-table-type-impl'";
+
+            leaf afi {
+                type identityref {
+                    base bgp-t:address-family;
+                }
+                mandatory true;
+            }
+            leaf safi {
+                type identityref {
+                    base bgp-t:subsequent-address-family;
+                }
+                mandatory true;
+            }
+        }
+    }
+
+    augment "/config:modules/config:module/config:configuration" {
+        case bgp-peer {
+            when "/config:modules/config:module/config:type = 'bgp-peer'";
+
+            leaf host {
+                description "Remote host IP address";
+                type inet:ip-address;
+                mandatory true;
+            }
+
+            leaf port {
+                description "Remote host port";
+                type inet:port-number;
+                default 179;
+            }
+
+            leaf holdtimer {
+                type int16;
+                default 180;
+            }
+
+            list advertized-table {
                 uses config:service-ref {
                     refine type {
                         mandatory true;
-                        config:required-identity bgp-dispatcher;
+                        config:required-identity bgp-table-type;
                     }
                 }
             }
 
-            container bgp-proposal {
+            container rib {
                 uses config:service-ref {
                     refine type {
                         mandatory true;
-                        config:required-identity bgp-proposal;
+                        config:required-identity rib-instance;
                     }
                 }
             }
-
-            leaf host {
-                 mandatory true;
-                 type string;
-            }
-
-            leaf port {
-                 type uint16;
-                 default 179;
-            }
-        }
-    }
-
-    identity base-bgp-rib {
-        base config:module-type;
-        config:provided-service ribspi:extension;
-        config:java-name-prefix BaseBGPRIB;
-    }
-
-    augment "/config:modules/config:module/config:configuration" {
-        case base-bgp-rib {
-            when "/config:modules/config:module/config:type = 'base-bgp-rib'";
         }
     }
 
     identity rib-impl {
         base config:module-type;
         config:provided-service bgprib:rib;
+        config:provided-service rib-instance;
         config:java-name-prefix RIBImpl;
     }
 
@@ -190,20 +211,20 @@ module bgp-rib-impl {
         case rib-impl {
             when "/config:modules/config:module/config:type = 'rib-impl'";
 
-            list bgp {
+            container extensions {
                 uses config:service-ref {
                     refine type {
                         mandatory true;
-                        config:required-identity bgpl:listener;
+                        config:required-identity ribspi:consumer-extensions;
                     }
                 }
             }
 
-            container extensions {
+            container bgp-dispatcher {
                 uses config:service-ref {
                     refine type {
                         mandatory true;
-                        config:required-identity ribspi:consumer-extensions;
+                        config:required-identity bgp-dispatcher;
                     }
                 }
             }
@@ -244,10 +265,20 @@ module bgp-rib-impl {
             leaf bgp-id {
                        description "Our local BGP identifier. Needed by best selection path attribute.";
                 mandatory true;
-                type string;
+                type inet:ipv4-address;
+            }
+
+            list local-table {
+                uses config:service-ref {
+                    refine type {
+                        mandatory true;
+                        config:required-identity bgp-table-type;
+                    }
+                }
             }
 
             leaf rib-id {
+                description "Identifier of this RIB in local data store.";
                 type rib:rib-id;
                 mandatory true;
             }
diff --git a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPImplModuleTest.java b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPImplModuleTest.java
deleted file mode 100644 (file)
index bdcba48..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco 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
- */
-package org.opendaylight.controller.config.yang.bgp.rib.impl;
-
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import javax.management.InstanceAlreadyExistsException;
-import javax.management.InstanceNotFoundException;
-import javax.management.ObjectName;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.controller.config.api.ConflictingVersionException;
-import org.opendaylight.controller.config.api.ValidationException;
-import org.opendaylight.controller.config.api.jmx.CommitStatus;
-import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
-import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
-import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
-import org.opendaylight.controller.config.yang.bgp.parser.spi.SimpleBGPExtensionProviderContextModuleFactory;
-import org.opendaylight.controller.config.yang.bgp.rib.spi.RIBExtensionsImplModuleFactory;
-import org.opendaylight.controller.config.yang.netty.threadgroup.NettyThreadgroupModuleFactory;
-
-public class BGPImplModuleTest extends AbstractConfigTest {
-
-       private final String instanceName = "bgp-impl1";
-
-       private BGPImplModuleFactory factory;
-
-       private BGPSessionProposalImplModuleFactory sessionFacotry;
-
-       private BGPDispatcherImplModuleFactory dispactherFactory;
-
-       private NettyThreadgroupModuleFactory threadgropFactory;
-
-       private RIBExtensionsImplModuleFactory messageFactory;
-
-       private SimpleBGPExtensionProviderContextModuleFactory extensionFactory;
-
-       @Before
-       public void setUp() throws Exception {
-               this.factory = new BGPImplModuleFactory();
-               this.dispactherFactory = new BGPDispatcherImplModuleFactory();
-               this.sessionFacotry = new BGPSessionProposalImplModuleFactory();
-               this.threadgropFactory = new NettyThreadgroupModuleFactory();
-               this.messageFactory = new RIBExtensionsImplModuleFactory();
-               this.extensionFactory = new SimpleBGPExtensionProviderContextModuleFactory();
-               super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(this.factory, this.dispactherFactory, this.sessionFacotry, this.messageFactory, this.threadgropFactory, this.extensionFactory));
-       }
-
-       @Test
-       public void testValidationExceptionPortNotSet() throws InstanceAlreadyExistsException {
-               try {
-                       final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-                       createInstance(transaction, this.factory.getImplementationName(), this.instanceName, "localhost", null,
-                                       this.sessionFacotry.getImplementationName(), this.dispactherFactory.getImplementationName(),
-                                       this.threadgropFactory.getImplementationName(), this.messageFactory.getImplementationName(),
-                                       this.extensionFactory.getImplementationName());
-                       transaction.validateConfig();
-                       fail();
-               } catch (final ValidationException e) {
-                       assertTrue(e.getMessage().contains("Port value is not set."));
-               }
-       }
-
-       @Test
-       public void testValidationExceptionPortOutOfRange() throws InstanceAlreadyExistsException {
-               try {
-                       final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-                       createInstance(transaction, this.factory.getImplementationName(), this.instanceName, "localhost", -1,
-                                       this.sessionFacotry.getImplementationName(), this.dispactherFactory.getImplementationName(),
-                                       this.threadgropFactory.getImplementationName(), this.messageFactory.getImplementationName(),
-                                       this.extensionFactory.getImplementationName());
-                       transaction.validateConfig();
-                       fail();
-               } catch (final ValidationException e) {
-                       assertTrue(e.getMessage().contains("is out of range (0-65535)."));
-               }
-       }
-
-       @Test
-       public void testValidationExceptionHostNotSet() throws InstanceAlreadyExistsException {
-               try {
-                       final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-                       createInstance(transaction, this.factory.getImplementationName(), this.instanceName, null, 1,
-                                       this.sessionFacotry.getImplementationName(), this.dispactherFactory.getImplementationName(),
-                                       this.threadgropFactory.getImplementationName(), this.messageFactory.getImplementationName(),
-                                       this.extensionFactory.getImplementationName());
-                       transaction.validateConfig();
-                       fail();
-               } catch (final ValidationException e) {
-                       assertTrue(e.getMessage().contains("Host value is not set."));
-               }
-       }
-
-       @Test
-       public void testCreateBean() throws Exception {
-               final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-               createInstance(transaction, this.factory.getImplementationName(), this.instanceName, "localhost", 1,
-                               this.sessionFacotry.getImplementationName(), this.dispactherFactory.getImplementationName(),
-                               this.threadgropFactory.getImplementationName(), this.messageFactory.getImplementationName(),
-                               this.extensionFactory.getImplementationName());
-               transaction.validateConfig();
-               final CommitStatus status = transaction.commit();
-               assertBeanCount(1, this.factory.getImplementationName());
-               assertStatus(status, 6, 0, 0);
-       }
-
-       @Test
-       public void testReusingOldInstance() throws InstanceAlreadyExistsException, ConflictingVersionException, ValidationException {
-               ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-               createInstance(transaction, this.factory.getImplementationName(), this.instanceName, "localhost", 1,
-                               this.sessionFacotry.getImplementationName(), this.dispactherFactory.getImplementationName(),
-                               this.threadgropFactory.getImplementationName(), this.messageFactory.getImplementationName(),
-                               this.extensionFactory.getImplementationName());
-               transaction.commit();
-               transaction = this.configRegistryClient.createTransaction();
-               assertBeanCount(1, this.factory.getImplementationName());
-               final CommitStatus status = transaction.commit();
-               assertBeanCount(1, this.factory.getImplementationName());
-               assertStatus(status, 0, 0, 6);
-       }
-
-       @Test
-       public void testReconfigure() throws InstanceAlreadyExistsException, ConflictingVersionException, ValidationException,
-                       InstanceNotFoundException {
-               ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-               createInstance(transaction, this.factory.getImplementationName(), this.instanceName, "localhost", 1,
-                               this.sessionFacotry.getImplementationName(), this.dispactherFactory.getImplementationName(),
-                               this.threadgropFactory.getImplementationName(), this.messageFactory.getImplementationName(),
-                               this.extensionFactory.getImplementationName());
-               transaction.commit();
-               transaction = this.configRegistryClient.createTransaction();
-               assertBeanCount(1, this.factory.getImplementationName());
-               final BGPImplModuleMXBean mxBean = transaction.newMBeanProxy(
-                               transaction.lookupConfigBean(this.factory.getImplementationName(), this.instanceName), BGPImplModuleMXBean.class);
-               mxBean.setPort(10);
-               final CommitStatus status = transaction.commit();
-               assertBeanCount(1, this.factory.getImplementationName());
-               assertStatus(status, 0, 1, 5);
-       }
-
-       public static ObjectName createInstance(final ConfigTransactionJMXClient transaction, final String moduleName,
-                       final String instanceName, final String host, final Integer port, final String sessionModuleName,
-                       final String dispatcherModuleName, final String threadgroupModuleName, final String messageFactoryModuleName,
-                       final String extensionModuleName) throws InstanceAlreadyExistsException {
-               final ObjectName nameCreated = transaction.createModule(moduleName, instanceName);
-               final BGPImplModuleMXBean mxBean = transaction.newMBeanProxy(nameCreated, BGPImplModuleMXBean.class);
-               mxBean.setHost(host);
-               mxBean.setPort(port);
-               mxBean.setBgpProposal(BGPSessionProposalImplModuleTest.createInstance(transaction, sessionModuleName, "bgp-session1", 1L,
-                               (short) 30, "128.0.0.1"));
-               mxBean.setBgpDispatcher(BGPDispatcherImplModuleTest.createInstance(transaction, dispatcherModuleName, "bgp-dispatcher1"));
-               return nameCreated;
-       }
-
-}
diff --git a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModuleTest.java b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModuleTest.java
new file mode 100644 (file)
index 0000000..2739f0f
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2013 Cisco 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
+ */
+package org.opendaylight.controller.config.yang.bgp.rib.impl;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
+import java.util.List;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.ObjectName;
+
+import org.junit.Test;
+import org.opendaylight.controller.config.api.IdentityAttributeRef;
+import org.opendaylight.controller.config.api.ValidationException;
+import org.opendaylight.controller.config.api.jmx.CommitStatus;
+import org.opendaylight.controller.config.spi.ModuleFactory;
+import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
+import org.opendaylight.controller.config.yang.bgp.rib.spi.RIBExtensionsImplModuleFactory;
+import org.opendaylight.controller.config.yang.md.sal.binding.impl.DataBrokerImplModuleFactory;
+import org.opendaylight.controller.config.yang.md.sal.dom.impl.DomBrokerImplModuleFactory;
+import org.opendaylight.controller.config.yang.md.sal.dom.impl.HashMapDataStoreModuleFactory;
+import org.opendaylight.controller.config.yang.netty.eventexecutor.GlobalEventExecutorModuleFactory;
+import org.opendaylight.controller.config.yang.reconnectstrategy.TimedReconnectStrategyModuleFactory;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.MplsLabeledVpnSubsequentAddressFamily;
+import org.opendaylight.yangtools.yang.data.impl.codec.CodecRegistry;
+import org.opendaylight.yangtools.yang.data.impl.codec.IdentityCodec;
+
+import com.google.common.collect.Lists;
+
+public class BGPPeerModuleTest extends RIBImplModuleTest {
+
+       private final String instanceName = "bgp-impl1";
+
+       public static ObjectName createBgpPeerInstance(final ConfigTransactionJMXClient transaction,
+                       final String instanceName, final String host, final Integer port) throws Exception {
+               final ObjectName nameCreated = transaction.createModule(BGPPeerModuleFactory.NAME, instanceName);
+               final BGPPeerModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, BGPPeerModuleMXBean.class);
+
+               // FIXME JMX crashes if union was not created via artificial constructor
+               // annotated for JMX as value
+               // IpAddress host1 = new IpAddress(new Ipv4Address(host));
+               mxBean.setHost(host == null ? null : new IpAddress(host.toCharArray()));
+               mxBean.setPort(port==null ? null : new PortNumber(port));
+               mxBean.setAdvertizedTable(Lists.newArrayList(createAdvertisedTable(transaction, BGPTableTypeImplModuleFactory.NAME)));
+               mxBean.setRib(createInstance(transaction, RIBImplModuleFactory.NAME, "ribImpl",
+                               DataBrokerImplModuleFactory.NAME, TimedReconnectStrategyModuleFactory.NAME,
+                               GlobalEventExecutorModuleFactory.NAME, BGPDispatcherImplModuleFactory.NAME,
+                               RIBExtensionsImplModuleFactory.NAME, DomBrokerImplModuleFactory.NAME,
+                               HashMapDataStoreModuleFactory.NAME));
+               return nameCreated;
+       }
+
+       private static ObjectName createAdvertisedTable(final ConfigTransactionJMXClient transaction, final String tableTypeModuleName) throws InstanceAlreadyExistsException {
+               String instanceName = "table-type";
+               final ObjectName nameCreated = transaction.createModule(tableTypeModuleName, instanceName);
+               BGPTableTypeImplModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, BGPTableTypeImplModuleMXBean.class);
+
+               mxBean.setAfi(new IdentityAttributeRef(Ipv4AddressFamily.QNAME.toString()));
+               mxBean.setSafi(new IdentityAttributeRef(MplsLabeledVpnSubsequentAddressFamily.QNAME.toString()));
+               return nameCreated;
+       }
+
+       @Override
+       protected List<ModuleFactory> getModuleFactories() {
+               List<ModuleFactory> moduleFactories = super.getModuleFactories();
+               moduleFactories.add(new BGPPeerModuleFactory());
+               moduleFactories.add(new BGPTableTypeImplModuleFactory());
+               return moduleFactories;
+       }
+
+       @Test
+       public void testValidationExceptionPortNotSet() throws Exception {
+               final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
+               try {
+                       createBgpPeerInstance(transaction, this.instanceName, "127.0.0.1", null);
+                       transaction.validateConfig();
+                       fail();
+               } catch (final ValidationException e) {
+                       transaction.abortConfig();
+                       assertTrue(e.getMessage().contains("Port value is not set."));
+               }
+       }
+
+       @Test
+       public void testValidationExceptionHostNotSet() throws Exception {
+               final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
+               try {
+                       createBgpPeerInstance(transaction, this.instanceName, null, null);
+                       transaction.validateConfig();
+                       fail();
+               } catch (final ValidationException e) {
+                       transaction.abortConfig();
+                       assertTrue(e.getMessage().contains("Host value is not set."));
+               }
+       }
+
+       @Override
+       @Test
+       public void testCreateBean() throws Exception {
+               final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
+               createBgpPeerInstance(transaction, this.instanceName, "127.0.0.1", 1);
+               transaction.validateConfig();
+               final CommitStatus status = transaction.commit();
+               assertBeanCount(1, BGPPeerModuleFactory.NAME);
+               assertStatus(status, 15, 0, 0);
+       }
+
+       @Override
+       protected CodecRegistry getCodecRegistry() {
+               IdentityCodec<?> idCodec = mock(IdentityCodec.class);
+               doReturn(Ipv4AddressFamily.class).when(idCodec).deserialize(Ipv4AddressFamily.QNAME);
+               doReturn(MplsLabeledVpnSubsequentAddressFamily.class).when(idCodec).deserialize(MplsLabeledVpnSubsequentAddressFamily.QNAME);
+
+               CodecRegistry codecReg = super.getCodecRegistry();
+               doReturn(idCodec).when(codecReg).getIdentityCodec();
+               return codecReg;
+       }
+
+       @Test
+       public void testReusingOldInstance() throws Exception {
+               ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
+               createBgpPeerInstance(transaction, this.instanceName, "127.0.0.1", 1);
+               transaction.validateConfig();
+               CommitStatus status = transaction.commit();
+               transaction = this.configRegistryClient.createTransaction();
+               assertBeanCount(1, BGPPeerModuleFactory.NAME);
+               status = transaction.commit();
+               assertBeanCount(1, BGPPeerModuleFactory.NAME);
+               assertStatus(status, 0, 0, 15);
+       }
+
+       @Test
+       public void testReconfigure() throws Exception {
+               ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
+               createBgpPeerInstance(transaction, this.instanceName, "127.0.0.1", 1);
+               transaction.validateConfig();
+               CommitStatus status = transaction.commit();
+               transaction = this.configRegistryClient.createTransaction();
+               assertBeanCount(1, BGPPeerModuleFactory.NAME);
+               final BGPPeerModuleMXBean mxBean = transaction.newMXBeanProxy(
+                               transaction.lookupConfigBean(BGPPeerModuleFactory.NAME, this.instanceName), BGPPeerModuleMXBean.class);
+               mxBean.setPort(new PortNumber(10));
+               status = transaction.commit();
+               assertBeanCount(1, BGPPeerModuleFactory.NAME);
+               assertStatus(status, 0, 1, 14);
+       }
+}
diff --git a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPSessionProposalImplModuleTest.java b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPSessionProposalImplModuleTest.java
deleted file mode 100644 (file)
index 07230d0..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco 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
- */
-package org.opendaylight.controller.config.yang.bgp.rib.impl;
-
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import javax.management.InstanceAlreadyExistsException;
-import javax.management.InstanceNotFoundException;
-import javax.management.ObjectName;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.controller.config.api.ConflictingVersionException;
-import org.opendaylight.controller.config.api.ValidationException;
-import org.opendaylight.controller.config.api.jmx.CommitStatus;
-import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
-import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
-import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
-
-public class BGPSessionProposalImplModuleTest extends AbstractConfigTest {
-
-       private final String instanceName = "bgp-session-prop";
-
-       private BGPSessionProposalImplModuleFactory factory;
-
-       @Before
-       public void setUp() throws Exception {
-               this.factory = new BGPSessionProposalImplModuleFactory();
-               super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(this.factory));
-       }
-
-       @Test
-       public void testValidationExceptionAsNumberNotSet() throws InstanceAlreadyExistsException {
-               try {
-                       final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-                       createInstance(transaction, this.factory.getImplementationName(), this.instanceName, null, (short) 180, "192.168.1.1");
-                       transaction.validateConfig();
-                       fail();
-               } catch (final ValidationException e) {
-                       assertTrue(e.getMessage().contains("AsNumber value is not set."));
-               }
-       }
-
-       @Test
-       public void testValidationExceptionAsNumberMinValue() throws InstanceAlreadyExistsException {
-               try {
-                       final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-                       createInstance(transaction, this.factory.getImplementationName(), this.instanceName, (long) 0, (short) 180, "192.168.1.1");
-                       transaction.validateConfig();
-                       fail();
-               } catch (final ValidationException e) {
-                       assertTrue(e.getMessage().contains("AsNumber value must be greater than 0"));
-               }
-       }
-
-       @Test
-       public void testValidationExceptionHoldtimerNotSet() throws InstanceAlreadyExistsException {
-               try {
-                       final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-                       createInstance(transaction, this.factory.getImplementationName(), this.instanceName, 1L, null, "192.168.1.1");
-                       transaction.validateConfig();
-                       fail();
-               } catch (final ValidationException e) {
-                       assertTrue(e.getMessage().contains("Holdtimer value is not set."));
-               }
-       }
-
-       @Test
-       public void testValidationExceptionHoldtimerMinValue() throws InstanceAlreadyExistsException {
-               try {
-                       final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-                       createInstance(transaction, this.factory.getImplementationName(), this.instanceName, 1L, (short) 2, "192.168.1.1");
-                       transaction.validateConfig();
-                       fail();
-               } catch (final ValidationException e) {
-                       assertTrue(e.getMessage().contains("Holdtimer value must be"));
-               }
-       }
-
-       @Test
-       public void testValidationExceptionBgpIdNotSet() throws InstanceAlreadyExistsException {
-               try {
-                       final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-                       createInstance(transaction, this.factory.getImplementationName(), this.instanceName, 1L, (short) 180, null);
-                       transaction.validateConfig();
-                       fail();
-               } catch (final ValidationException e) {
-                       assertTrue(e.getMessage().contains("BgpId value is not set."));
-               }
-       }
-
-       @Test
-       public void testValidationExceptionBgpIdNotIpv4() throws InstanceAlreadyExistsException {
-               try {
-                       final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-                       createInstance(transaction, this.factory.getImplementationName(), this.instanceName, 1L, (short) 180, "192.168.1.500");
-                       transaction.validateConfig();
-                       fail();
-               } catch (final ValidationException e) {
-                       assertTrue(e.getMessage().contains("is not valid IPv4 address"));
-               }
-       }
-
-       @Test
-       public void testCreateBean() throws Exception {
-               final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-               createInstance(transaction, this.factory.getImplementationName(), this.instanceName, 1L, (short) 180, "192.168.1.1");
-               transaction.validateConfig();
-               final CommitStatus status = transaction.commit();
-               assertBeanCount(1, this.factory.getImplementationName());
-               assertStatus(status, 1, 0, 0);
-       }
-
-       @Test
-       public void testReusingOldInstance() throws InstanceAlreadyExistsException, ConflictingVersionException, ValidationException {
-               ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-               createInstance(transaction, this.factory.getImplementationName(), this.instanceName, 1L, (short) 180, "192.168.1.1");
-               transaction.commit();
-               transaction = this.configRegistryClient.createTransaction();
-               assertBeanCount(1, this.factory.getImplementationName());
-               final CommitStatus status = transaction.commit();
-               assertBeanCount(1, this.factory.getImplementationName());
-               assertStatus(status, 0, 0, 1);
-       }
-
-       @Test
-       public void testReconfigure() throws InstanceAlreadyExistsException, ConflictingVersionException, ValidationException,
-                       InstanceNotFoundException {
-               ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-               createInstance(transaction, this.factory.getImplementationName(), this.instanceName, 1L, (short) 180, "192.168.1.1");
-               transaction.commit();
-               transaction = this.configRegistryClient.createTransaction();
-               assertBeanCount(1, this.factory.getImplementationName());
-               final BGPSessionProposalImplModuleMXBean mxBean = transaction.newMBeanProxy(
-                               transaction.lookupConfigBean(this.factory.getImplementationName(), this.instanceName),
-                               BGPSessionProposalImplModuleMXBean.class);
-               mxBean.setBgpId("192.168.10.10");
-               final CommitStatus status = transaction.commit();
-               assertBeanCount(1, this.factory.getImplementationName());
-               assertStatus(status, 0, 1, 0);
-       }
-
-       public static ObjectName createInstance(final ConfigTransactionJMXClient transaction, final String moduleName,
-                       final String instanceName, final Long asNumber, final Short holdtimer, final String bgpId)
-                       throws InstanceAlreadyExistsException {
-               final ObjectName nameCreated = transaction.createModule(moduleName, instanceName);
-               final BGPSessionProposalImplModuleMXBean mxBean = transaction.newMBeanProxy(nameCreated, BGPSessionProposalImplModuleMXBean.class);
-               mxBean.setAsNumber(asNumber);
-               mxBean.setBgpId(bgpId);
-               mxBean.setHoldtimer(holdtimer);
-               return nameCreated;
-
-       }
-}
index f780661d53360b54620f679f9a0d4001cf139113..81c0830a8659c32166098db14303c7e8bf42e979 100644 (file)
@@ -7,7 +7,19 @@
  */
 package org.opendaylight.controller.config.yang.bgp.rib.impl;
 
-import com.google.common.collect.Lists;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.Future;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.ObjectName;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -18,6 +30,7 @@ import org.mockito.MockitoAnnotations;
 import org.opendaylight.controller.config.api.jmx.CommitStatus;
 import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
 import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
+import org.opendaylight.controller.config.spi.ModuleFactory;
 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
 import org.opendaylight.controller.config.yang.bgp.parser.spi.SimpleBGPExtensionProviderContextModuleFactory;
 import org.opendaylight.controller.config.yang.bgp.reconnectstrategy.TimedReconnectStrategyModuleTest;
@@ -38,6 +51,7 @@ import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler;
 import org.opendaylight.controller.sal.core.api.data.DataModificationTransaction;
 import org.opendaylight.controller.sal.core.api.data.DataProviderService;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.common.RpcResult;
@@ -51,17 +65,7 @@ import org.osgi.framework.Filter;
 import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceReference;
 
-import javax.management.InstanceAlreadyExistsException;
-import javax.management.InstanceNotFoundException;
-import javax.management.ObjectName;
-import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.Future;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
+import com.google.common.collect.Lists;
 
 public class RIBImplModuleTest extends AbstractConfigTest {
        private static final String INSTANCE_NAME = GlobalEventExecutorModuleFactory.SINGLETON_NAME;
@@ -70,10 +74,8 @@ public class RIBImplModuleTest extends AbstractConfigTest {
        private RIBImplModuleFactory factory;
        private DataBrokerImplModuleFactory dataBrokerFactory;
        private TimedReconnectStrategyModuleFactory reconnectFactory;
-       private BGPImplModuleFactory bgpFactory;
-       private BGPSessionProposalImplModuleFactory sessionFacotry;
        private BGPDispatcherImplModuleFactory dispactherFactory;
-       private NettyThreadgroupModuleFactory threadgropFactory;
+       private NettyThreadgroupModuleFactory threadgroupFactory;
        private GlobalEventExecutorModuleFactory executorFactory;
        private SimpleBGPExtensionProviderContextModuleFactory extensionFactory;
        private RIBExtensionsImplModuleFactory ribExtensionsFactory;
@@ -100,22 +102,19 @@ public class RIBImplModuleTest extends AbstractConfigTest {
 
                this.factory = new RIBImplModuleFactory();
                this.dataBrokerFactory = new DataBrokerImplModuleFactory();
-               this.bgpFactory = new BGPImplModuleFactory();
                this.executorFactory = new GlobalEventExecutorModuleFactory();
                this.dispactherFactory = new BGPDispatcherImplModuleFactory();
-               this.sessionFacotry = new BGPSessionProposalImplModuleFactory();
-               this.threadgropFactory = new NettyThreadgroupModuleFactory();
+               this.threadgroupFactory = new NettyThreadgroupModuleFactory();
                this.reconnectFactory = new TimedReconnectStrategyModuleFactory();
                this.extensionFactory = new SimpleBGPExtensionProviderContextModuleFactory();
                this.ribExtensionsFactory = new RIBExtensionsImplModuleFactory();
                this.domBrokerFactory = new DomBrokerImplModuleFactory();
                this.runtimeMappingFactory = new RuntimeMappingModuleFactory();
                this.dataStroreFactory = new HashMapDataStoreModuleFactory();
-               super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, this.factory,
-                               this.dispactherFactory, this.sessionFacotry, this.threadgropFactory, this.bgpFactory,
-                               this.reconnectFactory, this.dataBrokerFactory, this.executorFactory, this.extensionFactory,
-                               this.ribExtensionsFactory, this.domBrokerFactory, this.runtimeMappingFactory,
-                               this.dataStroreFactory));
+
+               List<ModuleFactory> moduleFactories = getModuleFactories();
+               super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, moduleFactories
+                               .toArray(new ModuleFactory[moduleFactories.size()])));
 
                Filter mockedFilter = mock(Filter.class);
                Mockito.doReturn(mockedFilter).when(mockedContext).createFilter(Mockito.anyString());
@@ -131,8 +130,8 @@ public class RIBImplModuleTest extends AbstractConfigTest {
                ServiceReference<?> emptyServiceReference = mock(ServiceReference.class, "Empty");
 
                ServiceReference<?> dataProviderServiceReference = mock(ServiceReference.class, "Data Provider");
-               
-               
+
+
                Mockito.doReturn(mockedFilter).when(mockedContext).createFilter(Mockito.anyString());
 
                Mockito.doNothing().when(mockedContext).addServiceListener(any(ServiceListener.class), Mockito.anyString());
@@ -163,7 +162,7 @@ public class RIBImplModuleTest extends AbstractConfigTest {
                                any(DataCommitHandler.class));
                Mockito.doReturn(registration).when(mockedDataProvider).registerCommitHandler(any(InstanceIdentifier.class),
                                any(DataCommitHandler.class));
-               
+
                Mockito.doReturn(null).when(mockedDataProvider).readOperationalData(any(InstanceIdentifier.class));
                Mockito.doReturn(mockedTransaction).when(mockedDataProvider).beginTransaction();
 
@@ -176,8 +175,14 @@ public class RIBImplModuleTest extends AbstractConfigTest {
                Mockito.doReturn(mockedResult).when(mockedFuture).get();
                Mockito.doReturn(true).when(mockedResult).isSuccessful();
                Mockito.doReturn(Collections.emptySet()).when(mockedResult).getErrors();
+       }
 
-               // FIXME This needs further mocking
+       protected List<ModuleFactory> getModuleFactories() {
+               return Lists.newArrayList(this.factory,
+                               this.dispactherFactory, this.threadgroupFactory,
+                               this.reconnectFactory, this.dataBrokerFactory, this.executorFactory, this.extensionFactory,
+                               this.ribExtensionsFactory, this.domBrokerFactory, this.runtimeMappingFactory,
+                               this.dataStroreFactory);
        }
 
        @Override
@@ -199,27 +204,28 @@ public class RIBImplModuleTest extends AbstractConfigTest {
        public void testCreateBean() throws Exception {
                ConfigTransactionJMXClient transaction = configRegistryClient
                                .createTransaction();
-               createInstance(transaction, this.factory.getImplementationName(), INSTANCE_NAME, this.dataBrokerFactory.getImplementationName(),
-                               this.reconnectFactory.getImplementationName(), this.bgpFactory.getImplementationName(),
-                               this.sessionFacotry.getImplementationName(), this.dispactherFactory.getImplementationName(), this.threadgropFactory.getImplementationName(),
-                               this.extensionFactory.getImplementationName(), this.ribExtensionsFactory.getImplementationName(), this.domBrokerFactory.getImplementationName(),
+               createInstance(transaction, this.factory.getImplementationName(), INSTANCE_NAME,
+                               this.dataBrokerFactory.getImplementationName(), this.reconnectFactory.getImplementationName(),
+                               this.executorFactory.getImplementationName(), this.dispactherFactory.getImplementationName(),
+                               this.ribExtensionsFactory.getImplementationName(), this.domBrokerFactory.getImplementationName(),
                                this.dataStroreFactory.getImplementationName());
                transaction.validateConfig();
                CommitStatus status = transaction.commit();
                Thread.sleep(2000);
                assertBeanCount(1, factory.getImplementationName());
-               assertStatus(status, 15, 0, 0);
+               assertStatus(status, 13, 0, 0);
        }
 
        @After
        public void closeAllModules() throws Exception {
-               super.destroyAllConfigBeans();
+               // FIXME: re-activate once test succeed
+               // super.destroyAllConfigBeans();
        }
 
        public static ObjectName createInstance(final ConfigTransactionJMXClient transaction, final String moduleName,
-                                            final String instanceName, final String bindingDataModuleName, final String reconnectModueName, final String bgpModuleName,
-                                            final String sessionModuleName, final String dispatcherModuleName, final String threadgroupModuleName, final String extensionModuleName,
-                                            final String ribExtensionsModuleName, final String domBrokerModuleName, final String dataStroreModuleName)
+                       final String instanceName, final String bindingDataModuleName, final String reconnectModueName,
+                       final String executorModuleName, final String dispatcherModuleName, final String ribExtensionsModuleName,
+                       final String domBrokerModuleName, final String dataStroreModuleName)
                                        throws Exception {
                ObjectName nameCreated = transaction.createModule(
                                moduleName, instanceName);
@@ -230,11 +236,11 @@ public class RIBImplModuleTest extends AbstractConfigTest {
                mxBean.setDataProvider(createDataBrokerInstance(transaction, bindingDataModuleName, "data-broker-impl", domBrokerModuleName, dataStroreModuleName));
                ObjectName reconnectStrategyON = TimedReconnectStrategyModuleTest.createInstance(transaction, reconnectModueName, "tcp-reconnect-strategy", 100, 1000L, new BigDecimal(1.0), 5000L, 2000L, null);
                mxBean.setTcpReconnectStrategy(reconnectStrategyON);
-               mxBean.setBgp(Lists.newArrayList(BGPImplModuleTest.createInstance(transaction, bgpModuleName, "bgp-impl1", "localhost", 1, sessionModuleName, dispatcherModuleName, threadgroupModuleName, ribExtensionsModuleName, extensionModuleName)));
+               mxBean.setBgpDispatcher(BGPDispatcherImplModuleTest.createInstance(transaction, dispatcherModuleName, "bgp-dispatcher"));
                mxBean.setExtensions(createRibExtensionsInstance(transaction, ribExtensionsModuleName, "rib-extensions-privider1"));
                mxBean.setRibId(new RibId("test"));
                mxBean.setLocalAs(5000L);
-               mxBean.setBgpId("192.168.1.1");
+               mxBean.setBgpId(new Ipv4Address("192.168.1.1"));
                return nameCreated;
        }
 
diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGP.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGP.java
deleted file mode 100644 (file)
index 90433c8..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco 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
- */
-package org.opendaylight.protocol.bgp.rib.impl;
-
-import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
-import org.opendaylight.protocol.framework.ReconnectStrategy;
-import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-
-/**
- * BGP interface. At this time it only supports listening to changes seen by the backing device, typically a network
- * element. Abstracts away connection issues - listener starts getting notifications once connection is established.
- * Implementation of this interface is required to send all previous messages.
- */
-public interface BGP {
-       /**
-        * Register for BGP update feed. Specified listener will have the BGP information synchronized. The registration
-        * needs to be explicitly closed in order to stop receiving the updates.
-        * 
-        * @param listener {@link BGPSessionListener}
-        * @param tcpStrategyFactory {@link ReconnectStrategyFactory} to use for creating TCP-level retry strategies
-        * @param sessionStrategy {@link ReconnectStrategy} to use for session-level retries
-        * @throws IllegalStateException if there is already a listener registered
-        * @return ListenerRegistration
-        */
-       ListenerRegistration<BGPSessionListener> registerUpdateListener(BGPSessionListener listener,
-                       ReconnectStrategyFactory tcpStrategyFactory, ReconnectStrategy sessionStrategy);
-}
diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPImpl.java
deleted file mode 100644 (file)
index e976596..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco 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
- */
-package org.opendaylight.protocol.bgp.rib.impl;
-
-import io.netty.util.concurrent.Future;
-
-import java.io.Closeable;
-import java.net.InetSocketAddress;
-
-import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionProposal;
-import org.opendaylight.protocol.framework.ReconnectStrategy;
-import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
-import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-
-import com.google.common.base.Preconditions;
-
-/**
- * Implementation of {@link BGP}.
- */
-public class BGPImpl implements BGP, Closeable {
-       private final BGPDispatcher dispatcher;
-
-       private final InetSocketAddress address;
-
-       private final BGPSessionProposal proposal;
-
-       public BGPImpl(final BGPDispatcher dispatcher, final InetSocketAddress address, final BGPSessionProposal proposal) {
-               this.dispatcher = Preconditions.checkNotNull(dispatcher);
-               this.address = Preconditions.checkNotNull(address);
-               this.proposal = Preconditions.checkNotNull(proposal);
-       }
-
-       @Override
-       public ListenerRegistration<BGPSessionListener> registerUpdateListener(final BGPSessionListener listener, final ReconnectStrategyFactory tcpStrategyFactory, final ReconnectStrategy sessionStrategy) {
-               final Future<Void> s = this.dispatcher.createReconnectingClient(address, this.proposal.getProposal(), listener, tcpStrategyFactory, sessionStrategy);
-               return new AbstractListenerRegistration<BGPSessionListener>(listener) {
-                       @Override
-                       protected void removeRegistration() {
-                               s.cancel(true);
-                       }
-               };
-       }
-
-       @Override
-       public void close() {
-
-       }
-}
index 1436b4f586c6840bcdea8bbae57449e832b687b2..93493efc231c97c731aa552187a95761b137c4a8 100644 (file)
@@ -12,6 +12,7 @@ import java.util.Comparator;
 import java.util.List;
 
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.PathAttributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.as.path.Segments;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpOrigin;
@@ -19,6 +20,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.ASetCase;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
 import com.google.common.net.InetAddresses;
 
 /**
@@ -36,10 +38,10 @@ final class BGPObjectComparator implements Comparator<PathAttributes> {
 
        private final byte[] id2;
 
-       public BGPObjectComparator(final AsNumber ourAs, final byte[] id1, final byte[] id2) {
+       public BGPObjectComparator(final AsNumber ourAs, final Ipv4Address localId, final byte[] remoteId) {
                this.ourAS = ourAs;
-               this.id1 = id1;
-               this.id2 = id2;
+               this.id1 = InetAddresses.forString(localId.getValue()).getAddress();
+               this.id2 = Preconditions.checkNotNull(remoteId);
        }
 
        @Override
index c729b8384b6cf6d54cec85f413971f87342565bd..9b44e0244bfc1b51b4a44b5b26190e080f3873cd 100644 (file)
@@ -7,12 +7,22 @@
  */
 package org.opendaylight.protocol.bgp.rib.impl;
 
+import io.netty.util.concurrent.Future;
+
+import java.net.InetSocketAddress;
+import java.util.Comparator;
+import java.util.HashSet;
 import java.util.Set;
 
+import javax.annotation.concurrent.GuardedBy;
+
 import org.opendaylight.protocol.bgp.parser.BGPSession;
 import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
 import org.opendaylight.protocol.bgp.parser.BGPTerminationReason;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
+import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
 import org.opendaylight.protocol.bgp.rib.spi.Peer;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.PathAttributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Update;
 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.rib.rev130925.rib.TablesKey;
@@ -23,21 +33,40 @@ import org.slf4j.LoggerFactory;
 import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
 import com.google.common.base.Preconditions;
-import com.google.common.collect.Sets;
 
 /**
  * Class representing a peer. We have a single instance for each peer, which provides translation from BGP events into
  * RIB actions.
  */
-public final class BGPPeer implements BGPSessionListener, Peer {
+public final class BGPPeer implements BGPSessionListener, Peer, AutoCloseable {
        private static final Logger LOG = LoggerFactory.getLogger(BGPPeer.class);
-       private final Set<TablesKey> tables = Sets.newHashSet();
+
+       @GuardedBy("this")
+       private final Set<TablesKey> tables = new HashSet<>();
        private final String name;
-       private final RIBImpl rib;
+       private final RIB rib;
 
-       public BGPPeer(final RIBImpl rib, final String name) {
+       private Comparator<PathAttributes> comparator;
+       private Future<Void> cf;
+       private BGPSession session;
+
+       public BGPPeer(final String name, final InetSocketAddress address, final BGPSessionPreferences prefs,
+                       final RIB rib) {
                this.rib = Preconditions.checkNotNull(rib);
                this.name = Preconditions.checkNotNull(name);
+               cf = rib.getDispatcher().createReconnectingClient(address, prefs, this, rib.getTcpStrategyFactory(), rib.getSessionStrategy());
+       }
+
+       @Override
+       public synchronized void close() {
+               if (cf != null) {
+                       cf.cancel(true);
+                       if (session != null) {
+                               session.close();
+                               session = null;
+                       }
+                       cf = null;
+               }
        }
 
        @Override
@@ -50,23 +79,29 @@ public final class BGPPeer implements BGPSessionListener, Peer {
        }
 
        @Override
-       public void onSessionUp(final BGPSession session) {
+       public synchronized void onSessionUp(final BGPSession session) {
                LOG.info("Session with peer {} went up with tables: {}", this.name, session.getAdvertisedTableTypes());
 
+               this.session = session;
+               this.comparator = new BGPObjectComparator(rib.getLocalAs(), rib.getBgpIdentifier(), session.getBgpId());
+
                for (final BgpTableType t : session.getAdvertisedTableTypes()) {
-                       this.tables.add(new TablesKey(t.getAfi(), t.getSafi()));
-               }
-               this.rib.initTables(session.getBgpId());
+                       final TablesKey key = new TablesKey(t.getAfi(), t.getSafi());
 
+                       this.tables.add(key);
+                       this.rib.initTable(this, key);
+               }
        }
 
-       private void cleanup() {
+       private synchronized void cleanup() {
                // FIXME: BUG-196: support graceful restart
                for (final TablesKey key : this.tables) {
                        this.rib.clearTable(this, key);
                }
 
                this.tables.clear();
+               this.session = null;
+               this.comparator = null;
        }
 
        @Override
@@ -91,4 +126,14 @@ public final class BGPPeer implements BGPSessionListener, Peer {
                toStringHelper.add("tables", this.tables);
                return toStringHelper;
        }
+
+       @Override
+       public String getName() {
+               return name;
+       }
+
+       @Override
+       public Comparator<PathAttributes> getComparator() {
+               return this.comparator;
+       }
 }
index 03d93298fb3526bbf87174765cf659ea3adea253..bb8c297969b0f1e7c6e6f9c95e1e9aa86f051f7d 100644 (file)
@@ -7,14 +7,11 @@
  */
 package org.opendaylight.protocol.bgp.rib.impl;
 
-import java.util.Comparator;
-
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.protocol.bgp.rib.RibReference;
 import org.opendaylight.protocol.bgp.rib.spi.AbstractAdjRIBsIn;
 import org.opendaylight.protocol.bgp.rib.spi.Peer;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.PathAttributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.destination.destination.type.DestinationIpv4Case;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpReachNlri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpUnreachNlri;
@@ -28,8 +25,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 final class Ipv4AdjRIBsIn extends AbstractAdjRIBsIn<Ipv4Prefix, Ipv4Route> {
-       Ipv4AdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final Comparator<PathAttributes> comparator, final TablesKey key) {
-               super(trans, rib, comparator, key);
+       Ipv4AdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) {
+               super(trans, rib, key);
        }
 
        @Override
index 5bcf66ae75e48cbd6e2427ce74de5a1b49b46eed..d4cb89574f0aaa476e525b954f154d200c153a13 100644 (file)
@@ -7,14 +7,11 @@
  */
 package org.opendaylight.protocol.bgp.rib.impl;
 
-import java.util.Comparator;
-
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.protocol.bgp.rib.RibReference;
 import org.opendaylight.protocol.bgp.rib.spi.AbstractAdjRIBsIn;
 import org.opendaylight.protocol.bgp.rib.spi.Peer;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.PathAttributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.destination.destination.type.destination.ipv6._case.DestinationIpv6;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpReachNlri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpUnreachNlri;
@@ -28,8 +25,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 final class Ipv6AdjRIBsIn extends AbstractAdjRIBsIn<Ipv6Prefix, Ipv6Route> {
-       Ipv6AdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final Comparator<PathAttributes> comparator, final TablesKey key) {
-               super(trans, rib, comparator, key);
+       Ipv6AdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) {
+               super(trans, rib, key);
        }
 
        @Override
index b362cd4744295dc5fbe9aa111d374779d062c702..06af32c604e7d9e0531518807a95832c53b5054f 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.protocol.bgp.rib.impl;
 
-import java.util.Comparator;
 import java.util.List;
 
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
@@ -16,7 +15,6 @@ import org.opendaylight.protocol.bgp.rib.spi.AbstractRIBExtensionProviderActivat
 import org.opendaylight.protocol.bgp.rib.spi.AdjRIBsIn;
 import org.opendaylight.protocol.bgp.rib.spi.AdjRIBsInFactory;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.PathAttributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
@@ -31,14 +29,14 @@ public final class RIBActivator extends AbstractRIBExtensionProviderActivator {
                return Lists.newArrayList(
                                context.registerAdjRIBsInFactory(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, new AdjRIBsInFactory() {
                                        @Override
-                                       public AdjRIBsIn createAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final Comparator<PathAttributes> comparator, final TablesKey key) {
-                                               return new Ipv4AdjRIBsIn(trans, rib, comparator, key);
+                                       public AdjRIBsIn createAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) {
+                                               return new Ipv4AdjRIBsIn(trans, rib, key);
                                        }
                                }),
                                context.registerAdjRIBsInFactory(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class, new AdjRIBsInFactory() {
                                        @Override
-                                       public AdjRIBsIn createAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final Comparator<PathAttributes> comparator, final TablesKey key) {
-                                               return new Ipv6AdjRIBsIn(trans, rib, comparator, key);
+                                       public AdjRIBsIn createAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) {
+                                               return new Ipv6AdjRIBsIn(trans, rib, key);
                                        }
                                }));
        }
index 7fe05b385ccf77bdbdda00bb4b77cffddcb160bf..c99241b67818ac40b022dec70d2e40134bc4f00d 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.protocol.bgp.rib.impl;
 
 import java.util.Collections;
+import java.util.List;
 import java.util.concurrent.ExecutionException;
 
 import javax.annotation.concurrent.ThreadSafe;
@@ -16,14 +17,21 @@ import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
 import org.opendaylight.protocol.bgp.rib.DefaultRibReference;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
+import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
 import org.opendaylight.protocol.bgp.rib.spi.AdjRIBsIn;
+import org.opendaylight.protocol.bgp.rib.spi.Peer;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
+import org.opendaylight.protocol.framework.ReconnectStrategy;
+import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Update;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.UpdateBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.Nlri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.WithdrawnRoutes;
+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.PathAttributes1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes2;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.destination.destination.type.DestinationIpv4CaseBuilder;
@@ -52,39 +60,57 @@ import org.slf4j.LoggerFactory;
 import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.JdkFutureAdapters;
 
 @ThreadSafe
-public class RIBImpl extends DefaultRibReference implements AutoCloseable {
+public final class RIBImpl extends DefaultRibReference implements AutoCloseable, RIB {
        private static final Logger LOG = LoggerFactory.getLogger(RIBImpl.class);
        private static final Update EOR = new UpdateBuilder().build();
+       private static final TablesKey IPV4_UNICAST_TABLE = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
+       private final ReconnectStrategyFactory tcpStrategyFactory;
+       private final ReconnectStrategy sessionStrategy;
+       private final BGPDispatcher dispatcher;
        private final DataProviderService dps;
-       private RIBTables tables;
-       private final RIBExtensionConsumerContext extensions;
        private final AsNumber localAs;
-       private final byte[] localBgpId;
+       private final Ipv4Address bgpIdentifier;
+       private final List<BgpTableType> localTables;
+       private final RIBTables tables;
 
-       public RIBImpl(final RibId ribId, final AsNumber localAs, final byte[] localBgpId, final RIBExtensionConsumerContext extensions,
-                       final DataProviderService dps) {
+       public RIBImpl(final RibId ribId, final AsNumber localAs, final Ipv4Address localBgpId, final RIBExtensionConsumerContext extensions,
+                       final BGPDispatcher dispatcher, final ReconnectStrategyFactory tcpStrategyFactory, final ReconnectStrategy sessionStrategy,
+                       final DataProviderService dps, final List<BgpTableType> localTables) {
                super(InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(Preconditions.checkNotNull(ribId))).toInstance());
                this.dps = Preconditions.checkNotNull(dps);
-               this.extensions = extensions;
                this.localAs = Preconditions.checkNotNull(localAs);
-               this.localBgpId = localBgpId;
+               this.bgpIdentifier = Preconditions.checkNotNull(localBgpId);
+               this.dispatcher = Preconditions.checkNotNull(dispatcher);
+               this.sessionStrategy = Preconditions.checkNotNull(sessionStrategy);
+               this.tcpStrategyFactory = Preconditions.checkNotNull(tcpStrategyFactory);
+               this.localTables = ImmutableList.copyOf(localTables);
+               this.tables = new RIBTables(extensions);
 
                LOG.debug("Instantiating RIB table {} at {}", ribId, getInstanceIdentifier());
 
-               final DataModificationTransaction t = dps.beginTransaction();
-               final Object o = t.readOperationalData(getInstanceIdentifier());
+               final DataModificationTransaction trans = dps.beginTransaction();
+               final Object o = trans.readOperationalData(getInstanceIdentifier());
                Preconditions.checkState(o == null, "Data provider conflict detected on object {}", getInstanceIdentifier());
 
-               t.putOperationalData(
+               trans.putOperationalData(
                                getInstanceIdentifier(),
                                new RibBuilder().setKey(new RibKey(ribId)).setId(ribId).setLocRib(
                                                new LocRibBuilder().setTables(Collections.<Tables> emptyList()).build()).build());
-               Futures.addCallback(JdkFutureAdapters.listenInPoolThread(t.commit()), new FutureCallback<RpcResult<TransactionStatus>>() {
+
+               for (BgpTableType t : localTables) {
+                       final TablesKey key = new TablesKey(t.getAfi(), t.getSafi());
+                       if (tables.create(trans, this, key) == null) {
+                               LOG.debug("Did not create local table for unhandled table type {}", t);
+                       }
+               }
+
+               Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback<RpcResult<TransactionStatus>>() {
                        @Override
                        public void onSuccess(final RpcResult<TransactionStatus> result) {
                                LOG.trace("Change committed successfully");
@@ -98,17 +124,16 @@ public class RIBImpl extends DefaultRibReference implements AutoCloseable {
        }
 
        synchronized void initTables(final byte[] remoteBgpId) {
-               this.tables = new RIBTables(new BGPObjectComparator(this.localAs, this.localBgpId, remoteBgpId), this.extensions);
        }
 
-       synchronized void updateTables(final BGPPeer peer, final Update message) {
+       @Override
+       public synchronized void updateTables(final Peer peer, final Update message) {
                final DataModificationTransaction trans = this.dps.beginTransaction();
 
                if (!EOR.equals(message)) {
                        final WithdrawnRoutes wr = message.getWithdrawnRoutes();
                        if (wr != null) {
-                               final AdjRIBsIn ari = this.tables.getOrCreate(trans, this,
-                                               new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class));
+                               final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE);
                                if (ari != null) {
                                        ari.removeRoutes(
                                                        trans,
@@ -128,7 +153,7 @@ public class RIBImpl extends DefaultRibReference implements AutoCloseable {
                                if (mpu != null) {
                                        final MpUnreachNlri nlri = mpu.getMpUnreachNlri();
 
-                                       final AdjRIBsIn ari = this.tables.getOrCreate(trans, this, new TablesKey(nlri.getAfi(), nlri.getSafi()));
+                                       final AdjRIBsIn ari = this.tables.get(new TablesKey(nlri.getAfi(), nlri.getSafi()));
                                        if (ari != null) {
                                                ari.removeRoutes(trans, peer, nlri);
                                        } else {
@@ -139,8 +164,7 @@ public class RIBImpl extends DefaultRibReference implements AutoCloseable {
 
                        final Nlri ar = message.getNlri();
                        if (ar != null) {
-                               final AdjRIBsIn ari = this.tables.getOrCreate(trans, this,
-                                               new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class));
+                               final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE);
                                if (ari != null) {
                                        final MpReachNlriBuilder b = new MpReachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).setAdvertizedRoutes(
                                                        new AdvertizedRoutesBuilder().setDestinationType(
@@ -161,7 +185,7 @@ public class RIBImpl extends DefaultRibReference implements AutoCloseable {
                                if (mpr != null) {
                                        final MpReachNlri nlri = mpr.getMpReachNlri();
 
-                                       final AdjRIBsIn ari = this.tables.getOrCreate(trans, this, new TablesKey(nlri.getAfi(), nlri.getSafi()));
+                                       final AdjRIBsIn ari = this.tables.get(new TablesKey(nlri.getAfi(), nlri.getSafi()));
                                        if (ari != null) {
                                                if (message.equals(ari.endOfRib())) {
                                                        ari.markUptodate(trans, peer);
@@ -174,8 +198,7 @@ public class RIBImpl extends DefaultRibReference implements AutoCloseable {
                                }
                        }
                } else {
-                       final AdjRIBsIn ari = this.tables.getOrCreate(trans, this,
-                                       new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class));
+                       final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE);
                        if (ari != null) {
                                ari.markUptodate(trans, peer);
                        } else {
@@ -196,7 +219,8 @@ public class RIBImpl extends DefaultRibReference implements AutoCloseable {
                });
        }
 
-       synchronized void clearTable(final BGPPeer peer, final TablesKey key) {
+       @Override
+       public synchronized void clearTable(final Peer peer, final TablesKey key) {
                final AdjRIBsIn ari = this.tables.get(key);
                if (ari != null) {
                        final DataModificationTransaction trans = this.dps.beginTransaction();
@@ -231,4 +255,39 @@ public class RIBImpl extends DefaultRibReference implements AutoCloseable {
                t.removeOperationalData(getInstanceIdentifier());
                t.commit().get();
        }
+
+       @Override
+       public AsNumber getLocalAs() {
+               return localAs;
+       }
+
+       @Override
+       public Ipv4Address getBgpIdentifier() {
+               return bgpIdentifier;
+       }
+
+       @Override
+       public List<? extends BgpTableType> getLocalTables() {
+               return localTables;
+       }
+
+       @Override
+       public ReconnectStrategyFactory getTcpStrategyFactory() {
+               return tcpStrategyFactory;
+       }
+
+       @Override
+       public ReconnectStrategy getSessionStrategy() {
+               return sessionStrategy;
+       }
+
+       @Override
+       public BGPDispatcher getDispatcher() {
+               return dispatcher;
+       }
+
+       @Override
+       public void initTable(final Peer bgpPeer, final TablesKey key) {
+               // FIXME: BUG-196: support graceful restart
+       }
 }
index 8c13e64db61cde8ee345c3950ea0d4cfc3767a39..e4ad31575c1a7b3084e3e2601ca5a8f7975ee603 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.protocol.bgp.rib.impl;
 
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -16,7 +15,6 @@ import org.opendaylight.protocol.bgp.rib.RibReference;
 import org.opendaylight.protocol.bgp.rib.spi.AdjRIBsIn;
 import org.opendaylight.protocol.bgp.rib.spi.AdjRIBsInFactory;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.PathAttributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -28,22 +26,22 @@ final class RIBTables {
        private static final Logger LOG = LoggerFactory.getLogger(RIBTables.class);
 
        private final Map<TablesKey, AdjRIBsIn> tables = new HashMap<>();
-       private final Comparator<PathAttributes> comparator;
        private final RIBExtensionConsumerContext registry;
 
-       RIBTables(final Comparator<PathAttributes> comparator, final RIBExtensionConsumerContext extensions) {
-               this.comparator = Preconditions.checkNotNull(comparator);
+       RIBTables(final RIBExtensionConsumerContext extensions) {
                this.registry = Preconditions.checkNotNull(extensions);
        }
 
        public synchronized AdjRIBsIn get(final TablesKey key) {
-               return this.tables.get(key);
+               LOG.debug("Looking for key {} in tables {}", key, this.tables);
+               final AdjRIBsIn ret = this.tables.get(key);
+               LOG.trace("Key found {}", ret);
+               return ret;
        }
 
-       public synchronized AdjRIBsIn getOrCreate(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) {
-               LOG.debug("Looking for key {} in tables {}", key, this.tables);
+       public synchronized AdjRIBsIn create(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) {
                if (this.tables.containsKey(key)) {
-                       LOG.trace("Key found {}.", this.tables.get(key));
+                       LOG.warn("Duplicate create request for key {}", key);
                        return this.tables.get(key);
                }
 
@@ -53,7 +51,7 @@ final class RIBTables {
                        return null;
                }
 
-               final AdjRIBsIn table = Preconditions.checkNotNull(f.createAdjRIBsIn(trans, rib, this.comparator, key));
+               final AdjRIBsIn table = Preconditions.checkNotNull(f.createAdjRIBsIn(trans, rib, key));
                LOG.debug("Table {} created for key {}", table, key);
                this.tables.put(key, table);
                return table;
index 53e84d4ca9f921de576fd7b842b3b0fe1d909dc9..4a240f28eb16b264eaf7f8cb7f57ff2d5ceba76a 100644 (file)
@@ -29,7 +29,10 @@ public final class BGPSessionPreferences {
        /**
         * Creates a new DTO for Open message.
         * 
-        * @param prefs BGP Open message
+        * @param as local AS number
+        * @param hold preferred hold timer value, in seconds
+        * @param bgpId local BGP Identifier
+        * @param param advertized parameters
         */
        public BGPSessionPreferences(final AsNumber as, final int hold, final Ipv4Address bgpId, final List<BgpParameters> params) {
                this.as = as;
diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java
new file mode 100644 (file)
index 0000000..1042a28
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2013 Cisco 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
+ */
+package org.opendaylight.protocol.bgp.rib.impl.spi;
+
+import java.util.List;
+
+import org.opendaylight.protocol.bgp.rib.spi.Peer;
+import org.opendaylight.protocol.framework.ReconnectStrategy;
+import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.Update;
+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.rib.rev130925.rib.TablesKey;
+
+/**
+ * Internal reference to a RIB instance.
+ */
+public interface RIB {
+       AsNumber getLocalAs();
+       Ipv4Address getBgpIdentifier();
+       List<? extends BgpTableType> getLocalTables();
+
+       void initTable(Peer bgpPeer, TablesKey key);
+       void clearTable(Peer bgpPeer, TablesKey key);
+       void updateTables(Peer bgpPeer, Update message);
+
+       BGPDispatcher getDispatcher();
+       ReconnectStrategyFactory getTcpStrategyFactory();
+       ReconnectStrategy getSessionStrategy();
+}
diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BGPImplTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BGPImplTest.java
deleted file mode 100644 (file)
index 5d4ffeb..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2013 Cisco 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
- */
-package org.opendaylight.protocol.bgp.rib.impl;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.doReturn;
-import io.netty.util.concurrent.Future;
-import io.netty.util.concurrent.GlobalEventExecutor;
-
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.util.Collections;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionProposal;
-import org.opendaylight.protocol.framework.NeverReconnectStrategy;
-import org.opendaylight.protocol.framework.ReconnectStrategy;
-import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-
-public class BGPImplTest {
-
-       @Mock
-       private BGPDispatcher disp;
-
-       @Mock
-       private BGPSessionProposal prop;
-
-       @Mock
-       private Future<Void> future;
-
-       private BGPImpl bgp;
-
-       @Before
-       public void setUp() throws Exception {
-               MockitoAnnotations.initMocks(this);
-               doReturn(this.future).when(this.disp).createReconnectingClient(any(InetSocketAddress.class), any(BGPSessionPreferences.class),
-                               any(BGPSessionListener.class), any(ReconnectStrategyFactory.class), any(ReconnectStrategy.class));
-       }
-
-       @Test
-       public void testBgpImpl() throws Exception {
-               doReturn(new BGPSessionPreferences(new AsNumber(0L), 0, null, Collections.<BgpParameters> emptyList())).when(this.prop).getProposal();
-               this.bgp = new BGPImpl(this.disp, new InetSocketAddress(InetAddress.getLoopbackAddress(), 2000), this.prop);
-               final ListenerRegistration<?> reg = this.bgp.registerUpdateListener(new SimpleSessionListener(), new ReconnectStrategyFactory() {
-                       @Override
-                       public ReconnectStrategy createReconnectStrategy() {
-                               return new NeverReconnectStrategy(GlobalEventExecutor.INSTANCE, 5000);
-                       }
-               }, new NeverReconnectStrategy(GlobalEventExecutor.INSTANCE, 5000));
-               assertEquals(SimpleSessionListener.class, reg.getInstance().getClass());
-       }
-
-       @After
-       public void tearDown() {
-               this.bgp.close();
-       }
-}
index 92f6208ceb07e03a4372857c48681754136f8525..8d47aa45b3452dd708327a96696b163e5553c898 100644 (file)
@@ -41,7 +41,7 @@ import com.google.common.collect.Lists;
  */
 public class BestPathSelectionTest {
 
-       private final BGPObjectComparator comparator = new BGPObjectComparator(new AsNumber(40L), new byte[] { (byte) 192, (byte) 150, 20, 38 }, new byte[] {
+       private final BGPObjectComparator comparator = new BGPObjectComparator(new AsNumber(40L), new Ipv4Address("192.150.20.38"), new byte[] {
                (byte) 192, (byte) 150, 20, 38 });
 
        private PathAttributes attr1;
index e5c69d2a2509d7d1b2b056a6e2e78b9fc56b2e90..06aa42765ecfadf73d4485ba2a16b47cbee040d0 100644 (file)
@@ -20,9 +20,6 @@ import org.opendaylight.protocol.bgp.parser.BGPError;
 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
 import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
 import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry;
-import org.opendaylight.protocol.bgp.rib.impl.BGP;
-import org.opendaylight.protocol.framework.ReconnectStrategy;
-import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.NotifyBuilder;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
@@ -34,12 +31,11 @@ import com.google.common.collect.Lists;
 import com.google.common.eventbus.EventBus;
 
 /**
- * 
- * Mock implementation of {@link BGP}.
- * 
+ * Mock BGP session. It provides a way how to route a set of messages to
+ * BGPSessionListener.
  */
 @ThreadSafe
-public final class BGPMock implements BGP, Closeable {
+public final class BGPMock implements Closeable {
 
        private static final Logger LOG = LoggerFactory.getLogger(BGPMock.class);
 
@@ -84,7 +80,8 @@ public final class BGPMock implements BGP, Closeable {
                }
        }
 
-       private synchronized void insertMessage(final Notification message) {
+       @GuardedBy("this")
+       private void insertMessage(final Notification message) {
                this.allPreviousBGPMessages.add(message);
                this.eventBus.post(message);
        }
@@ -116,11 +113,7 @@ public final class BGPMock implements BGP, Closeable {
                return this.eventBus;
        }
 
-       @Override
-       public ListenerRegistration<BGPSessionListener> registerUpdateListener(
-                       final BGPSessionListener listener,
-                       final ReconnectStrategyFactory tcpStrategyFactory,
-                       final ReconnectStrategy sessionStrategy) {
+       public ListenerRegistration<BGPSessionListener> registerUpdateListener(final BGPSessionListener listener) {
                return EventBusRegistration.createAndRegister(this.eventBus, listener, this.allPreviousBGPMessages);
        }
 }
index 259c9c22737a66868c3e1d349874f507a486a265..06b613c6eae031abd8ac19ed4f4491abcce12932 100644 (file)
@@ -93,10 +93,10 @@ public abstract class AbstractAdjRIBsIn<I, D extends DataObject> implements AdjR
                        return this.name;
                }
 
-               private RIBEntryData<I, D> findCandidate(final RIBEntryData<I, D> initial) {
+               private RIBEntryData<I, D> findCandidate(final RIBEntryData<I, D> initial, final Comparator<PathAttributes> comparator) {
                        RIBEntryData<I, D> newState = initial;
                        for (final RIBEntryData<I, D> s : this.candidates.values()) {
-                               if (newState == null || AbstractAdjRIBsIn.this.comparator.compare(newState.attributes, s.attributes) > 0) {
+                               if (newState == null || comparator.compare(newState.attributes, s.attributes) > 0) {
                                        newState = s;
                                }
                        }
@@ -118,7 +118,7 @@ public abstract class AbstractAdjRIBsIn<I, D extends DataObject> implements AdjR
                        final RIBEntryData<I, D> data = this.candidates.remove(peer);
                        LOG.trace("Removed data {}", data);
 
-                       final RIBEntryData<I, D> candidate = findCandidate(null);
+                       final RIBEntryData<I, D> candidate = findCandidate(null, peer.getComparator());
                        if (candidate != null) {
                                electCandidate(transaction, candidate);
                        } else {
@@ -131,12 +131,11 @@ public abstract class AbstractAdjRIBsIn<I, D extends DataObject> implements AdjR
 
                synchronized void setState(final DataModificationTransaction transaction, final Peer peer, final RIBEntryData<I, D> state) {
                        this.candidates.put(Preconditions.checkNotNull(peer), Preconditions.checkNotNull(state));
-                       electCandidate(transaction, findCandidate(state));
+                       electCandidate(transaction, findCandidate(state, peer.getComparator()));
                }
        }
 
        private static final Logger LOG = LoggerFactory.getLogger(AbstractAdjRIBsIn.class);
-       private final Comparator<PathAttributes> comparator;
        private final InstanceIdentifier<Tables> basePath;
        private final Update eor;
 
@@ -146,9 +145,7 @@ public abstract class AbstractAdjRIBsIn<I, D extends DataObject> implements AdjR
        @GuardedBy("this")
        private final Map<Peer, Boolean> peers = new HashMap<>();
 
-       protected AbstractAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib,
-                       final Comparator<PathAttributes> comparator, final TablesKey key) {
-               this.comparator = Preconditions.checkNotNull(comparator);
+       protected AbstractAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) {
                this.basePath = InstanceIdentifier.builder(rib.getInstanceIdentifier()).child(LocRib.class).child(Tables.class, key).toInstance();
 
                this.eor = new UpdateBuilder().setPathAttributes(
index f89c3b148c96461e2de4354119d853a2a5388f42..b896e86f012bacdd4691d37b02323e66d2d50403 100644 (file)
@@ -7,13 +7,10 @@
  */
 package org.opendaylight.protocol.bgp.rib.spi;
 
-import java.util.Comparator;
-
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.protocol.bgp.rib.RibReference;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.PathAttributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
 
 public interface AdjRIBsInFactory {
-       AdjRIBsIn createAdjRIBsIn(DataModificationTransaction trans, final RibReference rib, Comparator<PathAttributes> comparator, TablesKey key);
+       AdjRIBsIn createAdjRIBsIn(DataModificationTransaction trans, final RibReference rib, TablesKey key);
 }
index 7e4d769115f879a348a8a97b8bcae80a827f072f..434c0f04431c8bc245004ad3079523b12286a17e 100644 (file)
@@ -7,9 +7,25 @@
  */
 package org.opendaylight.protocol.bgp.rib.spi;
 
+import java.util.Comparator;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.PathAttributes;
+
 /**
  * Marker interface identifying a BGP peer.
  */
 public interface Peer {
+       /**
+        * Return peer's symbolic name.
+        * 
+        * @return symbolic name.
+        */
+       String getName();
 
+       /**
+        * Return the peer's attached path attribute comparator.
+        * 
+        * @return Path attribute comparator, as viewed from the peer.
+        */
+       Comparator<PathAttributes> getComparator();
 }
index 3a8711788b8459a9decb5f09ae95814f4b3d494b..c10ac683d3aaa99294fbb539ff13e40e1866c4c4 100644 (file)
         <maven>3.0.4</maven>
     </prerequisites>
 
-    <dependencies>
-        <dependency>
-            <groupId>org.opendaylight.controller</groupId>
-            <artifactId>config-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>bgp-rib-impl</artifactId>
-        </dependency>
-    </dependencies>
-
     <build>
         <plugins>
-            <plugin>
-                <groupId>org.opendaylight.yangtools</groupId>
-                <artifactId>yang-maven-plugin</artifactId>
-            </plugin>
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
diff --git a/bgp/update-api-config/src/main/yang/bgp-listener.yang b/bgp/update-api-config/src/main/yang/bgp-listener.yang
deleted file mode 100644 (file)
index 7cb8f27..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-// vi: set smarttab et sw=4 tabstop=4:
-module bgp-listener {
-    yang-version 1;
-    namespace "urn:opendaylight:params:xml:ns:yang:controller:bgp:listener";
-    prefix "bgpl";
-
-    import config { prefix config; revision-date 2013-04-05; }
-
-    organization "Cisco Systems, Inc.";
-
-    contact "Robert Varga <rovarga@cisco.com>";
-
-    description
-        "This module contains the base YANG definitions for
-         BGP listener service.
-
-        Copyright (c)2013 Cisco Systems, Inc. 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";
-
-    revision "2013-04-09" {
-        description
-            "Initial revision";
-    }
-
-    identity listener {
-        description
-            "Service representing a BGP service. Each instance allows
-             registration of listeners. Each listener has its own BGP session.
-             Events happening on the session are routed to the listener.";
-
-        base "config:service-type";
-        config:java-class "org.opendaylight.protocol.bgp.rib.impl.BGP";
-    }
-}
-
index 1a1f5f4a9cc0da6b3bcbf47efeaf10933dd64b49..0c06a4cfbf427e22e32db7a137464d833335f22e 100644 (file)
@@ -7,6 +7,9 @@
  */
 package org.opendaylight.protocol.integration.bgp;
 
+import io.netty.util.concurrent.GlobalEventExecutor;
+
+import java.net.InetSocketAddress;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -17,6 +20,7 @@ import java.util.concurrent.TimeoutException;
 
 import javax.annotation.Nullable;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Matchers;
@@ -28,18 +32,30 @@ import org.mockito.stubbing.Answer;
 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
+import org.opendaylight.protocol.bgp.parser.BGPSessionListener;
+import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
 import org.opendaylight.protocol.bgp.parser.spi.pojo.ServiceLoaderBGPExtensionProviderContext;
 import org.opendaylight.protocol.bgp.rib.impl.BGPPeer;
 import org.opendaylight.protocol.bgp.rib.impl.RIBActivator;
 import org.opendaylight.protocol.bgp.rib.impl.RIBImpl;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
 import org.opendaylight.protocol.bgp.rib.mock.BGPMock;
+import org.opendaylight.protocol.bgp.rib.spi.AbstractRIBExtensionProviderActivator;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext;
 import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext;
 import org.opendaylight.protocol.bgp.util.HexDumpBGPFileParser;
 import org.opendaylight.protocol.framework.ReconnectStrategy;
 import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateAddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily;
+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.rib.rev130925.RibId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcResult;
@@ -48,6 +64,7 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Function;
 import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.eventbus.EventBus;
 
@@ -58,6 +75,8 @@ public class ParserToSalTest {
        private final String hex_messages = "/bgp_hex.txt";
 
        private BGPMock mock;
+       private AbstractRIBExtensionProviderActivator baseact, lsact;
+       private RIBExtensionProviderContext ext;
 
        @Mock
        DataModificationTransaction mockedTransaction;
@@ -65,6 +84,15 @@ public class ParserToSalTest {
        @Mock
        DataProviderService providerService;
 
+       @Mock
+       BGPDispatcher dispatcher;
+
+       @Mock
+       ReconnectStrategyFactory tcpStrategyFactory;
+
+       @Mock
+       ReconnectStrategy sessionStrategy;
+
        @Before
        public void setUp() throws Exception {
                MockitoAnnotations.initMocks(this);
@@ -101,7 +129,7 @@ public class ParserToSalTest {
 
                        @Override
                        public RpcResult<TransactionStatus> get(final long timeout, final TimeUnit unit) throws InterruptedException,
-                                       ExecutionException, TimeoutException {
+                       ExecutionException, TimeoutException {
                                return null;
                        }
                }).when(this.mockedTransaction).commit();
@@ -129,27 +157,55 @@ public class ParserToSalTest {
                        }
 
                }).when(this.mockedTransaction).readOperationalData(Matchers.any(InstanceIdentifier.class));
+
+               Mockito.doReturn(GlobalEventExecutor.INSTANCE.newSucceededFuture(null)).when(dispatcher).
+               createReconnectingClient(Mockito.any(InetSocketAddress.class), Mockito.any(BGPSessionPreferences.class),
+                               Mockito.any(BGPSessionListener.class), Mockito.eq(tcpStrategyFactory), Mockito.eq(sessionStrategy));
+
+               ext = new SimpleRIBExtensionProviderContext();
+               baseact = new RIBActivator();
+               lsact = new org.opendaylight.protocol.bgp.linkstate.RIBActivator();
+
+               baseact.startRIBExtensionProvider(ext);
+               lsact.startRIBExtensionProvider(ext);
        }
 
-       @Test
-       public void test() {
-               final RIBExtensionProviderContext ext = new SimpleRIBExtensionProviderContext();
-               new RIBActivator().startRIBExtensionProvider(ext);
-               new org.opendaylight.protocol.bgp.linkstate.RIBActivator().startRIBExtensionProvider(ext);
-               final RIBImpl rib = new RIBImpl(new RibId("testRib"), new AsNumber(72L), new byte[] { (byte) 127, 0, 0, 1 }, ext, this.providerService);
-               final BGPPeer peer = new BGPPeer(rib, "peer-" + this.mock.toString());
-
-               this.mock.registerUpdateListener(peer, new ReconnectStrategyFactory() {
-                       @Override
-                       public ReconnectStrategy createReconnectStrategy() {
-                               return null;
-                       }
-               }, null);
+       @After
+       public void tearDown() {
+               lsact.close();
+               baseact.close();
+       }
+
+       private void runTestWithTables(final List<BgpTableType> tables) {
+               final RIBImpl rib = new RIBImpl(new RibId("testRib"), new AsNumber(72L), new Ipv4Address("127.0.0.1"), ext,
+                               this.dispatcher, this.tcpStrategyFactory, this.sessionStrategy, this.providerService, tables);
+               final BGPPeer peer = new BGPPeer("peer-" + this.mock.toString(), null, null, rib);
+
+               ListenerRegistration<?> reg = this.mock.registerUpdateListener(peer);
+               reg.close();
+
                Mockito.verify(this.mockedTransaction, Mockito.times(31)).commit();
+       }
+
+       @Test
+       public void testWithLinkstate() {
+               runTestWithTables(ImmutableList.of(
+                               (BgpTableType) new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class),
+                               new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)));
+
                Mockito.verify(this.mockedTransaction, Mockito.times(81)).putOperationalData(Matchers.any(InstanceIdentifier.class),
                                Matchers.any(DataObject.class));
        }
 
+       @Test
+       public void testWithoutLinkstate() {
+               runTestWithTables(ImmutableList.of(
+                               (BgpTableType) new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)));
+
+               Mockito.verify(this.mockedTransaction, Mockito.times(27)).putOperationalData(Matchers.any(InstanceIdentifier.class),
+                               Matchers.any(DataObject.class));
+       }
+
        private Collection<byte[]> fixMessages(final Collection<byte[]> bgpMessages) {
                return Collections2.transform(bgpMessages, new Function<byte[], byte[]>() {