Ensure termination points are correctly deleted
[unimgr.git] / impl / src / main / java / org / opendaylight / unimgr / command / EvcDeleteCommand.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.Map;
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.controller.md.sal.common.api.data.TransactionCommitFailedException;
17 import org.opendaylight.unimgr.impl.UnimgrConstants;
18 import org.opendaylight.unimgr.impl.UnimgrMapper;
19 import org.opendaylight.unimgr.impl.UnimgrUtils;
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.unimgr.rev151012.Evc;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.UniAugmentation;
23 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
24 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
25 import org.opendaylight.yangtools.yang.binding.DataObject;
26 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30 import com.google.common.base.Optional;
31 import com.google.common.util.concurrent.CheckedFuture;
32
33 public class EvcDeleteCommand extends AbstractDeleteCommand {
34
35     private static final Logger LOG = LoggerFactory.getLogger(EvcDeleteCommand.class);
36
37     public EvcDeleteCommand(DataBroker dataBroker,
38             AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
39         super.changes = changes;
40         super.dataBroker = dataBroker;
41     }
42
43     @Override
44     public void execute() {
45         Map<InstanceIdentifier<?>, DataObject> originalData = changes.getOriginalData();
46         Set<InstanceIdentifier<?>> removedIids = changes.getRemovedPaths();
47         for (InstanceIdentifier<?> evcIid : removedIids) {
48             DataObject removedDataObject = originalData.get(evcIid);
49             if (removedDataObject instanceof Evc) {
50                 Evc evc = (Evc)removedDataObject;
51                 Optional<Node> optionalSourceUniNode = UnimgrUtils.readNode(dataBroker,
52                                                                              LogicalDatastoreType.OPERATIONAL,
53                                                                              evc.getUniSource()
54                                                                                 .iterator()
55                                                                                 .next()
56                                                                                 .getUni());
57                 Optional<Node> optionalDestinationUniNode = UnimgrUtils.readNode(dataBroker,
58                                                                                    LogicalDatastoreType.OPERATIONAL,
59                                                                                    evc.getUniDest()
60                                                                                       .iterator()
61                                                                                       .next()
62                                                                                       .getUni());
63                 if (optionalSourceUniNode.isPresent()
64                         && optionalDestinationUniNode.isPresent()) {
65                     Node sourceUniNode = optionalSourceUniNode.get();
66                     Node destUniNode = optionalDestinationUniNode.get();
67                     UniAugmentation sourceUniAugmentation = sourceUniNode
68                                                                 .getAugmentation(UniAugmentation.class);
69                     UniAugmentation destUniAugmentation = destUniNode
70                                                               .getAugmentation(UniAugmentation.class);
71                     InstanceIdentifier<Node> sourceOvsdbIid =
72                                                  sourceUniAugmentation
73                                                      .getOvsdbNodeRef()
74                                                      .getValue()
75                                                      .firstIdentifierOf(Node.class);
76                     InstanceIdentifier<Node> destOvsdbIid =
77                                                  destUniAugmentation
78                                                      .getOvsdbNodeRef()
79                                                      .getValue()
80                                                      .firstIdentifierOf(Node.class);
81                     Optional<Node> optionalSourceOvsdNode =
82                                        UnimgrUtils.readNode(dataBroker,
83                                                             LogicalDatastoreType.OPERATIONAL,
84                                                             sourceOvsdbIid);
85                     Optional<Node> optionalDestinationOvsdbNode =
86                                        UnimgrUtils.readNode(dataBroker,
87                                                             LogicalDatastoreType.OPERATIONAL,
88                                                             destOvsdbIid);
89                     if (optionalSourceOvsdNode.isPresent()
90                             && optionalDestinationOvsdbNode.isPresent()) {
91                         Node sourceOvsdbNode = optionalSourceOvsdNode.get();
92                         Node destinationOvsdbNode = optionalDestinationOvsdbNode.get();
93                         OvsdbNodeAugmentation sourceOvsdbNodeAugmentation = sourceOvsdbNode
94                                 .getAugmentation(OvsdbNodeAugmentation.class);
95                         OvsdbNodeAugmentation destinationOvsdbNodeAugmentation = destinationOvsdbNode
96                                 .getAugmentation(OvsdbNodeAugmentation.class);
97                         InstanceIdentifier<Node> sourceBridgeIid = sourceOvsdbNodeAugmentation.getManagedNodeEntry()
98                                 .iterator().next().getBridgeRef().getValue().firstIdentifierOf(Node.class);
99                         InstanceIdentifier<Node> destinationBridgeIid = destinationOvsdbNodeAugmentation
100                                 .getManagedNodeEntry().iterator().next().getBridgeRef().getValue()
101                                 .firstIdentifierOf(Node.class);
102                         CheckedFuture<Void, TransactionCommitFailedException> deleteOperNodeResult = UnimgrUtils
103                                 .deleteNode(dataBroker, sourceBridgeIid, LogicalDatastoreType.CONFIGURATION);
104                         CheckedFuture<Void, TransactionCommitFailedException> deleteConfigNodeResult = UnimgrUtils
105                                 .deleteNode(dataBroker, destinationBridgeIid, LogicalDatastoreType.CONFIGURATION);
106                         try {
107                             deleteOperNodeResult.checkedGet();
108                             deleteConfigNodeResult.checkedGet();
109                             if (deleteOperNodeResult.isDone() && deleteConfigNodeResult.isDone()) {
110                                 UnimgrUtils.createBridgeNode(dataBroker, sourceOvsdbIid,
111                                         sourceUniNode.getAugmentation(UniAugmentation.class),
112                                         UnimgrConstants.DEFAULT_BRIDGE_NAME);
113                                 UnimgrUtils.createBridgeNode(dataBroker, destOvsdbIid,
114                                         destUniNode.getAugmentation(UniAugmentation.class),
115                                         UnimgrConstants.DEFAULT_BRIDGE_NAME);
116                             }
117                         } catch (TransactionCommitFailedException e) {
118                             LOG.error("Unable to delete bridges.");
119                         }
120                     } else {
121                         LOG.info("Unable to retrieve the Ovsdb node source and/or destination.");
122                     }
123                 } else {
124                     LOG.info("Unable to retrieve the Uni source and/or destination.");
125                 }
126             }
127         }
128     }
129 }