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