HONEYCOMB-21 Vpp-integration minimal distribution
authorMaros Marsalek <[email protected]>
Thu, 11 Aug 2016 13:37:28 +0000 (15:37 +0200)
committerMaros Marsalek <[email protected]>
Fri, 19 Aug 2016 10:49:56 +0000 (12:49 +0200)
Change-Id: I1a44028ae38c3ab70aa3a7b173cd0c81c820378a
Signed-off-by: Maros Marsalek <[email protected]>
36 files changed:
samples/minimal-distribution/pom.xml
v3po/pom.xml
v3po/v3po2vpp/pom.xml
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/InterfacesStateReaderFactory.java [new file with mode: 0644]
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/InterfacesWriterFactory.java [new file with mode: 0644]
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/SubinterfaceAugmentationWriterFactory.java [moved from v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/SubinterfaceAugmentationWriterFactory.java with 92% similarity]
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/SubinterfaceStateAugmentationReaderFactory.java [moved from v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/SubinterfaceStateAugmentationReaderFactory.java with 97% similarity]
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/V3poModule.java [new file with mode: 0644]
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppClassifierHoneycombWriterFactory.java [new file with mode: 0644]
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppClassifierReaderFactory.java [new file with mode: 0644]
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppHoneycombWriterFactory.java [new file with mode: 0644]
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppStateHoneycombReaderFactory.java [new file with mode: 0644]
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/cfgattrs/V3poConfiguration.java [new file with mode: 0644]
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/initializers/InterfacesInitializer.java
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/initializers/VppClasifierInitializer.java
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/initializers/VppInitializer.java
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/notification/InterfaceChangeNotificationProducer.java
v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/InterfacesHoneycombWriterModule.java
v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/InterfacesStateHoneycombReaderModule.java
v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/VppClassifierHoneycombWriterModule.java
v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/VppClassifierStateHoneycombReaderModule.java
v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/VppHoneycombWriterModule.java
v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/VppStateHoneycombReaderModule.java
v3po/v3po2vpp/src/main/resources/honeycomb-minimal-resources/config/v3po.json [new file with mode: 0644]
vpp-common/minimal-distribution/pom.xml [new file with mode: 0644]
vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/ContextsReaderFactoryProvider.groovy [new file with mode: 0644]
vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppProvider.groovy [new file with mode: 0644]
vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/Main.java [new file with mode: 0644]
vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.groovy [new file with mode: 0644]
vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppConfigAttributes.groovy [new file with mode: 0644]
vpp-common/minimal-distribution/src/main/resources/honeycomb-minimal-resources/config/jvpp.json [new file with mode: 0644]
vpp-common/naming-context-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/context/impl/rev141210/ContextReaderModule.java
vpp-common/pom.xml
vpp-integration/minimal-distribution/pom.xml [new file with mode: 0644]
vpp-integration/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/integration/distro/Main.java [new file with mode: 0644]
vpp-integration/pom.xml

index c8311ae..900d66a 100644 (file)
@@ -19,7 +19,7 @@
     <groupId>io.fd.honeycomb.common</groupId>
     <artifactId>minimal-distribution-parent</artifactId>
     <version>1.0.0-SNAPSHOT</version>
-    <relativePath>../../common/minimal-distro-parent</relativePath>
+    <relativePath>../../common/minimal-distribution-parent</relativePath>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
index f7cb1c2..16bc390 100644 (file)
@@ -34,7 +34,8 @@
   <modules>
     <module>api</module>
     <module>v3po2vpp</module>
-    <module>features</module>
+    <!--Will be deleted-->
+    <!--<module>features</module>-->
   </modules>
   <!-- DO NOT install or deploy the repo root pom as it's only needed to initiate a build -->
   <build>
index 7bd4126..4848ae9 100644 (file)
             <version>16.09-SNAPSHOT</version>
         </dependency>
 
