From 99b25a646fcff77b4e4705a05c2a16f2cf380c1e Mon Sep 17 00:00:00 2001 From: Vishal Thapar Date: Thu, 16 Apr 2015 09:12:09 +0530 Subject: [PATCH] Update interfaces:state operational DataStore 1. Added code to update interfaces:state Operational DataStore on interfaces config changes. Change-Id: Id38cbdd87729e48fdfad23741157ba9cb3614e32 Signed-off-by: Vishal Thapar --- .../interfacemgr/InterfaceManager.java | 82 +++++++++++++++++-- 1 file changed, 74 insertions(+), 8 deletions(-) diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfaceManager.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfaceManager.java index b8920bab..3ba00f57 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfaceManager.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfaceManager.java @@ -7,6 +7,17 @@ */ package org.opendaylight.vpnservice.interfacemgr; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder; + +import java.math.BigInteger; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state._interface.StatisticsBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state._interface.Statistics; +import com.google.common.util.concurrent.Futures; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState; import com.google.common.util.concurrent.FutureCallback; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.BaseIds; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey; @@ -89,12 +100,22 @@ public class InterfaceManager extends AbstractDataChangeListener impl //TODO Make this generic and move to AbstractDataChangeListener or Utils. final InterfaceKey key = identifier.firstKeyOf(Interface.class, InterfaceKey.class); String interfaceName = key.getName(); - InstanceIdentifierBuilder idBuilder = + InstanceIdentifierBuilder idBuilder = InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey(interfaceName)); InstanceIdentifier id = idBuilder.build(); return id; } + private InstanceIdentifier buildStateInterfaceId(String interfaceName) { + //TODO Make this generic and move to AbstractDataChangeListener or Utils. + InstanceIdentifierBuilder idBuilder = + InstanceIdentifier.builder(InterfacesState.class) + .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.class, + new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey(interfaceName)); + InstanceIdentifier id = idBuilder.build(); + return id; + } + private void addInterface(final InstanceIdentifier identifier, final Interface imgrInterface) { InstanceIdentifier id = buildId(identifier); @@ -102,14 +123,13 @@ public class InterfaceManager extends AbstractDataChangeListener impl if(port.isPresent()) { Interface interf = port.get(); NodeConnector nodeConn = getNodeConnectorFromInterface(interf); - updateInterfaceState(identifier, imgrInterface, interf); + updateInterfaceState(interf, nodeConn); /* TODO: * 1. Get interface-id from id manager * 2. Update interface-state with following: * admin-status = set to enable value * oper-status = Down [?] * if-index = interface-id - * * FIXME: * 1. Get operational data from node-connector-id? * @@ -117,10 +137,51 @@ public class InterfaceManager extends AbstractDataChangeListener impl } } - private void updateInterfaceState(InstanceIdentifier identifier, Interface imgrInterface, - Interface interf) { - // TODO Update InterfaceState - + private void updateInterfaceState(Interface interf, NodeConnector nodeConn) { + /* Update InterfaceState + * 1. Get interfaces-state Identifier + * 2. Add interface to interfaces-state/interface + * 3. Get interface-id from id manager + * 4. Update interface-state with following: + * admin-status = set to enable value + * oper-status = Down [?] + * if-index = interface-id + */ + InstanceIdentifier id = + buildStateInterfaceId(interf.getName()); + Optional stateIf = + read(LogicalDatastoreType.OPERATIONAL, id); + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface stateIface; + if(!stateIf.isPresent()) { + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); + // TODO: Get interface-id from IdManager + ifaceBuilder.setAdminStatus((interf.isEnabled()) ? org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus.Up : + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus.Down); + ifaceBuilder.setOperStatus(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Down); + ifaceBuilder.setIfIndex(200).setName(interf.getName()).setType(interf.getType()); + ifaceBuilder.setKey(getStateInterfaceKeyFromName(interf.getName())); + //ifaceBuilder.setStatistics(createStatistics(interf.getName(), nodeConn)); + stateIface = ifaceBuilder.build(); + LOG.trace("updating OPERATIONAL data store with stateIface {} and id {}", stateIface, id); + asyncWrite(LogicalDatastoreType.OPERATIONAL, id, stateIface, DEFAULT_CALLBACK); + } + } + + private Statistics createStatistics(String name, NodeConnector nodeConn) { + Counter64 init64 = new Counter64(new BigInteger("0000000000000000")); + Counter32 init32 = new Counter32((long) 0); + StatisticsBuilder statBuilder = new StatisticsBuilder(); + statBuilder.setDiscontinuityTime(new DateAndTime("2015-04-04T00:00:00Z")) + .setInBroadcastPkts(init64).setInDiscards(init32).setInErrors(init32).setInMulticastPkts(init64) + .setInOctets(init64).setInUnicastPkts(init64).setInUnknownProtos(init32).setOutBroadcastPkts(init64) + .setOutDiscards(init32).setOutErrors(init32).setOutMulticastPkts(init64).setOutOctets(init64) + .setOutUnicastPkts(init64); + return statBuilder.build(); + } + + private org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey getStateInterfaceKeyFromName( + String name) { + return new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey(name); } private NodeConnector getNodeConnectorFromInterface(Interface interf) { @@ -188,7 +249,12 @@ public class InterfaceManager extends AbstractDataChangeListener impl protected void update(InstanceIdentifier identifier, Interface original, Interface update) { LOG.trace("key: " + identifier + ", original=" + original + ", update=" + update ); updateInterface(identifier, original, update); - } + private void asyncWrite(LogicalDatastoreType datastoreType, + InstanceIdentifier path, T data, FutureCallback callback) { + WriteTransaction tx = broker.newWriteOnlyTransaction(); + tx.put(datastoreType, path, data, true); + Futures.addCallback(tx.submit(), callback); + } } -- 2.36.6