diff options
Diffstat (limited to 'vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Hc2vpp-Add-VES-agent-for-vG-MUX.patch')
-rw-r--r-- | vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Hc2vpp-Add-VES-agent-for-vG-MUX.patch | 1079 |
1 files changed, 1079 insertions, 0 deletions
diff --git a/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Hc2vpp-Add-VES-agent-for-vG-MUX.patch b/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Hc2vpp-Add-VES-agent-for-vG-MUX.patch new file mode 100644 index 00000000..8c2e31b7 --- /dev/null +++ b/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Hc2vpp-Add-VES-agent-for-vG-MUX.patch @@ -0,0 +1,1079 @@ +From 9a00b1af18dfe4c2df185299b8bd2db7f5d061c0 Mon Sep 17 00:00:00 2001 +From: Johnson Li <johnson.li@intel.com> +Date: Fri, 8 Sep 2017 17:35:16 +0800 +Subject: [PATCH] Add VES agent configuration for vG-MUX + +Signed-off-by: Johnson Li <johnson.li@intel.com> + +diff --git a/pom.xml b/pom.xml +index 538a5d98..581bedfc 100644 +--- a/pom.xml ++++ b/pom.xml +@@ -44,13 +44,14 @@ + <module>nat</module> + <module>lisp</module> + <module>release-notes</module> +- <module>vpp-integration</module> + <module>acl</module> + <module>dhcp</module> ++ <module>ves</module> + <module>samples</module> + <module>vpp-classifier</module> + <module>l3</module> + <module>vpp-management</module> ++ <module>vpp-integration</module> + <module>it</module> + </modules> + </project> +\ No newline at end of file +diff --git a/ves/asciidoc/Readme.adoc b/ves/asciidoc/Readme.adoc +new file mode 100644 +index 00000000..682e7555 +--- /dev/null ++++ b/ves/asciidoc/Readme.adoc +@@ -0,0 +1,3 @@ ++= ves-agent ++ ++Overview of ves-agent +diff --git a/ves/pom.xml b/ves/pom.xml +new file mode 100644 +index 00000000..1ded0109 +--- /dev/null ++++ b/ves/pom.xml +@@ -0,0 +1,56 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<!-- ++ 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. ++--><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.hc2vpp.common</groupId> ++ <artifactId>hc2vpp-parent</artifactId> ++ <version>1.17.04.1-SNAPSHOT</version> ++ <relativePath>../common/hc2vpp-parent</relativePath> ++ </parent> ++ ++ <groupId>io.fd.hc2vpp.ves</groupId> ++ <artifactId>ves-agent</artifactId> ++ <version>1.17.04.1-SNAPSHOT</version> ++ <name>ves-agent</name> ++ <packaging>pom</packaging> ++ <modelVersion>4.0.0</modelVersion> ++ <description>Agent for VNF Event Stream plugin</description> ++ ++ <modules> ++ <module>ves-api</module> ++ <module>ves-impl</module> ++ </modules> ++ ++ <!-- DO NOT install or deploy the repo root pom as it's only needed to initiate a build --> ++ <build> ++ <plugins> ++ <plugin> ++ <groupId>org.apache.maven.plugins</groupId> ++ <artifactId>maven-deploy-plugin</artifactId> ++ <configuration> ++ <skip>true</skip> ++ </configuration> ++ </plugin> ++ <plugin> ++ <groupId>org.apache.maven.plugins</groupId> ++ <artifactId>maven-install-plugin</artifactId> ++ <configuration> ++ <skip>true</skip> ++ </configuration> ++ </plugin> ++ </plugins> ++ </build> ++</project> +diff --git a/ves/ves-api/asciidoc/Readme.adoc b/ves/ves-api/asciidoc/Readme.adoc +new file mode 100644 +index 00000000..b561268c +--- /dev/null ++++ b/ves/ves-api/asciidoc/Readme.adoc +@@ -0,0 +1,3 @@ ++= vesagent-api ++ ++Overview of vesagent-api +\ No newline at end of file +diff --git a/ves/ves-api/pom.xml b/ves/ves-api/pom.xml +new file mode 100644 +index 00000000..78bf47b9 +--- /dev/null ++++ b/ves/ves-api/pom.xml +@@ -0,0 +1,52 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<!-- ++ 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. ++--><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.hc2vpp.common</groupId> ++ <artifactId>api-parent</artifactId> ++ <version>1.17.04.1-SNAPSHOT</version> ++ <relativePath>../../common/api-parent</relativePath> ++ </parent> ++ ++ <modelVersion>4.0.0</modelVersion> ++ <groupId>io.fd.hc2vpp.ves</groupId> ++ <artifactId>ves-api</artifactId> ++ <name>ves-api</name> ++ <version>1.17.04.1-SNAPSHOT</version> ++ <packaging>bundle</packaging> ++ ++ <dependencies> ++ <dependency> ++ <groupId>org.opendaylight.mdsal.model</groupId> ++ <artifactId>iana-if-type-2014-05-08</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>org.opendaylight.mdsal.model</groupId> ++ <artifactId>ietf-yang-types-20130715</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>org.opendaylight.mdsal.model</groupId> ++ <artifactId>ietf-interfaces</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>org.opendaylight.mdsal.model</groupId> ++ <artifactId>ietf-inet-types-2013-07-15</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>org.opendaylight.mdsal.model</groupId> ++ <artifactId>yang-ext</artifactId> ++ </dependency> ++ </dependencies> ++</project> +diff --git a/ves/ves-api/src/main/yang/vesagent.yang b/ves/ves-api/src/main/yang/vesagent.yang +new file mode 100644 +index 00000000..a3c79797 +--- /dev/null ++++ b/ves/ves-api/src/main/yang/vesagent.yang +@@ -0,0 +1,71 @@ ++module vesagent { ++ ++ yang-version 1; ++ namespace "urn:opendaylight:params:xml:ns:yang:vpp:vesagent"; ++ prefix "vesagent"; ++ ++ description ++ "This YANG module defines the generic configuration and ++ operational data for VES Agent in VPP"; ++ ++ revision "2017-08-01" { ++ description ++ "Initial revision of VES Agent model"; ++ } ++ ++ import ietf-inet-types { ++ prefix inet; ++ } ++ ++ grouping vesagent-attributes { ++ container config { ++ description ++ "VNF Event Stream Agent configuration"; ++ ++ leaf server-addr { ++ type inet:ipv4-address; ++ description ++ "VES Collector's IP address."; ++ } ++ ++ leaf server-port { ++ type uint32; ++ description ++ "VES Collector's Server Port."; ++ } ++ ++ leaf read-interval { ++ type uint32; ++ description ++ "Seconds of time period for each loop."; ++ } ++ ++ leaf is-add { ++ type uint32; ++ description ++ "0-Delete VES agent, NonZero-Start VES agent."; ++ } ++ } ++ ++ container mode { ++ description ++ "VNF Event Stream Agent Working Mode."; ++ ++ leaf base-packet-loss { ++ type uint32; ++ description ++ "Base packet Loss for Demo Mode"; ++ } ++ ++ leaf working-mode { ++ type string; ++ description ++ "VES Working Mode, Demo Or Real Only."; ++ } ++ } ++ } ++ ++ container vesagent { ++ uses vesagent-attributes; ++ } ++} +diff --git a/ves/ves-impl/asciidoc/Readme.adoc b/ves/ves-impl/asciidoc/Readme.adoc +new file mode 100644 +index 00000000..e07fb05f +--- /dev/null ++++ b/ves/ves-impl/asciidoc/Readme.adoc +@@ -0,0 +1,3 @@ ++= vesagent-impl ++ ++Overview of vesagent-impl +\ No newline at end of file +diff --git a/ves/ves-impl/pom.xml b/ves/ves-impl/pom.xml +new file mode 100644 +index 00000000..5ed2c1b4 +--- /dev/null ++++ b/ves/ves-impl/pom.xml +@@ -0,0 +1,157 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<!-- ++ 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. ++--><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.hc2vpp.common</groupId> ++ <artifactId>vpp-impl-parent</artifactId> ++ <version>1.17.04.1-SNAPSHOT</version> ++ <relativePath>../../vpp-common/vpp-impl-parent</relativePath> ++ </parent> ++ ++ <modelVersion>4.0.0</modelVersion> ++ <groupId>io.fd.hc2vpp.ves</groupId> ++ <artifactId>ves-impl</artifactId> ++ <name>${project.artifactId}</name> ++ <version>1.17.04.1-SNAPSHOT</version> ++ <packaging>bundle</packaging> ++ ++ <properties> ++ <honeycomb.infra.version>1.17.04.1-SNAPSHOT</honeycomb.infra.version> ++ <hc2vpp.common.version>1.17.04.1-SNAPSHOT</hc2vpp.common.version> ++ </properties> ++ ++ <dependencies> ++ <dependency> ++ <groupId>${project.groupId}</groupId> ++ <artifactId>ves-api</artifactId> ++ <version>${project.version}</version> ++ </dependency> ++ ++ <!--VPP common--> ++ <dependency> ++ <groupId>io.fd.hc2vpp.common</groupId> ++ <artifactId>vpp-translate-utils</artifactId> ++ </dependency> ++ ++ <!-- JVPP --> ++ <dependency> ++ <groupId>io.fd.vpp</groupId> ++ <artifactId>jvpp-registry</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>io.fd.vpp</groupId> ++ <artifactId>jvpp-ves</artifactId> ++ <version>17.04.2-SNAPSHOT</version> ++ </dependency> ++ ++ <!-- Honeycomb infrastructure--> ++ <dependency> ++ <groupId>io.fd.honeycomb</groupId> ++ <artifactId>minimal-distribution</artifactId> ++ <version>${honeycomb.infra.version}</version> ++ </dependency> ++ ++ <dependency> ++ <groupId>io.fd.honeycomb</groupId> ++ <artifactId>translate-api</artifactId> ++ <version>${honeycomb.infra.version}</version> ++ </dependency> ++ ++ <dependency> ++ <groupId>io.fd.honeycomb</groupId> ++ <artifactId>translate-spi</artifactId> ++ <version>${honeycomb.infra.version}</version> ++ </dependency> ++ ++ <dependency> ++ <groupId>io.fd.honeycomb</groupId> ++ <artifactId>cfg-init</artifactId> ++ <version>${honeycomb.infra.version}</version> ++ </dependency> ++ ++ <!-- Translation --> ++ <dependency> ++ <groupId>io.fd.hc2vpp.common</groupId> ++ <artifactId>vpp-translate-utils</artifactId> ++ </dependency> ++ ++ <!-- DI --> ++ <dependency> ++ <groupId>com.google.inject</groupId> ++ <artifactId>guice</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>net.jmob</groupId> ++ <artifactId>guice.conf</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>com.google.inject.extensions</groupId> ++ <artifactId>guice-multibindings</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>io.fd.honeycomb</groupId> ++ <artifactId>translate-impl</artifactId> ++ <version>1.17.04.1-SNAPSHOT</version> ++ </dependency> ++ ++ ++ <!-- Testing dependencies--> ++ <dependency> ++ <groupId>com.google.inject</groupId> ++ <artifactId>guice</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>net.jmob</groupId> ++ <artifactId>guice.conf</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>com.google.inject.extensions</groupId> ++ <artifactId>guice-multibindings</artifactId> ++ </dependency> ++ ++ <dependency> ++ <groupId>junit</groupId> ++ <artifactId>junit</artifactId> ++ <scope>test</scope> ++ </dependency> ++ <dependency> ++ <groupId>io.fd.hc2vpp.common</groupId> ++ <artifactId>vpp-translate-test</artifactId> ++ <version>${hc2vpp.common.version}</version> ++ <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> ++ <scope>test</scope> ++ </dependency> ++ <dependency> ++ <groupId>org.hamcrest</groupId> ++ <artifactId>hamcrest-all</artifactId> ++ <scope>test</scope> ++ </dependency> ++ <dependency> ++ <groupId>io.fd.honeycomb.infra</groupId> ++ <artifactId>test-tools</artifactId> ++ <version>${project.version}</version> ++ <scope>test</scope> ++ </dependency> ++ </dependencies> ++</project> +diff --git a/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/VesModule.java b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/VesModule.java +new file mode 100644 +index 00000000..0cd60068 +--- /dev/null ++++ b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/VesModule.java +@@ -0,0 +1,67 @@ ++/* ++ * Copyright (c) 2017 Intel Corp 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.ves; ++ ++import com.google.common.annotations.VisibleForTesting; ++import com.google.inject.AbstractModule; ++import com.google.inject.Provider; ++import com.google.inject.Singleton; ++import com.google.inject.multibindings.Multibinder; ++import io.fd.hc2vpp.ves.jvpp.JVppVesProvider; ++import io.fd.hc2vpp.ves.read.VesReaderFactory; ++import io.fd.hc2vpp.ves.write.VesWriterFactory; ++import io.fd.honeycomb.translate.read.ReaderFactory; ++import io.fd.honeycomb.translate.write.WriterFactory; ++import io.fd.vpp.jvpp.ves.future.FutureJVppVesFacade; ++import org.slf4j.Logger; ++import org.slf4j.LoggerFactory; ++ ++/** ++ * VesModule class instantiating ves plugin components. ++ */ ++public final class VesModule extends AbstractModule { ++ ++ private static final Logger LOG = LoggerFactory.getLogger(VesModule.class); ++ private final Class<? extends Provider<FutureJVppVesFacade>> jvppVesProviderClass; ++ ++ public VesModule() { ++ this(JVppVesProvider.class); ++ } ++ ++ @VisibleForTesting ++ VesModule(Class<? extends Provider<FutureJVppVesFacade>> jvppVesProvider) { ++ this.jvppVesProviderClass = jvppVesProvider; ++ } ++ ++ @Override ++ protected void configure() { ++ LOG.info("Installing VES Agent module"); ++ ++ // Bind to Plugin's JVPP ++ bind(FutureJVppVesFacade.class).toProvider(jvppVesProviderClass).in(Singleton.class); ++ ++ LOG.info("Injecting writers factories"); ++ final Multibinder<WriterFactory> writerFactoryBinder = Multibinder.newSetBinder(binder(), WriterFactory.class); ++ writerFactoryBinder.addBinding().to(VesWriterFactory.class); ++ ++ LOG.info("Injecting readers factories"); ++ final Multibinder<ReaderFactory> readerFactoryBinder = Multibinder.newSetBinder(binder(), ReaderFactory.class); ++ readerFactoryBinder.addBinding().to(VesReaderFactory.class); ++ ++ LOG.info("Module VES Agent successfully configured"); ++ } ++} +diff --git a/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/jvpp/JVppVesProvider.java b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/jvpp/JVppVesProvider.java +new file mode 100644 +index 00000000..8afed84e +--- /dev/null ++++ b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/jvpp/JVppVesProvider.java +@@ -0,0 +1,59 @@ ++/* ++ * Copyright (c) 2017 Intel Corp 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.ves.jvpp; ++ ++import com.google.inject.Inject; ++import io.fd.honeycomb.infra.distro.ProviderTrait; ++import io.fd.vpp.jvpp.JVppRegistry; ++import io.fd.vpp.jvpp.ves.JVppVesImpl; ++import io.fd.vpp.jvpp.ves.future.FutureJVppVesFacade; ++import java.io.IOException; ++import org.slf4j.Logger; ++import org.slf4j.LoggerFactory; ++ ++/** ++ * Provides future API for jvpp-ves plugin. Must be a singleton due to shutdown hook usage. ++ * Registers shutdown hook to free plugin's resources on shutdown. ++ */ ++public final class JVppVesProvider extends ProviderTrait<FutureJVppVesFacade> { ++ ++ private static final Logger LOG = LoggerFactory.getLogger(JVppVesProvider.class); ++ ++ @Inject ++ private JVppRegistry registry; ++ ++ @Override ++ protected FutureJVppVesFacade create() { ++ try { ++ final JVppVesImpl jvppVes = new JVppVesImpl(); ++ Runtime.getRuntime().addShutdownHook(new Thread() { ++ @Override ++ public void run() { ++ LOG.info("Unloading jvpp-ves plugin"); ++ jvppVes.close(); ++ LOG.info("Successfully unloaded jvpp-ves plugin"); ++ } ++ }); ++ ++ LOG.info("Successfully loaded jvpp-ves plugin"); ++ return new FutureJVppVesFacade(registry, jvppVes); ++ } catch (IOException e) { ++ throw new IllegalStateException("Unable to open VPP management connection", e); ++ } ++ } ++} ++ +diff --git a/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/read/VesReaderFactory.java b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/read/VesReaderFactory.java +new file mode 100644 +index 00000000..bef652fd +--- /dev/null ++++ b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/read/VesReaderFactory.java +@@ -0,0 +1,50 @@ ++/* ++ * Copyright (c) 2017 Intel Corp 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.ves.read; ++ ++import com.google.inject.Inject; ++import io.fd.honeycomb.translate.read.ReaderFactory; ++import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder; ++import io.fd.vpp.jvpp.core.future.FutureJVppCore; ++import javax.annotation.Nonnull; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.Vesagent; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.VesagentBuilder; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.Config; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.ConfigBuilder; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.Mode; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.ModeBuilder; ++import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; ++ ++/** ++ * Factory producing writers for VES Agent plugin's data. ++ */ ++public final class VesReaderFactory implements ReaderFactory { ++ ++ private static final InstanceIdentifier<Vesagent> VESAGENT_ID = InstanceIdentifier.create(Vesagent.class); ++ private static final InstanceIdentifier<Config> CONFIG_ID = InstanceIdentifier.create(Config.class); ++ private static final InstanceIdentifier<Mode> MODE_ID = InstanceIdentifier.create(Mode.class); ++ ++ @Inject ++ private FutureJVppCore vppApi; ++ ++ @Override ++ public void init(@Nonnull final ModifiableReaderRegistryBuilder registry) { ++ registry.addStructuralReader(VESAGENT_ID, VesagentBuilder.class); ++ registry.addStructuralReader(CONFIG_ID, ConfigBuilder.class); ++ registry.addStructuralReader(MODE_ID, ModeBuilder.class); ++ } ++} +diff --git a/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesConfigCustomizer.java b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesConfigCustomizer.java +new file mode 100644 +index 00000000..e06afa73 +--- /dev/null ++++ b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesConfigCustomizer.java +@@ -0,0 +1,127 @@ ++/* ++ * Copyright (c) 2017 Intel Corp 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.ves.write; ++ ++import static com.google.common.base.Preconditions.checkArgument; ++ ++import io.fd.hc2vpp.common.translate.util.ByteDataTranslator; ++import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer; ++import io.fd.hc2vpp.common.translate.util.Ipv4Translator; ++import io.fd.hc2vpp.common.translate.util.Ipv6Translator; ++import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer; ++import io.fd.honeycomb.translate.spi.write.WriterCustomizer; ++import io.fd.honeycomb.translate.write.WriteContext; ++import io.fd.honeycomb.translate.write.WriteFailedException; ++import io.fd.vpp.jvpp.core.future.FutureJVppCore; ++//import io.fd.vpp.jvpp.ves.future.FutureJVppVes; ++import io.fd.vpp.jvpp.ves.dto.VesAgentConfig; ++import io.fd.vpp.jvpp.ves.future.FutureJVppVesFacade; ++import javax.annotation.Nonnull; ++//import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.Vesagent; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.Config; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.ConfigBuilder; ++import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; ++import org.slf4j.Logger; ++import org.slf4j.LoggerFactory; ++ ++final class VesConfigCustomizer extends FutureJVppCustomizer implements WriterCustomizer<Config>, ++ JvppReplyConsumer, ByteDataTranslator, Ipv6Translator, Ipv4Translator { ++ private static final Logger LOG = LoggerFactory.getLogger(VesConfigCustomizer.class); ++ ++ private final FutureJVppVesFacade jvppVes; ++ ++ VesConfigCustomizer(final FutureJVppCore vppApi, final FutureJVppVesFacade jvppVes) { ++ super(vppApi); ++ this.jvppVes = jvppVes; ++ } ++ ++ @Override ++ public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Config> iid, @Nonnull final Config dataAfter, ++ @Nonnull final WriteContext writeContext) throws WriteFailedException { ++ ConfigBuilder configBuilder = new ConfigBuilder(); ++ InstanceIdentifier<Config> id = iid; ++ ++ LOG.debug("Writing VES Agent Config {} dataAfter={}", id, dataAfter); ++ checkArgument(dataAfter.getServerAddr() != null && dataAfter.getServerAddr().getValue() != null ++ && dataAfter.getServerPort() != 0, "VES Server Address and Port need to be configured"); ++ ++ configBuilder.setServerAddr(dataAfter.getServerAddr()) ++ .setServerPort(dataAfter.getServerPort()) ++ .setReadInterval(dataAfter.getReadInterval()) ++ .setIsAdd(1L); ++ ++ setVesAgentConfig(id, configBuilder.build()); ++ } ++ ++ @Override ++ public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Config> iid, @Nonnull final Config dataBefore, ++ @Nonnull final Config dataAfter, @Nonnull final WriteContext writeContext) ++ throws WriteFailedException { ++ ConfigBuilder configBuilder = new ConfigBuilder(); ++ InstanceIdentifier<Config> id = iid; ++ ++ checkArgument(dataBefore.getServerAddr() != null && dataBefore.getServerAddr().getValue() != null ++ && dataBefore.getServerPort() != 0, "VES Server Address and Port need to be configured"); ++ checkArgument(dataAfter.getServerAddr() != null && dataAfter.getServerAddr().getValue() != null ++ && dataAfter.getServerPort() != 0, "VES Server Address and Port need to be configured"); ++ ++ // remove old configuration: ++ configBuilder.setServerAddr(dataBefore.getServerAddr()) ++ .setServerPort(dataBefore.getServerPort()) ++ .setReadInterval(dataBefore.getReadInterval()) ++ .setIsAdd(0L); ++ setVesAgentConfig(id, configBuilder.build()); ++ ++ // and add new one: ++ configBuilder.setServerAddr(dataAfter.getServerAddr()) ++ .setServerPort(dataAfter.getServerPort()) ++ .setReadInterval(dataAfter.getReadInterval()) ++ .setIsAdd(1L); ++ setVesAgentConfig(id, configBuilder.build()); ++ } ++ ++ @Override ++ public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Config> iid, @Nonnull final Config dataBefore, ++ @Nonnull final WriteContext writeContext) throws WriteFailedException { ++ ConfigBuilder configBuilder = new ConfigBuilder(); ++ InstanceIdentifier<Config> id = iid; ++ LOG.debug("Removing VES Agent {} dataBefore={}", id, dataBefore); ++ ++ checkArgument(dataBefore.getServerAddr() != null && dataBefore.getServerAddr().getValue() != null ++ && dataBefore.getServerPort() != 0, "VES Server Address and Port need to be dataBeforeured"); ++ ++ configBuilder.setServerAddr(dataBefore.getServerAddr()) ++ .setServerPort(dataBefore.getServerPort()) ++ .setReadInterval(dataBefore.getReadInterval()) ++ .setIsAdd(0L); ++ ++ setVesAgentConfig(id, configBuilder.build()); ++ } ++ ++ private void setVesAgentConfig(final InstanceIdentifier<Config> id, final Config config) ++ throws WriteFailedException { ++ final VesAgentConfig request = new VesAgentConfig(); ++ ++ request.serverPort = config.getServerPort().byteValue(); ++ request.readInterval = config.getReadInterval().byteValue(); ++ request.isAdd = config.getIsAdd().byteValue(); ++ request.serverAddr = ipv4AddressNoZoneToArray(config.getServerAddr().getValue()); ++ ++ LOG.debug("VES agent config change id={} request={}", id, request); ++ getReplyForWrite(jvppVes.vesAgentConfig(request).toCompletableFuture(), id); ++ } ++} +diff --git a/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesModeCustomizer.java b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesModeCustomizer.java +new file mode 100644 +index 00000000..8b6d5a9a +--- /dev/null ++++ b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesModeCustomizer.java +@@ -0,0 +1,97 @@ ++/* ++ * Copyright (c) 2017 Intel Corp 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.ves.write; ++ ++import static com.google.common.base.Preconditions.checkArgument; ++ ++import io.fd.hc2vpp.common.translate.util.ByteDataTranslator; ++import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer; ++import io.fd.hc2vpp.common.translate.util.Ipv4Translator; ++import io.fd.hc2vpp.common.translate.util.Ipv6Translator; ++import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer; ++import io.fd.honeycomb.translate.spi.write.WriterCustomizer; ++import io.fd.honeycomb.translate.write.WriteContext; ++import io.fd.honeycomb.translate.write.WriteFailedException; ++import io.fd.vpp.jvpp.core.future.FutureJVppCore; ++//import io.fd.vpp.jvpp.ves.future.FutureJVppVes; ++import io.fd.vpp.jvpp.ves.dto.VesAgentMode; ++import io.fd.vpp.jvpp.ves.future.FutureJVppVesFacade; ++import javax.annotation.Nonnull; ++//import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.Vesagent; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.Mode; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.ModeBuilder; ++import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; ++import org.slf4j.Logger; ++import org.slf4j.LoggerFactory; ++ ++final class VesModeCustomizer extends FutureJVppCustomizer implements WriterCustomizer<Mode>, ++ JvppReplyConsumer, ByteDataTranslator, Ipv6Translator, Ipv4Translator { ++ private static final Logger LOG = LoggerFactory.getLogger(VesModeCustomizer.class); ++ ++ private final FutureJVppVesFacade jvppVes; ++ ++ VesModeCustomizer(final FutureJVppCore vppApi, final FutureJVppVesFacade jvppVes) { ++ super(vppApi); ++ this.jvppVes = jvppVes; ++ } ++ ++ @Override ++ public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Mode> iid, @Nonnull final Mode dataAfter, ++ @Nonnull final WriteContext writeContext) throws WriteFailedException { ++ LOG.debug("Writing VES Agent Working Mode {} dataAfter={}", iid, dataAfter); ++ ++ checkArgument(dataAfter.getWorkingMode() != null && dataAfter.getBasePacketLoss() <= 100, ++ "VES Agent Working Mode need to be correctly configured."); ++ ++ setVesAgentMode(iid, dataAfter); ++ } ++ ++ @Override ++ public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Mode> iid, @Nonnull final Mode dataBefore, ++ @Nonnull final Mode dataAfter, @Nonnull final WriteContext writeContext) ++ throws WriteFailedException { ++ LOG.debug("Writing VES Agent Working Mode {} {}-->{}", iid, dataBefore, dataAfter); ++ ++ checkArgument(dataAfter.getWorkingMode() != null && dataAfter.getBasePacketLoss() <= 100, ++ "VES Agent Working Mode need to be correctly configured."); ++ ++ setVesAgentMode(iid, dataAfter); ++ } ++ ++ @Override ++ public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Mode> iid, @Nonnull final Mode dataBefore, ++ @Nonnull final WriteContext writeContext) throws WriteFailedException { ++ ModeBuilder modeBuilder = new ModeBuilder(); ++ LOG.debug("Restoring VES Mode {} dataBefore={} to default.", iid, dataBefore); ++ ++ modeBuilder.setWorkingMode("Real") ++ .setBasePacketLoss(0L); ++ ++ setVesAgentMode(iid, modeBuilder.build()); ++ } ++ ++ private void setVesAgentMode(final InstanceIdentifier<Mode> id, final Mode mode) ++ throws WriteFailedException { ++ final VesAgentMode request = new VesAgentMode(); ++ ++ request.pktLossRate = mode.getBasePacketLoss().byteValue(); ++ request.workMode = mode.getWorkingMode().getBytes(); ++ ++ LOG.debug("VES agent working mode change id={} request={}", id, request); ++ getReplyForWrite(jvppVes.vesAgentMode(request).toCompletableFuture(), id); ++ } ++} +diff --git a/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesWriterFactory.java b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesWriterFactory.java +new file mode 100644 +index 00000000..581f0460 +--- /dev/null ++++ b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesWriterFactory.java +@@ -0,0 +1,54 @@ ++/* ++ * Copyright (c) 2017 Intel Corp 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.ves.write; ++ ++import com.google.common.collect.ImmutableSet; ++import com.google.inject.Inject; ++import io.fd.honeycomb.translate.impl.write.GenericWriter; ++import io.fd.honeycomb.translate.write.WriterFactory; ++import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder; ++import io.fd.vpp.jvpp.core.future.FutureJVppCore; ++import io.fd.vpp.jvpp.ves.future.FutureJVppVesFacade; ++import javax.annotation.Nonnull; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.Vesagent; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.Config; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.Mode; ++import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; ++ ++/** ++ * Factory producing writers for VES Agent plugin's data. ++ */ ++public final class VesWriterFactory implements WriterFactory { ++ ++ private static final InstanceIdentifier<Vesagent> VESAGENT_ID = InstanceIdentifier.create(Vesagent.class); ++ ++ @Inject ++ private FutureJVppCore vppApi; ++ ++ @Inject ++ protected FutureJVppVesFacade futureVesFacade; ++ ++ @Override ++ public void init(@Nonnull final ModifiableWriterRegistryBuilder registry) { ++ registry.add(new GenericWriter<>(VESAGENT_ID, ++ new VesagentCustomizer(vppApi, futureVesFacade))); ++ registry.add(new GenericWriter<>(VESAGENT_ID.child(Config.class), ++ new VesConfigCustomizer(vppApi, futureVesFacade))); ++ registry.add(new GenericWriter<>(VESAGENT_ID.child(Mode.class), ++ new VesModeCustomizer(vppApi, futureVesFacade))); ++ } ++} +diff --git a/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesagentCustomizer.java b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesagentCustomizer.java +new file mode 100644 +index 00000000..62e46cdb +--- /dev/null ++++ b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesagentCustomizer.java +@@ -0,0 +1,131 @@ ++/* ++ * Copyright (c) 2017 Intel Corp 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.ves.write; ++ ++import static com.google.common.base.Preconditions.checkArgument; ++ ++import io.fd.hc2vpp.common.translate.util.ByteDataTranslator; ++import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer; ++import io.fd.hc2vpp.common.translate.util.Ipv4Translator; ++import io.fd.hc2vpp.common.translate.util.Ipv6Translator; ++import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer; ++import io.fd.honeycomb.translate.spi.write.WriterCustomizer; ++import io.fd.honeycomb.translate.write.WriteContext; ++import io.fd.honeycomb.translate.write.WriteFailedException; ++import io.fd.vpp.jvpp.core.future.FutureJVppCore; ++//import io.fd.vpp.jvpp.ves.future.FutureJVppVes; ++import io.fd.vpp.jvpp.ves.dto.VesAgentConfig; ++import io.fd.vpp.jvpp.ves.future.FutureJVppVesFacade; ++import javax.annotation.Nonnull; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.Vesagent; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.Config; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.ConfigBuilder; ++import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; ++import org.slf4j.Logger; ++import org.slf4j.LoggerFactory; ++ ++final class VesagentCustomizer extends FutureJVppCustomizer implements WriterCustomizer<Vesagent>, ++ JvppReplyConsumer, ByteDataTranslator, Ipv6Translator, Ipv4Translator { ++ private static final Logger LOG = LoggerFactory.getLogger(VesagentCustomizer.class); ++ ++ private final FutureJVppVesFacade jvppVes; ++ ++ VesagentCustomizer(final FutureJVppCore vppApi, final FutureJVppVesFacade jvppVes) { ++ super(vppApi); ++ this.jvppVes = jvppVes; ++ } ++ ++ @Override ++ public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Vesagent> iid, @Nonnull final Vesagent dataAfter, ++ @Nonnull final WriteContext writeContext) throws WriteFailedException { ++ Config config = dataAfter.getConfig(); ++ ConfigBuilder configBuilder = new ConfigBuilder(); ++ InstanceIdentifier<Config> id = iid.child(Config.class); ++ ++ LOG.debug("Writing VES Agent Config {} dataAfter={}", id, config); ++ checkArgument(config.getServerAddr() != null && config.getServerAddr().getValue() != null ++ && config.getServerPort() != 0, "VES Server Address and Port need to be configured"); ++ ++ configBuilder.setServerAddr(config.getServerAddr()) ++ .setServerPort(config.getServerPort()) ++ .setReadInterval(config.getReadInterval()) ++ .setIsAdd(1L); ++ ++ setVesAgentConfig(id, configBuilder.build()); ++ } ++ ++ @Override ++ public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Vesagent> iid, @Nonnull final Vesagent dataBefore, ++ @Nonnull final Vesagent dataAfter, @Nonnull final WriteContext writeContext) ++ throws WriteFailedException { ++ Config configBefore = dataBefore.getConfig(); ++ Config configAfter = dataAfter.getConfig(); ++ ConfigBuilder configBuilder = new ConfigBuilder(); ++ InstanceIdentifier<Config> id = iid.child(Config.class); ++ ++ checkArgument(configBefore.getServerAddr() != null && configBefore.getServerAddr().getValue() != null ++ && configBefore.getServerPort() != 0, "VES Server Address and Port need to be configured"); ++ checkArgument(configAfter.getServerAddr() != null && configAfter.getServerAddr().getValue() != null ++ && configAfter.getServerPort() != 0, "VES Server Address and Port need to be configured"); ++ ++ // remove old configuration: ++ configBuilder.setServerAddr(configBefore.getServerAddr()) ++ .setServerPort(configBefore.getServerPort()) ++ .setReadInterval(configBefore.getReadInterval()) ++ .setIsAdd(0L); ++ setVesAgentConfig(id, configBuilder.build()); ++ ++ // and add new one: ++ configBuilder.setServerAddr(configAfter.getServerAddr()) ++ .setServerPort(configAfter.getServerPort()) ++ .setReadInterval(configAfter.getReadInterval()) ++ .setIsAdd(1L); ++ setVesAgentConfig(id, configBuilder.build()); ++ } ++ ++ @Override ++ public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Vesagent> iid, @Nonnull final Vesagent dataBefore, ++ @Nonnull final WriteContext writeContext) throws WriteFailedException { ++ Config config = dataBefore.getConfig(); ++ InstanceIdentifier<Config> id = iid.child(Config.class); ++ LOG.debug("Removing VES Agent {} dataBefore={}", id, config); ++ ++ checkArgument(config.getServerAddr() != null && config.getServerAddr().getValue() != null ++ && config.getServerPort() != 0, "VES Server Address and Port need to be configured"); ++ ++ ConfigBuilder configBuilder = new ConfigBuilder(); ++ configBuilder.setServerAddr(config.getServerAddr()) ++ .setServerPort(config.getServerPort()) ++ .setReadInterval(config.getReadInterval()) ++ .setIsAdd(0L); ++ ++ setVesAgentConfig(id, configBuilder.build()); ++ } ++ ++ private void setVesAgentConfig(final InstanceIdentifier<Config> id, final Config config) ++ throws WriteFailedException { ++ final VesAgentConfig request = new VesAgentConfig(); ++ ++ request.serverPort = config.getServerPort().byteValue(); ++ request.readInterval = config.getReadInterval().byteValue(); ++ request.isAdd = config.getIsAdd().byteValue(); ++ request.serverAddr = ipv4AddressNoZoneToArray(config.getServerAddr().getValue()); ++ ++ LOG.debug("VES agent config change id={} request={}", id, request); ++ getReplyForWrite(jvppVes.vesAgentConfig(request).toCompletableFuture(), id); ++ } ++} +diff --git a/vpp-integration/minimal-distribution/pom.xml b/vpp-integration/minimal-distribution/pom.xml +index e126114a..ca0e5b24 100644 +--- a/vpp-integration/minimal-distribution/pom.xml ++++ b/vpp-integration/minimal-distribution/pom.xml +@@ -40,6 +40,7 @@ + <routing.version>1.17.04.1-SNAPSHOT</routing.version> + <acl.version>1.17.04.1-SNAPSHOT</acl.version> + <dhcp.version>1.17.04.1-SNAPSHOT</dhcp.version> ++ <vesagent.version>1.17.04.1-SNAPSHOT</vesagent.version> + <vpp.classifier.version>1.17.04.1-SNAPSHOT</vpp.classifier.version> + <l3-impl.version>1.17.04.1-SNAPSHOT</l3-impl.version> + <vpp-management-impl.version>1.17.04.1-SNAPSHOT</vpp-management-impl.version> +@@ -63,6 +64,7 @@ + io.fd.hc2vpp.routing.RoutingModule, + io.fd.hc2vpp.acl.AclModule, + io.fd.hc2vpp.dhcp.DhcpModule, ++ io.fd.hc2vpp.ves.VesModule, + io.fd.hc2vpp.policer.PolicerModule, + // io.fd.hc2vpp.vppnsh.impl.VppNshModule, + <!-- Nsh module by default disabled, because it needs vpp-nsh plugin, which is not part of vpp codebase.--> +@@ -151,6 +153,11 @@ + <version>${dhcp.version}</version> + </dependency> + <dependency> ++ <groupId>io.fd.hc2vpp.ves</groupId> ++ <artifactId>ves-impl</artifactId> ++ <version>${vesagent.version}</version> ++ </dependency> ++ <dependency> + <groupId>io.fd.hc2vpp.management</groupId> + <artifactId>vpp-management-impl</artifactId> + <version>${vpp-management-impl.version}</version> +-- +2.12.2.windows.2 + |