diff options
29 files changed, 526 insertions, 307 deletions
diff --git a/common/minimal-distribution-parent/pom.xml b/common/minimal-distribution-parent/pom.xml index b003231c3..eb68991c4 100644 --- a/common/minimal-distribution-parent/pom.xml +++ b/common/minimal-distribution-parent/pom.xml @@ -60,6 +60,12 @@ done http://stackoverflow.com/questions/137212/how-to-solve-performance-problem-with-java-securerandom --> <random.seed.file>/dev/./urandom</random.seed.file> + <no.modules.defined.message>// This distribution does not define any own modules. +// In order to do so either distribution.modules property must be defined in distribution pom.xml, +// containing list of desired modules to start, or this file can be directly edited with same effect. +// +// Note : Modules should be referenced by full class name, for ex.: io.fd.test.SampleModule, and separated with comma. + </no.modules.defined.message> </properties> <dependencyManagement> @@ -127,7 +133,7 @@ done <classpathMavenRepositoryLayout>true</classpathMavenRepositoryLayout> </manifest> <manifestEntries> - <Class-Path>config/ cert/</Class-Path> + <Class-Path>config/ cert/ modules/</Class-Path> </manifestEntries> </archive> </configuration> @@ -167,11 +173,13 @@ done </plugin> <!-- Generate shell script --> + <!-- Extract modules started by distribution --> <plugin> <groupId>org.codehaus.gmaven</groupId> <artifactId>groovy-maven-plugin</artifactId> <executions> <execution> + <id>start-scripts-generation</id> <phase>package</phase> <goals> <goal>execute</goal> @@ -210,6 +218,48 @@ done </source> </configuration> </execution> + <execution> + <id>distribution-module-assembly</id> + <!-- phase changed from package to earlier phase to generate module descriptor before distribution jar is created, + to include descriptor in the jar,to be accessible to children distributions--> + <phase>prepare-package</phase> + <goals> + <goal>execute</goal> + </goals> + <configuration> + <source>import java.nio.file.Paths + import java.nio.file.Files + + // module configuration file extraction + // builds project name from group,artifact and version to prevent overwriting + // while building multiple distribution project + def artifact = project.getArtifact() + def projectName = "${artifact.getGroupId()}_${artifact.getArtifactId()}_${artifact.getVersion()}".replace(".","-") + log.info "Generating list of modules started by distribution ${projectName}" + + def activeModules = properties.getProperty("distribution.modules", "") + .tokenize(",") + .collect { module -> module.trim() } + + log.info "Project ${projectName} : Found modules ${activeModules}" + //creates folder modules + + def outputPath = Paths.get(project.build.outputDirectory, "honeycomb-minimal-resources", "modules") + //creates module folder + outputPath.toFile().mkdirs() + + def outputFile = Paths.get(outputPath.toString(), "${projectName}_module-config.txt").toFile() + outputFile.createNewFile(); + log.info("Writing module configuration for distribution ${projectName} to ${outputPath}") + + if (activeModules.isEmpty()) { + outputFile.text = properties.getProperty("no.modules.defined.message") + } else { + outputFile.text = activeModules.join(System.lineSeparator) + } + </source> + </configuration> + </execution> </executions> </plugin> diff --git a/infra/minimal-distribution/pom.xml b/infra/minimal-distribution/pom.xml index 6e935b09b..d727788a0 100644 --- a/infra/minimal-distribution/pom.xml +++ b/infra/minimal-distribution/pom.xml @@ -30,6 +30,17 @@ <properties> <main.class>io.fd.honeycomb.infra.distro.Main</main.class> + <distribution.modules> + io.fd.honeycomb.infra.distro.schema.YangBindingProviderModule, + io.fd.honeycomb.infra.distro.schema.SchemaModule, + io.fd.honeycomb.infra.distro.data.ConfigAndOperationalPipelineModule, + io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule, + io.fd.honeycomb.infra.distro.initializer.InitializerPipelineModule, + io.fd.honeycomb.infra.distro.netconf.NetconfModule, + io.fd.honeycomb.infra.distro.netconf.NetconfReadersModule, + io.fd.honeycomb.infra.distro.restconf.RestconfModule, + io.fd.honeycomb.infra.distro.cfgattrs.CfgAttrsModule + </distribution.modules> </properties> <dependencies> @@ -144,6 +155,12 @@ <version>${project.version}</version> </dependency> + <!-- Utilities --> + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + </dependency> + <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> @@ -161,5 +178,15 @@ <version>0.1.54</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>hamcrest-all</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <scope>test</scope> + </dependency> </dependencies> </project> diff --git a/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/ActiveModuleProvider.java b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/ActiveModuleProvider.java new file mode 100644 index 000000000..03c56969d --- /dev/null +++ b/infra/minimal-distribution/src/main/java/io/fd/honeycomb/infra/distro/ActiveModuleProvider.java @@ -0,0 +1,154 @@ +/* + * 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.infra.distro; + +import com.google.common.collect.ImmutableList; +import com.google.inject.Module; +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import javax.annotation.Nonnull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Provides list of active modules for distribution + */ +public class ActiveModuleProvider { + + public static final String STANDARD_MODULES_RELATIVE_PATH = "../modules/"; + private static final Logger LOG = LoggerFactory.getLogger(ActiveModuleProvider.class); + + /** + * Provide unique set of active modules filtered from provided resources + */ + public static Set<Module> loadActiveModules(@Nonnull final List<String> moduleNames) { + final ClassLoader classLoader = ActiveModuleProvider.class.getClassLoader(); + LOG.info("Reading active modules configuration for distribution"); + + // process resources to resource modules + return moduleNames.stream() + .map(String::trim) + .filter(trimmedLine -> trimmedLine.length() != 0) + // filter out commented lines + .filter(nonEmptyLine -> !nonEmptyLine.startsWith("//")) + // filter duplicates + .distinct() + .map(validLine -> nameToClass(validLine, classLoader)) + // filters out classes that are not modules + .filter(ActiveModuleProvider::filterNonModules) + .map(ActiveModuleProvider::classToInstance) + .collect(Collectors.toSet()); + } + + /** + * Aggregate all resources from provided relative path into a {@code List<String>} + */ + public static List<String> aggregateResources(final String relativePath, final ClassLoader classLoader) { + try { + return Collections.list(classLoader.getResources(relativePath)).stream() + .map(ActiveModuleProvider::toURI) + .flatMap(ActiveModuleProvider::folderToFile) + .map(File::toURI) + .map(Paths::get) + // readAll lines and add them to iteration + .flatMap(ActiveModuleProvider::readLines) + .collect(Collectors.toList()); + } catch (IOException e) { + LOG.error("Unable to load resources from relative path {}", relativePath, e); + throw new IllegalStateException("Unable to load resources from relative path " + relativePath, e); + } + } + + private static Stream<File> folderToFile(final URI uri) { + final File[] files = new File(uri).listFiles(File::isFile); + + return files != null + ? ImmutableList.copyOf(files).stream() + : Collections.<File>emptyList().stream(); + } + + private static boolean filterNonModules(final Class<?> clazz) { + final boolean isModule = Module.class.isAssignableFrom(clazz); + if (!isModule) { + LOG.warn("Class {} is provided in modules configuration, but is not a Module and will be ignored", clazz); + } + return isModule; + } + + /** + * Read lines from {@code Path} + */ + private static Stream<String> readLines(final Path path) { + try { + return Files.readAllLines(path).stream(); + } catch (IOException e) { + LOG.error("Unable to read content of {}", path, e); + throw new IllegalStateException("Unable to read content of " + path, e); + } + } + + /** + * Converts {@code URL} to {@code URI} + */ + private static URI toURI(final URL url) { + try { + return url.toURI(); + } catch (URISyntaxException e) { + LOG.error("Unable to convert {} to uri", url); + throw new IllegalStateException("Unable to convert " + url + " to uri", e); + } + } + + /** + * Loads class by provided name + */ + private static Class<?> nameToClass(final String name, + final ClassLoader classLoader) { + try { + LOG.info("Loading module class {}", name); + return classLoader.loadClass(name); + } catch (ClassNotFoundException e) { + LOG.error("Unable to convert {} to class, make sure you've provided sources to classpath", name); + throw new IllegalStateException( + "Unable to convert " + name + " to class, make sure you've provided sources to classpath", e); + } + } + + /** + * Creates instance of module class + */ + private static Module classToInstance(final Class<?> moduleClass) { + try { + LOG.info("Creating instance for module {}", moduleClass); + return Module.class.cast(moduleClass.newInstance()); + } catch (InstantiationException | IllegalAccessException e) { + LOG.error("Unable to create instance for class {}", moduleClass, e); + throw new IllegalStateException("Unable to create instance for class" + moduleClass, e); + } + } +} 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 d3a562d3a..3c62382c2 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 @@ -16,8 +16,11 @@ package io.fd.honeycomb.infra.distro; +import static io.fd.honeycomb.infra.distro.ActiveModuleProvider.STANDARD_MODULES_RELATIVE_PATH; +import static io.fd.honeycomb.infra.distro.ActiveModuleProvider.aggregateResources; +import static io.fd.honeycomb.infra.distro.ActiveModuleProvider.loadActiveModules; + import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; import com.google.inject.ConfigurationException; import com.google.inject.CreationException; import com.google.inject.Guice; @@ -28,20 +31,14 @@ import com.google.inject.ProvisionException; import com.google.inject.name.Names; import io.fd.honeycomb.data.init.DataTreeInitializer; import io.fd.honeycomb.data.init.InitializerRegistry; -import io.fd.honeycomb.infra.distro.cfgattrs.CfgAttrsModule; import io.fd.honeycomb.infra.distro.cfgattrs.HoneycombConfiguration; -import io.fd.honeycomb.infra.distro.data.ConfigAndOperationalPipelineModule; -import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule; import io.fd.honeycomb.infra.distro.initializer.InitializerPipelineModule; import io.fd.honeycomb.infra.distro.netconf.HoneycombNotification2NetconfProvider; import io.fd.honeycomb.infra.distro.netconf.NetconfModule; -import io.fd.honeycomb.infra.distro.netconf.NetconfReadersModule; import io.fd.honeycomb.infra.distro.netconf.NetconfSshServerProvider; import io.fd.honeycomb.infra.distro.netconf.NetconfTcpServerProvider; import io.fd.honeycomb.infra.distro.restconf.RestconfModule; -import io.fd.honeycomb.infra.distro.schema.SchemaModule; -import io.fd.honeycomb.infra.distro.schema.YangBindingProviderModule; -import java.util.List; +import java.util.Set; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; @@ -53,29 +50,18 @@ public final class Main { private static final Logger LOG = LoggerFactory.getLogger(Main.class); - public static final List<Module> BASE_MODULES = ImmutableList.of( - // Infra - new YangBindingProviderModule(), - new SchemaModule(), - new ConfigAndOperationalPipelineModule(), - new ContextPipelineModule(), - new InitializerPipelineModule(), - new NetconfModule(), - new NetconfReadersModule(), - new RestconfModule(), - // Json config attributes - new CfgAttrsModule()); - - private Main() {} + private Main() { + } public static void main(String[] args) { - init(BASE_MODULES); + final ClassLoader classLoader = Main.class.getClassLoader(); + init(loadActiveModules(aggregateResources(STANDARD_MODULES_RELATIVE_PATH, classLoader))); } /** - * Initialize the Honeycomb infrastructure + all wired plugins. + * Initialize the Honeycomb with provided modules */ - public static Injector init(final List<? extends Module> modules) { + public static Injector init(final Set<? extends Module> modules) { try { LOG.info("Starting honeycomb"); Injector injector = Guice.createInjector(modules); diff --git a/infra/minimal-distribution/src/test/java/io/fd/honeycomb/infra/distro/ActiveModuleProviderTest.java b/infra/minimal-distribution/src/test/java/io/fd/honeycomb/infra/distro/ActiveModuleProviderTest.java new file mode 100644 index 000000000..bdadc5bd8 --- /dev/null +++ b/infra/minimal-distribution/src/test/java/io/fd/honeycomb/infra/distro/ActiveModuleProviderTest.java @@ -0,0 +1,91 @@ +/* + * 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.infra.distro; + + +import static com.google.common.collect.ImmutableList.of; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.isA; +import static org.hamcrest.core.Is.is; + +import com.google.common.collect.ImmutableList; +import com.google.inject.Module; +import java.util.List; +import java.util.Set; +import org.junit.Test; + +public class ActiveModuleProviderTest { + + @Test + public void testLoadActiveModulesSuccessfull() { + final ImmutableList rawResources = of( + "// this should be skipped", + "// io.fd.honeycomb.infra.distro.Modules$ChildModule1", + " io.fd.honeycomb.infra.distro.Modules$ChildModule2", + "io.fd.honeycomb.infra.distro.Modules$ChildModule3 ", + "io.fd.honeycomb.infra.distro.Modules$ChildModule3", + "io.fd.honeycomb.infra.distro.Modules$NonModule" + ); + + final Set<Module> activeModules = ActiveModuleProvider.loadActiveModules(rawResources); + + // first and second line should be ignored due to comment + // second,third,and fourth are valid,but should reduce module count to 2,because of duplicity + // last one does is not ancestor of Module, so it should be ignored/skipped + assertThat(activeModules, hasSize(2)); + //hasItems or containsInAnyOrder does not have/is deprecated in variant with matcher + assertThat(activeModules, hasItem(isA(io.fd.honeycomb.infra.distro.Modules.ChildModule2.class))); + assertThat(activeModules, hasItem(isA(io.fd.honeycomb.infra.distro.Modules.ChildModule3.class))); + } + + @Test(expected = IllegalStateException.class) + public void testLoadActiveModulesFailed() { + final ImmutableList rawResources = of( + "// this should be skipped", + "// io.fd.honeycomb.infra.distro.Modules$ChildModule1", + " io.fd.honeycomb.infra.distro.Modules$ChildModule2", + "### io.fd.honeycomb.infra.distro.Modules$ChildModule3 ",// it should fail because of this + "io.fd.honeycomb.infra.distro.Modules$ChildModule3", + "io.fd.honeycomb.infra.distro.Modules$NonModule" + ); + + ActiveModuleProvider.loadActiveModules(rawResources); + } + + @Test + public void testAggregateResourcesNonEmpty() { + final List<String> aggregatedResources = + ActiveModuleProvider.aggregateResources("./modules", this.getClass().getClassLoader()); + assertThat(aggregatedResources, hasSize(5)); + assertThat(aggregatedResources, hasItems(" Non-commented non-trimmed", + "//Commented", + "// Commented non-trimmed", + "Not commented", + "// Line from second file")); + } + + @Test + public void testAggregateResourcesEmpty() { + assertThat(ActiveModuleProvider.aggregateResources("/non-existing-folder", this.getClass().getClassLoader()), + is(empty())); + } + +} diff --git a/infra/minimal-distribution/src/test/java/io/fd/honeycomb/infra/distro/BaseMinimalDistributionTest.java b/infra/minimal-distribution/src/test/java/io/fd/honeycomb/infra/distro/BaseMinimalDistributionTest.java index 61042868f..8a8ddc3ef 100644 --- a/infra/minimal-distribution/src/test/java/io/fd/honeycomb/infra/distro/BaseMinimalDistributionTest.java +++ b/infra/minimal-distribution/src/test/java/io/fd/honeycomb/infra/distro/BaseMinimalDistributionTest.java @@ -16,22 +16,35 @@ package io.fd.honeycomb.infra.distro; +import static com.google.common.collect.ImmutableSet.of; import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import com.google.common.base.Charsets; import com.google.common.io.ByteStreams; +import com.google.inject.Module; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSubsystem; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; +import io.fd.honeycomb.infra.distro.cfgattrs.CfgAttrsModule; +import io.fd.honeycomb.infra.distro.data.ConfigAndOperationalPipelineModule; +import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule; +import io.fd.honeycomb.infra.distro.initializer.InitializerPipelineModule; +import io.fd.honeycomb.infra.distro.netconf.NetconfModule; +import io.fd.honeycomb.infra.distro.netconf.NetconfReadersModule; +import io.fd.honeycomb.infra.distro.restconf.RestconfModule; +import io.fd.honeycomb.infra.distro.schema.SchemaModule; +import io.fd.honeycomb.infra.distro.schema.YangBindingProviderModule; import java.io.IOException; import java.io.InputStream; import java.net.Socket; +import java.util.List; import java.util.Properties; +import java.util.Set; import javax.net.ssl.SSLContext; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustSelfSignedStrategy; @@ -57,6 +70,17 @@ public class BaseMinimalDistributionTest { private static final String NETCONF_NAMESPACE = "urn:ietf:params:xml:ns:netconf:base:1.0"; private static final int NETCONF_HELLO_WAIT = 2500; + public static final Set<Module> BASE_MODULES = of( + new YangBindingProviderModule(), + new SchemaModule(), + new ConfigAndOperationalPipelineModule(), + new ContextPipelineModule(), + new InitializerPipelineModule(), + new NetconfModule(), + new NetconfReadersModule(), + new RestconfModule(), + new CfgAttrsModule()); + @Before public void setUp() throws Exception { SSLContext sslcontext = SSLContexts.custom() @@ -76,7 +100,7 @@ public class BaseMinimalDistributionTest { */ @Test(timeout = 60000) public void test() throws Exception { - Main.init(Main.BASE_MODULES); + Main.init(BASE_MODULES); LOG.info("Testing Honeycomb base distribution"); LOG.info("Testing NETCONF TCP"); diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/Main.java b/infra/minimal-distribution/src/test/java/io/fd/honeycomb/infra/distro/Modules.java index 821bd1ef9..e30fb87ca 100644 --- a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/Main.java +++ b/infra/minimal-distribution/src/test/java/io/fd/honeycomb/infra/distro/Modules.java @@ -14,19 +14,31 @@ * limitations under the License. */ -package io.fd.honeycomb.vpp.distro; +package io.fd.honeycomb.infra.distro; -import com.google.common.collect.Lists; +import com.google.inject.AbstractModule; +import com.google.inject.Binder; import com.google.inject.Module; -import java.util.List; -public class Main { +public class Modules { - public static void main(String[] args) { - final List<Module> sampleModules = Lists.newArrayList(io.fd.honeycomb.infra.distro.Main.BASE_MODULES); + public static class ChildModule1 implements Module { + @Override + public void configure(final Binder binder) { + } + } - sampleModules.add(new VppCommonModule()); + public static class ChildModule2 implements Module { + @Override + public void configure(final Binder binder) { + } + } - io.fd.honeycomb.infra.distro.Main.init(sampleModules); + public static class ChildModule3 extends AbstractModule { + @Override + protected void configure() { + } } + + public static class NonModule{} } diff --git a/infra/minimal-distribution/src/test/resources/modules/module-config-one.txt b/infra/minimal-distribution/src/test/resources/modules/module-config-one.txt new file mode 100644 index 000000000..8d48a3c9d --- /dev/null +++ b/infra/minimal-distribution/src/test/resources/modules/module-config-one.txt @@ -0,0 +1,4 @@ +//Commented +// Commented non-trimmed +Not commented + Non-commented non-trimmed
\ No newline at end of file diff --git a/infra/minimal-distribution/src/test/resources/modules/module-config-two.txt b/infra/minimal-distribution/src/test/resources/modules/module-config-two.txt new file mode 100644 index 000000000..ef11829e9 --- /dev/null +++ b/infra/minimal-distribution/src/test/resources/modules/module-config-two.txt @@ -0,0 +1 @@ +// Line from second file
\ No newline at end of file diff --git a/nsh/impl/src/main/java/io/fd/honeycomb/vppnsh/impl/VppNshModule.java b/nsh/impl/src/main/java/io/fd/honeycomb/vppnsh/impl/VppNshModule.java index 156646628..e7d9d1535 100755 --- a/nsh/impl/src/main/java/io/fd/honeycomb/vppnsh/impl/VppNshModule.java +++ b/nsh/impl/src/main/java/io/fd/honeycomb/vppnsh/impl/VppNshModule.java @@ -17,8 +17,6 @@ package io.fd.honeycomb.vppnsh.impl; import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; import com.google.inject.Singleton; import com.google.inject.multibindings.Multibinder; import com.google.inject.name.Names; @@ -26,12 +24,10 @@ import io.fd.honeycomb.data.init.DataTreeInitializer; import io.fd.honeycomb.translate.read.ReaderFactory; import io.fd.honeycomb.translate.vpp.util.NamingContext; import io.fd.honeycomb.translate.write.WriterFactory; -import io.fd.honeycomb.vppnsh.impl.cfgattrs.VppNshConfiguration; import io.fd.honeycomb.vppnsh.impl.config.VppNshWriterFactory; import io.fd.honeycomb.vppnsh.impl.init.VppNshInitializer; import io.fd.honeycomb.vppnsh.impl.oper.VppNshReaderFactory; import io.fd.honeycomb.vppnsh.impl.util.JVppNshProvider; -import net.jmob.guice.conf.core.ConfigurationModule; import io.fd.vpp.jvpp.nsh.future.FutureJVppNsh; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,11 +41,6 @@ public final class VppNshModule extends AbstractModule { @Override protected void configure() { - // TODO HONEYCOMB-207 workaround: - if (!isEnabled()) { - LOG.info("VppNshModule is disabled. Skipping module configuration."); - return; - } LOG.info("Configuring VppNsh module"); // Naming contexts @@ -70,19 +61,4 @@ public final class VppNshModule extends AbstractModule { Multibinder.newSetBinder(binder(), DataTreeInitializer.class).addBinding().to(VppNshInitializer.class); LOG.info("NSH module successfully configured"); } - - private static boolean isEnabled() { - final Injector injector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - // These are plugin specific config attributes - install(ConfigurationModule.create()); - requestInjection(VppNshConfiguration.class); - } - }); - - final VppNshConfiguration cfgAttributes = injector.getInstance(VppNshConfiguration.class); - LOG.debug("Configuration for VppNsh module: {}", cfgAttributes); - return cfgAttributes.isNshEnabled(); - } } diff --git a/nsh/impl/src/main/java/io/fd/honeycomb/vppnsh/impl/cfgattrs/VppNshConfiguration.java b/nsh/impl/src/main/java/io/fd/honeycomb/vppnsh/impl/cfgattrs/VppNshConfiguration.java deleted file mode 100755 index e6491509d..000000000 --- a/nsh/impl/src/main/java/io/fd/honeycomb/vppnsh/impl/cfgattrs/VppNshConfiguration.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2016 Intel 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.vppnsh.impl.cfgattrs; - -import com.google.common.base.MoreObjects; - -import net.jmob.guice.conf.core.BindConfig; -import net.jmob.guice.conf.core.InjectConfig; -import net.jmob.guice.conf.core.Syntax; - -@BindConfig(value = "vppnsh", syntax = Syntax.JSON) -public class VppNshConfiguration { - - public boolean isNshEnabled() { - return Boolean.valueOf(nshEnable); - } - - @InjectConfig("nsh-enabled") - public String nshEnable; - - @Override - public String toString() { - return MoreObjects.toStringHelper(this) - .add("nshEnable", nshEnable) - .toString(); - } -} diff --git a/nsh/impl/src/main/resources/honeycomb-minimal-resources/config/vppnsh.json b/nsh/impl/src/main/resources/honeycomb-minimal-resources/config/vppnsh.json deleted file mode 100644 index b03a962f1..000000000 --- a/nsh/impl/src/main/resources/honeycomb-minimal-resources/config/vppnsh.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "nsh-enabled": "false" -}
\ No newline at end of file diff --git a/samples/minimal-distribution/pom.xml b/samples/minimal-distribution/pom.xml index d3876790f..db4966684 100644 --- a/samples/minimal-distribution/pom.xml +++ b/samples/minimal-distribution/pom.xml @@ -30,10 +30,13 @@ <properties> <exec.parameters>-Xms128m -Xmx128m</exec.parameters> - <main.class>io.fd.honeycomb.samples.distro.Main</main.class> + <main.class>io.fd.honeycomb.infra.distro.Main</main.class> <interfaces.mapping.version>1.16.12-SNAPSHOT</interfaces.mapping.version> <honeycomb.min.distro.version>1.16.12-SNAPSHOT</honeycomb.min.distro.version> <sonar.skip>true</sonar.skip> + <distribution.modules> + io.fd.honeycomb.samples.interfaces.mapping.SampleInterfaceModule + </distribution.modules> </properties> <build> diff --git a/samples/minimal-distribution/src/main/java/io/fd/honeycomb/samples/distro/Main.java b/samples/minimal-distribution/src/main/java/io/fd/honeycomb/samples/distro/Main.java deleted file mode 100644 index f6b38aa78..000000000 --- a/samples/minimal-distribution/src/main/java/io/fd/honeycomb/samples/distro/Main.java +++ /dev/null @@ -1,33 +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.samples.distro; - -import com.google.common.collect.Lists; -import com.google.inject.Module; -import io.fd.honeycomb.samples.interfaces.mapping.SampleInterfaceModule; -import java.util.List; - -public class Main { - - public static void main(String[] args) { - final List<Module> sampleModules = Lists.newArrayList(io.fd.honeycomb.infra.distro.Main.BASE_MODULES); - - sampleModules.add(new SampleInterfaceModule()); - - io.fd.honeycomb.infra.distro.Main.init(sampleModules); - } -} diff --git a/vpp-common/minimal-distribution/asciidoc/Readme.adoc b/vpp-common/minimal-distribution/asciidoc/Readme.adoc deleted file mode 100644 index 1da86caab..000000000 --- a/vpp-common/minimal-distribution/asciidoc/Readme.adoc +++ /dev/null @@ -1,3 +0,0 @@ -= minimal-distribution - -Overview of minimal-distribution
\ No newline at end of file diff --git a/vpp-common/minimal-distribution/pom.xml b/vpp-common/minimal-distribution/pom.xml deleted file mode 100644 index 12d11ec1a..000000000 --- a/vpp-common/minimal-distribution/pom.xml +++ /dev/null @@ -1,116 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - Copyright (c) 2015 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. ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - - <parent> - <groupId>io.fd.honeycomb.common</groupId> - <artifactId>minimal-distribution-parent</artifactId> - <version>1.16.12-SNAPSHOT</version> - <relativePath>../../common/minimal-distribution-parent</relativePath> - </parent> - - <modelVersion>4.0.0</modelVersion> - <groupId>io.fd.honeycomb.vpp</groupId> - <artifactId>minimal-distribution</artifactId> - <version>1.16.12-SNAPSHOT</version> - - <properties> - <main.class>io.fd.honeycomb.vpp.distro.Main</main.class> - <honeycomb.min.distro.version>1.16.12-SNAPSHOT</honeycomb.min.distro.version> - <jvpp.version>16.12-SNAPSHOT</jvpp.version> - <hamcrest.version>1.3</hamcrest.version> - </properties> - - <build> - <plugins> - <plugin> - <artifactId>maven-compiler-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.codehaus.gmaven</groupId> - <artifactId>groovy-maven-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-jar-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-dependency-plugin</artifactId> - </plugin> - <plugin> - <artifactId>maven-assembly-plugin</artifactId> - </plugin> - </plugins> - </build> - - <dependencies> - <dependency> - <groupId>io.fd.honeycomb</groupId> - <artifactId>minimal-distribution</artifactId> - <version>${honeycomb.min.distro.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>naming-context-api</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>naming-context-impl</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>io.fd.vpp</groupId> - <artifactId>jvpp-registry</artifactId> - <version>${jvpp.version}</version> - </dependency> - <dependency> - <groupId>io.fd.vpp</groupId> - <artifactId>jvpp-core</artifactId> - <version>${jvpp.version}</version> - </dependency> - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>vpp-translate-utils</artifactId> - <version>${project.version}</version> - </dependency> - - <!-- Testing Dependencies --> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-core</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>com.google.inject.extensions</groupId> - <artifactId>guice-testlib</artifactId> - <version>${guice.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.hamcrest</groupId> - <artifactId>hamcrest-all</artifactId> - <version>${hamcrest.version}</version> - <scope>test</scope> - </dependency> - </dependencies> -</project> diff --git a/vpp-common/pom.xml b/vpp-common/pom.xml index d6833cdd3..e7180aea2 100644 --- a/vpp-common/pom.xml +++ b/vpp-common/pom.xml @@ -34,7 +34,7 @@ <module>vpp-translate-utils</module> <module>naming-context-api</module> <module>naming-context-impl</module> - <module>minimal-distribution</module> + <module>vpp-common-integration</module> <module>vpp-impl-parent</module> <module>vpp-translate-test</module> </modules> diff --git a/vpp-common/vpp-common-integration/asciidoc/Readme.adoc b/vpp-common/vpp-common-integration/asciidoc/Readme.adoc new file mode 100644 index 000000000..8c18a3eb2 --- /dev/null +++ b/vpp-common/vpp-common-integration/asciidoc/Readme.adoc @@ -0,0 +1,3 @@ += vpp-common-integration + +Overview of vpp-common-integration
\ No newline at end of file diff --git a/vpp-common/vpp-common-integration/pom.xml b/vpp-common/vpp-common-integration/pom.xml new file mode 100644 index 000000000..2cb031ec8 --- /dev/null +++ b/vpp-common/vpp-common-integration/pom.xml @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2015 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. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + <parent> + <groupId>io.fd.honeycomb.common</groupId> + <artifactId>impl-parent</artifactId> + <version>1.16.12-SNAPSHOT</version> + <relativePath>../../common/impl-parent</relativePath> + </parent> + + <modelVersion>4.0.0</modelVersion> + <groupId>io.fd.honeycomb.vpp</groupId> + <artifactId>vpp-common-integration</artifactId> + <version>1.16.12-SNAPSHOT</version> + + <properties> + <honeycomb.min.distro.version>1.16.12-SNAPSHOT</honeycomb.min.distro.version> + <jvpp.version>16.12-SNAPSHOT</jvpp.version> + <hamcrest.version>1.3</hamcrest.version> + </properties> + + <build> + <plugins> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.codehaus.gmaven</groupId> + <artifactId>groovy-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + </plugin> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>io.fd.honeycomb</groupId> + <artifactId>minimal-distribution</artifactId> + <version>${honeycomb.min.distro.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>naming-context-api</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>naming-context-impl</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>io.fd.vpp</groupId> + <artifactId>jvpp-registry</artifactId> + <version>${jvpp.version}</version> + </dependency> + <dependency> + <groupId>io.fd.vpp</groupId> + <artifactId>jvpp-core</artifactId> + <version>${jvpp.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>vpp-translate-utils</artifactId> + <version>${project.version}</version> + </dependency> + + <!-- Testing Dependencies --> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>com.google.inject.extensions</groupId> + <artifactId>guice-testlib</artifactId> + <version>${guice.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>hamcrest-all</artifactId> + <version>${hamcrest.version}</version> + <scope>test</scope> + </dependency> + </dependencies> +</project> diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/ContextsReaderFactoryProvider.java b/vpp-common/vpp-common-integration/src/main/java/io/fd/honeycomb/vpp/common/integration/ContextsReaderFactoryProvider.java index 35dd78e4e..d33b8b717 100644 --- a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/ContextsReaderFactoryProvider.java +++ b/vpp-common/vpp-common-integration/src/main/java/io/fd/honeycomb/vpp/common/integration/ContextsReaderFactoryProvider.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.fd.honeycomb.vpp.distro; +package io.fd.honeycomb.vpp.common.integration; import com.google.inject.Inject; import com.google.inject.name.Named; diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppCoreProvider.java b/vpp-common/vpp-common-integration/src/main/java/io/fd/honeycomb/vpp/common/integration/JVppCoreProvider.java index b8334df55..bbd30fbfb 100644 --- a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppCoreProvider.java +++ b/vpp-common/vpp-common-integration/src/main/java/io/fd/honeycomb/vpp/common/integration/JVppCoreProvider.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.fd.honeycomb.vpp.distro; +package io.fd.honeycomb.vpp.common.integration; import com.google.inject.Inject; import io.fd.honeycomb.infra.distro.ProviderTrait; diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppRegistryProvider.java b/vpp-common/vpp-common-integration/src/main/java/io/fd/honeycomb/vpp/common/integration/JVppRegistryProvider.java index 9ecdd69ee..fa1d47480 100644 --- a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppRegistryProvider.java +++ b/vpp-common/vpp-common-integration/src/main/java/io/fd/honeycomb/vpp/common/integration/JVppRegistryProvider.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.fd.honeycomb.vpp.distro; +package io.fd.honeycomb.vpp.common.integration; import com.google.inject.Inject; import io.fd.honeycomb.infra.distro.ProviderTrait; diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.java b/vpp-common/vpp-common-integration/src/main/java/io/fd/honeycomb/vpp/common/integration/VppCommonModule.java index 957819f28..9bdba1b14 100644 --- a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.java +++ b/vpp-common/vpp-common-integration/src/main/java/io/fd/honeycomb/vpp/common/integration/VppCommonModule.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.fd.honeycomb.vpp.distro; +package io.fd.honeycomb.vpp.common.integration; import com.google.inject.AbstractModule; import com.google.inject.Singleton; diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppConfigAttributes.java b/vpp-common/vpp-common-integration/src/main/java/io/fd/honeycomb/vpp/common/integration/VppConfigAttributes.java index 26b5a8385..af06e05db 100644 --- a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppConfigAttributes.java +++ b/vpp-common/vpp-common-integration/src/main/java/io/fd/honeycomb/vpp/common/integration/VppConfigAttributes.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.fd.honeycomb.vpp.distro; +package io.fd.honeycomb.vpp.common.integration; import net.jmob.guice.conf.core.BindConfig; import net.jmob.guice.conf.core.InjectConfig; diff --git a/vpp-common/minimal-distribution/src/main/resources/honeycomb-minimal-resources/config/jvpp.json b/vpp-common/vpp-common-integration/src/main/resources/honeycomb-minimal-resources/config/jvpp.json index 1d411872e..1d411872e 100644 --- a/vpp-common/minimal-distribution/src/main/resources/honeycomb-minimal-resources/config/jvpp.json +++ b/vpp-common/vpp-common-integration/src/main/resources/honeycomb-minimal-resources/config/jvpp.json diff --git a/vpp-common/minimal-distribution/src/test/java/io/fd/honeycomb/vpp/distro/VppCommonModuleTest.java b/vpp-common/vpp-common-integration/src/test/java/io/fd/honeycomb/vpp/common/integration/VppCommonModuleTest.java index f59134812..476e15919 100644 --- a/vpp-common/minimal-distribution/src/test/java/io/fd/honeycomb/vpp/distro/VppCommonModuleTest.java +++ b/vpp-common/vpp-common-integration/src/test/java/io/fd/honeycomb/vpp/common/integration/VppCommonModuleTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.fd.honeycomb.vpp.distro; +package io.fd.honeycomb.vpp.common.integration; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; diff --git a/vpp-common/minimal-distribution/src/test/resources/jvpp.json b/vpp-common/vpp-common-integration/src/test/resources/jvpp.json index 1d411872e..1d411872e 100644 --- a/vpp-common/minimal-distribution/src/test/resources/jvpp.json +++ b/vpp-common/vpp-common-integration/src/test/resources/jvpp.json diff --git a/vpp-integration/minimal-distribution/pom.xml b/vpp-integration/minimal-distribution/pom.xml index 7e1aa0241..36d1e0f1a 100644 --- a/vpp-integration/minimal-distribution/pom.xml +++ b/vpp-integration/minimal-distribution/pom.xml @@ -29,11 +29,19 @@ <version>1.16.12-SNAPSHOT</version> <properties> - <main.class>io.fd.honeycomb.vpp.integration.distro.Main</main.class> + <main.class>io.fd.honeycomb.infra.distro.Main</main.class> <v3po.version>1.16.12-SNAPSHOT</v3po.version> <lisp.version>1.16.12-SNAPSHOT</lisp.version> - <vpp.common.min.distro.version>1.16.12-SNAPSHOT</vpp.common.min.distro.version> + <vpp.common.integration.version>1.16.12-SNAPSHOT</vpp.common.integration.version> <vppnsh.version>1.16.12-SNAPSHOT</vppnsh.version> + + <distribution.modules> + io.fd.honeycomb.vpp.common.integration.VppCommonModule, + io.fd.honeycomb.lisp.LispModule, + io.fd.honeycomb.translate.v3po.V3poModule, + // io.fd.honeycomb.vppnsh.impl.VppNshModule + <!-- Nsh module by default disabled, because it needs vpp-nsh plugin, which is not part of vpp codebase.--> + </distribution.modules> </properties> <build> @@ -62,8 +70,8 @@ <dependencies> <dependency> <groupId>io.fd.honeycomb.vpp</groupId> - <artifactId>minimal-distribution</artifactId> - <version>${vpp.common.min.distro.version}</version> + <artifactId>vpp-common-integration</artifactId> + <version>${vpp.common.integration.version}</version> </dependency> <dependency> <groupId>io.fd.honeycomb.v3po</groupId> diff --git a/vpp-integration/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/integration/distro/Main.java b/vpp-integration/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/integration/distro/Main.java deleted file mode 100644 index 04377c382..000000000 --- a/vpp-integration/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/integration/distro/Main.java +++ /dev/null @@ -1,40 +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.vpp.integration.distro; - -import com.google.common.collect.Lists; -import com.google.inject.Module; -import io.fd.honeycomb.lisp.LispModule; -import io.fd.honeycomb.translate.v3po.V3poModule; -import io.fd.honeycomb.vpp.distro.VppCommonModule; -import io.fd.honeycomb.vppnsh.impl.VppNshModule; -import java.util.List; - -public class Main { - - public static void main(String[] args) { - final List<Module> sampleModules = Lists.newArrayList(io.fd.honeycomb.infra.distro.Main.BASE_MODULES); - - // All the plugins should be listed here - sampleModules.add(new VppCommonModule()); - sampleModules.add(new V3poModule()); - sampleModules.add(new LispModule()); - sampleModules.add(new VppNshModule()); - - io.fd.honeycomb.infra.distro.Main.init(sampleModules); - } -} |