diff options
author | Maros Marsalek <mmarsale@cisco.com> | 2016-03-03 16:11:27 +0100 |
---|---|---|
committer | Maros Marsalek <mmarsale@cisco.com> | 2016-03-03 17:00:24 +0100 |
commit | 833ca1604774d927a9b2d3dd7ce38ea9b68c24d5 (patch) | |
tree | 91487759f1eb67652ef19195c02c845d9b1eee66 | |
parent | 40e3a99694badc0dddad2ddf900c17979c299dfd (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.java | 54 |
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() { |