-
Notifications
You must be signed in to change notification settings - Fork 4
/
kvv2.go
118 lines (95 loc) · 2.29 KB
/
kvv2.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package vault
import (
"context"
"path"
vaultapi "github.com/hashicorp/vault/api"
"github.com/puppetlabs/leg/encoding/transfer"
)
type KVV2Client struct {
client *vaultapi.Client
enginePath string
path string
}
func (c *KVV2Client) In(sub ...string) *KVV2Client {
return &KVV2Client{
client: c.client,
enginePath: c.enginePath,
path: path.Join(c.path, path.Join(sub...)),
}
}
func (c *KVV2Client) Read(ctx context.Context) (interface{}, error) {
sec, err := c.client.Logical().Read(c.dataPath())
if err != nil {
return nil, err
} else if sec == nil {
return nil, ErrVaultDataNotFound
}
data, ok := sec.Data["data"].(map[string]interface{})
if !ok {
return nil, ErrVaultDataNotFound
}
value, found := data["value"]
if !found {
return nil, ErrVaultDataNotFound
}
return value, nil
}
func (c *KVV2Client) ReadString(ctx context.Context) (string, error) {
raw, err := c.Read(ctx)
if err != nil {
return "", err
}
encoded, ok := raw.(string)
if !ok {
return "", ErrVaultDataNotFound
}
b, err := transfer.DecodeFromTransfer(encoded)
if err != nil {
return "", err
}
return string(b), nil
}
func (c *KVV2Client) Write(ctx context.Context, payload map[string]interface{}) error {
if _, err := c.client.Logical().Write(c.dataPath(), payload); err != nil {
return err
}
return nil
}
func (c *KVV2Client) Delete(ctx context.Context) error {
if _, err := c.client.Logical().Delete(c.metadataPath()); err != nil {
return err
}
return nil
}
func (c *KVV2Client) List(ctx context.Context) ([]string, error) {
ls, err := c.client.Logical().List(c.metadataPath())
if err != nil {
return nil, err
} else if ls == nil {
return nil, ErrVaultDataNotFound
}
ki, ok := ls.Data["keys"].([]interface{})
if !ok {
return nil, ErrVaultDataNotFound
}
keys := make([]string, len(ki))
for i, k := range ki {
keys[i], ok = k.(string)
if !ok {
return nil, ErrVaultDataNotFound
}
}
return keys, nil
}
func (c *KVV2Client) dataPath() string {
return path.Join(c.enginePath, "data", c.path)
}
func (c *KVV2Client) metadataPath() string {
return path.Join(c.enginePath, "metadata", c.path)
}
func NewKVV2Client(delegate *vaultapi.Client, enginePath string) *KVV2Client {
return &KVV2Client{
client: delegate,
enginePath: enginePath,
}
}