+        <!-- DI -->
+        <dependency>
+            <groupId>com.google.inject</groupId>
+            <artifactId>guice</artifactId>
+            <version>${guice.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>net.jmob</groupId>
+            <artifactId>guice.conf</artifactId>
+            <version>${guice.config.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.inject.extensions</groupId>
+            <artifactId>guice-multibindings</artifactId>
+            <version>${guice.version}</version>
+        </dependency>
+
         <!-- Testing Dependencies -->
         <dependency>
             <groupId>junit</groupId>
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/InterfacesStateReaderFactory.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/InterfacesStateReaderFactory.java
new file mode 100644 (file)
index 0000000..3aa68f6
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.translate.v3po;
+
+import com.google.common.collect.Sets;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.translate.impl.read.GenericListReader;
+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.v3po.interfacesstate.AclCustomizer;
+import io.fd.honeycomb.translate.v3po.interfacesstate.EthernetCustomizer;
+import io.fd.honeycomb.translate.v3po.interfacesstate.GreCustomizer;
+import io.fd.honeycomb.translate.v3po.interfacesstate.InterfaceCustomizer;
+import io.fd.honeycomb.translate.v3po.interfacesstate.L2Customizer;
+import io.fd.honeycomb.translate.v3po.interfacesstate.ProxyArpCustomizer;
+import io.fd.honeycomb.translate.v3po.interfacesstate.TapCustomizer;
+import io.fd.honeycomb.translate.v3po.interfacesstate.VhostUserCustomizer;
+import io.fd.honeycomb.translate.v3po.interfacesstate.VxlanCustomizer;
+import io.fd.honeycomb.translate.v3po.interfacesstate.VxlanGpeCustomizer;
+import io.fd.honeycomb.translate.v3po.interfacesstate.ip.Ipv4AddressCustomizer;
+import io.fd.honeycomb.translate.v3po.interfacesstate.ip.Ipv4Customizer;
+import io.fd.honeycomb.translate.v3po.interfacesstate.ip.Ipv4NeighbourCustomizer;
+import io.fd.honeycomb.translate.v3po.interfacesstate.ip.Ipv6Customizer;
+import io.fd.honeycomb.translate.v3po.util.NamingContext;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesStateBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.Interface2;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.Interface2Builder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.Ipv4;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.Ipv6;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.ipv4.Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.ipv4.Neighbor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.acl.base.attributes.Ip4Acl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.acl.base.attributes.Ip6Acl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.acl.base.attributes.L2Acl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Acl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Ethernet;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Gre;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.L2;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.ProxyArp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Tap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VhostUser;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Vxlan;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VxlanGpe;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.openvpp.jvpp.future.FutureJVpp;
+
+public final class InterfacesStateReaderFactory implements ReaderFactory, AutoCloseable {
+
+    private NamingContext ifcCtx;
+    private NamingContext bdCtx;
+    private NamingContext classifyCtx;
+    private FutureJVpp jvpp;
+
+    static final InstanceIdentifier<InterfacesState> IFC_STATE_ID =
+            InstanceIdentifier.create(InterfacesState.class);
+    static final InstanceIdentifier<Interface> IFC_ID = IFC_STATE_ID.child(Interface.class);
+
+    @Inject
+    public InterfacesStateReaderFactory(final FutureJVpp jvpp,
+                                        @Named("interface-context") final NamingContext ifcCtx,
+                                        @Named("bridge-domain-context") final NamingContext bdCtx,
+                                        @Named("classify-table-context") final NamingContext classifyCtx) {
+        this.jvpp = jvpp;
+        this.ifcCtx = ifcCtx;
+        this.bdCtx = bdCtx;
+        this.classifyCtx = classifyCtx;
+    }
+
+    @Override
+    public void init(final ModifiableReaderRegistryBuilder registry) {
+        // InterfacesState(Structural)
+        registry.addStructuralReader(IFC_STATE_ID, InterfacesStateBuilder.class);
+        //  Interface
+        registry.add(new GenericListReader<>(IFC_ID, new InterfaceCustomizer(jvpp, ifcCtx)));
+
+        // v3po.yang
+        initVppIfcAugmentationReaders(registry, IFC_ID);
+        // ietf-ip.yang
+        initInterface2AugmentationReaders(registry, IFC_ID);
+        // vpp-vlan.yang
+        new SubinterfaceStateAugmentationReaderFactory(jvpp, ifcCtx, bdCtx, classifyCtx).init(registry);
+    }
+
+    private void initInterface2AugmentationReaders(final ModifiableReaderRegistryBuilder registry,
+                                                   final InstanceIdentifier<Interface> ifcId) {
+        //   Interface2Augmentation(Structural)
+        final InstanceIdentifier<Interface2> ifc2AugId = ifcId.augmentation(Interface2.class);
+        registry.addStructuralReader(ifc2AugId, Interface2Builder.class);
+        //    Ipv4
+        // TODO unfinished customizer
+        final InstanceIdentifier<Ipv4> ipv4Id = ifc2AugId.child(Ipv4.class);
+        registry.add(new GenericReader<>(ipv4Id, new Ipv4Customizer(jvpp)));
+        //     Address
+        final InstanceIdentifier<Address> ipv4AddrId = ipv4Id.child(Address.class);
+        registry.add(new GenericListReader<>(ipv4AddrId, new Ipv4AddressCustomizer(jvpp, ifcCtx)));
+        //     Neighbor
+        final InstanceIdentifier<Neighbor> neighborId = ipv4Id.child(Neighbor.class);
+        registry.add(new GenericListReader<>(neighborId, new Ipv4NeighbourCustomizer(jvpp)));
+        //    Ipv6
+        // TODO unfinished customizer
+        final InstanceIdentifier<Ipv6> ipv6Id = ifc2AugId.child(Ipv6.class);
+        registry.add(new GenericReader<>(ipv6Id, new Ipv6Customizer(jvpp, ifcCtx)));
+    }
+
+    private void initVppIfcAugmentationReaders(final ModifiableReaderRegistryBuilder registry,
+                                               final InstanceIdentifier<Interface> ifcId) {
+        //   VppInterfaceStateAugmentation
+        final InstanceIdentifier<VppInterfaceStateAugmentation> vppIfcAugId = ifcId.augmentation(VppInterfaceStateAugmentation.class);
+        registry.addStructuralReader(vppIfcAugId, VppInterfaceStateAugmentationBuilder.class);
+        //    Ethernet
+        registry.add(new GenericReader<>(vppIfcAugId.child(Ethernet.class), new EthernetCustomizer(jvpp, ifcCtx)));
+        //    Tap
+        registry.add(new GenericReader<>(vppIfcAugId.child(Tap.class), new TapCustomizer(jvpp, ifcCtx)));
+        //    VhostUser
+        registry.add(new GenericReader<>(vppIfcAugId.child(VhostUser.class), new VhostUserCustomizer(jvpp, ifcCtx)));
+        //    Vxlan
+        registry.add(new GenericReader<>(vppIfcAugId.child(Vxlan.class), new VxlanCustomizer(jvpp, ifcCtx)));
+        //    VxlanGpe
+        registry.add(new GenericReader<>(vppIfcAugId.child(VxlanGpe.class), new VxlanGpeCustomizer(jvpp, ifcCtx)));
+        //    Gre
+        registry.add(new GenericReader<>(vppIfcAugId.child(Gre.class), new GreCustomizer(jvpp, ifcCtx)));
+        //    L2
+        registry.add(new GenericReader<>(vppIfcAugId.child(L2.class), new L2Customizer(jvpp, ifcCtx, bdCtx)));
+        //    Acl(Subtree)
+        final InstanceIdentifier<Acl> aclIdRelative = InstanceIdentifier.create(Acl.class);
+        registry.subtreeAdd(
+                Sets.newHashSet(aclIdRelative.child(L2Acl.class), aclIdRelative.child(Ip4Acl.class), aclIdRelative.child(Ip6Acl.class)),
+                new GenericReader<>(vppIfcAugId.child(Acl.class), new AclCustomizer(jvpp, ifcCtx, classifyCtx)));
+        //   Proxy ARP
+        registry.add(new GenericReader<>(vppIfcAugId.child(ProxyArp.class), new ProxyArpCustomizer(jvpp,
+                ifcCtx)));
+    }
+}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/InterfacesWriterFactory.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/InterfacesWriterFactory.java
new file mode 100644 (file)
index 0000000..ce2f621
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.translate.v3po;
+
+import static io.fd.honeycomb.translate.v3po.VppClassifierHoneycombWriterFactory.CLASSIFY_SESSION_ID;
+import static io.fd.honeycomb.translate.v3po.VppClassifierHoneycombWriterFactory.CLASSIFY_TABLE_ID;
+
+import com.google.common.collect.Sets;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.translate.impl.write.GenericListWriter;
+import io.fd.honeycomb.translate.impl.write.GenericWriter;
+import io.fd.honeycomb.translate.v3po.interfaces.AclCustomizer;
+import io.fd.honeycomb.translate.v3po.interfaces.EthernetCustomizer;
+import io.fd.honeycomb.translate.v3po.interfaces.GreCustomizer;
+import io.fd.honeycomb.translate.v3po.interfaces.InterfaceCustomizer;
+import io.fd.honeycomb.translate.v3po.interfaces.L2Customizer;
+import io.fd.honeycomb.translate.v3po.interfaces.ProxyArpCustomizer;
+import io.fd.honeycomb.translate.v3po.interfaces.RoutingCustomizer;
+import io.fd.honeycomb.translate.v3po.interfaces.TapCustomizer;
+import io.fd.honeycomb.translate.v3po.interfaces.VhostUserCustomizer;
+import io.fd.honeycomb.translate.v3po.interfaces.VxlanCustomizer;
+import io.fd.honeycomb.translate.v3po.interfaces.VxlanGpeCustomizer;
+import io.fd.honeycomb.translate.v3po.interfaces.ip.Ipv4AddressCustomizer;
+import io.fd.honeycomb.translate.v3po.interfaces.ip.Ipv4Customizer;
+import io.fd.honeycomb.translate.v3po.interfaces.ip.Ipv4NeighbourCustomizer;
+import io.fd.honeycomb.translate.v3po.interfaces.ip.Ipv6Customizer;
+import io.fd.honeycomb.translate.v3po.util.NamingContext;
+import io.fd.honeycomb.translate.write.WriterFactory;
+import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder;
+import java.util.Set;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
+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.ip.rev140616.Interface1;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.Ipv4;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.Ipv6;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.Neighbor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.acl.base.attributes.Ip4Acl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.acl.base.attributes.Ip6Acl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.acl.base.attributes.L2Acl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.Acl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.Ethernet;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.Gre;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.L2;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.ProxyArp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.Routing;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.Tap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VhostUser;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.Vxlan;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VxlanGpe;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.openvpp.jvpp.future.FutureJVpp;
+
+public final class InterfacesWriterFactory implements WriterFactory, AutoCloseable {
+
+    public static final InstanceIdentifier<Interface> IFC_ID =
+        InstanceIdentifier.create(Interfaces.class).child(Interface.class);
+    public static final InstanceIdentifier<VppInterfaceAugmentation> VPP_IFC_AUG_ID =
+        IFC_ID.augmentation(VppInterfaceAugmentation.class);
+    public static final InstanceIdentifier<Acl> ACL_ID = VPP_IFC_AUG_ID.child(Acl.class);
+    public static final InstanceIdentifier<L2> L2_ID = VPP_IFC_AUG_ID.child(L2.class);
+
+    private final FutureJVpp jvpp;
+    private final NamingContext bdContext;
+    private final NamingContext ifcContext;
+    private final NamingContext classifyTableContext;
+
+    @Inject
+    public InterfacesWriterFactory(final FutureJVpp vppJvppIfcDependency,
+                                   @Named("bridge-domain-context") final NamingContext bridgeDomainContextDependency,
+                                   @Named("interface-context") final NamingContext interfaceContextDependency,
+                                   @Named("classify-table-context") final NamingContext classifyTableContextDependency) {
+        this.jvpp = vppJvppIfcDependency;
+        this.bdContext = bridgeDomainContextDependency;
+        this.ifcContext = interfaceContextDependency;
+        this.classifyTableContext = classifyTableContextDependency;
+    }
+
+    @Override
+    public void init(final ModifiableWriterRegistryBuilder registry) {
+        // Interfaces
+        //  Interface =
+        registry.add(new GenericListWriter<>(IFC_ID, new InterfaceCustomizer(jvpp, ifcContext)));
+        //   VppInterfaceAugmentation
+        addVppInterfaceAgmentationWriters(IFC_ID, registry);
+        //   Interface1 (ietf-ip augmentation)
+        addInterface1AugmentationWriters(IFC_ID, registry);
+        //   SubinterfaceAugmentation TODO make dedicated module for subIfc writer factory
+        new SubinterfaceAugmentationWriterFactory(jvpp, ifcContext, bdContext, classifyTableContext).init(registry);
+    }
+
+    private void addInterface1AugmentationWriters(final InstanceIdentifier<Interface> ifcId,
+                                                  final ModifiableWriterRegistryBuilder registry) {
+        final InstanceIdentifier<Interface1> ifc1AugId = ifcId.augmentation(Interface1.class);
+        // Ipv6(after interface) TODO unfinished customizer =
+        registry.addAfter(new GenericWriter<>(ifc1AugId.child(Ipv6.class), new Ipv6Customizer(jvpp)),
+                ifcId);
+        // Ipv4(after interface)
+        final InstanceIdentifier<Ipv4> ipv4Id = ifc1AugId.child(Ipv4.class);
+        registry.addAfter(new GenericWriter<>(ipv4Id, new Ipv4Customizer(jvpp, ifcContext)),
+                ifcId);
+        //  Address(after Ipv4) =
+        final InstanceIdentifier<Address> ipv4AddressId = ipv4Id.child(Address.class);
+        registry.addAfter(new GenericListWriter<>(ipv4AddressId, new Ipv4AddressCustomizer(jvpp, ifcContext)),
+                ipv4Id);
+        //  Neighbor(after ipv4Address)
+        registry.addAfter(new GenericListWriter<>(ipv4Id.child(Neighbor.class), new Ipv4NeighbourCustomizer(jvpp, ifcContext)),
+                ipv4AddressId);
+    }
+
+    private void addVppInterfaceAgmentationWriters(final InstanceIdentifier<Interface> ifcId,
+                                                   final ModifiableWriterRegistryBuilder registry) {
+        // VhostUser(Needs to be executed before Interface customizer) =
+        final InstanceIdentifier<VhostUser> vhostId = VPP_IFC_AUG_ID.child(VhostUser.class);
+        registry.addBefore(new GenericWriter<>(vhostId, new VhostUserCustomizer(jvpp, ifcContext)),
+                ifcId);
+        // Vxlan(Needs to be executed before Interface customizer) =
+        final InstanceIdentifier<Vxlan> vxlanId = VPP_IFC_AUG_ID.child(Vxlan.class);
+        registry.addBefore(new GenericWriter<>(vxlanId, new VxlanCustomizer(jvpp, ifcContext)),
+                ifcId);
+        // VxlanGpe(Needs to be executed before Interface customizer) =
+        final InstanceIdentifier<VxlanGpe> vxlanGpeId = VPP_IFC_AUG_ID.child(VxlanGpe.class);
+        registry.addBefore(new GenericWriter<>(vxlanGpeId, new VxlanGpeCustomizer(jvpp, ifcContext)),
+                ifcId);
+        // Tap(Needs to be executed before Interface customizer) =
+        final InstanceIdentifier<Tap> tapId = VPP_IFC_AUG_ID.child(Tap.class);
+        registry.addBefore(new GenericWriter<>(tapId, new TapCustomizer(jvpp, ifcContext)),
+                ifcId);
+
+        // Gre(Needs to be executed before Interface customizer) =
+        final InstanceIdentifier<Gre> greId = VPP_IFC_AUG_ID.child(Gre.class);
+        registry.addBefore(new GenericWriter<>(greId, new GreCustomizer(jvpp, ifcContext)),
+                ifcId);
+
+
+        final Set<InstanceIdentifier<?>> specificIfcTypes = Sets.newHashSet(vhostId, vxlanGpeId, vxlanGpeId, tapId);
+
+        // Ethernet(No dependency, customizer not finished TODO) =
+        registry.add(new GenericWriter<>(VPP_IFC_AUG_ID.child(Ethernet.class), new EthernetCustomizer(jvpp)));
+        // Routing(Execute only after specific interface customizers) =
+        registry.addAfter(
+                new GenericWriter<>(VPP_IFC_AUG_ID.child(Routing.class), new RoutingCustomizer(jvpp, ifcContext)),
+                specificIfcTypes);
+        // Routing(Execute only after specific interface customizers) =
+        registry.addAfter(new GenericWriter<>(L2_ID, new L2Customizer(jvpp, ifcContext, bdContext)),
+                specificIfcTypes);
+        // Proxy Arp (execute after specific interface customizers)
+        registry.addAfter(
+                new GenericWriter<>(VPP_IFC_AUG_ID.child(ProxyArp.class), new ProxyArpCustomizer(jvpp, ifcContext)),
+                specificIfcTypes);
+        // ACL (execute after classify table and session writers)
+        // also handles L2Acl, Ip4Acl and Ip6Acl:
+        final InstanceIdentifier<Acl> aclId = InstanceIdentifier.create(Acl.class);
+        registry
+                .subtreeAddAfter(
+                        Sets.newHashSet(aclId.child(L2Acl.class), aclId.child(Ip4Acl.class), aclId.child(Ip6Acl.class)),
+                        new GenericWriter<>(ACL_ID, new AclCustomizer(jvpp, ifcContext, classifyTableContext)),
+                        Sets.newHashSet(CLASSIFY_TABLE_ID, CLASSIFY_SESSION_ID));
+    }
+
+
+}
  * limitations under the License.
  */
 
-package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406;
+package io.fd.honeycomb.translate.v3po;
 
-import static org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406.VppClassifierHoneycombWriterModule.CLASSIFY_SESSION_ID;
-import static org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406.VppClassifierHoneycombWriterModule.CLASSIFY_TABLE_ID;
+import static io.fd.honeycomb.translate.v3po.VppClassifierHoneycombWriterFactory.CLASSIFY_SESSION_ID;
+import static io.fd.honeycomb.translate.v3po.VppClassifierHoneycombWriterFactory.CLASSIFY_TABLE_ID;
 
 import com.google.common.collect.Sets;
 import io.fd.honeycomb.translate.impl.write.GenericListWriter;
@@ -28,8 +28,8 @@ import io.fd.honeycomb.translate.v3po.interfaces.SubInterfaceCustomizer;
 import io.fd.honeycomb.translate.v3po.interfaces.SubInterfaceL2Customizer;
 import io.fd.honeycomb.translate.v3po.interfaces.ip.SubInterfaceIpv4AddressCustomizer;
 import io.fd.honeycomb.translate.v3po.util.NamingContext;
-import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder;
 import io.fd.honeycomb.translate.write.WriterFactory;
+import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder;
 import org.opendaylight.yang.gen.v1.urn.ieee.params.xml.ns.yang.dot1q.types.rev150626.dot1q.tag.or.any.Dot1qTag;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.acl.base.attributes.Ip4Acl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.acl.base.attributes.Ip6Acl;
@@ -50,7 +50,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.openvpp.jvpp.future.FutureJVpp;
 
-final class SubinterfaceAugmentationWriterFactory implements WriterFactory {
+public final class SubinterfaceAugmentationWriterFactory implements WriterFactory {
 
     private final FutureJVpp jvpp;
     private final NamingContext ifcContext;
@@ -58,7 +58,7 @@ final class SubinterfaceAugmentationWriterFactory implements WriterFactory {
     private final NamingContext classifyTableContext;
 
     public static final InstanceIdentifier<SubinterfaceAugmentation> SUB_IFC_AUG_ID =
-            InterfacesHoneycombWriterModule.IFC_ID.augmentation(SubinterfaceAugmentation.class);
+            InterfacesWriterFactory.IFC_ID.augmentation(SubinterfaceAugmentation.class);
     public static final InstanceIdentifier<SubInterface> SUB_IFC_ID =
             SUB_IFC_AUG_ID.child(SubInterfaces.class).child(SubInterface.class);
     public static final InstanceIdentifier<L2> L2_ID = SUB_IFC_ID.child(
@@ -87,7 +87,7 @@ final class SubinterfaceAugmentationWriterFactory implements WriterFactory {
                         InstanceIdentifier.create(SubInterface.class).child(Match.class),
                         InstanceIdentifier.create(SubInterface.class).child(Match.class).child(VlanTagged.class)),
                 new GenericListWriter<>(SUB_IFC_ID, new SubInterfaceCustomizer(jvpp, ifcContext)),
-                InterfacesHoneycombWriterModule.IFC_ID);
+                InterfacesWriterFactory.IFC_ID);
         //   L2 =
         registry.addAfter(new GenericWriter<>(L2_ID, new SubInterfaceL2Customizer(jvpp, ifcContext, bdContext)),
                 SUB_IFC_ID);
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406;
+package io.fd.honeycomb.translate.v3po;
 
 import com.google.common.collect.Sets;
 import io.fd.honeycomb.translate.impl.read.GenericListReader;
@@ -69,7 +69,7 @@ final class SubinterfaceStateAugmentationReaderFactory implements ReaderFactory
     public void init(final ModifiableReaderRegistryBuilder registry) {
         // SubinterfaceStateAugmentation(Structural)
         final InstanceIdentifier<SubinterfaceStateAugmentation> subIfcAugId =
-                InterfacesStateHoneycombReaderModule.IFC_ID.augmentation(SubinterfaceStateAugmentation.class);
+                InterfacesStateReaderFactory.IFC_ID.augmentation(SubinterfaceStateAugmentation.class);
         registry.addStructuralReader(subIfcAugId, SubinterfaceStateAugmentationBuilder.class);
         //  SubInterfaces(Structural)
         final InstanceIdentifier<SubInterfaces> subIfcsId = subIfcAugId.child(SubInterfaces.class);
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/V3poModule.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/V3poModule.java
new file mode 100644 (file)
index 0000000..aafd015
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.translate.v3po;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.Multibinder;
+import com.google.inject.name.Names;
+import io.fd.honeycomb.data.init.DataTreeInitializer;
+import io.fd.honeycomb.notification.ManagedNotificationProducer;
+import io.fd.honeycomb.translate.read.ReaderFactory;
+import io.fd.honeycomb.translate.v3po.cfgattrs.V3poConfiguration;
+import io.fd.honeycomb.translate.v3po.initializers.InterfacesInitializer;
+import io.fd.honeycomb.translate.v3po.initializers.VppClasifierInitializer;
+import io.fd.honeycomb.translate.v3po.initializers.VppInitializer;
+import io.fd.honeycomb.translate.v3po.notification.InterfaceChangeNotificationProducer;
+import io.fd.honeycomb.translate.v3po.util.NamingContext;
+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.opendaylight.controller.config.threadpool.ScheduledThreadPool;
+
+public class V3poModule extends AbstractModule {
+
+    @Override
+    protected void configure() {
+        install(ConfigurationModule.create());
+        requestInjection(V3poConfiguration.class);
+
+        // Naming contexts
+        bind(NamingContext.class)
+                .annotatedWith(Names.named("interface-context"))
+                .toInstance(new NamingContext("interface-", "interface-context"));
+        bind(NamingContext.class)
+                .annotatedWith(Names.named("bridge-domain-context"))
+                .toInstance(new NamingContext("bridge-domain-", "bridge-domain-context"));
+        bind(NamingContext.class)
+                .annotatedWith(Names.named("classify-table-context"))
+                .toInstance(new NamingContext("classify-table-", "classify-table-context"));
+
+        // Executor needed for keepalives
+        // TODO-minimal remove the funny wrapper. it is only here because of config subsystem
+        final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
+        bind(ScheduledThreadPool.class).toInstance(new ScheduledThreadPool() {
+            @Override
+            public ScheduledExecutorService getExecutor() {
+                return executor;
+            }
+
+            @Override
+            public int getMaxThreadCount() {
+                return 1;
+            }
+        });
+
+        // Readers
+        final Multibinder<ReaderFactory> readerFactoryBinder = Multibinder.newSetBinder(binder(), ReaderFactory.class);
+        readerFactoryBinder.addBinding().to(InterfacesStateReaderFactory.class);
+        readerFactoryBinder.addBinding().to(VppStateHoneycombReaderFactory.class);
+        readerFactoryBinder.addBinding().to(VppClassifierReaderFactory.class);
+
+        // Writers
+        final Multibinder<WriterFactory> writerFactoryBinder = Multibinder.newSetBinder(binder(), WriterFactory.class);
+        writerFactoryBinder.addBinding().to(InterfacesWriterFactory.class);
+        writerFactoryBinder.addBinding().to(VppHoneycombWriterFactory.class);
+        writerFactoryBinder.addBinding().to(VppClassifierHoneycombWriterFactory.class);
+
+        // Initializers
+        final Multibinder<DataTreeInitializer> initializerBinder =
+                Multibinder.newSetBinder(binder(), DataTreeInitializer.class);
+        initializerBinder.addBinding().to(InterfacesInitializer.class);
+        initializerBinder.addBinding().to(VppClasifierInitializer.class);
+        initializerBinder.addBinding().to(VppInitializer.class);
+
+        // Notifications
+        final Multibinder<ManagedNotificationProducer> notifiersBinder =
+                Multibinder.newSetBinder(binder(), ManagedNotificationProducer.class);
+        notifiersBinder.addBinding().to(InterfaceChangeNotificationProducer.class);
+    }
+}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppClassifierHoneycombWriterFactory.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppClassifierHoneycombWriterFactory.java
new file mode 100644 (file)
index 0000000..7c63076
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.translate.v3po;
+
+import static io.fd.honeycomb.translate.v3po.InterfacesWriterFactory.ACL_ID;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.translate.impl.write.GenericListWriter;
+import io.fd.honeycomb.translate.v3po.util.NamingContext;
+import io.fd.honeycomb.translate.v3po.vppclassifier.ClassifySessionWriter;
+import io.fd.honeycomb.translate.v3po.vppclassifier.ClassifyTableWriter;
+import io.fd.honeycomb.translate.write.WriterFactory;
+import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder;
+import javax.annotation.Nonnull;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.VppClassifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.classify.table.base.attributes.ClassifySession;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.vpp.classifier.ClassifyTable;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.openvpp.jvpp.future.FutureJVpp;
+
+public final class VppClassifierHoneycombWriterFactory implements WriterFactory, AutoCloseable {
+
+    public static final InstanceIdentifier<ClassifyTable> CLASSIFY_TABLE_ID =
+        InstanceIdentifier.create(VppClassifier.class).child(ClassifyTable.class);
+    public static final InstanceIdentifier<ClassifySession> CLASSIFY_SESSION_ID =
+        CLASSIFY_TABLE_ID.child(ClassifySession.class);
+
+    private final FutureJVpp jvpp;
+    private final NamingContext classifyTableContext;
+
+    @Inject
+    public VppClassifierHoneycombWriterFactory(@Nonnull final FutureJVpp jvpp,
+                                               @Named("classify-table-context") @Nonnull final NamingContext classifyTableContext) {
+        this.jvpp = jvpp;
+        this.classifyTableContext = classifyTableContext;
+    }
+
+    @Override
+    public void init(@Nonnull final ModifiableWriterRegistryBuilder registry) {
+        // Ordering here is: First create table, then create sessions and then assign as ACL
+        // ClassifyTable
+        registry.addBefore(
+                new GenericListWriter<>(CLASSIFY_TABLE_ID, new ClassifyTableWriter(jvpp, classifyTableContext)),
+                CLASSIFY_SESSION_ID);
+        //  ClassifyTableSession
+        registry.addBefore(
+                new GenericListWriter<>(
+                        CLASSIFY_SESSION_ID, new ClassifySessionWriter(jvpp, classifyTableContext)),
+                ACL_ID);
+    }
+}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppClassifierReaderFactory.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppClassifierReaderFactory.java
new file mode 100644 (file)
index 0000000..4cb99c5
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.translate.v3po;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.translate.impl.read.GenericListReader;
+import io.fd.honeycomb.translate.read.ReaderFactory;
+import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder;
+import io.fd.honeycomb.translate.v3po.util.NamingContext;
+import io.fd.honeycomb.translate.v3po.vppclassifier.ClassifySessionReader;
+import io.fd.honeycomb.translate.v3po.vppclassifier.ClassifyTableReader;
+import javax.annotation.Nonnull;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.VppClassifierState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.VppClassifierStateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.classify.table.base.attributes.ClassifySession;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.vpp.classifier.state.ClassifyTable;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.openvpp.jvpp.future.FutureJVpp;
+
+public final class VppClassifierReaderFactory implements ReaderFactory, AutoCloseable {
+
+    private final FutureJVpp jvpp;
+    private final NamingContext classifyCtx;
+
+    @Inject
+    public VppClassifierReaderFactory(final FutureJVpp jvpp,
+                                      @Named("classify-table-context") final NamingContext classifyCtx) {
+        this.jvpp = jvpp;
+        this.classifyCtx = classifyCtx;
+    }
+
+    @Override
+    public void init(@Nonnull final ModifiableReaderRegistryBuilder registry) {
+        // VppClassifierState
+        final InstanceIdentifier<VppClassifierState> vppStateId = InstanceIdentifier.create(VppClassifierState.class);
+        registry.addStructuralReader(vppStateId, VppClassifierStateBuilder.class);
+        //  ClassifyTable
+        final InstanceIdentifier<ClassifyTable> classTblId = vppStateId.child(ClassifyTable.class);
+        registry.add(new GenericListReader<>(classTblId, new ClassifyTableReader(jvpp, classifyCtx)));
+        //   ClassifySession
+        final InstanceIdentifier<ClassifySession> classSesId = classTblId.child(ClassifySession.class);
+        registry.add(new GenericListReader<>(classSesId, new ClassifySessionReader(jvpp, classifyCtx)));
+    }
+}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppHoneycombWriterFactory.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppHoneycombWriterFactory.java
new file mode 100644 (file)
index 0000000..204f9f8
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.translate.v3po;
+
+import static io.fd.honeycomb.translate.v3po.InterfacesWriterFactory.L2_ID;
+
+import com.google.common.collect.Sets;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.translate.impl.write.GenericListWriter;
+import io.fd.honeycomb.translate.v3po.util.NamingContext;
+import io.fd.honeycomb.translate.v3po.vpp.ArpTerminationTableEntryCustomizer;
+import io.fd.honeycomb.translate.v3po.vpp.BridgeDomainCustomizer;
+import io.fd.honeycomb.translate.v3po.vpp.L2FibEntryCustomizer;
+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.rev150105.Vpp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.bridge.domain.attributes.ArpTerminationTable;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.bridge.domain.attributes.arp.termination.table.ArpTerminationTableEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.fib.attributes.L2FibTable;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.fib.attributes.l2.fib.table.L2FibEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.BridgeDomains;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomain;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.openvpp.jvpp.future.FutureJVpp;
+
+public final class VppHoneycombWriterFactory implements WriterFactory, AutoCloseable {
+
+    private final FutureJVpp jvpp;
+    private final NamingContext bdContext;
+    private final NamingContext ifcContext;
+
+    @Inject
+    public VppHoneycombWriterFactory(final FutureJVpp vppJvppWriterDependency,
+                                     @Named("bridge-domain-context") final NamingContext bridgeDomainContextVppDependency,
+                                     @Named("interface-context") final NamingContext interfaceContextVppDependency) {
+        this.jvpp = vppJvppWriterDependency;
+        this.bdContext = bridgeDomainContextVppDependency;
+        this.ifcContext = interfaceContextVppDependency;
+    }
+
+    @Override
+    public void init(final ModifiableWriterRegistryBuilder registry) {
+        // Vpp has no handlers
+        //  BridgeDomains has no handlers
+        //   BridgeDomain =
+        final InstanceIdentifier<BridgeDomain> bdId =
+                InstanceIdentifier.create(Vpp.class).child(BridgeDomains.class).child(BridgeDomain.class);
+        registry.add(new GenericListWriter<>(bdId, new BridgeDomainCustomizer(jvpp, bdContext)));
+        //    L2FibTable has no handlers
+        //     L2FibEntry(handled after BridgeDomain and L2 of ifc and subifc) =
+        final InstanceIdentifier<L2FibEntry> l2FibEntryId = bdId.child(L2FibTable.class).child(L2FibEntry.class);
+        registry.addAfter(
+                new GenericListWriter<>(l2FibEntryId, new L2FibEntryCustomizer(jvpp, bdContext, ifcContext)),
+                Sets.newHashSet(
+                        bdId,
+                        L2_ID,
+                        SubinterfaceAugmentationWriterFactory.L2_ID));
+        //    ArpTerminationTable has no handlers
+        //     ArpTerminationTableEntry(handled after BridgeDomain) =
+        final InstanceIdentifier<ArpTerminationTableEntry> arpEntryId =
+                bdId.child(ArpTerminationTable.class).child(ArpTerminationTableEntry.class);
+        registry.addAfter(
+                new GenericListWriter<>(arpEntryId, new ArpTerminationTableEntryCustomizer(jvpp, bdContext)),
+                bdId);
+    }
+}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppStateHoneycombReaderFactory.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/VppStateHoneycombReaderFactory.java
new file mode 100644 (file)
index 0000000..f39502c
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.translate.v3po;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import io.fd.honeycomb.translate.impl.read.GenericListReader;
+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.honeycomb.translate.v3po.util.NamingContext;
+import io.fd.honeycomb.translate.v3po.util.ReadTimeoutException;
+import io.fd.honeycomb.translate.v3po.vppstate.BridgeDomainCustomizer;
+import io.fd.honeycomb.translate.v3po.vppstate.L2FibEntryCustomizer;
+import io.fd.honeycomb.translate.v3po.vppstate.VersionCustomizer;
+import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppStateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.fib.attributes.L2FibTable;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.fib.attributes.L2FibTableBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.fib.attributes.l2.fib.table.L2FibEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.BridgeDomains;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.BridgeDomainsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.Version;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomain;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.openvpp.jvpp.future.FutureJVpp;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class VppStateHoneycombReaderFactory implements ReaderFactory, AutoCloseable {
+
+    private static final Logger LOG = LoggerFactory.getLogger(VppStateHoneycombReaderFactory.class);
+
+    private final FutureJVpp jVpp;
+    private final NamingContext ifcCtx;
+    private final NamingContext bdCtx;
+    private final ScheduledThreadPool keepaliveExecutor;
+
+    @Inject
+    public VppStateHoneycombReaderFactory(final FutureJVpp jVpp,
+                                          @Named("interface-context") final NamingContext ifcCtx,
+                                          @Named("bridge-domain-context") final NamingContext bdCtx,
+                                          final ScheduledThreadPool keepaliveExecutorDependency) {
+        this.jVpp = jVpp;
+        this.ifcCtx = ifcCtx;
+        this.bdCtx = bdCtx;
+        this.keepaliveExecutor = keepaliveExecutorDependency;
+    }
+
+    @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
+        // TODO keepalive reader wrapper relies on VersionReaderCustomizer (to perform timeout on reads)
+        // Once readers+customizers are asynchronous, pull the timeout to keepalive executor so that keepalive wrapper
+        // is truly generic
+        registry.add(new KeepaliveReaderWrapper<>(
+                new GenericReader<>(vppStateId.child(Version.class), new VersionCustomizer(jVpp)),
+                keepaliveExecutor.getExecutor(), ReadTimeoutException.class, 30,
+                // FIXME-minimal trigger jvpp reinitialization here
+                () -> LOG.error("Keepalive failed. VPP is probably DOWN!")));
+        //  BridgeDomains(Structural)
+        final InstanceIdentifier<BridgeDomains> bridgeDomainsId = vppStateId.child(BridgeDomains.class);
+        registry.addStructuralReader(bridgeDomainsId, BridgeDomainsBuilder.class);
+        //   BridgeDomain
+        final InstanceIdentifier<BridgeDomain> bridgeDomainId = bridgeDomainsId.child(BridgeDomain.class);
+        registry.add(new GenericListReader<>(bridgeDomainId, new BridgeDomainCustomizer(jVpp, bdCtx)));
+        //    L2FibTable(Structural)
+        final InstanceIdentifier<L2FibTable> l2FibTableId = bridgeDomainId.child(L2FibTable.class);
+        registry.addStructuralReader(l2FibTableId, L2FibTableBuilder.class);
+        //     L2FibEntry
+        registry.add(new GenericListReader<>(l2FibTableId.child(L2FibEntry.class),
+                new L2FibEntryCustomizer(jVpp, bdCtx, ifcCtx)));
+    }
+}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/cfgattrs/V3poConfiguration.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/cfgattrs/V3poConfiguration.java
new file mode 100644 (file)
index 0000000..afe486c
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.translate.v3po.cfgattrs;
+
+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 {
+
+    @InjectConfig("some")
+    String some;
+}
index c218e54..e9beccf 100644 (file)
@@ -18,6 +18,8 @@ package io.fd.honeycomb.translate.v3po.initializers;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
 import io.fd.honeycomb.data.init.AbstractDataTreeConverter;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -76,7 +78,8 @@ import org.slf4j.LoggerFactory;
 public class InterfacesInitializer extends AbstractDataTreeConverter<InterfacesState, Interfaces> {
     private static final Logger LOG = LoggerFactory.getLogger(InterfacesInitializer.class);
 
-    public InterfacesInitializer(@Nonnull final DataBroker bindingDataBroker) {
+    @Inject
+    public InterfacesInitializer(@Named("honeycomb-initializer") @Nonnull final DataBroker bindingDataBroker) {
         super(bindingDataBroker, InstanceIdentifier.create(InterfacesState.class),
             InstanceIdentifier.create(Interfaces.class));
     }
index 42d1c59..b975868 100644 (file)
@@ -16,6 +16,8 @@
 
 package io.fd.honeycomb.translate.v3po.initializers;
 
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
 import io.fd.honeycomb.data.init.AbstractDataTreeConverter;
 import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
@@ -29,12 +31,13 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 /**
  * Initializes vpp-classfier node in config data tree based on operational state.
  */
-public class VppClasifierInitializer extends AbstractDataTreeConverter<VppClassifierState, VppClassifier> {
+public final class VppClasifierInitializer extends AbstractDataTreeConverter<VppClassifierState, VppClassifier> {
     private static final InstanceIdentifier<VppClassifierState> OPER_ID =
         InstanceIdentifier.create(VppClassifierState.class);
     private static final InstanceIdentifier<VppClassifier> CFG_ID = InstanceIdentifier.create(VppClassifier.class);
 
-    public VppClasifierInitializer(@Nonnull final DataBroker bindingDataBroker) {
+    @Inject
+    public VppClasifierInitializer(@Named("honeycomb-initializer") @Nonnull final DataBroker bindingDataBroker) {
         super(bindingDataBroker, OPER_ID, CFG_ID);
     }
 
index 370de34..b2c2f7b 100644 (file)
@@ -18,6 +18,8 @@ package io.fd.honeycomb.translate.v3po.initializers;
 
 import com.google.common.base.Function;
 import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
 import io.fd.honeycomb.data.init.AbstractDataTreeConverter;
 import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
@@ -43,7 +45,8 @@ import org.slf4j.LoggerFactory;
 public class VppInitializer extends AbstractDataTreeConverter<VppState, Vpp> {
     private static final Logger LOG = LoggerFactory.getLogger(VppInitializer.class);
 
-    public VppInitializer(@Nonnull final DataBroker bindingDataBroker) {
+    @Inject
+    public VppInitializer(@Named("honeycomb-initializer") @Nonnull final DataBroker bindingDataBroker) {
         super(bindingDataBroker, InstanceIdentifier.create(VppState.class), InstanceIdentifier.create(Vpp.class));
     }
 
index 1c60ef6..39226c0 100644 (file)
@@ -17,6 +17,8 @@ package io.fd.honeycomb.translate.v3po.notification;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
 import io.fd.honeycomb.notification.ManagedNotificationProducer;
 import io.fd.honeycomb.notification.NotificationCollector;
 import io.fd.honeycomb.translate.MappingContext;
@@ -59,9 +61,10 @@ public final class InterfaceChangeNotificationProducer implements ManagedNotific
     @Nullable
     private AutoCloseable notificationListenerReg;
 
+    @Inject
     public InterfaceChangeNotificationProducer(@Nonnull final FutureJVpp jvpp,
-                                               @Nonnull final NamingContext interfaceContext,
-                                               @Nonnull final MappingContext mappingContext) {
+                                               @Named("interface-context") @Nonnull final NamingContext interfaceContext,
+                                               @Named("honeycomb-context") @Nonnull final MappingContext mappingContext) {
         this.jvpp = jvpp;
         this.interfaceContext = interfaceContext;
         this.mappingContext = mappingContext;
index d99fd2e..e633920 100644 (file)
@@ -1,66 +1,12 @@
 package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406;
 
-import static org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406.VppClassifierHoneycombWriterModule.CLASSIFY_SESSION_ID;
-import static org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406.VppClassifierHoneycombWriterModule.CLASSIFY_TABLE_ID;
-
-import com.google.common.collect.Sets;
-import io.fd.honeycomb.translate.impl.write.GenericListWriter;
-import io.fd.honeycomb.translate.impl.write.GenericWriter;
-import io.fd.honeycomb.translate.v3po.interfaces.AclCustomizer;
-import io.fd.honeycomb.translate.v3po.interfaces.EthernetCustomizer;
-import io.fd.honeycomb.translate.v3po.interfaces.GreCustomizer;
-import io.fd.honeycomb.translate.v3po.interfaces.InterfaceCustomizer;
-import io.fd.honeycomb.translate.v3po.interfaces.L2Customizer;
-import io.fd.honeycomb.translate.v3po.interfaces.ProxyArpCustomizer;
-import io.fd.honeycomb.translate.v3po.interfaces.RoutingCustomizer;
-import io.fd.honeycomb.translate.v3po.interfaces.TapCustomizer;
-import io.fd.honeycomb.translate.v3po.interfaces.VhostUserCustomizer;
-import io.fd.honeycomb.translate.v3po.interfaces.VxlanCustomizer;
-import io.fd.honeycomb.translate.v3po.interfaces.VxlanGpeCustomizer;
-import io.fd.honeycomb.translate.v3po.interfaces.ip.Ipv4AddressCustomizer;
-import io.fd.honeycomb.translate.v3po.interfaces.ip.Ipv4Customizer;
-import io.fd.honeycomb.translate.v3po.interfaces.ip.Ipv4NeighbourCustomizer;
-import io.fd.honeycomb.translate.v3po.interfaces.ip.Ipv6Customizer;
-import io.fd.honeycomb.translate.v3po.util.NamingContext;
-import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder;
-import io.fd.honeycomb.translate.write.WriterFactory;
-import java.util.Set;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
-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.ip.rev140616.Interface1;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.Ipv4;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.Ipv6;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.Address;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.Neighbor;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.acl.base.attributes.Ip4Acl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.acl.base.attributes.Ip6Acl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.acl.base.attributes.L2Acl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.Acl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.Ethernet;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.L2;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.ProxyArp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.Routing;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.Tap;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VhostUser;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.Vxlan;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VxlanGpe;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.Gre;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.openvpp.jvpp.future.FutureJVpp;
+import io.fd.honeycomb.translate.v3po.InterfacesWriterFactory;
 
 public class InterfacesHoneycombWriterModule extends
     org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406.AbstractInterfacesHoneycombWriterModule {
 
     // TODO split configuration and translation code into 2 or more bundles
 
-    public static final InstanceIdentifier<Interface> IFC_ID =
-        InstanceIdentifier.create(Interfaces.class).child(Interface.class);
-    public static final InstanceIdentifier<VppInterfaceAugmentation> VPP_IFC_AUG_ID =
-        IFC_ID.augmentation(VppInterfaceAugmentation.class);
-    public static final InstanceIdentifier<L2> L2_ID = VPP_IFC_AUG_ID.child(L2.class);
-    public static final InstanceIdentifier<Acl> ACL_ID = VPP_IFC_AUG_ID.child(Acl.class);
-
     public InterfacesHoneycombWriterModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier,
                                            org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
         super(identifier, dependencyResolver);
@@ -87,105 +33,4 @@ public class InterfacesHoneycombWriterModule extends
     }
 
 
-    private static class InterfacesWriterFactory implements WriterFactory, AutoCloseable {
-
-        private final FutureJVpp jvpp;
-        private final NamingContext bdContext;
-        private final NamingContext ifcContext;
-        private final NamingContext classifyTableContext;
-
-        InterfacesWriterFactory(final FutureJVpp vppJvppIfcDependency,
-                                final NamingContext bridgeDomainContextDependency,
-                                final NamingContext interfaceContextDependency,
-                                final NamingContext classifyTableContextDependency) {
-            this.jvpp = vppJvppIfcDependency;
-            this.bdContext = bridgeDomainContextDependency;
-            this.ifcContext = interfaceContextDependency;
-            this.classifyTableContext = classifyTableContextDependency;
-        }
-
-        @Override
-        public void init(final ModifiableWriterRegistryBuilder registry) {
-            // Interfaces
-            //  Interface =
-            registry.add(new GenericListWriter<>(IFC_ID, new InterfaceCustomizer(jvpp, ifcContext)));
-            //   VppInterfaceAugmentation
-            addVppInterfaceAgmentationWriters(IFC_ID, registry);
-            //   Interface1 (ietf-ip augmentation)
-            addInterface1AugmentationWriters(IFC_ID, registry);
-            //   SubinterfaceAugmentation TODO make dedicated module for subIfc writer factory
-            new SubinterfaceAugmentationWriterFactory(jvpp, ifcContext, bdContext, classifyTableContext).init(registry);
-        }
-
-        private void addInterface1AugmentationWriters(final InstanceIdentifier<Interface> ifcId,
-                                                      final ModifiableWriterRegistryBuilder registry) {
-            final InstanceIdentifier<Interface1> ifc1AugId = ifcId.augmentation(Interface1.class);
-            // Ipv6(after interface) TODO unfinished customizer =
-            registry.addAfter(new GenericWriter<>(ifc1AugId.child(Ipv6.class), new Ipv6Customizer(jvpp)),
-                    ifcId);
-            // Ipv4(after interface)
-            final InstanceIdentifier<Ipv4> ipv4Id = ifc1AugId.child(Ipv4.class);
-            registry.addAfter(new GenericWriter<>(ipv4Id, new Ipv4Customizer(jvpp, ifcContext)),
-                    ifcId);
-            //  Address(after Ipv4) =
-            final InstanceIdentifier<Address> ipv4AddressId = ipv4Id.child(Address.class);
-            registry.addAfter(new GenericListWriter<>(ipv4AddressId, new Ipv4AddressCustomizer(jvpp, ifcContext)),
-                    ipv4Id);
-            //  Neighbor(after ipv4Address)
-            registry.addAfter(new GenericListWriter<>(ipv4Id.child(Neighbor.class), new Ipv4NeighbourCustomizer(jvpp, ifcContext)),
-                    ipv4AddressId);
-        }
-
-        private void addVppInterfaceAgmentationWriters(final InstanceIdentifier<Interface> ifcId,
-                                                       final ModifiableWriterRegistryBuilder registry) {
-            // VhostUser(Needs to be executed before Interface customizer) =
-            final InstanceIdentifier<VhostUser> vhostId = VPP_IFC_AUG_ID.child(VhostUser.class);
-            registry.addBefore(new GenericWriter<>(vhostId, new VhostUserCustomizer(jvpp, ifcContext)),
-                    ifcId);
-            // Vxlan(Needs to be executed before Interface customizer) =
-            final InstanceIdentifier<Vxlan> vxlanId = VPP_IFC_AUG_ID.child(Vxlan.class);
-            registry.addBefore(new GenericWriter<>(vxlanId, new VxlanCustomizer(jvpp, ifcContext)),
-                    ifcId);
-            // VxlanGpe(Needs to be executed before Interface customizer) =
-            final InstanceIdentifier<VxlanGpe> vxlanGpeId = VPP_IFC_AUG_ID.child(VxlanGpe.class);
-            registry.addBefore(new GenericWriter<>(vxlanGpeId, new VxlanGpeCustomizer(jvpp, ifcContext)),
-                    ifcId);
-            // Tap(Needs to be executed before Interface customizer) =
-            final InstanceIdentifier<Tap> tapId = VPP_IFC_AUG_ID.child(Tap.class);
-            registry.addBefore(new GenericWriter<>(tapId, new TapCustomizer(jvpp, ifcContext)),
-                    ifcId);
-
-            // Gre(Needs to be executed before Interface customizer) =
-            final InstanceIdentifier<Gre> greId = VPP_IFC_AUG_ID.child(Gre.class);
-            registry.addBefore(new GenericWriter<>(greId, new GreCustomizer(jvpp, ifcContext)),
-                ifcId);
-
-
-            final Set<InstanceIdentifier<?>> specificIfcTypes = Sets.newHashSet(vhostId, vxlanGpeId, vxlanGpeId, tapId);
-
-            // Ethernet(No dependency, customizer not finished TODO) =
-            registry.add(new GenericWriter<>(VPP_IFC_AUG_ID.child(Ethernet.class), new EthernetCustomizer(jvpp)));
-            // Routing(Execute only after specific interface customizers) =
-            registry.addAfter(
-                    new GenericWriter<>(VPP_IFC_AUG_ID.child(Routing.class), new RoutingCustomizer(jvpp, ifcContext)),
-                    specificIfcTypes);
-            // Routing(Execute only after specific interface customizers) =
-            registry.addAfter(new GenericWriter<>(L2_ID, new L2Customizer(jvpp, ifcContext, bdContext)),
-                    specificIfcTypes);
-            // Proxy Arp (execute after specific interface customizers)
-            registry.addAfter(
-                    new GenericWriter<>(VPP_IFC_AUG_ID.child(ProxyArp.class), new ProxyArpCustomizer(jvpp, ifcContext)),
-                    specificIfcTypes);
-            // ACL (execute after classify table and session writers)
-            // also handles L2Acl, Ip4Acl and Ip6Acl:
-            final InstanceIdentifier<Acl> aclId = InstanceIdentifier.create(Acl.class);
-            registry
-                .subtreeAddAfter(
-                    Sets.newHashSet(aclId.child(L2Acl.class), aclId.child(Ip4Acl.class), aclId.child(Ip6Acl.class)),
-                    new GenericWriter<>(ACL_ID, new AclCustomizer(jvpp, ifcContext, classifyTableContext)),
-                    Sets.newHashSet(CLASSIFY_TABLE_ID, CLASSIFY_SESSION_ID));
-        }
-
-    }
-
 }
index d914fac..300f441 100644 (file)
@@ -1,59 +1,10 @@
 package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406;
 
-import com.google.common.collect.Sets;
-import io.fd.honeycomb.translate.impl.read.GenericListReader;
-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.v3po.interfacesstate.AclCustomizer;
-import io.fd.honeycomb.translate.v3po.interfacesstate.EthernetCustomizer;
-import io.fd.honeycomb.translate.v3po.interfacesstate.GreCustomizer;
-import io.fd.honeycomb.translate.v3po.interfacesstate.InterfaceCustomizer;
-import io.fd.honeycomb.translate.v3po.interfacesstate.L2Customizer;
-import io.fd.honeycomb.translate.v3po.interfacesstate.ProxyArpCustomizer;
-import io.fd.honeycomb.translate.v3po.interfacesstate.TapCustomizer;
-import io.fd.honeycomb.translate.v3po.interfacesstate.VhostUserCustomizer;
-import io.fd.honeycomb.translate.v3po.interfacesstate.VxlanCustomizer;
-import io.fd.honeycomb.translate.v3po.interfacesstate.VxlanGpeCustomizer;
-import io.fd.honeycomb.translate.v3po.interfacesstate.ip.Ipv4AddressCustomizer;
-import io.fd.honeycomb.translate.v3po.interfacesstate.ip.Ipv4Customizer;
-import io.fd.honeycomb.translate.v3po.interfacesstate.ip.Ipv4NeighbourCustomizer;
-import io.fd.honeycomb.translate.v3po.interfacesstate.ip.Ipv6Customizer;
-import io.fd.honeycomb.translate.v3po.util.NamingContext;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesStateBuilder;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.Interface2;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.Interface2Builder;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.Ipv4;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.Ipv6;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.ipv4.Address;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces.state._interface.ipv4.Neighbor;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentationBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.acl.base.attributes.Ip4Acl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.acl.base.attributes.Ip6Acl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.acl.base.attributes.L2Acl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Acl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Ethernet;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.L2;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.ProxyArp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Tap;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VhostUser;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Vxlan;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.VxlanGpe;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.openvpp.jvpp.future.FutureJVpp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.Gre;
-import org.opendaylight.yangtools.yang.binding.Augmentation;
-import org.opendaylight.yangtools.yang.binding.ChildOf;
+import io.fd.honeycomb.translate.v3po.InterfacesStateReaderFactory;
 
 public class InterfacesStateHoneycombReaderModule extends
         org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406.AbstractInterfacesStateHoneycombReaderModule {
 
-    public static final InstanceIdentifier<InterfacesState> IFC_STATE_ID = InstanceIdentifier.create(InterfacesState.class);
-    static final InstanceIdentifier<Interface> IFC_ID = IFC_STATE_ID.child(Interface.class);
-
     public InterfacesStateHoneycombReaderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier,
                                                 org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
         super(identifier, dependencyResolver);
@@ -73,92 +24,10 @@ public class InterfacesStateHoneycombReaderModule extends
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        return new VppStateReaderFactory(getVppJvppDependency(),
+        return new InterfacesStateReaderFactory(getVppJvppDependency(),
                 getInterfaceContextIfcStateDependency(),
                 getBridgeDomainContextIfcStateDependency(),
                 getClassifyTableContextDependency());
     }
 
-    private static final class VppStateReaderFactory implements ReaderFactory, AutoCloseable {
-
-        private NamingContext ifcCtx;
-        private NamingContext bdCtx;
-        private NamingContext classifyCtx;
-        private FutureJVpp jvpp;
-
-        VppStateReaderFactory(final FutureJVpp jvpp,
-                              final NamingContext ifcCtx,
-                              final NamingContext bdCtx,
-                              final NamingContext classifyCtx) {
-            this.jvpp = jvpp;
-            this.ifcCtx = ifcCtx;
-            this.bdCtx = bdCtx;
-            this.classifyCtx = classifyCtx;
-        }
-
-        @Override
-        public void init(final ModifiableReaderRegistryBuilder registry) {
-            // InterfacesState(Structural)
-            registry.addStructuralReader(IFC_STATE_ID, InterfacesStateBuilder.class);
-            //  Interface
-            registry.add(new GenericListReader<>(IFC_ID, new InterfaceCustomizer(jvpp, ifcCtx)));
-
-            // v3po.yang
-            initVppIfcAugmentationReaders(registry, IFC_ID);
-            // ietf-ip.yang
-            initInterface2AugmentationReaders(registry, IFC_ID);
-            // vpp-vlan.yang
-            new SubinterfaceStateAugmentationReaderFactory(jvpp, ifcCtx, bdCtx, classifyCtx).init(registry);
-        }
-
-        private void initInterface2AugmentationReaders(final ModifiableReaderRegistryBuilder registry,
-                                                       final InstanceIdentifier<Interface> ifcId) {
-            //   Interface2Augmentation(Structural)
-            final InstanceIdentifier<Interface2> ifc2AugId = ifcId.augmentation(Interface2.class);
-            registry.addStructuralReader(ifc2AugId, Interface2Builder.class);
-            //    Ipv4
-            // TODO unfinished customizer
-            final InstanceIdentifier<Ipv4> ipv4Id = ifc2AugId.child(Ipv4.class);
-            registry.add(new GenericReader<>(ipv4Id, new Ipv4Customizer(jvpp)));
-            //     Address
-            final InstanceIdentifier<Address> ipv4AddrId = ipv4Id.child(Address.class);
-            registry.add(new GenericListReader<>(ipv4AddrId, new Ipv4AddressCustomizer(jvpp, ifcCtx)));
-            //     Neighbor
-            final InstanceIdentifier<Neighbor> neighborId = ipv4Id.child(Neighbor.class);
-            registry.add(new GenericListReader<>(neighborId, new Ipv4NeighbourCustomizer(jvpp)));
-            //    Ipv6
-            // TODO unfinished customizer
-            final InstanceIdentifier<Ipv6> ipv6Id = ifc2AugId.child(Ipv6.class);
-            registry.add(new GenericReader<>(ipv6Id, new Ipv6Customizer(jvpp, ifcCtx)));
-        }
-
-        private void initVppIfcAugmentationReaders(final ModifiableReaderRegistryBuilder registry,
-                                                   final InstanceIdentifier<Interface> ifcId) {
-            //   VppInterfaceStateAugmentation
-            final InstanceIdentifier<VppInterfaceStateAugmentation> vppIfcAugId = ifcId.augmentation(VppInterfaceStateAugmentation.class);
-            registry.addStructuralReader(vppIfcAugId, VppInterfaceStateAugmentationBuilder.class);
-            //    Ethernet
-            registry.add(new GenericReader<>(vppIfcAugId.child(Ethernet.class), new EthernetCustomizer(jvpp, ifcCtx)));
-            //    Tap
-            registry.add(new GenericReader<>(vppIfcAugId.child(Tap.class), new TapCustomizer(jvpp, ifcCtx)));
-            //    VhostUser
-            registry.add(new GenericReader<>(vppIfcAugId.child(VhostUser.class), new VhostUserCustomizer(jvpp, ifcCtx)));
-            //    Vxlan
-            registry.add(new GenericReader<>(vppIfcAugId.child(Vxlan.class), new VxlanCustomizer(jvpp, ifcCtx)));
-            //    VxlanGpe
-            registry.add(new GenericReader<>(vppIfcAugId.child(VxlanGpe.class), new VxlanGpeCustomizer(jvpp, ifcCtx)));
-            //    Gre
-            registry.add(new GenericReader<>(vppIfcAugId.child(Gre.class), new GreCustomizer(jvpp, ifcCtx)));
-            //    L2
-            registry.add(new GenericReader<>(vppIfcAugId.child(L2.class), new L2Customizer(jvpp, ifcCtx, bdCtx)));
-            //    Acl(Subtree)
-            final InstanceIdentifier<Acl> aclIdRelative = InstanceIdentifier.create(Acl.class);
-            registry.subtreeAdd(
-                    Sets.newHashSet(aclIdRelative.child(L2Acl.class), aclIdRelative.child(Ip4Acl.class), aclIdRelative.child(Ip6Acl.class)),
-                    new GenericReader<>(vppIfcAugId.child(Acl.class), new AclCustomizer(jvpp, ifcCtx, classifyCtx)));
-            //   Proxy ARP
-            registry.add(new GenericReader<>(vppIfcAugId.child(ProxyArp.class), new ProxyArpCustomizer(jvpp,
-             ifcCtx)));
-        }
-    }
 }
index c321c27..172646c 100644 (file)
@@ -1,31 +1,11 @@
 package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406;
 
-import static org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406.InterfacesHoneycombWriterModule.ACL_ID;
-
-import io.fd.honeycomb.translate.impl.write.GenericListWriter;
-import io.fd.honeycomb.translate.v3po.util.NamingContext;
-import io.fd.honeycomb.translate.v3po.vppclassifier.ClassifySessionWriter;
-import io.fd.honeycomb.translate.v3po.vppclassifier.ClassifyTableWriter;
-import io.fd.honeycomb.translate.write.WriterFactory;
-import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.VppClassifier;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.classify.table.base.attributes.ClassifySession;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.vpp.classifier.ClassifyTable;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.openvpp.jvpp.future.FutureJVpp;
+import io.fd.honeycomb.translate.v3po.VppClassifierHoneycombWriterFactory;
 
 public class VppClassifierHoneycombWriterModule extends
     org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406.AbstractVppClassifierHoneycombWriterModule {
 
 
-    public static final InstanceIdentifier<ClassifyTable> CLASSIFY_TABLE_ID =
-        InstanceIdentifier.create(VppClassifier.class).child(ClassifyTable.class);
-
-    public static final InstanceIdentifier<ClassifySession> CLASSIFY_SESSION_ID =
-        CLASSIFY_TABLE_ID.child(ClassifySession.class);
-
-
     public VppClassifierHoneycombWriterModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier,
                                               org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
         super(identifier, dependencyResolver);
@@ -50,27 +30,4 @@ public class VppClassifierHoneycombWriterModule extends
             getClassifyTableContextDependency());
     }
 
-    private static final class VppClassifierHoneycombWriterFactory implements WriterFactory, AutoCloseable {
-        private final FutureJVpp jvpp;
-        private final NamingContext classifyTableContext;
-
-        public VppClassifierHoneycombWriterFactory(@Nonnull final FutureJVpp jvpp,
-                                                   @Nonnull final NamingContext classifyTableContext) {
-            this.jvpp = jvpp;
-            this.classifyTableContext = classifyTableContext;
-        }
-
-        @Override
-        public void init(@Nonnull final ModifiableWriterRegistryBuilder registry) {
-            // Ordering here is: First create table, then create sessions and then assign as ACL
-            // ClassifyTable
-            registry.addBefore(
-                    new GenericListWriter<>(CLASSIFY_TABLE_ID, new ClassifyTableWriter(jvpp, classifyTableContext)),
-                    CLASSIFY_SESSION_ID);
-            //  ClassifyTableSession
-            registry.addBefore(
-                    new GenericListWriter<>(CLASSIFY_SESSION_ID, new ClassifySessionWriter(jvpp, classifyTableContext)),
-                    ACL_ID);
-        }
-    }
 }
index de12bbe..4169b78 100644 (file)
@@ -1,17 +1,6 @@
 package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406;
 
-import io.fd.honeycomb.translate.impl.read.GenericListReader;
-import io.fd.honeycomb.translate.read.ReaderFactory;
-import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder;
-import io.fd.honeycomb.translate.v3po.util.NamingContext;
-import io.fd.honeycomb.translate.v3po.vppclassifier.ClassifySessionReader;
-import io.fd.honeycomb.translate.v3po.vppclassifier.ClassifyTableReader;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.VppClassifierState;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.VppClassifierStateBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.classify.table.base.attributes.ClassifySession;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.classifier.rev150603.vpp.classifier.state.ClassifyTable;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.openvpp.jvpp.future.FutureJVpp;
+import io.fd.honeycomb.translate.v3po.VppClassifierReaderFactory;
 
 public class VppClassifierStateHoneycombReaderModule extends org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406.AbstractVppClassifierStateHoneycombReaderModule {
     public VppClassifierStateHoneycombReaderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
@@ -32,28 +21,4 @@ public class VppClassifierStateHoneycombReaderModule extends org.opendaylight.ya
         return new VppClassifierReaderFactory(getVppJvppDependency(), getClassifyTableContextDependency());
     }
 
-    private static final class VppClassifierReaderFactory implements ReaderFactory, AutoCloseable {
-
-        private final FutureJVpp jvpp;
-        private final NamingContext classifyCtx;
-
-        VppClassifierReaderFactory(final FutureJVpp jvpp,
-                                          final NamingContext classifyCtx) {
-            this.jvpp = jvpp;
-            this.classifyCtx = classifyCtx;
-        }
-
-        @Override
-        public void init(final ModifiableReaderRegistryBuilder registry) {
-            // VppClassifierState
-            final InstanceIdentifier<VppClassifierState> vppStateId = InstanceIdentifier.create(VppClassifierState.class);
-            registry.addStructuralReader(vppStateId, VppClassifierStateBuilder.class);
-            //  ClassifyTable
-            final InstanceIdentifier<ClassifyTable> classTblId = vppStateId.child(ClassifyTable.class);
-            registry.add(new GenericListReader<>(classTblId, new ClassifyTableReader(jvpp, classifyCtx)));
-            //   ClassifySession
-            final InstanceIdentifier<ClassifySession> classSesId = classTblId.child(ClassifySession.class);
-            registry.add(new GenericListReader<>(classSesId, new ClassifySessionReader(jvpp, classifyCtx)));
-        }
-    }
 }
index 2cdf24c..63a8a1b 100644 (file)
@@ -1,22 +1,6 @@
 package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406;
 
-import com.google.common.collect.Sets;
-import io.fd.honeycomb.translate.impl.write.GenericListWriter;
-import io.fd.honeycomb.translate.v3po.util.NamingContext;
-import io.fd.honeycomb.translate.v3po.vpp.ArpTerminationTableEntryCustomizer;
-import io.fd.honeycomb.translate.v3po.vpp.BridgeDomainCustomizer;
-import io.fd.honeycomb.translate.v3po.vpp.L2FibEntryCustomizer;
-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.rev150105.Vpp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.bridge.domain.attributes.ArpTerminationTable;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.bridge.domain.attributes.arp.termination.table.ArpTerminationTableEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.fib.attributes.L2FibTable;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.fib.attributes.l2.fib.table.L2FibEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.BridgeDomains;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomain;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.openvpp.jvpp.future.FutureJVpp;
+import io.fd.honeycomb.translate.v3po.VppHoneycombWriterFactory;
 
 public class VppHoneycombWriterModule extends
     org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406.AbstractVppHoneycombWriterModule {
@@ -40,49 +24,9 @@ public class VppHoneycombWriterModule extends
     @Override
     public java.lang.AutoCloseable createInstance() {
         return new VppHoneycombWriterFactory(
-            getVppJvppWriterDependency(),
-            getBridgeDomainContextVppDependency(),
-            getInterfaceContextVppDependency());
+                getVppJvppWriterDependency(),
+                getBridgeDomainContextVppDependency(),
+                getInterfaceContextVppDependency());
     }
 
-    private static final class VppHoneycombWriterFactory implements WriterFactory, AutoCloseable {
-
-        private final FutureJVpp jvpp;
-        private final NamingContext bdContext;
-        private final NamingContext ifcContext;
-
-        VppHoneycombWriterFactory(final FutureJVpp vppJvppWriterDependency,
-                                  final NamingContext bridgeDomainContextVppDependency,
-                                  final NamingContext interfaceContextVppDependency) {
-            this.jvpp = vppJvppWriterDependency;
-            this.bdContext = bridgeDomainContextVppDependency;
-            this.ifcContext = interfaceContextVppDependency;
-        }
-
-        @Override
-        public void init(final ModifiableWriterRegistryBuilder registry) {
-            // Vpp has no handlers
-            //  BridgeDomains has no handlers
-            //   BridgeDomain =
-            final InstanceIdentifier<BridgeDomain> bdId =
-                InstanceIdentifier.create(Vpp.class).child(BridgeDomains.class).child(BridgeDomain.class);
-            registry.add(new GenericListWriter<>(bdId, new BridgeDomainCustomizer(jvpp, bdContext)));
-            //    L2FibTable has no handlers
-            //     L2FibEntry(handled after BridgeDomain and L2 of ifc and subifc) =
-            final InstanceIdentifier<L2FibEntry> l2FibEntryId = bdId.child(L2FibTable.class).child(L2FibEntry.class);
-            registry.addAfter(
-                new GenericListWriter<>(l2FibEntryId, new L2FibEntryCustomizer(jvpp, bdContext, ifcContext)),
-                Sets.newHashSet(
-                    bdId,
-                    InterfacesHoneycombWriterModule.L2_ID,
-                    SubinterfaceAugmentationWriterFactory.L2_ID));
-            //    ArpTerminationTable has no handlers
-            //     ArpTerminationTableEntry(handled after BridgeDomain) =
-            final InstanceIdentifier<ArpTerminationTableEntry> arpEntryId =
-                bdId.child(ArpTerminationTable.class).child(ArpTerminationTableEntry.class);
-            registry.addAfter(
-                new GenericListWriter<>(arpEntryId, new ArpTerminationTableEntryCustomizer(jvpp, bdContext)),
-                bdId);
-        }
-    }
 }
index 5be949b..df216c0 100644 (file)
@@ -1,37 +1,16 @@
 package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.v3po2vpp.rev160406;
 
-import io.fd.honeycomb.translate.impl.read.GenericListReader;
-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.honeycomb.translate.v3po.util.NamingContext;
-import io.fd.honeycomb.translate.v3po.util.ReadTimeoutException;
-import io.fd.honeycomb.translate.v3po.vppstate.BridgeDomainCustomizer;
-import io.fd.honeycomb.translate.v3po.vppstate.L2FibEntryCustomizer;
-import io.fd.honeycomb.translate.v3po.vppstate.VersionCustomizer;
+import io.fd.honeycomb.translate.v3po.VppStateHoneycombReaderFactory;
 import java.lang.management.ManagementFactory;
 import javax.management.Attribute;
 import javax.management.InstanceNotFoundException;
 import javax.management.ObjectName;
 import org.opendaylight.controller.config.api.ConflictingVersionException;
 import org.opendaylight.controller.config.api.ValidationException;
-import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
 import org.opendaylight.controller.config.util.ConfigRegistryJMXClient;
 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.vpp.jvpp.cfg.rev160406.VppJvppImplModule;
 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.vpp.jvpp.cfg.rev160406.VppJvppImplModuleFactory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppState;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppStateBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.fib.attributes.L2FibTable;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.fib.attributes.L2FibTableBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.fib.attributes.l2.fib.table.L2FibEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.BridgeDomains;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.BridgeDomainsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.Version;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomain;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.openvpp.jvpp.future.FutureJVpp;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -117,49 +96,4 @@ public class VppStateHoneycombReaderModule extends
     }
 
 
-    private static final class VppStateHoneycombReaderFactory implements ReaderFactory, AutoCloseable {
-
-        private final FutureJVpp jVpp;
-        private final NamingContext ifcCtx;
-        private final NamingContext bdCtx;
-        private final ScheduledThreadPool keepaliveExecutor;
-
-        public VppStateHoneycombReaderFactory(final FutureJVpp jVpp,
-                                              final NamingContext ifcCtx,
-                                              final NamingContext bdCtx,
-                                              final ScheduledThreadPool keepaliveExecutorDependency) {
-            this.jVpp = jVpp;
-            this.ifcCtx = ifcCtx;
-            this.bdCtx = bdCtx;
-            this.keepaliveExecutor = keepaliveExecutorDependency;
-        }
-
-        @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
-            // TODO keepalive reader wrapper relies on VersionReaderCustomizer (to perform timeout on reads)
-            // Once readers+customizers are asynchronous, pull the timeout to keepalive executor so that keepalive wrapper
-            // is truly generic
-            registry.add(new KeepaliveReaderWrapper<>(
-                    new GenericReader<>(vppStateId.child(Version.class), new VersionCustomizer(jVpp)),
-                    keepaliveExecutor.getExecutor(), ReadTimeoutException.class, 30,
-                    () -> reinitializeJVpp(reinitializationCounter)));
-            //  BridgeDomains(Structural)
-            final InstanceIdentifier<BridgeDomains> bridgeDomainsId = vppStateId.child(BridgeDomains.class);
-            registry.addStructuralReader(bridgeDomainsId, BridgeDomainsBuilder.class);
-            //   BridgeDomain
-            final InstanceIdentifier<BridgeDomain> bridgeDomainId = bridgeDomainsId.child(BridgeDomain.class);
-            registry.add(new GenericListReader<>(bridgeDomainId, new BridgeDomainCustomizer(jVpp, bdCtx)));
-            //    L2FibTable(Structural)
-            final InstanceIdentifier<L2FibTable> l2FibTableId = bridgeDomainId.child(L2FibTable.class);
-            registry.addStructuralReader(l2FibTableId, L2FibTableBuilder.class);
-            //     L2FibEntry
-            registry.add(new GenericListReader<>(l2FibTableId.child(L2FibEntry.class),
-                    new L2FibEntryCustomizer(jVpp, bdCtx, ifcCtx)));
-        }
-    }
 }
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
new file mode 100644 (file)
index 0000000..290d631
--- /dev/null
@@ -0,0 +1,3 @@
+{
+  "some": "value"
+}
\ No newline at end of file
diff --git a/vpp-common/minimal-distribution/pom.xml b/vpp-common/minimal-distribution/pom.xml
new file mode 100644 (file)
index 0000000..4500a63
--- /dev/null
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2015 Cisco and/or its affiliates.
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at:
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <parent>
+    <groupId>io.fd.honeycomb.common</groupId>
+    <artifactId>minimal-distribution-parent</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../../common/minimal-distribution-parent</relativePath>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>io.fd.honeycomb.vpp</groupId>
+  <artifactId>minimal-distribution</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+
+  <properties>
+    <main.class>io.fd.honeycomb.vpp.distro.Main</main.class>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <!-- 2.8.0-01 and later require maven-compiler-plugin 3.1 or higher -->
+        <configuration>
+          <compilerId>groovy-eclipse-compiler</compilerId>
+        </configuration>
+        <dependencies>
+          <dependency>
+            <groupId>org.codehaus.groovy</groupId>
+            <artifactId>groovy-eclipse-compiler</artifactId>
+            <version>2.9.2-01</version>
+          </dependency>
+          <!-- for 2.8.0-01 and later you must have an explicit dependency on groovy-eclipse-batch -->
+          <dependency>
+            <groupId>org.codehaus.groovy</groupId>
+            <artifactId>groovy-eclipse-batch</artifactId>
+            <version>2.4.3-01</version>
+          </dependency>
+        </dependencies>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.gmaven</groupId>
+        <artifactId>groovy-maven-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>io.fd.honeycomb</groupId>
+      <artifactId>minimal-distribution</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>naming-context-api</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>naming-context-impl</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>vpp-jvpp-cfg</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>io.fd.vpp</groupId>
+      <artifactId>jvpp</artifactId>
+      <version>16.09-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>vpp-translate-utils</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+
+  </dependencies>
+</project>
diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/ContextsReaderFactoryProvider.groovy b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/ContextsReaderFactoryProvider.groovy
new file mode 100644 (file)
index 0000000..fe71cad
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.vpp.distro
+
+import com.google.inject.Inject
+import com.google.inject.name.Named
+import groovy.transform.ToString
+import groovy.util.logging.Slf4j
+import io.fd.honeycomb.infra.distro.ProviderTrait
+import io.fd.honeycomb.translate.read.ReaderFactory
+import org.opendaylight.controller.md.sal.binding.api.DataBroker
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.context.impl.rev141210.ContextReaderModule
+
+/**
+ * Mirror of org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.context.impl.rev141210.ContextReaderModule
+ */
+@Slf4j
+@ToString
+class ContextsReaderFactoryProvider extends ProviderTrait<ReaderFactory> {
+
+    @Inject
+    @Named("honeycomb-context")
+    DataBroker contextDataBroker
+
+    def create() { new ContextReaderModule.ContextsReaderFactory(contextDataBroker) }
+}
diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppProvider.groovy b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/JVppProvider.groovy
new file mode 100644 (file)
index 0000000..dfd0c44
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.vpp.distro
+
+import com.google.inject.Inject
+import groovy.transform.ToString
+import groovy.util.logging.Slf4j
+import io.fd.honeycomb.infra.distro.ProviderTrait
+import org.openvpp.jvpp.JVppImpl
+import org.openvpp.jvpp.VppJNIConnection
+import org.openvpp.jvpp.future.FutureJVpp
+import org.openvpp.jvpp.future.FutureJVppFacade
+
+@Slf4j
+@ToString
+class JVppProvider extends ProviderTrait<FutureJVpp> {
+
+    @Inject
+    VppConfigAttributes config
+
+    def create() {
+        try {
+            def connection = new VppJNIConnection(config.jvppConnectionName)
+            def jVpp = new JVppImpl(connection)
+
+            // Closing JVpp connection with shutdown hook to erase the connection from VPP so HC will be able
+            // to connect next time
+            // TODO is there a safer way than a shutdown hook ?
+            Runtime.addShutdownHook {
+                log.info("Disconnecting from VPP")
+                jVpp.close()
+                connection.close()
+                log.info("Successfully disconnected from VPP as {}", config.jvppConnectionName)
+            }
+            log.info("JVpp connection opened successfully as: {}", config.jvppConnectionName)
+            new FutureJVppFacade(jVpp)
+        } catch (IOException e) {
+            throw new IllegalStateException("Unable to open VPP management connection", e)
+        }
+    }
+}
diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/Main.java b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/Main.java
new file mode 100644 (file)
index 0000000..821bd1e
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.vpp.distro;
+
+import com.google.common.collect.Lists;
+import com.google.inject.Module;
+import java.util.List;
+
+public class Main {
+
+    public static void main(String[] args) {
+        final List<Module> sampleModules = Lists.newArrayList(io.fd.honeycomb.infra.distro.Main.BASE_MODULES);
+
+        sampleModules.add(new VppCommonModule());
+
+        io.fd.honeycomb.infra.distro.Main.init(sampleModules);
+    }
+}
diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.groovy b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppCommonModule.groovy
new file mode 100644 (file)
index 0000000..4c2573c
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.vpp.distro
+
+import com.google.inject.AbstractModule
+import com.google.inject.Singleton
+import com.google.inject.multibindings.Multibinder
+import groovy.util.logging.Slf4j
+import io.fd.honeycomb.translate.read.ReaderFactory
+import net.jmob.guice.conf.core.ConfigurationModule
+import org.openvpp.jvpp.future.FutureJVpp
+
+@Slf4j
+public final class VppCommonModule extends AbstractModule {
+
+    protected void configure() {
+        install(ConfigurationModule.create())
+        // Inject non-dependency configuration
+        requestInjection(VppConfigAttributes)
+
+        bind(FutureJVpp).toProvider(JVppProvider).in(Singleton)
+
+        // Naming contexts reader exposing context storage over REST/NETCONF
+        Multibinder.newSetBinder(binder(), ReaderFactory.class).with {
+            addBinding().toProvider(ContextsReaderFactoryProvider).in(Singleton)
+        }
+    }
+}
diff --git a/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppConfigAttributes.groovy b/vpp-common/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/distro/VppConfigAttributes.groovy
new file mode 100644 (file)
index 0000000..23ee95d
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.vpp.distro
+
+import groovy.transform.ToString
+import net.jmob.guice.conf.core.BindConfig
+import net.jmob.guice.conf.core.InjectConfig
+import net.jmob.guice.conf.core.Syntax
+
+@ToString(includeNames = true)
+@BindConfig(value = "jvpp", syntax = Syntax.JSON)
+class VppConfigAttributes {
+
+    @InjectConfig("jvpp-connection-name")
+    String jvppConnectionName
+
+}
diff --git a/vpp-common/minimal-distribution/src/main/resources/honeycomb-minimal-resources/config/jvpp.json b/vpp-common/minimal-distribution/src/main/resources/honeycomb-minimal-resources/config/jvpp.json
new file mode 100644 (file)
index 0000000..1d41187
--- /dev/null
@@ -0,0 +1,3 @@
+{
+  "jvpp-connection-name": "honeycomb"
+}
\ No newline at end of file
index da7ab83..ccc01e0 100644 (file)
@@ -27,14 +27,14 @@ public class ContextReaderModule extends org.opendaylight.yang.gen.v1.urn.openda
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        return new ReaderFactory(getContextBindingBrokerDependency());
+        return new ContextsReaderFactory(getContextBindingBrokerDependency());
     }
 
-    private static final class ReaderFactory implements AutoCloseable, io.fd.honeycomb.translate.read.ReaderFactory {
+    public static final class ContextsReaderFactory implements AutoCloseable, io.fd.honeycomb.translate.read.ReaderFactory {
 
         private final DataBroker contextBindingBrokerDependency;
 
-        public ReaderFactory(final DataBroker contextBindingBrokerDependency) {
+        public ContextsReaderFactory(final DataBroker contextBindingBrokerDependency) {
             this.contextBindingBrokerDependency = contextBindingBrokerDependency;
         }
 
index ca4029b..42a5221 100644 (file)
@@ -36,7 +36,8 @@
     <module>vpp-jvpp-cfg</module>
     <module>naming-context-api</module>
     <module>naming-context-impl</module>
-    <module>features</module>
+    <module>minimal-distribution</module>
+    <!--<module>features</module>-->
   </modules>
   <!-- DO NOT install or deploy the repo root pom as it's only needed to initiate a build -->
   <build>
diff --git a/vpp-integration/minimal-distribution/pom.xml b/vpp-integration/minimal-distribution/pom.xml
new file mode 100644 (file)
index 0000000..034c3ee
--- /dev/null
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2015 Cisco and/or its affiliates.
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at:
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <parent>
+    <groupId>io.fd.honeycomb.common</groupId>
+    <artifactId>minimal-distribution-parent</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../../common/minimal-distribution-parent</relativePath>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>io.fd.honeycomb.vpp.integration</groupId>
+  <artifactId>vpp-integration-distribution</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+
+  <properties>
+    <exec.parameters>-Xms128m -Xmx128m</exec.parameters>
+    <main.class>io.fd.honeycomb.vpp.integration.distro.Main</main.class>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.gmaven</groupId>
+        <artifactId>groovy-maven-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>io.fd.honeycomb.vpp</groupId>
+      <artifactId>minimal-distribution</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>io.fd.honeycomb.v3po</groupId>
+      <artifactId>v3po2vpp</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+
+  </dependencies>
+</project>
diff --git a/vpp-integration/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/integration/distro/Main.java b/vpp-integration/minimal-distribution/src/main/java/io/fd/honeycomb/vpp/integration/distro/Main.java
new file mode 100644 (file)
index 0000000..6485aed
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.vpp.integration.distro;
+
+import com.google.common.collect.Lists;
+import com.google.inject.Module;
+import io.fd.honeycomb.translate.v3po.V3poModule;
+import io.fd.honeycomb.vpp.distro.VppCommonModule;
+import java.util.List;
+
+public class Main {
+
+    public static void main(String[] args) {
+        final List<Module> sampleModules = Lists.newArrayList(io.fd.honeycomb.infra.distro.Main.BASE_MODULES);
+
+        // All the plugins should be listed here
+        sampleModules.add(new VppCommonModule());
+        sampleModules.add(new V3poModule());
+
+        io.fd.honeycomb.infra.distro.Main.init(sampleModules);
+    }
+}
index 7b900e7..e087abd 100644 (file)
@@ -31,8 +31,9 @@
     <maven>3.1.1</maven>
   </prerequisites>
   <modules>
-    <module>features</module>
-    <module>karaf</module>
+    <!--<module>features</module>-->
+    <!--<module>karaf</module>-->
+    <module>minimal-distribution</module>
   </modules>
   <!-- DO NOT install or deploy the repo root pom as it's only needed to initiate a build -->
   <build>