private FabricTestAction GetRestartNodeAction(NodeStateTransitionAction ragAction) { ChaosUtility.ThrowOrAssertIfTrue( ChaosConstants.RestartNode_InvalidActionType_TelemetryId, ragAction == null || ragAction.ActionType != StateTransitionActionType.NodeRestart, StringResources.ChaosEngineError_RestartNode_InvalidActionType); ChaosUtility.ThrowOrAssertIfTrue( ChaosConstants.RestartNode_InvalidNodeName_TelemetryId, string.IsNullOrEmpty(ragAction.NodeName), StringResources.ChaosEngineError_RestartNode_InvalidNodeName); string report = StringHelper.Format("Generating Action: {0}\n\t\tNodeName: {1}\n\t\tNodeInstanceId: {2}", ragAction.ActionType, ragAction.NodeName, ragAction.NodeInstanceId); Log.WriteInfo(TraceType, report); if (this.reportFunction != null) { this.reportFunction(report); } string nodeName = ragAction.NodeName; BigInteger nodeInstanceId = ragAction.NodeInstanceId; RestartNodeAction restartNodeAction = new RestartNodeAction(nodeName, nodeInstanceId); return(restartNodeAction); }
// Returns a nodeInfo of a node whose status can be toggled. Returns null if can't find a valid node. private NodeStateTransitionAction CreateOneNodeFaultAction(NodeFaultInformationHelper nodeStateHelper, Guid clusterSnapshotId, Guid activityId = default(Guid)) { NodeStateTransitionAction action = null; NodeEntity selectedNode = null; for (int trial = 0; trial < maxTrialPerActionGeneration && action == null; trial++) { // Choose category NodeFaultCategory faultCategory = (NodeFaultCategory)this.nodeFaultCategoryChooser.NextRoll(); switch (faultCategory) { case NodeFaultCategory.RestartFault: { selectedNode = nodeStateHelper.GetUpNodeToFault(activityId); if (selectedNode != null) { var nodeInfo = nodeStateHelper.ClusterNodes.FirstOrDefault(n => n.CurrentNodeInfo.NodeName == selectedNode.CurrentNodeInfo.NodeName); ReleaseAssert.AssertIf(nodeInfo == null, "NodeInfo should not be null"); TestabilityTrace.TraceSource.WriteInfo(this.TraceType, "{0}: '{1}' is chosen for RestartNode.", activityId, selectedNode); action = new RestartNodeStateTransitionAction(nodeInfo.CurrentNodeInfo.NodeName, (long)nodeInfo.CurrentNodeInfo.NodeInstanceId, clusterSnapshotId); } } break; case NodeFaultCategory.StartStopFault: { selectedNode = this.Random.NextDouble() > 0.5 ? nodeStateHelper.GetUpNodeToFault(activityId) : nodeStateHelper.GetDownNodeToFault(activityId); if (selectedNode != null) { var node = selectedNode; var nodeInfo = nodeStateHelper.ClusterNodes.FirstOrDefault(n => n.CurrentNodeInfo.NodeName == node.CurrentNodeInfo.NodeName); ReleaseAssert.AssertIf(nodeInfo == null, "NodeInfo should not be null"); if (nodeInfo.CurrentNodeInfo.IsNodeUp) { TestabilityTrace.TraceSource.WriteInfo(this.TraceType, "{0}: '{1}' is chosen for StopNode.", activityId, selectedNode); action = new StopNodeStateTransitionAction(nodeInfo.CurrentNodeInfo.NodeName, (long)nodeInfo.CurrentNodeInfo.NodeInstanceId, clusterSnapshotId); nodeInfo.CurrentNodeInfo.IsNodeUp = false; } else { TestabilityTrace.TraceSource.WriteInfo(this.TraceType, "{0}: '{1}' is chosen for StartNode.", activityId, selectedNode); action = new StartNodeStateTransitionAction(nodeInfo.CurrentNodeInfo.NodeName, (long)nodeInfo.CurrentNodeInfo.NodeInstanceId, clusterSnapshotId); } } } break; default: throw new ArgumentException("Unknown category:" + faultCategory); } // Validate this generated action. if (action != null) { ReleaseAssert.AssertIf(selectedNode == null, "selectedNode cannot be null"); selectedNode.FaultNode(activityId); } } return(action); }