func copyFiles()

in internal/cmds/cmds.go [363:450]


func copyFiles(ctx log.Logger, fileExtensionSuffix string, extensionSubdirectory string) (*list.List, error) {

	newExtensionVersion := os.Getenv(constants.ExtensionVersionEnvName)
	oldExtensionVersion := os.Getenv(constants.ExtensionVersionUpdatingFromEnvName)

	ctx.Log("message", fmt.Sprintf("Migrating '%s' files from extension version '%s' to '%s'", fileExtensionSuffix, oldExtensionVersion, newExtensionVersion))

	newExtensionDirectory := os.Getenv(constants.ExtensionPathEnvName)
	oldExtensionDirectory := strings.ReplaceAll(newExtensionDirectory, newExtensionVersion, oldExtensionVersion)

	// Append subdirectory like "status" under extension folder if provided.
	if extensionSubdirectory != "" {
		newExtensionDirectory = filepath.Join(newExtensionDirectory, extensionSubdirectory)
		oldExtensionDirectory = filepath.Join(oldExtensionDirectory, extensionSubdirectory)

		// Create subdirectory like "status" directory if it does not exist
		_, err := os.Open(newExtensionDirectory)
		if err != nil {
			errr := os.Mkdir(newExtensionDirectory, 0700)
			if errr != nil {
				return nil, errors.Wrap(errr, fmt.Sprintf("Failed to create directory '%s'", newExtensionDirectory))
			}
		}
	}

	if oldExtensionDirectory == "" || newExtensionDirectory == "" {
		return nil, errors.New("oldExtesionDirectory or newExtensionDirectory is empty")
	}

	// Check if the directory exists
	sourceDirectoryFDRef, err := os.Open(oldExtensionDirectory)
	if err != nil {
		errMessage := fmt.Sprintf("could not open sourceDirectory %s", oldExtensionDirectory)
		ctx.Log("message", errMessage)
		return nil, errors.Wrap(err, errMessage)
	}

	directoryEntries, err := sourceDirectoryFDRef.ReadDir(0)
	if err != nil {
		errMessage := fmt.Sprintf("could not read directory entries from sourceDirectory %s", oldExtensionDirectory)
		ctx.Log("message", errMessage)
		return nil, errors.Wrap(err, errMessage)
	}

	numberOfFilesMigrated := 0
	fileNamesMigrated := list.New()

	for _, dirEntry := range directoryEntries {
		fileName := dirEntry.Name()

		if strings.HasSuffix(fileName, fileExtensionSuffix) {
			sourceFileFullPath := filepath.Join(oldExtensionDirectory, fileName)
			destinationFileFullPath := filepath.Join(newExtensionDirectory, fileName)

			sourceFile, sourceFileOpenError := os.Open(sourceFileFullPath)
			if sourceFileOpenError != nil {
				errMessage := "Failed to open '%s' file '%s' for reading. Contact ICM team AzureRT\\Extensions for this service error."
				ctx.Log("message", fmt.Sprintf(errMessage, fileExtensionSuffix, sourceFileFullPath))
				return fileNamesMigrated, errors.Wrapf(sourceFileOpenError, errMessage)
			}
			defer sourceFile.Close()

			destFile, destFileCreateError := os.Create(destinationFileFullPath)
			if destFileCreateError != nil {
				errMessage := "Failed to create '%s' file '%s'. Contact ICM team AzureRT\\Extensions for this service error."
				ctx.Log("message", fmt.Sprintf(errMessage, fileExtensionSuffix, destinationFileFullPath))
				return fileNamesMigrated, errors.Wrapf(destFileCreateError, errMessage)
			}
			defer destFile.Close()

			_, copyError := io.Copy(destFile, sourceFile)
			if copyError != nil {
				errMessage := fmt.Sprintf("Failed to copy '%s' file '%s' to path '%s'. Contact ICM team AzureRT\\Extensions for this service error.",
					fileExtensionSuffix, sourceFileFullPath, destinationFileFullPath)
				ctx.Log("message", errMessage)
				return fileNamesMigrated, errors.Wrapf(copyError, errMessage)
			} else {
				ctx.Log("message", fmt.Sprintf("File '%s' was copied successfully to '%s'", sourceFileFullPath, destinationFileFullPath))
				numberOfFilesMigrated++
				fileNamesMigrated.PushBack(fileName)
			}
		}
	}

	ctx.Log("message", fmt.Sprintf("Migrated %d '%s' files from extension version '%s' to '%s'", numberOfFilesMigrated, fileExtensionSuffix, oldExtensionVersion, newExtensionVersion))

	return fileNamesMigrated, nil
}