use of org.opendaylight.netconf.topology.singleton.messages.AskForMasterMountPoint in project netconf by opendaylight.
the class NetconfNodeActorTest method testAskForMasterMountPoint.
@Test
public void testAskForMasterMountPoint() {
// Test with master not setup yet.
final TestKit kit = new TestKit(system);
masterRef.tell(new AskForMasterMountPoint(kit.getRef()), kit.getRef());
final Failure failure = kit.expectMsgClass(Failure.class);
assertTrue(failure.cause() instanceof NotMasterException);
// Now initialize - master should send the RegisterMountPoint message.
List<SourceIdentifier> sourceIdentifiers = Lists.newArrayList(RevisionSourceIdentifier.create("testID"));
initializeMaster(sourceIdentifiers);
masterRef.tell(new AskForMasterMountPoint(kit.getRef()), kit.getRef());
final RegisterMountPoint registerMountPoint = kit.expectMsgClass(RegisterMountPoint.class);
assertEquals(sourceIdentifiers, registerMountPoint.getSourceIndentifiers());
}
use of org.opendaylight.netconf.topology.singleton.messages.AskForMasterMountPoint in project netconf by opendaylight.
the class NetconfNodeManagerTest method testSlaveMountPointRegistrationFailuresAndRetries.
@SuppressWarnings("unchecked")
@Test
public void testSlaveMountPointRegistrationFailuresAndRetries() throws InterruptedException, ExecutionException, TimeoutException {
final NodeId nodeId = new NodeId("device");
final NodeKey nodeKey = new NodeKey(nodeId);
final String topologyId = "topology-netconf";
final InstanceIdentifier<Node> nodeListPath = NetconfTopologyUtils.createTopologyNodeListPath(nodeKey, topologyId);
final NetconfNode netconfNode = newNetconfNode();
final Node node = new NodeBuilder().setNodeId(nodeId).addAugmentation(netconfNode).build();
DataObjectModification<Node> mockDataObjModification = mock(DataObjectModification.class);
doReturn(Iterables.getLast(nodeListPath.getPathArguments())).when(mockDataObjModification).getIdentifier();
doReturn(WRITE).when(mockDataObjModification).getModificationType();
doReturn(node).when(mockDataObjModification).getDataAfter();
// First try the registration where the perceived master hasn't been initialized as the master.
netconfNodeManager.onDataTreeChanged(Collections.singletonList(new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification)));
verify(mockMountPointBuilder, after(1000).never()).register();
// Initialize the master but drop the initial YangTextSchemaSourceRequest message sent to the master so
// it retries.
initializeMaster();
CompletableFuture<AskForMasterMountPoint> yangTextSchemaSourceRequestFuture = new CompletableFuture<>();
testMasterActorRef.underlyingActor().messagesToDrop.put(YangTextSchemaSourceRequest.class, yangTextSchemaSourceRequestFuture);
netconfNodeManager.onDataTreeChanged(Collections.singletonList(new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification)));
yangTextSchemaSourceRequestFuture.get(5, TimeUnit.SECONDS);
verify(mockMountPointBuilder, timeout(5000)).register();
// Initiate another registration but drop the initial AskForMasterMountPoint message sent to the master so
// it retries.
setupMountPointMocks();
CompletableFuture<AskForMasterMountPoint> askForMasterMountPointFuture = new CompletableFuture<>();
testMasterActorRef.underlyingActor().messagesToDrop.put(AskForMasterMountPoint.class, askForMasterMountPointFuture);
netconfNodeManager.onDataTreeChanged(Collections.singletonList(new NetconfTopologyManagerTest.CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, nodeListPath), mockDataObjModification)));
askForMasterMountPointFuture.get(5, TimeUnit.SECONDS);
verify(mockMountPointReg, timeout(5000)).close();
verify(mockMountPointBuilder, timeout(5000)).register();
reset(mockMountPointService, mockMountPointBuilder, mockMountPointReg);
doNothing().when(mockMountPointReg).close();
netconfNodeManager.close();
verify(mockMountPointReg, timeout(5000)).close();
}
use of org.opendaylight.netconf.topology.singleton.messages.AskForMasterMountPoint in project netconf by opendaylight.
the class NetconfNodeActor method handleReceive.
@SuppressWarnings("checkstyle:IllegalCatch")
@Override
public void handleReceive(final Object message) {
LOG.debug("{}: received message {}", id, message);
if (message instanceof CreateInitialMasterActorData) {
// master
final CreateInitialMasterActorData masterActorData = (CreateInitialMasterActorData) message;
sourceIdentifiers = masterActorData.getSourceIndentifiers();
this.deviceDataBroker = masterActorData.getDeviceDataBroker();
this.netconfService = masterActorData.getNetconfDataTreeService();
final DOMDataTreeReadTransaction tx = deviceDataBroker.newReadOnlyTransaction();
readTxActor = context().actorOf(ReadTransactionActor.props(tx));
this.deviceRpc = masterActorData.getDeviceRpc();
this.deviceAction = masterActorData.getDeviceAction();
sender().tell(new MasterActorDataInitialized(), self());
LOG.debug("{}: Master is ready.", id);
} else if (message instanceof RefreshSetupMasterActorData) {
setup = ((RefreshSetupMasterActorData) message).getNetconfTopologyDeviceSetup();
id = ((RefreshSetupMasterActorData) message).getRemoteDeviceId();
sender().tell(new MasterActorDataInitialized(), self());
} else if (message instanceof AskForMasterMountPoint) {
// master
AskForMasterMountPoint askForMasterMountPoint = (AskForMasterMountPoint) message;
// only master contains reference to deviceDataBroker
if (deviceDataBroker != null) {
LOG.debug("{}: Sending RegisterMountPoint reply to {}", id, askForMasterMountPoint.getSlaveActorRef());
askForMasterMountPoint.getSlaveActorRef().tell(new RegisterMountPoint(sourceIdentifiers, self()), sender());
} else {
LOG.warn("{}: Received {} but we don't appear to be the master", id, askForMasterMountPoint);
sender().tell(new Failure(new NotMasterException(self())), self());
}
} else if (message instanceof YangTextSchemaSourceRequest) {
// master
final YangTextSchemaSourceRequest yangTextSchemaSourceRequest = (YangTextSchemaSourceRequest) message;
sendYangTextSchemaSourceProxy(yangTextSchemaSourceRequest.getSourceIdentifier(), sender());
} else if (message instanceof NewReadTransactionRequest) {
// master
sender().tell(new Success(readTxActor), self());
} else if (message instanceof NewWriteTransactionRequest) {
// master
try {
final DOMDataTreeWriteTransaction tx = deviceDataBroker.newWriteOnlyTransaction();
final ActorRef txActor = context().actorOf(WriteTransactionActor.props(tx, writeTxIdleTimeout));
sender().tell(new Success(txActor), self());
} catch (final Exception t) {
sender().tell(new Failure(t), self());
}
} else if (message instanceof NewReadWriteTransactionRequest) {
try {
final DOMDataTreeReadWriteTransaction tx = deviceDataBroker.newReadWriteTransaction();
final ActorRef txActor = context().actorOf(ReadWriteTransactionActor.props(tx, writeTxIdleTimeout));
sender().tell(new Success(txActor), self());
} catch (final Exception t) {
sender().tell(new Failure(t), self());
}
} else if (message instanceof InvokeRpcMessage) {
// master
final InvokeRpcMessage invokeRpcMessage = (InvokeRpcMessage) message;
invokeSlaveRpc(invokeRpcMessage.getSchemaPath().lastNodeIdentifier(), invokeRpcMessage.getNormalizedNodeMessage(), sender());
} else if (message instanceof InvokeActionMessage) {
// master
final InvokeActionMessage invokeActionMessage = (InvokeActionMessage) message;
LOG.info("InvokeActionMessage Details : {}", invokeActionMessage.toString());
invokeSlaveAction(invokeActionMessage.getSchemaPath(), invokeActionMessage.getContainerNodeMessage(), invokeActionMessage.getDOMDataTreeIdentifier(), sender());
} else if (message instanceof RegisterMountPoint) {
// slaves
RegisterMountPoint registerMountPoint = (RegisterMountPoint) message;
sourceIdentifiers = registerMountPoint.getSourceIndentifiers();
registerSlaveMountPoint(registerMountPoint.getMasterActorRef());
sender().tell(new Success(null), self());
} else if (message instanceof UnregisterSlaveMountPoint) {
// slaves
unregisterSlaveMountPoint();
} else if (message instanceof RefreshSlaveActor) {
// slave
actorResponseWaitTime = ((RefreshSlaveActor) message).getActorResponseWaitTime();
id = ((RefreshSlaveActor) message).getId();
schemaRegistry = ((RefreshSlaveActor) message).getSchemaRegistry();
setup = ((RefreshSlaveActor) message).getSetup();
schemaRepository = ((RefreshSlaveActor) message).getSchemaRepository();
} else if (message instanceof NetconfDataTreeServiceRequest) {
ActorRef netconfActor = context().actorOf(NetconfDataTreeServiceActor.props(netconfService, writeTxIdleTimeout));
sender().tell(new Success(netconfActor), self());
}
}
use of org.opendaylight.netconf.topology.singleton.messages.AskForMasterMountPoint in project netconf by opendaylight.
the class NetconfNodeManager method handleSlaveMountPoint.
private synchronized void handleSlaveMountPoint(final DataObjectModification<Node> rootNode) {
if (closed) {
return;
}
@SuppressWarnings("ConstantConditions") final NetconfNode netconfNodeAfter = rootNode.getDataAfter().augmentation(NetconfNode.class);
if (NetconfNodeConnectionStatus.ConnectionStatus.Connected.equals(netconfNodeAfter.getConnectionStatus())) {
lastUpdateCount++;
createOrUpdateActorRef();
final String masterAddress = netconfNodeAfter.getClusteredConnectionStatus().getNetconfMasterNode();
final String masterActorPath = NetconfTopologyUtils.createActorPath(masterAddress, NetconfTopologyUtils.createMasterActorName(id.getName(), netconfNodeAfter.getClusteredConnectionStatus().getNetconfMasterNode()));
final AskForMasterMountPoint askForMasterMountPoint = new AskForMasterMountPoint(slaveActorRef);
final ActorSelection masterActor = setup.getActorSystem().actorSelection(masterActorPath);
LOG.debug("{}: Sending {} message to master {}", id, askForMasterMountPoint, masterActor);
sendAskForMasterMountPointWithRetries(askForMasterMountPoint, masterActor, 1, lastUpdateCount);
} else {
unregisterSlaveMountpoint();
}
}
Aggregations