예제 #1
0
        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);
        }
예제 #2
0
        // 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);
        }