in src/PatchOrchestrationApplication/NodeAgentSFUtility/src/CommandProcessor.cs [122:220]
public async Task<NodeAgentSfUtilityExitCodes> GetWuOperationStateAsync(String nodeName, TimeSpan timeout, CancellationToken cancellationToken)
{
RepairTask repairTask;
try
{
repairTask =
await
RepairManagerHelper.GetRepairTaskForNode(
this.fabricClient,
nodeName,
timeout,
cancellationToken);
}
catch (Exception e)
{
ServiceEventSource.Current.ErrorMessage(
String.Format("RepairManagerHelper.GetRepairTaskForNode failed. Exception details {0}", e));
if (e is FabricTransientException)
{
return NodeAgentSfUtilityExitCodes.RetryableException;
}
else
{
return NodeAgentSfUtilityExitCodes.Failure;
}
}
if (null == repairTask)
{
ServiceEventSource.Current.VerboseMessage(String.Format("No repair task found for this node, Operation State = {0}", NodeAgentSfUtilityExitCodes.None));
return NodeAgentSfUtilityExitCodes.None;
}
NodeAgentSfUtilityExitCodes resultState;
ExecutorDataForRmTask executorData = SerializationUtility.Deserialize<ExecutorDataForRmTask>(repairTask.ExecutorData);
ExecutorDataForNtService executorDataForNtService = new ExecutorDataForNtService() { ApprovedDateTime = repairTask.ApprovedTimestamp, ExecutorTimeoutInMinutes = executorData.ExecutorTimeoutInMinutes};
string workFolder = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
string executorDataForNtServiceFilePath = Path.Combine(workFolder, ExecutorDataForNtServiceFileName);
SerializationUtility.Serialize(executorDataForNtServiceFilePath, executorDataForNtService);
switch (repairTask.State)
{
case RepairTaskState.Claimed:
case RepairTaskState.Preparing:
resultState = NodeAgentSfUtilityExitCodes.DownloadCompleted;
break;
case RepairTaskState.Approved:
resultState = NodeAgentSfUtilityExitCodes.InstallationApproved;
break;
case RepairTaskState.Executing:
{
resultState = executorData.ExecutorSubState;
if (resultState == NodeAgentSfUtilityExitCodes.RestartRequested)
{
if (this.GetRestartStatus(executorData.RestartRequestedTime))
{
string resultDetails =
"Installation of the updates completed, Restart post installation completed successfully";
resultState = await RepairManagerHelper.UpdateRepairTask(this.fabricClient, nodeName,
RepairTaskState.Executing, RepairTaskResult.Pending,
resultDetails, NodeAgentSfUtilityExitCodes.RestartCompleted, timeout,
cancellationToken);
if (resultState == NodeAgentSfUtilityExitCodes.Success)
{
resultState = NodeAgentSfUtilityExitCodes.RestartCompleted;
}
else
{
ServiceEventSource.Current.ErrorMessage(
String.Format("Post restart, update of Repair task failed with {0}", resultState));
resultState = NodeAgentSfUtilityExitCodes.RetryableException;
}
}
}
break;
}
case RepairTaskState.Completed:
case RepairTaskState.Restoring:
{
resultState = NodeAgentSfUtilityExitCodes.OperationCompleted;
break;
}
default:
{
ServiceEventSource.Current.ErrorMessage(String.Format("Repair task for current node in unexpected state {0}", repairTask.State));
resultState = NodeAgentSfUtilityExitCodes.RepairTaskInvalidState;
break;
}
}
ServiceEventSource.Current.InfoMessage("GetWuOperationStateAsync returned {0}", resultState);
return resultState;
}