Bug 6675: add missing cluster-id configuration knob
[bgpcep.git] / bgp / openconfig-impl / src / main / java / org / opendaylight / protocol / bgp / openconfig / impl / BGPOpenConfigMappingServiceImpl.java
index ccf252a85f5af22375c7b3a4d47d3567058e1a04..629e4c7188f7996e75ea7529f282611c80196035 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.protocol.bgp.openconfig.impl;
 
 import static org.opendaylight.protocol.bgp.openconfig.impl.util.OpenConfigUtil.APPLICATION_PEER_GROUP_NAME;
+import static org.opendaylight.protocol.bgp.openconfig.impl.util.OpenConfigUtil.toPeerType;
 
 import com.google.common.base.Optional;
 import java.math.BigDecimal;
@@ -24,6 +25,7 @@ import org.opendaylight.protocol.bgp.mode.impl.add.n.paths.AddPathBestNPathSelec
 import org.opendaylight.protocol.bgp.openconfig.impl.util.OpenConfigUtil;
 import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigMappingService;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.BgpNeighborAddPathsConfig;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.AfiSafisBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.ConfigBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflectorBuilder;
@@ -42,13 +44,15 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.t
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.NeighborsBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.PeerGroups;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.PeerGroupsBuilder;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.PeerType;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.CommunityType;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.RrClusterIdType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.SendReceive;
@@ -56,8 +60,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamiliesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config2;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config2Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.GlobalConfigAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.GlobalConfigAugmentationBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.ApplicationRibId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.SimpleRoutingPolicy;
@@ -71,6 +80,8 @@ public final class BGPOpenConfigMappingServiceImpl implements BGPOpenConfigMappi
     private static final PeerGroup APP_PEER_GROUP = new PeerGroupBuilder().setPeerGroupName(APPLICATION_PEER_GROUP_NAME)
             .setKey(new PeerGroupKey(APPLICATION_PEER_GROUP_NAME)).build();
     private static final PeerGroups PEER_GROUPS = new PeerGroupsBuilder().setPeerGroup(Collections.singletonList(APP_PEER_GROUP)).build();
