github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/consul/key_client.go (about) 1 package consul 2 3 import ( 4 "fmt" 5 "log" 6 7 consulapi "github.com/hashicorp/consul/api" 8 ) 9 10 // keyClient is a wrapper around the upstream Consul client that is 11 // specialized for Terraform's manipulations of the key/value store. 12 type keyClient struct { 13 client *consulapi.KV 14 qOpts *consulapi.QueryOptions 15 wOpts *consulapi.WriteOptions 16 } 17 18 func newKeyClient(realClient *consulapi.KV, dc, token string) *keyClient { 19 qOpts := &consulapi.QueryOptions{Datacenter: dc, Token: token} 20 wOpts := &consulapi.WriteOptions{Datacenter: dc, Token: token} 21 22 return &keyClient{ 23 client: realClient, 24 qOpts: qOpts, 25 wOpts: wOpts, 26 } 27 } 28 29 func (c *keyClient) Get(path string) (string, error) { 30 log.Printf( 31 "[DEBUG] Reading key '%s' in %s", 32 path, c.qOpts.Datacenter, 33 ) 34 pair, _, err := c.client.Get(path, c.qOpts) 35 if err != nil { 36 return "", fmt.Errorf("Failed to read Consul key '%s': %s", path, err) 37 } 38 value := "" 39 if pair != nil { 40 value = string(pair.Value) 41 } 42 return value, nil 43 } 44 45 func (c *keyClient) GetUnderPrefix(pathPrefix string) (map[string]string, error) { 46 log.Printf( 47 "[DEBUG] Listing keys under '%s' in %s", 48 pathPrefix, c.qOpts.Datacenter, 49 ) 50 pairs, _, err := c.client.List(pathPrefix, c.qOpts) 51 if err != nil { 52 return nil, fmt.Errorf( 53 "Failed to list Consul keys under prefix '%s': %s", pathPrefix, err, 54 ) 55 } 56 value := map[string]string{} 57 for _, pair := range pairs { 58 subKey := pair.Key[len(pathPrefix):] 59 value[subKey] = string(pair.Value) 60 } 61 return value, nil 62 } 63 64 func (c *keyClient) Put(path, value string) error { 65 log.Printf( 66 "[DEBUG] Setting key '%s' to '%v' in %s", 67 path, value, c.wOpts.Datacenter, 68 ) 69 pair := consulapi.KVPair{Key: path, Value: []byte(value)} 70 if _, err := c.client.Put(&pair, c.wOpts); err != nil { 71 return fmt.Errorf("Failed to write Consul key '%s': %s", path, err) 72 } 73 return nil 74 } 75 76 func (c *keyClient) Delete(path string) error { 77 log.Printf( 78 "[DEBUG] Deleting key '%s' in %s", 79 path, c.wOpts.Datacenter, 80 ) 81 if _, err := c.client.Delete(path, c.wOpts); err != nil { 82 return fmt.Errorf("Failed to delete Consul key '%s': %s", path, err) 83 } 84 return nil 85 } 86 87 func (c *keyClient) DeleteUnderPrefix(pathPrefix string) error { 88 log.Printf( 89 "[DEBUG] Deleting all keys under prefix '%s' in %s", 90 pathPrefix, c.wOpts.Datacenter, 91 ) 92 if _, err := c.client.DeleteTree(pathPrefix, c.wOpts); err != nil { 93 return fmt.Errorf("Failed to delete Consul keys under '%s': %s", pathPrefix, err) 94 } 95 return nil 96 }