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.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.genius.infra.ManagedNewTransactionRunner;
17 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
18 import org.opendaylight.mdsal.binding.api.DataBroker;
19 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
20 import org.opendaylight.netvirt.elan.l2gw.utils.L2GatewayConnectionUtils;
21 import org.opendaylight.serviceutils.srm.ServiceRecoveryInterface;
22 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.connections.attributes.L2gatewayConnections;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.connections.attributes.l2gatewayconnections.L2gatewayConnection;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateways.attributes.L2gateways;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateways.attributes.l2gateways.L2gateway;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateways.attributes.l2gateways.L2gatewayKey;
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.NetvirtL2gwNode;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
37 public class L2GatewayInstanceRecoveryHandler implements ServiceRecoveryInterface {
39 private static final Logger LOG = LoggerFactory.getLogger(L2GatewayInstanceRecoveryHandler.class);
41 private final ManagedNewTransactionRunner managedNewTransactionRunner;
42 private final DataBroker dataBroker;
43 private L2GatewayConnectionUtils l2GatewayConnectionUtils;
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);
55 @SuppressWarnings("ForbidCertainMethod")
56 public void recoverService(String entityId) {
57 LOG.info("recover l2gateway {}", entityId);
58 Uuid uuid = Uuid.getDefaultInstance(entityId);
60 InstanceIdentifier<L2gateway> l2gatewayInstanceIdentifier = InstanceIdentifier.create(Neutron.class)
61 .child(L2gateways.class).child(L2gateway.class, new L2gatewayKey(uuid));
63 Optional<L2gateway> l2gatewayOptional = Optional.empty();
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);
71 if (l2gatewayOptional.isPresent()) {
72 L2gateway l2gateway = l2gatewayOptional.get();
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 {}",
80 for (L2gatewayConnection l2gatewayConnection : l2gatewayConnections) {
81 InstanceIdentifier<L2gatewayConnection> identifier = InstanceIdentifier
82 .create(Neutron.class)
83 .child(L2gatewayConnections.class)
84 .child(L2gatewayConnection.class, l2gatewayConnection.key());
86 LOG.info("Deleting l2 gateway connection {}", l2gatewayConnection.key());
87 managedNewTransactionRunner.callWithNewWriteOnlyTransactionAndSubmit(
88 tx -> tx.delete(LogicalDatastoreType.CONFIGURATION, identifier)).get();
89 LOG.info("Recreating l2 gateway connection {}", l2gatewayConnection.key());
90 managedNewTransactionRunner.callWithNewWriteOnlyTransactionAndSubmit(
91 tx -> tx.put(LogicalDatastoreType.CONFIGURATION, identifier,
92 l2gatewayConnection)).get();
93 } catch (InterruptedException | ExecutionException e) {
94 LOG.error("Service recovery failed for l2gw {}", entityId);
97 LOG.info("Finished recreation of all l2 gateway connections of l2 gateway instance {}",
102 public String buildServiceRegistryKey() {
103 return NetvirtL2gwNode.class.toString();