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
}