2 * Copyright (c) 2020 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
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
9 package org.opendaylight.netvirt.elan.l2gw.listeners;
11 import static org.opendaylight.mdsal.binding.util.Datastore.CONFIGURATION;
13 import com.google.common.collect.Lists;
14 import java.util.Collection;
16 import java.util.concurrent.ConcurrentHashMap;
17 import javax.inject.Inject;
18 import javax.inject.Singleton;
19 import org.opendaylight.infrautils.utils.concurrent.Executors;
20 import org.opendaylight.mdsal.binding.api.DataBroker;
21 import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunner;
22 import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunnerImpl;
23 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
24 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
25 import org.opendaylight.netvirt.elan.l2gw.jobs.AddL2GwDevicesToTransportZoneJob;
26 import org.opendaylight.netvirt.elan.l2gw.utils.L2gwZeroDayConfigUtil;
27 import org.opendaylight.netvirt.elan.utils.ElanClusterUtils;
28 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
29 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
30 import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZones;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
35 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
36 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
41 * The listener class for ITM transport zone updates.
44 public class L2GwTransportZoneListener extends AbstractClusteredAsyncDataTreeChangeListener<TransportZone> {
46 private static final Logger LOG = LoggerFactory.getLogger(L2GwTransportZoneListener.class);
47 private final ItmRpcService itmRpcService;
48 private final L2GatewayCache l2GatewayCache;
49 private final Map<InstanceIdentifier<TransportZone>, TransportZone> transportZoneMap = new ConcurrentHashMap<>();
50 private final HwvtepConfigNodeCache hwvtepConfigNodeCache;
51 private final ElanClusterUtils elanClusterUtils;
52 private final L2gwZeroDayConfigUtil l2gwZeroDayConfigUtil;
53 private final ManagedNewTransactionRunner txRunner;
56 public L2GwTransportZoneListener(final DataBroker dataBroker, final ItmRpcService itmRpcService,
57 final L2GatewayCache l2GatewayCache,
58 final HwvtepConfigNodeCache hwvtepConfigNodeCache,
59 final ElanClusterUtils elanClusterUtils,
60 final L2gwZeroDayConfigUtil l2gwZeroDayConfigUtil) {
61 super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(TransportZones.class)
62 .child(TransportZone.class), Executors.newListeningSingleThreadExecutor("L2GwTransportZoneListener", LOG));
63 this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
64 this.itmRpcService = itmRpcService;
65 this.l2GatewayCache = l2GatewayCache;
66 this.hwvtepConfigNodeCache = hwvtepConfigNodeCache;
67 this.elanClusterUtils = elanClusterUtils;
68 this.l2gwZeroDayConfigUtil = l2gwZeroDayConfigUtil;
72 LOG.info("{} init", getClass().getSimpleName());
75 public Collection<TransportZone> getZones() {
76 return transportZoneMap.values();
80 public void remove(InstanceIdentifier<TransportZone> key, TransportZone dataObjectModification) {
81 transportZoneMap.remove(key);
82 createL2gwZeroDayConfig();
87 public void update(InstanceIdentifier<TransportZone> key, TransportZone dataObjectModificationBefore,
88 TransportZone dataObjectModificationAfter) {
89 transportZoneMap.put(key, dataObjectModificationAfter);
90 createL2gwZeroDayConfig();
95 public void add(InstanceIdentifier<TransportZone> key, TransportZone tzNew) {
96 transportZoneMap.put(key, tzNew);
97 LOG.trace("Received Transport Zone Add Event: {}", tzNew);
98 if (tzNew.getTunnelType().equals(TunnelTypeVxlan.class)) {
99 AddL2GwDevicesToTransportZoneJob job =
100 new AddL2GwDevicesToTransportZoneJob(itmRpcService, tzNew, l2GatewayCache);
101 // jobCoordinator.enqueueJob(job.getJobKey(), job);
102 elanClusterUtils.runOnlyInOwnerNode(job.getJobKey(),"Adding L2GW Transport Zone", job);
104 createL2gwZeroDayConfig();
107 public void createL2gwZeroDayConfig() {
108 l2GatewayCache.getAll().stream().forEach(l2GwDevice -> {
109 createZeroDayForL2Device(l2GwDevice);
113 public void createZeroDayForL2Device(L2GatewayDevice l2GwDevice) {
114 if (l2GwDevice.getL2GatewayIds() == null || l2GwDevice.getL2GatewayIds().isEmpty()) {
115 LOG.error("Skipping zero day config for {}", l2GwDevice.getHwvtepNodeId());
118 LOG.error("Creating zero day config for {}", l2GwDevice.getHwvtepNodeId());
119 InstanceIdentifier<Node> globalIid = HwvtepHAUtil.convertToInstanceIdentifier(
120 l2GwDevice.getHwvtepNodeId());
121 hwvtepConfigNodeCache.runAfterNodeAvailable(globalIid, () -> {
122 elanClusterUtils.runOnlyInOwnerNode(l2GwDevice.getDeviceName(),"Zero day config",() -> {
123 return Lists.newArrayList(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, tx -> {
124 l2gwZeroDayConfigUtil.createZeroDayConfig(tx, globalIid, l2GwDevice, getZones());