Bulk merge of l2gw changes
[netvirt.git] / elanmanager / impl / src / main / java / org / opendaylight / netvirt / elan / l2gw / recovery / impl / L2GatewayConnectionInstanceRecoveryHandler.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 static org.opendaylight.mdsal.binding.util.Datastore.CONFIGURATION;
11
12 import java.util.Optional;
13 import java.util.concurrent.ExecutionException;
14 import javax.inject.Inject;
15 import javax.inject.Singleton;
16 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
17 import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
18 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
19 import org.opendaylight.mdsal.binding.api.DataBroker;
20 import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunner;
21 import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunnerImpl;
22 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
23 import org.opendaylight.netvirt.elan.l2gw.utils.L2GatewayConnectionUtils;
24 import org.opendaylight.serviceutils.srm.ServiceRecoveryInterface;
25 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.connections.attributes.L2gatewayConnections;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.connections.attributes.l2gatewayconnections.L2gatewayConnection;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.connections.attributes.l2gatewayconnections.L2gatewayConnectionKey;
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.NetvirtL2gwConnection;
32 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36
37 @Singleton
38 public class L2GatewayConnectionInstanceRecoveryHandler implements ServiceRecoveryInterface {
39
40     private static final Logger LOG = LoggerFactory.getLogger(L2GatewayConnectionInstanceRecoveryHandler.class);
41
42     private final ManagedNewTransactionRunner txRunner;
43     private final DataBroker dataBroker;
44     private ServiceRecoveryRegistry serviceRecoveryRegistry;
45     private JobCoordinator jobCoordinator;
46     private L2GatewayConnectionUtils l2GatewayConnectionUtils;
47     private EntityOwnershipUtils entityOwnershipUtils;
48
49     @Inject
50     public L2GatewayConnectionInstanceRecoveryHandler(DataBroker dataBroker,
51                                                       ServiceRecoveryRegistry serviceRecoveryRegistry,
52                                                       JobCoordinator jobCoordinator,
53                                                       L2GatewayConnectionUtils l2GatewayConnectionUtils,
54                                                       EntityOwnershipUtils entityOwnershipUtils) {
55         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
56         this.dataBroker = dataBroker;
57         this.serviceRecoveryRegistry = serviceRecoveryRegistry;
58         this.jobCoordinator = jobCoordinator;
59         this.l2GatewayConnectionUtils = l2GatewayConnectionUtils;
60         this.entityOwnershipUtils = entityOwnershipUtils;
61         serviceRecoveryRegistry.registerServiceRecoveryRegistry(buildServiceRegistryKey(),this);
62     }
63
64     @Override
65     @SuppressWarnings("ForbidCertainMethod")
66     public void recoverService(String entityId) {
67         LOG.info("recover l2gateway connection {}", entityId);
68         // Fetch the l2 gateway connection from l2 gateway connection config DS first.
69         Uuid uuid = Uuid.getDefaultInstance(entityId);
70
71         InstanceIdentifier<L2gatewayConnection> connectionInstanceIdentifier = InstanceIdentifier.create(Neutron.class)
72                 .child(L2gatewayConnections.class)
73                 .child(L2gatewayConnection.class, new L2gatewayConnectionKey(uuid));
74
75         Optional<L2gatewayConnection> l2gatewayConnectionOptional = Optional.empty();
76         try {
77             l2gatewayConnectionOptional = SingleTransactionDataBroker.syncReadOptional(
78                     dataBroker, LogicalDatastoreType.CONFIGURATION, connectionInstanceIdentifier);
79         } catch (ExecutionException | InterruptedException e) {
80             LOG.error("recoverService: Exception while reading L2gatewayConnection DS", e);
81         }
82         //l2GatewayConnectionUtils.addL2GatewayConnection(l2gatewayConnectionOptional.get());
83
84         L2gatewayConnection l2gatewayConnection = l2gatewayConnectionOptional.get();
85
86         LOG.info("deleting l2 gateway connection {}",l2gatewayConnection.key());
87         txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION,
88             tx -> tx.delete(connectionInstanceIdentifier));
89         LOG.info("recreating l2 gateway connection {}, {}",entityId, l2gatewayConnection.key());
90         txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION,
91             tx -> tx.put(connectionInstanceIdentifier,l2gatewayConnection));
92     }
93
94     public String buildServiceRegistryKey() {
95         return NetvirtL2gwConnection.class.toString();
96     }
97 }