457c7314f1d6bcb38e5c9fc8688c8169f2729290
[netvirt.git] / vpnservice / elanmanager / elanmanager-impl / src / main / java / org / opendaylight / netvirt / elan / utils / ElanClusterUtils.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 package org.opendaylight.netvirt.elan.utils;
9
10 import com.google.common.base.Optional;
11 import com.google.common.util.concurrent.Futures;
12 import com.google.common.util.concurrent.ListenableFuture;
13 import com.google.common.util.concurrent.MoreExecutors;
14 import com.google.common.util.concurrent.SettableFuture;
15 import java.util.Collections;
16 import java.util.List;
17 import java.util.concurrent.Callable;
18 import java.util.function.Function;
19 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
20 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
22 import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
23 import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
24 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
25 import org.opendaylight.netvirt.elan.l2gw.utils.SettableFutureCallback;
26 import org.opendaylight.yangtools.yang.binding.DataObject;
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 public final class ElanClusterUtils {
32     private static final Logger LOG = LoggerFactory.getLogger(ElanClusterUtils.class);
33
34     private ElanClusterUtils() {
35     }
36
37     public static void runOnlyInOwnerNode(EntityOwnershipUtils entityOwnershipUtils, String jobDesc, Runnable job) {
38         entityOwnershipUtils.runOnlyInOwnerNode(HwvtepSouthboundConstants.ELAN_ENTITY_TYPE,
39             HwvtepSouthboundConstants.ELAN_ENTITY_NAME, DataStoreJobCoordinator.getInstance(), jobDesc, job);
40     }
41
42     public static void runOnlyInOwnerNode(EntityOwnershipUtils entityOwnershipUtils, String jobKey, String jobDesc,
43             Callable<List<ListenableFuture<Void>>> job) {
44         entityOwnershipUtils.runOnlyInOwnerNode(HwvtepSouthboundConstants.ELAN_ENTITY_TYPE,
45             HwvtepSouthboundConstants.ELAN_ENTITY_NAME, DataStoreJobCoordinator.getInstance(), jobKey, jobDesc, job);
46     }
47
48     public static <T extends DataObject> void asyncReadAndExecute(final DataBroker broker,
49                                                                   final LogicalDatastoreType datastoreType,
50                                                                   final InstanceIdentifier<T> iid,
51                                                                   final String jobKey,
52                                                                   final Function<Optional<T>, Void> function) {
53         DataStoreJobCoordinator.getInstance().enqueueJob(jobKey, () -> {
54             SettableFuture settableFuture = SettableFuture.create();
55             List<ListenableFuture<Void>> futures = Collections.singletonList(settableFuture);
56
57             ReadWriteTransaction tx = broker.newReadWriteTransaction();
58
59             Futures.addCallback(tx.read(datastoreType, iid),
60                                 new SettableFutureCallback<Optional<T>>(settableFuture) {
61                         @Override
62                         public void onSuccess(Optional<T> data) {
63                             function.apply(data);
64                             super.onSuccess(data);
65                         }
66                     }, MoreExecutors.directExecutor());
67
68             return futures;
69         }, ElanConstants.JOB_MAX_RETRIES);
70     }
71 }