Bug 7824 - ModifiedNodeDoesNotExistException
[netvirt.git] / vpnservice / elanmanager / elanmanager-impl / src / main / java / org / opendaylight / netvirt / elan / utils / ElanForwardingEntriesHandler.java
1 /*
2  * Copyright (c) 2016 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.netvirt.elan.utils;
10
11
12
13 import com.google.common.base.Optional;
14 import javax.inject.Inject;
15 import javax.inject.Singleton;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntry;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntryBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntryKey;
25 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28
29 @Singleton
30 public class ElanForwardingEntriesHandler {
31
32     private static final Logger LOG = LoggerFactory.getLogger(ElanForwardingEntriesHandler.class);
33
34     private final DataBroker broker;
35     private ElanUtils elanUtils;
36
37     @Inject
38     public ElanForwardingEntriesHandler(DataBroker dataBroker) {
39         this.broker = dataBroker;
40     }
41
42     public void setElanUtils(ElanUtils elanUtils) {
43         this.elanUtils = elanUtils;
44     }
45
46     public void updateElanInterfaceForwardingTablesList(String elanInstanceName, String interfaceName,
47             String existingInterfaceName, MacEntry mac, WriteTransaction tx) {
48         if (existingInterfaceName.equals(interfaceName)) {
49             LOG.error(String.format(
50                     "Static MAC address %s has already been added for the same ElanInstance "
51                             + "%s on the same Logical Interface Port %s."
52                             + " No operation will be done.",
53                     mac.getMacAddress().toString(), elanInstanceName, interfaceName));
54         } else {
55             LOG.warn(String.format(
56                     "Static MAC address %s had already been added for ElanInstance %s on Logical Interface Port %s. "
57                             + "This would be considered as MAC movement scenario and old static mac will be removed "
58                             + "and new static MAC will be added"
59                             + "for ElanInstance %s on Logical Interface Port %s",
60                     mac.getMacAddress().toString(), elanInstanceName, interfaceName, elanInstanceName, interfaceName));
61             //Update the  ElanInterface Forwarding Container & ElanForwarding Container
62             deleteElanInterfaceForwardingTablesList(existingInterfaceName, mac, tx);
63             createElanInterfaceForwardingTablesList(interfaceName, mac, tx);
64             updateElanForwardingTablesList(elanInstanceName, interfaceName, mac, tx);
65         }
66
67     }
68
69     public void addElanInterfaceForwardingTableList(ElanInstance elanInstance, String interfaceName,
70             PhysAddress physAddress, WriteTransaction tx) {
71         MacEntry macEntry = new MacEntryBuilder().setIsStaticAddress(true).setMacAddress(physAddress)
72                 .setInterface(interfaceName).setKey(new MacEntryKey(physAddress)).build();
73         createElanForwardingTablesList(elanInstance.getElanInstanceName(), macEntry, tx);
74         createElanInterfaceForwardingTablesList(interfaceName, macEntry, tx);
75     }
76
77     public void deleteElanInterfaceForwardingTablesList(String interfaceName, MacEntry mac, WriteTransaction tx) {
78         InstanceIdentifier<MacEntry> existingMacEntryId = ElanUtils
79                 .getInterfaceMacEntriesIdentifierOperationalDataPath(interfaceName, mac.getMacAddress());
80         MacEntry existingInterfaceMacEntry = elanUtils
81                 .getInterfaceMacEntriesOperationalDataPathFromId(existingMacEntryId);
82         if (existingInterfaceMacEntry != null) {
83             tx.delete(LogicalDatastoreType.OPERATIONAL, existingMacEntryId);
84         }
85     }
86
87     public void createElanInterfaceForwardingTablesList(String interfaceName, MacEntry mac, WriteTransaction tx) {
88         InstanceIdentifier<MacEntry> existingMacEntryId = ElanUtils
89                 .getInterfaceMacEntriesIdentifierOperationalDataPath(interfaceName, mac.getMacAddress());
90         MacEntry existingInterfaceMacEntry = elanUtils
91                 .getInterfaceMacEntriesOperationalDataPathFromId(existingMacEntryId);
92         if (existingInterfaceMacEntry == null) {
93             MacEntry macEntry = new MacEntryBuilder().setMacAddress(mac.getMacAddress()).setInterface(interfaceName)
94                     .setIsStaticAddress(true).setKey(new MacEntryKey(mac.getMacAddress())).build();
95             tx.put(LogicalDatastoreType.OPERATIONAL, existingMacEntryId, macEntry, true);
96         }
97     }
98
99     public void updateElanForwardingTablesList(String elanName, String interfaceName, MacEntry mac,
100             WriteTransaction tx) {
101         InstanceIdentifier<MacEntry> macEntryId = ElanUtils.getMacEntryOperationalDataPath(elanName,
102                 mac.getMacAddress());
103         MacEntry existingMacEntry = elanUtils.getMacEntryFromElanMacId(macEntryId);
104         if (existingMacEntry != null && elanUtils.getElanMacTable(elanName) != null) {
105             MacEntry newMacEntry = new MacEntryBuilder().setInterface(interfaceName).setIsStaticAddress(true)
106                     .setMacAddress(mac.getMacAddress()).setKey(new MacEntryKey(mac.getMacAddress())).build();
107             tx.put(LogicalDatastoreType.OPERATIONAL, macEntryId, newMacEntry);
108         }
109     }
110
111     private void createElanForwardingTablesList(String elanName, MacEntry macEntry, WriteTransaction tx) {
112         InstanceIdentifier<MacEntry> macEntryId = ElanUtils.getMacEntryOperationalDataPath(elanName,
113                 macEntry.getMacAddress());
114         Optional<MacEntry> existingMacEntry = elanUtils.read(broker, LogicalDatastoreType.OPERATIONAL, macEntryId);
115         if (!existingMacEntry.isPresent() && elanUtils.getElanMacTable(elanName) != null) {
116             tx.put(LogicalDatastoreType.OPERATIONAL, macEntryId, macEntry, true);
117         }
118     }
119
120     public void deleteElanInterfaceForwardingEntries(ElanInstance elanInfo, InterfaceInfo interfaceInfo,
121             MacEntry macEntry, WriteTransaction tx) {
122         InstanceIdentifier<MacEntry> macEntryId = ElanUtils
123                 .getMacEntryOperationalDataPath(elanInfo.getElanInstanceName(), macEntry.getMacAddress());
124         tx.delete(LogicalDatastoreType.OPERATIONAL, macEntryId);
125         deleteElanInterfaceForwardingTablesList(interfaceInfo.getInterfaceName(), macEntry, tx);
126         WriteTransaction deleteFlowtx = broker.newWriteOnlyTransaction();
127         elanUtils.deleteMacFlows(elanInfo, interfaceInfo, macEntry, deleteFlowtx);
128         deleteFlowtx.submit();
129     }
130
131     public void deleteElanInterfaceMacForwardingEntries(String interfaceName, PhysAddress physAddress,
132             WriteTransaction tx) {
133         InstanceIdentifier<MacEntry> macEntryId = ElanUtils
134                 .getInterfaceMacEntriesIdentifierOperationalDataPath(interfaceName, physAddress);
135         tx.delete(LogicalDatastoreType.OPERATIONAL, macEntryId);
136     }
137
138
139 }