L2 Gw create changes related to ITM Tunnels creation in neutronvpn module
[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 java.math.BigInteger;
12 import java.util.ArrayList;
13 import java.util.List;
14
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
18 import org.opendaylight.vpnservice.interfacemgr.IfmConstants;
19 import org.opendaylight.vpnservice.interfacemgr.IfmUtil;
20 import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.utilities.FlowBasedServicesUtils;
21 import org.opendaylight.vpnservice.mdsalutil.FlowEntity;
22 import org.opendaylight.vpnservice.mdsalutil.InstructionInfo;
23 import org.opendaylight.vpnservice.mdsalutil.InstructionType;
24 import org.opendaylight.vpnservice.mdsalutil.MDSALUtil;
25 import org.opendaylight.vpnservice.mdsalutil.MatchFieldType;
26 import org.opendaylight.vpnservice.mdsalutil.MatchInfo;
27 import org.opendaylight.vpnservice.mdsalutil.MetaDataUtil;
28 import org.opendaylight.vpnservice.mdsalutil.NwConstants;
29 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info.InterfaceParentEntry;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info.InterfaceParentEntryBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info.InterfaceParentEntryKey;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info._interface.parent.entry.InterfaceChildEntry;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info._interface.parent.entry.InterfaceChildEntryBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.child.info._interface.parent.entry.InterfaceChildEntryKey;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnelBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeMplsOverGre;
53 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56
57 import com.google.common.base.Optional;
58 import com.google.common.util.concurrent.ListenableFuture;
59
60 public class InterfaceManagerCommonUtils {
61     private static final Logger LOG = LoggerFactory.getLogger(InterfaceManagerCommonUtils.class);
62     public static NodeConnector getNodeConnectorFromInventoryOperDS(NodeConnectorId nodeConnectorId,
63                                                                     DataBroker dataBroker) {
64         NodeId nodeId = IfmUtil.getNodeIdFromNodeConnectorId(nodeConnectorId);
65         InstanceIdentifier<NodeConnector> ncIdentifier = InstanceIdentifier.builder(Nodes.class)
66                 .child(Node.class, new NodeKey(nodeId))
67                 .child(NodeConnector.class, new NodeConnectorKey(nodeConnectorId)).build();
68
69         Optional<NodeConnector> nodeConnectorOptional = IfmUtil.read(LogicalDatastoreType.OPERATIONAL,
70                 ncIdentifier, dataBroker);
71         if (!nodeConnectorOptional.isPresent()) {
72             return null;
73         }
74         return nodeConnectorOptional.get();
75     }
76
77     public static InstanceIdentifier<Interface> getInterfaceIdentifier(InterfaceKey interfaceKey) {
78         InstanceIdentifier.InstanceIdentifierBuilder<Interface> interfaceInstanceIdentifierBuilder =
79                 InstanceIdentifier.builder(Interfaces.class).child(Interface.class, interfaceKey);
80         return interfaceInstanceIdentifierBuilder.build();
81     }
82
83     public static Interface getInterfaceFromConfigDS(InterfaceKey interfaceKey, DataBroker dataBroker) {
84         InstanceIdentifier<Interface> interfaceId = getInterfaceIdentifier(interfaceKey);
85         Optional<Interface> interfaceOptional = IfmUtil.read(LogicalDatastoreType.CONFIGURATION, interfaceId, dataBroker);
86         if (!interfaceOptional.isPresent()) {
87             return null;
88         }
89
90         return interfaceOptional.get();
91     }
92
93     public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface getInterfaceStateFromOperDS(String interfaceName, DataBroker dataBroker) {
94         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifStateId =
95                 IfmUtil.buildStateInterfaceId(interfaceName);
96         Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifStateOptional =
97                 IfmUtil.read(LogicalDatastoreType.OPERATIONAL, ifStateId, dataBroker);
98         if (!ifStateOptional.isPresent()) {
99             return null;
100         }
101
102         return ifStateOptional.get();
103     }
104     public static void makeTunnelIngressFlow(List<ListenableFuture<Void>> futures, IMdsalApiManager mdsalApiManager,
105                                              IfTunnel tunnel, BigInteger dpnId, long portNo, Interface iface, int ifIndex, int addOrRemoveFlow) {
106         LOG.debug("make tunnel ingress flow for {}",iface.getName());
107         String flowRef = InterfaceManagerCommonUtils.getTunnelInterfaceFlowRef(dpnId, NwConstants.VLAN_INTERFACE_INGRESS_TABLE, iface.getName());
108         List<MatchInfo> matches = new ArrayList<MatchInfo>();
109         List<InstructionInfo> mkInstructions = new ArrayList<InstructionInfo>();
110         if (NwConstants.ADD_FLOW == addOrRemoveFlow) {
111             matches.add(new MatchInfo(MatchFieldType.in_port, new BigInteger[] {
112                     dpnId, BigInteger.valueOf(portNo) }));
113             mkInstructions.add(new InstructionInfo(
114                     InstructionType.write_metadata, new BigInteger[] {
115                     MetaDataUtil.getLportTagMetaData(ifIndex),
116                     MetaDataUtil.METADATA_MASK_LPORT_TAG}));
117             short tableId = tunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeMplsOverGre.class) ? NwConstants.L3_LFIB_TABLE :
118                     tunnel.isInternal() ? NwConstants.INTERNAL_TUNNEL_TABLE : NwConstants.EXTERNAL_TUNNEL_TABLE;
119             mkInstructions.add(new InstructionInfo(InstructionType.goto_table, new long[] {tableId}));
120         }
121
122         BigInteger COOKIE_VM_INGRESS_TABLE = new BigInteger("8000001", 16);
123         FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpnId, NwConstants.VLAN_INTERFACE_INGRESS_TABLE, flowRef,
124                 IfmConstants.DEFAULT_FLOW_PRIORITY, iface.getName(), 0, 0, COOKIE_VM_INGRESS_TABLE, matches, mkInstructions);
125         if (NwConstants.ADD_FLOW == addOrRemoveFlow) {
126             futures.add(mdsalApiManager.installFlow(dpnId, flowEntity));
127         } else {
128             futures.add(mdsalApiManager.removeFlow(dpnId, flowEntity));
129         }
130     }
131     public static String getTunnelInterfaceFlowRef(BigInteger dpnId, short tableId, String ifName) {
132         return new StringBuilder().append(dpnId).append(tableId).append(ifName).toString();
133     }
134
135     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) {
136         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> interfaceId = IfmUtil.buildStateInterfaceId(interfaceName);
137         InterfaceBuilder ifaceBuilder = new InterfaceBuilder().setKey(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey(interfaceName));
138         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface interfaceData = ifaceBuilder.setOperStatus(opStatus).build();
139         MDSALUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, interfaceId, interfaceData);
140     }
141
142     public static void updateTunnelMonitorDetailsInConfigDS(DataBroker broker, String interfaceName, boolean monitorEnabled, long monitorInterval) {
143         InstanceIdentifier<Interface> id = IfmUtil.buildId(interfaceName);
144         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();
145         ifaceBuilder.setKey(new InterfaceKey(interfaceName));
146         IfTunnelBuilder ifTunnelBuilder = new IfTunnelBuilder();
147         ifTunnelBuilder.setMonitorEnabled(monitorEnabled);
148         ifTunnelBuilder.setMonitorInterval(monitorInterval);
149         ifaceBuilder.addAugmentation(IfTunnel.class, ifTunnelBuilder.build());
150
151         LOG.trace("Updating trunk interface {} in Config DS", interfaceName);
152         MDSALUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, id, ifaceBuilder.build());
153     }
154
155     public static void createInterfaceChildEntry( WriteTransaction t,
156                                                   String parentInterface, String childInterface){
157         InterfaceParentEntryKey interfaceParentEntryKey = new InterfaceParentEntryKey(parentInterface);
158         InterfaceChildEntryKey interfaceChildEntryKey = new InterfaceChildEntryKey(childInterface);
159         InstanceIdentifier<InterfaceChildEntry> intfId =
160                 InterfaceMetaUtils.getInterfaceChildEntryIdentifier(interfaceParentEntryKey, interfaceChildEntryKey);
161         InterfaceChildEntryBuilder entryBuilder = new InterfaceChildEntryBuilder().setKey(interfaceChildEntryKey)
162                 .setChildInterface(childInterface);
163         t.put(LogicalDatastoreType.CONFIGURATION, intfId, entryBuilder.build(),true);
164     }
165
166     public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus
167            updateStateEntry(Interface interfaceNew, DataBroker dataBroker, WriteTransaction transaction,
168                           org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState) {
169         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus operStatus;
170         if (!interfaceNew.isEnabled()) {
171             operStatus = org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Down;
172         } else {
173             String ncStr = ifState.getLowerLayerIf().get(0);
174             NodeConnectorId nodeConnectorId = new NodeConnectorId(ncStr);
175             NodeConnector nodeConnector =
176                     InterfaceManagerCommonUtils.getNodeConnectorFromInventoryOperDS(nodeConnectorId, dataBroker);
177             FlowCapableNodeConnector flowCapableNodeConnector =
178                     nodeConnector.getAugmentation(FlowCapableNodeConnector.class);
179             //State state = flowCapableNodeConnector.getState();
180             operStatus = flowCapableNodeConnector == null ? org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Down : org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Up;
181         }
182
183         String ifName = interfaceNew.getName();
184         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifStateId =
185                 IfmUtil.buildStateInterfaceId(interfaceNew.getName());
186         InterfaceBuilder ifaceBuilder = new InterfaceBuilder();
187         ifaceBuilder.setOperStatus(operStatus);
188         ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(ifName));
189         transaction.merge(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build());
190         return operStatus;
191     }
192
193     public static void updateOperStatus(String interfaceName, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus operStatus,
194                                         WriteTransaction transaction) {
195         LOG.debug("updating operational status for interface {}",interfaceName);
196         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifChildStateId =
197                 IfmUtil.buildStateInterfaceId(interfaceName);
198         InterfaceBuilder ifaceBuilderChild = new InterfaceBuilder();
199         ifaceBuilderChild.setOperStatus(operStatus);
200         ifaceBuilderChild.setKey(IfmUtil.getStateInterfaceKeyFromName(interfaceName));
201         transaction.merge(LogicalDatastoreType.OPERATIONAL, ifChildStateId, ifaceBuilderChild.build());
202     }
203
204     public static void addStateEntry(String interfaceName, WriteTransaction transaction, DataBroker dataBroker, IdManagerService idManager,
205                                      org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState) {
206         LOG.debug("adding interface state for {}",interfaceName);
207         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus operStatus = ifState.getOperStatus();
208         PhysAddress physAddress = ifState.getPhysAddress();
209         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus adminStatus = ifState.getAdminStatus();
210         NodeConnectorId nodeConnectorId = new NodeConnectorId(ifState.getLowerLayerIf().get(0));
211         InterfaceKey interfaceKey = new InterfaceKey(interfaceName);
212         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface interfaceInfo =
213                 InterfaceManagerCommonUtils.getInterfaceFromConfigDS(interfaceKey, dataBroker);
214
215         if (interfaceInfo != null && !interfaceInfo.isEnabled()) {
216             operStatus = org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Down;
217         }
218
219         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifStateId =
220                 IfmUtil.buildStateInterfaceId(interfaceName);
221         List<String> childLowerLayerIfList = new ArrayList<>();
222         childLowerLayerIfList.add(0, nodeConnectorId.getValue());
223         InterfaceBuilder ifaceBuilder = new InterfaceBuilder().setAdminStatus(adminStatus)
224                 .setOperStatus(operStatus).setPhysAddress(physAddress).setLowerLayerIf(childLowerLayerIfList);
225
226         Integer ifIndex = IfmUtil.allocateId(idManager, IfmConstants.IFM_IDPOOL_NAME, interfaceName);
227         ifaceBuilder.setIfIndex(ifIndex);
228
229         if(interfaceInfo != null){
230             ifaceBuilder.setType(interfaceInfo.getType());
231         }
232         ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(interfaceName));
233         transaction.put(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build(), true);
234
235         // create lportTag Interface Map
236         InterfaceMetaUtils.createLportTagInterfaceMap(transaction, interfaceName, ifIndex);
237
238         // install ingress flow
239         BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
240         long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId));
241         if(interfaceInfo.isEnabled() && ifState.getOperStatus() == org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Up) {
242             List<MatchInfo> matches = FlowBasedServicesUtils.getMatchInfoForVlanPortAtIngressTable(dpId, portNo, interfaceInfo);
243             FlowBasedServicesUtils.installVlanFlow(dpId, portNo, interfaceInfo, transaction, matches, ifIndex);
244         }
245     }
246
247     public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface
248                   addStateEntry(Interface interfaceInfo, String portName, WriteTransaction transaction, IdManagerService idManager,
249                                      PhysAddress physAddress, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus operStatus,
250                                      org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus adminStatus,
251                                      NodeConnectorId nodeConnectorId) {
252         LOG.debug("adding interface state for {}",portName);
253         if (interfaceInfo != null && !interfaceInfo.isEnabled()) {
254             operStatus = org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Down;
255         }
256         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifStateId =
257                 IfmUtil.buildStateInterfaceId(portName);
258         List<String> childLowerLayerIfList = new ArrayList<>();
259         childLowerLayerIfList.add(0, nodeConnectorId.getValue());
260         InterfaceBuilder ifaceBuilder = new InterfaceBuilder().setAdminStatus(adminStatus)
261                 .setOperStatus(operStatus).setPhysAddress(physAddress).setLowerLayerIf(childLowerLayerIfList);
262
263         Integer ifIndex = IfmUtil.allocateId(idManager, IfmConstants.IFM_IDPOOL_NAME, portName);
264         ifaceBuilder.setIfIndex(ifIndex);
265
266         if(interfaceInfo != null){
267             ifaceBuilder.setType(interfaceInfo.getType());
268         }
269         ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(portName));
270         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState = ifaceBuilder.build();
271         transaction.put(LogicalDatastoreType.OPERATIONAL, ifStateId,ifState , true);
272
273         // allocate lport tag and set in if-index
274         InterfaceMetaUtils.createLportTagInterfaceMap(transaction, portName, ifIndex);
275         return ifState;
276     }
277
278     public static void deleteStateEntry(String interfaceName, WriteTransaction transaction) {
279         LOG.debug("removing interface state for {}",interfaceName);
280         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifChildStateId =
281                 IfmUtil.buildStateInterfaceId(interfaceName);
282         transaction.delete(LogicalDatastoreType.OPERATIONAL, ifChildStateId);
283     }
284
285     // For trunk interfaces, binding to a parent interface which is already bound to another trunk interface should not
286     // be allowed
287     public static boolean createInterfaceChildEntryIfNotPresent( DataBroker dataBroker, WriteTransaction t,
288                                                String parentInterface, String childInterface){
289         InterfaceParentEntryKey interfaceParentEntryKey = new InterfaceParentEntryKey(parentInterface);
290         InstanceIdentifier<InterfaceParentEntry> interfaceParentEntryIdentifier =
291                 InterfaceMetaUtils.getInterfaceParentEntryIdentifier(interfaceParentEntryKey);
292         InterfaceParentEntry interfaceParentEntry =
293                 InterfaceMetaUtils.getInterfaceParentEntryFromConfigDS(interfaceParentEntryIdentifier, dataBroker);
294
295         if(interfaceParentEntry != null){
296             LOG.error("Trying to bind the same parent interface {} to multiple trunk interfaces. ", parentInterface);
297             return false;
298         }
299
300         LOG.info("First vlan trunk {} bound on parent-interface {}", childInterface, parentInterface);
301         InterfaceChildEntryKey interfaceChildEntryKey = new InterfaceChildEntryKey(childInterface);
302         InstanceIdentifier<InterfaceChildEntry> intfId =
303                 InterfaceMetaUtils.getInterfaceChildEntryIdentifier(interfaceParentEntryKey, interfaceChildEntryKey);
304         InterfaceChildEntryBuilder entryBuilder = new InterfaceChildEntryBuilder().setKey(interfaceChildEntryKey)
305                 .setChildInterface(childInterface);
306         t.put(LogicalDatastoreType.CONFIGURATION, intfId, entryBuilder.build(),true);
307         return true;
308     }
309
310     public static boolean deleteParentInterfaceEntry( WriteTransaction t, String parentInterface){
311         InterfaceParentEntryKey interfaceParentEntryKey = new InterfaceParentEntryKey(parentInterface);
312         InstanceIdentifier<InterfaceParentEntry> interfaceParentEntryIdentifier = InterfaceMetaUtils.getInterfaceParentEntryIdentifier(interfaceParentEntryKey);
313         t.delete(LogicalDatastoreType.CONFIGURATION, interfaceParentEntryIdentifier);
314         return true;
315     }
316
317 }