HC2VPP-7 - Split vpp state/Cli RPC to separate module 06/5706/4
authorJan Srnicek <[email protected]>
Tue, 14 Mar 2017 08:29:12 +0000 (09:29 +0100)
committerMarek Gradzki <[email protected]>
Tue, 14 Mar 2017 13:33:40 +0000 (14:33 +0100)
Introduces VppManageModule containing
- Vpp state attributes
- CLI RPC support
- Keep-alive

Change-Id: I8907e57132cc9e57840aa3b9607fa131a77f767d
Signed-off-by: Jan Srnicek <[email protected]>
39 files changed:
pom.xml
v3po/api/src/main/yang/v3po.yang
v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/V3poModule.java
v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/factory/L2HoneycombWriterFactory.java [moved from v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/factory/VppHoneycombWriterFactory.java with 80% similarity]
v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/factory/L2StateHoneycombReaderFactory.java [moved from v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/factory/VppStateHoneycombReaderFactory.java with 51% similarity]
v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/l2/ArpTerminationTableEntryCustomizer.java [moved from v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/vpp/ArpTerminationTableEntryCustomizer.java with 98% similarity]
v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/l2/BridgeDomainCustomizer.java [moved from v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/vpp/BridgeDomainCustomizer.java with 98% similarity]
v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/l2/L2FibEntryCustomizer.java [moved from v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/vpp/L2FibEntryCustomizer.java with 98% similarity]
v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/l2state/BridgeDomainCustomizer.java [moved from v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/vppstate/BridgeDomainCustomizer.java with 89% similarity]
v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/l2state/L2FibEntryCustomizer.java [moved from v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/vppstate/L2FibEntryCustomizer.java with 98% similarity]
v3po/v3po2vpp/src/main/resources/honeycomb-minimal-resources/config/v3po.json [deleted file]
v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/V3poModuleTest.java
v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/l2/ArpTerminationTableEntryCustomizerTest.java [moved from v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/vpp/ArpTerminationTableEntryCustomizerTest.java with 97% similarity]
v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/l2/BridgeDomainCustomizerTest.java [moved from v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/vpp/BridgeDomainCustomizerTest.java with 98% similarity]
v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/l2/L2FibEntryCustomizerTest.java [moved from v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/vpp/L2FibEntryCustomizerTest.java with 98% similarity]
v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/l2state/BridgeDomainCustomizerTest.java [moved from v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/vppstate/BridgeDomainCustomizerTest.java with 82% similarity]
v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/l2state/L2FibEntryCustomizerTest.java [moved from v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/vppstate/L2FibEntryCustomizerTest.java with 93% similarity]
v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/l2state/L2StateTest.java [moved from v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/vppstate/VppStateTest.java with 52% similarity]
v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/vppstate/VersionCustomizerTest.java [deleted file]
v3po/v3po2vpp/src/test/resources/v3po.json [deleted file]
vpp-integration/minimal-distribution/pom.xml
vpp-management/api/asciidoc/Readme.adoc [new file with mode: 0644]
vpp-management/api/pom.xml [new file with mode: 0644]
vpp-management/api/src/main/yang/vpp-management.yang [new file with mode: 0644]
vpp-management/asciidoc/Readme.adoc [new file with mode: 0644]
vpp-management/impl/asciidoc/Readme.adoc [new file with mode: 0644]
vpp-management/impl/pom.xml [new file with mode: 0644]
vpp-management/impl/src/main/java/io/fd/hc2vpp/management/VppManagementConfiguration.java [moved from v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/cfgattrs/V3poConfiguration.java with 75% similarity]
vpp-management/impl/src/main/java/io/fd/hc2vpp/management/VppManagementModule.java [new file with mode: 0644]
vpp-management/impl/src/main/java/io/fd/hc2vpp/management/rpc/CliInbandService.java [moved from v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/rpc/CliInbandService.java with 90% similarity]
vpp-management/impl/src/main/java/io/fd/hc2vpp/management/state/StateReaderFactory.java [new file with mode: 0644]
vpp-management/impl/src/main/java/io/fd/hc2vpp/management/state/VersionCustomizer.java [moved from v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/vppstate/VersionCustomizer.java with 93% similarity]
vpp-management/impl/src/main/resources/honeycomb-minimal-resources/config/vpp-management.json [new file with mode: 0644]
vpp-management/impl/src/test/java/io/fd/hc2vpp/management/VppManagementModuleTest.java [new file with mode: 0644]
vpp-management/impl/src/test/java/io/fd/hc2vpp/management/rpc/CliInbandServiceTest.java [moved from v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/rpc/CliInbandServiceTest.java with 88% similarity]
vpp-management/impl/src/test/java/io/fd/hc2vpp/management/state/VppStateTest.java [new file with mode: 0644]
vpp-management/impl/src/test/resources/vpp-management.json [new file with mode: 0644]
vpp-management/pom.xml [new file with mode: 0644]
vpp-management/vpp_management_postman_collection.json [new file with mode: 0644]

diff --git a/pom.xml b/pom.xml
index 81095de..6032cc8 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -48,5 +48,6 @@
     <module>samples</module>
     <module>vpp-classifier</module>
     <module>l3</module>
+    <module>vpp-management</module>
   </modules>
 </project>
