From 31f01fcfadf8707aefe6bf3a09daf570ce248fc5 Mon Sep 17 00:00:00 2001 From: Maros Marsalek Date: Fri, 19 Aug 2016 12:20:33 +0200 Subject: HONEYCOMB-18 Fixing comments from reviews Change-Id: Ic0565d601d13b5f50ec3c714a43600e32a7e456b Signed-off-by: Maros Marsalek --- common/minimal-distribution-parent/pom.xml | 3 +- .../io/fd/honeycomb/data/init/RestorationType.java | 24 ---------- .../honeycomb/data/init/RestoringInitializer.java | 7 +++ .../java/io/fd/honeycomb/infra/distro/Main.java | 25 +++++----- .../infra/distro/cfgattrs/CfgAttrsModule.groovy | 3 ++ .../distro/cfgattrs/HoneycombConfiguration.groovy | 33 +++++++++++-- .../data/ConfigAndOperationalPipelineModule.groovy | 32 ++++++++----- .../distro/data/HoneycombDOMBrokerProvider.groovy | 1 - .../HoneycombNotificationManagerProvider.groovy | 4 +- .../data/InmemoryDOMDataBrokerProvider.groovy | 4 +- .../distro/data/ModifiableDTDelegProvider.groovy | 5 +- .../distro/data/PersistingDataTreeProvider.groovy | 5 +- .../data/context/ContextPipelineModule.groovy | 35 +++++++------- .../context/RealtimeMappingContextProvider.groovy | 2 +- .../data/oper/ReadableDTDelegProvider.groovy | 3 +- .../initializer/InitializerPipelineModule.groovy | 15 ++++-- .../initializer/InitializerRegistryProvider.groovy | 6 ++- .../ModifiableDTDelegInitProvider.groovy | 9 ++-- .../PersistedFileInitializerProvider.groovy | 8 ++-- .../HoneycombNotification2NetconfProvider.groovy | 20 ++++---- .../netconf/NetconfBindingBrokerProvider.groovy | 5 +- .../netconf/NetconfMdsalMapperProvider.groovy | 4 +- .../infra/distro/netconf/NetconfModule.groovy | 45 ++++++++++++------ .../netconf/NetconfMonitoringMapperProvider.groovy | 6 +-- .../NetconfMonitoringReaderFactoryProvider.groovy | 2 +- .../NetconfMonitoringServiceProvider.groovy | 6 +-- .../NetconfNotificationMapperProvider.groovy | 8 ++-- ...etconfNotificationsReaderFactoryProvider.groovy | 3 +- .../distro/netconf/NetconfReadersModule.groovy | 1 + .../netconf/NetconfServerDispatcherProvider.groovy | 6 +-- .../distro/netconf/NetconfSshServerProvider.groovy | 5 +- .../distro/netconf/NetconfTcpServerProvider.groovy | 4 +- .../distro/netconf/NettyThreadGroupProvider.groovy | 4 +- .../infra/distro/netconf/NettyTimerProvider.groovy | 4 +- .../distro/restconf/HttpsConnectorProvider.groovy | 15 +++--- .../distro/restconf/JettyServerProvider.groovy | 1 - .../infra/distro/restconf/RestconfModule.groovy | 7 ++- .../distro/schema/YangBindingProviderModule.groovy | 1 + .../cert/honeycomb.pkcs12 | Bin 2549 -> 0 bytes .../config/honeycomb.json | 11 +++-- samples/interfaces/mapping/pom.xml | 9 ++-- samples/minimal-distribution/pom.xml | 6 ++- v3po/v3po2vpp/pom.xml | 18 ------- .../io/fd/honeycomb/translate/v3po/V3poModule.java | 19 ++------ .../v3po/VppStateHoneycombReaderFactory.java | 8 ++-- .../v3po/initializers/VppClasifierInitializer.java | 52 --------------------- .../initializers/VppClassifierInitializer.java | 52 +++++++++++++++++++++ vpp-common/minimal-distribution/pom.xml | 8 +--- .../distro/ContextsReaderFactoryProvider.groovy | 3 +- .../io/fd/honeycomb/vpp/distro/JVppProvider.groovy | 7 ++- .../fd/honeycomb/vpp/distro/VppCommonModule.groovy | 2 +- vpp-integration/minimal-distribution/pom.xml | 6 ++- 52 files changed, 285 insertions(+), 287 deletions(-) delete mode 100644 infra/cfg-init/src/main/java/io/fd/honeycomb/data/init/RestorationType.java delete mode 100644 infra/minimal-distribution/src/main/resources/honeycomb-minimal-resources/cert/honeycomb.pkcs12 delete mode 100644 v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/initializers/VppClasifierInitializer.java create mode 100644 v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/initializers/VppClassifierInitializer.java diff --git a/common/minimal-distribution-parent/pom.xml b/common/minimal-distribution-parent/pom.xml index 42f51e17a..bfc0aef6b 100644 --- a/common/minimal-distribution-parent/pom.xml +++ b/common/minimal-distribution-parent/pom.xml @@ -20,7 +20,8 @@ http://nexus.fd.io/content - -XX:+PrintFlagsFinal -client -Xms64m -Xmx64m -XX:MaxMetaspaceSize=64m -Xss512k -XX:+UseSerialGC -Djava.compiler=NONE -Xverify:none -noverify + -Xms64m -Xmx128m -XX:MaxMetaspaceSize=128m + -client -Xms64m -Xmx64m -XX:MaxMetaspaceSize=64m -Xss512k -XX:+UseSerialGC -Djava.compiler=NONE -Xverify:none -noverify 4.1.0 1.2.0 diff --git a/infra/cfg-init/src/main/java/io/fd/honeycomb/data/init/RestorationType.java b/infra/cfg-init/src/main/java/io/fd/honeycomb/data/init/RestorationType.java deleted file mode 100644 index 51b1d8bbe..000000000 --- a/infra/cfg-init/src/main/java/io/fd/honeycomb/data/init/RestorationType.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2016 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.data.init; - -/** - * Type of operation to use when writing restored data - */ -public enum RestorationType { - Put, Merge -} diff --git a/infra/cfg-init/src/main/java/io/fd/honeycomb/data/init/RestoringInitializer.java b/infra/cfg-init/src/main/java/io/fd/honeycomb/data/init/RestoringInitializer.java index 2f3f7c99e..c4033a98c 100644 --- a/infra/cfg-init/src/main/java/io/fd/honeycomb/data/init/RestoringInitializer.java +++ b/infra/cfg-init/src/main/java/io/fd/honeycomb/data/init/RestoringInitializer.java @@ -108,4 +108,11 @@ public class RestoringInitializer implements DataTreeInitializer { @Override public void close() {} + + /** + * Type of operation to use when writing restored data + */ + public static enum RestorationType { + Put, Merge + } } diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/Main.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/Main.java index 278f0b104..d74906244 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/Main.java +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/Main.java @@ -98,10 +98,10 @@ public final class Main { final RestConnector instance = injector.getInstance(RestConnector.class); if (cfgAttributes.isRestconfHttpEnabled()) { - injector.getInstance(Key.get(ServerConnector.class, Names.named("restconf-http"))); + injector.getInstance(Key.get(ServerConnector.class, Names.named(RestconfModule.RESTCONF_HTTP))); } if (cfgAttributes.isRestconfHttpsEnabled()) { - injector.getInstance(Key.get(ServerConnector.class, Names.named("restconf-https"))); + injector.getInstance(Key.get(ServerConnector.class, Names.named(RestconfModule.RESTCONF_HTTPS))); } try { @@ -113,21 +113,21 @@ public final class Main { } if (cfgAttributes.isNetconfEnabled()) { - LOG.info("Starting NETCONF"); - injector.getInstance( - Key.get(NetconfOperationServiceFactory.class, Names.named("netconf-mapper-honeycomb"))); - injector.getInstance( - Key.get(NetconfOperationServiceFactory.class, Names.named("netconf-mapper-notification"))); - injector.getInstance( - Key.get(NetconfOperationServiceFactory.class, Names.named("netconf-mapper-monitoring"))); + LOG.info("Starting HONEYCOMB_NETCONF"); + injector.getInstance(Key.get(NetconfOperationServiceFactory.class, + Names.named(NetconfModule.HONEYCOMB_NETCONF_MAPPER_CORE))); + injector.getInstance(Key.get(NetconfOperationServiceFactory.class, + Names.named(NetconfModule.HONEYCOMB_NETCONF_MAPPER_NOTIF))); + injector.getInstance(Key.get(NetconfOperationServiceFactory.class, + Names.named(NetconfModule.HONEYCOMB_NETCONF_MAPPER_OPER))); if (cfgAttributes.isNetconfTcpEnabled()) { - LOG.info("Starting NETCONF TCP"); + LOG.info("Starting HONEYCOMB_NETCONF TCP"); injector.getInstance(NetconfTcpServerProvider.NetconfTcpServer.class); } if (cfgAttributes.isNetconfSshEnabled()) { - LOG.info("Starting NETCONF SSH"); + LOG.info("Starting HONEYCOMB_NETCONF SSH"); injector.getInstance(NetconfSshServerProvider.NetconfSshServer.class); } injector.getInstance(HoneycombNotification2NetconfProvider.HoneycombNotification2Netconf.class); @@ -137,7 +137,8 @@ public final class Main { try { LOG.info("Initializing configuration"); - injector.getInstance(Key.get(InitializerRegistry.class, Names.named("honeycomb-initializer"))).initialize(); + injector.getInstance(Key.get(InitializerRegistry.class, + Names.named(InitializerPipelineModule.HONEYCOMB_INITIALIZER))).initialize(); LOG.info("Configuration initialized successfully"); } catch (DataTreeInitializer.InitializeException e) { LOG.error("Unable to initialize configuration", e); diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/CfgAttrsModule.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/CfgAttrsModule.groovy index 6c9b0a50a..b20f3cd32 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/CfgAttrsModule.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/CfgAttrsModule.groovy @@ -20,6 +20,9 @@ import com.google.inject.AbstractModule import groovy.util.logging.Slf4j import net.jmob.guice.conf.core.ConfigurationModule +/** + * Load the configuration from json into HoneycombConfiguration and make it available. + */ @Slf4j class CfgAttrsModule extends AbstractModule { diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/HoneycombConfiguration.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/HoneycombConfiguration.groovy index 85708f11e..15f907f4b 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/HoneycombConfiguration.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/cfgattrs/HoneycombConfiguration.groovy @@ -21,6 +21,12 @@ import net.jmob.guice.conf.core.BindConfig import net.jmob.guice.conf.core.InjectConfig import net.jmob.guice.conf.core.Syntax +/** + * This is the Java equivalent for honeyconb.json file. + * We use guice-config library to load all the config attributes into this class instance. + * + * The BindConfig annotation tells that honeycomb.json file should be looked up on classpath root. + */ @ToString(includeNames = true) @BindConfig(value = "honeycomb", syntax = Syntax.JSON) class HoneycombConfiguration { @@ -56,7 +62,26 @@ class HoneycombConfiguration { Optional restconfHttpsBindingAddress @InjectConfig("restconf-https-port") Optional restconfHttpsPort - + /** + * Restconf keystore file name. + * It will be loaded from the classpath so must be present in one of the folders packaged with the distribution e.g. cert/ + */ + @InjectConfig("restconf-keystore") + Optional restconfKeystore = Optional.of("/honeycomb-keystore") + @InjectConfig("restconf-keystore-password") + Optional keystorePassword + @InjectConfig("restconf-keystore-manager-password") + Optional keystoreManagerPassword + /** + * Restconf truststore file name. + * It will be loaded from the classpath so must be present in one of the folders packaged with the distribution e.g. cert/ + */ + @InjectConfig("restconf-truststore") + Optional restconfTruststore + @InjectConfig("restconf-truststore-password") + Optional truststorePassword + + // This is the way for optional attributes with default values to work @InjectConfig("restconf-websocket-port") Optional restconfWebsocketPort = Optional.of(7779) @@ -81,11 +106,11 @@ class HoneycombConfiguration { boolean isRestconfHttpsEnabled() { Boolean.valueOf(restconfHttps) } boolean isRestconfEnabled() { isRestconfHttpEnabled() || isRestconfHttpsEnabled() } - // NETCONF + // HONEYCOMB_NETCONF @InjectConfig("netconf-netty-threads") Integer netconfNettyThreads - // NETCONF TCP + // HONEYCOMB_NETCONF TCP @InjectConfig("netconf-tcp-enabled") String netconfTcp @InjectConfig("netconf-tcp-binding-address") @@ -93,7 +118,7 @@ class HoneycombConfiguration { @InjectConfig("netconf-tcp-binding-port") Optional netconfTcpBindingPort - // NETCONF SSH + // HONEYCOMB_NETCONF SSH @InjectConfig("netconf-ssh-enabled") String netconfSsh @InjectConfig("netconf-ssh-binding-address") diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ConfigAndOperationalPipelineModule.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ConfigAndOperationalPipelineModule.groovy index ede905d06..eb17cf36a 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ConfigAndOperationalPipelineModule.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ConfigAndOperationalPipelineModule.groovy @@ -38,6 +38,9 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree @Slf4j class ConfigAndOperationalPipelineModule extends PrivateModule { + public static final String HONEYCOMB_CONFIG_NONPERSIST = "honeycomb-config-nopersist" + public static final String HONEYCOMB_CONFIG = "honeycomb-config" + protected void configure() { // Expose registries for plugin reader/writer factories bind(ModifiableWriterRegistryBuilder).toProvider(WriterRegistryProvider).in(Singleton) @@ -45,43 +48,48 @@ class ConfigAndOperationalPipelineModule extends PrivateModule { bind(ModifiableReaderRegistryBuilder).toProvider(ReaderRegistryProvider).in(Singleton) expose(ModifiableReaderRegistryBuilder) - // Non persisting data tree + // Non persisting data tree for config bind(DataTree) - .annotatedWith(Names.named("honeycomb-config-nopersist")) + .annotatedWith(Names.named(HONEYCOMB_CONFIG_NONPERSIST)) .toProvider(DataTreeProvider.ConfigDataTreeProvider) .in(Singleton) - expose(DataTree).annotatedWith(Names.named("honeycomb-config-nopersist")) - // Persisting data tree wrapper + expose(DataTree).annotatedWith(Names.named(HONEYCOMB_CONFIG_NONPERSIST)) + // Persisting data tree wrapper for config bind(DataTree) - .annotatedWith(Names.named("honeycomb-config")) + .annotatedWith(Names.named(HONEYCOMB_CONFIG)) .toProvider(PersistingDataTreeProvider.ConfigPersistingDataTreeProvider) .in(Singleton) - expose(DataTree).annotatedWith(Names.named("honeycomb-config")) + expose(DataTree).annotatedWith(Names.named(HONEYCOMB_CONFIG)) + // Config Data Tree manager working on top of config data tree + writer registry bind(ModifiableDataManager).toProvider(ModifiableDTDelegProvider).in(Singleton) + // Operational Data Tree manager working on top of reader registry bind(ReadableDataManager).toProvider(ReadableDTDelegProvider).in(Singleton) expose(ReadableDataManager) + // DOMDataBroker wrapper on top of data tree managers def domBrokerProvider = new HoneycombDOMDataBrokerProvider() -// bind(DOMDataBroker).annotatedWith(Names.named("honeycomb-config")).toProvider(domBrokerProvider).in(Singleton) - // Bind also without annotation for easy private injection bind(DOMDataBroker).toProvider(domBrokerProvider).in(Singleton) - bind(DataBroker).annotatedWith(Names.named("honeycomb-config")).toProvider(BindingDataBrokerProvider).in(Singleton) - expose(DataBroker).annotatedWith(Names.named("honeycomb-config")) + // BA version of data broker + bind(DataBroker).annotatedWith(Names.named(HONEYCOMB_CONFIG)).toProvider(BindingDataBrokerProvider).in(Singleton) + expose(DataBroker).annotatedWith(Names.named(HONEYCOMB_CONFIG)) + // Create initializer to init persisted config data bind(DataTreeInitializer) - .annotatedWith(Names.named("honeycomb-config")) + .annotatedWith(Names.named(HONEYCOMB_CONFIG)) .toProvider(PersistedFileInitializerProvider.PersistedConfigInitializerProvider) .in(Singleton) - expose(DataTreeInitializer).annotatedWith(Names.named("honeycomb-config")) + expose(DataTreeInitializer).annotatedWith(Names.named(HONEYCOMB_CONFIG)) configureNotifications() } protected void configureNotifications() { + // Create notification service bind(DOMNotificationRouter).toProvider(DOMNotificationServiceProvider).in(Singleton) expose(DOMNotificationRouter) + // Wrap notification service, data broker and schema service in a Broker MD-SAL API bind(Broker).toProvider(HoneycombDOMBrokerProvider).in(Singleton) expose(Broker) } diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombDOMBrokerProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombDOMBrokerProvider.groovy index 5dc98cded..dc620b445 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombDOMBrokerProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombDOMBrokerProvider.groovy @@ -31,7 +31,6 @@ import org.opendaylight.controller.sal.core.api.model.SchemaService class HoneycombDOMBrokerProvider extends ProviderTrait { @Inject -// @Named("honeycomb-config") DOMDataBroker domDataBroker @Inject SchemaService schemaService diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombNotificationManagerProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombNotificationManagerProvider.groovy index 473112341..b81a8d784 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombNotificationManagerProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/HoneycombNotificationManagerProvider.groovy @@ -28,9 +28,7 @@ import io.fd.honeycomb.notification.impl.NotificationProducerTracker import org.opendaylight.controller.md.sal.binding.impl.BindingDOMNotificationPublishServiceAdapter import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec import org.opendaylight.controller.md.sal.dom.broker.impl.DOMNotificationRouter -/** - * Mirror of org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.notification.impl.rev160601.HoneycombNotificationManagerModule - */ + @Slf4j @ToString class HoneycombNotificationManagerProvider extends ProviderTrait { diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/InmemoryDOMDataBrokerProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/InmemoryDOMDataBrokerProvider.groovy index 6462baa71..a04f1a81c 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/InmemoryDOMDataBrokerProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/InmemoryDOMDataBrokerProvider.groovy @@ -28,9 +28,7 @@ import org.opendaylight.controller.md.sal.dom.broker.impl.SerializedDOMDataBroke import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore import org.opendaylight.yangtools.util.concurrent.DeadlockDetectingListeningExecutorService import org.opendaylight.yangtools.util.concurrent.SpecialExecutors -/** - * Mirror of org.opendaylight.controller.config.yang.md.sal.dom.impl.DomInmemoryDataBrokerModule - */ + @Slf4j @ToString class InmemoryDOMDataBrokerProvider extends ProviderTrait { diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ModifiableDTDelegProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ModifiableDTDelegProvider.groovy index f7ec4cc12..cd4d9c624 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ModifiableDTDelegProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/ModifiableDTDelegProvider.groovy @@ -23,6 +23,7 @@ import groovy.util.logging.Slf4j import io.fd.honeycomb.data.ModifiableDataManager import io.fd.honeycomb.data.impl.ModifiableDataTreeDelegator import io.fd.honeycomb.infra.distro.ProviderTrait +import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder import org.opendaylight.controller.md.sal.binding.api.DataBroker import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec @@ -35,12 +36,12 @@ class ModifiableDTDelegProvider extends ProviderTrait { @Inject BindingToNormalizedNodeCodec serializer @Inject - @Named("honeycomb-config") + @Named(ConfigAndOperationalPipelineModule.HONEYCOMB_CONFIG) DataTree dataTree @Inject ModifiableWriterRegistryBuilder registry @Inject - @Named("honeycomb-context") + @Named(ContextPipelineModule.HONEYCOMB_CONTEXT) DataBroker contextBroker @Override diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/PersistingDataTreeProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/PersistingDataTreeProvider.groovy index 753963309..6c41ad69f 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/PersistingDataTreeProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/PersistingDataTreeProvider.groovy @@ -23,6 +23,7 @@ import groovy.util.logging.Slf4j import io.fd.honeycomb.data.impl.PersistingDataTreeAdapter import io.fd.honeycomb.infra.distro.ProviderTrait import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration +import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule import org.opendaylight.controller.sal.core.api.model.SchemaService import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType @@ -49,7 +50,7 @@ abstract class PersistingDataTreeProvider extends ProviderTrait { static class ConfigPersistingDataTreeProvider extends PersistingDataTreeProvider { @Inject - @Named("honeycomb-config-nopersist") + @Named(ConfigAndOperationalPipelineModule.HONEYCOMB_CONFIG_NONPERSIST) DataTree delegate String getPath() { config.peristConfigPath } @@ -60,7 +61,7 @@ abstract class PersistingDataTreeProvider extends ProviderTrait { static class ContextPersistingDataTreeProvider extends PersistingDataTreeProvider { @Inject - @Named("honeycomb-context-nopersist") + @Named(ContextPipelineModule.HONEYCOMB_CONTEXT_NOPERSIST) DataTree delegate String getPath() { config.peristContextPath } diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/ContextPipelineModule.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/ContextPipelineModule.groovy index 25244cb2f..a4cf73162 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/ContextPipelineModule.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/ContextPipelineModule.groovy @@ -32,44 +32,45 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree class ContextPipelineModule extends PrivateModule { - protected void configure() { - // Bind also without annotation for easy private injection + public static final String HONEYCOMB_CONTEXT_NOPERSIST = "honeycomb-context-nopersist" + public static final String HONEYCOMB_CONTEXT = "honeycomb-context" - // Non persisting data tree + protected void configure() { + // Non persisting data tree for context def noPersistDataTreeProvider = new DataTreeProvider.ContextDataTreeProvider() bind(DataTree) - .annotatedWith(Names.named("honeycomb-context-nopersist")) + .annotatedWith(Names.named(HONEYCOMB_CONTEXT_NOPERSIST)) .toProvider(noPersistDataTreeProvider) .in(Singleton) - expose(DataTree).annotatedWith(Names.named("honeycomb-context-nopersist")) - // Persisting data tree wrapper + expose(DataTree).annotatedWith(Names.named(HONEYCOMB_CONTEXT_NOPERSIST)) + // Persisting data tree wrapper for context def dataTreeProvider = new PersistingDataTreeProvider.ContextPersistingDataTreeProvider() bind(DataTree).toProvider(dataTreeProvider).in(Singleton) -// bind(DataTree).annotatedWith(Names.named("honeycomb-context")).toProvider(dataTreeProvider).in(Singleton) -// expose(DataTree).annotatedWith(Names.named("honeycomb-context")) + // Data Tree manager (without any delegation) on top of context data tree bind(ModifiableDataManager).toProvider(ModifiableDTMgrProvider).in(Singleton) + // DOMDataBroker interface on top of data tree manager def domBrokerProvider = new HoneycombContextDOMDataBrokerProvider() -// bind(DOMDataBroker).annotatedWith(Names.named("honeycomb-context")).toProvider(domBrokerProvider).in(Singleton) - // Bind also without annotation for easy private injection bind(DOMDataBroker).toProvider(domBrokerProvider).in(Singleton) -// expose(DOMDataBroker).annotatedWith(Names.named("honeycomb-context")) - bind(DataBroker).annotatedWith(Names.named("honeycomb-context")).toProvider(BindingDataBrokerProvider).in(Singleton) - expose(DataBroker).annotatedWith(Names.named("honeycomb-context")) + // BA version of data broker for context + bind(DataBroker).annotatedWith(Names.named(HONEYCOMB_CONTEXT)).toProvider(BindingDataBrokerProvider).in(Singleton) + expose(DataBroker).annotatedWith(Names.named(HONEYCOMB_CONTEXT)) + // Create initializer to init persisted config data bind(DataTreeInitializer) - .annotatedWith(Names.named("honeycomb-context")) + .annotatedWith(Names.named(HONEYCOMB_CONTEXT)) .toProvider(PersistedFileInitializerProvider.PersistedContextInitializerProvider) .in(Singleton) - expose(DataTreeInitializer).annotatedWith(Names.named("honeycomb-context")) + expose(DataTreeInitializer).annotatedWith(Names.named(HONEYCOMB_CONTEXT)) + // Mapping context is just a small adapter on top of BA data broker to simplify CRUD of context data bind(MappingContext) - .annotatedWith(Names.named("honeycomb-context")) + .annotatedWith(Names.named(HONEYCOMB_CONTEXT)) .toProvider(RealtimeMappingContextProvider) .in(Singleton.class) - expose(MappingContext).annotatedWith(Names.named("honeycomb-context")) + expose(MappingContext).annotatedWith(Names.named(HONEYCOMB_CONTEXT)) } } diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/RealtimeMappingContextProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/RealtimeMappingContextProvider.groovy index 3c7eebb3d..c6afd92fc 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/RealtimeMappingContextProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/context/RealtimeMappingContextProvider.groovy @@ -30,7 +30,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker class RealtimeMappingContextProvider extends ProviderTrait { @Inject - @Named("honeycomb-context") + @Named(ContextPipelineModule.HONEYCOMB_CONTEXT) DataBroker contextDataBroker @Override diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/oper/ReadableDTDelegProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/oper/ReadableDTDelegProvider.groovy index 384278793..11eaf49a4 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/oper/ReadableDTDelegProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/data/oper/ReadableDTDelegProvider.groovy @@ -23,6 +23,7 @@ import groovy.util.logging.Slf4j import io.fd.honeycomb.data.ReadableDataManager import io.fd.honeycomb.data.impl.ReadableDataTreeDelegator import io.fd.honeycomb.infra.distro.ProviderTrait +import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder import org.opendaylight.controller.md.sal.binding.api.DataBroker import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec @@ -39,7 +40,7 @@ class ReadableDTDelegProvider extends ProviderTrait { @Inject ModifiableReaderRegistryBuilder registry @Inject - @Named("honeycomb-context") + @Named(ContextPipelineModule.HONEYCOMB_CONTEXT) DataBroker contextBroker def create() { diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerPipelineModule.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerPipelineModule.groovy index 10757c1a5..4bd197385 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerPipelineModule.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerPipelineModule.groovy @@ -30,17 +30,24 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker @Slf4j class InitializerPipelineModule extends PrivateModule { + + public static final String HONEYCOMB_INITIALIZER = "honeycomb-initializer" + protected void configure() { + // Create data tree manager on top of non-persisting config data tree bind(ModifiableDataManager).toProvider(ModifiableDTDelegInitProvider).in(Singleton) + // Wrap as DOMDataBroker bind(DOMDataBroker).toProvider(HoneycombDOMDataBrokerProvider).in(Singleton) - bind(DataBroker).annotatedWith(Names.named("honeycomb-initializer")).toProvider(BindingDataBrokerProvider).in(Singleton) - expose(DataBroker).annotatedWith(Names.named("honeycomb-initializer")) + // Wrap as BA data broker + bind(DataBroker).annotatedWith(Names.named(HONEYCOMB_INITIALIZER)).toProvider(BindingDataBrokerProvider).in(Singleton) + expose(DataBroker).annotatedWith(Names.named(HONEYCOMB_INITIALIZER)) + // Create initializer registry so that plugins can provide their initializers bind(InitializerRegistry) - .annotatedWith(Names.named("honeycomb-initializer")) + .annotatedWith(Names.named(HONEYCOMB_INITIALIZER)) .toProvider(InitializerRegistryProvider) .in(Singleton) expose(InitializerRegistry) - .annotatedWith(Names.named("honeycomb-initializer")) + .annotatedWith(Names.named(HONEYCOMB_INITIALIZER)) } } diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerRegistryProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerRegistryProvider.groovy index 5f75fc026..6c90291b9 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerRegistryProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/InitializerRegistryProvider.groovy @@ -24,16 +24,18 @@ import io.fd.honeycomb.data.init.DataTreeInitializer import io.fd.honeycomb.data.init.InitializerRegistry import io.fd.honeycomb.data.init.InitializerRegistryImpl import io.fd.honeycomb.infra.distro.ProviderTrait +import io.fd.honeycomb.infra.distro.data.ConfigAndOperationalPipelineModule +import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule @Slf4j @ToString class InitializerRegistryProvider extends ProviderTrait { @Inject - @Named("honeycomb-context") + @Named(ContextPipelineModule.HONEYCOMB_CONTEXT) DataTreeInitializer contextInitializer @Inject - @Named("honeycomb-config") + @Named(ConfigAndOperationalPipelineModule.HONEYCOMB_CONFIG) DataTreeInitializer configInitializer @Inject(optional = true) Set pluginInitializers = [] diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/ModifiableDTDelegInitProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/ModifiableDTDelegInitProvider.groovy index 2a1422dae..4c132756e 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/ModifiableDTDelegInitProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/ModifiableDTDelegInitProvider.groovy @@ -23,14 +23,13 @@ import groovy.util.logging.Slf4j import io.fd.honeycomb.data.ModifiableDataManager import io.fd.honeycomb.data.impl.ModifiableDataTreeDelegator import io.fd.honeycomb.infra.distro.ProviderTrait +import io.fd.honeycomb.infra.distro.data.ConfigAndOperationalPipelineModule +import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule import io.fd.honeycomb.translate.util.write.NoopWriterRegistry import org.opendaylight.controller.md.sal.binding.api.DataBroker import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree -/** - * Similar to ModifiableDTDelegProvider, but uses noop writer registry - */ @Slf4j @ToString class ModifiableDTDelegInitProvider extends ProviderTrait { @@ -38,10 +37,10 @@ class ModifiableDTDelegInitProvider extends ProviderTrait @Inject BindingToNormalizedNodeCodec serializer @Inject - @Named("honeycomb-config-nopersist") + @Named(ConfigAndOperationalPipelineModule.HONEYCOMB_CONFIG_NONPERSIST) DataTree dataTree @Inject - @Named("honeycomb-context") + @Named(ContextPipelineModule.HONEYCOMB_CONTEXT) DataBroker contextBroker @Override diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/PersistedFileInitializerProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/PersistedFileInitializerProvider.groovy index 8979272be..bb7015e01 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/PersistedFileInitializerProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/initializer/PersistedFileInitializerProvider.groovy @@ -19,7 +19,7 @@ package io.fd.honeycomb.infra.distro.initializer import com.google.inject.Inject import groovy.transform.ToString import groovy.util.logging.Slf4j -import io.fd.honeycomb.data.init.RestorationType + import io.fd.honeycomb.data.init.RestoringInitializer import io.fd.honeycomb.infra.distro.ProviderTrait import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration @@ -28,9 +28,7 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker import org.opendaylight.controller.sal.core.api.model.SchemaService import java.nio.file.Paths -/** - * Mirror of org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.data.initializer.rev160407.PersistedFileInitializerModule - */ + @Slf4j @ToString abstract class PersistedFileInitializerProvider extends ProviderTrait { @@ -46,7 +44,7 @@ abstract class PersistedFileInitializerProvider extends ProviderTrait { @@ -48,39 +46,37 @@ class HoneycombNotification2NetconfProvider extends ProviderTrait - log.debug "Propagating notification: {} into NETCONF", notif.type + log.debug "Propagating notification: {} into HONEYCOMB_NETCONF", notif.type netconfNotifReg.onNotification(streamType, TranslationUtil.notificationToXml(notif, schemaService.globalContext)) } // NotificationManager is used to provide list of available notifications (which are all of the notifications registered) - // TODO make available notifications configurable here so that any number of notification streams for NETCONF + // TODO make available notifications configurable here so that any number of notification streams for HONEYCOMB_NETCONF // can be configured on top of a single notification manager - log.debug "Current notifications to be exposed over NETCONF: {}", hcNotificationCollector.notificationTypes + log.debug "Current notifications to be exposed over HONEYCOMB_NETCONF: {}", hcNotificationCollector.notificationTypes def currentNotificationSchemaPaths = hcNotificationCollector.notificationTypes .collect {SchemaPath.create(true, NotificationProducerRegistry.getQName(it))} // Register as listener to HC'OPERATIONAL DOM notification service - // TODO This should only be triggered when NETCONF notifications are activated + // TODO This should only be triggered when HONEYCOMB_NETCONF notifications are activated // Because this way we actually start all notification producers // final Collection notificationQNames = def domNotifListenerReg = notificationRouter .registerNotificationListener(domNotificationListener, currentNotificationSchemaPaths); - log.info "Exposing NETCONF notification stream: {}", streamType.value + log.info "Exposing HONEYCOMB_NETCONF notification stream: {}", streamType.value new HoneycombNotification2Netconf(domNotifListenerReg: domNotifListenerReg, netconfNotifReg: netconfNotifReg) } diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfBindingBrokerProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfBindingBrokerProvider.groovy index ebf6782c1..f1f49700e 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfBindingBrokerProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfBindingBrokerProvider.groovy @@ -25,15 +25,12 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker import org.opendaylight.controller.sal.binding.api.BindingAwareBroker import io.fd.honeycomb.impl.FakeBindingAwareBroker -/** - * Mirror of {@link org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.honeycomb.impl.rev141210.NetconfBindingBrokerModule} - */ @Slf4j @ToString class NetconfBindingBrokerProvider extends ProviderTrait { @Inject - @Named("netconf") + @Named(NetconfModule.HONEYCOMB_NETCONF) DataBroker dataBroker @Override diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMdsalMapperProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMdsalMapperProvider.groovy index 491eedcef..dff5319b4 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMdsalMapperProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMdsalMapperProvider.groovy @@ -26,9 +26,7 @@ import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener import org.opendaylight.netconf.mdsal.connector.MdsalNetconfOperationServiceFactory import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext -/** - * Mirror of org.opendaylight.controller.config.yang.netconf.mdsal.mapper.NetconfMdsalMapperModule - */ + @Slf4j @ToString class NetconfMdsalMapperProvider extends ProviderTrait { diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfModule.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfModule.groovy index e1f8901c7..29eeae301 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfModule.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfModule.groovy @@ -46,63 +46,77 @@ import static InmemoryDOMDataBrokerProvider.OPERATIONAL class NetconfModule extends PrivateModule { + + public static final String HONEYCOMB_NETCONF = "honeycomb-netconf" + public static final String HONEYCOMB_NETCONF_MAPPER_AGGR = "netconf-mapper-aggregator" + public static final String HONEYCOMB_NETCONF_MAPPER_NOTIF = "netconf-mapper-notification" + public static final String HONEYCOMB_NETCONF_MAPPER_CORE = "netconf-mapper-honeycomb" + public static final String HONEYCOMB_NETCONF_MAPPER_OPER = "netconf-mapper-monitoring" + @Override protected void configure() { + // Create inmemory data store for HONEYCOMB_NETCONF config metadata bind(InMemoryDOMDataStore) .annotatedWith(Names.named(CONFIG)) .toProvider(new DataStoreProvider(type: LogicalDatastoreType.CONFIGURATION, name: CONFIG)) .in(Singleton) + // Create inmemory data store for HONEYCOMB_NETCONF operational metadata bind(InMemoryDOMDataStore) .annotatedWith(Names.named(OPERATIONAL)) .toProvider(new DataStoreProvider(type: LogicalDatastoreType.OPERATIONAL, name: OPERATIONAL)) .in(Singleton) + // Wrap datastores as DOMDataBroker bind(DOMDataBroker).toProvider(InmemoryDOMDataBrokerProvider).in(Singleton) + // Wrap DOMDataBroker as BA data broker bind(DataBroker) - .annotatedWith(Names.named("netconf")) + .annotatedWith(Names.named(HONEYCOMB_NETCONF)) .toProvider(BindingDataBrokerProvider) .in(Singleton) - expose(DataBroker).annotatedWith(Names.named("netconf")) + expose(DataBroker).annotatedWith(Names.named(HONEYCOMB_NETCONF)) + + // Wrap BA data broker as BindingAwareBroker (requied by HONEYCOMB_NETCONF) bind(BindingAwareBroker) - .annotatedWith(Names.named("netconf")) + .annotatedWith(Names.named(HONEYCOMB_NETCONF)) .toProvider(NetconfBindingBrokerProvider) .in(Singleton) - // Mirror of org.opendaylight.controller.config.yang.config.netconf.northbound.impl.NetconfMapperAggregatorModule + // Create netconf operation service factory aggregator to aggregate different services def factory = new AggregatedNetconfOperationServiceFactory() bind(NetconfOperationServiceFactory) - .annotatedWith(Names.named("netconf-mapper-aggregator")) + .annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_AGGR)) .toInstance(factory) bind(NetconfOperationServiceFactoryListener).toInstance(factory) - // Mirror of org.opendaylight.controller.config.yang.netconf.northbound.notification.impl.NetconfNotificationManagerModule + // Create netconf notification manager def manager = new NetconfNotificationManager() bind(NetconfNotificationCollector).toInstance(manager) bind(NetconfNotificationRegistry).toInstance(manager) bind(NetconfNotificationListener).toInstance(manager) - // Netconf notification part + // Netconf notification service factory bind(NetconfOperationServiceFactory) - .annotatedWith(Names.named("netconf-mapper-notification")) + .annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_NOTIF)) .toProvider(NetconfNotificationMapperProvider) .in(Singleton) - expose(NetconfOperationServiceFactory).annotatedWith(Names.named("netconf-mapper-notification")) + expose(NetconfOperationServiceFactory).annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_NOTIF)) // Netconf core part - mapping between Honeycomb and Netconf bind(NetconfOperationServiceFactory) - .annotatedWith(Names.named("netconf-mapper-honeycomb")) + .annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_CORE)) .toProvider(NetconfMdsalMapperProvider) .in(Singleton) - expose(NetconfOperationServiceFactory).annotatedWith(Names.named("netconf-mapper-honeycomb")) + expose(NetconfOperationServiceFactory).annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_CORE)) - // Netconf monitoring part + // Netconf monitoring service factory bind(NetconfMonitoringService).toProvider(NetconfMonitoringServiceProvider).in(Singleton) bind(NetconfOperationServiceFactory) - .annotatedWith(Names.named("netconf-mapper-monitoring")) + .annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_OPER)) .toProvider(NetconfMonitoringMapperProvider) .in(Singleton) - expose(NetconfOperationServiceFactory).annotatedWith(Names.named("netconf-mapper-monitoring")) + expose(NetconfOperationServiceFactory).annotatedWith(Names.named(HONEYCOMB_NETCONF_MAPPER_OPER)) + // Create HC notification manager + HC2Netconf translator bind(NotificationCollector).toProvider(HoneycombNotificationManagerProvider).in(Singleton) bind(HoneycombNotification2NetconfProvider.HoneycombNotification2Netconf) .toProvider(HoneycombNotification2NetconfProvider) @@ -112,6 +126,9 @@ class NetconfModule extends PrivateModule { configureServer() } + /** + * Provide HONEYCOMB_NETCONF TCP and SSH servers + */ def configureServer() { bind(NioEventLoopGroup).toProvider(NettyThreadGroupProvider).in(Singleton) bind(Timer).toProvider(NettyTimerProvider).in(Singleton) diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringMapperProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringMapperProvider.groovy index 15daa6c81..c35a97352 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringMapperProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringMapperProvider.groovy @@ -27,15 +27,13 @@ import org.opendaylight.controller.sal.binding.api.BindingAwareBroker import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener -/** - * Mirror of org.opendaylight.controller.config.yang.netconf.mdsal.monitoring.NetconfMdsalMonitoringMapperModule - */ + @Slf4j @ToString class NetconfMonitoringMapperProvider extends ProviderTrait { @Inject - @Named("netconf") + @Named(NetconfModule.HONEYCOMB_NETCONF) BindingAwareBroker bindingAwareBroker @Inject NetconfOperationServiceFactoryListener aggregator diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringReaderFactoryProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringReaderFactoryProvider.groovy index 6c58f8b89..54a773a80 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringReaderFactoryProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringReaderFactoryProvider.groovy @@ -30,7 +30,7 @@ import io.fd.honeycomb.impl.NetconfMonitoringReaderFactory class NetconfMonitoringReaderFactoryProvider extends ProviderTrait { @Inject - @Named("netconf") + @Named(NetconfModule.HONEYCOMB_NETCONF) DataBroker netconfDataBroker def create() { new NetconfMonitoringReaderFactory(netconfDataBroker) } diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringServiceProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringServiceProvider.groovy index 4592cf4bd..cac2a13cc 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringServiceProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfMonitoringServiceProvider.groovy @@ -24,15 +24,13 @@ import io.fd.honeycomb.infra.distro.ProviderTrait import org.opendaylight.netconf.api.monitoring.NetconfMonitoringService import org.opendaylight.netconf.impl.osgi.NetconfMonitoringServiceImpl import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory -/** - * Mirror of org.opendaylight.controller.config.yang.config.netconf.northbound.impl.NetconfServerMonitoringModule - */ + @Slf4j @ToString class NetconfMonitoringServiceProvider extends ProviderTrait { @Inject - @Named("netconf-mapper-aggregator") + @Named(NetconfModule.HONEYCOMB_NETCONF_MAPPER_AGGR) NetconfOperationServiceFactory aggregator @Override diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationMapperProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationMapperProvider.groovy index 02739290f..74b384317 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationMapperProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfNotificationMapperProvider.groovy @@ -35,9 +35,7 @@ import org.opendaylight.netconf.notifications.NetconfNotificationRegistry import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Capabilities import org.opendaylight.yangtools.yang.binding.InstanceIdentifier -/** - * Mirror of org.opendaylight.controller.config.yang.netconf.mdsal.notification.NetconfMdsalNotificationMapperModule - */ + @Slf4j @ToString class NetconfNotificationMapperProvider extends ProviderTrait { @@ -50,10 +48,10 @@ class NetconfNotificationMapperProvider extends ProviderTrait { @Inject - @Named("netconf") + @Named(NetconfModule.HONEYCOMB_NETCONF) DataBroker netconfDataBroker def create() { diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfReadersModule.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfReadersModule.groovy index 91a280857..917eceeac 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfReadersModule.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfReadersModule.groovy @@ -28,6 +28,7 @@ class NetconfReadersModule extends AbstractModule { protected void configure() { // This should be part of NetconfModule, but that one is Private and Multibinders + private BASE_MODULES // do not work together, that's why there's a dedicated module here + // https://github.com/google/guice/issues/906 Multibinder.newSetBinder(binder(), ReaderFactory.class).with { addBinding().toProvider(NetconfMonitoringReaderFactoryProvider).in(Singleton) addBinding().toProvider(NetconfNotificationsReaderFactoryProvider).in(Singleton) diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfServerDispatcherProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfServerDispatcherProvider.groovy index 18019db57..10388f9c4 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfServerDispatcherProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfServerDispatcherProvider.groovy @@ -32,9 +32,7 @@ import org.opendaylight.netconf.impl.osgi.AggregatedNetconfOperationServiceFacto import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory import java.util.concurrent.TimeUnit -/** - * Mirror of org.opendaylight.controller.config.yang.config.netconf.northbound.impl.NetconfServerDispatcherModule - */ + @Slf4j @ToString class NetconfServerDispatcherProvider extends ProviderTrait { @@ -43,7 +41,7 @@ class NetconfServerDispatcherProvider extends ProviderTrait { @@ -48,7 +46,6 @@ class NetconfSshServerProvider extends ProviderTrait { @Inject NioEventLoopGroup nettyThreadgroup - // TODO merge with other executors .. one of the brokers creates also 2 internal executors private ScheduledExecutorService pool = Executors.newScheduledThreadPool(1, new ThreadFactoryBuilder().setNameFormat("netconf-ssh-%d").build()) diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfTcpServerProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfTcpServerProvider.groovy index c4e3523d0..1b0800207 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfTcpServerProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NetconfTcpServerProvider.groovy @@ -24,9 +24,7 @@ import io.fd.honeycomb.infra.distro.ProviderTrait import io.netty.channel.ChannelFuture import io.netty.util.concurrent.GenericFutureListener import org.opendaylight.netconf.api.NetconfServerDispatcher -/** - * Mirror of org.opendaylight.controller.config.yang.netconf.northbound.tcp.NetconfNorthboundTcpModule - */ + @Slf4j @ToString class NetconfTcpServerProvider extends ProviderTrait { diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NettyThreadGroupProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NettyThreadGroupProvider.groovy index bff8e3d8e..90948647d 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NettyThreadGroupProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NettyThreadGroupProvider.groovy @@ -23,9 +23,7 @@ import groovy.util.logging.Slf4j import io.fd.honeycomb.infra.distro.ProviderTrait import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration import io.netty.channel.nio.NioEventLoopGroup -/** - * Mirror of org.opendaylight.controller.config.yang.netty.threadgroup.NettyThreadgroupModule - */ + @Slf4j @ToString class NettyThreadGroupProvider extends ProviderTrait { diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NettyTimerProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NettyTimerProvider.groovy index 347417bd2..e889633ed 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NettyTimerProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/netconf/NettyTimerProvider.groovy @@ -23,9 +23,7 @@ import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration import io.fd.honeycomb.infra.distro.ProviderTrait import io.netty.util.HashedWheelTimer import io.netty.util.Timer -/** - * Mirror of org.opendaylight.controller.config.yang.netty.timer.HashedWheelTimerModule - */ + @Slf4j @ToString class NettyTimerProvider extends ProviderTrait { diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpsConnectorProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpsConnectorProvider.groovy index 6ce5a1555..388aa2bbe 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpsConnectorProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/HttpsConnectorProvider.groovy @@ -11,9 +11,6 @@ import org.eclipse.jetty.util.ssl.SslContextFactory class HttpsConnectorProvider extends ProviderTrait { - public static final String KEYSTORE_PASSWORD = "OBF:1v9s1unr1unn1vv51zlk1t331vg91x1b1vgl1t331zly1vu51uob1uo71v8u" - public static final String KEYSTORE_NAME = "/honeycomb-keystore" - @Inject HoneycombConfiguration cfg @Inject @@ -32,12 +29,14 @@ class HttpsConnectorProvider extends ProviderTrait { // openssl pkcs12 -inkey honeycomb.key -in honeycomb.crt -export -out honeycomb.pkcs12 // keytool -importkeystore -srckeystore honeycomb.pkcs12 -srcstoretype PKCS12 -destkeystore honeycomb-keystore def sslContextFactory = new SslContextFactory() - def keystoreURL = getClass().getResource(KEYSTORE_NAME) + def keystoreURL = getClass().getResource(cfg.restconfKeystore.get()) sslContextFactory.setKeyStorePath(keystoreURL.path) - sslContextFactory.setKeyStorePassword(KEYSTORE_PASSWORD) - sslContextFactory.setKeyManagerPassword(KEYSTORE_PASSWORD) - sslContextFactory.setTrustStorePath(keystoreURL.path) - sslContextFactory.setTrustStorePassword(KEYSTORE_PASSWORD) + sslContextFactory.setKeyStorePassword(cfg.keystorePassword.get()) + sslContextFactory.setKeyManagerPassword((cfg.keystoreManagerPassword.get())) + def truststoreURL = getClass().getResource(cfg.restconfTruststore.get()) + sslContextFactory.setTrustStorePath(truststoreURL.path) + sslContextFactory.setTrustStorePassword((cfg.truststorePassword.get())) + // TODO make this more configurable sslContextFactory.setExcludeCipherSuites( "SSL_RSA_WITH_DES_CBC_SHA", "SSL_DHE_RSA_WITH_DES_CBC_SHA", diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/JettyServerProvider.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/JettyServerProvider.groovy index ff6c300ea..14e6ae6f2 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/JettyServerProvider.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/JettyServerProvider.groovy @@ -46,7 +46,6 @@ class JettyServerProvider extends ProviderTrait { // Load Realm for basic auth def service = new HashLoginService(REALM) // Reusing the name as role - // TODO make this more configurable service.putUser(cfg.username, new Password(cfg.password), cfg.username) server.addBean(service) diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/RestconfModule.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/RestconfModule.groovy index 4a66a1c3c..e8594a8c3 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/RestconfModule.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/restconf/RestconfModule.groovy @@ -27,10 +27,13 @@ import org.opendaylight.netconf.sal.rest.api.RestConnector @Slf4j class RestconfModule extends AbstractModule { + public static final String RESTCONF_HTTP = "restconf-http" + public static final String RESTCONF_HTTPS = "restconf-https" + protected void configure() { bind(Server).toProvider(JettyServerProvider).in(Singleton) - bind(ServerConnector).annotatedWith(Names.named("restconf-http")).toProvider(HttpConnectorProvider).in(Singleton) - bind(ServerConnector).annotatedWith(Names.named("restconf-https")).toProvider(HttpsConnectorProvider).in(Singleton) + bind(ServerConnector).annotatedWith(Names.named(RESTCONF_HTTP)).toProvider(HttpConnectorProvider).in(Singleton) + bind(ServerConnector).annotatedWith(Names.named(RESTCONF_HTTPS)).toProvider(HttpsConnectorProvider).in(Singleton) bind(RestConnector).toProvider(RestconfProvider).in(Singleton) } } diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/YangBindingProviderModule.groovy b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/YangBindingProviderModule.groovy index 3ea4bcaa6..d8c4e3927 100644 --- a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/YangBindingProviderModule.groovy +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/schema/YangBindingProviderModule.groovy @@ -22,6 +22,7 @@ import com.google.inject.Singleton import com.google.inject.multibindings.Multibinder import groovy.util.logging.Slf4j import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider + /** * Load all YangModelBindingProvider classes from classpath. *

