Add patch for BRG and scripts to set the NAT rule
[demo.git] / vnfs / vCPE / vpp-ves-agent-for-vgmux / src / patches / Hc2vpp-Add-VES-agent-for-vG-MUX.patch
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 (file)
index 0000000..8c2e31b
--- /dev/null
@@ -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
+