public async Task GetWuOperationStateAsync()

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;
        }