blob: 5701c727423edcf7a9a1ec62808bbebb37665b3c [file] [log] [blame]
David K. Bainbridge546cdc32016-06-29 15:30:22 -07001package main
2
3import (
4 "encoding/json"
5 consul "github.com/hashicorp/consul/api"
6 "log"
7 "net/url"
8)
9
10const (
11 PREFIX = "cord/provisioner/"
12)
13
14type ConsulStorage struct {
15 client *consul.Client
16 kv *consul.KV
17}
18
19func NewConsulStorage(spec string) (*ConsulStorage, error) {
20 conn, err := url.Parse(spec)
21 if err != nil {
22 return nil, err
23 }
24
25 cfg := consul.Config{
26 Address: conn.Host,
27 Scheme: "http",
28 }
29
30 log.Printf("%+v", cfg)
31
32 client, err := consul.NewClient(&cfg)
33 if err != nil {
34 return nil, err
35 }
36 return &ConsulStorage{
37 client: client,
38 kv: client.KV(),
39 }, nil
40}
41
42func (s *ConsulStorage) Put(id string, update StatusMsg) error {
43 data, err := json.Marshal(update)
44 if err != nil {
45 return err
46 }
47 _, err = s.kv.Put(&consul.KVPair{
48 Key: PREFIX + id,
49 Value: data,
50 }, nil)
51 return err
52}
53
David K. Bainbridge068e87d2016-06-30 13:53:19 -070054func (s *ConsulStorage) Delete(id string) error {
55 _, err := s.kv.Delete(PREFIX+id, nil)
56 return err
57}
58
David K. Bainbridge546cdc32016-06-29 15:30:22 -070059func (s *ConsulStorage) Get(id string) (*StatusMsg, error) {
60 pair, _, err := s.kv.Get(PREFIX+id, nil)
61 if err != nil {
62 return nil, err
63 }
64
65 if pair == nil {
66 return nil, nil
67 }
68
69 var record StatusMsg
70 err = json.Unmarshal([]byte(pair.Value), &record)
71 if err != nil {
72 return nil, err
73 }
74 return &record, nil
75}
76
77func (s *ConsulStorage) List() ([]StatusMsg, error) {
78 pairs, _, err := s.kv.List(PREFIX, nil)
79 if err != nil {
80 return nil, err
81 }
82 result := make([]StatusMsg, len(pairs))
83 i := 0
84 for _, pair := range pairs {
85 err = json.Unmarshal([]byte(pair.Value), &(result[i]))
86 if err != nil {
87 return nil, err
88 }
89 i += 1
90 }
91 return result, nil
92}