github.com/angryronald/go-kit@v0.0.0-20240505173814-ff2bd9c79dbf/test/docker/vault/vault.deprecated.go (about) 1 package vault 2 3 /* 4 import ( 5 "context" 6 "fmt" 7 "log" 8 "net/http" 9 "os" 10 "time" 11 12 "github.com/hashicorp/vault/api" 13 ) 14 15 // ref: https://github.com/PolarGeospatialCenter/dockertest 16 17 const vaultTestRootToken = "701432d1-00e7-7c94-10c4-8450ab3c4b31" 18 19 type Instance struct { 20 config *api.Config 21 *Container 22 } 23 24 var activeContainer *Container 25 26 func init() { 27 os.Setenv("VAULT_TOKEN", vaultTestRootToken) 28 } 29 30 func Run(ctx context.Context) (*Instance, error) { 31 instance := &Instance{ 32 Container: &Container{ 33 Image: "docker.io/hashicorp/vault", 34 Cmd: []string{"vault", "server", "-dev", "-dev-root-token-id", vaultTestRootToken, "-dev-listen-address", "0.0.0.0:8200"}, 35 }, 36 } 37 38 err := instance.Container.Run(ctx) 39 if err != nil { 40 return nil, err 41 } 42 43 port, err := instance.Container.GetPort(ctx, "8200/tcp") 44 if err != nil { 45 return nil, err 46 } 47 48 instance.config = api.DefaultConfig() 49 instance.config.Address = fmt.Sprintf("http://0.0.0.0:%s", port) 50 51 timeout := time.After(10 * time.Second) 52 checkInterval := time.Tick(50 * time.Millisecond) 53 for { 54 select { 55 case <-timeout: 56 return nil, fmt.Errorf("vault failed to start after 10 seconds") 57 case <-checkInterval: 58 if instance.running() { 59 return instance, nil 60 } 61 } 62 } 63 } 64 65 func (i *Instance) running() bool { 66 c := http.Client{} 67 resp, err := c.Get(fmt.Sprintf("%s/v1/sys/seal-status", i.Config().Address)) 68 return err == nil && resp.StatusCode == 200 69 } 70 71 func (i *Instance) Config() *api.Config { 72 return i.config 73 } 74 75 func (i *Instance) RootToken() string { 76 return vaultTestRootToken 77 } 78 79 func GenerateInstance(data map[string]interface{}) (*api.Client, *api.Secret) { 80 ctx := context.Background() 81 instance, err := Run(ctx) 82 if err != nil { 83 log.Fatalf("unable to create vault instance: %v", err) 84 } 85 // defer instance.Container.Stop(ctx) 86 87 client, err := api.NewClient(instance.Config()) 88 if err != nil { 89 defer instance.Container.Stop(ctx) 90 log.Fatalf("Unable to create vault client: %v", err) 91 } 92 93 client.SetToken(instance.RootToken()) 94 95 newdata := make(map[string]interface{}) 96 newdata["data"] = data 97 _, err = client.Logical().Write("secret/data/test", newdata) 98 if err != nil { 99 defer instance.Container.Stop(ctx) 100 log.Fatalf("Unable to write test value to vault: %v", err) 101 } 102 103 secret, err := client.Logical().Read("secret/data/test") 104 if err != nil { 105 defer instance.Container.Stop(ctx) 106 log.Fatalf("Unable to read test value from vault: %v", err) 107 } 108 109 activeContainer = instance.Container 110 111 return client, secret 112 } 113 114 func RemoveInstance() error { 115 return activeContainer.Stop(context.Background()) 116 } 117 */