Refactor common boltdb fields to subpackage
Moves label and timestamp bolt functions to subpackage for use outside the metadata package without importing metadata package. Signed-off-by: Derek McGowan <derek@mcgstyle.net>
This commit is contained in:
parent
c8b4e4dbe8
commit
ad72036e58
@ -1,4 +1,4 @@
|
|||||||
package metadata
|
package boltutil
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
@ -7,19 +7,36 @@ import (
|
|||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func readLabels(m map[string]string, bkt *bolt.Bucket) error {
|
var (
|
||||||
return bkt.ForEach(func(k, v []byte) error {
|
bucketKeyLabels = []byte("labels")
|
||||||
m[string(k)] = string(v)
|
bucketKeyCreatedAt = []byte("createdat")
|
||||||
|
bucketKeyUpdatedAt = []byte("updatedat")
|
||||||
|
)
|
||||||
|
|
||||||
|
// ReadLabels reads the labels key from the bucket
|
||||||
|
// Uses the key "labels"
|
||||||
|
func ReadLabels(bkt *bolt.Bucket) (map[string]string, error) {
|
||||||
|
lbkt := bkt.Bucket(bucketKeyLabels)
|
||||||
|
if lbkt == nil {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
labels := map[string]string{}
|
||||||
|
if err := lbkt.ForEach(func(k, v []byte) error {
|
||||||
|
labels[string(k)] = string(v)
|
||||||
return nil
|
return nil
|
||||||
})
|
}); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return labels, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// writeLabels will write a new labels bucket to the provided bucket at key
|
// WriteLabels will write a new labels bucket to the provided bucket at key
|
||||||
// bucketKeyLabels, replacing the contents of the bucket with the provided map.
|
// bucketKeyLabels, replacing the contents of the bucket with the provided map.
|
||||||
//
|
//
|
||||||
// The provide map labels will be modified to have the final contents of the
|
// The provide map labels will be modified to have the final contents of the
|
||||||
// bucket. Typically, this removes zero-value entries.
|
// bucket. Typically, this removes zero-value entries.
|
||||||
func writeLabels(bkt *bolt.Bucket, labels map[string]string) error {
|
// Uses the key "labels"
|
||||||
|
func WriteLabels(bkt *bolt.Bucket, labels map[string]string) error {
|
||||||
// Remove existing labels to keep from merging
|
// Remove existing labels to keep from merging
|
||||||
if lbkt := bkt.Bucket(bucketKeyLabels); lbkt != nil {
|
if lbkt := bkt.Bucket(bucketKeyLabels); lbkt != nil {
|
||||||
if err := bkt.DeleteBucket(bucketKeyLabels); err != nil {
|
if err := bkt.DeleteBucket(bucketKeyLabels); err != nil {
|
||||||
@ -50,7 +67,9 @@ func writeLabels(bkt *bolt.Bucket, labels map[string]string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func readTimestamps(created, updated *time.Time, bkt *bolt.Bucket) error {
|
// ReadTimestamps reads created and updated timestamps from a bucket.
|
||||||
|
// Uses keys "createdat" and "updatedat"
|
||||||
|
func ReadTimestamps(bkt *bolt.Bucket, created, updated *time.Time) error {
|
||||||
for _, f := range []struct {
|
for _, f := range []struct {
|
||||||
b []byte
|
b []byte
|
||||||
t *time.Time
|
t *time.Time
|
||||||
@ -68,7 +87,9 @@ func readTimestamps(created, updated *time.Time, bkt *bolt.Bucket) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeTimestamps(bkt *bolt.Bucket, created, updated time.Time) error {
|
// WriteTimestamps writes created and updated timestamps to a bucket.
|
||||||
|
// Uses keys "createdat" and "updatedat"
|
||||||
|
func WriteTimestamps(bkt *bolt.Bucket, created, updated time.Time) error {
|
||||||
createdAt, err := created.MarshalBinary()
|
createdAt, err := created.MarshalBinary()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
@ -41,7 +41,6 @@ var (
|
|||||||
bucketKeyDigest = []byte("digest")
|
bucketKeyDigest = []byte("digest")
|
||||||
bucketKeyMediaType = []byte("mediatype")
|
bucketKeyMediaType = []byte("mediatype")
|
||||||
bucketKeySize = []byte("size")
|
bucketKeySize = []byte("size")
|
||||||
bucketKeyLabels = []byte("labels")
|
|
||||||
bucketKeyImage = []byte("image")
|
bucketKeyImage = []byte("image")
|
||||||
bucketKeyRuntime = []byte("runtime")
|
bucketKeyRuntime = []byte("runtime")
|
||||||
bucketKeyName = []byte("name")
|
bucketKeyName = []byte("name")
|
||||||
@ -49,8 +48,6 @@ var (
|
|||||||
bucketKeySpec = []byte("spec")
|
bucketKeySpec = []byte("spec")
|
||||||
bucketKeyRootFS = []byte("rootfs")
|
bucketKeyRootFS = []byte("rootfs")
|
||||||
bucketKeyTarget = []byte("target")
|
bucketKeyTarget = []byte("target")
|
||||||
bucketKeyCreatedAt = []byte("createdat")
|
|
||||||
bucketKeyUpdatedAt = []byte("updatedat")
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func getBucket(tx *bolt.Tx, keys ...[]byte) *bolt.Bucket {
|
func getBucket(tx *bolt.Tx, keys ...[]byte) *bolt.Bucket {
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/containerd/containerd/filters"
|
"github.com/containerd/containerd/filters"
|
||||||
"github.com/containerd/containerd/identifiers"
|
"github.com/containerd/containerd/identifiers"
|
||||||
|
"github.com/containerd/containerd/metadata/boltutil"
|
||||||
"github.com/containerd/containerd/namespaces"
|
"github.com/containerd/containerd/namespaces"
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
"github.com/gogo/protobuf/types"
|
"github.com/gogo/protobuf/types"
|
||||||
@ -206,6 +207,16 @@ func (s *containerStore) Delete(ctx context.Context, id string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func readContainer(container *containers.Container, bkt *bolt.Bucket) error {
|
func readContainer(container *containers.Container, bkt *bolt.Bucket) error {
|
||||||
|
labels, err := boltutil.ReadLabels(bkt)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
container.Labels = labels
|
||||||
|
|
||||||
|
if err := boltutil.ReadTimestamps(bkt, &container.CreatedAt, &container.UpdatedAt); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return bkt.ForEach(func(k, v []byte) error {
|
return bkt.ForEach(func(k, v []byte) error {
|
||||||
switch string(k) {
|
switch string(k) {
|
||||||
case string(bucketKeyImage):
|
case string(bucketKeyImage):
|
||||||
@ -239,24 +250,7 @@ func readContainer(container *containers.Container, bkt *bolt.Bucket) error {
|
|||||||
container.Spec = &any
|
container.Spec = &any
|
||||||
case string(bucketKeyRootFS):
|
case string(bucketKeyRootFS):
|
||||||
container.RootFS = string(v)
|
container.RootFS = string(v)
|
||||||
case string(bucketKeyCreatedAt):
|
|
||||||
if err := container.CreatedAt.UnmarshalBinary(v); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case string(bucketKeyUpdatedAt):
|
|
||||||
if err := container.UpdatedAt.UnmarshalBinary(v); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case string(bucketKeyLabels):
|
|
||||||
lbkt := bkt.Bucket(bucketKeyLabels)
|
|
||||||
if lbkt == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
container.Labels = map[string]string{}
|
|
||||||
|
|
||||||
if err := readLabels(container.Labels, lbkt); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -264,7 +258,7 @@ func readContainer(container *containers.Container, bkt *bolt.Bucket) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func writeContainer(bkt *bolt.Bucket, container *containers.Container) error {
|
func writeContainer(bkt *bolt.Bucket, container *containers.Container) error {
|
||||||
if err := writeTimestamps(bkt, container.CreatedAt, container.UpdatedAt); err != nil {
|
if err := boltutil.WriteTimestamps(bkt, container.CreatedAt, container.UpdatedAt); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,5 +308,5 @@ func writeContainer(bkt *bolt.Bucket, container *containers.Container) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return writeLabels(bkt, container.Labels)
|
return boltutil.WriteLabels(bkt, container.Labels)
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
"github.com/containerd/containerd/content"
|
"github.com/containerd/containerd/content"
|
||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/containerd/containerd/filters"
|
"github.com/containerd/containerd/filters"
|
||||||
|
"github.com/containerd/containerd/metadata/boltutil"
|
||||||
"github.com/containerd/containerd/namespaces"
|
"github.com/containerd/containerd/namespaces"
|
||||||
digest "github.com/opencontainers/go-digest"
|
digest "github.com/opencontainers/go-digest"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
@ -390,24 +391,18 @@ func (nw *namespacedWriter) commit(tx *bolt.Tx, size int64, expected digest.Dige
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
commitTime := time.Now().UTC()
|
||||||
|
|
||||||
sizeEncoded, err := encodeSize(size)
|
sizeEncoded, err := encodeSize(size)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
timeEncoded, err := time.Now().UTC().MarshalBinary()
|
if err := boltutil.WriteTimestamps(bkt, commitTime, commitTime); err != nil {
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if err := bkt.Put(bucketKeySize, sizeEncoded); err != nil {
|
||||||
for _, v := range [][2][]byte{
|
return err
|
||||||
{bucketKeyCreatedAt, timeEncoded},
|
|
||||||
{bucketKeyUpdatedAt, timeEncoded},
|
|
||||||
{bucketKeySize, sizeEncoded},
|
|
||||||
} {
|
|
||||||
if err := bkt.Put(v[0], v[1]); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -451,17 +446,15 @@ func (cs *contentStore) checkAccess(ctx context.Context, dgst digest.Digest) err
|
|||||||
}
|
}
|
||||||
|
|
||||||
func readInfo(info *content.Info, bkt *bolt.Bucket) error {
|
func readInfo(info *content.Info, bkt *bolt.Bucket) error {
|
||||||
if err := readTimestamps(&info.CreatedAt, &info.UpdatedAt, bkt); err != nil {
|
if err := boltutil.ReadTimestamps(bkt, &info.CreatedAt, &info.UpdatedAt); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
lbkt := bkt.Bucket(bucketKeyLabels)
|
labels, err := boltutil.ReadLabels(bkt)
|
||||||
if lbkt != nil {
|
if err != nil {
|
||||||
info.Labels = map[string]string{}
|
return err
|
||||||
if err := readLabels(info.Labels, lbkt); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
info.Labels = labels
|
||||||
|
|
||||||
if v := bkt.Get(bucketKeySize); len(v) > 0 {
|
if v := bkt.Get(bucketKeySize); len(v) > 0 {
|
||||||
info.Size, _ = binary.Varint(v)
|
info.Size, _ = binary.Varint(v)
|
||||||
@ -471,11 +464,11 @@ func readInfo(info *content.Info, bkt *bolt.Bucket) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func writeInfo(info *content.Info, bkt *bolt.Bucket) error {
|
func writeInfo(info *content.Info, bkt *bolt.Bucket) error {
|
||||||
if err := writeTimestamps(bkt, info.CreatedAt, info.UpdatedAt); err != nil {
|
if err := boltutil.WriteTimestamps(bkt, info.CreatedAt, info.UpdatedAt); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := writeLabels(bkt, info.Labels); err != nil {
|
if err := boltutil.WriteLabels(bkt, info.Labels); err != nil {
|
||||||
return errors.Wrapf(err, "writing labels for info %v", info.Digest)
|
return errors.Wrapf(err, "writing labels for info %v", info.Digest)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/containerd/containerd/filters"
|
"github.com/containerd/containerd/filters"
|
||||||
"github.com/containerd/containerd/images"
|
"github.com/containerd/containerd/images"
|
||||||
|
"github.com/containerd/containerd/metadata/boltutil"
|
||||||
"github.com/containerd/containerd/namespaces"
|
"github.com/containerd/containerd/namespaces"
|
||||||
digest "github.com/opencontainers/go-digest"
|
digest "github.com/opencontainers/go-digest"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
@ -191,17 +192,15 @@ func (s *imageStore) Delete(ctx context.Context, name string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func readImage(image *images.Image, bkt *bolt.Bucket) error {
|
func readImage(image *images.Image, bkt *bolt.Bucket) error {
|
||||||
if err := readTimestamps(&image.CreatedAt, &image.UpdatedAt, bkt); err != nil {
|
if err := boltutil.ReadTimestamps(bkt, &image.CreatedAt, &image.UpdatedAt); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
lbkt := bkt.Bucket(bucketKeyLabels)
|
labels, err := boltutil.ReadLabels(bkt)
|
||||||
if lbkt != nil {
|
if err != nil {
|
||||||
image.Labels = map[string]string{}
|
return err
|
||||||
if err := readLabels(image.Labels, lbkt); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
image.Labels = labels
|
||||||
|
|
||||||
tbkt := bkt.Bucket(bucketKeyTarget)
|
tbkt := bkt.Bucket(bucketKeyTarget)
|
||||||
if tbkt == nil {
|
if tbkt == nil {
|
||||||
@ -228,11 +227,11 @@ func readImage(image *images.Image, bkt *bolt.Bucket) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func writeImage(bkt *bolt.Bucket, image *images.Image) error {
|
func writeImage(bkt *bolt.Bucket, image *images.Image) error {
|
||||||
if err := writeTimestamps(bkt, image.CreatedAt, image.UpdatedAt); err != nil {
|
if err := boltutil.WriteTimestamps(bkt, image.CreatedAt, image.UpdatedAt); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := writeLabels(bkt, image.Labels); err != nil {
|
if err := boltutil.WriteLabels(bkt, image.Labels); err != nil {
|
||||||
return errors.Wrapf(err, "writing labels for image %v", image.Name)
|
return errors.Wrapf(err, "writing labels for image %v", image.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user