diff --git a/backend/inventory/go.mod b/backend/inventory/go.mod index 383c0ca350..790fbbccfd 100644 --- a/backend/inventory/go.mod +++ b/backend/inventory/go.mod @@ -4,8 +4,6 @@ go 1.12 require ( github.com/golang/protobuf v1.3.2 - golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 // indirect - golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135 // indirect + go.etcd.io/bbolt v1.3.3 google.golang.org/grpc v1.27.0 - honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc // indirect ) diff --git a/backend/inventory/go.sum b/backend/inventory/go.sum index cc82527f48..e890fb0fae 100644 --- a/backend/inventory/go.sum +++ b/backend/inventory/go.sum @@ -11,6 +11,8 @@ github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -26,6 +28,7 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/backend/inventory/storage/storage.go b/backend/inventory/storage/storage.go new file mode 100644 index 0000000000..2db9d3a1a3 --- /dev/null +++ b/backend/inventory/storage/storage.go @@ -0,0 +1,66 @@ +package storage + +import ( + "fmt" + "os" + + "go.etcd.io/bbolt" +) + +type Config struct { + Path string + Mode os.FileMode +} + +type Storage struct { + db *bbolt.DB +} + +func OpenStorage(config Config) (*Storage, error) { + if config.Path == "" { + config.Path = "inventory.db" + } + if config.Mode == 0 { + config.Mode = 0600 + } + db, err := bbolt.Open(config.Path, config.Mode, nil) + if err != nil { + return nil, err + } + + return &Storage{ + db: db, + }, nil +} + +func (s *Storage) Close() error { + return s.db.Close() +} + +func (s *Storage) SetFact(entityUri, name, value string) error { + return s.db.Update(func(tx *bbolt.Tx) error { + b, err := tx.CreateBucketIfNotExists([]byte(entityUri)) + if err != nil { + return err + } + return b.Put([]byte(name), []byte(value)) + }) +} + +func (s *Storage) GetFact(entityUri, name string) (string, error) { + var value string + + err := s.db.View(func(tx *bbolt.Tx) error { + b := tx.Bucket([]byte(entityUri)) + if b == nil { + return fmt.Errorf("bucket '%s' does not exist", entityUri) + } + value = string(b.Get([]byte(name))) + return nil + }) + if err != nil { + return "", err + } + + return value, nil +}