summaryrefslogtreecommitdiffstats
path: root/vpp-integration/api-docs/scripts/src
diff options
context:
space:
mode:
Diffstat (limited to 'vpp-integration/api-docs/scripts/src')
-rw-r--r--vpp-integration/api-docs/scripts/src/main/groovy/io/fd/hc2vpp/docs/scripts/ApiDocsIndexGenerator.groovy156
-rw-r--r--vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockAclModule.java48
-rw-r--r--vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockBindingModule.java49
-rw-r--r--vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockIoamModule.java73
-rw-r--r--vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockNatModule.java48
-rw-r--r--vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockNshModule.java48
-rw-r--r--vpp-integration/api-docs/scripts/src/main/resources/routing.json4
-rw-r--r--vpp-integration/api-docs/scripts/src/main/resources/vpp-management.json3
-rw-r--r--vpp-integration/api-docs/scripts/src/main/resources/yang_to_jvpp_template6
9 files changed, 435 insertions, 0 deletions
diff --git a/vpp-integration/api-docs/scripts/src/main/groovy/io/fd/hc2vpp/docs/scripts/ApiDocsIndexGenerator.groovy b/vpp-integration/api-docs/scripts/src/main/groovy/io/fd/hc2vpp/docs/scripts/ApiDocsIndexGenerator.groovy
new file mode 100644
index 000000000..238f4a25b
--- /dev/null
+++ b/vpp-integration/api-docs/scripts/src/main/groovy/io/fd/hc2vpp/docs/scripts/ApiDocsIndexGenerator.groovy
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2017 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.hc2vpp.docs.scripts
+
+import groovy.text.SimpleTemplateEngine
+import io.fd.hc2vpp.docs.api.*
+import io.fd.hc2vpp.docs.core.ClassPathTypeIndex
+import io.fd.hc2vpp.docs.core.CoverageGenerator
+import io.fd.hc2vpp.docs.core.YangTypeLinkIndex
+import io.fd.vpp.jvpp.acl.future.FutureJVppAcl
+import io.fd.vpp.jvpp.core.future.FutureJVppCore
+import io.fd.vpp.jvpp.ioamexport.future.FutureJVppIoamexport
+import io.fd.vpp.jvpp.ioampot.future.FutureJVppIoampot
+import io.fd.vpp.jvpp.ioamtrace.future.FutureJVppIoamtrace
+import io.fd.vpp.jvpp.nsh.future.FutureJVppNsh
+import io.fd.vpp.jvpp.snat.future.FutureJVppSnat
+
+import java.nio.charset.StandardCharsets
+import java.nio.file.Files
+import java.nio.file.Paths
+import java.nio.file.StandardOpenOption
+import java.util.stream.Collectors
+
+import static java.util.stream.Collectors.toList
+
+/**
+ * Generates VPP api to Yang node index for hc2vpp guice modules listed in api.docs.modules maven property.
+ */
+class ApiDocsIndexGenerator {
+
+ private static def NL = System.lineSeparator()
+ // TODO - check if list of plugin classes can be generated based on list of modules enabled for doc generation
+ private static
+ def PLUGIN_CLASSES = [FutureJVppCore.class, FutureJVppAcl.class, FutureJVppSnat.class, FutureJVppNsh.class,
+ FutureJVppIoamexport.class, FutureJVppIoampot.class, FutureJVppIoamtrace.class]
+ private static def TABLE_PART_MARK = "|"
+
+ /**
+ * Generate coverage data for all configured coverage.modules and JVpp plugins
+ * */
+ public static void generate(final project, final log) {
+ def loader = this.getClassLoader()
+
+ String moduleNames = project.properties.get("api.docs.modules")
+ String projectRoot = project.properties.get("project.root.folder")
+
+ if (moduleNames.trim().isEmpty()) {
+ log.info "No modules defined for ${project.name}. Skipping api-docs generation."
+ return
+ }
+
+ final List<String> moduleNamesList = moduleNames.split(",")
+
+ log.info "Reading module list for ${project.name}"
+ def modules = moduleNamesList.stream()
+ .map { moduleName -> moduleName.trim() }
+ .map { moduleName ->
+ log.info "Loading class $moduleName"
+ loader.loadClass(moduleName).newInstance()
+ }
+ .collect(toList())
+
+ String outPath = project.build.outputDirectory
+
+ log.info "Generating yang type generateLink index"
+ YangTypeLinkIndex yangTypeIndex = new YangTypeLinkIndex(projectRoot, project.version)
+ log.info "Classpath type generateLink index"
+ ClassPathTypeIndex classPathIndex = new ClassPathTypeIndex(projectRoot, project.version)
+
+ log.info "Generating VPP API to YANG mapping"
+ PLUGIN_CLASSES.stream()
+ .forEach { pluginClass ->
+ log.info "Generating mapping for ${pluginClass}"
+ final PluginCoverage configCoverage = new CoverageGenerator()
+ .generateConfigCoverage(pluginClass, project.version, modules, yangTypeIndex, classPathIndex)
+ generateJvppCoverageDoc(configCoverage, outPath, log)
+
+ //TODO operational coverage
+ }
+ }
+
+ static void generateJvppCoverageDoc(
+ final PluginCoverage pluginCoverage, final String outPath, final log) {
+ if (!pluginCoverage.hasCoverage()) {
+ log.info "Plugin ${pluginCoverage.getPluginName()} does not have coverage data, skipping config docs generation"
+ return
+ }
+ log.info "Generating config api docs for plugin ${pluginCoverage.getPluginName()}"
+ def template = this.getClassLoader().getResource("yang_to_jvpp_template")
+ def result = new SimpleTemplateEngine()
+ .createTemplate(template)
+ .make(["pluginName": pluginCoverage.getPluginName(), "tableContent": generateConfigTableContent(pluginCoverage.getCoverage())]).toString()
+
+ log.debug "Docs result for ${pluginCoverage.getPluginName()}$NL$result"
+
+ Paths.get(outPath).toFile().mkdirs()
+
+ def outFileName
+ if (pluginCoverage.isConfig()) {
+ outFileName = "${normalizePluginName(pluginCoverage.getPluginName())}-yang-config-index.adoc"
+ } else {
+ outFileName = "${normalizePluginName(pluginCoverage.getPluginName())}-yang-operational-index.adoc"
+ }
+
+ def outFilePath = Paths.get(outPath, outFileName)
+
+ Files.write(outFilePath, result.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE)
+ log.info "Plugin ${pluginCoverage.getPluginName()} config api docs sucessfully writen to ${outFilePath.toString()}"
+ }
+
+ private static String generateConfigTableContent(final Set<CoverageUnit> coverage) {
+ coverage.stream()
+ .map { unit ->
+ "$NL" +
+ "${vppApiWithLink(unit.vppApi)}" +
+ "${javaApi(unit.javaApi)}" +
+ "${yangTypes(unit.yangTypes)}" +
+ "${supportedOperations(unit.supportedOperations)}"
+ }
+ .collect(Collectors.joining(NL))
+ }
+
+ private static String vppApiWithLink(final VppApiMessage vppApi) {
+ "$TABLE_PART_MARK${vppApi.link}[${vppApi.name}]$NL"
+ }
+
+ private static String javaApi(final JavaApiMessage javaApi) {
+ "$TABLE_PART_MARK${javaApi.api}$NL"
+ }
+
+ private static String yangTypes(final List<YangType> yangTypes) {
+ "$NL$TABLE_PART_MARK$NL ${yangTypes.stream().map { yangType -> " ${yangType.link}[${yangType.type}]" }.collect(Collectors.joining(NL))}"
+ }
+
+ private static String supportedOperations(final List<Operation> operations) {
+ "$NL$TABLE_PART_MARK${operations.stream().map { reference -> " ${reference.link}[${reference.operation}]" }.collect(Collectors.joining(NL))}"
+ }
+
+ private static String normalizePluginName(final String name) {
+ name.toLowerCase().replace(" ", "-")
+ }
+}
diff --git a/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockAclModule.java b/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockAclModule.java
new file mode 100644
index 000000000..436061850
--- /dev/null
+++ b/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockAclModule.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2017 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.hc2vpp.docs.core.mock.binding;
+
+import static io.fd.hc2vpp.docs.core.mock.binding.MockBindingModule.noOpProxy;
+
+import com.google.inject.Provider;
+import io.fd.hc2vpp.acl.AclModule;
+import io.fd.vpp.jvpp.JVpp;
+import io.fd.vpp.jvpp.JVppRegistry;
+import io.fd.vpp.jvpp.acl.future.FutureJVppAclFacade;
+import java.io.IOException;
+
+/**
+ * Use to bypass jvpp registration
+ */
+public class MockAclModule extends AclModule {
+
+ public MockAclModule() {
+ super(MockFutureAclProvider.class);
+ }
+
+ static class MockFutureAclProvider implements Provider<FutureJVppAclFacade> {
+
+ @Override
+ public FutureJVppAclFacade get() {
+ try {
+ return new FutureJVppAclFacade(noOpProxy(JVppRegistry.class), noOpProxy(JVpp.class));
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
+}
diff --git a/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockBindingModule.java b/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockBindingModule.java
new file mode 100644
index 000000000..e6500ea4c
--- /dev/null
+++ b/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockBindingModule.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2017 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.hc2vpp.docs.core.mock.binding;
+
+import static com.google.inject.name.Names.named;
+
+import com.google.inject.AbstractModule;
+import io.fd.honeycomb.translate.MappingContext;
+import io.fd.vpp.jvpp.JVppRegistry;
+import io.fd.vpp.jvpp.core.future.FutureJVppCore;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+
+/**
+ * Use to bypass jvpp registration, and infra modules
+ */
+public class MockBindingModule extends AbstractModule {
+
+ private static final InvocationHandler NOOP_INVOCATION_HANDLER = (proxy, method, args) -> null;
+
+ @Override
+ protected void configure() {
+ bind(FutureJVppCore.class).toInstance(noOpProxy(FutureJVppCore.class));
+ bind(MappingContext.class).annotatedWith(named("honeycomb-context"))
+ .toInstance(noOpProxy(MappingContext.class));
+ bind(DataBroker.class).annotatedWith(named("honeycomb-context")).toInstance(noOpProxy(DataBroker.class));
+ bind(JVppRegistry.class).toInstance(noOpProxy(JVppRegistry.class));
+ }
+
+ static <T> T noOpProxy(Class<T> clazz) {
+ return (T) Proxy.newProxyInstance(MockBindingModule.class.getClassLoader(),
+ new Class[]{clazz}, NOOP_INVOCATION_HANDLER);
+ }
+}
diff --git a/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockIoamModule.java b/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockIoamModule.java
new file mode 100644
index 000000000..f3f06195d
--- /dev/null
+++ b/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockIoamModule.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2017 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.hc2vpp.docs.core.mock.binding;
+
+import static io.fd.hc2vpp.docs.core.mock.binding.MockBindingModule.noOpProxy;
+
+import com.google.inject.Provider;
+import io.fd.hc2vpp.vppioam.impl.VppIoamModule;
+import io.fd.vpp.jvpp.JVpp;
+import io.fd.vpp.jvpp.JVppRegistry;
+import io.fd.vpp.jvpp.ioamexport.future.FutureJVppIoamexportFacade;
+import io.fd.vpp.jvpp.ioampot.future.FutureJVppIoampotFacade;
+import io.fd.vpp.jvpp.ioamtrace.future.FutureJVppIoamtraceFacade;
+import java.io.IOException;
+
+/**
+ * Use to bypass jvpp registration
+ */
+public class MockIoamModule extends VppIoamModule {
+
+ public MockIoamModule() {
+ super(MockTraceProvider.class, MockPotProvider.class, MockExportProvider.class);
+ }
+
+ private static class MockTraceProvider implements Provider<FutureJVppIoamtraceFacade> {
+ @Override
+ public FutureJVppIoamtraceFacade get() {
+ try {
+ return new FutureJVppIoamtraceFacade(noOpProxy(JVppRegistry.class), noOpProxy(JVpp.class));
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
+
+ private static class MockPotProvider implements Provider<FutureJVppIoampotFacade> {
+
+ @Override
+ public FutureJVppIoampotFacade get() {
+ try {
+ return new FutureJVppIoampotFacade(noOpProxy(JVppRegistry.class), noOpProxy(JVpp.class));
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
+
+ private static class MockExportProvider implements Provider<FutureJVppIoamexportFacade> {
+
+ @Override
+ public FutureJVppIoamexportFacade get() {
+ try {
+ return new FutureJVppIoamexportFacade(noOpProxy(JVppRegistry.class), noOpProxy(JVpp.class));
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
+}
diff --git a/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockNatModule.java b/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockNatModule.java
new file mode 100644
index 000000000..d74f7f2b9
--- /dev/null
+++ b/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockNatModule.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2017 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.hc2vpp.docs.core.mock.binding;
+
+import static io.fd.hc2vpp.docs.core.mock.binding.MockBindingModule.noOpProxy;
+
+import com.google.inject.Provider;
+import io.fd.hc2vpp.nat.NatModule;
+import io.fd.vpp.jvpp.JVpp;
+import io.fd.vpp.jvpp.JVppRegistry;
+import io.fd.vpp.jvpp.snat.future.FutureJVppSnatFacade;
+import java.io.IOException;
+
+/**
+ * Use to bypass jvpp registration
+ */
+public class MockNatModule extends NatModule {
+
+ public MockNatModule() {
+ super(MockJVppSnatProvider.class);
+ }
+
+ private static class MockJVppSnatProvider implements Provider<FutureJVppSnatFacade> {
+
+ @Override
+ public FutureJVppSnatFacade get() {
+ try {
+ return new FutureJVppSnatFacade(noOpProxy(JVppRegistry.class), noOpProxy(JVpp.class));
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
+}
diff --git a/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockNshModule.java b/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockNshModule.java
new file mode 100644
index 000000000..dace214e8
--- /dev/null
+++ b/vpp-integration/api-docs/scripts/src/main/java/io/fd/hc2vpp/docs/core/mock/binding/MockNshModule.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2017 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.hc2vpp.docs.core.mock.binding;
+
+import static io.fd.hc2vpp.docs.core.mock.binding.MockBindingModule.noOpProxy;
+
+import com.google.inject.Provider;
+import io.fd.hc2vpp.vppnsh.impl.VppNshModule;
+import io.fd.vpp.jvpp.JVpp;
+import io.fd.vpp.jvpp.JVppRegistry;
+import io.fd.vpp.jvpp.nsh.future.FutureJVppNshFacade;
+import java.io.IOException;
+
+/**
+ * Use to bypass jvpp registration
+ */
+public class MockNshModule extends VppNshModule {
+
+ public MockNshModule() {
+ super(MockJVppNshProvider.class);
+ }
+
+ private static class MockJVppNshProvider implements Provider<FutureJVppNshFacade> {
+
+ @Override
+ public FutureJVppNshFacade get() {
+ try {
+ return new FutureJVppNshFacade(noOpProxy(JVppRegistry.class), noOpProxy(JVpp.class));
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
+}
diff --git a/vpp-integration/api-docs/scripts/src/main/resources/routing.json b/vpp-integration/api-docs/scripts/src/main/resources/routing.json
new file mode 100644
index 000000000..95f85414f
--- /dev/null
+++ b/vpp-integration/api-docs/scripts/src/main/resources/routing.json
@@ -0,0 +1,4 @@
+{
+ "default-routing-instance-name": "vpp-routing-instance",
+ "learned-route-name-prefix": "learned-route"
+} \ No newline at end of file
diff --git a/vpp-integration/api-docs/scripts/src/main/resources/vpp-management.json b/vpp-integration/api-docs/scripts/src/main/resources/vpp-management.json
new file mode 100644
index 000000000..28b25b263
--- /dev/null
+++ b/vpp-integration/api-docs/scripts/src/main/resources/vpp-management.json
@@ -0,0 +1,3 @@
+{
+ "keepalive-delay":30
+} \ No newline at end of file
diff --git a/vpp-integration/api-docs/scripts/src/main/resources/yang_to_jvpp_template b/vpp-integration/api-docs/scripts/src/main/resources/yang_to_jvpp_template
new file mode 100644
index 000000000..cf9502cd5
--- /dev/null
+++ b/vpp-integration/api-docs/scripts/src/main/resources/yang_to_jvpp_template
@@ -0,0 +1,6 @@
+.${pluginName} to Yang index
+[width="80%",options="header",cols="1,1,m,1"]
+|===
+|*VPP api* |*Java api* |*Yang nodes* |*Supported Operations*
+${tableContent}
+|=== \ No newline at end of file