EVC delete Command
[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.List;
11 import java.util.Map;
12 import java.util.Map.Entry;
13 import java.util.Set;
14
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
17 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
20 import org.opendaylight.unimgr.impl.UnimgrConstants;
21 import org.opendaylight.unimgr.impl.UnimgrUtils;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.Evc;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.evc.UniDest;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.evc.UniSource;
25 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
26 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
27 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
28 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
29 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
30 import org.opendaylight.yangtools.yang.binding.DataObject;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 import com.google.common.base.Optional;
36 import com.google.common.util.concurrent.CheckedFuture;
37
38 public class EvcDeleteCommand extends AbstractDeleteCommand {
39
40     private static final Logger LOG = LoggerFactory.getLogger(EvcDeleteCommand.class);
41
42     public EvcDeleteCommand(DataBroker dataBroker,
43             AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
44         super.changes = changes;
45         super.dataBroker = dataBroker;
46     }
47
48     @Override
49     public void execute() {
50         Map<InstanceIdentifier<Evc>, Evc> originalEvcs = UnimgrUtils.extractOriginal(changes, Evc.class);
51         Set<InstanceIdentifier<Evc>> removedEvcs = UnimgrUtils.extractRemoved(changes, Evc.class);
52
53         Set<InstanceIdentifier<?>> removedPaths = changes.getRemovedPaths();
54         if (!removedPaths.isEmpty()) {
55             for (InstanceIdentifier<?> removedPath: removedPaths) {
56                 Class<?> type = removedPath.getTargetType();
57                 LOG.info("Removed paths instance identifier {}", type);
58                 if (type.equals(Evc.class)) {
59                     LOG.info("Removed paths instance identifier {}", type);
60                     for (Entry<InstanceIdentifier<Evc>, Evc> evc: originalEvcs.entrySet()) {
61                         if (evc.getKey().equals(type)) {
62                             Evc data = evc.getValue();
63                             List<UniSource> uniSourceLst = data.getUniSource();
64                             for (UniSource uniSource : uniSourceLst) {
65                                 InstanceIdentifier<?> iidUni = uniSource.getUni();
66                                 Node ovsdbNd = getUniOvsdbNode(iidUni);
67                                 List<TerminationPoint> termPointList = ovsdbNd.getTerminationPoint();
68                                 for(TerminationPoint termPoint : termPointList) {
69                                     deleteTerminationPoint(termPoint, ovsdbNd);
70                                 }
71                             }
72                             LOG.info("Removed EVC Source {}", data.getUniSource());
73                             List<UniDest> uniDestLst = data.getUniDest();
74                             for (UniDest uniDest : uniDestLst) {
75                                 InstanceIdentifier<?> iidUni = uniDest.getUni();
76                                 Node ovsdbNd = getUniOvsdbNode(iidUni);
77                                 List<TerminationPoint> termPointList = ovsdbNd.getTerminationPoint();
78                                 for(TerminationPoint termPoint : termPointList) {
79                                     deleteTerminationPoint(termPoint, ovsdbNd);
80                                 }
81                             }
82                             LOG.info("Removed EVC Destination {}", data.getUniDest());
83                         }
84                     }
85                 }
86             }
87         }
88     }
89
90     private Node getUniOvsdbNode(InstanceIdentifier<?> iidUni) {
91         Optional<Node> nodeOpt = UnimgrUtils.readNode(dataBroker, iidUni);
92         if (nodeOpt.isPresent()) {
93             return  nodeOpt.get();
94         }
95         return null;
96     }
97
98     private boolean deleteTerminationPoint(TerminationPoint termPoint, Node ovsdbNode) {
99         boolean result = false;
100         InstanceIdentifier<TerminationPoint> terminationPointPath = InstanceIdentifier
101                 .create(NetworkTopology.class)
102                 .child(Topology.class, new TopologyKey(UnimgrConstants.OVSDB_TOPOLOGY_ID))
103                 .child(Node.class,ovsdbNode.getKey())
104                 .child(TerminationPoint.class, termPoint.getKey());
105         final WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
106         transaction.delete(LogicalDatastoreType.OPERATIONAL, terminationPointPath);
107         CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
108         try {
109             future.checkedGet();
110             result = true;
111         } catch (TransactionCommitFailedException e) {
112             LOG.warn("Failed to delete {} ", terminationPointPath, e);
113         }
114         return result;
115     }
116 }