blob: 7592ac0ce4e6c85edf714e6f8a5e65bd380cd7e7 [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
54func (s *ConsulStorage) Get(id string) (*StatusMsg, error) {
55 pair, _, err := s.kv.Get(PREFIX+id, nil)
56 if err != nil {
57 return nil, err
58 }
59
60 if pair == nil {
61 return nil, nil
62 }
63
64 var record StatusMsg
65 err = json.Unmarshal([]byte(pair.Value), &record)
66 if err != nil {
67 return nil, err
68 }
69 return &record, nil
70}
71
72func (s *ConsulStorage) List() ([]StatusMsg, error) {
73 pairs, _, err := s.kv.List(PREFIX, nil)
74 if err != nil {
75 return nil, err
76 }
77 result := make([]StatusMsg, len(pairs))
78 i := 0
79 for _, pair := range pairs {
80 err = json.Unmarshal([]byte(pair.Value), &(result[i]))
81 if err != nil {
82 return nil, err
83 }
84 i += 1
85 }
86 return result, nil
87}