index f5f6b32..e9df2f9 100644 (file)
@@ -39,7 +39,7 @@ module v3po {
 
   typedef bridge-domain-ref {
     type leafref {
-      path "/vpp/bridge-domains/bridge-domain/name";
+      path "/bridge-domains/bridge-domain/name";
     }
     description
       "This type is used by to reference a bridge domain table";
@@ -585,24 +585,19 @@ module v3po {
     }
   }
 
-  container vpp {
-    description
-    "VPP config data";
+  container bridge-domains {
+    list bridge-domain {
+      key "name";
 
-    container bridge-domains {
-      list bridge-domain {
-        key "name";
+      leaf name {
+        type string;
+      }
 
-        leaf name {
-          type string;
-        }
+      uses bridge-domain-attributes;
+      uses l2-fib-attributes;
 
-        uses bridge-domain-attributes;
-        uses l2-fib-attributes;
-
-        description
-          "bridge-domain configuration";
-      }
+      description
+        "bridge-domain configuration";
     }
   }
 
@@ -675,13 +670,7 @@ module v3po {
     }
   }
 
-  container vpp-state {
-    config false;
-
-    description
-      "VPP operational data";
-
-    container bridge-domains {
+  container bridge-domains-state {
       // FIXME: Should this live in bridge-domain.yang in a modular fashion ?
       list bridge-domain {
 
@@ -696,29 +685,6 @@ module v3po {
         description
           "bridge-domain operational data";
       }
-    }
-
-    container version {
-      leaf name {
-        type string;
-      }
-      leaf build-directory {
-        type string;
-      }
-      leaf build-date {
-        type string;
-      }
-      leaf branch {
-        type string;
-      }
-      leaf pid {
-        type uint32;
-        description
-          "PID of the vpp process";
-      }
-      description
-      "vlib version info";
-    }
   }
 
   // VPP Notifications
@@ -760,17 +726,4 @@ module v3po {
         type interface-name-or-index;
     }
   }
-
-  rpc cli-inband {
-    input {
-      leaf cmd {
-        type string;
-      }
-    }
-    output {
-      leaf reply {
-        type string;
-      }
-    }
-  }
 }
index 06d6d29..1a04300 100644 (file)
@@ -20,22 +20,16 @@ import com.google.inject.AbstractModule;
 import com.google.inject.multibindings.Multibinder;
 import com.google.inject.name.Names;
 import io.fd.hc2vpp.common.translate.util.NamingContext;
-import io.fd.hc2vpp.v3po.cfgattrs.V3poConfiguration;
 import io.fd.hc2vpp.v3po.factory.InterfacesStateReaderFactory;
 import io.fd.hc2vpp.v3po.factory.InterfacesWriterFactory;
+import io.fd.hc2vpp.v3po.factory.L2HoneycombWriterFactory;
+import io.fd.hc2vpp.v3po.factory.L2StateHoneycombReaderFactory;
 import io.fd.hc2vpp.v3po.factory.SubinterfaceAugmentationWriterFactory;
 import io.fd.hc2vpp.v3po.factory.SubinterfaceStateAugmentationReaderFactory;
-import io.fd.hc2vpp.v3po.factory.VppHoneycombWriterFactory;
-import io.fd.hc2vpp.v3po.factory.VppStateHoneycombReaderFactory;
 import io.fd.hc2vpp.v3po.notification.InterfaceChangeNotificationProducer;
-import io.fd.hc2vpp.v3po.rpc.CliInbandService;
 import io.fd.honeycomb.notification.ManagedNotificationProducer;
-import io.fd.honeycomb.rpc.RpcService;
 import io.fd.honeycomb.translate.read.ReaderFactory;
 import io.fd.honeycomb.translate.write.WriterFactory;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import net.jmob.guice.conf.core.ConfigurationModule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,8 +40,6 @@ public class V3poModule extends AbstractModule {
     @Override
     protected void configure() {
         LOG.debug("Installing V3PO module");
-        install(ConfigurationModule.create());
-        requestInjection(V3poConfiguration.class);
 
         // TODO HONEYCOMB-173 put into constants
         // Naming contexts
@@ -58,10 +50,6 @@ public class V3poModule extends AbstractModule {
                 .annotatedWith(Names.named("bridge-domain-context"))
                 .toInstance(new NamingContext("bridge-domain-", "bridge-domain-context"));
 
-        // Executor needed for keepalives
-        bind(ScheduledExecutorService.class).toInstance(Executors.newScheduledThreadPool(1));
-
-
         // Context utility for deleted interfaces
         bind(DisabledInterfacesManager.class).toInstance(new DisabledInterfacesManager());
 
@@ -69,7 +57,7 @@ public class V3poModule extends AbstractModule {
         final Multibinder<ReaderFactory> readerFactoryBinder = Multibinder.newSetBinder(binder(), ReaderFactory.class);
         readerFactoryBinder.addBinding().to(InterfacesStateReaderFactory.class);
         readerFactoryBinder.addBinding().to(SubinterfaceStateAugmentationReaderFactory.class);
-        readerFactoryBinder.addBinding().to(VppStateHoneycombReaderFactory.class);
+        readerFactoryBinder.addBinding().to(L2StateHoneycombReaderFactory.class);
 
         // Expose disabled interfaces in operational data
         readerFactoryBinder.addBinding().to(DisabledInterfacesManager.ContextsReaderFactory.class);
@@ -78,17 +66,13 @@ public class V3poModule extends AbstractModule {
         final Multibinder<WriterFactory> writerFactoryBinder = Multibinder.newSetBinder(binder(), WriterFactory.class);
         writerFactoryBinder.addBinding().to(InterfacesWriterFactory.class);
         writerFactoryBinder.addBinding().to(SubinterfaceAugmentationWriterFactory.class);
-        writerFactoryBinder.addBinding().to(VppHoneycombWriterFactory.class);
+        writerFactoryBinder.addBinding().to(L2HoneycombWriterFactory.class);
 
         // Notifications
         final Multibinder<ManagedNotificationProducer> notifiersBinder =
                 Multibinder.newSetBinder(binder(), ManagedNotificationProducer.class);
         notifiersBinder.addBinding().to(InterfaceChangeNotificationProducer.class);
 
-        // RPCs
-        final Multibinder<RpcService> rpcsBinder = Multibinder.newSetBinder(binder(), RpcService.class);
-        rpcsBinder.addBinding().to(CliInbandService.class);
-
         LOG.info("Module V3PO successfully configured");
     }
 }
@@ -19,33 +19,32 @@ package io.fd.hc2vpp.v3po.factory;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
-import io.fd.hc2vpp.v3po.vpp.ArpTerminationTableEntryCustomizer;
-import io.fd.hc2vpp.v3po.vpp.BridgeDomainCustomizer;
-import io.fd.hc2vpp.v3po.vpp.L2FibEntryCustomizer;
+import io.fd.hc2vpp.v3po.l2.ArpTerminationTableEntryCustomizer;
+import io.fd.hc2vpp.v3po.l2.BridgeDomainCustomizer;
+import io.fd.hc2vpp.v3po.l2.L2FibEntryCustomizer;
 import io.fd.honeycomb.translate.impl.write.GenericListWriter;
 import io.fd.hc2vpp.common.translate.util.NamingContext;
 import io.fd.honeycomb.translate.write.WriterFactory;
 import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.Vpp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.BridgeDomains;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domain.attributes.ArpTerminationTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domain.attributes.arp.termination.table.ArpTerminationTableEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomain;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.L2FibTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.BridgeDomains;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomain;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import io.fd.vpp.jvpp.core.future.FutureJVppCore;
 
-public final class VppHoneycombWriterFactory implements WriterFactory {
+public final class L2HoneycombWriterFactory implements WriterFactory {
 
     private final FutureJVppCore jvpp;
     private final NamingContext bdContext;
     private final NamingContext ifcContext;
 
     @Inject
-    public VppHoneycombWriterFactory(final FutureJVppCore vppJvppWriterDependency,
-                                     @Named("bridge-domain-context") final NamingContext bridgeDomainContextVppDependency,
-                                     @Named("interface-context") final NamingContext interfaceContextVppDependency) {
+    public L2HoneycombWriterFactory(final FutureJVppCore vppJvppWriterDependency,
+                                    @Named("bridge-domain-context") final NamingContext bridgeDomainContextVppDependency,
+                                    @Named("interface-context") final NamingContext interfaceContextVppDependency) {
         this.jvpp = vppJvppWriterDependency;
         this.bdContext = bridgeDomainContextVppDependency;
         this.ifcContext = interfaceContextVppDependency;
@@ -57,7 +56,7 @@ public final class VppHoneycombWriterFactory implements WriterFactory {
         //  BridgeDomains has no handlers
         //   BridgeDomain(handled before L2 of ifc and subifc) =
         final InstanceIdentifier<BridgeDomain> bdId =
-            InstanceIdentifier.create(Vpp.class).child(BridgeDomains.class).child(BridgeDomain.class);
+            InstanceIdentifier.create(BridgeDomains.class).child(BridgeDomain.class);
         registry.addBefore(new GenericListWriter<>(bdId, new BridgeDomainCustomizer(jvpp, bdContext)),
             Sets.newHashSet(
                 InterfacesWriterFactory.L2_ID,
@@ -19,68 +19,41 @@ package io.fd.hc2vpp.v3po.factory;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
 import io.fd.hc2vpp.common.translate.util.NamingContext;
-import io.fd.hc2vpp.common.translate.util.ReadTimeoutException;
-import io.fd.hc2vpp.common.translate.util.VppStatusListener;
-import io.fd.hc2vpp.v3po.cfgattrs.V3poConfiguration;
-import io.fd.hc2vpp.v3po.vppstate.BridgeDomainCustomizer;
-import io.fd.hc2vpp.v3po.vppstate.L2FibEntryCustomizer;
-import io.fd.hc2vpp.v3po.vppstate.VersionCustomizer;
+import io.fd.hc2vpp.v3po.l2state.BridgeDomainCustomizer;
+import io.fd.hc2vpp.v3po.l2state.L2FibEntryCustomizer;
 import io.fd.honeycomb.translate.impl.read.GenericInitListReader;
-import io.fd.honeycomb.translate.impl.read.GenericReader;
 import io.fd.honeycomb.translate.read.ReaderFactory;
 import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder;
-import io.fd.honeycomb.translate.util.read.KeepaliveReaderWrapper;
 import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.util.concurrent.ScheduledExecutorService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppState;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppStateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.BridgeDomainsState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.BridgeDomainsStateBuilder;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.state.BridgeDomain;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.L2FibTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.L2FibTableBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.BridgeDomains;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.BridgeDomainsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.Version;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomain;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-public final class VppStateHoneycombReaderFactory implements ReaderFactory {
+public final class L2StateHoneycombReaderFactory implements ReaderFactory {
 
     private final FutureJVppCore jVpp;
     private final NamingContext ifcCtx;
     private final NamingContext bdCtx;
-    private final ScheduledExecutorService keepaliveExecutor;
-    private final VppStatusListener vppStatusListener;
-
-    @Inject
-    private V3poConfiguration v3poConfiguration;
 
     @Inject
-    public VppStateHoneycombReaderFactory(final FutureJVppCore jVpp,
-                                          @Named("interface-context") final NamingContext ifcCtx,
-                                          @Named("bridge-domain-context") final NamingContext bdCtx,
-                                          final ScheduledExecutorService keepaliveExecutorDependency,
-                                          final VppStatusListener vppStatusListener) {
+    public L2StateHoneycombReaderFactory(final FutureJVppCore jVpp,
+                                         @Named("interface-context") final NamingContext ifcCtx,
+                                         @Named("bridge-domain-context") final NamingContext bdCtx) {
         this.jVpp = jVpp;
         this.ifcCtx = ifcCtx;
         this.bdCtx = bdCtx;
-        this.keepaliveExecutor = keepaliveExecutorDependency;
-        this.vppStatusListener = vppStatusListener;
     }
 
     @Override
     public void init(final ModifiableReaderRegistryBuilder registry) {
-        // VppState(Structural)
-        final InstanceIdentifier<VppState> vppStateId = InstanceIdentifier.create(VppState.class);
-        registry.addStructuralReader(vppStateId, VppStateBuilder.class);
-        //  Version
-        // Wrap with keepalive reader to detect connection issues
-        // Relying on VersionCustomizer to provide a "timing out read"
-        registry.add(new KeepaliveReaderWrapper<>(
-                new GenericReader<>(vppStateId.child(Version.class), new VersionCustomizer(jVpp)),
-                keepaliveExecutor, ReadTimeoutException.class, v3poConfiguration.getKeepaliveDelay(), vppStatusListener));
         //  BridgeDomains(Structural)
-        final InstanceIdentifier<BridgeDomains> bridgeDomainsId = vppStateId.child(BridgeDomains.class);
-        registry.addStructuralReader(bridgeDomainsId, BridgeDomainsBuilder.class);
+        final InstanceIdentifier<BridgeDomainsState> bridgeDomainsId = InstanceIdentifier.create(BridgeDomainsState.class);
+        registry.addStructuralReader(bridgeDomainsId, BridgeDomainsStateBuilder.class);
         //   BridgeDomain
         final InstanceIdentifier<BridgeDomain> bridgeDomainId = bridgeDomainsId.child(BridgeDomain.class);
         registry.add(new GenericInitListReader<>(bridgeDomainId, new BridgeDomainCustomizer(jVpp, bdCtx)));
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.vpp;
+package io.fd.hc2vpp.v3po.l2;
 
 import com.google.common.base.Preconditions;
 import io.fd.hc2vpp.common.translate.util.AddressTranslator;
@@ -33,7 +33,7 @@ import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domain.attributes.arp.termination.table.ArpTerminationTableEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domain.attributes.arp.termination.table.ArpTerminationTableEntryKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomain;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.vpp;
+package io.fd.hc2vpp.v3po.l2;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -39,9 +39,10 @@ import javax.annotation.concurrent.GuardedBy;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.L2BaseAttributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppInterfaceAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomainKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.base.attributes.interconnection.BridgeBased;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomainKey;
+
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.vpp;
+package io.fd.hc2vpp.v3po.l2;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -35,9 +35,9 @@ import io.fd.vpp.jvpp.core.future.FutureJVppCore;
 import java.util.concurrent.CompletionStage;
 import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.L2FibFilter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomain;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntryKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomain;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.vppstate;
+package io.fd.hc2vpp.v3po.l2state;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterables;
@@ -33,12 +33,11 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.Vpp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.BridgeDomains;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.BridgeDomainsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomainBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomainKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.BridgeDomains;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.BridgeDomainsStateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.state.BridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.state.BridgeDomainBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.state.BridgeDomainKey;
 import org.opendaylight.yangtools.concepts.Builder;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -152,16 +151,16 @@ public final class BridgeDomainCustomizer extends FutureJVppCustomizer
     @Override
     public void merge(@Nonnull final Builder<? extends DataObject> builder,
                       @Nonnull final List<BridgeDomain> readData) {
-        ((BridgeDomainsBuilder) builder).setBridgeDomain(readData);
+        ((BridgeDomainsStateBuilder) builder).setBridgeDomain(readData);
     }
 
     @Override
-    public Initialized<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomain> init(
+    public Initialized<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomain> init(
             @Nonnull final InstanceIdentifier<BridgeDomain> id,
             @Nonnull final BridgeDomain readValue,
             @Nonnull final ReadContext ctx) {
         return Initialized.create(getCfgId(id),
-                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomainBuilder()
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomainBuilder()
                         .setName(readValue.getName())
                         .setLearn(readValue.isLearn())
                         .setUnknownUnicastFlood(readValue.isUnknownUnicastFlood())
@@ -171,11 +170,11 @@ public final class BridgeDomainCustomizer extends FutureJVppCustomizer
                         .build());
     }
 
-    static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomain> getCfgId(
+    static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomain> getCfgId(
             final InstanceIdentifier<BridgeDomain> id) {
-        return InstanceIdentifier.create(Vpp.class).child(BridgeDomains.class).child(
-                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomain.class,
-                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomainKey(
+        return InstanceIdentifier.create(BridgeDomains.class).child(
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomain.class,
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomainKey(
                         id.firstKeyOf(BridgeDomain.class).getName()));
     }
 }
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.vppstate;
+package io.fd.hc2vpp.v3po.l2state;
 
 import com.google.common.base.Preconditions;
 import com.google.common.primitives.Longs;
@@ -40,13 +40,13 @@ import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.L2FibFilter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.L2FibForward;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.state.BridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.state.BridgeDomainKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.L2FibTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.L2FibTableBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntryKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomainKey;
 import org.opendaylight.yangtools.concepts.Builder;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
diff --git a/v3po/v3po2vpp/src/main/resources/honeycomb-minimal-resources/config/v3po.json b/v3po/v3po2vpp/src/main/resources/honeycomb-minimal-resources/config/v3po.json
deleted file mode 100644 (file)
index 9ea66ef..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "keepalive-delay": "30"
-}
index 66231b2..9d799d8 100644 (file)
@@ -19,7 +19,6 @@ package io.fd.hc2vpp.v3po;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.Matchers.empty;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 import static org.mockito.MockitoAnnotations.initMocks;
@@ -29,7 +28,6 @@ import com.google.inject.Inject;
 import com.google.inject.name.Named;
 import com.google.inject.testing.fieldbinder.Bind;
 import com.google.inject.testing.fieldbinder.BoundFieldModule;
-import io.fd.hc2vpp.v3po.cfgattrs.V3poConfiguration;
 import io.fd.honeycomb.translate.MappingContext;
 import io.fd.honeycomb.translate.impl.read.registry.CompositeReaderRegistryBuilder;
 import io.fd.honeycomb.translate.impl.write.registry.FlatWriterRegistryBuilder;
@@ -70,9 +68,6 @@ public class V3poModuleTest {
     @Inject
     private Set<WriterFactory> writerFactories = new HashSet<>();
 
-    @Inject
-    private V3poConfiguration configuration;
-
     @Before
     public void setUp() {
         initMocks(this);
@@ -99,8 +94,5 @@ public class V3poModuleTest {
         assertNotNull(registryBuilder.build());
     }
 
-    @Test
-    public void testConfiguration() {
-        assertEquals(30, configuration.getKeepaliveDelay());
-    }
+
 }
\ No newline at end of file
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.vpp;
+package io.fd.hc2vpp.v3po.l2;
 
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
@@ -38,13 +38,13 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6AddressNoZone;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.BridgeDomains;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domain.attributes.ArpTerminationTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domain.attributes.arp.termination.table.ArpTerminationTableEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domain.attributes.arp.termination.table.ArpTerminationTableEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domain.attributes.arp.termination.table.ArpTerminationTableEntryKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.BridgeDomains;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomainKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomainKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class ArpTerminationTableEntryCustomizerTest extends WriterCustomizerTest {
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.vpp;
+package io.fd.hc2vpp.v3po.l2;
 
 import static org.junit.Assert.fail;
 import static org.mockito.Matchers.any;
@@ -38,14 +38,14 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.BridgeDomains;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppInterfaceAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppInterfaceAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomainBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomainKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.L2Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.base.attributes.interconnection.BridgeBasedBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.BridgeDomains;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomainBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomainKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.vpp;
+package io.fd.hc2vpp.v3po.l2;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -34,15 +34,15 @@ import io.fd.vpp.jvpp.core.dto.L2FibAddDelReply;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.BridgeDomains;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.L2FibFilter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.L2FibForward;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.BridgeDomainKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.L2FibTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntryKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.BridgeDomains;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.bridge.domains.BridgeDomainKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class L2FibEntryCustomizerTest extends WriterCustomizerTest {
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.vppstate;
+package io.fd.hc2vpp.v3po.l2state;
 
-import io.fd.honeycomb.translate.spi.read.ReaderCustomizer;
-import io.fd.hc2vpp.common.translate.util.NamingContext;
 import io.fd.hc2vpp.common.test.read.ListReaderCustomizerTest;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.BridgeDomainsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomainBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomainKey;
+import io.fd.hc2vpp.common.translate.util.NamingContext;
+import io.fd.honeycomb.translate.spi.read.ReaderCustomizer;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.BridgeDomainsStateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.state.BridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.state.BridgeDomainBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.state.BridgeDomainKey;
+
 
 public class BridgeDomainCustomizerTest
     extends ListReaderCustomizerTest<BridgeDomain, BridgeDomainKey, BridgeDomainBuilder> {
@@ -31,7 +32,7 @@ public class BridgeDomainCustomizerTest
     private NamingContext interfacesContext;
 
     public BridgeDomainCustomizerTest() {
-        super(BridgeDomain.class, BridgeDomainsBuilder.class);
+        super(BridgeDomain.class, BridgeDomainsStateBuilder.class);
     }
 
     @Override
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.vppstate;
+package io.fd.hc2vpp.v3po.l2state;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Matchers.any;
@@ -30,15 +30,16 @@ import java.util.List;
 import java.util.concurrent.ExecutionException;
 import org.junit.Test;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.BridgeDomains;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.BridgeDomainsState;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.L2FibForward;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.state.BridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.state.BridgeDomainKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.L2FibTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.L2FibTableBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntryKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.BridgeDomains;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomainKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import io.fd.vpp.jvpp.VppInvocationException;
 import io.fd.vpp.jvpp.core.dto.L2FibTableDump;
@@ -73,7 +74,7 @@ public class L2FibEntryCustomizerTest extends ListReaderCustomizerTest<L2FibEntr
     }
 
     private static InstanceIdentifier<L2FibEntry> getL2FibEntryId(final String bdName, final PhysAddress address) {
-        return InstanceIdentifier.create(BridgeDomains.class).child(BridgeDomain.class, new BridgeDomainKey(bdName))
+        return InstanceIdentifier.create(BridgeDomainsState.class).child(BridgeDomain.class, new BridgeDomainKey(bdName))
             .child(L2FibTable.class).child(L2FibEntry.class, new L2FibEntryKey(address));
     }
 
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.vppstate;
+package io.fd.hc2vpp.v3po.l2state;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.doAnswer;
@@ -28,53 +27,39 @@ import static org.mockito.MockitoAnnotations.initMocks;
 import com.google.common.base.Optional;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Multimap;
+import io.fd.hc2vpp.common.test.util.FutureProducer;
+import io.fd.hc2vpp.common.test.util.NamingContextHelper;
+import io.fd.hc2vpp.common.translate.util.NamingContext;
 import io.fd.honeycomb.translate.MappingContext;
 import io.fd.honeycomb.translate.ModificationCache;
 import io.fd.honeycomb.translate.impl.read.GenericListReader;
-import io.fd.honeycomb.translate.impl.read.GenericReader;
+import io.fd.honeycomb.translate.impl.read.registry.CompositeReaderRegistryBuilder;
 import io.fd.honeycomb.translate.read.ReadContext;
 import io.fd.honeycomb.translate.read.ReadFailedException;
 import io.fd.honeycomb.translate.read.registry.ReaderRegistry;
-import io.fd.honeycomb.translate.impl.read.registry.CompositeReaderRegistryBuilder;
-import io.fd.hc2vpp.common.test.util.NamingContextHelper;
-import io.fd.hc2vpp.common.translate.util.NamingContext;
-import io.fd.hc2vpp.common.test.util.FutureProducer;
-import io.fd.vpp.jvpp.dto.ControlPing;
-import io.fd.vpp.jvpp.dto.ControlPingReply;
+import io.fd.vpp.jvpp.core.dto.BridgeDomainDetails;
+import io.fd.vpp.jvpp.core.dto.BridgeDomainDetailsReplyDump;
+import io.fd.vpp.jvpp.core.dto.BridgeDomainDump;
+import io.fd.vpp.jvpp.core.dto.L2FibTableDump;
+import io.fd.vpp.jvpp.core.dto.L2FibTableEntry;
+import io.fd.vpp.jvpp.core.dto.L2FibTableEntryReplyDump;
+import io.fd.vpp.jvpp.core.future.FutureJVppCore;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import javax.annotation.Nonnull;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.Mock;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppState;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppStateBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.L2FibTable;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.fib.attributes.l2.fib.table.L2FibEntryKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.BridgeDomains;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.BridgeDomainsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.Version;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.VersionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomain;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomainBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.bridge.domains.BridgeDomainKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.BridgeDomainsState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.BridgeDomainsStateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.state.BridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.state.BridgeDomainBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.bridge.domains.state.BridgeDomainKey;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import io.fd.vpp.jvpp.core.dto.BridgeDomainDetails;
-import io.fd.vpp.jvpp.core.dto.BridgeDomainDetailsReplyDump;
-import io.fd.vpp.jvpp.core.dto.BridgeDomainDump;
-import io.fd.vpp.jvpp.core.dto.L2FibTableDump;
-import io.fd.vpp.jvpp.core.dto.L2FibTableEntry;
-import io.fd.vpp.jvpp.core.dto.L2FibTableEntryReplyDump;
-import io.fd.vpp.jvpp.core.dto.ShowVersion;
-import io.fd.vpp.jvpp.core.dto.ShowVersionReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
 
-public class VppStateTest implements FutureProducer, NamingContextHelper {
+public class L2StateTest implements FutureProducer, NamingContextHelper {
 
     private static final String BD_CTX_NAME = "bd-test-instance";
     @Mock
@@ -88,7 +73,7 @@ public class VppStateTest implements FutureProducer, NamingContextHelper {
 
     private ReaderRegistry readerRegistry;
 
-    private static InstanceIdentifier<BridgeDomains> bridgeDomainsId;
+    private static InstanceIdentifier<BridgeDomainsState> bridgeDomainsId;
 
     /**
      * Create root VppState reader with all its children wired.
@@ -97,14 +82,9 @@ public class VppStateTest implements FutureProducer, NamingContextHelper {
                                             @Nonnull final NamingContext bdContext) {
         final CompositeReaderRegistryBuilder registry = new CompositeReaderRegistryBuilder();
 
-        // VppState(Structural)
-        final InstanceIdentifier<VppState> vppStateId = InstanceIdentifier.create(VppState.class);
-        registry.addStructuralReader(vppStateId, VppStateBuilder.class);
-        //  Version
-        registry.add(new GenericReader<>(vppStateId.child(Version.class), new VersionCustomizer(jVpp)));
         //  BridgeDomains(Structural)
-        bridgeDomainsId = vppStateId.child(BridgeDomains.class);
-        registry.addStructuralReader(bridgeDomainsId, BridgeDomainsBuilder.class);
+        bridgeDomainsId = InstanceIdentifier.create(BridgeDomainsState.class);
+        registry.addStructuralReader(bridgeDomainsId, BridgeDomainsStateBuilder.class);
         //   BridgeDomain
         registry.add(getBridgeDomainReader(jVpp, bdContext));
         return registry.build();
@@ -127,27 +107,6 @@ public class VppStateTest implements FutureProducer, NamingContextHelper {
         readerRegistry = getVppStateReader(api, bdContext);
     }
 
-    private static Version getVersion() {
-        return new VersionBuilder()
-            .setName("test")
-            .setBuildDirectory("1")
-            .setBranch("2")
-            .setBuildDate("3")
-            .setPid(0L)
-            .build();
-    }
-
-    private void whenShowVersionThenReturn(final Version version) {
-        final ShowVersionReply reply = new ShowVersionReply();
-        reply.buildDate = version.getBuildDate().getBytes();
-        reply.program = version.getName().getBytes();
-        reply.version = version.getBranch().getBytes();
-        reply.buildDirectory = version.getBuildDirectory().getBytes();
-        when(api.showVersion(any(ShowVersion.class))).thenReturn(future(reply));
-        // Version Customizer uses ControlPing to obtain PID
-        when(api.send(any(ControlPing.class))).thenReturn(future(new ControlPingReply()));
-    }
-
     private void whenL2FibTableDumpThenReturn(final List<L2FibTableEntry> entryList) {
         final L2FibTableEntryReplyDump reply = new L2FibTableEntryReplyDump();
         reply.l2FibTableEntry = entryList;
@@ -171,9 +130,6 @@ public class VppStateTest implements FutureProducer, NamingContextHelper {
 
     @Test
     public void testReadAll() throws Exception {
-        final Version version = getVersion();
-        whenShowVersionThenReturn(version);
-
         final BridgeDomainDetails bridgeDomainDetails = new BridgeDomainDetails();
         final BridgeDomainDetails bridgeDomainDetails2 = new BridgeDomainDetails();
         bridgeDomainDetails2.bdId = 1;
@@ -187,74 +143,23 @@ public class VppStateTest implements FutureProducer, NamingContextHelper {
         final Multimap<InstanceIdentifier<? extends DataObject>, ? extends DataObject> dataObjects =
             readerRegistry.readAll(ctx);
         assertEquals(dataObjects.size(), 1);
-        final VppState dataObject =
-            (VppState) Iterables.getOnlyElement(dataObjects.get(Iterables.getOnlyElement(dataObjects.keySet())));
-        assertEquals(version, dataObject.getVersion());
-        assertEquals(2, dataObject.getBridgeDomains().getBridgeDomain().size());
-    }
-
-    @Test
-    public void testReadSpecific() throws Exception {
-        final Version version = getVersion();
-        whenShowVersionThenReturn(version);
-        whenBridgeDomainDumpThenReturn(Collections.emptyList());
-
-        final Optional<? extends DataObject> read = readerRegistry.read(InstanceIdentifier.create(VppState.class), ctx);
-        assertTrue(read.isPresent());
-        assertEquals(version, ((VppState) read.get()).getVersion());
+        final BridgeDomainsState dataObject =
+            (BridgeDomainsState) Iterables.getOnlyElement(dataObjects.get(Iterables.getOnlyElement(dataObjects.keySet())));
+        assertEquals(2, dataObject.getBridgeDomain().size());
     }
 
     @Test
     public void testReadBridgeDomains() throws Exception {
-        final Version version = getVersion();
-        whenShowVersionThenReturn(version);
         final BridgeDomainDetails details = new BridgeDomainDetails();
         whenBridgeDomainDumpThenReturn(Collections.singletonList(details));
 
         mockBdMapping(details, "bdn1");
-        VppState readRoot = (VppState) readerRegistry.read(InstanceIdentifier.create(VppState.class), ctx).get();
-
-        Optional<? extends DataObject> read =
-            readerRegistry.read(InstanceIdentifier.create(VppState.class).child(BridgeDomains.class), ctx);
-        assertTrue(read.isPresent());
-        assertEquals(readRoot.getBridgeDomains(), read.get());
-    }
-
-    /**
-     * L2fib does not have a dedicated reader, relying on auto filtering
-     */
-    @Test
-    @Ignore("L2 FIB was moved to dedicated customizer. TODO: add infra test that covers such case")
-    @SuppressWarnings("unchecked")
-    public void testReadL2Fib() throws Exception {
-        final BridgeDomainDetails bd = new BridgeDomainDetails();
-        bd.bdId = 0;
-        final String bdName = "bdn1";
-        mockBdMapping(bd, bdName);
-        defineMapping(mappingContext, "eth1", 0, "ifc-test-instance");
+        BridgeDomainsState readRoot = (BridgeDomainsState) readerRegistry.read(InstanceIdentifier.create(BridgeDomainsState.class), ctx).get();
 
-        whenBridgeDomainDumpThenReturn(Collections.singletonList(bd));
-        final L2FibTableEntry l2FibEntry = new L2FibTableEntry();
-        l2FibEntry.bdId = 0;
-        l2FibEntry.mac = 0x0605040302010000L;
-        whenL2FibTableDumpThenReturn(Collections.singletonList(l2FibEntry));
-
-        // Deep child without a dedicated reader with specific l2fib key
-        final InstanceIdentifier<? extends DataObject> idExisting =
-            InstanceIdentifier.create(VppState.class).child(BridgeDomains.class).child(
-                BridgeDomain.class, new BridgeDomainKey("bdn1")).child(L2FibTable.class)
-                .child(L2FibEntry.class, new L2FibEntryKey(new PhysAddress("01:02:03:04:05:06")));
         Optional<? extends DataObject> read =
-            readerRegistry.read(idExisting, ctx);
+            readerRegistry.read(InstanceIdentifier.create(BridgeDomainsState.class), ctx);
         assertTrue(read.isPresent());
-
-        // non existing l2fib
-        final InstanceIdentifier<? extends DataObject> idNonExisting =
-            InstanceIdentifier.create(VppState.class).child(BridgeDomains.class).child(
-                BridgeDomain.class, new BridgeDomainKey("bdn1")).child(L2FibTable.class)
-                .child(L2FibEntry.class, new L2FibEntryKey(new PhysAddress("FF:FF:FF:04:05:06")));
-        read = readerRegistry.read(idNonExisting, ctx);
-        assertFalse(read.isPresent());
+        assertEquals(readRoot.getBridgeDomain(), BridgeDomainsState.class.cast(read.get()).getBridgeDomain());
     }
 
     private void mockBdMapping(final BridgeDomainDetails bd, final String bdName) {
@@ -263,22 +168,20 @@ public class VppStateTest implements FutureProducer, NamingContextHelper {
 
     @Test
     public void testReadBridgeDomainAll() throws Exception {
-        final Version version = getVersion();
-        whenShowVersionThenReturn(version);
         final BridgeDomainDetails details = new BridgeDomainDetails();
         whenBridgeDomainDumpThenReturn(Collections.singletonList(details));
         mockBdMapping(details, "bd2");
 
-        VppState readRoot = (VppState) readerRegistry.read(InstanceIdentifier.create(VppState.class), ctx).get();
+        BridgeDomainsState readRoot = (BridgeDomainsState) readerRegistry.read(InstanceIdentifier.create(BridgeDomainsState.class), ctx).get();
 
         final GenericListReader<BridgeDomain, BridgeDomainKey, BridgeDomainBuilder> bridgeDomainReader =
             getBridgeDomainReader(api, bdContext);
 
         final List<BridgeDomain> read =
-            bridgeDomainReader.readList(InstanceIdentifier.create(VppState.class).child(BridgeDomains.class).child(
+            bridgeDomainReader.readList(InstanceIdentifier.create(BridgeDomainsState.class).child(
                 BridgeDomain.class), ctx);
 
-        assertEquals(readRoot.getBridgeDomains().getBridgeDomain(), read);
+        assertEquals(readRoot.getBridgeDomain(), read);
     }
 
     @Test
@@ -289,16 +192,15 @@ public class VppStateTest implements FutureProducer, NamingContextHelper {
         mockBdMapping(bd, bdName);
 
         whenBridgeDomainDumpThenReturn(Collections.singletonList(bd));
-        whenShowVersionThenReturn(getVersion());
 
-        VppState readRoot = (VppState) readerRegistry.read(InstanceIdentifier.create(VppState.class), ctx).get();
+        BridgeDomainsState readRoot = (BridgeDomainsState) readerRegistry.read(InstanceIdentifier.create(BridgeDomainsState.class), ctx).get();
 
         final Optional<? extends DataObject> read =
-            readerRegistry.read(InstanceIdentifier.create(VppState.class).child(BridgeDomains.class).child(
+            readerRegistry.read(InstanceIdentifier.create(BridgeDomainsState.class).child(
                 BridgeDomain.class, new BridgeDomainKey(bdName)), ctx);
 
         assertTrue(read.isPresent());
-        assertEquals(readRoot.getBridgeDomains().getBridgeDomain().stream().filter(
+        assertEquals(readRoot.getBridgeDomain().stream().filter(
             input -> input.getKey().getName().equals(bdName)).findFirst().get(),
             read.get());
     }
@@ -308,19 +210,7 @@ public class VppStateTest implements FutureProducer, NamingContextHelper {
         final String nonExistingBdName = "NOT EXISTING";
         noMappingDefined(mappingContext, nonExistingBdName, BD_CTX_NAME);
 
-        readerRegistry.read(InstanceIdentifier.create(VppState.class).child(BridgeDomains.class).child(
+        readerRegistry.read(InstanceIdentifier.create(BridgeDomainsState.class).child(
             BridgeDomain.class, new BridgeDomainKey(nonExistingBdName)), ctx);
     }
-
-    @Test
-    public void testReadVersion() throws Exception {
-        whenShowVersionThenReturn(getVersion());
-        whenBridgeDomainDumpThenReturn(Collections.emptyList());
-        VppState readRoot = (VppState) readerRegistry.read(InstanceIdentifier.create(VppState.class), ctx).get();
-
-        Optional<? extends DataObject> read =
-            readerRegistry.read(InstanceIdentifier.create(VppState.class).child(Version.class), ctx);
-        assertTrue(read.isPresent());
-        assertEquals(readRoot.getVersion(), read.get());
-    }
 }
\ No newline at end of file
diff --git a/v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/vppstate/VersionCustomizerTest.java b/v3po/v3po2vpp/src/test/java/io/fd/hc2vpp/v3po/vppstate/VersionCustomizerTest.java
deleted file mode 100644 (file)
index 2f12cbd..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.hc2vpp.v3po.vppstate;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import io.fd.honeycomb.translate.spi.read.ReaderCustomizer;
-import io.fd.hc2vpp.common.test.read.ReaderCustomizerTest;
-import io.fd.vpp.jvpp.core.dto.ShowVersion;
-import io.fd.vpp.jvpp.core.dto.ShowVersionReply;
-import io.fd.vpp.jvpp.dto.ControlPing;
-import io.fd.vpp.jvpp.dto.ControlPingReply;
-import org.junit.Test;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppStateBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.Version;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.VersionBuilder;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-public class VersionCustomizerTest extends ReaderCustomizerTest<Version, VersionBuilder> {
-
-    public VersionCustomizerTest() {
-        super(Version.class, VppStateBuilder.class);
-    }
-
-    @Override
-    protected ReaderCustomizer<Version, VersionBuilder> initCustomizer() {
-        return new VersionCustomizer(api);
-    }
-
-    @Test
-    public void testReadCurrentAttributes() throws Exception {
-        final ShowVersionReply reply = new ShowVersionReply();
-        reply.version = new byte[] {};
-        reply.program = new byte[] {};
-        reply.buildDate = new byte[] {};
-        reply.buildDirectory = new byte[] {};
-
-        when(api.showVersion(any(ShowVersion.class))).thenReturn(future(reply));
-        when(api.send(any(ControlPing.class))).thenReturn(future(new ControlPingReply()));
-        getCustomizer().readCurrentAttributes(InstanceIdentifier.create(Version.class), new VersionBuilder(), ctx);
-        verify(api).showVersion(any(ShowVersion.class));
-        verify(api).send(any(ControlPing.class));
-    }
-}
\ No newline at end of file
diff --git a/v3po/v3po2vpp/src/test/resources/v3po.json b/v3po/v3po2vpp/src/test/resources/v3po.json
deleted file mode 100644 (file)
index 9ea66ef..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "keepalive-delay": "30"
-}
index 3bfa030..2ae8b5e 100644 (file)
     <dhcp.version>1.17.04-SNAPSHOT</dhcp.version>
     <vpp.classifier.version>1.17.04-SNAPSHOT</vpp.classifier.version>
     <l3-impl.version>1.17.04-SNAPSHOT</l3-impl.version>
+    <vpp-management-impl.version>1.17.04-SNAPSHOT</vpp-management-impl.version>
 
     <distribution.modules>
       io.fd.hc2vpp.common.integration.VppCommonModule,
+      io.fd.hc2vpp.management.VppManagementModule,
       io.fd.hc2vpp.lisp.LispModule,
       io.fd.hc2vpp.v3po.V3poModule,
       io.fd.hc2vpp.l3.InterfaceL3Module,
       <artifactId>dhcp-impl</artifactId>
       <version>${dhcp.version}</version>
     </dependency>
+    <dependency>
+      <groupId>io.fd.hc2vpp.management</groupId>
+      <artifactId>vpp-management-impl</artifactId>
+      <version>${vpp-management-impl.version}</version>
+    </dependency>
   </dependencies>
 </project>
diff --git a/vpp-management/api/asciidoc/Readme.adoc b/vpp-management/api/asciidoc/Readme.adoc
new file mode 100644 (file)
index 0000000..221faa6
--- /dev/null
@@ -0,0 +1,9 @@
+= vpp-management-api
+
+Overview of vpp-management-api
+
+Provides model for two major features
+
+* Management attributes of underlaying vpp instance(version,pid,...)
+* RPC support for invoking CLI commands
+
diff --git a/vpp-management/api/pom.xml b/vpp-management/api/pom.xml
new file mode 100644 (file)
index 0000000..8168257
--- /dev/null
@@ -0,0 +1,32 @@
+<?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">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>io.fd.honeycomb.common</groupId>
+        <artifactId>api-parent</artifactId>
+        <version>1.17.04-SNAPSHOT</version>
+    </parent>
+
+    <groupId>io.fd.hc2vpp.management</groupId>
+    <artifactId>vpp-management-api</artifactId>
+    <version>1.17.04-SNAPSHOT</version>
+</project>
\ No newline at end of file
diff --git a/vpp-management/api/src/main/yang/vpp-management.yang b/vpp-management/api/src/main/yang/vpp-management.yang
new file mode 100644 (file)
index 0000000..2582cbe
--- /dev/null
@@ -0,0 +1,54 @@
+module vpp-management {
+  yang-version 1;
+  namespace "urn:opendaylight:params:xml:ns:yang:vpp:management";
+  prefix "vpp-m";
+
+  revision "2017-03-15" {
+    description
+        "This revision add support for
+           - Vpp state attributes read
+           - RPC cli support";
+  }
+
+  container vpp-state {
+      config false;
+
+      description
+        "VPP operational data";
+
+      container version {
+        leaf name {
+          type string;
+        }
+        leaf build-directory {
+          type string;
+        }
+        leaf build-date {
+          type string;
+        }
+        leaf branch {
+          type string;
+        }
+        leaf pid {
+          type uint32;
+          description
+            "PID of the vpp process";
+        }
+        description
+        "vlib version info";
+      }
+  }
+
+  rpc cli-inband {
+    input {
+      leaf cmd {
+        type string;
+      }
+    }
+    output {
+      leaf reply {
+        type string;
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/vpp-management/asciidoc/Readme.adoc b/vpp-management/asciidoc/Readme.adoc
new file mode 100644 (file)
index 0000000..8fa4da8
--- /dev/null
@@ -0,0 +1,3 @@
+= vpp-management-aggregator
+
+Overview of vpp-management-aggregator
\ No newline at end of file
diff --git a/vpp-management/impl/asciidoc/Readme.adoc b/vpp-management/impl/asciidoc/Readme.adoc
new file mode 100644 (file)
index 0000000..c53e5db
--- /dev/null
@@ -0,0 +1,15 @@
+= vpp-management-impl
+
+Overview of vpp-management-impl
+
+Provides following features
+
+* Read support for VPP management attributes
+* Implementation of RPC support of CLI commands
+* Initialization of Keep-alive service
+
+Exposes following configuration
+
+*vpp-management.json*
+
+* keepalive-delay - delay period for keep-alive manager
\ No newline at end of file
diff --git a/vpp-management/impl/pom.xml b/vpp-management/impl/pom.xml
new file mode 100644 (file)
index 0000000..da4d8ff
--- /dev/null
@@ -0,0 +1,95 @@
+<?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-SNAPSHOT</version>
+        <relativePath>../../vpp-common/vpp-impl-parent</relativePath>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>io.fd.hc2vpp.management</groupId>
+    <artifactId>vpp-management-impl</artifactId>
+    <version>1.17.04-SNAPSHOT</version>
+
+    <dependencies>
+        <!-- Api -->
+        <dependency>
+            <groupId>io.fd.hc2vpp.management</groupId>
+            <artifactId>vpp-management-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.fd.honeycomb</groupId>
+            <artifactId>translate-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.fd.honeycomb</groupId>
+            <artifactId>rpc-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <!-- DI -->
+        <dependency>
+            <groupId>com.google.inject</groupId>
+            <artifactId>guice</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.inject.extensions</groupId>
+            <artifactId>guice-multibindings</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>net.jmob</groupId>
+            <artifactId>guice.conf</artifactId>
+        </dependency>
+
+        <!-- Translate -->
+        <dependency>
+            <groupId>io.fd.hc2vpp.common</groupId>
+            <artifactId>vpp-translate-utils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.fd.honeycomb</groupId>
+            <artifactId>translate-impl</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <!-- Test -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.fd.hc2vpp.common</groupId>
+            <artifactId>vpp-translate-test</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.inject.extensions</groupId>
+            <artifactId>guice-testlib</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Cisco and/or its affiliates.
+ * 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.
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.cfgattrs;
+package io.fd.hc2vpp.management;
 
 import net.jmob.guice.conf.core.BindConfig;
 import net.jmob.guice.conf.core.InjectConfig;
 import net.jmob.guice.conf.core.Syntax;
 
-@BindConfig(value = "v3po", syntax = Syntax.JSON)
-public class V3poConfiguration {
+@BindConfig(value = "vpp-management", syntax = Syntax.JSON)
+public class VppManagementConfiguration {
 
     @InjectConfig("keepalive-delay")
-    private String keepaliveDelay;
+    private int keepaliveDelay;
 
     public int getKeepaliveDelay() {
-        return Integer.valueOf(this.keepaliveDelay);
+        return this.keepaliveDelay;
     }
 }
diff --git a/vpp-management/impl/src/main/java/io/fd/hc2vpp/management/VppManagementModule.java b/vpp-management/impl/src/main/java/io/fd/hc2vpp/management/VppManagementModule.java
new file mode 100644 (file)
index 0000000..508da64
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * 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.management;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.Multibinder;
+import io.fd.hc2vpp.management.rpc.CliInbandService;
+import io.fd.hc2vpp.management.state.StateReaderFactory;
+import io.fd.honeycomb.rpc.RpcService;
+import io.fd.honeycomb.translate.read.ReaderFactory;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import net.jmob.guice.conf.core.ConfigurationModule;
+
+public class VppManagementModule extends AbstractModule {
+
+    @Override
+    protected void configure() {
+        install(ConfigurationModule.create());
+        requestInjection(VppManagementConfiguration.class);
+
+        // Readers
+        final Multibinder<ReaderFactory> readerFactoryBinder = Multibinder.newSetBinder(binder(), ReaderFactory.class);
+        readerFactoryBinder.addBinding().to(StateReaderFactory.class);
+
+        // Executor needed for keepalives
+        bind(ScheduledExecutorService.class).toInstance(Executors.newScheduledThreadPool(1));
+
+        // RPCs
+        final Multibinder<RpcService> rpcsBinder = Multibinder.newSetBinder(binder(), RpcService.class);
+        rpcsBinder.addBinding().to(CliInbandService.class);
+    }
+}
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Cisco and/or its affiliates.
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.rpc;
+package io.fd.hc2vpp.management.rpc;
 
 import com.google.inject.Inject;
 import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer;
@@ -24,9 +24,9 @@ import io.fd.vpp.jvpp.core.future.FutureJVppCore;
 import java.nio.charset.StandardCharsets;
 import java.util.concurrent.CompletionStage;
 import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.CliInbandInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.CliInbandOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.CliInbandOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.CliInbandInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.CliInbandOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.CliInbandOutputBuilder;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
diff --git a/vpp-management/impl/src/main/java/io/fd/hc2vpp/management/state/StateReaderFactory.java b/vpp-management/impl/src/main/java/io/fd/hc2vpp/management/state/StateReaderFactory.java
new file mode 100644 (file)
index 0000000..541de30
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * 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.management.state;
+
+import com.google.inject.Inject;
+import io.fd.hc2vpp.common.translate.util.ReadTimeoutException;
+import io.fd.hc2vpp.common.translate.util.VppStatusListener;
+import io.fd.hc2vpp.management.VppManagementConfiguration;
+import io.fd.honeycomb.translate.impl.read.GenericReader;
+import io.fd.honeycomb.translate.read.ReaderFactory;
+import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder;
+import io.fd.honeycomb.translate.util.read.KeepaliveReaderWrapper;
+import io.fd.vpp.jvpp.core.future.FutureJVppCore;
+import java.util.concurrent.ScheduledExecutorService;
+import javax.annotation.Nonnull;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.VppState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.VppStateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.vpp.state.Version;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public class StateReaderFactory implements ReaderFactory {
+
+    @Inject
+    private FutureJVppCore vppApi;
+
+    @Inject
+    private ScheduledExecutorService keepaliveExecutor;
+
+    @Inject
+    private VppStatusListener vppStatusListener;
+
+    @Inject
+    private VppManagementConfiguration configuration;
+
+    @Override
+    public void init(@Nonnull final ModifiableReaderRegistryBuilder registry) {
+        // VppState(Structural)
+        final InstanceIdentifier<VppState> vppStateId = InstanceIdentifier.create(VppState.class);
+        registry.addStructuralReader(vppStateId, VppStateBuilder.class);
+        //  Version
+        // Wrap with keepalive reader to detect connection issues
+        // Relying on VersionCustomizer to provide a "timing out read"
+        registry.add(new KeepaliveReaderWrapper<>(
+                new GenericReader<>(vppStateId.child(Version.class), new VersionCustomizer(vppApi)),
+                keepaliveExecutor, ReadTimeoutException.class, configuration.getKeepaliveDelay(), vppStatusListener));
+    }
+}
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Cisco and/or its affiliates.
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.vppstate;
+package io.fd.hc2vpp.management.state;
 
 import com.google.common.primitives.UnsignedInts;
 import io.fd.honeycomb.translate.read.ReadContext;
@@ -31,9 +31,9 @@ import io.fd.vpp.jvpp.dto.ControlPingReply;
 import io.fd.vpp.jvpp.dto.JVppReply;
 import java.util.concurrent.CompletionStage;
 import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppStateBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.Version;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.vpp.state.VersionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.VppStateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.vpp.state.Version;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.vpp.state.VersionBuilder;
 import org.opendaylight.yangtools.concepts.Builder;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
diff --git a/vpp-management/impl/src/main/resources/honeycomb-minimal-resources/config/vpp-management.json b/vpp-management/impl/src/main/resources/honeycomb-minimal-resources/config/vpp-management.json
new file mode 100644 (file)
index 0000000..28b25b2
--- /dev/null
@@ -0,0 +1,3 @@
+{
+  "keepalive-delay":30
+}
\ No newline at end of file
diff --git a/vpp-management/impl/src/test/java/io/fd/hc2vpp/management/VppManagementModuleTest.java b/vpp-management/impl/src/test/java/io/fd/hc2vpp/management/VppManagementModuleTest.java
new file mode 100644 (file)
index 0000000..eb2c3a9
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * 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.management;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.testing.fieldbinder.Bind;
+import com.google.inject.testing.fieldbinder.BoundFieldModule;
+import io.fd.honeycomb.translate.impl.read.registry.CompositeReaderRegistryBuilder;
+import io.fd.honeycomb.translate.read.ReaderFactory;
+import io.fd.vpp.jvpp.core.future.FutureJVppCore;
+import java.util.HashSet;
+import java.util.Set;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+
+public class VppManagementModuleTest {
+
+    @Bind
+    @Mock
+    private FutureJVppCore futureJVppCore;
+
+    @Inject
+    private VppManagementConfiguration configuration;
+
+    @Inject
+    private Set<ReaderFactory> readerFactories = new HashSet<>();
+
+    @Before
+    public void setUp() {
+        initMocks(this);
+        Guice.createInjector(new VppManagementModule(), BoundFieldModule.of(this)).injectMembers(this);
+    }
+
+    @Test
+    public void testReaderFactories() throws Exception {
+        assertFalse(readerFactories.isEmpty());
+
+        // Test registration process (all dependencies present, topological order of readers does exist, etc.)
+        final CompositeReaderRegistryBuilder registryBuilder = new CompositeReaderRegistryBuilder();
+        readerFactories.stream().forEach(factory -> factory.init(registryBuilder));
+        assertNotNull(registryBuilder.build());
+    }
+
+    @Test
+    public void testConfiguration() {
+        assertEquals(30, configuration.getKeepaliveDelay());
+    }
+}
\ No newline at end of file
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Cisco and/or its affiliates.
+ * 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.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package io.fd.hc2vpp.v3po.rpc;
+package io.fd.hc2vpp.management.rpc;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
@@ -26,9 +26,9 @@ import io.fd.vpp.jvpp.core.dto.CliInbandReply;
 import io.fd.vpp.jvpp.core.future.FutureJVppCore;
 import org.junit.Test;
 import org.mockito.Mock;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.CliInbandInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.CliInbandInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.CliInbandOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.CliInbandInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.CliInbandInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.CliInbandOutput;
 
 public class CliInbandServiceTest implements FutureProducer {
 
diff --git a/vpp-management/impl/src/test/java/io/fd/hc2vpp/management/state/VppStateTest.java b/vpp-management/impl/src/test/java/io/fd/hc2vpp/management/state/VppStateTest.java
new file mode 100644 (file)
index 0000000..81db885
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * 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.management.state;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Multimap;
+import io.fd.hc2vpp.common.test.util.FutureProducer;
+import io.fd.honeycomb.translate.MappingContext;
+import io.fd.honeycomb.translate.ModificationCache;
+import io.fd.honeycomb.translate.impl.read.GenericReader;
+import io.fd.honeycomb.translate.impl.read.registry.CompositeReaderRegistryBuilder;
+import io.fd.honeycomb.translate.read.ReadContext;
+import io.fd.honeycomb.translate.read.registry.ReaderRegistry;
+import io.fd.vpp.jvpp.core.dto.ShowVersion;
+import io.fd.vpp.jvpp.core.dto.ShowVersionReply;
+import io.fd.vpp.jvpp.core.future.FutureJVppCore;
+import io.fd.vpp.jvpp.dto.ControlPing;
+import io.fd.vpp.jvpp.dto.ControlPingReply;
+import javax.annotation.Nonnull;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentMatchers;
+import org.mockito.Mock;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.VppState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.VppStateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.vpp.state.Version;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.management.rev170315.vpp.state.VersionBuilder;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public class VppStateTest implements FutureProducer {
+
+    @Mock
+    private FutureJVppCore api;
+    @Mock
+    private ReadContext ctx;
+    @Mock
+    private MappingContext mappingContext;
+
+    private ReaderRegistry readerRegistry;
+
+    /**
+     * Create root VppState reader with all its children wired.
+     */
+    private static ReaderRegistry getVppStateReader(@Nonnull final FutureJVppCore jVpp) {
+        final CompositeReaderRegistryBuilder registry = new CompositeReaderRegistryBuilder();
+
+        // VppState(Structural)
+        final InstanceIdentifier<VppState> vppStateId = InstanceIdentifier.create(VppState.class);
+        registry.addStructuralReader(vppStateId, VppStateBuilder.class);
+        //  Version
+        registry.add(new GenericReader<>(vppStateId.child(Version.class), new VersionCustomizer(jVpp)));
+        return registry.build();
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        initMocks(this);
+        final ModificationCache cache = new ModificationCache();
+        doReturn(cache).when(ctx).getModificationCache();
+        doReturn(mappingContext).when(ctx).getMappingContext();
+
+
+        readerRegistry = getVppStateReader(api);
+    }
+
+    private static Version getVersion() {
+        return new VersionBuilder()
+                .setName("test")
+                .setBuildDirectory("1")
+                .setBranch("2")
+                .setBuildDate("3")
+                .setPid(0L)
+                .build();
+    }
+
+    private void whenShowVersionThenReturn(final Version version) {
+        final ShowVersionReply reply = new ShowVersionReply();
+        reply.buildDate = version.getBuildDate().getBytes();
+        reply.program = version.getName().getBytes();
+        reply.version = version.getBranch().getBytes();
+        reply.buildDirectory = version.getBuildDirectory().getBytes();
+        when(api.showVersion(ArgumentMatchers.any(ShowVersion.class))).thenReturn(future(reply));
+        // Version Customizer uses ControlPing to obtain PID
+        when(api.send(ArgumentMatchers.any(ControlPing.class))).thenReturn(future(new ControlPingReply()));
+    }
+
+    @Test
+    public void testReadAll() throws Exception {
+        final Version version = getVersion();
+        whenShowVersionThenReturn(version);
+
+        final Multimap<InstanceIdentifier<? extends DataObject>, ? extends DataObject> dataObjects =
+                readerRegistry.readAll(ctx);
+        assertEquals(dataObjects.size(), 1);
+        final VppState dataObject =
+                (VppState) Iterables.getOnlyElement(dataObjects.get(Iterables.getOnlyElement(dataObjects.keySet())));
+        assertEquals(version, dataObject.getVersion());
+    }
+
+    @Test
+    public void testReadSpecific() throws Exception {
+        final Version version = getVersion();
+        whenShowVersionThenReturn(version);
+
+        final Optional<? extends DataObject> read = readerRegistry.read(InstanceIdentifier.create(VppState.class), ctx);
+        assertTrue(read.isPresent());
+        assertEquals(version, ((VppState) read.get()).getVersion());
+    }
+
+    @Test
+    public void testReadVersion() throws Exception {
+        whenShowVersionThenReturn(getVersion());
+        VppState readRoot = (VppState) readerRegistry.read(InstanceIdentifier.create(VppState.class), ctx).get();
+
+        Optional<? extends DataObject> read =
+                readerRegistry.read(InstanceIdentifier.create(VppState.class).child(Version.class), ctx);
+        assertTrue(read.isPresent());
+        assertEquals(readRoot.getVersion(), read.get());
+    }
+}
\ No newline at end of file
diff --git a/vpp-management/impl/src/test/resources/vpp-management.json b/vpp-management/impl/src/test/resources/vpp-management.json
new file mode 100644 (file)
index 0000000..28b25b2
--- /dev/null
@@ -0,0 +1,3 @@
+{
+  "keepalive-delay":30
+}
\ No newline at end of file
diff --git a/vpp-management/pom.xml b/vpp-management/pom.xml
new file mode 100644 (file)
index 0000000..a87af1d
--- /dev/null
@@ -0,0 +1,58 @@
+<?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.honeycomb.common</groupId>
+        <artifactId>honeycomb-parent</artifactId>
+        <version>1.17.04-SNAPSHOT</version>
+    </parent>
+
+    <packaging>pom</packaging>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>io.fd.hc2vpp.management</groupId>
+    <artifactId>vpp-management-aggregator</artifactId>
+    <version>1.17.04-SNAPSHOT</version>
+
+    <modules>
+        <module>api</module>
+        <module>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>
\ No newline at end of file
diff --git a/vpp-management/vpp_management_postman_collection.json b/vpp-management/vpp_management_postman_collection.json
new file mode 100644 (file)
index 0000000..591862d
--- /dev/null
@@ -0,0 +1,106 @@
+{
+       "id": "b638a073-6954-5c89-320a-7105437dae94",
+       "name": "Vpp management Collection",
+       "description": "",
+       "order": [
+               "1bfd69f7-e187-beb0-447c-0074aa636045"
+       ],
+       "folders": [
+               {
+                       "id": "299be85f-5ada-34f7-bd80-9fbc4e5b200a",
+                       "name": "RPCs",
+                       "description": "",
+                       "order": [
+                               "1c552a48-498c-f2e8-8dee-2d5b67120a3a",
+                               "2df7f806-dfb3-bf4f-9cab-0c9863ed4486",
+                               "d4f87db0-06e5-b309-8918-d1c29f59fab1"
+                       ],
+                       "owner": "658985"
+               }
+       ],
+       "timestamp": 1489148746054,
+       "owner": "658985",
+       "public": false,
+       "requests": [
+               {
+                       "id": "1bfd69f7-e187-beb0-447c-0074aa636045",
+                       "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n",
+                       "url": "http://localhost:8183/restconf/operational/vpp-management:vpp-state",
+                       "preRequestScript": "",
+                       "pathVariables": {},
+                       "method": "GET",
+                       "data": [],
+                       "dataMode": "raw",
+                       "version": 2,
+                       "tests": "",
+                       "currentHelper": "normal",
+                       "helperAttributes": {},
+                       "time": 1489149850732,
+                       "name": "Read vpp-state - oper",
+                       "description": "",
+                       "collectionId": "b638a073-6954-5c89-320a-7105437dae94",
+                       "responses": [],
+                       "rawModeData": "{\r\n    \r\n        \"interface\": [\r\n            {\r\n                \"name\": \"testInterface\",\r\n                \"description\": \"for testing purposes\",\r\n                \"type\": \"iana-if-type:ethernetCsmacd\",\r\n                \"enabled\": \"true\",\r\n                \"link-up-down-trap-enable\": \"enabled\",\r\n                \"ietf-ip:ipv4\": {\r\n                    \"enabled\": \"true\",\r\n                    \"mtu\": \"1500\",\r\n                    \"address\": [\r\n                        {\r\n                            \"ip\": \"1.2.3.0\",\r\n                            \"netmask\": \"255.255.255.0\"\r\n                        }\r\n                    ]\r\n                }\r\n            }\r\n        ]\r\n    \r\n}"
+               },
+               {
+                       "id": "1c552a48-498c-f2e8-8dee-2d5b67120a3a",
+                       "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n",
+                       "url": "http://localhost:8183/restconf/operations/vpp-management:cli-inband",
+                       "preRequestScript": "",
+                       "pathVariables": {},
+                       "method": "POST",
+                       "data": [],
+                       "dataMode": "raw",
+                       "version": 2,
+                       "tests": "",
+                       "currentHelper": "normal",
+                       "helperAttributes": {},
+                       "time": 1489149921151,
+                       "name": "show version",
+                       "description": "The cli-inband rpc provides support for CLI commands.\nHere is equivalent of show version.",
+                       "collectionId": "b638a073-6954-5c89-320a-7105437dae94",
+                       "responses": [],
+                       "rawModeData": "{\n  \"input\" :\n  {\n     \"cmd\" : \"show version\"\n  }\n}"
+               },
+               {
+                       "id": "2df7f806-dfb3-bf4f-9cab-0c9863ed4486",
+                       "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n",
+                       "url": "http://localhost:8183/restconf/operations/vpp-management:cli-inband",
+                       "preRequestScript": "",
+                       "pathVariables": {},
+                       "method": "POST",
+                       "data": [],
+                       "dataMode": "raw",
+                       "version": 2,
+                       "tests": "",
+                       "currentHelper": "normal",
+                       "helperAttributes": {},
+                       "time": 1489149929797,
+                       "name": "show interfaces",
+                       "description": "The cli-inband rpc provides support for CLI commands.\nHere is equivalent of show int.",
+                       "collectionId": "b638a073-6954-5c89-320a-7105437dae94",
+                       "responses": [],
+                       "rawModeData": "{\n  \"input\" :\n  {\n     \"cmd\" : \"show int\"\n  }\n}"
+               },
+               {
+                       "id": "d4f87db0-06e5-b309-8918-d1c29f59fab1",
+                       "headers": "Authorization: Basic YWRtaW46YWRtaW4=\nContent-Type: application/json\n",
+                       "url": "http://localhost:8183/restconf/operations/vpp-management:cli-inband",
+                       "preRequestScript": "",
+                       "pathVariables": {},
+                       "method": "POST",
+                       "data": [],
+                       "dataMode": "raw",
+                       "version": 2,
+                       "tests": "",
+                       "currentHelper": "normal",
+                       "helperAttributes": {},
+                       "time": 1489149940101,
+                       "name": "create loopback interface",
+                       "description": "The cli-inband rpc provides support for CLI commands.\nHere is equivalent of create loopback interface",
+                       "collectionId": "b638a073-6954-5c89-320a-7105437dae94",
+                       "responses": [],
+                       "rawModeData": "{\n  \"input\" :\n  {\n     \"cmd\" : \"create loopback interface\"\n  }\n}"
+               }
+       ]
+}
\ No newline at end of file