Bug 5386: Delete QoS and Queues entries from ovsdb on UNI deletion
[unimgr.git] / impl / src / main / java / org / opendaylight / unimgr / command / UniDeleteCommand.java
1 /*
2  * Copyright (c) 2015 CableLabs 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.unimgr.command;
9
10 import java.util.List;
11 import java.util.Set;
12
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
16 import org.opendaylight.unimgr.impl.UnimgrConstants;
17 import org.opendaylight.unimgr.impl.UnimgrMapper;
18 import org.opendaylight.unimgr.utils.MdsalUtils;
19 import org.opendaylight.unimgr.utils.OvsdbUtils;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeRef;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.QosEntries;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.QosEntriesKey;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.Queues;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.QueuesKey;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.UniAugmentation;
27 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
28 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
29 import org.opendaylight.yangtools.yang.binding.DataObject;
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 import com.google.common.base.Optional;
35
36 public class UniDeleteCommand extends AbstractDeleteCommand {
37
38     private static final Logger LOG = LoggerFactory.getLogger(UniDeleteCommand.class);
39
40     public UniDeleteCommand(DataBroker dataBroker,
41             AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
42         super.changes = changes;
43         super.dataBroker = dataBroker;
44     }
45
46     @Override
47     public void execute() {
48         Set<InstanceIdentifier<UniAugmentation>> removedUnis = OvsdbUtils.extractRemoved(changes,
49                                                                                           UniAugmentation.class);
50         if (!removedUnis.isEmpty()) {
51             for (InstanceIdentifier<UniAugmentation> removedUniIid: removedUnis) {
52                 UniAugmentation uniAugmentation = MdsalUtils.read(dataBroker,
53                                                                    LogicalDatastoreType.OPERATIONAL,
54                                                                    removedUniIid);
55                 if (uniAugmentation != null) {
56                     OvsdbNodeRef ovsNodedRef = uniAugmentation.getOvsdbNodeRef();
57                     InstanceIdentifier<Node> ovsdbNodeIid = ovsNodedRef.getValue().firstIdentifierOf(Node.class);
58                     Optional<Node> optionalNode = MdsalUtils.readNode(dataBroker,
59                                                                        LogicalDatastoreType.OPERATIONAL,
60                                                                        ovsdbNodeIid);
61                     if (optionalNode.isPresent()) {
62                         Node ovsdbNode = optionalNode.get();
63                         LOG.info("Delete QoS and Queues entries");
64                         List<QosEntries> qosList = ovsdbNode
65                                 .getAugmentation(OvsdbNodeAugmentation.class)
66                                 .getQosEntries();
67                         QosEntriesKey qosEntryKey = null;
68                         for (final QosEntries qosEntry : qosList) {
69                             qosEntryKey = qosEntry.getKey();
70                             InstanceIdentifier<QosEntries> qosIid = UnimgrMapper.getOvsdbQoSEntriesIid(ovsdbNode, qosEntryKey);
71                             MdsalUtils.deleteNode(dataBroker, qosIid, LogicalDatastoreType.CONFIGURATION);
72                         }
73
74                         List<Queues> queuesList = ovsdbNode
75                                 .getAugmentation(OvsdbNodeAugmentation.class)
76                                 .getQueues();
77                         QueuesKey queuesKey = null;
78                         for (final Queues queue : queuesList) {
79                             queuesKey = queue.getKey();
80                             InstanceIdentifier<Queues> queuesIid = UnimgrMapper.getOvsdbQueuesIid(ovsdbNode, queuesKey);
81                             MdsalUtils.deleteNode(dataBroker, queuesIid, LogicalDatastoreType.CONFIGURATION);
82                         }
83
84                         LOG.info("Delete bridge node");
85                         InstanceIdentifier<Node> bridgeIid = UnimgrMapper.getOvsdbBridgeNodeIid(ovsdbNode);
86                         Optional<Node> optBridgeNode = MdsalUtils.readNode(dataBroker, bridgeIid);
87                         if (optBridgeNode.isPresent()) {
88                             Node bridgeNode = optBridgeNode.get();
89                             InstanceIdentifier<TerminationPoint> iidTermPoint = UnimgrMapper.getTerminationPointIid(bridgeNode,
90                                                                                             UnimgrConstants.DEFAULT_BRIDGE_NAME);
91                             MdsalUtils.deleteNode(dataBroker, iidTermPoint, LogicalDatastoreType.CONFIGURATION);
92                         }
93                         MdsalUtils.deleteNode(dataBroker, bridgeIid, LogicalDatastoreType.CONFIGURATION);
94                     }
95                     InstanceIdentifier<Node> iidUni = UnimgrMapper.getUniIid(dataBroker, uniAugmentation.getIpAddress(),
96                                                                              LogicalDatastoreType.OPERATIONAL);
97                     if (iidUni != null)
98                         MdsalUtils.deleteNode(dataBroker, iidUni, LogicalDatastoreType.OPERATIONAL);
99                 }
100                 else {
101                     LOG.info("Received Uni Augmentation is null", removedUniIid);
102                 }
103             }
104         }
105     }
106 }