-
Notifications
You must be signed in to change notification settings - Fork 9
/
manifest.go
102 lines (81 loc) · 3.04 KB
/
manifest.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package manifest
import (
"context"
"fmt"
"github.com/samkumar/etcdstruct"
"github.com/ugorji/go/codec"
etcd "github.com/coreos/etcd/clientv3"
)
const manifestpath = "manifest/"
var etcdprefix = ""
var mp codec.Handle = &codec.MsgpackHandle{}
type ManifestDeviceStream struct {
CanonicalName string `codec:"-" yaml:"-"`
Metadata map[string]string `codec:"metadata,omitempty" yaml:"metadata"`
}
type ManifestDevice struct {
Descriptor string `codec:"-" yaml:"-"`
Metadata map[string]string `codec:"metadata,omitempty" yaml:"metadata"`
Streams map[string]*ManifestDeviceStream `codec:"streams" yaml:"streams"`
retrievedRevision int64
}
func (md *ManifestDevice) SetRetrievedRevision(rev int64) {
md.retrievedRevision = rev
}
func (md *ManifestDevice) GetRetrievedRevision() int64 {
return md.retrievedRevision
}
func SetEtcdKeyPrefix(prefix string) {
etcdprefix = prefix
}
func getEtcdKey(name string) string {
return fmt.Sprintf("%s%s%s", etcdprefix, manifestpath, name)
}
func getNameFromEtcdKey(etcdKey string) string {
return etcdKey[len(etcdprefix)+len(manifestpath):]
}
func RetrieveManifestDevice(ctx context.Context, etcdClient *etcd.Client, descriptor string) (md *ManifestDevice, err error) {
md = &ManifestDevice{Descriptor: descriptor}
exists, err := etcdstruct.RetrieveEtcdStruct(ctx, etcdClient, getEtcdKey(descriptor), md)
if !exists {
md = nil
} else {
if md.Metadata == nil {
md.Metadata = make(map[string]string)
}
if md.Streams == nil {
md.Streams = make(map[string]*ManifestDeviceStream)
}
}
return
}
func UpsertManifestDevice(ctx context.Context, etcdClient *etcd.Client, md *ManifestDevice) error {
return etcdstruct.UpsertEtcdStruct(ctx, etcdClient, getEtcdKey(md.Descriptor), md)
}
func UpsertManifestDeviceAtomically(ctx context.Context, etcdClient *etcd.Client, md *ManifestDevice) (bool, error) {
return etcdstruct.UpsertEtcdStructAtomic(ctx, etcdClient, getEtcdKey(md.Descriptor), md)
}
func RetrieveMultipleManifestDevices(ctx context.Context, etcdClient *etcd.Client, descprefix string) ([]*ManifestDevice, error) {
etcdKeyPrefix := getEtcdKey(descprefix)
devs := make([]*ManifestDevice, 0, 1024)
err := etcdstruct.RetrieveEtcdStructs(ctx, etcdClient, func(key []byte) etcdstruct.EtcdStruct {
dev := &ManifestDevice{Descriptor: getNameFromEtcdKey(string(key))}
devs = append(devs, dev)
return dev
}, func(es etcdstruct.EtcdStruct, key []byte) {
dev := es.(*ManifestDevice)
dev.Descriptor = getNameFromEtcdKey(string(key))
dev.Streams = nil
}, etcdKeyPrefix, etcd.WithPrefix())
if err != nil {
return nil, err
}
return devs, err
}
func DeleteManifestDevice(ctx context.Context, etcdClient *etcd.Client, descriptor string) error {
_, err := etcdstruct.DeleteEtcdStructs(ctx, etcdClient, getEtcdKey(descriptor))
return err
}
func DeleteMultipleManifestDevices(ctx context.Context, etcdClient *etcd.Client, descprefix string) (int64, error) {
return etcdstruct.DeleteEtcdStructs(ctx, etcdClient, getEtcdKey(descprefix), etcd.WithPrefix())
}