Update MRI projects for Aluminium
[ovsdb.git] / southbound / southbound-impl / src / main / java / org / opendaylight / ovsdb / southbound / transactions / md / OvsdbNodeRemoveCommand.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. 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
9 package org.opendaylight.ovsdb.southbound.transactions.md;
10
11 import com.google.common.annotations.VisibleForTesting;
12 import com.google.common.util.concurrent.FluentFuture;
13 import java.util.Map;
14 import java.util.Optional;
15 import java.util.concurrent.ExecutionException;
16 import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
17 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
18 import org.opendaylight.ovsdb.lib.message.TableUpdates;
19 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
20 import org.opendaylight.ovsdb.southbound.OvsdbConnectionInstance;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagedNodeEntry;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagedNodeEntryKey;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagerEntry;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagerEntryKey;
26 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30 public class OvsdbNodeRemoveCommand extends AbstractTransactionCommand {
31     private static final Logger LOG = LoggerFactory.getLogger(OvsdbNodeRemoveCommand.class);
32     private static final long ONE_CONNECTED_MANAGER = 1;
33     private static final long ONE_ACTIVE_CONNECTION_IN_PASSIVE_MODE = 1;
34
35     public OvsdbNodeRemoveCommand(OvsdbConnectionInstance key,TableUpdates updates,DatabaseSchema dbSchema) {
36         super(key,updates,dbSchema);
37     }
38
39     @Override
40     public void execute(ReadWriteTransaction transaction) {
41         FluentFuture<Optional<Node>> ovsdbNodeFuture = transaction.read(
42                 LogicalDatastoreType.OPERATIONAL, getOvsdbConnectionInstance().getInstanceIdentifier());
43         Optional<Node> ovsdbNodeOptional;
44         try {
45             ovsdbNodeOptional = ovsdbNodeFuture.get();
46             if (ovsdbNodeOptional.isPresent()) {
47                 Node ovsdbNode = ovsdbNodeOptional.get();
48                 OvsdbNodeAugmentation ovsdbNodeAugmentation = ovsdbNode.augmentation(OvsdbNodeAugmentation.class);
49                 if (checkIfOnlyConnectedManager(ovsdbNodeAugmentation)) {
50                     if (ovsdbNodeAugmentation != null) {
51                         Map<ManagedNodeEntryKey, ManagedNodeEntry> entries =
52                                 ovsdbNodeAugmentation.getManagedNodeEntry();
53                         if (entries != null) {
54                             for (ManagedNodeEntry managedNode : entries.values()) {
55                                 transaction.delete(
56                                         LogicalDatastoreType.OPERATIONAL, managedNode.getBridgeRef().getValue());
57                             }
58                         } else {
59                             LOG.debug("{} had no managed nodes", ovsdbNode.getNodeId().getValue());
60                         }
61                     } else {
62                         LOG.warn("{} had no OvsdbNodeAugmentation", ovsdbNode.getNodeId().getValue());
63                     }
64                     LOG.debug("Deleting node {} from oper", getOvsdbConnectionInstance().getInstanceIdentifier());
65                     transaction.delete(LogicalDatastoreType.OPERATIONAL,
66                             getOvsdbConnectionInstance().getInstanceIdentifier());
67                 } else {
68                     LOG.debug("Other southbound plugin instances in cluster are connected to the device,"
69                             + " not deleting OvsdbNode from operational data store.");
70                 }
71             }
72         } catch (InterruptedException | ExecutionException e) {
73             LOG.warn("Failure to delete ovsdbNode", e);
74         }
75     }
76
77     @VisibleForTesting
78     boolean checkIfOnlyConnectedManager(OvsdbNodeAugmentation ovsdbNodeAugmentation) {
79         ManagerEntry onlyConnectedManager = null;
80         if (ovsdbNodeAugmentation != null) {
81             int connectedManager = 0;
82             final Map<ManagerEntryKey, ManagerEntry> entries = ovsdbNodeAugmentation.getManagerEntry();
83             if (entries != null) {
84                 for (ManagerEntry manager : entries.values()) {
85                     if (manager.isConnected()) {
86                         connectedManager++;
87                         if (connectedManager > ONE_CONNECTED_MANAGER) {
88                             return false;
89                         }
90                         onlyConnectedManager = manager;
91                     }
92                 }
93             }
94             if (connectedManager == 0) {
95                 return true;
96             }
97
98             /*When switch is listening in passive mode, this number represent number of active connection to the device
99             This is to handle the controller initiated connection scenario, where all the controller will connect, but
100             switch will have only one manager.
101             */
102             if (onlyConnectedManager.getNumberOfConnections().toJava() > ONE_ACTIVE_CONNECTION_IN_PASSIVE_MODE) {
103                 return false;
104             }
105         }
106         return true;
107     }
108 }