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
}