From 556a0f59abc9b09005d40945bc20948d69e4f98e Mon Sep 17 00:00:00 2001 From: Michal Cmarada Date: Tue, 25 Sep 2018 11:15:35 +0200 Subject: Bump ODL dependencies to Fluorine (HONEYCOMB-433) Change-Id: I142ebd2899272feff00abe7d4bae708f093ee3ec Signed-off-by: Michal Cmarada --- .../northbound/bgp/extension/EvpnModule.java | 4 +- .../bgp/extension/EvpnWriterFactory.java | 2 +- .../bgp-extensions/extension-common/pom.xml | 5 ++ .../bgp/extension/AbstractBgpExtensionModule.java | 8 +- .../RIBExtensionConsumerContextProvider.java | 6 +- .../northbound/bgp/extension/InetModule.java | 18 ++--- .../bgp/extension/InetWriterFactory.java | 4 +- .../northbound/bgp/extension/L3VpnV4Module.java | 12 +-- .../bgp/extension/L3VpnV4WriterFactory.java | 2 +- .../northbound/bgp/extension/L3VpnV6Module.java | 12 +-- .../bgp/extension/L3VpnV6WriterFactory.java | 2 +- .../bgp/extension/LabeledUnicastModule.java | 18 ++--- .../bgp/extension/LabeledUnicastWriterFactory.java | 4 +- .../northbound/bgp/extension/LinkstateModule.java | 14 ++-- .../bgp/extension/LinkstateWriterFactory.java | 2 +- infra/northbound/bgp/pom.xml | 5 ++ .../infra/bgp/ApplicationRibWriterFactory.java | 4 +- .../fd/honeycomb/infra/bgp/BgpConfiguration.java | 17 ++++- .../java/io/fd/honeycomb/infra/bgp/BgpModule.java | 2 + .../infra/bgp/BgpPolicyConfiguration.java | 70 ++++++++++++++++++ .../infra/bgp/BgpPolicyConfigurationModule.java | 34 +++++++++ .../io/fd/honeycomb/infra/bgp/BgpRIBProvider.java | 85 +++++++++++----------- .../infra/bgp/BgpReaderFactoryProvider.java | 4 +- .../infra/bgp/neighbors/BgpPeerWriterFactory.java | 10 ++- .../infra/bgp/neighbors/NeighborCustomizer.java | 40 ++++++++-- .../config/bgp-policy.json | 4 + .../bgp/neighbors/NeighborCustomizerTest.java | 67 ++++++++++++----- .../HoneycombNotification2NetconfProvider.java | 8 +- .../netconf/NetconfMdsalMapperProvider.java | 10 +-- .../config/netconf-whitelist.xml | 2 +- infra/northbound/restconf/pom.xml | 20 ++--- .../northbound/restconf/BrokerFacadeProvider.java | 47 ++++++++++++ .../restconf/ControllerContextProvider.java | 38 ++++++++++ .../northbound/restconf/JettyServerProvider.java | 40 ++++++++++ .../restconf/RestconfApplicationProvider.java | 37 ++++++++++ .../northbound/restconf/RestconfModule.java | 12 +++ .../northbound/restconf/RestconfProvider.java | 28 ++----- .../restconf/RestconfServiceProvider.java | 37 ++++++++++ .../StatisticsRestconfServiceWrapperProvider.java | 34 +++++++++ 39 files changed, 592 insertions(+), 176 deletions(-) create mode 100644 infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpPolicyConfiguration.java create mode 100644 infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpPolicyConfigurationModule.java create mode 100644 infra/northbound/bgp/src/main/resources/honeycomb-minimal-resources/config/bgp-policy.json create mode 100644 infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/BrokerFacadeProvider.java create mode 100644 infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/ControllerContextProvider.java create mode 100644 infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfApplicationProvider.java create mode 100644 infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfServiceProvider.java create mode 100644 infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/StatisticsRestconfServiceWrapperProvider.java (limited to 'infra/northbound') diff --git a/infra/northbound/bgp-extensions/evpn/src/main/java/io/fd/honeycomb/northbound/bgp/extension/EvpnModule.java b/infra/northbound/bgp-extensions/evpn/src/main/java/io/fd/honeycomb/northbound/bgp/extension/EvpnModule.java index 7b24b2ff7..4198dc418 100644 --- a/infra/northbound/bgp-extensions/evpn/src/main/java/io/fd/honeycomb/northbound/bgp/extension/EvpnModule.java +++ b/infra/northbound/bgp-extensions/evpn/src/main/java/io/fd/honeycomb/northbound/bgp/extension/EvpnModule.java @@ -29,8 +29,8 @@ import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator; 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.types.rev151009.L2VPNEVPN; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev171213.EvpnSubsequentAddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev171213.L2vpnAddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.EvpnSubsequentAddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.L2vpnAddressFamily; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/infra/northbound/bgp-extensions/evpn/src/main/java/io/fd/honeycomb/northbound/bgp/extension/EvpnWriterFactory.java b/infra/northbound/bgp-extensions/evpn/src/main/java/io/fd/honeycomb/northbound/bgp/extension/EvpnWriterFactory.java index 82567dd26..d6c591603 100644 --- a/infra/northbound/bgp-extensions/evpn/src/main/java/io/fd/honeycomb/northbound/bgp/extension/EvpnWriterFactory.java +++ b/infra/northbound/bgp-extensions/evpn/src/main/java/io/fd/honeycomb/northbound/bgp/extension/EvpnWriterFactory.java @@ -25,7 +25,7 @@ import io.fd.honeycomb.translate.write.WriterFactory; import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder; import javax.annotation.Nonnull; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev171213.evpn.routes.EvpnRoutes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev180329.evpn.routes.EvpnRoutes; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public class EvpnWriterFactory implements WriterFactory { diff --git a/infra/northbound/bgp-extensions/extension-common/pom.xml b/infra/northbound/bgp-extensions/extension-common/pom.xml index 999b1f80a..d0283e850 100644 --- a/infra/northbound/bgp-extensions/extension-common/pom.xml +++ b/infra/northbound/bgp-extensions/extension-common/pom.xml @@ -75,6 +75,11 @@ bgp-parser-impl ${odl.bgpcep.version} + + org.opendaylight.controller + sal-binding-broker-impl + ${odl.mdsal.controller.version} + \ No newline at end of file diff --git a/infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/AbstractBgpExtensionModule.java b/infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/AbstractBgpExtensionModule.java index a43885761..dfa31aac0 100644 --- a/infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/AbstractBgpExtensionModule.java +++ b/infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/AbstractBgpExtensionModule.java @@ -26,10 +26,10 @@ import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator; 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.types.rev151009.AfiSafiType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.rib.Tables; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.ApplicationRib; -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.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.Tables; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.ApplicationRib; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.AddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.SubsequentAddressFamily; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; diff --git a/infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/RIBExtensionConsumerContextProvider.java b/infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/RIBExtensionConsumerContextProvider.java index a8374ea67..8c4144d45 100644 --- a/infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/RIBExtensionConsumerContextProvider.java +++ b/infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/RIBExtensionConsumerContextProvider.java @@ -19,6 +19,8 @@ package io.fd.honeycomb.northbound.bgp.extension; import com.google.inject.Inject; import io.fd.honeycomb.binding.init.ProviderTrait; import io.fd.honeycomb.data.init.ShutdownHandler; +import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec; + import org.opendaylight.protocol.bgp.rib.spi.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,12 +34,14 @@ public class RIBExtensionConsumerContextProvider extends ProviderTrait activators; @Inject private ShutdownHandler shutdownHandler; + @Inject + private BindingToNormalizedNodeCodec serializer; @Override protected RIBExtensionConsumerContext create() { final RIBExtensionProviderContext ctx = new SimpleRIBExtensionProviderContext(); final SimpleRIBExtensionProviderContextActivator activator = - new SimpleRIBExtensionProviderContextActivator(ctx, new ArrayList<>(activators)); + new SimpleRIBExtensionProviderContextActivator(ctx, new ArrayList<>(activators), serializer); LOG.debug("Starting RIBExtensionConsumerContext with activators: {}", activators); activator.start(); shutdownHandler.register("rib-extension-consumer-context-activator", activator); diff --git a/infra/northbound/bgp-extensions/inet/src/main/java/io/fd/honeycomb/northbound/bgp/extension/InetModule.java b/infra/northbound/bgp-extensions/inet/src/main/java/io/fd/honeycomb/northbound/bgp/extension/InetModule.java index 9d798c849..cf7b4af1e 100644 --- a/infra/northbound/bgp-extensions/inet/src/main/java/io/fd/honeycomb/northbound/bgp/extension/InetModule.java +++ b/infra/northbound/bgp-extensions/inet/src/main/java/io/fd/honeycomb/northbound/bgp/extension/InetModule.java @@ -32,11 +32,11 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.r import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2Builder; -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.UnicastSubsequentAddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAddPathsConfig; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAddPathsConfigBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv4AddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv6AddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.UnicastSubsequentAddressFamily; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -86,8 +86,8 @@ public class InetModule extends AbstractBgpExtensionModule { @Override public AfiSafi get() { return new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class) - .addAugmentation(AfiSafi2.class, - new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled()) + .addAugmentation(NeighborAddPathsConfig.class, + new NeighborAddPathsConfigBuilder().setReceive(cfg.isBgpMultiplePathsEnabled()) .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build()) .build(); } @@ -101,8 +101,8 @@ public class InetModule extends AbstractBgpExtensionModule { @Override public AfiSafi get() { return new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class) - .addAugmentation(AfiSafi2.class, - new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled()) + .addAugmentation(NeighborAddPathsConfig.class, + new NeighborAddPathsConfigBuilder().setReceive(cfg.isBgpMultiplePathsEnabled()) .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build()) .build(); } diff --git a/infra/northbound/bgp-extensions/inet/src/main/java/io/fd/honeycomb/northbound/bgp/extension/InetWriterFactory.java b/infra/northbound/bgp-extensions/inet/src/main/java/io/fd/honeycomb/northbound/bgp/extension/InetWriterFactory.java index 69bda6fe8..37e053a59 100644 --- a/infra/northbound/bgp-extensions/inet/src/main/java/io/fd/honeycomb/northbound/bgp/extension/InetWriterFactory.java +++ b/infra/northbound/bgp-extensions/inet/src/main/java/io/fd/honeycomb/northbound/bgp/extension/InetWriterFactory.java @@ -22,8 +22,8 @@ import io.fd.honeycomb.translate.util.write.BindingBrokerWriter; import io.fd.honeycomb.translate.write.WriterFactory; import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev171207.ipv4.routes.Ipv4Routes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev171207.ipv6.routes.Ipv6Routes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev180329.ipv4.routes.Ipv4Routes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev180329.ipv6.routes.Ipv6Routes; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import javax.annotation.Nonnull; diff --git a/infra/northbound/bgp-extensions/l3-vpn-v4/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV4Module.java b/infra/northbound/bgp-extensions/l3-vpn-v4/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV4Module.java index 0ac311b10..efaa84c99 100644 --- a/infra/northbound/bgp-extensions/l3-vpn-v4/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV4Module.java +++ b/infra/northbound/bgp-extensions/l3-vpn-v4/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV4Module.java @@ -19,14 +19,14 @@ package io.fd.honeycomb.northbound.bgp.extension; import com.google.common.collect.ImmutableSet; import com.google.inject.Provider; import io.fd.honeycomb.translate.write.WriterFactory; -import org.opendaylight.protocol.bgp.l3vpn.ipv4.BgpIpv4Activator; -import org.opendaylight.protocol.bgp.l3vpn.ipv4.RibIpv4Activator; +import org.opendaylight.protocol.bgp.l3vpn.BGPActivator; +import org.opendaylight.protocol.bgp.l3vpn.RIBActivator; import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator; 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.types.rev151009.L3VPNIPV4UNICAST; -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.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv4AddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.MplsLabeledVpnSubsequentAddressFamily; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,12 +41,12 @@ public class L3VpnV4Module extends AbstractBgpExtensionModule { @Override public Set> getRibActivators() { - return ImmutableSet.of(RibIpv4Activator.class); + return ImmutableSet.of(RIBActivator.class); } @Override public Set> getExtensionActivators() { - return ImmutableSet.of(BgpIpv4Activator.class); + return ImmutableSet.of(BGPActivator.class); } @Override diff --git a/infra/northbound/bgp-extensions/l3-vpn-v4/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV4WriterFactory.java b/infra/northbound/bgp-extensions/l3-vpn-v4/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV4WriterFactory.java index 01051e2b2..ad33cbb06 100644 --- a/infra/northbound/bgp-extensions/l3-vpn-v4/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV4WriterFactory.java +++ b/infra/northbound/bgp-extensions/l3-vpn-v4/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV4WriterFactory.java @@ -25,7 +25,7 @@ import io.fd.honeycomb.translate.write.WriterFactory; import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder; import javax.annotation.Nonnull; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.vpn.ipv4.rev171207.l3vpn.ipv4.routes.VpnIpv4Routes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.vpn.ipv4.rev180329.l3vpn.ipv4.routes.VpnIpv4Routes; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public class L3VpnV4WriterFactory implements WriterFactory { diff --git a/infra/northbound/bgp-extensions/l3-vpn-v6/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV6Module.java b/infra/northbound/bgp-extensions/l3-vpn-v6/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV6Module.java index 2583d4a60..e5844b410 100644 --- a/infra/northbound/bgp-extensions/l3-vpn-v6/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV6Module.java +++ b/infra/northbound/bgp-extensions/l3-vpn-v6/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV6Module.java @@ -19,14 +19,14 @@ package io.fd.honeycomb.northbound.bgp.extension; import com.google.common.collect.ImmutableSet; import com.google.inject.Provider; import io.fd.honeycomb.translate.write.WriterFactory; -import org.opendaylight.protocol.bgp.l3vpn.ipv6.BgpIpv6Activator; -import org.opendaylight.protocol.bgp.l3vpn.ipv6.RibIpv6Activator; +import org.opendaylight.protocol.bgp.l3vpn.BGPActivator; +import org.opendaylight.protocol.bgp.l3vpn.RIBActivator; import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator; 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.types.rev151009.L3VPNIPV6UNICAST; -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.MplsLabeledVpnSubsequentAddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv6AddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.MplsLabeledVpnSubsequentAddressFamily; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,12 +41,12 @@ public class L3VpnV6Module extends AbstractBgpExtensionModule { @Override public Set> getRibActivators() { - return ImmutableSet.of(RibIpv6Activator.class); + return ImmutableSet.of(RIBActivator.class); } @Override public Set> getExtensionActivators() { - return ImmutableSet.of(BgpIpv6Activator.class); + return ImmutableSet.of(BGPActivator.class); } @Override diff --git a/infra/northbound/bgp-extensions/l3-vpn-v6/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV6WriterFactory.java b/infra/northbound/bgp-extensions/l3-vpn-v6/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV6WriterFactory.java index 65a28173b..b2b2fbd5d 100644 --- a/infra/northbound/bgp-extensions/l3-vpn-v6/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV6WriterFactory.java +++ b/infra/northbound/bgp-extensions/l3-vpn-v6/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV6WriterFactory.java @@ -25,7 +25,7 @@ import io.fd.honeycomb.translate.write.WriterFactory; import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder; import javax.annotation.Nonnull; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.vpn.ipv6.rev171207.l3vpn.ipv6.routes.VpnIpv6Routes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.vpn.ipv6.rev180329.l3vpn.ipv6.routes.VpnIpv6Routes; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public class L3VpnV6WriterFactory implements WriterFactory { diff --git a/infra/northbound/bgp-extensions/labeled-unicast/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LabeledUnicastModule.java b/infra/northbound/bgp-extensions/labeled-unicast/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LabeledUnicastModule.java index 9aab1fc28..fa251e049 100644 --- a/infra/northbound/bgp-extensions/labeled-unicast/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LabeledUnicastModule.java +++ b/infra/northbound/bgp-extensions/labeled-unicast/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LabeledUnicastModule.java @@ -32,11 +32,11 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.r import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4LABELLEDUNICAST; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6LABELLEDUNICAST; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev171207.LabeledUnicastSubsequentAddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2Builder; -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.labeled.unicast.rev180329.LabeledUnicastSubsequentAddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAddPathsConfig; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAddPathsConfigBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv4AddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv6AddressFamily; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -87,8 +87,8 @@ public class LabeledUnicastModule extends AbstractBgpExtensionModule { @Override public AfiSafi get() { return new AfiSafiBuilder().setAfiSafiName(IPV4LABELLEDUNICAST.class) - .addAugmentation(AfiSafi2.class, - new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled()) + .addAugmentation(NeighborAddPathsConfig .class, + new NeighborAddPathsConfigBuilder().setReceive(cfg.isBgpMultiplePathsEnabled()) .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build()) .build(); } @@ -101,8 +101,8 @@ public class LabeledUnicastModule extends AbstractBgpExtensionModule { @Override public AfiSafi get() { return new AfiSafiBuilder().setAfiSafiName(IPV6LABELLEDUNICAST.class) - .addAugmentation(AfiSafi2.class, - new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled()) + .addAugmentation(NeighborAddPathsConfig .class, + new NeighborAddPathsConfigBuilder().setReceive(cfg.isBgpMultiplePathsEnabled()) .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build()) .build(); } diff --git a/infra/northbound/bgp-extensions/labeled-unicast/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LabeledUnicastWriterFactory.java b/infra/northbound/bgp-extensions/labeled-unicast/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LabeledUnicastWriterFactory.java index 37bb0fa9b..cd683f878 100644 --- a/infra/northbound/bgp-extensions/labeled-unicast/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LabeledUnicastWriterFactory.java +++ b/infra/northbound/bgp-extensions/labeled-unicast/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LabeledUnicastWriterFactory.java @@ -25,8 +25,8 @@ import io.fd.honeycomb.translate.write.WriterFactory; import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder; import javax.annotation.Nonnull; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev171207.labeled.unicast.ipv6.routes.LabeledUnicastIpv6Routes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev171207.labeled.unicast.routes.LabeledUnicastRoutes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev180329.labeled.unicast.ipv6.routes.LabeledUnicastIpv6Routes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev180329.labeled.unicast.routes.LabeledUnicastRoutes; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; diff --git a/infra/northbound/bgp-extensions/linkstate/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LinkstateModule.java b/infra/northbound/bgp-extensions/linkstate/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LinkstateModule.java index ca98b6d51..fbd46e54d 100644 --- a/infra/northbound/bgp-extensions/linkstate/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LinkstateModule.java +++ b/infra/northbound/bgp-extensions/linkstate/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LinkstateModule.java @@ -30,11 +30,11 @@ import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator; 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.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev171207.LinkstateAddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev171207.LinkstateSubsequentAddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.AfiSafi2Builder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.LINKSTATE; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.LinkstateAddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.LinkstateSubsequentAddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.LINKSTATE; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAddPathsConfig; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborAddPathsConfigBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -81,8 +81,8 @@ public class LinkstateModule extends AbstractBgpExtensionModule { @Override public AfiSafi get() { return new AfiSafiBuilder().setAfiSafiName(LINKSTATE.class) - .addAugmentation(AfiSafi2.class, - new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled()) + .addAugmentation(NeighborAddPathsConfig.class, + new NeighborAddPathsConfigBuilder().setReceive(cfg.isBgpMultiplePathsEnabled()) .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build()) .build(); } diff --git a/infra/northbound/bgp-extensions/linkstate/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LinkstateWriterFactory.java b/infra/northbound/bgp-extensions/linkstate/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LinkstateWriterFactory.java index bcb3f684a..6738fdda3 100644 --- a/infra/northbound/bgp-extensions/linkstate/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LinkstateWriterFactory.java +++ b/infra/northbound/bgp-extensions/linkstate/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LinkstateWriterFactory.java @@ -25,7 +25,7 @@ import io.fd.honeycomb.translate.write.WriterFactory; import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder; import javax.annotation.Nonnull; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev171207.linkstate.routes.LinkstateRoutes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.routes.LinkstateRoutes; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public class LinkstateWriterFactory implements WriterFactory { diff --git a/infra/northbound/bgp/pom.xml b/infra/northbound/bgp/pom.xml index f41e623fe..f8538f514 100644 --- a/infra/northbound/bgp/pom.xml +++ b/infra/northbound/bgp/pom.xml @@ -79,6 +79,11 @@ org.opendaylight.bgpcep bgp-rib-impl + + org.opendaylight.bgpcep + bgp-openconfig-rp-impl + ${odl.bgpcep.version} + diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/ApplicationRibWriterFactory.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/ApplicationRibWriterFactory.java index 05a2a9602..9ff55207b 100644 --- a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/ApplicationRibWriterFactory.java +++ b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/ApplicationRibWriterFactory.java @@ -23,8 +23,8 @@ import io.fd.honeycomb.translate.util.write.BindingBrokerWriter; import io.fd.honeycomb.translate.write.WriterFactory; import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.ApplicationRib; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.rib.Tables; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.ApplicationRib; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.Tables; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; /** diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpConfiguration.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpConfiguration.java index b651c4c0a..2c6c17c92 100644 --- a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpConfiguration.java +++ b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpConfiguration.java @@ -18,9 +18,17 @@ package io.fd.honeycomb.infra.bgp; import com.google.common.base.MoreObjects; import java.util.Optional; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import net.jmob.guice.conf.core.BindConfig; import net.jmob.guice.conf.core.InjectConfig; import net.jmob.guice.conf.core.Syntax; +import org.opendaylight.protocol.bgp.rib.impl.config.PeerGroupConfigLoader; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroup; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroupBuilder; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; /** * This is the Java equivalent for bgp.json file. We use guice-config library to load all the config attributes into @@ -29,7 +37,7 @@ import net.jmob.guice.conf.core.Syntax; * The BindConfig annotation tells that bgp.json file should be looked up on classpath root. */ @BindConfig(value = "bgp", syntax = Syntax.JSON) -public class BgpConfiguration { +public class BgpConfiguration implements PeerGroupConfigLoader { @InjectConfig("bgp-binding-address") public Optional bgpBindingAddress; @@ -65,4 +73,11 @@ public class BgpConfiguration { .add("bgpNettyThreads", bgpNettyThreads) .toString(); } + + @Nullable + @Override + public PeerGroup getPeerGroup(@Nonnull final InstanceIdentifier instanceIdentifier, + @Nonnull final String neighbor) { + return new PeerGroupBuilder().setConfig(new ConfigBuilder().build()).build(); + } } diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpModule.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpModule.java index 6aab7c6ca..7123caf14 100644 --- a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpModule.java +++ b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpModule.java @@ -47,6 +47,8 @@ public final class BgpModule extends PrivateModule { // Create BGPDispatcher BGPDispatcher for creating BGP clients bind(EventLoopGroup.class).toProvider(BgpNettyThreadGroupProvider.class).in(Singleton.class); bind(BGPDispatcher.class).toProvider(BGPDispatcherImplProvider.class).in(Singleton.class); + // Bind BgpPolicy configuration before RIB is initialized + install(new BgpPolicyConfigurationModule()); configureRIB(); diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpPolicyConfiguration.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpPolicyConfiguration.java new file mode 100644 index 000000000..911cbfd86 --- /dev/null +++ b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpPolicyConfiguration.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.honeycomb.infra.bgp; + +import com.google.common.base.MoreObjects; +import java.util.Collections; +import java.util.Optional; +import net.jmob.guice.conf.core.BindConfig; +import net.jmob.guice.conf.core.InjectConfig; +import net.jmob.guice.conf.core.Syntax; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.DefaultPolicyType; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.apply.policy.group.apply.policy.Config; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.apply.policy.group.apply.policy.ConfigBuilder; + +/** + * This is the Java equivalent for bgp-policy.json file. We use guice-config library to load all the config attributes + * into this class instance. + * + * The BindConfig annotation tells that bgp-policy.json file should be looked up on classpath root. + * + * For now we support only default actions for import and export policies (ACCEPT-ROUTE or REJECT-ROUTE) + */ + +// TODO (HONEYCOMB-446) Add full support of initial configuration for BGP policy. +@BindConfig(value = "bgp-policy", syntax = Syntax.JSON) +public class BgpPolicyConfiguration { + + @InjectConfig("default-import-policy") + public Optional defaultImportPolicy; + @InjectConfig("default-export-policy") + public Optional defaultExportPolicy; + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("default-import-policy", defaultImportPolicy) + .add("default-export-policy", defaultExportPolicy) + .toString(); + } + + public Optional getPolicyConfig() { + if (defaultImportPolicy.isPresent() && defaultExportPolicy.isPresent()) { + Config config = new ConfigBuilder() + .setDefaultImportPolicy( + DefaultPolicyType.valueOf(defaultImportPolicy.get().replace("-", ""))) + .setDefaultExportPolicy( + DefaultPolicyType.valueOf(defaultExportPolicy.get().replace("-", ""))) + .setImportPolicy(Collections.emptyList()) + .setExportPolicy(Collections.emptyList()) + .build(); + return Optional.of(config); + } else { + return Optional.empty(); + } + } +} diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpPolicyConfigurationModule.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpPolicyConfigurationModule.java new file mode 100644 index 000000000..3137150c3 --- /dev/null +++ b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpPolicyConfigurationModule.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.honeycomb.infra.bgp; + +import com.google.inject.AbstractModule; +import net.jmob.guice.conf.core.ConfigurationModule; + +/** + * Load the configuration from json into HoneycombConfiguration and make it available. + */ +final class BgpPolicyConfigurationModule extends AbstractModule { + + @Override + protected void configure() { + install(ConfigurationModule.create()); + // Inject non-dependency configuration + requestInjection(BgpPolicyConfiguration.class); + } + +} diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpRIBProvider.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpRIBProvider.java index 76b34d5eb..8ced20b80 100644 --- a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpRIBProvider.java +++ b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpRIBProvider.java @@ -16,36 +16,38 @@ package io.fd.honeycomb.infra.bgp; -import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.toTableTypes; - +import com.google.common.base.Preconditions; import com.google.inject.Inject; +import com.google.inject.name.Named; import io.fd.honeycomb.binding.init.ProviderTrait; import io.fd.honeycomb.data.init.ShutdownHandler; import java.util.ArrayList; -import java.util.Map; +import java.util.Collections; +import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec; import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; import org.opendaylight.controller.md.sal.dom.broker.impl.PingPongDataBroker; -import org.opendaylight.controller.sal.core.api.model.SchemaService; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; -import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode; +import org.opendaylight.mdsal.dom.api.DOMSchemaService; +import org.opendaylight.protocol.bgp.openconfig.routing.policy.impl.BGPRibRoutingPolicyFactoryImpl; +import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.StatementRegistry; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; +import org.opendaylight.protocol.bgp.rib.impl.CodecsRegistryImpl; import org.opendaylight.protocol.bgp.rib.impl.RIBImpl; -import org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil; 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.RIBExtensionConsumerContext; +import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRibRoutingPolicy; 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.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.Ipv4Address; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.RibId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.rib.TablesKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.BgpTableType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.RibId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.BgpId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.ClusterIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,6 +57,8 @@ final class BgpRIBProvider extends ProviderTrait { @Inject private BgpConfiguration cfg; @Inject + private BgpPolicyConfiguration policyCfg; + @Inject private RIBExtensionConsumerContext extensions; @Inject private BGPDispatcher dispatcher; @@ -63,9 +67,12 @@ final class BgpRIBProvider extends ProviderTrait { @Inject private DOMDataBroker domBroker; @Inject + @Named(BgpModule.HONEYCOMB_BGP) + private DataBroker dataBroker; + @Inject private BGPTableTypeRegistryConsumer tableTypeRegistry; @Inject - private SchemaService schemaService; + private DOMSchemaService schemaService; @Inject private ShutdownHandler shutdownHandler; @Inject @@ -73,6 +80,8 @@ final class BgpRIBProvider extends ProviderTrait { @Override protected RIB create() { + Preconditions.checkArgument(policyCfg.getPolicyConfig().isPresent(), + "Bgp policy configuration failed to load. Check bgp-policy.json configuration file."); final AsNumber asNumber = new AsNumber(cfg.bgpAsNumber.get().longValue()); final Ipv4Address routerId = new Ipv4Address(cfg.bgpBindingAddress.get()); final ClusterIdentifier clusterId = new ClusterIdentifier(routerId); @@ -81,17 +90,18 @@ final class BgpRIBProvider extends ProviderTrait { // TODO(HONEYCOMB-363): configure other BGP Multiprotocol extensions: final ArrayList afiSafiList = new ArrayList<>(configuredAfiSafis); - final Map pathSelectionModes = - OpenConfigMappingUtil.toPathSelectionMode(afiSafiList, tableTypeRegistry) - .entrySet().stream().collect(Collectors.toMap(entry -> - new TablesKey(entry.getKey().getAfi(), entry.getKey().getSafi()), Map.Entry::getValue)); // based on org.opendaylight.protocol.bgp.rib.impl.config.RibImpl.createRib final PingPongDataBroker pingPongDataBroker = new PingPongDataBroker(domBroker); - final RIBImpl rib = - new RIBImpl(new RibId(cfg.bgpProtocolInstanceName.get()), - asNumber, new BgpId(routerId), clusterId, extensions, dispatcher, codec, - pingPongDataBroker, toTableTypes(afiSafiList, tableTypeRegistry), pathSelectionModes, - extensions.getClassLoadingStrategy()); + final CodecsRegistryImpl codecsRegistry = + CodecsRegistryImpl.create(codec, extensions.getClassLoadingStrategy()); + final BGPRibRoutingPolicyFactoryImpl bgpRibRoutingPolicyFactory = + new BGPRibRoutingPolicyFactoryImpl(dataBroker, new StatementRegistry()); + final BGPRibRoutingPolicy ribPolicies = bgpRibRoutingPolicyFactory + .buildBGPRibPolicy(cfg.bgpAsNumber.get(), new Ipv4Address(cfg.bgpBindingAddress.get()), clusterId, + policyCfg.getPolicyConfig().get()); + final RIBImpl rib = new RIBImpl(tableTypeRegistry, new RibId(cfg.bgpProtocolInstanceName.get()), + asNumber, new BgpId(routerId), extensions, dispatcher, codecsRegistry, pingPongDataBroker, dataBroker, + ribPolicies, toTableTypes(afiSafiList, tableTypeRegistry), Collections.emptyMap()); rib.instantiateServiceInstance(); // required for proper RIB's CodecRegistry initialization (based on RIBImpl.start) @@ -101,26 +111,13 @@ final class BgpRIBProvider extends ProviderTrait { return rib; } - /** - * HC does not support clustering, but BGP uses {@link ClusterSingletonServiceProvider} to initialize {@link - * RIBImpl}. Therefore we provide this dummy implementation. - */ - private static final class NoopClusterSingletonServiceProvider implements ClusterSingletonServiceProvider { - private static final Logger LOG = LoggerFactory.getLogger(NoopClusterSingletonServiceProvider.class); - - private static final ClusterSingletonServiceRegistration REGISTRATION = - () -> LOG.debug("Closing ClusterSingletonServiceRegistration"); - - @Override - public ClusterSingletonServiceRegistration registerClusterSingletonService( - final ClusterSingletonService clusterSingletonService) { - clusterSingletonService.instantiateServiceInstance(); - return REGISTRATION; - } - - @Override - public void close() throws Exception { - LOG.debug("Closing NoopClusterSingletonServiceProvider"); - } + private List toTableTypes(final List afiSafis, + final BGPTableTypeRegistryConsumer tableTypeRegistry) { + return afiSafis.stream() + .filter(afiSafi -> afiSafi.getAfiSafiName()!=null) + .map(afiSafi -> tableTypeRegistry.getTableType(afiSafi.getAfiSafiName())) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList()); } } diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpReaderFactoryProvider.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpReaderFactoryProvider.java index 6f5bd5066..7ae724696 100644 --- a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpReaderFactoryProvider.java +++ b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpReaderFactoryProvider.java @@ -24,8 +24,8 @@ import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder; import io.fd.honeycomb.translate.util.read.BindingBrokerReader; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.BgpRib; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.BgpRibBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.BgpRib; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.BgpRibBuilder; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; final class BgpReaderFactoryProvider extends ProviderTrait { diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/neighbors/BgpPeerWriterFactory.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/neighbors/BgpPeerWriterFactory.java index 5e924be7e..e844cf3e0 100644 --- a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/neighbors/BgpPeerWriterFactory.java +++ b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/neighbors/BgpPeerWriterFactory.java @@ -22,6 +22,7 @@ import io.fd.honeycomb.translate.impl.write.GenericListWriter; import io.fd.honeycomb.translate.write.WriterFactory; import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder; import javax.annotation.Nonnull; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry; import org.opendaylight.protocol.bgp.rib.impl.spi.RIB; @@ -32,8 +33,9 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.re import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev171207.Protocol1; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NetworkInstanceProtocol; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.osgi.framework.BundleContext; /** * Initializes writer for Bgp Neighbors ({@link Neighbor} node) and all its parents required by HC infra. @@ -47,7 +49,8 @@ public final class BgpPeerWriterFactory implements WriterFactory { NETWORK_INSTANCE_ID.child(Protocols.class).child(Protocol.class); private static final InstanceIdentifier NEIGHBOR_ID = - PROTOCOL_ID.augmentation(Protocol1.class).child(Bgp.class).child(Neighbors.class).child(Neighbor.class); + PROTOCOL_ID.augmentation(NetworkInstanceProtocol.class).child(Bgp.class).child(Neighbors.class) + .child(Neighbor.class); @Inject private BgpConfiguration configuration; @@ -74,7 +77,8 @@ public final class BgpPeerWriterFactory implements WriterFactory { // Bgp // Neighbors // Neighbor= - registry.wildcardedSubtreeAdd(new GenericListWriter<>(NEIGHBOR_ID, new NeighborCustomizer(globalRib, peerRegistry, tableTypeRegistry))); + registry.wildcardedSubtreeAdd(new GenericListWriter<>(NEIGHBOR_ID, new NeighborCustomizer(globalRib, peerRegistry, + tableTypeRegistry, configuration))); } } diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/neighbors/NeighborCustomizer.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/neighbors/NeighborCustomizer.java index cdaffb6f6..ebe5795f1 100644 --- a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/neighbors/NeighborCustomizer.java +++ b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/neighbors/NeighborCustomizer.java @@ -18,9 +18,9 @@ package io.fd.honeycomb.infra.bgp.neighbors; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; -import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.isApplicationPeer; import com.google.common.annotations.VisibleForTesting; +import io.fd.honeycomb.infra.bgp.BgpConfiguration; import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer; import io.fd.honeycomb.translate.write.WriteContext; import io.fd.honeycomb.translate.write.WriteFailedException; @@ -33,10 +33,19 @@ import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer import org.opendaylight.protocol.bgp.rib.impl.config.AppPeer; import org.opendaylight.protocol.bgp.rib.impl.config.BgpPeer; import org.opendaylight.protocol.bgp.rib.impl.config.PeerBean; +import org.opendaylight.protocol.bgp.rib.impl.config.PeerGroupConfigLoader; import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry; import org.opendaylight.protocol.bgp.rib.impl.spi.RIB; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Config; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborPeerGroupConfig; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NetworkInstanceProtocol; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,17 +59,24 @@ final class NeighborCustomizer implements ListWriterCustomizer bgpIid = InstanceIdentifier.create(NetworkInstances.class) + .child(NetworkInstance.class).child(Protocols.class).child(Protocol.class).augmentation( + NetworkInstanceProtocol.class).child(Bgp.class); @GuardedBy("this") private final Map, PeerBean> peers = new HashMap<>(); public NeighborCustomizer(@Nonnull final RIB globalRib, @Nonnull final BGPPeerRegistry peerRegistry, - @Nonnull final BGPTableTypeRegistryConsumer tableTypeRegistry) { + @Nonnull final BGPTableTypeRegistryConsumer tableTypeRegistry, + final BgpConfiguration configuration) { this.globalRib = checkNotNull(globalRib, "globalRib should not be null"); - this.peerRegistry = checkNotNull(peerRegistry, "globalRib should not be null"); + this.peerRegistry = checkNotNull(peerRegistry, "peerRegistry should not be null"); this.tableTypeRegistry = checkNotNull(tableTypeRegistry, "tableTypeRegistry should not be null"); + this.peerGroupLoader = checkNotNull(configuration, "configuration should not be null"); } @VisibleForTesting @@ -80,7 +96,7 @@ final class NeighborCustomizer implements ListWriterCustomizer id, @Nonnull final Neighbor dataBefore, @@ -103,7 +131,7 @@ final class NeighborCustomizer implements ListWriterCustomizer { @Inject - private SchemaService schemaService; + private DOMSchemaService schemaService; @Inject private NetconfOperationServiceFactoryListener aggregator; @Inject - private ModuleInfoBackedContext moduleInfoBackedContext; - @Inject @Named(HONEYCOMB_CONFIG) private DOMDataBroker domBroker; @Inject @@ -48,7 +45,8 @@ public final class NetconfMdsalMapperProvider extends ProviderTrait - org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712 + org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021 Required for mounting of netconf devices(Operational read does not work without it) diff --git a/infra/northbound/restconf/pom.xml b/infra/northbound/restconf/pom.xml index 7e873bc31..ee07c33ab 100644 --- a/infra/northbound/restconf/pom.xml +++ b/infra/northbound/restconf/pom.xml @@ -32,9 +32,10 @@ ${project.artifactId} - 1.19.1 + 1.19.4 + 2.25.1 3.1.0 - 9.3.11.v20160721 + 9.3.21.v20170918 ${project.basedir}/src/main/resources/honeycomb-minimal-resources/config/restconf-whitelist.xml @@ -96,19 +97,14 @@ ${jetty.version} - com.sun.jersey + org.glassfish.jersey.core jersey-server - ${jersey.version} + ${glassfish-jersey.version} - com.sun.jersey - jersey-core - ${jersey.version} - - - com.sun.jersey - jersey-servlet - ${jersey.version} + org.glassfish.jersey.containers + jersey-container-servlet-core + ${glassfish-jersey.version} diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/BrokerFacadeProvider.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/BrokerFacadeProvider.java new file mode 100644 index 000000000..f6a7e5e81 --- /dev/null +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/BrokerFacadeProvider.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.honeycomb.northbound.restconf; + +import com.google.inject.Inject; +import com.google.inject.name.Named; +import io.fd.honeycomb.binding.init.ProviderTrait; +import io.fd.honeycomb.infra.distro.data.ConfigAndOperationalPipelineModule; +import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; +import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; +import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter; +import org.opendaylight.netconf.sal.restconf.impl.BrokerFacade; +import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; + +final class BrokerFacadeProvider extends ProviderTrait { + + @Inject + @Named(ConfigAndOperationalPipelineModule.HONEYCOMB_CONFIG) + private DOMDataBroker domDataBroker; + @Inject + private DOMRpcService rpcService; + @Inject + private DOMNotificationRouter notificationService; + @Inject + private ControllerContext controllerContext; + + @Override + protected BrokerFacade create() { + BrokerFacade brokerFacade = + BrokerFacade.newInstance(rpcService, domDataBroker, notificationService, controllerContext); + return brokerFacade; + } +} diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/ControllerContextProvider.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/ControllerContextProvider.java new file mode 100644 index 000000000..909f063d1 --- /dev/null +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/ControllerContextProvider.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.honeycomb.northbound.restconf; + +import com.google.inject.Inject; +import io.fd.honeycomb.binding.init.ProviderTrait; +import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService; +import org.opendaylight.mdsal.dom.api.DOMSchemaService; +import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; + +final class ControllerContextProvider extends ProviderTrait { + + @Inject + private DOMSchemaService schemaService; + @Inject + private DOMMountPointService mountPointService; + + @Override + protected ControllerContext create() { + ControllerContext controllerCtx = + ControllerContext.newInstance(schemaService, mountPointService, schemaService); + return controllerCtx; + } +} diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/JettyServerProvider.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/JettyServerProvider.java index a87459560..8a3ee62f6 100644 --- a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/JettyServerProvider.java +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/JettyServerProvider.java @@ -27,10 +27,21 @@ import org.eclipse.jetty.security.HashLoginService; import org.eclipse.jetty.security.authentication.BasicAuthenticator; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.gzip.GzipHandler; +import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.util.security.Constraint; import org.eclipse.jetty.util.security.Password; import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.eclipse.jetty.webapp.WebAppContext; +import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.servlet.ServletContainer; +import org.opendaylight.netconf.sal.rest.impl.JsonNormalizedNodeBodyReader; +import org.opendaylight.netconf.sal.rest.impl.NormalizedNodeJsonBodyWriter; +import org.opendaylight.netconf.sal.rest.impl.NormalizedNodeXmlBodyWriter; +import org.opendaylight.netconf.sal.rest.impl.RestconfApplication; +import org.opendaylight.netconf.sal.rest.impl.RestconfDocumentedExceptionMapper; +import org.opendaylight.netconf.sal.rest.impl.XmlNormalizedNodeBodyReader; +import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; +import org.opendaylight.netconf.sal.restconf.impl.RestconfImpl; final class JettyServerProvider extends ProviderTrait { @@ -41,6 +52,7 @@ final class JettyServerProvider extends ProviderTrait { "application/yang.data+xml", "application/json", "application/yang.data+json"}; + public static final String RESTCONF_APP_NAME = "JAXRSRestconf"; @Inject private RestconfConfiguration cfg; @@ -48,6 +60,15 @@ final class JettyServerProvider extends ProviderTrait { @Inject private CredentialsConfiguration credentialsCfg; + @Inject + private RestconfApplication restconfApplication; + + @Inject + private RestconfImpl restconf; + + @Inject + private ControllerContext controllerContext; + @Override protected Server create() { Server server = new Server(new QueuedThreadPool(cfg.restPoolMaxSize.get(), cfg.restPoolMinSize.get())); @@ -62,7 +83,26 @@ final class JettyServerProvider extends ProviderTrait { final URL resource = getClass().getResource("/"); WebAppContext webapp = new WebAppContext(resource.getPath(), cfg.restconfRootPath.get()); + // Create Restconf application implementation for server + ResourceConfig resourceConfig = new ResourceConfig(); + resourceConfig.setApplicationName(RESTCONF_APP_NAME); + resourceConfig = resourceConfig.registerInstances(restconf, new NormalizedNodeJsonBodyWriter(), + new NormalizedNodeXmlBodyWriter(), new XmlNormalizedNodeBodyReader(controllerContext), + new JsonNormalizedNodeBodyReader(controllerContext), + new RestconfDocumentedExceptionMapper(controllerContext)); + // register Restconf Application classes + resourceConfig.registerClasses(restconfApplication.getClasses()); + + // Create Servlet container which holds configured application + ServletContainer servlet = new ServletContainer(resourceConfig); + ServletHolder servletHolder = new ServletHolder(RESTCONF_APP_NAME, servlet); + // init on startup + servletHolder.setInitOrder(1); + // set service handler server.setHandler(getGzip(service, webapp)); + + //add servlet with "/*" mapping + webapp.addServlet(servletHolder, "/*"); return server; } diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfApplicationProvider.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfApplicationProvider.java new file mode 100644 index 000000000..0f55b4947 --- /dev/null +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfApplicationProvider.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package io.fd.honeycomb.northbound.restconf; + +import com.google.inject.Inject; +import io.fd.honeycomb.binding.init.ProviderTrait; +import org.opendaylight.netconf.sal.rest.impl.RestconfApplication; +import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; +import org.opendaylight.netconf.sal.restconf.impl.StatisticsRestconfServiceWrapper; + +public class RestconfApplicationProvider extends ProviderTrait { + + @Inject + private ControllerContext controllerContext; + @Inject + private StatisticsRestconfServiceWrapper statisticsRestconfServiceWrapper; + + @Override + protected RestconfApplication create() { + return new RestconfApplication(controllerContext, statisticsRestconfServiceWrapper); + } +} diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfModule.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfModule.java index 1a59b7298..d2841baef 100644 --- a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfModule.java +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfModule.java @@ -23,6 +23,11 @@ import io.fd.honeycomb.northbound.restconf.JettyServerStarter.RestconfJettyServe import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.opendaylight.netconf.sal.rest.api.RestConnector; +import org.opendaylight.netconf.sal.rest.impl.RestconfApplication; +import org.opendaylight.netconf.sal.restconf.impl.BrokerFacade; +import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; +import org.opendaylight.netconf.sal.restconf.impl.RestconfImpl; +import org.opendaylight.netconf.sal.restconf.impl.StatisticsRestconfServiceWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,6 +35,7 @@ public class RestconfModule extends NorthboundAbstractModule { @Inject private RestconfConfiguration cfg; @Inject - @Named(ConfigAndOperationalPipelineModule.HONEYCOMB_CONFIG) - private DOMDataBroker domDataBroker; - @Inject - private SchemaService schemaService; - @Inject - private DOMRpcService rpcService; - @Inject - private DOMNotificationRouter notificationService; - @Inject private ShutdownHandler shutdownHandler; @Inject - private DOMMountPointService mountPointService; + private StatisticsRestconfServiceWrapper statsServiceWrapper; @Override protected RestconfProviderImpl create() { - final RestconfProviderImpl instance = new RestconfProviderImpl(domDataBroker, schemaService, rpcService, - notificationService, mountPointService, - schemaService, - IpAddressBuilder.getDefaultInstance(cfg.restconfWebsocketAddress.get()), - new PortNumber(cfg.restconfWebsocketPort.get())); - + final RestconfProviderImpl instance = new RestconfProviderImpl(statsServiceWrapper, + IpAddressBuilder.getDefaultInstance(cfg.restconfWebsocketAddress.get()), + new PortNumber(cfg.restconfWebsocketPort.get())); // Required to properly initialize restconf (broker, schema ctx, etc.). // Without that restconf would fail with 503 (service not available). instance.start(); diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfServiceProvider.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfServiceProvider.java new file mode 100644 index 000000000..20dcc28ad --- /dev/null +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/RestconfServiceProvider.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package io.fd.honeycomb.northbound.restconf; + +import com.google.inject.Inject; +import io.fd.honeycomb.binding.init.ProviderTrait; +import org.opendaylight.netconf.sal.restconf.impl.BrokerFacade; +import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; +import org.opendaylight.netconf.sal.restconf.impl.RestconfImpl; + +public class RestconfServiceProvider extends ProviderTrait { + + @Inject + private ControllerContext controllerContext; + @Inject + private BrokerFacade brokerFacade; + + @Override + protected RestconfImpl create() { + return RestconfImpl.newInstance(brokerFacade, controllerContext); + } +} diff --git a/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/StatisticsRestconfServiceWrapperProvider.java b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/StatisticsRestconfServiceWrapperProvider.java new file mode 100644 index 000000000..f3a4c3b73 --- /dev/null +++ b/infra/northbound/restconf/src/main/java/io/fd/honeycomb/northbound/restconf/StatisticsRestconfServiceWrapperProvider.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package io.fd.honeycomb.northbound.restconf; + +import com.google.inject.Inject; +import io.fd.honeycomb.binding.init.ProviderTrait; +import org.opendaylight.netconf.sal.restconf.impl.RestconfImpl; +import org.opendaylight.netconf.sal.restconf.impl.StatisticsRestconfServiceWrapper; + +public class StatisticsRestconfServiceWrapperProvider extends ProviderTrait { + + @Inject + RestconfImpl restconfService; + + @Override + protected StatisticsRestconfServiceWrapper create() { + return StatisticsRestconfServiceWrapper.newInstance(restconfService); + } +} -- cgit 1.2.3-korg