Merge "Neutron port listener updated to support allowed address pair with security...
[netvirt.git] / vpnservice / elanmanager / elanmanager-impl / src / main / java / org / opendaylight / netvirt / elan / internal / ElanServiceProvider.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.internal;
10
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.List;
14 import java.util.concurrent.Future;
15
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.controller.md.sal.binding.api.NotificationService;
18 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
19 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
20 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
21 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
22 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
23 import org.opendaylight.netvirt.elan.utils.ElanForwardingEntriesHandler;
24 import org.opendaylight.netvirt.elanmanager.api.IElanService;
25 import org.opendaylight.netvirt.elanmanager.exceptions.MacNotFoundException;
26 import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
27 import org.opendaylight.netvirt.elan.l2gw.internal.ElanL2GatewayProvider;
28 import org.opendaylight.netvirt.elan.statisitcs.ElanStatisticsImpl;
29 import org.opendaylight.netvirt.elan.statusanddiag.ElanStatusMonitor;
30 import org.opendaylight.netvirt.elan.utils.ElanClusterUtils;
31 import org.opendaylight.netvirt.elan.utils.ElanConstants;
32 import org.opendaylight.netvirt.elan.utils.ElanUtils;
33 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
34 import org.opendaylight.genius.itm.api.IITMProvider;
35 import org.opendaylight.genius.mdsalutil.MDSALUtil;
36 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInterfaces;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan._interface.forwarding.entries.ElanInterfaceMac;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstanceBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstanceKey;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterfaceBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterfaceKey;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.state.Elan;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntry;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.statistics.rev150824.ElanStatisticsService;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInputBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
55 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
56 import org.opendaylight.yangtools.yang.common.RpcResult;
57 import org.slf4j.Logger;
58 import org.slf4j.LoggerFactory;
59
60 import com.google.common.base.Optional;
61
62 public class ElanServiceProvider implements BindingAwareProvider, IElanService, AutoCloseable {
63
64     private IdManagerService idManager;
65     private IMdsalApiManager mdsalManager;
66     private IInterfaceManager interfaceManager;
67     private OdlInterfaceRpcService interfaceManagerRpcService;
68     private ElanInstanceManager elanInstanceManager;
69     private ElanForwardingEntriesHandler elanForwardingEntriesHandler;
70     public IdManagerService getIdManager() {
71         return idManager;
72     }
73
74     public ElanForwardingEntriesHandler getElanForwardingEntriesHandler() {
75         return elanForwardingEntriesHandler;
76     }
77
78     public ElanPacketInHandler getElanPacketInHandler() {
79         return elanPacketInHandler;
80     }
81
82     public ElanSmacFlowEventListener getElanSmacFlowEventListener() {
83         return elanSmacFlowEventListener;
84     }
85
86     public ElanInterfaceStateChangeListener getElanInterfaceStateChangeListener() {
87         return elanInterfaceStateChangeListener;
88     }
89
90     public ElanInterfaceStateClusteredListener getInfStateChangeClusteredListener() {
91         return infStateChangeClusteredListener;
92     }
93
94     public ElanDpnInterfaceClusteredListener getElanDpnInterfaceClusteredListener() {
95         return elanDpnInterfaceClusteredListener;
96     }
97
98     public ElanNodeListener getElanNodeListener() {
99         return elanNodeListener;
100     }
101
102     public NotificationService getNotificationService() {
103         return notificationService;
104     }
105
106     public RpcProviderRegistry getRpcProviderRegistry() {
107         return rpcProviderRegistry;
108     }
109
110     public ElanL2GatewayProvider getElanL2GatewayProvider() {
111         return elanL2GatewayProvider;
112     }
113
114     public static ElanStatusMonitor getElanstatusmonitor() {
115         return elanStatusMonitor;
116     }
117
118     public ElanItmEventListener getElanItmEventListener() {
119         return elanItmEventListener;
120     }
121
122     public static Logger getLogger() {
123         return logger;
124     }
125
126     private ElanInterfaceManager elanInterfaceManager;
127     private ElanPacketInHandler elanPacketInHandler;
128     private ElanSmacFlowEventListener elanSmacFlowEventListener;
129     private ElanInterfaceStateChangeListener elanInterfaceStateChangeListener;
130     private ElanInterfaceStateClusteredListener infStateChangeClusteredListener;
131     private ElanDpnInterfaceClusteredListener elanDpnInterfaceClusteredListener;
132     private ElanNodeListener elanNodeListener;
133     private NotificationService notificationService;
134     private RpcProviderRegistry rpcProviderRegistry;
135     private IITMProvider itmManager;
136     private ItmRpcService itmRpcService;
137     private DataBroker broker;
138     private ElanL2GatewayProvider elanL2GatewayProvider;
139     private ElanStatisticsService interfaceStatsService;
140     private EntityOwnershipService entityOwnershipService;
141     private static final ElanStatusMonitor elanStatusMonitor = ElanStatusMonitor.getInstance();
142     static DataStoreJobCoordinator dataStoreJobCoordinator;
143     private ElanOvsdbNodeListener elanOvsdbNodeListener;
144
145     private boolean generateIntBridgeMac = true;
146
147     public static void setDataStoreJobCoordinator(DataStoreJobCoordinator ds) {
148         dataStoreJobCoordinator = ds;
149     }
150
151     public void setBroker(DataBroker broker) {
152         this.broker = broker;
153     }
154
155     public static DataStoreJobCoordinator getDataStoreJobCoordinator() {
156         if (dataStoreJobCoordinator == null) {
157             dataStoreJobCoordinator = DataStoreJobCoordinator.getInstance();
158         }
159         return dataStoreJobCoordinator;
160     }
161
162
163     public ElanServiceProvider(RpcProviderRegistry rpcRegistry) {
164         rpcProviderRegistry = rpcRegistry;
165         elanStatusMonitor.registerMbean();
166     }
167
168     // private ElanInterfaceStateChangeListener elanInterfaceEventListener;
169     private ElanItmEventListener elanItmEventListener;
170
171     private static final Logger logger = LoggerFactory.getLogger(ElanServiceProvider.class);
172
173     @Override
174     public void onSessionInitiated(ProviderContext session) {
175         elanStatusMonitor.reportStatus("STARTING");
176         try {
177             createIdPool();
178             getDataStoreJobCoordinator();
179             broker = session.getSALService(DataBroker.class);
180
181             elanOvsdbNodeListener = new ElanOvsdbNodeListener(broker, generateIntBridgeMac);
182             ElanUtils.setElanServiceProvider(this);
183             elanForwardingEntriesHandler = ElanForwardingEntriesHandler.getElanForwardingEntriesHandler(this);
184             elanInterfaceManager = ElanInterfaceManager.getElanInterfaceManager(this);
185             elanInstanceManager = ElanInstanceManager.getElanInstanceManager(this);
186             elanNodeListener  = ElanNodeListener.getElanNodeListener(this);
187             elanPacketInHandler = ElanPacketInHandler.getElanPacketInHandler(this);
188             elanSmacFlowEventListener = ElanSmacFlowEventListener.getElanSmacFlowEventListener(this);
189             // Initialize statistics rpc provider for elan
190             interfaceStatsService = ElanStatisticsImpl.getElanStatisticsService(this);
191             rpcProviderRegistry.addRpcImplementation(ElanStatisticsService.class, interfaceStatsService);
192             elanInterfaceStateChangeListener = ElanInterfaceStateChangeListener.getElanInterfaceStateChangeListener(this);
193             infStateChangeClusteredListener = ElanInterfaceStateClusteredListener.getElanInterfaceStateClusteredListener(this);
194             elanDpnInterfaceClusteredListener = ElanDpnInterfaceClusteredListener.getElanDpnInterfaceClusteredListener(this);
195             ElanClusterUtils.setElanServiceProvider(this);
196             this.elanL2GatewayProvider = new ElanL2GatewayProvider(this);
197             elanInterfaceManager.registerListener(LogicalDatastoreType.CONFIGURATION,broker);
198             elanInstanceManager.registerListener(LogicalDatastoreType.CONFIGURATION,broker);
199             notificationService.registerNotificationListener(elanSmacFlowEventListener);
200             notificationService.registerNotificationListener(elanPacketInHandler);
201             elanStatusMonitor.reportStatus("OPERATIONAL");
202         } catch (Exception e) {
203             logger.error("Error initializing services", e);
204             elanStatusMonitor.reportStatus("ERROR");
205         }
206     }
207
208
209
210     public void setIdManager(IdManagerService idManager) {
211         this.idManager = idManager;
212     }
213
214     public void setMdsalManager(IMdsalApiManager mdsalManager) {
215         this.mdsalManager = mdsalManager;
216     }
217
218     public void setInterfaceManager(IInterfaceManager interfaceManager) {
219         this.interfaceManager = interfaceManager;
220     }
221
222     public void setEntityOwnershipService(EntityOwnershipService entityOwnershipService) {
223         this.entityOwnershipService = entityOwnershipService;
224     }
225
226     public IInterfaceManager getInterfaceManager() {
227         return this.interfaceManager;
228     }
229
230     public IMdsalApiManager getMdsalManager() {
231         return mdsalManager;
232     }
233
234     public IITMProvider getItmManager() {
235         return itmManager;
236     }
237
238     public DataBroker getBroker() {
239         return broker;
240     }
241
242     public void setNotificationService(NotificationService notificationService) {
243         this.notificationService = notificationService;
244     }
245
246     public void setInterfaceManagerRpcService(OdlInterfaceRpcService interfaceManager) {
247         this.interfaceManagerRpcService = interfaceManager;
248     }
249
250     public OdlInterfaceRpcService getInterfaceManagerRpcService() {
251         return interfaceManagerRpcService;
252     }
253
254     public void setItmManager(IITMProvider itmManager) {
255         this.itmManager = itmManager;
256     }
257
258     public void setItmRpcService(ItmRpcService itmRpcService) {
259         this.itmRpcService = itmRpcService;
260     }
261
262     public ItmRpcService getItmRpcService() {
263         return itmRpcService;
264     }
265
266     public ElanInstanceManager getElanInstanceManager() {
267         return elanInstanceManager;
268     }
269
270     public ElanInterfaceManager getElanInterfaceManager() {
271         return elanInterfaceManager;
272     }
273
274     public EntityOwnershipService getEntityOwnershipService() {
275         return entityOwnershipService;
276     }
277
278     private void createIdPool() {
279         CreateIdPoolInput createPool = new CreateIdPoolInputBuilder().setPoolName(ElanConstants.ELAN_ID_POOL_NAME)
280             .setLow(ElanConstants.ELAN_ID_LOW_VALUE).setHigh(ElanConstants.ELAN_ID_HIGH_VALUE).build();
281         try {
282             Future<RpcResult<Void>> result = idManager.createIdPool(createPool);
283             if ((result != null) && (result.get().isSuccessful())) {
284                 logger.debug("ELAN Id Pool is created successfully");
285             }
286         } catch (Exception e) {
287             logger.error("Failed to create ELAN Id pool {}", e);
288         }
289     }
290
291     @Override
292     public boolean createElanInstance(String elanInstanceName, long macTimeout, String description) {
293         ElanInstance existingElanInstance = elanInstanceManager.getElanInstanceByName(elanInstanceName);
294         boolean isSuccess = true;
295         if (existingElanInstance != null) {
296             if (compareWithExistingElanInstance(existingElanInstance, macTimeout, description)) {
297                 logger.debug("Elan Instance is already present in the Operational DS {}", existingElanInstance);
298                 return true;
299             } else {
300                 ElanInstance updateElanInstance = new ElanInstanceBuilder().setElanInstanceName(elanInstanceName)
301                     .setDescription(description).setMacTimeout(macTimeout)
302                     .setKey(new ElanInstanceKey(elanInstanceName)).build();
303                 MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION,
304                     ElanUtils.getElanInstanceConfigurationDataPath(elanInstanceName), updateElanInstance);
305                 logger.debug("Updating the Elan Instance {} with MAC TIME-OUT %l and Description %s ",
306                     updateElanInstance, macTimeout, description);
307             }
308         } else {
309             ElanInstance elanInstance = new ElanInstanceBuilder().setElanInstanceName(elanInstanceName)
310                 .setMacTimeout(macTimeout).setDescription(description).setKey(new ElanInstanceKey(elanInstanceName))
311                 .build();
312             MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION,
313                 ElanUtils.getElanInstanceConfigurationDataPath(elanInstanceName), elanInstance);
314             logger.debug("Creating the new Elan Instance {}", elanInstance);
315         }
316         return isSuccess;
317     }
318
319     public static boolean compareWithExistingElanInstance(ElanInstance existingElanInstance, long macTimeOut,
320                                                           String description) {
321         boolean isEqual = false;
322         if (existingElanInstance.getMacTimeout() == macTimeOut
323             && existingElanInstance.getDescription().equals(description)) {
324             isEqual = true;
325         }
326         return isEqual;
327     }
328
329     @Override
330     public void updateElanInstance(String elanInstanceName, long newMacTimout, String newDescription) {
331         createElanInstance(elanInstanceName, newMacTimout, newDescription);
332     }
333
334     @Override
335     public boolean deleteElanInstance(String elanInstanceName) {
336         boolean isSuccess = false;
337         ElanInstance existingElanInstance = elanInstanceManager.getElanInstanceByName(elanInstanceName);
338         if (existingElanInstance == null) {
339             logger.debug("Elan Instance is not present {}", existingElanInstance);
340             return isSuccess;
341         }
342         logger.debug("Deletion of the existing Elan Instance {}", existingElanInstance);
343         ElanUtils.delete(broker, LogicalDatastoreType.CONFIGURATION,
344             ElanUtils.getElanInstanceConfigurationDataPath(elanInstanceName));
345         isSuccess = true;
346         return isSuccess;
347     }
348
349     @Override
350     public void addElanInterface(String elanInstanceName, String interfaceName, List<String> staticMacAddresses,
351                                  String description) {
352         ElanInstance existingElanInstance = elanInstanceManager.getElanInstanceByName(elanInstanceName);
353         if (existingElanInstance != null) {
354             ElanInterface elanInterface;
355             if (staticMacAddresses == null) {
356                 elanInterface = new ElanInterfaceBuilder().setElanInstanceName(elanInstanceName)
357                     .setDescription(description).setName(interfaceName).setKey(new ElanInterfaceKey(interfaceName))
358                     .build();
359             } else {
360                 elanInterface = new ElanInterfaceBuilder().setElanInstanceName(elanInstanceName)
361                     .setDescription(description).setName(interfaceName)
362                     .setStaticMacEntries(getPhysAddress(staticMacAddresses))
363                     .setKey(new ElanInterfaceKey(interfaceName)).build();
364             }
365             MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION,
366                 ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName), elanInterface);
367             logger.debug("Creating the new ELan Interface {}", elanInterface);
368         }
369
370     }
371
372     @Override
373     public void updateElanInterface(String elanInstanceName, String interfaceName,
374                                     List<String> updatedStaticMacAddresses, String newDescription) {
375         ElanInterface existingElanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(interfaceName);
376         if (existingElanInterface == null) {
377             return;
378         }
379         List<PhysAddress> existingMacAddress = existingElanInterface.getStaticMacEntries();
380         List<PhysAddress> updatedMacAddresses = getPhysAddress(updatedStaticMacAddresses);
381         List<PhysAddress> updatedPhysAddress = getUpdatedPhyAddress(existingMacAddress, updatedMacAddresses);
382         if (updatedPhysAddress.size() > 0) {
383             logger.debug("updating the ElanInterface with new Mac Entries {}", updatedStaticMacAddresses);
384             ElanInterface elanInterface = new ElanInterfaceBuilder().setElanInstanceName(elanInstanceName)
385                 .setName(interfaceName).setDescription(newDescription).setStaticMacEntries(updatedPhysAddress)
386                 .setKey(new ElanInterfaceKey(interfaceName)).build();
387             MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION,
388                 ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName), elanInterface);
389         }
390     }
391
392     @Override
393     public void deleteElanInterface(String elanInstanceName, String interfaceName) {
394         ElanInterface existingElanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(interfaceName);
395         if (existingElanInterface != null) {
396             ElanUtils.delete(broker, LogicalDatastoreType.CONFIGURATION,
397                 ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName));
398             logger.debug("deleting the Elan Interface {}", existingElanInterface);
399         }
400     }
401
402     @Override
403     public void addStaticMacAddress(String elanInstanceName, String interfaceName, String macAddress) {
404         ElanInterface existingElanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(interfaceName);
405         PhysAddress updateStaticMacAddress = new PhysAddress(macAddress);
406         if (existingElanInterface != null) {
407             List<PhysAddress> existingMacAddress = existingElanInterface.getStaticMacEntries();
408             if (existingMacAddress.contains(updateStaticMacAddress)) {
409                 return;
410             }
411             existingMacAddress.add(updateStaticMacAddress);
412             ElanInterface elanInterface = new ElanInterfaceBuilder().setElanInstanceName(elanInstanceName)
413                 .setName(interfaceName).setStaticMacEntries(existingMacAddress)
414                 .setDescription(existingElanInterface.getDescription()).setKey(new ElanInterfaceKey(interfaceName))
415                 .build();
416             MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION,
417                 ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName), elanInterface);
418         }
419     }
420
421     @Override
422     public void deleteStaticMacAddress(String elanInstanceName, String interfaceName, String macAddress)
423         throws MacNotFoundException {
424         ElanInterface existingElanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(interfaceName);
425         PhysAddress physAddress = new PhysAddress(macAddress);
426         if (existingElanInterface == null) {
427             return;
428         }
429         List<PhysAddress> existingMacAddress = existingElanInterface.getStaticMacEntries();
430         if (existingMacAddress.contains(physAddress)) {
431             existingMacAddress.remove(physAddress);
432             ElanInterface elanInterface = new ElanInterfaceBuilder().setElanInstanceName(elanInstanceName)
433                 .setName(interfaceName).setStaticMacEntries(existingMacAddress)
434                 .setDescription(existingElanInterface.getDescription()).setKey(new ElanInterfaceKey(interfaceName))
435                 .build();
436             MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION,
437                 ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName), elanInterface);
438         } else {
439             throw new MacNotFoundException("Mac Not Found Exception");
440         }
441     }
442
443     @Override
444     public Collection<MacEntry> getElanMacTable(String elanInstanceName) {
445         Elan elanInfo = ElanUtils.getElanByName(elanInstanceName);
446         List<MacEntry> macAddress = new ArrayList<>();
447         if (elanInfo == null) {
448             return macAddress;
449         }
450         List<String> elanInterfaces = elanInfo.getElanInterfaces();
451         if (elanInterfaces != null && elanInterfaces.size() > 0) {
452             for (String elanInterface : elanInterfaces) {
453                 ElanInterfaceMac elanInterfaceMac = ElanUtils.getElanInterfaceMacByInterfaceName(elanInterface);
454                 if (elanInterfaceMac != null && elanInterfaceMac.getMacEntry() != null
455                     && elanInterfaceMac.getMacEntry().size() > 0) {
456                     macAddress.addAll(elanInterfaceMac.getMacEntry());
457                 }
458             }
459         }
460         return macAddress;
461     }
462
463     @Override
464     public void flushMACTable(String elanInstanceName) {
465         Elan elanInfo = ElanUtils.getElanByName(elanInstanceName);
466         if (elanInfo == null) {
467             return;
468         }
469         List<String> elanInterfaces = elanInfo.getElanInterfaces();
470         if (elanInterfaces == null || elanInterfaces.isEmpty()) {
471             return;
472         }
473         for (String elanInterface : elanInterfaces) {
474             ElanInterfaceMac elanInterfaceMac = ElanUtils.getElanInterfaceMacByInterfaceName(elanInterface);
475             if (elanInterfaceMac.getMacEntry() != null && elanInterfaceMac.getMacEntry().size() > 0) {
476                 List<MacEntry> macEntries = elanInterfaceMac.getMacEntry();
477                 for (MacEntry macEntry : macEntries) {
478                     try {
479                         deleteStaticMacAddress(elanInstanceName, elanInterface, macEntry.getMacAddress().getValue());
480                     } catch (MacNotFoundException e) {
481                         logger.error("Mac Not Found Exception {}", e);
482                         e.printStackTrace();
483                     }
484                 }
485             }
486         }
487
488     }
489
490     @Override
491     public void close() throws Exception {
492         this.elanInstanceManager.close();
493         this.elanL2GatewayProvider.close();
494     }
495
496     public static List<PhysAddress> getPhysAddress(List<String> macAddress) {
497         List<PhysAddress> physAddresses = new ArrayList<>();
498         for (String mac : macAddress) {
499             physAddresses.add(new PhysAddress(mac));
500         }
501         return physAddresses;
502     }
503
504     public List<PhysAddress> getUpdatedPhyAddress(List<PhysAddress> originalAddresses,
505                                                   List<PhysAddress> updatePhyAddresses) {
506         if (updatePhyAddresses != null && !updatePhyAddresses.isEmpty()) {
507             List<PhysAddress> existingClonedPhyAddress = new ArrayList<>();
508             if (originalAddresses != null && !originalAddresses.isEmpty()) {
509                 existingClonedPhyAddress.addAll(0, originalAddresses);
510                 originalAddresses.removeAll(updatePhyAddresses);
511                 updatePhyAddresses.removeAll(existingClonedPhyAddress);
512             }
513         }
514         return updatePhyAddresses;
515     }
516
517     @Override
518     public ElanInstance getElanInstance(String elanName) {
519         return ElanUtils.getElanInstanceByName(elanName);
520     }
521
522     @Override
523     public List<ElanInstance> getElanInstances() {
524         List<ElanInstance> elanList = new ArrayList<>();
525         InstanceIdentifier<ElanInstances> elanInstancesIdentifier = InstanceIdentifier.builder(ElanInstances.class)
526             .build();
527         Optional<ElanInstances> elansOptional = ElanUtils.read(broker, LogicalDatastoreType.CONFIGURATION,
528             elanInstancesIdentifier);
529         if (elansOptional.isPresent()) {
530             elanList.addAll(elansOptional.get().getElanInstance());
531         }
532         return elanList;
533     }
534
535     @Override
536     public List<String> getElanInterfaces(String elanInstanceName) {
537         List<String> elanInterfaces = new ArrayList<>();
538         InstanceIdentifier<ElanInterfaces> elanInterfacesIdentifier = InstanceIdentifier.builder(ElanInterfaces.class)
539             .build();
540         Optional<ElanInterfaces> elanInterfacesOptional = ElanUtils.read(broker, LogicalDatastoreType.CONFIGURATION,
541             elanInterfacesIdentifier);
542         if (!elanInterfacesOptional.isPresent()) {
543             return elanInterfaces;
544         }
545         List<ElanInterface> elanInterfaceList = elanInterfacesOptional.get().getElanInterface();
546         for (ElanInterface elanInterface : elanInterfaceList) {
547             if (elanInterface.getElanInstanceName().equals(elanInstanceName)) {
548                 elanInterfaces.add(elanInterface.getName());
549             }
550         }
551         return elanInterfaces;
552     }
553
554     public boolean getGenerateIntBridgeMac() {
555         return generateIntBridgeMac;
556     }
557
558     public void setGenerateIntBridgeMac(boolean generateIntBridgeMac) {
559         this.generateIntBridgeMac = generateIntBridgeMac;
560     }
561 }