summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaros Marsalek <mmarsale@cisco.com>2016-03-03 16:11:27 +0100
committerMaros Marsalek <mmarsale@cisco.com>2016-03-03 17:00:24 +0100
commit833ca1604774d927a9b2d3dd7ce38ea9b68c24d5 (patch)
tree91487759f1eb67652ef19195c02c845d9b1eee66
parent40e3a99694badc0dddad2ddf900c17979c299dfd (diff)
Pre provision interface configuration
In v3po, after connecting to vpp, read initial vpp existing (initial)configuration and put it into v3po's datastore. This is very minimalistic(only mandatory nodes are stored), only to allow configuration of bridge domains right off the bat. Change-Id: Ia29d537600660a8e50f648477a5a40d06f0eed6d Signed-off-by: Maros Marsalek <mmarsale@cisco.com>
-rw-r--r--v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/V3poProvider.java54
1 files changed, 50 insertions, 4 deletions
diff --git a/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/V3poProvider.java b/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/V3poProvider.java
index a008792c3..b761000de 100644
--- a/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/V3poProvider.java
+++ b/v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/V3poProvider.java
@@ -16,9 +16,13 @@
package io.fd.honeycomb.v3po.impl;
+import com.google.common.collect.Lists;
import com.google.common.util.concurrent.CheckedFuture;
import com.google.common.util.concurrent.Futures;
import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
@@ -28,15 +32,23 @@ import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFaile
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration;
import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.EthernetCsmacd;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.SoftwareLoopback;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType;
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.InterfacesBuilder;
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.Interface;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.V3poService;
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.VppBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanTunnel;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.openvpp.vppjapi.vppApi;
+import org.openvpp.vppjapi.vppInterfaceDetails;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -66,10 +78,10 @@ public class V3poProvider implements BindingAwareProvider, AutoCloseable {
LOG.info("VPPCFG-INFO: Preparing to initialize the IETF Interface " + "list configuration db.");
transaction = db.newWriteOnlyTransaction();
- InstanceIdentifier<Interfaces> iid = InstanceIdentifier.create(Interfaces.class);
- Interfaces intf = new InterfacesBuilder().build();
- // FIXME uncomment after ODL bug-5382 is fixed
-// transaction.put(LogicalDatastoreType.CONFIGURATION, iid, intf);
+
+ // FIXME this is minimal and we need to sync the entire configuration
+ syncInterfaces(transaction, api);
+
future = transaction.submit();
Futures.addCallback(future, new
LoggingFuturesCallBack<>("VPPCFG-WARNING: Failed to create IETF "
@@ -79,6 +91,40 @@ public class V3poProvider implements BindingAwareProvider, AutoCloseable {
}
+ private static final Map<String, Class<? extends InterfaceType>> IFC_TYPES =
+ new HashMap<String, Class<? extends InterfaceType>>() {{
+ put("vxlan", VxlanTunnel.class);
+ put("lo", SoftwareLoopback.class);
+ put("Ether", EthernetCsmacd.class);
+ // TODO missing types below
+ put("l2tpv3_tunnel", EthernetCsmacd.class);
+ put("tap", EthernetCsmacd.class);
+ }};
+
+ /**
+ * Dump all interfaces from VPP and populate config datastore to sync initial state (interfaces)
+ * Only the mandatory leaves are stored in config datastore
+ */
+ private void syncInterfaces(final WriteTransaction transaction, final vppApi api) {
+ LOG.info("Starting interface configuration sync");
+ final List<Interface> ifcs = Lists.newArrayList();
+ for (Map.Entry<String, Class<? extends InterfaceType>> ifcType : IFC_TYPES.entrySet()) {
+
+ for (vppInterfaceDetails vppIfc : api.swInterfaceDump(((byte) 1), ifcType.getKey().getBytes())) {
+ ifcs.add(new InterfaceBuilder()
+ .setName(vppIfc.interfaceName)
+ .setKey(new InterfaceKey(vppIfc.interfaceName))
+ .setEnabled(vppIfc.adminUp == 1)
+ .setType(ifcType.getValue())
+ .build());
+ }
+ }
+
+ InstanceIdentifier<Interfaces> iid = InstanceIdentifier.create(Interfaces.class);
+ transaction.put(LogicalDatastoreType.CONFIGURATION, iid, new InterfacesBuilder().setInterface(ifcs).build());
+ LOG.info("Interface configuration sync ended with following interfaces: {}", ifcs);
+ }
+
/* operational data */
private void initVppOperational() {