func createDummyStatusFilesIfNeeded()

in internal/cmds/cmds.go [453:556]


func createDummyStatusFilesIfNeeded(ctx log.Logger, mrseqFilesNameList *list.List) error {
	if mrseqFilesNameList == nil || mrseqFilesNameList.Len() <= 0 {
		return nil
	}

	// Create dummy status file for .mrseq file if status file is not available.
	newExtensionDirectory := os.Getenv(constants.ExtensionPathEnvName)
	statusFileDirectoryPath := filepath.Join(newExtensionDirectory, constants.StatusFileDirectory)

	var mrSeqFileName string
	var mrSeqFileFullPath string
	var extensionName string
	var mrSeqFileExtensionIndex int
	var statusFileName string
	var statusFilePath string
	var errorMessage string
	var instanceViewMessage string
	var err error
	var content []byte
	var allErr error = errors.New("Refer to all error messages above.")

	for mreSeqFileNameElement := mrseqFilesNameList.Front(); mreSeqFileNameElement != nil; mreSeqFileNameElement = mreSeqFileNameElement.Next() {
		mrSeqFileName = (mreSeqFileNameElement.Value).(string)

		// Read the most recently executed sequence number from the .mrseq file
		mrSeqFileFullPath = filepath.Join(newExtensionDirectory, mrSeqFileName)
		content, err = os.ReadFile(mrSeqFileFullPath)
		if err != nil {
			errorMessage = fmt.Sprintf("Reading mrseq (Most Recently executed Sequence number) from file '%s' failed with error '%s'", mrSeqFileFullPath, err.Error())
			ctx.Log("error", errorMessage)
			allErr = errors.Wrap(allErr, errorMessage)
			continue
		}

		var mrseqNumber int
		if content != nil {
			mrseqNumberString := string(content)
			mrseqNumber, err = strconv.Atoi(mrseqNumberString)
			if err != nil {
				errorMessage = fmt.Sprintf("mrseqNumberString to mrseqNumber conversion (string to int) of '%s' failed with error '%s'", mrseqNumberString, err.Error())
				ctx.Log("error", errorMessage)
				allErr = errors.Wrap(allErr, errorMessage)
				continue
			}
		} else {
			errorMessage = fmt.Sprintf("Empty .mrseq file content. No sequence number was found inside file  '%s' ", mrSeqFileFullPath)
			ctx.Log("error", errorMessage)
			allErr = errors.Wrap(allErr, errorMessage)
			continue
		}

		// Find extension name from the .mrseq file
		mrSeqFileExtensionIndex = strings.Index(mrSeqFileName, constants.MrSeqFileExtension)
		if mrSeqFileExtensionIndex == -1 {
			errorMessage = fmt.Sprintf("Invalid mrseq file '%s'", mrSeqFileName)
			ctx.Log("error", errorMessage)
			allErr = errors.Wrap(allErr, errorMessage)
			continue
		}
		extensionName = mrSeqFileName[0:mrSeqFileExtensionIndex]

		// Determine status file name and status file path
		statusFileName = fmt.Sprintf("%s.%d.status", extensionName, mrseqNumber)
		statusFilePath = filepath.Join(statusFileDirectoryPath, statusFileName)

		var rootStatusJson []byte
		// If status file path does not exist, create a dummy status file to prevent poll status timeouts for already executed Run Commands after upgrade.
		if !handlersettings.DoesFileExist(statusFilePath) {

			timeNow := time.Now().UTC().Format(time.RFC3339)
			instanceView := types.RunCommandInstanceView{
				ExecutionState:   types.Unknown, // InstanceView executionState is Unknown because we do not know whether previously executed Run command's state for sure.
				ExecutionMessage: "The script has been executed. However, the instanceView's execution state, output, error are unknown.",
				ExitCode:         0,
				Output:           "Unknown",
				Error:            "Unknown",
				StartTime:        timeNow,
				EndTime:          timeNow,
			}
			instanceViewMessage, err = instanceview.SerializeInstanceView(&instanceView)
			if err != nil {
				errorMessage = fmt.Sprintf("Failed to serialize unknown instanceView, error is '%s'", err.Error())
				allErr = errors.Wrap(allErr, errorMessage)
				continue
			}

			statusReport := types.NewStatusReport(types.StatusSuccess, "Enable", instanceViewMessage)
			rootStatusJson, err = status.MarshalStatusReportIntoJson(statusReport, true)
			if err != nil {
				errorMessage = fmt.Sprintf("failed to marshal status report into json for status file '%s' with error '%s'", statusFilePath, err.Error())
				allErr = errors.Wrap(allErr, errorMessage)
				continue
			}

			err = status.SaveStatusReport(statusFileDirectoryPath, extensionName, mrseqNumber, rootStatusJson)
			if err != nil {
				errorMessage = fmt.Sprintf("Failed to create a dummy status file '%s' as it was not existing for .mrseq file '%s' with error '%s'", statusFilePath, mrSeqFileFullPath, err.Error())
				allErr = errors.Wrap(allErr, errorMessage)
				continue
			}
		}
	}
	return allErr
}