From b1588a96b20d24ff377b3aebd6e730b49c5efaf0 Mon Sep 17 00:00:00 2001 From: Vishal Thapar Date: Fri, 1 May 2015 22:42:21 +0530 Subject: [PATCH 1/1] Interfacemgr: More APIs and calls to IdManager 1. Added getInterfaceEgressAction API 2. Added skeleton for different interface types 3. Added code to create IdPool and getId for IfIndex Pending: 1. Junits, Sonar and cleanup 2. Refactoring code to MDSALUtil Change-Id: If1f6330b04bdeee4b4f2ca4187bf64aa5b547e18 Signed-off-by: Vishal Thapar --- .../interfaces/IInterfaceManager.java | 2 + interfacemgr/interfacemgr-impl/pom.xml | 10 ++ .../interfacemgr/InterfaceManager.java | 117 +++++++++++++++--- .../interfacemgr/InterfacemgrProvider.java | 38 +++++- 4 files changed, 148 insertions(+), 19 deletions(-) diff --git a/interfacemgr/interfacemgr-api/src/main/java/org/opendaylight/vpnservice/interfacemgr/interfaces/IInterfaceManager.java b/interfacemgr/interfacemgr-api/src/main/java/org/opendaylight/vpnservice/interfacemgr/interfaces/IInterfaceManager.java index 95d1323b..2680e04e 100644 --- a/interfacemgr/interfacemgr-api/src/main/java/org/opendaylight/vpnservice/interfacemgr/interfaces/IInterfaceManager.java +++ b/interfacemgr/interfacemgr-api/src/main/java/org/opendaylight/vpnservice/interfacemgr/interfaces/IInterfaceManager.java @@ -1,6 +1,7 @@ package org.opendaylight.vpnservice.interfacemgr.interfaces; import java.util.List; +import org.opendaylight.vpnservice.mdsalutil.InstructionInfo; import org.opendaylight.vpnservice.mdsalutil.MatchInfo; public interface IInterfaceManager { @@ -9,5 +10,6 @@ public interface IInterfaceManager { public long getDpnForInterface(String ifName); public String getEndpointIpForDpn(long dpnId); public List getInterfaceIngressRule(String ifName); + public List getInterfaceEgressActions(String ifName); } \ No newline at end of file diff --git a/interfacemgr/interfacemgr-impl/pom.xml b/interfacemgr/interfacemgr-impl/pom.xml index eba9fc5a..a6c4b08b 100644 --- a/interfacemgr/interfacemgr-impl/pom.xml +++ b/interfacemgr/interfacemgr-impl/pom.xml @@ -45,6 +45,16 @@ and is available at http://www.eclipse.org/legal/epl-v10.html mdsalutil-api 0.0.1-SNAPSHOT + + org.opendaylight.vpnservice + idmanager-api + 0.0.1-SNAPSHOT + + + org.opendaylight.vpnservice + idmanager-impl + 0.0.1-SNAPSHOT + junit 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 4d7e509b..1130e67a 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,8 +7,28 @@ */ package org.opendaylight.vpnservice.interfacemgr; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType; + +import org.opendaylight.vpnservice.mdsalutil.InstructionType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.Mpls; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfMpls; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfStackedVlan; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.StackedVlan; +import org.opendaylight.vpnservice.mdsalutil.InstructionInfo; +import org.opendaylight.vpnservice.mdsalutil.ActionInfo; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.Pools; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.pools.IdPool; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.pools.IdPoolKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.pools.id.pool.GeneratedIds; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInput; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.idmanager.IdManager; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL2vlan; - import java.util.ArrayList; import org.opendaylight.vpnservice.mdsalutil.MatchFieldType; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan; @@ -53,6 +73,7 @@ public class InterfaceManager extends AbstractDataChangeListener impl private static final Logger LOG = LoggerFactory.getLogger(InterfaceManager.class); private ListenerRegistration listenerRegistration; private final DataBroker broker; + private final IdManager idManager; private final Map mapNcToInterfaceName = new ConcurrentHashMap<>(); private final Map dbDpnEndpoints = new ConcurrentHashMap<>(); @@ -67,9 +88,10 @@ public class InterfaceManager extends AbstractDataChangeListener impl }; }; - public InterfaceManager(final DataBroker db) { + public InterfaceManager(final DataBroker db, final IdManager idmgr) { super(Interface.class); broker = db; + idManager = idmgr; registerListener(db); } @@ -138,9 +160,11 @@ public class InterfaceManager extends AbstractDataChangeListener impl ncId = nodeConn.getId(); } mapNcToInterfaceName.put(ncId, interf.getName()); - if(interf.getType().getClass().isInstance(L3tunnel.class)) { + LOG.info("interf.getType(: {}",interf.getType()); + if(interf.getType().isInstance(L3tunnel.class)) { NodeId nodeId = getNodeIdFromNodeConnectorId(ncId); IfL3tunnel l3Tunnel = interf.getAugmentation(IfL3tunnel.class); + LOG.info("l3Tunnel: {}",l3Tunnel); this.dbDpnEndpoints.put(nodeId, l3Tunnel.getLocalIp().getIpv4Address().getValue()); } } @@ -165,13 +189,13 @@ public class InterfaceManager extends AbstractDataChangeListener impl new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); if(!stateIf.isPresent()) { // TODO: Get interface-id from IdManager + String ifName = interf.getName(); 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(getOperStatus(nodeConn)); - ifaceBuilder.setIfIndex(200).setName(interf.getName()).setType(interf.getType()); - ifaceBuilder.setKey(getStateInterfaceKeyFromName(interf.getName())); - //ifaceBuilder.setStatistics(createStatistics(interf.getName(), nodeConn)); + ifaceBuilder.setIfIndex(getIfIndex(ifName)).setName(ifName).setType(interf.getType()); + ifaceBuilder.setKey(getStateInterfaceKeyFromName(ifName)); stateIface = ifaceBuilder.build(); LOG.trace("Adding stateIface {} and id {} to OPERATIONAL DS", stateIface, id); asyncWrite(LogicalDatastoreType.OPERATIONAL, id, stateIface, DEFAULT_CALLBACK); @@ -204,6 +228,45 @@ public class InterfaceManager extends AbstractDataChangeListener impl } */ + private Integer getIfIndex(String ifName) { + GetUniqueIdInput getIdInput = new GetUniqueIdInputBuilder() + .setPoolName("interfaces").setIdKey(ifName) + .build(); + //TODO: Proper error handling once IdManager code is complete + try { + Future> result = idManager.getUniqueId(getIdInput); + RpcResult rpcResult = result.get(); + return rpcResult.getResult().getIdValue().intValue(); + } catch (NullPointerException | InterruptedException | ExecutionException e) { + LOG.trace("",e); + } + /* This currently returns null, so let us get it from IdManager DS + * TODO: Start-delete-me + */ + + InstanceIdentifier.InstanceIdentifierBuilder idBuilder = + InstanceIdentifier.builder(Pools.class).child(IdPool.class, new IdPoolKey("interfaces")); + InstanceIdentifier id = idBuilder.build(); + Optional globalPool = read(LogicalDatastoreType.OPERATIONAL, id); + Long newIdValue = null; + if (globalPool.isPresent()) { + IdPool pool = globalPool.get(); + List generatedIds = pool.getGeneratedIds(); + if ((generatedIds != null) && !generatedIds.isEmpty()) { + for (GeneratedIds gen_id : generatedIds) { + if (gen_id.getIdKey().equals(ifName)) { + newIdValue = gen_id.getIdValue(); + LOG.debug("Id {} found for interface %s ", newIdValue, ifName); + return newIdValue.intValue(); + } + } + } + } + //TODO: End-delete-me + LOG.debug("Unable to get valid ifIndex for interface {}", ifName); + return 65535; + } + private OperStatus getOperStatus(NodeConnector nodeConn) { LOG.trace("nodeConn is {}", nodeConn); if(nodeConn == null) { @@ -251,9 +314,9 @@ public class InterfaceManager extends AbstractDataChangeListener impl NodeConnectorId ncId = getNodeConnectorIdFromInterface(delInterface); if(ncId != null) { mapNcToInterfaceName.remove(ncId); - if(delInterface.getType().getClass().isInstance(L3tunnel.class)) { + if(delInterface.getType().isInstance(L3tunnel.class)) { Node node = getNodeFromDataStore(delInterface); - if(node.getNodeConnector().isEmpty()) { + if((node != null) &&(node.getNodeConnector().isEmpty())) { this.dbDpnEndpoints.remove(node.getId()); } } @@ -291,7 +354,7 @@ public class InterfaceManager extends AbstractDataChangeListener impl if(nc != null) { // Name doesn't change. Is it present in update? mapNcToInterfaceName.put(nc.getId(), original.getName()); - if(interf.getType().getClass().isInstance(L3tunnel.class)) { + if(interf.getType().isInstance(L3tunnel.class)) { NodeId nodeId = getNodeIdFromNodeConnectorId(nc.getId()); IfL3tunnel l3Tunnel = interf.getAugmentation(IfL3tunnel.class); this.dbDpnEndpoints.put(nodeId, l3Tunnel.getLocalIp().getIpv4Address().getValue()); @@ -425,7 +488,7 @@ public class InterfaceManager extends AbstractDataChangeListener impl List getInterfaceIngressRule(String ifName){ Interface iface = getInterfaceByIfName(ifName); List matches = new ArrayList(); - Class ifType = iface.getType().getClass(); + Class ifType = iface.getType(); long dpn = this.getDpnForInterface(ifName); long portNo = this.getPortNumForInterface(iface).longValue(); matches.add(new MatchInfo(MatchFieldType.in_port, new long[] {dpn, portNo})); @@ -433,14 +496,40 @@ public class InterfaceManager extends AbstractDataChangeListener impl IfL2vlan vlanIface = iface.getAugmentation(IfL2vlan.class); matches.add(new MatchInfo(MatchFieldType.vlan_vid, new long[] {vlanIface.getVlanId().longValue()})); - return matches; + LOG.trace("L2Vlan: {}",vlanIface); } else if (ifType.isInstance(L3tunnel.class)) { //TODO: Handle different tunnel types - return matches; + IfL3tunnel ifL3Tunnel = iface.getAugmentation(IfL3tunnel.class); + Class tunnType = ifL3Tunnel.getTunnelType(); + LOG.trace("L3Tunnel: {}",ifL3Tunnel); + } else if (ifType.isInstance(StackedVlan.class)) { + IfStackedVlan ifStackedVlan = iface.getAugmentation(IfStackedVlan.class); + LOG.trace("StackedVlan: {}",ifStackedVlan); + } else if (ifType.isInstance(Mpls.class)) { + IfMpls ifMpls = iface.getAugmentation(IfMpls.class); + LOG.trace("Mpls: {}",ifMpls); } - return null; + return matches; } + public List getInterfaceEgressActions(String ifName) { + Interface iface = getInterfaceByIfName(ifName); + + List instructions = new ArrayList(); + List actionInfos = new ArrayList(); + Class ifType = iface.getType().getClass(); + long dpn = this.getDpnForInterface(ifName); + long portNo = this.getPortNumForInterface(iface).longValue(); + instructions.add(new InstructionInfo(InstructionType.apply_actions, + actionInfos)); + /*TODO: Refer getInterfaceIngressRules on how to get interface details + for different types + */ + + + return instructions; + } + private String getDpnFromNodeConnectorId(NodeConnectorId portId) { /* * NodeConnectorId is of form 'openflow:dpnid:portnum' @@ -468,5 +557,5 @@ public class InterfaceManager extends AbstractDataChangeListener impl } return null; } - + } diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java index 8a267a24..6489d10c 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java @@ -7,12 +7,16 @@ */ package org.opendaylight.vpnservice.interfacemgr; +import org.opendaylight.vpnservice.mdsalutil.InstructionInfo; + +import java.util.concurrent.Future; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.idmanager.IdManager; +import java.math.BigInteger; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInput; import java.util.List; import org.opendaylight.vpnservice.mdsalutil.MatchInfo; - -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; @@ -26,14 +30,17 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable private InterfaceManager interfaceManager; private IfmNodeConnectorListener ifmNcListener; + private IdManager idManager; @Override public void onSessionInitiated(ProviderContext session) { LOG.info("InterfacemgrProvider Session Initiated"); try { final DataBroker dataBroker = session.getSALService(DataBroker.class); - interfaceManager = new InterfaceManager(dataBroker); + idManager = new IdManager(dataBroker); + interfaceManager = new InterfaceManager(dataBroker, idManager); ifmNcListener = new IfmNodeConnectorListener(dataBroker, interfaceManager); + createIdPool(); } catch (Exception e) { LOG.error("Error initializing services", e); } @@ -41,6 +48,22 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable LOG.info("Interfacemgr services initiated"); } + private void createIdPool() { + CreateIdPoolInput createPool = new CreateIdPoolInputBuilder() + .setPoolName("interfaces") + .setIdStart(1L) + .setPoolSize(new BigInteger("65535")) + .build(); + //TODO: Error handling + Future> result = idManager.createIdPool(createPool); +// try { +// LOG.info("Result2: {}",result.get()); +// } catch (InterruptedException | ExecutionException e) { +// // TODO Auto-generated catch block +// LOG.error("Error in result.get"); +// } + } + @Override public void close() throws Exception { LOG.info("InterfacemgrProvider Closed"); @@ -67,4 +90,9 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable public List getInterfaceIngressRule(String ifName) { return interfaceManager.getInterfaceIngressRule(ifName); } + + @Override + public List getInterfaceEgressActions(String ifName) { + return interfaceManager.getInterfaceEgressActions(ifName); + } } -- 2.36.6