diff --git a/infra/minimal-distribution/src/main/resources/honeycomb-minimal-resources/cert/honeycomb.pkcs12 b/infra/minimal-distribution/src/main/resources/honeycomb-minimal-resources/cert/honeycomb.pkcs12 deleted file mode 100644 index e2f4fdd82..000000000 Binary files a/infra/minimal-distribution/src/main/resources/honeycomb-minimal-resources/cert/honeycomb.pkcs12 and /dev/null differ diff --git a/infra/minimal-distribution/src/main/resources/honeycomb-minimal-resources/config/honeycomb.json b/infra/minimal-distribution/src/main/resources/honeycomb-minimal-resources/config/honeycomb.json index ba54695de..3791cc248 100644 --- a/infra/minimal-distribution/src/main/resources/honeycomb-minimal-resources/config/honeycomb.json +++ b/infra/minimal-distribution/src/main/resources/honeycomb-minimal-resources/config/honeycomb.json @@ -6,13 +6,18 @@ "notification-service-queue-depth": 1, - "restconf-http-enabled": "false", + "restconf-http-enabled": "true", "restconf-root-path": "/restconf", "restconf-binding-address": "127.0.0.1", "restconf-port": 8181, - "restconf-https-enabled": "false", + "restconf-https-enabled": "true", "restconf-https-binding-address": "0.0.0.0", "restconf-https-port": 8443, + "restconf-keystore": "/honeycomb-keystore", + "restconf-keystore-password": "OBF:1v9s1unr1unn1vv51zlk1t331vg91x1b1vgl1t331zly1vu51uob1uo71v8u", + "restconf-keystore-manager-password": "OBF:1v9s1unr1unn1vv51zlk1t331vg91x1b1vgl1t331zly1vu51uob1uo71v8u", + "restconf-truststore": "/honeycomb-keystore", + "restconf-truststore-password": "OBF:1v9s1unr1unn1vv51zlk1t331vg91x1b1vgl1t331zly1vu51uob1uo71v8u", "restconf-websocket-port": 7779, "restconf-pool-max-size": 10, "restconf-pool-min-size": 1, @@ -25,7 +30,7 @@ "netconf-tcp-enabled" : "true", "netconf-tcp-binding-address": "127.0.0.1", "netconf-tcp-binding-port": 7777, - "netconf-ssh-enabled" : "false", + "netconf-ssh-enabled" : "true", "netconf-ssh-binding-address": "0.0.0.0", "netconf-ssh-binding-port": 2831, "netconf-notification-stream-name": "honeycomb", diff --git a/samples/interfaces/mapping/pom.xml b/samples/interfaces/mapping/pom.xml index 5cd903acd..d5f6b07ad 100644 --- a/samples/interfaces/mapping/pom.xml +++ b/samples/interfaces/mapping/pom.xml @@ -30,6 +30,7 @@ 4.1.0 1.2.0 + 1.0.0-SNAPSHOT @@ -58,22 +59,22 @@ io.fd.honeycomb translate-impl - 1.0.0-SNAPSHOT + ${honeycomb.infra.version} io.fd.honeycomb translate-api - 1.0.0-SNAPSHOT + ${honeycomb.infra.version} io.fd.honeycomb notification-api - 1.0.0-SNAPSHOT + ${honeycomb.infra.version} io.fd.honeycomb cfg-init - 1.0.0-SNAPSHOT + ${honeycomb.infra.version} diff --git a/samples/minimal-distribution/pom.xml b/samples/minimal-distribution/pom.xml index 900d66ae9..5592b981c 100644 --- a/samples/minimal-distribution/pom.xml +++ b/samples/minimal-distribution/pom.xml @@ -30,6 +30,8 @@ -Xms128m -Xmx128m io.fd.honeycomb.samples.distro.Main + 1.0.0-SNAPSHOT + 1.0.0-SNAPSHOT @@ -59,12 +61,12 @@ io.fd.honeycomb.samples.interfaces interfaces-mapping - 1.0.0-SNAPSHOT + ${interfaces.mapping.version} io.fd.honeycomb minimal-distribution - 1.0.0-SNAPSHOT + ${honeycomb.min.distro.version} diff --git a/v3po/v3po2vpp/pom.xml b/v3po/v3po2vpp/pom.xml index 4848ae949..62fced58d 100644 --- a/v3po/v3po2vpp/pom.xml +++ b/v3po/v3po2vpp/pom.xml @@ -55,29 +55,11 @@ ${project.version} - - - org.opendaylight.controller - config-util - 0.4.2-Beryllium-SR2 - - - org.opendaylight.controller - threadpool-config-api - 0.4.2-Beryllium-SR2 - - - io.fd.honeycomb translate-impl ${project.version} - - io.fd.honeycomb.vpp - vpp-jvpp-cfg - ${project.version} - io.fd.honeycomb cfg-init diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/V3poModule.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/V3poModule.java index aafd0154a..4effb70e3 100644 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/V3poModule.java +++ b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/V3poModule.java @@ -24,7 +24,7 @@ import io.fd.honeycomb.notification.ManagedNotificationProducer; import io.fd.honeycomb.translate.read.ReaderFactory; import io.fd.honeycomb.translate.v3po.cfgattrs.V3poConfiguration; import io.fd.honeycomb.translate.v3po.initializers.InterfacesInitializer; -import io.fd.honeycomb.translate.v3po.initializers.VppClasifierInitializer; +import io.fd.honeycomb.translate.v3po.initializers.VppClassifierInitializer; import io.fd.honeycomb.translate.v3po.initializers.VppInitializer; import io.fd.honeycomb.translate.v3po.notification.InterfaceChangeNotificationProducer; import io.fd.honeycomb.translate.v3po.util.NamingContext; @@ -32,7 +32,6 @@ import io.fd.honeycomb.translate.write.WriterFactory; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import net.jmob.guice.conf.core.ConfigurationModule; -import org.opendaylight.controller.config.threadpool.ScheduledThreadPool; public class V3poModule extends AbstractModule { @@ -53,19 +52,7 @@ public class V3poModule extends AbstractModule { .toInstance(new NamingContext("classify-table-", "classify-table-context")); // Executor needed for keepalives - // TODO-minimal remove the funny wrapper. it is only here because of config subsystem - final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); - bind(ScheduledThreadPool.class).toInstance(new ScheduledThreadPool() { - @Override - public ScheduledExecutorService getExecutor() { - return executor; - } - - @Override - public int getMaxThreadCount() { - return 1; - } - }); + bind(ScheduledExecutorService.class).toInstance(Executors.newScheduledThreadPool(1)); // Readers final Multibinder readerFactoryBinder = Multibinder.newSetBinder(binder(), ReaderFactory.class); @@ -83,7 +70,7 @@ public class V3poModule extends AbstractModule { final Multibinder initializerBinder = Multibinder.newSetBinder(binder(), DataTreeInitializer.class); initializerBinder.addBinding().to(InterfacesInitializer.class); - initializerBinder.addBinding().to(VppClasifierInitializer.class); + initializerBinder.addBinding().to(VppClassifierInitializer.class); initializerBinder.addBinding().to(VppInitializer.class); // Notifications diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppStateHoneycombReaderFactory.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppStateHoneycombReaderFactory.java index f39502c09..d8e4f29b5 100644 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppStateHoneycombReaderFactory.java +++ b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppStateHoneycombReaderFactory.java @@ -28,7 +28,7 @@ import io.fd.honeycomb.translate.v3po.util.ReadTimeoutException; import io.fd.honeycomb.translate.v3po.vppstate.BridgeDomainCustomizer; import io.fd.honeycomb.translate.v3po.vppstate.L2FibEntryCustomizer; import io.fd.honeycomb.translate.v3po.vppstate.VersionCustomizer; -import org.opendaylight.controller.config.threadpool.ScheduledThreadPool; +import java.util.concurrent.ScheduledExecutorService; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppState; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppStateBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.fib.attributes.L2FibTable; @@ -50,13 +50,13 @@ public final class VppStateHoneycombReaderFactory implements ReaderFactory, Auto private final FutureJVpp jVpp; private final NamingContext ifcCtx; private final NamingContext bdCtx; - private final ScheduledThreadPool keepaliveExecutor; + private final ScheduledExecutorService keepaliveExecutor; @Inject public VppStateHoneycombReaderFactory(final FutureJVpp jVpp, @Named("interface-context") final NamingContext ifcCtx, @Named("bridge-domain-context") final NamingContext bdCtx, - final ScheduledThreadPool keepaliveExecutorDependency) { + final ScheduledExecutorService keepaliveExecutorDependency) { this.jVpp = jVpp; this.ifcCtx = ifcCtx; this.bdCtx = bdCtx; @@ -75,7 +75,7 @@ public final class VppStateHoneycombReaderFactory implements ReaderFactory, Auto // is truly generic registry.add(new KeepaliveReaderWrapper<>( new GenericReader<>(vppStateId.child(Version.class), new VersionCustomizer(jVpp)), - keepaliveExecutor.getExecutor(), ReadTimeoutException.class, 30, + keepaliveExecutor, ReadTimeoutException.class, 30, // FIXME-minimal trigger jvpp reinitialization here () -> LOG.error("Keepalive failed. VPP is probably DOWN!"))); // BridgeDomains(Structural) diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/initializers/VppClasifierInitializer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/initializers/VppClasifierInitializer.java deleted file mode 100644 index b97586830..000000000 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/initializers/VppClasifierInitializer.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2016 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.translate.v3po.initializers; - -import com.google.inject.Inject; -import com.google.inject.name.Named; -import io.fd.honeycomb.data.init.AbstractDataTreeConverter; -import java.util.stream.Collectors; -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.vpp.classifier.rev150603.VppClassifier; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.VppClassifierBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.VppClassifierState; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.vpp.classifier.ClassifyTableBuilder; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -/** - * Initializes vpp-classfier node in config data tree based on operational state. - */ -public final class VppClasifierInitializer extends AbstractDataTreeConverter { - private static final InstanceIdentifier OPER_ID = - InstanceIdentifier.create(VppClassifierState.class); - private static final InstanceIdentifier CFG_ID = InstanceIdentifier.create(VppClassifier.class); - - @Inject - public VppClasifierInitializer(@Named("honeycomb-initializer") @Nonnull final DataBroker bindingDataBroker) { - super(bindingDataBroker, OPER_ID, CFG_ID); - } - - @Override - protected VppClassifier convert(final VppClassifierState operationalData) { - final VppClassifierBuilder builder = new VppClassifierBuilder(); - builder.setClassifyTable(operationalData.getClassifyTable().stream() - .map(oper -> new ClassifyTableBuilder(oper).setName(oper.getName()).build()) - .collect(Collectors.toList())); - return builder.build(); - } -} diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/initializers/VppClassifierInitializer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/initializers/VppClassifierInitializer.java new file mode 100644 index 000000000..038b6caa3 --- /dev/null +++ b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/initializers/VppClassifierInitializer.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2016 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.translate.v3po.initializers; + +import com.google.inject.Inject; +import com.google.inject.name.Named; +import io.fd.honeycomb.data.init.AbstractDataTreeConverter; +import java.util.stream.Collectors; +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.vpp.classifier.rev150603.VppClassifier; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.VppClassifierBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.VppClassifierState; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.vpp.classifier.ClassifyTableBuilder; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * Initializes vpp-classfier node in config data tree based on operational state. + */ +public final class VppClassifierInitializer extends AbstractDataTreeConverter { + private static final InstanceIdentifier OPER_ID = + InstanceIdentifier.create(VppClassifierState.class); + private static final InstanceIdentifier CFG_ID = InstanceIdentifier.create(VppClassifier.class); + + @Inject + public VppClassifierInitializer(@Named("honeycomb-initializer") @Nonnull final DataBroker bindingDataBroker) { + super(bindingDataBroker, OPER_ID, CFG_ID); + } + + @Override + protected VppClassifier convert(final VppClassifierState operationalData) { + final VppClassifierBuilder builder = new VppClassifierBuilder(); + builder.setClassifyTable(operationalData.getClassifyTable().stream() + .map(oper -> new ClassifyTableBuilder(oper).setName(oper.getName()).build()) + .collect(Collectors.toList())); + return builder.build(); + } +} diff --git a/vpp-common/minimal-distribution/pom.xml b/vpp-common/minimal-distribution/pom.xml index 4500a633d..4efe12b54 100644 --- a/vpp-common/minimal-distribution/pom.xml +++ b/vpp-common/minimal-distribution/pom.xml @@ -29,6 +29,7 @@ io.fd.honeycomb.vpp.distro.Main + 1.0.0-SNAPSHOT @@ -75,7 +76,7 @@ io.fd.honeycomb minimal-distribution - 1.0.0-SNAPSHOT + ${honeycomb.min.distro.version} ${project.groupId} @@ -87,11 +88,6 @@ naming-context-impl ${project.version} - - ${project.groupId} - vpp-jvpp-cfg - ${project.version} - io.fd.vpp jvpp diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/ContextsReaderFactoryProvider.groovy b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/ContextsReaderFactoryProvider.groovy index 5016d4e19..e056f38f8 100644 --- a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/ContextsReaderFactoryProvider.groovy +++ b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/ContextsReaderFactoryProvider.groovy @@ -21,6 +21,7 @@ import com.google.inject.name.Named import groovy.transform.ToString import groovy.util.logging.Slf4j import io.fd.honeycomb.infra.distro.ProviderTrait +import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule import io.fd.honeycomb.translate.read.ReaderFactory import org.opendaylight.controller.md.sal.binding.api.DataBroker import io.fd.honeycomb.vpp.context.ContextsReaderFactory @@ -33,7 +34,7 @@ import io.fd.honeycomb.vpp.context.ContextsReaderFactory class ContextsReaderFactoryProvider extends ProviderTrait { @Inject - @Named("honeycomb-context") + @Named(ContextPipelineModule.HONEYCOMB_CONTEXT) DataBroker contextDataBroker def create() { new ContextsReaderFactory(contextDataBroker) } diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppProvider.groovy b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppProvider.groovy index dfd0c44ae..51bf5be9e 100644 --- a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppProvider.groovy +++ b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppProvider.groovy @@ -25,6 +25,9 @@ import org.openvpp.jvpp.VppJNIConnection import org.openvpp.jvpp.future.FutureJVpp import org.openvpp.jvpp.future.FutureJVppFacade +/** + * This must be a singleton due to shutdown hook usage. + */ @Slf4j @ToString class JVppProvider extends ProviderTrait { @@ -38,8 +41,8 @@ class JVppProvider extends ProviderTrait { def jVpp = new JVppImpl(connection) // Closing JVpp connection with shutdown hook to erase the connection from VPP so HC will be able - // to connect next time - // TODO is there a safer way than a shutdown hook ? + // to connect next time. If JVM is force closed, this will not be executed and VPP connection + // with name from config will stay open and prevent next startup of HC to success Runtime.addShutdownHook { log.info("Disconnecting from VPP") jVpp.close() diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.groovy b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.groovy index 4c2573ca1..68261c34d 100644 --- a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.groovy +++ b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.groovy @@ -34,7 +34,7 @@ public final class VppCommonModule extends AbstractModule { bind(FutureJVpp).toProvider(JVppProvider).in(Singleton) - // Naming contexts reader exposing context storage over REST/NETCONF + // Naming contexts reader exposing context storage over REST/HONEYCOMB_NETCONF Multibinder.newSetBinder(binder(), ReaderFactory.class).with { addBinding().toProvider(ContextsReaderFactoryProvider).in(Singleton) } diff --git a/vpp-integration/minimal-distribution/pom.xml b/vpp-integration/minimal-distribution/pom.xml index 80f03f845..6985b3bbb 100644 --- a/vpp-integration/minimal-distribution/pom.xml +++ b/vpp-integration/minimal-distribution/pom.xml @@ -29,6 +29,8 @@ io.fd.honeycomb.vpp.integration.distro.Main + 1.0.0-SNAPSHOT + 1.0.0-SNAPSHOT @@ -58,12 +60,12 @@ io.fd.honeycomb.vpp minimal-distribution - 1.0.0-SNAPSHOT + ${vpp.common.min.distro.version} io.fd.honeycomb.v3po v3po2vpp - 1.0.0-SNAPSHOT + ${v3po.version} -- cgit 1.2.3-korg