*/
package org.opendaylight.netvirt.elan.l2gw.ha.commands;
-import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.OPERATIONAL;
import static org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil.isEmptyList;
import java.io.Serializable;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
+import java.util.Optional;
import java.util.stream.Collectors;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
-import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacs;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.locator.set.attributes.LocatorSet;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
import org.opendaylight.yangtools.concepts.Builder;
import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.Identifiable;
import org.opendaylight.yangtools.yang.binding.Identifier;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.slf4j.Logger;
private static final Logger LOG = LoggerFactory.getLogger(MergeCommand.class);
+ Class<? extends Identifiable> classType = getType();
+
public List<T> transformOpData(List<T> existingData, List<T> src, InstanceIdentifier<Node> nodePath) {
- if (isEmptyList(src)) {
- return new ArrayList<>();
- }
List<T> added = diffOf(src, existingData);//do not add existing data again
return transform(nodePath, added);
}
public List<T> transformConfigData(List<T> updatedSrc, InstanceIdentifier<Node> nodePath) {
- if (isEmptyList(updatedSrc)) {
- return new ArrayList<>();//what difference returning null makes ?
- }
return transform(nodePath, updatedSrc);
}
return result;
}
- //TODO validate the perf of the following against direct setting of the data in dst node
- public void transformUpdate(List<T> existing,
- List<T> updated,
- List<T> orig,
- InstanceIdentifier<Node> nodePath,
- LogicalDatastoreType datastoreType,
- ReadWriteTransaction tx) {
-
- if (updated == null) {
- updated = new ArrayList<>();
- }
- if (orig == null) {
- orig = new ArrayList<>();
- }
- List<T> added = new ArrayList<>(updated);
-
- added.removeAll(orig);
- added = diffOf(added, existing);//do not add the existing data again
- if (added.size() > 0) {
- for (T addedItem : added) {
- InstanceIdentifier<T> transformedId = generateId(nodePath, addedItem);
- T transformedItem = transform(nodePath, addedItem);
- String nodeId = transformedId.firstKeyOf(Node.class).getNodeId().getValue();
- LOG.trace("adding {} {} {}", getDescription(), nodeId, getKey(transformedItem));
- tx.mergeParentStructurePut(datastoreType, transformedId, transformedItem);
- }
- }
- List<T> removed = new ArrayList<>(orig);
- removed = diffByKey(removed, updated);
+ Class<? extends Identifiable> getType() {
+ Type type = getClass().getGenericSuperclass();
+ return (Class<? extends Identifiable>)((ParameterizedType) type).getActualTypeArguments()[0];
- List<T> removedTransformed = new ArrayList<>();
- for (T ele : removed) {
- removedTransformed.add(transform(nodePath, ele));
- }
+ }
- List<T> skip = diffByKey(removedTransformed, existing);//skip the ones which are not present in cfg ds
- removedTransformed = diffByKey(removedTransformed, skip);
- if (removedTransformed.size() > 0) {
- for (T removedItem : removedTransformed) {
- InstanceIdentifier<T> transformedId = generateId(nodePath, removedItem);
- String nodeId = transformedId.firstKeyOf(Node.class).getNodeId().getValue();
- LOG.trace("removing {} {} {}",getDescription(), nodeId, getKey(removedItem));
- tx.delete(datastoreType, transformedId);
- }
- }
+ <T extends DataObject> boolean isDataUpdated(Optional<T> existingDataOptional, T newData) {
+ return !existingDataOptional.isPresent() || !Objects.equals(existingDataOptional.get(), newData);
}
public List<T> transform(InstanceIdentifier<Node> nodePath, List<T> list) {
List<T> origDstData = getDataSafe(existingData);
List<T> srcData = getDataSafe(src);
List<T> data = transformOpData(origDstData, srcData, nodePath);
+ if (classType == RemoteUcastMacs.class) {
+ return;
+ }
setData(dst, data);
if (!isEmptyList(data)) {
String nodeId = nodePath.firstKeyOf(Node.class).getNodeId().getValue();
}
}
- @Override
- public void mergeOpUpdate(Z origDst,
- Z updatedSrc,
- Z origSrc,
- InstanceIdentifier<Node> nodePath,
- ReadWriteTransaction tx) {
- List<T> updatedData = getData(updatedSrc);
- List<T> origData = getData(origSrc);
- List<T> existingData = getData(origDst);
- transformUpdate(existingData, updatedData, origData, nodePath, OPERATIONAL, tx);
- }
-
- boolean areSameSize(@Nullable List objA, @Nullable List objB) {
+ boolean areSameSize(@Nullable List objA,@Nullable List objB) {
if (HwvtepHAUtil.isEmptyList(objA) && HwvtepHAUtil.isEmptyList(objB)) {
return true;
}