BUG:5042 LLDP Tunnel Monitoring should update the interface operational
[vpnservice.git] / interfacemgr / interfacemgr-impl / src / main / java / org / opendaylight / vpnservice / interfacemgr / commons / InterfaceManagerCommonUtils.java
1 /*
2  * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.vpnservice.interfacemgr.commons;
10
11 import com.google.common.base.Optional;
12 import com.google.common.util.concurrent.ListenableFuture;
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
16 import org.opendaylight.idmanager.IdManager;
17 import org.opendaylight.vpnservice.VpnConstants;
18 import org.opendaylight.vpnservice.interfacemgr.IfmConstants;
19 import org.opendaylight.vpnservice.interfacemgr.IfmUtil;
20 import org.opendaylight.vpnservice.mdsalutil.*;
21 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.*;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.opendaylight.yangtools.yang.common.RpcResult;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 import java.math.BigInteger;
40 import java.util.ArrayList;
41 import java.util.List;
42 import java.util.concurrent.ExecutionException;
43 import java.util.concurrent.Future;
44
45 public class InterfaceManagerCommonUtils {
46     private static final Logger LOG = LoggerFactory.getLogger(InterfaceManagerCommonUtils.class);
47     public static NodeConnector getNodeConnectorFromInventoryOperDS(NodeConnectorId nodeConnectorId,
48                                                                     DataBroker dataBroker) {
49         NodeId nodeId = IfmUtil.getNodeIdFromNodeConnectorId(nodeConnectorId);
50         InstanceIdentifier<NodeConnector> ncIdentifier = InstanceIdentifier.builder(Nodes.class)
51                 .child(Node.class, new NodeKey(nodeId))
52                 .child(NodeConnector.class, new NodeConnectorKey(nodeConnectorId)).build();
53
54         Optional<NodeConnector> nodeConnectorOptional = IfmUtil.read(LogicalDatastoreType.OPERATIONAL,
55                 ncIdentifier, dataBroker);
56         if (!nodeConnectorOptional.isPresent()) {
57             return null;
58         }
59         return nodeConnectorOptional.get();
60     }
61
62     public static InstanceIdentifier<Interface> getInterfaceIdentifier(InterfaceKey interfaceKey) {
63         InstanceIdentifier.InstanceIdentifierBuilder<Interface> interfaceInstanceIdentifierBuilder =
64                 InstanceIdentifier.builder(Interfaces.class).child(Interface.class, interfaceKey);
65         return interfaceInstanceIdentifierBuilder.build();
66     }
67
68     public static Interface getInterfaceFromConfigDS(InterfaceKey interfaceKey, DataBroker dataBroker) {
69         InstanceIdentifier<Interface> interfaceId = getInterfaceIdentifier(interfaceKey);
70         Optional<Interface> interfaceOptional = IfmUtil.read(LogicalDatastoreType.CONFIGURATION, interfaceId, dataBroker);
71         if (!interfaceOptional.isPresent()) {
72             return null;
73         }
74
75         return interfaceOptional.get();
76     }
77
78     public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface getInterfaceStateFromOperDS(String interfaceName, DataBroker dataBroker) {
79         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifStateId =
80                 IfmUtil.buildStateInterfaceId(interfaceName);
81         Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifStateOptional =
82                 IfmUtil.read(LogicalDatastoreType.OPERATIONAL, ifStateId, dataBroker);
83         if (!ifStateOptional.isPresent()) {
84             return null;
85         }
86
87         return ifStateOptional.get();
88     }
89     public static void makeTunnelIngressFlow(List<ListenableFuture<Void>> futures, IMdsalApiManager mdsalApiManager,
90                                              IfTunnel tunnel, BigInteger dpnId, long portNo, Interface iface, int addOrRemoveFlow) {
91         String flowRef = InterfaceManagerCommonUtils.getTunnelInterfaceFlowRef(dpnId, NwConstants.VLAN_INTERFACE_INGRESS_TABLE, iface.getName());
92         List<MatchInfo> matches = new ArrayList<MatchInfo>();
93         List<InstructionInfo> mkInstructions = new ArrayList<InstructionInfo>();
94         if (NwConstants.ADD_FLOW == addOrRemoveFlow) {
95             matches.add(new MatchInfo(MatchFieldType.in_port, new BigInteger[] {
96                     dpnId, BigInteger.valueOf(portNo) }));
97             short tableId = tunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeMplsOverGre.class) ? NwConstants.L3_LFIB_TABLE :
98                     tunnel.isInternal() ? NwConstants.INTERNAL_TUNNEL_TABLE : NwConstants.EXTERNAL_TUNNEL_TABLE;
99             mkInstructions.add(new InstructionInfo(InstructionType.goto_table, new long[] {tableId}));}
100
101         BigInteger COOKIE_VM_INGRESS_TABLE = new BigInteger("8000001", 16);
102         FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpnId, NwConstants.VLAN_INTERFACE_INGRESS_TABLE, flowRef,
103                 IfmConstants.DEFAULT_FLOW_PRIORITY, iface.getName(), 0, 0, COOKIE_VM_INGRESS_TABLE, matches, mkInstructions);
104         if (NwConstants.ADD_FLOW == addOrRemoveFlow) {
105             futures.add(mdsalApiManager.installFlow(dpnId, flowEntity));
106         } else {
107             futures.add(mdsalApiManager.removeFlow(dpnId, flowEntity));
108         }
109     }
110     public static String getTunnelInterfaceFlowRef(BigInteger dpnId, short tableId, String ifName) {
111         return new StringBuilder().append(dpnId).append(tableId).append(ifName).toString();
112     }
113
114     public static void setOpStateForInterface(DataBroker broker, String interfaceName, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus opStatus) {
115         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> interfaceId = IfmUtil.buildStateInterfaceId(interfaceName);
116         InterfaceBuilder ifaceBuilder = new InterfaceBuilder().setKey(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey(interfaceName));
117         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface interfaceData = ifaceBuilder.setOperStatus(opStatus).build();
118         MDSALUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, interfaceId, interfaceData);
119     }
120
121     public static void updateTunnelMonitorDetailsInConfigDS(DataBroker broker, String interfaceName, boolean monitorEnabled, long monitorInterval) {
122         InstanceIdentifier<Interface> id = IfmUtil.buildId(interfaceName);
123         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder ifaceBuilder = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder();
124         ifaceBuilder.setKey(new InterfaceKey(interfaceName));
125         IfTunnelBuilder ifTunnelBuilder = new IfTunnelBuilder();
126         ifTunnelBuilder.setMonitorEnabled(monitorEnabled);
127         ifTunnelBuilder.setMonitorInterval(monitorInterval);
128         ifaceBuilder.addAugmentation(IfTunnel.class, ifTunnelBuilder.build());
129
130         LOG.trace("Updating trunk interface {} in Config DS", interfaceName);
131         MDSALUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, id, ifaceBuilder.build());
132     }
133 }