Bulk merge of l2gw changes
[netvirt.git] / elanmanager / impl / src / main / java / org / opendaylight / netvirt / elan / l2gw / listeners / L2GwTransportZoneListener.java
1 /*
2  * Copyright (c) 2020 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.l2gw.listeners;
10
11 import static org.opendaylight.mdsal.binding.util.Datastore.CONFIGURATION;
12
13 import com.google.common.collect.Lists;
14 import java.util.Collection;
15 import java.util.Map;
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;
39
40 /**
41  * The listener class for ITM transport zone updates.
42  */
43 @Singleton
44 public class L2GwTransportZoneListener extends AbstractClusteredAsyncDataTreeChangeListener<TransportZone> {
45
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;
54
55     @Inject
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;
69     }
70
71     public void init() {
72         LOG.info("{} init", getClass().getSimpleName());
73     }
74
75     public Collection<TransportZone> getZones() {
76         return transportZoneMap.values();
77     }
78
79     @Override
80     public void remove(InstanceIdentifier<TransportZone> key, TransportZone dataObjectModification) {
81         transportZoneMap.remove(key);
82         createL2gwZeroDayConfig();
83         // do nothing
84     }
85
86     @Override
87     public void update(InstanceIdentifier<TransportZone> key, TransportZone dataObjectModificationBefore,
88                           TransportZone dataObjectModificationAfter) {
89         transportZoneMap.put(key, dataObjectModificationAfter);
90         createL2gwZeroDayConfig();
91         // do nothing
92     }
93
94     @Override
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);
103         }
104         createL2gwZeroDayConfig();
105     }
106
107     public void createL2gwZeroDayConfig() {
108         l2GatewayCache.getAll().stream().forEach(l2GwDevice -> {
109             createZeroDayForL2Device(l2GwDevice);
110         });
111     }
112
113     public void createZeroDayForL2Device(L2GatewayDevice l2GwDevice) {
114         if (l2GwDevice.getL2GatewayIds() == null || l2GwDevice.getL2GatewayIds().isEmpty()) {
115             LOG.error("Skipping zero day config for {}", l2GwDevice.getHwvtepNodeId());
116             return;
117         }
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());
125                 }));
126
127             });
128         });
129     }
130 }