Skip to content

Commit 481e9af

Browse files
committed
add basic integration test
1 parent 1baee7c commit 481e9af

File tree

2 files changed

+139
-6
lines changed

2 files changed

+139
-6
lines changed

it/integration_test.go

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package it
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"io/ioutil"
7+
"os"
8+
"os/exec"
9+
"regexp"
10+
"strings"
11+
"testing"
12+
"time"
13+
14+
commands "github.com/adamdecaf/vault-backend-migrator/cmd"
15+
"github.com/adamdecaf/vault-backend-migrator/vault"
16+
)
17+
18+
var (
19+
vaultVersion = "0.9.1"
20+
)
21+
22+
func hasDocker() bool {
23+
err := exec.Command("docker", "version").Run()
24+
return err == nil
25+
}
26+
27+
// Quick sanity check
28+
func TestMigrator__integration(t *testing.T) {
29+
if !hasDocker() {
30+
t.Skip("docker isn't installed / running")
31+
}
32+
33+
// Start vault container
34+
cmd := exec.Command("docker", "run", "-d", "-p", "8200:8200", "-t", fmt.Sprintf("vault:%s", vaultVersion))
35+
var stdout bytes.Buffer
36+
cmd.Stdout = &stdout
37+
err := cmd.Run()
38+
if err != nil {
39+
t.Fatal(err)
40+
}
41+
42+
// Grab root token
43+
r := regexp.MustCompile(`Root Token: ([a-f0-9]{8}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{12})`)
44+
id := strings.TrimSpace(stdout.String())
45+
defer func() {
46+
err = exec.Command("docker", "kill", id).Run()
47+
if err != nil {
48+
t.Fatal(err)
49+
}
50+
}()
51+
var token string
52+
for {
53+
out, err := exec.Command("docker", "logs", id).CombinedOutput()
54+
if err != nil {
55+
t.Fatal(err)
56+
break
57+
}
58+
loc := r.FindIndex(out)
59+
if len(loc) > 0 {
60+
s := string(out[loc[0]:loc[1]])
61+
token = strings.TrimPrefix(s, "Root Token: ")
62+
break
63+
}
64+
time.Sleep(1 * time.Second)
65+
}
66+
67+
if token == "" {
68+
t.Fatal("empty token")
69+
}
70+
71+
// Write a couple values into secret/, export, delete and import
72+
data := []struct {
73+
path string
74+
key string
75+
value string
76+
}{
77+
{"secret/foo", "foo", "YmFyCg=="}, // bar
78+
{"secret/bar/baz", "username", "YWRhbQo="}, // adam
79+
}
80+
os.Setenv("VAULT_ADDR", "http://127.0.0.1:8200")
81+
os.Setenv("VAULT_TOKEN", token)
82+
client, err := vault.NewClient()
83+
if err != nil {
84+
t.Fatal(err)
85+
}
86+
87+
// write values
88+
for i := range data {
89+
client.Write(data[i].path, map[string]string{
90+
data[i].key: data[i].value,
91+
})
92+
kv := client.Read(data[i].path)
93+
if kv[data[i].key] != data[i].value {
94+
t.Fatalf("path=%q, kv[%s]=%q, value=%q, err=%v", data[i].path, data[i].key, kv[data[i].key], data[i].value, err)
95+
}
96+
}
97+
98+
// export
99+
tmp, err := ioutil.TempFile("", "vault-backend-migrator")
100+
if err != nil {
101+
t.Fatal(err)
102+
}
103+
defer os.Remove(tmp.Name())
104+
err = commands.Export("secret/", tmp.Name())
105+
if err != nil {
106+
t.Fatal(err)
107+
}
108+
109+
// delete
110+
for i := range data {
111+
client.Client().Logical().Delete(data[i].path)
112+
// read to verify it's gone
113+
kv, err := client.Client().Logical().Read(data[i].path)
114+
if err == nil && kv != nil {
115+
t.Fatalf("path=%q, kv=%v", data[i].path, kv)
116+
}
117+
}
118+
119+
// import
120+
err = commands.Import("secret/", tmp.Name())
121+
if err != nil {
122+
t.Fatal(err)
123+
}
124+
for i := range data {
125+
kv := client.Read(data[i].path)
126+
if kv[data[i].key] != data[i].value {
127+
t.Fatalf("path=%q, kv[%s]=%q, value=%q, err=%v", data[i].path, data[i].key, kv[data[i].key], data[i].value, err)
128+
}
129+
}
130+
}

vault/client.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ type Vault struct {
1111
c *api.Client
1212
}
1313

14+
func (v *Vault) Client() *api.Client {
15+
return v.c
16+
}
17+
1418
func NewClient() (*Vault, error) {
1519
cfg := api.DefaultConfig()
1620

@@ -55,8 +59,8 @@ func (v *Vault) List(path string) []string {
5559
return nil
5660
}
5761

58-
// Read accepts a vault path to read the data out of. It will return a pointer to
59-
// a base64 encoded string representing the secret's data.
62+
// Read accepts a vault path to read the data out of. It will return a map
63+
// of base64 encoded values.
6064
func (v *Vault) Read(path string) map[string]string {
6165
out := make(map[string]string)
6266

@@ -93,12 +97,11 @@ func (v *Vault) Write(path string, data map[string]string) error {
9397
}
9498

9599
secret, err := v.c.Logical().Write(path, body)
96-
if secret == nil {
97-
return fmt.Errorf("No secret returned when writing to %s", path)
98-
}
99100
if err != nil {
100101
return err
101102
}
102-
103+
if secret == nil {
104+
return fmt.Errorf("No secret returned when writing to %s", path)
105+
}
103106
return nil
104107
}

0 commit comments

Comments
 (0)