From ff50887efd3e49baa83d8b36a782ab0d139d4976 Mon Sep 17 00:00:00 2001 From: Faseela K Date: Mon, 30 Nov 2015 16:45:30 +0530 Subject: [PATCH] - Adding tunnel-type-mpls-over-gre for distinguishing internal vs external tunnels - Fixing NPE during pre-provisioning of ovs tunnel ports - Adding two new RPCs in interface manager needed by vpnservice Change-Id: Ied0cf95c7bf5aa1963cb5c5778e4af8edf27753c Signed-off-by: Faseela K --- .../src/main/yang/odl-interface-rpc.yang | 65 ++++++----- .../src/main/yang/odl-interface.yang | 5 + .../OvsInterfaceConfigAddHelper.java | 32 +++--- .../InterfaceManagerRpcService.java | 106 +++++------------- 4 files changed, 90 insertions(+), 118 deletions(-) diff --git a/interfacemgr/interfacemgr-api/src/main/yang/odl-interface-rpc.yang b/interfacemgr/interfacemgr-api/src/main/yang/odl-interface-rpc.yang index 0e4efca0..88ce5ac6 100644 --- a/interfacemgr/interfacemgr-api/src/main/yang/odl-interface-rpc.yang +++ b/interfacemgr/interfacemgr-api/src/main/yang/odl-interface-rpc.yang @@ -10,6 +10,14 @@ module odl-interface-rpc { prefix odlif; revision-date 2015-03-31; } + import opendaylight-inventory { + prefix inv; revision-date 2013-08-19; + } + + import ietf-interfaces { + prefix if; revision-date 2014-05-08; + } + import opendaylight-action-types {prefix action;} import opendaylight-flow-types {prefix offlow;revision-date "2013-10-26";} @@ -53,33 +61,6 @@ module odl-interface-rpc { } } - rpc get-interface-from-port { - description "used to retrieve interface from port details"; - input { - leaf interface-type { - description "Type of the interface (vlan/gre or vxlan tunnel)"; - type identityref { - base odlif:tunnel-type-base; - } - } - leaf dpid { - type uint64; - } - leaf portno { - type uint32; - } - leaf interface-id { - description "Used to provide the interface specific differentiator information (vlanId/gre-key/vxlan-vni)"; - type uint64; - } - } - output { - leaf interface-name { - type string; - } - } - } - rpc get-egress-actions-for-interface { description "used to retrieve group actions to use from interface name"; input { @@ -117,4 +98,34 @@ module odl-interface-rpc { } } } + + rpc get-interface-type { + description "to get the type of the interface(vlan/vxlan or gre)"; + input { + leaf intf-name { + type string; + } + } + output { + leaf interface-type { + type identityref { + base if:interface-type; + } + } + } + } + + rpc get-nodeconnector-id-from-interface { + description "to get nodeconnector id associated with an interface"; + input { + leaf intf-name { + type string; + } + } + output { + leaf nodeconnector-id { + type inv:node-connector-id; + } + } + } } \ No newline at end of file diff --git a/interfacemgr/interfacemgr-api/src/main/yang/odl-interface.yang b/interfacemgr/interfacemgr-api/src/main/yang/odl-interface.yang index 38405be0..9f6308e3 100644 --- a/interfacemgr/interfacemgr-api/src/main/yang/odl-interface.yang +++ b/interfacemgr/interfacemgr-api/src/main/yang/odl-interface.yang @@ -70,6 +70,11 @@ module odl-interface { base tunnel-type-base; } + identity tunnel-type-mpls-over-gre { + description "Tunnel type for mpls over gre tunnels"; + base tunnel-type-base; + } + /* base/common properties */ augment "/if:interfaces/if:interface" { status deprecated; diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java index 49f5da22..8a03e5e1 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java @@ -139,11 +139,6 @@ public class OvsInterfaceConfigAddHelper { createBridgeEntryIfNotPresent(dpId, dataBroker, t); - BridgeRefEntryKey BridgeRefEntryKey = new BridgeRefEntryKey(dpId); - InstanceIdentifier dpnBridgeEntryIid = - InterfaceMetaUtils.getBridgeRefEntryIdentifier(BridgeRefEntryKey); - BridgeRefEntry bridgeRefEntry = - InterfaceMetaUtils.getBridgeRefEntryFromOperDS(dpnBridgeEntryIid, dataBroker); BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpId); BridgeInterfaceEntryKey bridgeInterfaceEntryKey = new BridgeInterfaceEntryKey(interfaceNew.getName()); @@ -152,15 +147,24 @@ public class OvsInterfaceConfigAddHelper { interfaceNew.getName(), t); futures.add(t.submit()); - InstanceIdentifier bridgeIid = - (InstanceIdentifier)bridgeRefEntry.getBridgeReference().getValue(); - Optional bridgeNodeOptional = - IfmUtil.read(LogicalDatastoreType.OPERATIONAL, bridgeIid, dataBroker); - if (bridgeNodeOptional.isPresent()) { - OvsdbBridgeAugmentation ovsdbBridgeAugmentation = bridgeNodeOptional.get(); - String bridgeName = ovsdbBridgeAugmentation.getBridgeName().getValue(); - SouthboundUtils.addPortToBridge(bridgeIid, interfaceNew, - ovsdbBridgeAugmentation, bridgeName, interfaceNew.getName(), dataBroker, futures); + // create bridge on switch, if switch is connected + BridgeRefEntryKey BridgeRefEntryKey = new BridgeRefEntryKey(dpId); + InstanceIdentifier dpnBridgeEntryIid = + InterfaceMetaUtils.getBridgeRefEntryIdentifier(BridgeRefEntryKey); + BridgeRefEntry bridgeRefEntry = + InterfaceMetaUtils.getBridgeRefEntryFromOperDS(dpnBridgeEntryIid, dataBroker); + if(bridgeRefEntry != null && bridgeRefEntry.getBridgeReference() != null) { + LOG.debug("creating bridge interface on dpn {}", bridgeEntryKey); + InstanceIdentifier bridgeIid = + (InstanceIdentifier) bridgeRefEntry.getBridgeReference().getValue(); + Optional bridgeNodeOptional = + IfmUtil.read(LogicalDatastoreType.OPERATIONAL, bridgeIid, dataBroker); + if (bridgeNodeOptional.isPresent()) { + OvsdbBridgeAugmentation ovsdbBridgeAugmentation = bridgeNodeOptional.get(); + String bridgeName = ovsdbBridgeAugmentation.getBridgeName().getValue(); + SouthboundUtils.addPortToBridge(bridgeIid, interfaceNew, + ovsdbBridgeAugmentation, bridgeName, interfaceNew.getName(), dataBroker, futures); + } } } diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/rpcservice/InterfaceManagerRpcService.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/rpcservice/InterfaceManagerRpcService.java index fbf86df8..a2d26912 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/rpcservice/InterfaceManagerRpcService.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/rpcservice/InterfaceManagerRpcService.java @@ -135,6 +135,24 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService { return Futures.immediateFuture(rpcResultBuilder.build()); } + @Override + public Future> getInterfaceType(GetInterfaceTypeInput input) { + String interfaceName = input.getIntfName(); + RpcResultBuilder rpcResultBuilder; + try { + InterfaceKey interfaceKey = new InterfaceKey(interfaceName); + Interface interfaceInfo = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(interfaceKey, dataBroker); + + GetInterfaceTypeOutputBuilder output = new GetInterfaceTypeOutputBuilder().setInterfaceType(interfaceInfo.getType()); + rpcResultBuilder = RpcResultBuilder.success(); + rpcResultBuilder.withResult(output.build()); + } catch (Exception e) { + LOG.error("Retrieval of interface type for the key {} failed due to {}", interfaceName, e); + rpcResultBuilder = RpcResultBuilder.failed(); + } + return Futures.immediateFuture(rpcResultBuilder.build()); + } + @Override public Future> getEgressActionsForInterface(GetEgressActionsForInterfaceInput input) { RpcResultBuilder rpcResultBuilder; @@ -151,25 +169,6 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService { return Futures.immediateFuture(rpcResultBuilder.build()); } - public static InstanceIdentifier getInterfaceChildEntryIdentifier(InterfaceParentEntryKey parentEntryKey, InterfaceChildEntryKey interfaceChildEntryKey) { - InstanceIdentifier.InstanceIdentifierBuilder interfaceChildEntryInstanceIdentifierBuilder = - InstanceIdentifier.builder(InterfaceChildInfo.class).child(InterfaceParentEntry.class, parentEntryKey).child(InterfaceChildEntry.class, interfaceChildEntryKey); - return interfaceChildEntryInstanceIdentifierBuilder.build(); - } - - public static InterfaceChildEntry getInterfaceChildEntryFromConfigDS(String interfaceName, - DataBroker dataBroker) { - InterfaceParentEntryKey parentEntryKey = new InterfaceParentEntryKey(interfaceName); - InterfaceChildEntryKey childEntryKey = new InterfaceChildEntryKey(interfaceName); - InstanceIdentifier interfaceChildEntryInstanceIdentifier = getInterfaceChildEntryIdentifier(parentEntryKey, childEntryKey); - Optional interfaceChildEntryOptional = - IfmUtil.read(LogicalDatastoreType.CONFIGURATION, interfaceChildEntryInstanceIdentifier, dataBroker); - if (!interfaceChildEntryOptional.isPresent()) { - return null; - } - return interfaceChildEntryOptional.get(); - } - @Override public Future> getPortFromInterface(GetPortFromInterfaceInput input) { RpcResultBuilder rpcResultBuilder; @@ -196,28 +195,23 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService { } @Override - public Future> getInterfaceFromPort(GetInterfaceFromPortInput input) { - /*RpcResultBuilder rpcResultBuilder; + public Future> getNodeconnectorIdFromInterface(GetNodeconnectorIdFromInterfaceInput input) { + String interfaceName = input.getIntfName(); + RpcResultBuilder rpcResultBuilder; try { - Interface interfaceInfo = null; - NodeId nodeId = IfmUtil.buildDpnNodeId(input.getDpid()); - Node node = getNodeFromInventoryOperDS(nodeId, dataBroker); - ChildInterfaceNames childInterfaceNames = node.getAugmentation(ChildInterfaceNames.class); - for(OfInterfaceRefInfo ofInterfaceRefInfo : childInterfaceNames.getOfInterfaceRefInfo()){ - interfaceInfo = getInterfaceFromTunnelKey(ofInterfaceRefInfo.getOfIntfName(), input.getInterfaceId(), - input.getInterfaceType()); - } - GetInterfaceFromPortOutputBuilder output = new GetInterfaceFromPortOutputBuilder(). - setInterfaceName(interfaceInfo == null ? null : interfaceInfo.getName()); + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState = + InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(interfaceName, dataBroker); + String lowerLayerIf = ifState.getLowerLayerIf().get(0); + NodeConnectorId nodeConnectorId = new NodeConnectorId(lowerLayerIf); + + GetNodeconnectorIdFromInterfaceOutputBuilder output = new GetNodeconnectorIdFromInterfaceOutputBuilder().setNodeconnectorId(nodeConnectorId); rpcResultBuilder = RpcResultBuilder.success(); rpcResultBuilder.withResult(output.build()); - }catch(Exception e){ - LOG.error("Retrieval of interface for the key {} failed due to {}" ,input.getPortno(), e); + } catch (Exception e) { + LOG.error("Retrieval of nodeconnector id for the key {} failed due to {}", interfaceName, e); rpcResultBuilder = RpcResultBuilder.failed(); } return Futures.immediateFuture(rpcResultBuilder.build()); - */ - return null; } public List getEgressActionInfosForInterface(String interfaceName) { @@ -271,46 +265,4 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService { return null; } - public static Node getNodeFromInventoryOperDS(NodeId nodeId, DataBroker dataBroker) { - InstanceIdentifier nodeIdentifier = InstanceIdentifier.builder(Nodes.class) - .child(Node.class, new NodeKey(nodeId)).build(); - - Optional nodeOptional = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, - nodeIdentifier, dataBroker); - if (!nodeOptional.isPresent()) { - return null; - } - return nodeOptional.get(); - } - - public Interface getInterfaceFromTunnelKey(String interfaceName, BigInteger tunnelKey, - Class ifType){ - - /*Interface interfaceInfo = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(new InterfaceKey(interfaceName), dataBroker); - - if(ifType.isAssignableFrom(IfL2vlan.class)){ - IfL2vlan vlanIface = interfaceInfo.getAugmentation(IfL2vlan.class); - LOG.trace("L2Vlan: {}",vlanIface); - long vlanVid = (vlanIface == null) ? 0 : vlanIface.getVlanId(); - if(tunnelKey.intValue() == vlanVid){ - return interfaceInfo; - } - }else if(ifType.isAssignableFrom(TunnelTypeBase.class)){ - IfTunnel ifTunnel = interfaceInfo.getAugmentation(IfTunnel.class); - TunnelResources tunnelResources = ifTunnel.getTunnelResources(); - if(ifType.isAssignableFrom(TunnelTypeGre.class)) { - IfGre ifGre = tunnelResources.getAugmentation(IfGre.class); - if (ifGre.getGreKey() == tunnelKey) { - return interfaceInfo; - } - }else if(ifType.isAssignableFrom(TunnelTypeVxlan.class)){ - IfVxlan ifVxlan = tunnelResources.getAugmentation(IfVxlan.class); - if(ifVxlan.getVni() == tunnelKey){ - return interfaceInfo; - } - } - } - return null;*/ - return null; - } } \ No newline at end of file -- 2.36.6