Skip to content

Commit bb6c0c2

Browse files
committed
Add more bolt utils
This PR extracts out a few more bolt utils from the codebase for easier management. Signed-off-by: Maksym Pavlenko <[email protected]>
1 parent 2486eb8 commit bb6c0c2

2 files changed

Lines changed: 99 additions & 58 deletions

File tree

metadata/boltutil/helpers.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ package boltutil
1919
import (
2020
"time"
2121

22+
"github.com/gogo/protobuf/proto"
23+
"github.com/gogo/protobuf/types"
2224
"github.com/pkg/errors"
2325
bolt "go.etcd.io/bbolt"
2426
)
@@ -28,6 +30,7 @@ var (
2830
bucketKeyLabels = []byte("labels")
2931
bucketKeyCreatedAt = []byte("createdat")
3032
bucketKeyUpdatedAt = []byte("updatedat")
33+
bucketKeyExtensions = []byte("extensions")
3134
)
3235

3336
// ReadLabels reads the labels key from the bucket
@@ -145,3 +148,88 @@ func WriteTimestamps(bkt *bolt.Bucket, created, updated time.Time) error {
145148

146149
return nil
147150
}
151+
152+
// WriteExtensions will write a KV map to the given bucket,
153+
// where `K` is a string key and `V` is a protobuf's Any type that represents a generic extension.
154+
func WriteExtensions(bkt *bolt.Bucket, extensions map[string]types.Any) error {
155+
if len(extensions) == 0 {
156+
return nil
157+
}
158+
159+
ebkt, err := bkt.CreateBucketIfNotExists(bucketKeyExtensions)
160+
if err != nil {
161+
return err
162+
}
163+
164+
for name, ext := range extensions {
165+
p, err := proto.Marshal(&ext)
166+
if err != nil {
167+
return err
168+
}
169+
170+
if err := ebkt.Put([]byte(name), p); err != nil {
171+
return err
172+
}
173+
}
174+
175+
return nil
176+
}
177+
178+
// ReadExtensions will read back a map of extensions from the given bucket, previously written by WriteExtensions
179+
func ReadExtensions(bkt *bolt.Bucket) (map[string]types.Any, error) {
180+
var (
181+
extensions = make(map[string]types.Any)
182+
ebkt = bkt.Bucket(bucketKeyExtensions)
183+
)
184+
185+
if ebkt == nil {
186+
return extensions, nil
187+
}
188+
189+
if err := ebkt.ForEach(func(k, v []byte) error {
190+
var t types.Any
191+
if err := proto.Unmarshal(v, &t); err != nil {
192+
return err
193+
}
194+
195+
extensions[string(k)] = t
196+
return nil
197+
}); err != nil {
198+
return nil, err
199+
}
200+
201+
return extensions, nil
202+
}
203+
204+
// WriteAny write a protobuf's Any type to the bucket
205+
func WriteAny(bkt *bolt.Bucket, name []byte, any *types.Any) error {
206+
if any == nil {
207+
return nil
208+
}
209+
210+
data, err := proto.Marshal(any)
211+
if err != nil {
212+
return err
213+
}
214+
215+
if err := bkt.Put(name, data); err != nil {
216+
return err
217+
}
218+
219+
return nil
220+
}
221+
222+
// ReadAny reads back protobuf's Any type from the bucket
223+
func ReadAny(bkt *bolt.Bucket, name []byte) (*types.Any, error) {
224+
bytes := bkt.Get(name)
225+
if bytes == nil {
226+
return nil, nil
227+
}
228+
229+
out := types.Any{}
230+
if err := proto.Unmarshal(bytes, &out); err != nil {
231+
return nil, errors.Wrap(err, "failed to unmarshal any")
232+
}
233+
234+
return &out, nil
235+
}

metadata/containers.go

Lines changed: 11 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -336,16 +336,11 @@ func readContainer(container *containers.Container, bkt *bolt.Bucket) error {
336336
container.Runtime.Name = string(n)
337337
}
338338

339-
obkt := rbkt.Get(bucketKeyOptions)
340-
if obkt == nil {
341-
return nil
342-
}
343-
344-
var any types.Any
345-
if err := proto.Unmarshal(obkt, &any); err != nil {
339+
any, err := boltutil.ReadAny(rbkt, bucketKeyOptions)
340+
if err != nil {
346341
return err
347342
}
348-
container.Runtime.Options = &any
343+
container.Runtime.Options = any
349344
case string(bucketKeySpec):
350345
var any types.Any
351346
if err := proto.Unmarshal(v, &any); err != nil {
@@ -357,22 +352,8 @@ func readContainer(container *containers.Container, bkt *bolt.Bucket) error {
357352
case string(bucketKeySnapshotter):
358353
container.Snapshotter = string(v)
359354
case string(bucketKeyExtensions):
360-
ebkt := bkt.Bucket(bucketKeyExtensions)
361-
if ebkt == nil {
362-
return nil
363-
}
364-
365-
extensions := make(map[string]types.Any)
366-
if err := ebkt.ForEach(func(k, v []byte) error {
367-
var a types.Any
368-
if err := proto.Unmarshal(v, &a); err != nil {
369-
return err
370-
}
371-
372-
extensions[string(k)] = a
373-
return nil
374-
}); err != nil {
375-
355+
extensions, err := boltutil.ReadExtensions(bkt)
356+
if err != nil {
376357
return err
377358
}
378359

@@ -388,15 +369,8 @@ func writeContainer(bkt *bolt.Bucket, container *containers.Container) error {
388369
return err
389370
}
390371

391-
if container.Spec != nil {
392-
spec, err := container.Spec.Marshal()
393-
if err != nil {
394-
return err
395-
}
396-
397-
if err := bkt.Put(bucketKeySpec, spec); err != nil {
398-
return err
399-
}
372+
if err := boltutil.WriteAny(bkt, bucketKeySpec, container.Spec); err != nil {
373+
return err
400374
}
401375

402376
for _, v := range [][2][]byte{
@@ -424,33 +398,12 @@ func writeContainer(bkt *bolt.Bucket, container *containers.Container) error {
424398
return err
425399
}
426400

427-
if len(container.Extensions) > 0 {
428-
ebkt, err := bkt.CreateBucketIfNotExists(bucketKeyExtensions)
429-
if err != nil {
430-
return err
431-
}
432-
433-
for name, ext := range container.Extensions {
434-
p, err := proto.Marshal(&ext)
435-
if err != nil {
436-
return err
437-
}
438-
439-
if err := ebkt.Put([]byte(name), p); err != nil {
440-
return err
441-
}
442-
}
401+
if err := boltutil.WriteExtensions(bkt, container.Extensions); err != nil {
402+
return err
443403
}
444404

445-
if container.Runtime.Options != nil {
446-
data, err := proto.Marshal(container.Runtime.Options)
447-
if err != nil {
448-
return err
449-
}
450-
451-
if err := rbkt.Put(bucketKeyOptions, data); err != nil {
452-
return err
453-
}
405+
if err := boltutil.WriteAny(rbkt, bucketKeyOptions, container.Runtime.Options); err != nil {
406+
return err
454407
}
455408

456409
return boltutil.WriteLabels(bkt, container.Labels)

0 commit comments

Comments
 (0)