+    private static final BigDecimal DEFAULT_KEEP_ALIVE = BigDecimal.valueOf(30);
+    private static final BigDecimal DEFAULT_MINIMUM_ADV_INTERVAL = BigDecimal.valueOf(30);
 
     @Override
     public List<BgpTableType> toTableTypes(final List<AfiSafi> afiSafis) {
@@ -85,10 +96,10 @@ public final class BGPOpenConfigMappingServiceImpl implements BGPOpenConfigMappi
     public Map<BgpTableType, PathSelectionMode> toPathSelectionMode(final List<AfiSafi> afiSafis) {
         final Map<BgpTableType, PathSelectionMode> pathSelectionModes = new HashMap<>();
         for (final AfiSafi afiSafi : afiSafis) {
-            final AfiSafi1 afiSafi1 = afiSafi.getAugmentation(AfiSafi1.class);
+            final BgpNeighborAddPathsConfig afiSafi2 = afiSafi.getAugmentation(AfiSafi2.class);
             final Optional<BgpTableType> bgpTableType = OpenConfigUtil.toBgpTableType(afiSafi.getAfiSafiName());
-            if (afiSafi1 != null && bgpTableType.isPresent()) {
-                final Short sendMax = afiSafi1.getSendMax();
+            if (afiSafi2 != null && bgpTableType.isPresent()) {
+                final Short sendMax = afiSafi2.getSendMax();
                 final PathSelectionMode selectionMode;
                 if (sendMax > 1) {
                     selectionMode = new AddPathBestNPathSelection(sendMax.longValue());
@@ -115,18 +126,18 @@ public final class BGPOpenConfigMappingServiceImpl implements BGPOpenConfigMappi
     public List<AddressFamilies> toAddPathCapability(final List<AfiSafi> afiSafis) {
         final List<AddressFamilies> addPathCapability = new ArrayList<>();
         for (final AfiSafi afiSafi : afiSafis) {
-            final AfiSafi2 afiSafi2 = afiSafi.getAugmentation(AfiSafi2.class);
+            final BgpNeighborAddPathsConfig afiSafi1 = afiSafi.getAugmentation(AfiSafi1.class);
             final Optional<BgpTableType> bgpTableType = OpenConfigUtil.toBgpTableType(afiSafi.getAfiSafiName());
-            if (afiSafi2 != null && bgpTableType.isPresent()) {
+            if (afiSafi1 != null && bgpTableType.isPresent()) {
                 final AddressFamiliesBuilder builder = new AddressFamiliesBuilder(bgpTableType.get());
-                builder.setSendReceive(toSendReceiveMode(afiSafi2));
+                builder.setSendReceive(toSendReceiveMode(afiSafi1));
                 addPathCapability.add(builder.build());
             }
         }
         return addPathCapability;
     }
 
-    private static SendReceive toSendReceiveMode(final AfiSafi2 addPath) {
+    private static SendReceive toSendReceiveMode(final BgpNeighborAddPathsConfig addPath) {
         if (addPath.isReceive() && addPath.getSendMax() != null) {
             return SendReceive.Both;
         }
@@ -154,9 +165,16 @@ public final class BGPOpenConfigMappingServiceImpl implements BGPOpenConfigMappi
         final BgpBuilder bgpBuilder = new BgpBuilder();
         bgpBuilder.setNeighbors(new NeighborsBuilder().build());
         bgpBuilder.setPeerGroups(PEER_GROUPS);
+        final ConfigBuilder configBuilder = new ConfigBuilder();
+        configBuilder.setAs(localAs);
+        configBuilder.setRouterId(bgpId);
+        if (clusterIdentifier != null) {
+            configBuilder.addAugmentation(GlobalConfigAugmentation.class,
+                    new GlobalConfigAugmentationBuilder().setRouteReflectorClusterId(new RrClusterIdType(clusterIdentifier)).build());
+        }
         final Global global = new GlobalBuilder().setAfiSafis(new AfiSafisBuilder().setAfiSafi(OpenConfigUtil.toAfiSafis(localTables,
                 (afiSafi, tableType) -> OpenConfigUtil.toGlobalAfiSafiAddPath(afiSafi, tableType, pathSelectionStrategies))).build())
-                .setConfig(new ConfigBuilder().setAs(localAs).setRouterId(bgpId).build()).build();
+                .setConfig(configBuilder.build()).build();
         bgpBuilder.setGlobal(global);
         return bgpBuilder.build();
     }
@@ -174,17 +192,25 @@ public final class BGPOpenConfigMappingServiceImpl implements BGPOpenConfigMappi
         neighborBuilder.setTransport(new TransportBuilder().setConfig(
                 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.ConfigBuilder()
                 .setPassiveMode(!isActive)
+                .setMtuDiscovery(Boolean.FALSE)
+                .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1.class,
+                        new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1Builder()
+                .setRemotePort(portNumber).build())
                 .build()).build());
         neighborBuilder.setConfig(
                 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder()
                 .setAuthPassword(password != null ? password.getValue() : null)
                 .setPeerAs(remoteAs)
-                .setPeerType(toPeerTye(peerRole))
+                .setPeerType(toPeerType(peerRole))
+                .setSendCommunity(CommunityType.NONE)
+                .setRouteFlapDamping(Boolean.FALSE)
                 .build());
         neighborBuilder.setTimers(new TimersBuilder().setConfig(
                 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.timers.ConfigBuilder()
                 .setHoldTime(BigDecimal.valueOf(holdTimer))
                 .setConnectRetry(BigDecimal.valueOf(retryTimer))
+                .setKeepaliveInterval(DEFAULT_KEEP_ALIVE)
+                .setMinimumAdvertisementInterval(DEFAULT_MINIMUM_ADV_INTERVAL)
                 .build()).build());
         neighborBuilder.setRouteReflector(new RouteReflectorBuilder().setConfig(
                 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.route.reflector.ConfigBuilder()
@@ -192,19 +218,17 @@ public final class BGPOpenConfigMappingServiceImpl implements BGPOpenConfigMappi
         return neighborBuilder.build();
     }
 
-    private static PeerType toPeerTye(final PeerRole peerRole) {
-        switch (peerRole) {
-        case Ibgp:
-        case RrClient:
-            return PeerType.INTERNAL;
-        case Ebgp:
-            return PeerType.EXTERNAL;
-        case Internal:
-            break;
-        default:
-            break;
-        }
-        return null;
+    @Override
+    public Neighbor fromApplicationPeer(final ApplicationRibId applicationRibId, final BgpId bgpId) {
+        final NeighborBuilder neighborBuilder = new NeighborBuilder();
+        neighborBuilder.setNeighborAddress(new IpAddress(new Ipv4Address(bgpId.getValue())));
+        neighborBuilder.setKey(new NeighborKey(neighborBuilder.getNeighborAddress()));
+        neighborBuilder.setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder()
+        .setDescription(applicationRibId.getValue())
+        .addAugmentation(Config2.class, new Config2Builder().setPeerGroup(APPLICATION_PEER_GROUP_NAME).build())
+        .build());
+
+        return neighborBuilder.build();
     }
 
 }