agent/statemanager/cache.go (106 lines of code) (raw):

package statemanager import ( "encoding/json" "io/ioutil" "os" "path/filepath" "sync" "github.com/aliyun/aliyun_assist_client/agent/log" "github.com/aliyun/aliyun_assist_client/common/fileutil" "github.com/aliyun/aliyun_assist_client/common/pathutil" ) var ( _stateConfigCacheLock sync.Mutex stateConfigCache *ListInstanceStateConfigurationsResult ) func ConfigCacheFilePath() (path string, err error) { cacheDir, err := pathutil.GetCachePath() if err != nil { log.GetLogger().WithError(err).Errorln("get path failed") return } path = filepath.Join(cacheDir, "state_configs.json") return } // LoadConfigCache loads state configurations from local cache files func LoadConfigCache() (r *ListInstanceStateConfigurationsResult, err error) { _stateConfigCacheLock.Lock() defer _stateConfigCacheLock.Unlock() if stateConfigCache != nil { log.GetLogger().Debug("got state configuration cache in memory") return stateConfigCache, nil } path, err := ConfigCacheFilePath() if err != nil { return } if !fileutil.CheckFileIsExist(path) { return } data, err := ioutil.ReadFile(path) if err != nil { log.GetLogger().WithError(err).Errorln("read cache file error") return } var result ListInstanceStateConfigurationsResult err = json.Unmarshal(data, &result) if err != nil { return nil, err } stateConfigCache = &result log.GetLogger().Debug("loaded state configuration from file") return stateConfigCache, nil } // WriteConfigCache saves state configurations to local cache file func WriteConfigCache(config *ListInstanceStateConfigurationsResult) error { _stateConfigCacheLock.Lock() defer _stateConfigCacheLock.Unlock() stateConfigCache = config path, err := ConfigCacheFilePath() if err != nil { return nil } data, err := json.Marshal(config) if err != nil { log.GetLogger().WithError(err).Errorln("marshal config to json error") return err } log.GetLogger().Debugf("saving state configuration to %s", path) err = ioutil.WriteFile(path, data, os.ModePerm) return err } func TemplateCachePath(name string, version string) (p string, err error) { cacheDir, err := pathutil.GetCachePath() if err != nil { log.GetLogger().WithError(err).Errorln("get template cache path failed") return } templateDir := filepath.Join(cacheDir, "template") pathutil.MakeSurePath(templateDir) p = filepath.Join(cacheDir, "template", name + "_" + version + ".json") return } func LoadTemplateCache(name string, version string) (content []byte, err error) { path, err := TemplateCachePath(name, version) if err != nil { return } if !fileutil.CheckFileIsExist(path) { return } return ioutil.ReadFile(path) } func WriteTemplateCache(name string, version string, data []byte) (err error) { path, err := TemplateCachePath(name, version) if err != nil { return } log.GetLogger().Debugf("saving template to %s", path) return ioutil.WriteFile(path, data, os.ModePerm) } func LastCheckpoint() string { lastResult, err := LoadConfigCache() if err != nil { return "" } else { return lastResult.Checkpoint } }