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