import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private ListenerRegistration<HwvtepOperGlobalListener> registration;
private final HwvtepConnectionManager hcm;
private final DataBroker db;
- private final Map<YangInstanceIdentifier, Node> connectedNodes = new ConcurrentHashMap<>();
+ private static final Map<InstanceIdentifier<Node>, Node> CONNECTED_NODES = new ConcurrentHashMap<>();
HwvtepOperGlobalListener(DataBroker db, HwvtepConnectionManager hcm) {
LOG.info("Registering HwvtepOperGlobalListener");
InstanceIdentifier<Node> key = change.getRootPath().getRootIdentifier();
DataObjectModification<Node> mod = change.getRootNode();
InstanceIdentifier<Node> nodeIid = change.getRootPath().getRootIdentifier();
- YangInstanceIdentifier entityId =
- HwvtepSouthboundUtil.getInstanceIdentifierCodec().getYangInstanceIdentifier(nodeIid);
Node node = getCreated(mod);
if (node != null) {
- connectedNodes.put(entityId, node);
+ CONNECTED_NODES.put(key, node);
}
node = getRemoved(mod);
if (node != null) {
- connectedNodes.remove(entityId);
+ CONNECTED_NODES.remove(key);
HwvtepConnectionInstance connectionInstance = hcm.getConnectionInstanceFromNodeIid(nodeIid);
if (Objects.equals(connectionInstance.getConnectionInfo().getRemotePort(),
HwvtepSouthboundUtil.getRemotePort(node))) {
return null;
}
- public Map<YangInstanceIdentifier, Node> getConnectedNodes() {
- return Collections.unmodifiableMap(connectedNodes);
+ public Map<InstanceIdentifier<Node>, Node> getConnectedNodes() {
+ return Collections.unmodifiableMap(CONNECTED_NODES);
}
private InstanceIdentifier<Node> getWildcardPath() {
.child(Node.class);
return path;
}
+
+ public static Node getNode(InstanceIdentifier<Node> key) {
+ return CONNECTED_NODES.get(key);
+ }
}
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
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.NodeKey;
+import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.Identifiable;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException;
public static <D extends org.opendaylight.yangtools.yang.binding.DataObject> Optional<D> readNode(
ReadWriteTransaction transaction, final InstanceIdentifier<D> connectionIid) {
- Optional<D> node = Optional.absent();
+ return readNode(transaction, LogicalDatastoreType.OPERATIONAL, connectionIid);
+ }
+
+ public static <D extends DataObject> Optional<D> readNode(ReadTransaction transaction,
+ LogicalDatastoreType logicalDatastoreType,
+ InstanceIdentifier<D> connectionIid) {
+ if (logicalDatastoreType == LogicalDatastoreType.OPERATIONAL) {
+ if (HwvtepOperGlobalListener.getNode((InstanceIdentifier<Node>) connectionIid) != null) {
+ return Optional.of((D)HwvtepOperGlobalListener.getNode((InstanceIdentifier<Node>)connectionIid));
+ } else {
+ LOG.debug("Node not available in cache. Read from datastore - {}", connectionIid);
+ }
+ }
try {
- node = transaction.read(LogicalDatastoreType.OPERATIONAL, connectionIid).checkedGet();
- } catch (final ReadFailedException e) {
- LOG.warn("Read Operational/DS for Node failed! {}", connectionIid, e);
+ return transaction.read(logicalDatastoreType, connectionIid).checkedGet();
+ } catch (ReadFailedException e) {
+ LOG.error("Read failed from datastore for Node : {}",connectionIid,e);
+ throw new RuntimeException(e);
}
- return node;
}
public static Optional<HwvtepGlobalAugmentation> getManagingNode(DataBroker db,
import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.OPERATIONAL;
+import com.google.common.base.Optional;
+
import java.util.ArrayList;
import java.util.Collection;
+
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionManager;
import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundMapper;
+import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil;
import org.opendaylight.ovsdb.hwvtepsouthbound.reconciliation.ReconciliationManager;
import org.opendaylight.ovsdb.hwvtepsouthbound.reconciliation.ReconciliationTask;
import org.opendaylight.ovsdb.hwvtepsouthbound.transact.HwvtepOperationalState;
import org.opendaylight.ovsdb.hwvtepsouthbound.transact.TransactCommandAggregator;
-import org.opendaylight.ovsdb.utils.mdsal.utils.ControllerMdsalUtils;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
private final HwvtepConnectionInstance connectionInstance;
private final DataBroker db;
private final Node psNode;
- private final ControllerMdsalUtils mdsalUtils;
public HwvtepReconciliationTask(ReconciliationManager reconciliationManager,
HwvtepConnectionManager connectionManager,
this.db = db;
this.psNode = psNode;
this.connectionInstance = connectionInstance;
- this.mdsalUtils = new ControllerMdsalUtils(db);
}
private void transactChangesToDevice(final Collection<DataTreeModification<Node>> changes,
InstanceIdentifier<Node> psNodeIid = HwvtepSouthboundMapper.createInstanceIdentifier(psNode.getNodeId());
InstanceIdentifier<Node> nodeId = (InstanceIdentifier<Node>)nodeIid;
- Node globalConfigNode = mdsalUtils.read(CONFIGURATION, nodeId);
- Node globalOpNode = mdsalUtils.read(OPERATIONAL, nodeId);
- Node psConfigNode = mdsalUtils.read(CONFIGURATION, psNodeIid);
+ ReadOnlyTransaction tx = reconciliationManager.getDb().newReadOnlyTransaction();
+ Node globalConfigNode = readNode(tx, CONFIGURATION, nodeId);
+ Node globalOpNode = readNode(tx, OPERATIONAL, nodeId);
+ Node psConfigNode = readNode(tx, CONFIGURATION, psNodeIid);
DataTreeModification<Node> change = null;
Collection<DataTreeModification<Node>> changes = new ArrayList<>();
public long retryDelayInMills() {
return 0;
}
+
+ private Node readNode(ReadTransaction transaction,
+ LogicalDatastoreType logicalDatastoreType, InstanceIdentifier<Node> iid) {
+ Optional<Node> optional = HwvtepSouthboundUtil.readNode(transaction, logicalDatastoreType, iid);
+ if (optional.isPresent()) {
+ return optional.get();
+ }
+ return null;
+ }
}
package org.opendaylight.ovsdb.hwvtepsouthbound.transact;
+import com.google.common.base.Optional;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepDeviceInfo;
-import org.opendaylight.ovsdb.utils.mdsal.utils.ControllerMdsalUtils;
+import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
import org.opendaylight.yangtools.yang.binding.DataObject;
class ConfigDependencyGetter extends DependencyGetter {
@Override
boolean isDependencyMet(HwvtepOperationalState opState, HwvtepDeviceInfo deviceInfo,
- Class<? extends Identifiable> cls, InstanceIdentifier<? extends DataObject> key) {
- return deviceInfo.isConfigDataAvailable(cls, key) || isConfigDataAvailable(opState, key);
+ Class<? extends Identifiable> cls, InstanceIdentifier<? extends DataObject> key) {
+ return deviceInfo.isConfigDataAvailable(cls, key) || isConfigDataAvailable(opState, cls, key);
}
- boolean isConfigDataAvailable(HwvtepOperationalState opState, InstanceIdentifier<? extends DataObject> key) {
+ boolean isConfigDataAvailable(HwvtepOperationalState opState,
+ Class<? extends Identifiable> cls,
+ InstanceIdentifier<? extends DataObject> key) {
DataBroker db = opState.getConnectionInstance().getDataBroker();
- ControllerMdsalUtils mdsalUtils = new ControllerMdsalUtils(db);
- return mdsalUtils.read(LogicalDatastoreType.CONFIGURATION, key) != null;
+ ReadOnlyTransaction tx = db.newReadOnlyTransaction();
+ Optional data = HwvtepSouthboundUtil.readNode(tx, LogicalDatastoreType.CONFIGURATION, key);
+ tx.close();
+ if (data.isPresent()) {
+ opState.getDeviceInfo().updateConfigData(cls, key, data.get());
+ return true;
+ }
+ return false;
}
}