2 * Copyright (c) 2015 China Telecom Beijing Research Institute 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.ovsdb.hwvtepsouthbound.transact;
10 import static org.opendaylight.ovsdb.lib.operations.Operations.op;
12 import java.util.Collection;
13 import java.util.HashMap;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
18 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
19 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
20 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
22 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
23 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundConstants;
24 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundMapper;
25 import org.opendaylight.ovsdb.lib.notation.UUID;
26 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
27 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
28 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalLocator;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorAugmentation;
30 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
35 import com.google.common.base.Optional;
37 public class TransactUtils {
38 private static final Logger LOG = LoggerFactory.getLogger(TransactUtils.class);
40 public static Node getCreated(DataObjectModification<Node> mod) {
41 if((mod.getModificationType() == ModificationType.WRITE)
42 && (mod.getDataBefore() == null)){
43 return mod.getDataAfter();
48 public static Node getRemoved(DataObjectModification<Node> mod) {
49 if(mod.getModificationType() == ModificationType.DELETE){
50 return mod.getDataBefore();
55 public static Node getUpdated(DataObjectModification<Node> mod) {
57 switch(mod.getModificationType()) {
58 case SUBTREE_MODIFIED:
59 node = mod.getDataAfter();
62 if(mod.getDataBefore() != null) {
63 node = mod.getDataAfter();
72 public static Node getOriginal(DataObjectModification<Node> mod) {
74 switch(mod.getModificationType()) {
75 case SUBTREE_MODIFIED:
76 node = mod.getDataBefore();
79 if(mod.getDataBefore() != null) {
80 node = mod.getDataBefore();
84 node = mod.getDataBefore();
92 //TODO: change this function to be generic
93 public static Map<InstanceIdentifier<Node>, Node> extractCreatedOrUpdatedOrRemoved(
94 Collection<DataTreeModification<Node>> changes, Class<Node> class1) {
95 Map<InstanceIdentifier<Node>, Node> result = new HashMap<InstanceIdentifier<Node>, Node>();
96 for(DataTreeModification<Node> change : changes) {
97 final InstanceIdentifier<Node> key = change.getRootPath().getRootIdentifier();
98 final DataObjectModification<Node> mod = change.getRootNode();
99 Node created = getCreated(mod);
100 if (created != null) {
101 result.put(key, created);
103 Node updated = getUpdated(mod);
104 if (updated != null) {
105 result.put(key, updated);
107 Node deleted = getRemoved(mod);
108 if (deleted != null) {
109 result.put(key, deleted);
116 public static <T extends Augmentation<Node>> Map<InstanceIdentifier<? extends DataObject>, T> extractCreated(
117 Collection<DataTreeModification<Node>> changes, Class<T> class1) {
118 // TODO Auto-generated method stub
119 Map<InstanceIdentifier<?>, T> result =
120 new HashMap<InstanceIdentifier<?>, T>();
121 if(changes != null && !changes.isEmpty()) {
122 for(DataTreeModification<Node> change : changes) {
123 final InstanceIdentifier<Node> key = change.getRootPath().getRootIdentifier();
124 final DataObjectModification<Node> mod = change.getRootNode();
125 Node created = getCreated(mod);
126 if(created != null) {
127 T logicalSwitch = created.getAugmentation(class1);
128 created.getKey().getNodeId().get
130 InstanceIdentifier<?> iid = change.getRootPath().getRootIdentifier()..augmentation(class1);
131 if(logicalSwitch != null) {
132 result.put(iid, logicalSwitch);
141 public static <D extends org.opendaylight.yangtools.yang.binding.DataObject> Optional<D> readNodeFromConfig(
142 ReadWriteTransaction transaction, final InstanceIdentifier<D> connectionIid) {
143 Optional<D> node = Optional.absent();
145 node = transaction.read(LogicalDatastoreType.CONFIGURATION, connectionIid).checkedGet();
146 } catch (final ReadFailedException e) {
147 LOG.warn("Read Configration/DS for Node failed! {}", connectionIid, e);
152 public static UUID createPhysicalLocator(TransactionBuilder transaction, HwvtepPhysicalLocatorAugmentation inputLocator) {
153 LOG.debug("Creating a physical locator: {}", inputLocator.getDstIp());
154 PhysicalLocator physicalLocator = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), PhysicalLocator.class);
155 setEncapsulationType(physicalLocator, inputLocator);
156 setDstIp(physicalLocator, inputLocator);
157 String locatorUuid = "PhysicalLocator_" + HwvtepSouthboundMapper.getRandomUUID();
158 transaction.add(op.insert(physicalLocator).withId(locatorUuid));
159 return new UUID(locatorUuid);
162 private static final void setEncapsulationType(PhysicalLocator physicalLocator, HwvtepPhysicalLocatorAugmentation inputLocator) {
163 if (inputLocator.getEncapsulationType() != null) {
164 String encapType = HwvtepSouthboundConstants.ENCAPS_TYPE_MAP.get(HwvtepSouthboundMapper.createEncapsulationType(""));
165 physicalLocator.setEncapsulationType(encapType);
169 private static final void setDstIp(PhysicalLocator physicalLocator, HwvtepPhysicalLocatorAugmentation inputLocator) {
170 if (inputLocator.getDstIp() != null) {
171 physicalLocator.setDstIp(inputLocator.getDstIp().getIpv4Address().getValue());