-
Notifications
You must be signed in to change notification settings - Fork 6
/
node_push_patch.go
90 lines (82 loc) · 1.92 KB
/
node_push_patch.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package object
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"github.com/opensvc/om3/core/rawconfig"
"github.com/opensvc/om3/util/hostname"
"github.com/opensvc/om3/util/patches"
)
func (t Node) nodePatchCacheFile() string {
return filepath.Join(rawconfig.NodeVarDir(), "patch.json")
}
func (t Node) PushPatch() ([]patches.Patch, error) {
l, err := patches.List()
if err != nil {
return l, err
}
if err := t.dumpPatch(l); err != nil {
return l, err
}
if err := t.pushPatch(l); err != nil {
return l, err
}
return l, nil
}
func (t Node) dumpPatch(data []patches.Patch) error {
file, err := os.OpenFile(t.nodePatchCacheFile(), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0660)
if err != nil {
return err
}
defer func() { _ = file.Close() }()
return json.NewEncoder(file).Encode(data)
}
func (t Node) LoadPatch() ([]patches.Patch, error) {
var data []patches.Patch
file, err := os.Open(t.nodePatchCacheFile())
if err != nil {
return data, err
}
defer func() { _ = file.Close() }()
err = json.NewDecoder(file).Decode(&data)
return data, err
}
func (t Node) pushPatch(data []patches.Patch) error {
nodename := hostname.Hostname()
patchAsList := func(t patches.Patch) []string {
installedAt := ""
if !t.InstalledAt.IsZero() {
installedAt = t.InstalledAt.Format("2006-01-02 15:04:05")
}
return []string{
nodename,
t.Number,
t.Revision,
installedAt,
}
}
patchsAsList := func(t []patches.Patch) [][]string {
l := make([][]string, len(t))
for i, p := range t {
l[i] = patchAsList(p)
}
return l
}
vars := []string{
"patch_nodename",
"patch_num",
"patch_rev",
"patch_install_date",
}
client, err := t.CollectorFeedClient()
if err != nil {
return err
}
if response, err := client.Call("insert_patch", vars, patchsAsList(data)); err != nil {
return err
} else if response.Error != nil {
return fmt.Errorf("rpc: %s %s", response.Error.Message, response.Error.Data)
}
return nil
}