Remove GENIUS UTIL references in Elanmanager Module
[netvirt.git] / elanmanager / impl / src / main / java / org / opendaylight / netvirt / elan / l2gw / recovery / impl / L2GatewayInstanceRecoveryHandler.java
1 /*
2  * Copyright (c) 2019 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.l2gw.recovery.impl;
9
10 import java.util.List;
11 import java.util.Optional;
12 import java.util.concurrent.ExecutionException;
13 import javax.inject.Inject;
14 import javax.inject.Singleton;
15 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
16 import org.opendaylight.mdsal.binding.api.DataBroker;
17 import org.opendaylight.mdsal.binding.util.Datastore;
18 import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunner;
19 import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunnerImpl;
20 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
21 import org.opendaylight.netvirt.elan.l2gw.utils.L2GatewayConnectionUtils;
22 import org.opendaylight.serviceutils.srm.ServiceRecoveryInterface;
23 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.connections.attributes.L2gatewayConnections;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.connections.attributes.l2gatewayconnections.L2gatewayConnection;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateways.attributes.L2gateways;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateways.attributes.l2gateways.L2gateway;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateways.attributes.l2gateways.L2gatewayKey;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.serviceutils.srm.types.rev180626.NetvirtL2gwNode;
32 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36 @Singleton
37 public class L2GatewayInstanceRecoveryHandler implements ServiceRecoveryInterface {
38
39     private static final Logger LOG = LoggerFactory.getLogger(L2GatewayInstanceRecoveryHandler.class);
40
41     private final ManagedNewTransactionRunner managedNewTransactionRunner;
42     private final DataBroker dataBroker;
43     private L2GatewayConnectionUtils l2GatewayConnectionUtils;
44
45     @Inject
46     public L2GatewayInstanceRecoveryHandler(DataBroker dataBroker, L2GatewayConnectionUtils l2GatewayConnectionUtils,
47                                             ServiceRecoveryRegistry serviceRecoveryRegistry) {
48         this.dataBroker = dataBroker;
49         this.managedNewTransactionRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
50         this.l2GatewayConnectionUtils = l2GatewayConnectionUtils;
51         serviceRecoveryRegistry.registerServiceRecoveryRegistry(buildServiceRegistryKey(), this);
52     }
53
54     @Override
55     @SuppressWarnings("ForbidCertainMethod")
56     public void recoverService(String entityId) {
57         LOG.info("recover l2gateway {}", entityId);
58         Uuid uuid = Uuid.getDefaultInstance(entityId);
59
60         InstanceIdentifier<L2gateway> l2gatewayInstanceIdentifier = InstanceIdentifier.create(Neutron.class)
61                 .child(L2gateways.class).child(L2gateway.class, new L2gatewayKey(uuid));
62
63         Optional<L2gateway> l2gatewayOptional = Optional.empty();
64         try {
65             l2gatewayOptional = SingleTransactionDataBroker.syncReadOptional(dataBroker,
66                     LogicalDatastoreType.CONFIGURATION, l2gatewayInstanceIdentifier);
67         } catch (ExecutionException | InterruptedException e) {
68             LOG.error("recoverService: Exception while reading L2gateway DS for the entity {}", entityId, e);
69         }
70
71         if (l2gatewayOptional.isPresent()) {
72             L2gateway l2gateway = l2gatewayOptional.get();
73
74             List<L2gatewayConnection> l2gatewayConnections = l2GatewayConnectionUtils
75                 .getL2GwConnectionsByL2GatewayId(uuid);
76             // Do a delete of l2 gateway connection instances.
77             //No null check required since l2gatewayConnections is known to be non-null.
78             LOG.info("Deleting all l2 gateway connections of l2 gateway instance {}",
79                 l2gateway.key());
80             for (L2gatewayConnection l2gatewayConnection : l2gatewayConnections) {
81                 InstanceIdentifier<L2gatewayConnection> identifier = InstanceIdentifier
82                     .create(Neutron.class)
83                     .child(L2gatewayConnections.class)
84                     .child(L2gatewayConnection.class, l2gatewayConnection.key());
85                 try {
86                     LOG.info("Deleting l2 gateway connection {}", l2gatewayConnection.key());
87                     managedNewTransactionRunner.callWithNewWriteOnlyTransactionAndSubmit(Datastore.CONFIGURATION,
88                         tx -> tx.delete(identifier)).get();
89                     LOG.info("Recreating l2 gateway connection {}", l2gatewayConnection.key());
90                     managedNewTransactionRunner.callWithNewWriteOnlyTransactionAndSubmit(Datastore.CONFIGURATION,
91                         tx -> tx.put(identifier, l2gatewayConnection)).get();
92                 } catch (InterruptedException | ExecutionException e) {
93                     LOG.error("Service recovery failed for l2gw {}", entityId);
94                 }
95             }
96             LOG.info("Finished recreation of all l2 gateway connections of l2 gateway instance {}",
97                 l2gateway.key());
98         }
99     }
100
101     public String buildServiceRegistryKey() {
102         return NetvirtL2gwNode.class.toString();
103     }
104 }