agent/inventory/uploader/optimizer.go (67 lines of code) (raw):
package uploader
import (
"encoding/json"
"fmt"
"path/filepath"
"sync"
"github.com/aliyun/aliyun_assist_client/agent/inventory/appconfig"
"github.com/aliyun/aliyun_assist_client/agent/util"
"github.com/aliyun/aliyun_assist_client/agent/util/osutil"
"github.com/aliyun/aliyun_assist_client/agent/log"
)
var (
lock sync.RWMutex
contentHashStore map[string]string
)
// Optimizer defines operations of content optimizer which inventory plugin makes use of
type Optimizer interface {
UpdateContentHash(inventoryItemName, hash string) (err error)
GetContentHash(inventoryItemName string) (hash string)
}
type Impl struct {
location string //where the content hash data is persisted in file-systems
}
func NewOptimizerImpl() (*Impl, error) {
return NewOptimizerImplWithLocation(util.GetInstanceId(), appconfig.InventoryRootDirName, appconfig.InventoryContentHashFileName)
}
func NewOptimizerImplWithLocation(instanceId string, rootDir string, fileName string) (*Impl, error) {
var optimizer = Impl{}
var content string
var err error
optimizer.location = filepath.Join(appconfig.DefaultDataStorePath,
instanceId,
rootDir,
fileName)
contentHashStore = make(map[string]string)
//read old content hash values from file
if osutil.Exists(optimizer.location) {
log.GetLogger().Debugf("Found older set of content hash used by inventory plugin - %v", optimizer.location)
//read file
if content, err = osutil.ReadFile(optimizer.location); err == nil {
log.GetLogger().Debugf("Found older set of content hash used by inventory plugin at %v - \n%v",
optimizer.location,
content)
if err = json.Unmarshal([]byte(content), &contentHashStore); err != nil {
log.GetLogger().Debugf("Unable to read content hash store of inventory plugin - thereby ignoring any older values")
}
}
}
return &optimizer, nil
}
func (i *Impl) UpdateContentHash(inventoryItemName, hash string) (err error) {
lock.Lock()
defer lock.Unlock()
contentHashStore[inventoryItemName] = hash
//persist the data in file system
dataB, _ := json.Marshal(contentHashStore)
if err = osutil.WriteFile(i.location, string(dataB)); err != nil {
err = fmt.Errorf("Unable to update content hash in file - %v because - %v", i.location, err.Error())
return
}
return
}
func (i *Impl) GetContentHash(inventoryItemName string) (hash string) {
lock.RLock()
defer lock.RUnlock()
var found bool
if hash, found = contentHashStore[inventoryItemName]; !found {
// return empty string - if there is no content hash for given inventory data type
hash = ""
}
return
}