vmextension/installuninstall.go (110 lines of code) (raw):

// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. package vmextension import ( "os" "github.com/pkg/errors" ) var ( installDependency installDependencies = &installDependencyImpl{} ) type installDependencies interface { mkdirAll(string, os.FileMode) error removeAll(string) error stat(string) (os.FileInfo, error) } type installDependencyImpl struct{} func (*installDependencyImpl) mkdirAll(path string, perm os.FileMode) error { return os.MkdirAll(path, perm) } func (*installDependencyImpl) removeAll(path string) error { return os.RemoveAll(path) } func (*installDependencyImpl) stat(name string) (os.FileInfo, error) { return os.Stat(name) } func doesFileExistInstallDependency(filePath string) (bool, error) { _, err := installDependency.stat(filePath) if err != nil { if os.IsNotExist(err) { return false, nil } return true, err } return true, nil } func resetState(ext *VMExtension) (string, error) { ext.ExtensionLogger.Info("resetState called") // Remove all files in the data directory err := removeDirectoryContents(ext.HandlerEnv.DataFolder) if err != nil { ext.ExtensionLogger.Error("Removing data directory contents failed: %v", err) } // Call the callback if we have one if ext.exec.resetStateCallBack != nil { err := ext.exec.resetStateCallBack(ext) if err != nil { ext.ExtensionLogger.Error("ResetState failed: %v", err) } } return "", nil } func removeDirectoryContents(dir string) error { if dir == "" { return nil } err := os.RemoveAll(dir) if err != nil { return err } return nil } func update(ext *VMExtension) (string, error) { ext.ExtensionLogger.Info("update called") // The only thing we do for update is call the callback if we have one if ext.exec.updateCallback != nil { err := ext.exec.updateCallback(ext) if err != nil { ext.ExtensionLogger.Error("Update failed: %v", err) } } return "", nil } func install(ext *VMExtension) (string, error) { // Create the data directory if it doesn't exist exists, err := doesFileExistInstallDependency(ext.HandlerEnv.DataFolder) if err != nil { return "", err } if !exists { ext.ExtensionLogger.Info("Creating data dir %v", ext.HandlerEnv.DataFolder) if err := installDependency.mkdirAll(ext.HandlerEnv.DataFolder, 0755); err != nil { return "", errors.Wrap(err, "failed to create data dir") } ext.ExtensionLogger.Info("Created data dir %s", ext.HandlerEnv.DataFolder) } // Call the callback if we have one if ext.exec.installCallback != nil { err := ext.exec.installCallback(ext) if err != nil { ext.ExtensionLogger.Error("Install failed: %v", err) return "", err } } ext.ExtensionLogger.Info("installed") return "", nil } func uninstall(ext *VMExtension) (string, error) { exists, err := doesFileExistInstallDependency(ext.HandlerEnv.DataFolder) if err != nil { return "", err } if exists { ext.ExtensionLogger.Info("Removing data dir %v", ext.HandlerEnv.DataFolder) if err := installDependency.removeAll(ext.HandlerEnv.DataFolder); err != nil { return "", errors.Wrap(err, "failed to delete data dir") } ext.ExtensionLogger.Info("removed data dir") } // Call the callback if we have one if ext.exec.uninstallCallback != nil { err := ext.exec.uninstallCallback(ext) if err != nil { ext.ExtensionLogger.Error("Uninstall failed: %v", err) } } ext.ExtensionLogger.Info("uninstalled") return "", nil }