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=8f0a4aa381c96369ef4d46952e6d783ad497e407;hb=7cecb2563e0ae0f68015a3b8b0495e7ea9881080;hp=1130e67a395dac5eb8dbea6caeea4a8b623d14f8;hpb=b1588a96b20d24ff377b3aebd6e730b49c5efaf0;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 1130e67a..8f0a4aa3 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,67 +7,68 @@ */ 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 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.yangtools.yang.common.RpcResult; + +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; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; 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.AbstractDataChangeListener; +import org.opendaylight.vpnservice.mdsalutil.ActionInfo; +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 java.util.List; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL3tunnel; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.L3tunnel; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +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; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; -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; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; -import org.opendaylight.vpnservice.AbstractDataChangeListener; -import org.opendaylight.vpnservice.mdsalutil.MatchInfo; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; +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.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; -import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; -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.interfaces.Interface; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; +import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Optional; public class InterfaceManager extends AbstractDataChangeListener implements AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(InterfaceManager.class); @@ -85,7 +86,7 @@ public class InterfaceManager extends AbstractDataChangeListener impl public void onFailure(Throwable error) { LOG.error("Error in Datastore write operation", error); - }; + } }; public InterfaceManager(final DataBroker db, final IdManager idmgr) { @@ -139,10 +140,13 @@ public class InterfaceManager extends AbstractDataChangeListener impl return id; } - private InstanceIdentifier buildStateInterfaceId(String interfaceName) { + private InstanceIdentifier + + buildStateInterfaceId(String interfaceName) { //TODO Make this generic and move to AbstractDataChangeListener or Utils. - InstanceIdentifierBuilder idBuilder = - InstanceIdentifier.builder(InterfacesState.class) + 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(); @@ -160,12 +164,11 @@ public class InterfaceManager extends AbstractDataChangeListener impl ncId = nodeConn.getId(); } mapNcToInterfaceName.put(ncId, interf.getName()); - LOG.info("interf.getType(: {}",interf.getType()); - if(interf.getType().isInstance(L3tunnel.class)) { + if(interf.getType().getClass().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()); + dbDpnEndpoints.put(nodeId, l3Tunnel.getLocalIp().getIpv4Address().getValue()); + LOG.trace("dbDpnEndpoints: {}",dbDpnEndpoints); } } @@ -214,23 +217,9 @@ public class InterfaceManager extends AbstractDataChangeListener impl } } - /* - private void setAugmentations( - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder, - InstanceIdentifier identifier, Interface interf) { - // TODO Add code for all augmentations - InstanceIdentifier ifL3TunnelPath = identifier.augmentation(IfL3tunnel.class); - Optional l3Tunnel = read(LogicalDatastoreType.CONFIGURATION, ifL3TunnelPath); - String ifName = interf.getName(); - if(l3Tunnel.isPresent()) { - l3Tunnel.get(); - } - } - */ - private Integer getIfIndex(String ifName) { GetUniqueIdInput getIdInput = new GetUniqueIdInputBuilder() - .setPoolName("interfaces").setIdKey(ifName) + .setPoolName(IfmConstants.IFM_IDPOOL_NAME).setIdKey(ifName) .build(); //TODO: Proper error handling once IdManager code is complete try { @@ -264,7 +253,7 @@ public class InterfaceManager extends AbstractDataChangeListener impl } //TODO: End-delete-me LOG.debug("Unable to get valid ifIndex for interface {}", ifName); - return 65535; + return IfmConstants.DEFAULT_IFINDEX; } private OperStatus getOperStatus(NodeConnector nodeConn) { @@ -314,10 +303,10 @@ public class InterfaceManager extends AbstractDataChangeListener impl NodeConnectorId ncId = getNodeConnectorIdFromInterface(delInterface); if(ncId != null) { mapNcToInterfaceName.remove(ncId); - if(delInterface.getType().isInstance(L3tunnel.class)) { + if(delInterface.getType().getClass().isInstance(L3tunnel.class)) { Node node = getNodeFromDataStore(delInterface); if((node != null) &&(node.getNodeConnector().isEmpty())) { - this.dbDpnEndpoints.remove(node.getId()); + dbDpnEndpoints.remove(node.getId()); } } } @@ -354,10 +343,11 @@ 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().isInstance(L3tunnel.class)) { + if(interf.getType().getClass().isInstance(L3tunnel.class)) { NodeId nodeId = getNodeIdFromNodeConnectorId(nc.getId()); IfL3tunnel l3Tunnel = interf.getAugmentation(IfL3tunnel.class); - this.dbDpnEndpoints.put(nodeId, l3Tunnel.getLocalIp().getIpv4Address().getValue()); + dbDpnEndpoints.put(nodeId, l3Tunnel.getLocalIp().getIpv4Address().getValue()); + LOG.trace("dbEndpoints: {}",dbDpnEndpoints); } } } @@ -472,7 +462,7 @@ public class InterfaceManager extends AbstractDataChangeListener impl try { NodeConnector port = getNodeConnectorFromDataStore(iface); //TODO: This should be an MDSAL Util method - return Long.parseLong(getDpnFromNodeConnectorId(port.getId())); + return Long.parseLong(IfmUtil.getDpnFromNodeConnectorId(port.getId())); } catch (NullPointerException e) { LOG.error("OFPort for Interface {} not found", ifName); } @@ -481,66 +471,81 @@ public class InterfaceManager extends AbstractDataChangeListener impl String getEndpointIpForDpn(long dpnId) { //TODO: This should be MDSAL Util function - NodeId dpnNodeId = buildDpnNodeId(dpnId); + 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); long portNo = this.getPortNumForInterface(iface).longValue(); matches.add(new MatchInfo(MatchFieldType.in_port, new long[] {dpn, portNo})); - if(ifType.isInstance(L2vlan.class)) { + 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); + long vlanVid = vlanIface.getVlanId().longValue(); + if (vlanVid != 0) { + matches.add(new MatchInfo(MatchFieldType.vlan_vid, + new long[] {vlanVid})); + LOG.trace("L2Vlan: {}",vlanIface); + } } else if (ifType.isInstance(L3tunnel.class)) { //TODO: Handle different tunnel types IfL3tunnel ifL3Tunnel = iface.getAugmentation(IfL3tunnel.class); Class tunnType = ifL3Tunnel.getTunnelType(); LOG.trace("L3Tunnel: {}",ifL3Tunnel); - } else if (ifType.isInstance(StackedVlan.class)) { + } else if (ifType.getClass().isInstance(StackedVlan.class)) { IfStackedVlan ifStackedVlan = iface.getAugmentation(IfStackedVlan.class); LOG.trace("StackedVlan: {}",ifStackedVlan); - } else if (ifType.isInstance(Mpls.class)) { + } else if (ifType.getClass().isInstance(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(); - Class ifType = iface.getType().getClass(); + List listActionInfo = new ArrayList(); + Class ifType = iface.getType(); 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 - */ + if (iface.isEnabled()) { - return instructions; - } - - private String getDpnFromNodeConnectorId(NodeConnectorId portId) { - /* - * NodeConnectorId is of form 'openflow:dpnid:portnum' - */ - String[] split = portId.getValue().split(":"); - return split[1]; - } + if(ifType.isInstance(L2vlan.class)) { + IfL2vlan vlanIface = iface.getAugmentation(IfL2vlan.class); + long vlanVid = vlanIface.getVlanId(); + LOG.trace("L2Vlan: {}",vlanIface); + 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.isInstance(L3tunnel.class)) { + //TODO: Handle different tunnel types + IfL3tunnel ifL3Tunnel = iface.getAugmentation(IfL3tunnel.class); + Class tunnType = ifL3Tunnel.getTunnelType(); + LOG.trace("L3Tunnel: {}",ifL3Tunnel); + //TODO: check switch_type and configure accordingly + listActionInfo.add(new ActionInfo(ActionType.output, new String[] { Long.toString(portNo)})); + + } else if (ifType.isInstance(StackedVlan.class)) { + IfStackedVlan ifStackedVlan = iface.getAugmentation(IfStackedVlan.class); + LOG.trace("StackedVlan: {}",ifStackedVlan); + // TBD + } else if (ifType.isInstance(Mpls.class)) { + IfMpls ifMpls = iface.getAugmentation(IfMpls.class); + LOG.trace("Mpls: {}",ifMpls); + // TBD + } + } + return listActionInfo; - private NodeId buildDpnNodeId(long dpnId) { - // TODO Auto-generated method stub - return new NodeId("openflow:" + dpnId); } private NodeId getNodeIdFromNodeConnectorId(NodeConnectorId ncId) {