X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=interfacemgr%2Finterfacemgr-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fvpnservice%2Finterfacemgr%2FInterfaceManager.java;h=bd643ba22527340bfd8ecb49a80ceb9abeb728eb;hb=b4b1b760287d5aa668c493b0a8f35e2ebae5ecd8;hp=ba531b6f25b20cb72fc51b48535f9570e1f4620b;hpb=ccb14a6b49f9f9514a32dbe17cb39c24c3ec76ed;p=vpnservice.git 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 ba531b6f..bd643ba2 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 @@ -10,12 +10,6 @@ package org.opendaylight.vpnservice.interfacemgr; import com.google.common.base.Optional; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; @@ -25,14 +19,13 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.idmanager.IdManager; import org.opendaylight.vpnservice.AbstractDataChangeListener; import org.opendaylight.vpnservice.mdsalutil.ActionInfo; -import org.opendaylight.vpnservice.mdsalutil.InstructionInfo; -import org.opendaylight.vpnservice.mdsalutil.InstructionType; +import org.opendaylight.vpnservice.mdsalutil.ActionType; import org.opendaylight.vpnservice.mdsalutil.MatchFieldType; import org.opendaylight.vpnservice.mdsalutil.MatchInfo; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.Tunnel; 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.InterfacesState; 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.InterfaceKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus; @@ -47,19 +40,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.N import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdOutput; -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.interfacemgr.rev150331.BaseIds; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL2vlan; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL3tunnel; -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.L3tunnel; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.Mpls; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.StackedVlan; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.*; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -68,6 +51,14 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + public class InterfaceManager extends AbstractDataChangeListener implements AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(InterfaceManager.class); private ListenerRegistration listenerRegistration; @@ -138,15 +129,6 @@ public class InterfaceManager extends AbstractDataChangeListener impl 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 interf) { @@ -159,10 +141,10 @@ public class InterfaceManager extends AbstractDataChangeListener impl ncId = nodeConn.getId(); } mapNcToInterfaceName.put(ncId, interf.getName()); - if(interf.getType().getClass().isInstance(L3tunnel.class)) { + if(interf.getType().isAssignableFrom(Tunnel.class)) { NodeId nodeId = getNodeIdFromNodeConnectorId(ncId); - IfL3tunnel l3Tunnel = interf.getAugmentation(IfL3tunnel.class); - dbDpnEndpoints.put(nodeId, l3Tunnel.getLocalIp().getIpv4Address().getValue()); + IfTunnel tunnel = interf.getAugmentation(IfTunnel.class); + dbDpnEndpoints.put(nodeId, tunnel.getTunnelSource().getIpv4Address().getValue()); LOG.trace("dbDpnEndpoints: {}",dbDpnEndpoints); } } @@ -179,7 +161,7 @@ public class InterfaceManager extends AbstractDataChangeListener impl * if-index = interface-id */ InstanceIdentifier id = - buildStateInterfaceId(interf.getName()); + IfmUtil.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; @@ -193,7 +175,7 @@ public class InterfaceManager extends AbstractDataChangeListener impl ifaceBuilder.setOperStatus(getOperStatus(nodeConn)); ifaceBuilder.setIfIndex(getIfIndex(ifName)).setName(ifName).setType(interf.getType()); - ifaceBuilder.setKey(getStateInterfaceKeyFromName(ifName)); + ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(ifName)); stateIface = ifaceBuilder.build(); LOG.trace("Adding stateIface {} and id {} to OPERATIONAL DS", stateIface, id); asyncWrite(LogicalDatastoreType.OPERATIONAL, id, stateIface, DEFAULT_CALLBACK); @@ -228,10 +210,8 @@ public class InterfaceManager extends AbstractDataChangeListener impl * 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); + InstanceIdentifier id = IfmUtil.getPoolId(IfmConstants.IFM_IDPOOL_NAME); + Optional globalPool = read(LogicalDatastoreType.OPERATIONAL, id ); Long newIdValue = null; if (globalPool.isPresent()) { IdPool pool = globalPool.get(); @@ -260,11 +240,6 @@ public class InterfaceManager extends AbstractDataChangeListener impl } } - 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 getNodeConnectorFromDataStore(Interface interf) { NodeConnectorId ncId = interf.getAugmentation(BaseIds.class).getOfPortId(); //TODO: Replace with MDSAL Util method @@ -289,7 +264,7 @@ public class InterfaceManager extends AbstractDataChangeListener impl private void delInterface(final InstanceIdentifier identifier, final Interface delInterface) { InstanceIdentifier id = - buildStateInterfaceId(delInterface.getName()); + IfmUtil.buildStateInterfaceId(delInterface.getName()); Optional stateIf = read(LogicalDatastoreType.OPERATIONAL, id); if(stateIf.isPresent()) { @@ -298,11 +273,10 @@ public class InterfaceManager extends AbstractDataChangeListener impl NodeConnectorId ncId = getNodeConnectorIdFromInterface(delInterface); if(ncId != null) { mapNcToInterfaceName.remove(ncId); - if(delInterface.getType().getClass().isInstance(L3tunnel.class)) { - Node node = getNodeFromDataStore(delInterface); - if((node != null) &&(node.getNodeConnector().isEmpty())) { - dbDpnEndpoints.remove(node.getId()); - } + if(delInterface.getType().isAssignableFrom(Tunnel.class)) { + NodeId nodeId = getNodeIdFromNodeConnectorId(ncId); + dbDpnEndpoints.remove(nodeId); + LOG.trace("dbDpnEndpoints: {}",dbDpnEndpoints); } } } @@ -338,10 +312,10 @@ 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().isAssignableFrom(Tunnel.class)) { NodeId nodeId = getNodeIdFromNodeConnectorId(nc.getId()); - IfL3tunnel l3Tunnel = interf.getAugmentation(IfL3tunnel.class); - dbDpnEndpoints.put(nodeId, l3Tunnel.getLocalIp().getIpv4Address().getValue()); + IfTunnel tunnel = interf.getAugmentation(IfTunnel.class); + dbDpnEndpoints.put(nodeId, tunnel.getTunnelSource().getIpv4Address().getValue()); LOG.trace("dbEndpoints: {}",dbDpnEndpoints); } } @@ -379,38 +353,37 @@ public class InterfaceManager extends AbstractDataChangeListener impl updateInterface(identifier, original, update); } - private void asyncWrite(LogicalDatastoreType datastoreType, + protected 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); + WriteTransaction tx = broker.newWriteOnlyTransaction(); + tx.put(datastoreType, path, data, true); + Futures.addCallback(tx.submit(), callback); } - private void asyncUpdate(LogicalDatastoreType datastoreType, + protected void asyncUpdate(LogicalDatastoreType datastoreType, InstanceIdentifier path, T data, FutureCallback callback) { - WriteTransaction tx = broker.newWriteOnlyTransaction(); - tx.merge(datastoreType, path, data, true); - Futures.addCallback(tx.submit(), callback); + WriteTransaction tx = broker.newWriteOnlyTransaction(); + tx.merge(datastoreType, path, data, true); + Futures.addCallback(tx.submit(), callback); } - private void asyncRemove(LogicalDatastoreType datastoreType, + protected void asyncRemove(LogicalDatastoreType datastoreType, InstanceIdentifier path, FutureCallback callback) { - WriteTransaction tx = broker.newWriteOnlyTransaction(); - tx.delete(datastoreType, path); - Futures.addCallback(tx.submit(), callback); + WriteTransaction tx = broker.newWriteOnlyTransaction(); + tx.delete(datastoreType, path); + Futures.addCallback(tx.submit(), callback); } void processPortAdd(NodeConnector port) { NodeConnectorId portId = port.getId(); FlowCapableNodeConnector ofPort = port.getAugmentation(FlowCapableNodeConnector.class); - LOG.debug("PortAdd: PortId { "+portId.getValue()+"} PortName {"+ofPort.getName()+"}"); + LOG.debug("PortAdd: PortId { " + portId.getValue() + "} PortName {" + ofPort.getName() + "}"); String ifName = this.mapNcToInterfaceName.get(portId); setInterfaceOperStatus(ifName, OperStatus.Up); } void processPortUpdate(NodeConnector oldPort, NodeConnector update) { //TODO: Currently nothing to do here. - LOG.trace("ifMap: {}, dpnMap: {}", mapNcToInterfaceName, dbDpnEndpoints); } void processPortDelete(NodeConnector port) { @@ -424,14 +397,14 @@ public class InterfaceManager extends AbstractDataChangeListener impl private void setInterfaceOperStatus(String ifName, OperStatus opStatus) { if (ifName != null) { InstanceIdentifier id = - buildStateInterfaceId(ifName); + IfmUtil.buildStateInterfaceId(ifName); Optional stateIf = read(LogicalDatastoreType.OPERATIONAL, id); org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface stateIface; 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(); if (stateIf.isPresent()) { - stateIface = ifaceBuilder.setOperStatus(opStatus).build(); + stateIface = ifaceBuilder.setOperStatus(opStatus).setKey(IfmUtil.getStateInterfaceKeyFromName(ifName)).build(); LOG.trace("Setting OperStatus for {} to {} in OPERATIONAL DS", ifName, opStatus); asyncUpdate(LogicalDatastoreType.OPERATIONAL, id, stateIface, DEFAULT_CALLBACK); } @@ -452,67 +425,126 @@ public class InterfaceManager extends AbstractDataChangeListener impl return getPortNumForInterface(iface); } - long getDpnForInterface(String ifName) { - Interface iface = getInterfaceByIfName(ifName); + Long getPortForInterface(Interface intrf) { try { - NodeConnector port = getNodeConnectorFromDataStore(iface); - //TODO: This should be an MDSAL Util method - return Long.parseLong(IfmUtil.getDpnFromNodeConnectorId(port.getId())); + NodeConnector port = getNodeConnectorFromDataStore(intrf); + NodeConnectorId id = null; + if(port == null) { + id = getNodeConnectorIdFromInterface(intrf); + } else { + id = port.getId(); + } + String portNo = IfmUtil.getPortNoFromNodeConnectorId(id); + return Long.parseLong(portNo); } catch (NullPointerException e) { - LOG.error("OFPort for Interface {} not found", ifName); + LOG.error("Port for Interface {} not found", intrf.getName(), e); } return 0L; } - String getEndpointIpForDpn(long dpnId) { + public BigInteger getDpnForInterface(Interface intrf) { + try { + NodeConnector port = getNodeConnectorFromDataStore(intrf); + NodeConnectorId id = null; + if(port == null) { + id = getNodeConnectorIdFromInterface(intrf); + } else { + id = port.getId(); + } + //TODO: This should be an MDSAL Util method + return new BigInteger(IfmUtil.getDpnFromNodeConnectorId(id)); + } catch (NullPointerException e) { + LOG.error("dpn for Interface {} not found", intrf.getName(), e); + } + return BigInteger.ZERO; + } + + BigInteger getDpnForInterface(String ifName) { + Interface iface = getInterfaceByIfName(ifName); + if(iface != null) { + return getDpnForInterface(iface); + } + LOG.error("Interface {} doesn't exist", ifName); + return BigInteger.ZERO; + } + + String getEndpointIpForDpn(BigInteger dpnId) { //TODO: This should be MDSAL Util function NodeId dpnNodeId = IfmUtil.buildDpnNodeId(dpnId); return dbDpnEndpoints.get(dpnNodeId); } - List getInterfaceIngressRule(String ifName){ + List getInterfaceIngressRule(String ifName) { Interface iface = getInterfaceByIfName(ifName); List matches = new ArrayList(); Class ifType = iface.getType(); - long dpn = this.getDpnForInterface(ifName); + BigInteger dpn = this.getDpnForInterface(ifName); long portNo = this.getPortNumForInterface(iface).longValue(); - matches.add(new MatchInfo(MatchFieldType.in_port, new long[] {dpn, portNo})); - if(ifType.getClass().isInstance(L2vlan.class)) { + matches.add(new MatchInfo(MatchFieldType.in_port, new BigInteger[] {dpn, BigInteger.valueOf(portNo)})); + + if (ifType.isInstance(L2vlan.class)) { IfL2vlan vlanIface = iface.getAugmentation(IfL2vlan.class); - matches.add(new MatchInfo(MatchFieldType.vlan_vid, - new long[] {vlanIface.getVlanId().longValue()})); - LOG.trace("L2Vlan: {}",vlanIface); - } else if (ifType.getClass().isInstance(L3tunnel.class)) { + long vlanVid = vlanIface.getVlanId().getValue().longValue(); + if (vlanVid != 0) { + matches.add(new MatchInfo(MatchFieldType.vlan_vid, + new long[] {vlanVid})); + LOG.trace("L2Vlan: {}",vlanIface); + } + } else if (ifType.isInstance(Tunnel.class)) { //TODO: Handle different tunnel types - IfL3tunnel ifL3Tunnel = iface.getAugmentation(IfL3tunnel.class); - Class tunnType = ifL3Tunnel.getTunnelType(); - LOG.trace("L3Tunnel: {}",ifL3Tunnel); - } else if (ifType.getClass().isInstance(StackedVlan.class)) { + IfTunnel ifTunnel = iface.getAugmentation(IfTunnel.class); + Class tunnType = ifTunnel.getTunnelInterfaceType(); + LOG.trace("L3Tunnel: {}",ifTunnel); + } else if (ifType.isAssignableFrom(StackedVlan.class)) { IfStackedVlan ifStackedVlan = iface.getAugmentation(IfStackedVlan.class); LOG.trace("StackedVlan: {}",ifStackedVlan); - } else if (ifType.getClass().isInstance(Mpls.class)) { + } else if (ifType.isAssignableFrom(Mpls.class)) { IfMpls ifMpls = iface.getAugmentation(IfMpls.class); LOG.trace("Mpls: {}",ifMpls); } return matches; } - public List getInterfaceEgressActions(String ifName) { + public List getInterfaceEgressActions(String ifName) { Interface iface = getInterfaceByIfName(ifName); - List instructions = new ArrayList(); - List actionInfos = new ArrayList(); + List listActionInfo = new ArrayList(); Class ifType = iface.getType(); - long dpn = this.getDpnForInterface(ifName); + BigInteger 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 - */ - + if (iface.isEnabled()) { + + if(ifType.isAssignableFrom(L2vlan.class)) { + IfL2vlan vlanIface = iface.getAugmentation(IfL2vlan.class); + LOG.trace("L2Vlan: {}",vlanIface); + long vlanVid = (vlanIface == null) ? 0 : vlanIface.getVlanId().getValue().longValue(); + if (vlanVid != 0) { + listActionInfo.add(new ActionInfo(ActionType.push_vlan, new String[] {})); + listActionInfo.add(new ActionInfo(ActionType.set_field_vlan_vid, + new String[] { Long.toString(vlanVid) })); + } + listActionInfo.add(new ActionInfo(ActionType.output, new String[] { Long.toString(portNo)})); + + } else if (ifType.isAssignableFrom(Tunnel.class)) { + //TODO: Handle different tunnel types + IfTunnel ifTunnel = iface.getAugmentation(IfTunnel.class); + Class tunnType = ifTunnel.getTunnelInterfaceType(); + LOG.trace("L3Tunnel: {}",ifTunnel); + //TODO: check switch_type and configure accordingly + listActionInfo.add(new ActionInfo(ActionType.output, new String[] { Long.toString(portNo)})); + + } else if (ifType.isAssignableFrom(StackedVlan.class)) { + IfStackedVlan ifStackedVlan = iface.getAugmentation(IfStackedVlan.class); + LOG.trace("StackedVlan: {}",ifStackedVlan); + // TODO: TBD + } else if (ifType.isAssignableFrom(Mpls.class)) { + IfMpls ifMpls = iface.getAugmentation(IfMpls.class); + LOG.trace("Mpls: {}",ifMpls); + // TODO: TBD + } + } + return listActionInfo; - return instructions; } private NodeId getNodeIdFromNodeConnectorId(NodeConnectorId ncId) { @@ -527,7 +559,7 @@ public class InterfaceManager extends AbstractDataChangeListener impl } catch (Exception e) { LOG.error("OFPort for Interface {} not found", iface.getName()); } - return null; + return 0L; } }