-
Notifications
You must be signed in to change notification settings - Fork 50
/
fcagent.go
150 lines (125 loc) · 2.98 KB
/
fcagent.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package fcagent
import (
"errors"
"os/exec"
"strconv"
"strings"
log "github.com/Sirupsen/logrus"
)
const (
// FcVolMaxCloudDisk is the max number of constituent disks for a FittedCloud volume
FcVolMaxCloudDisk = 6
)
// IsRunning checks if FittedCloud Agent is running
func IsRunning() (string, error) {
var (
cmdOut []byte
err error
path string
)
cmd := "fcagent"
args := []string{"echo"}
if path, err = exec.LookPath(cmd); err != nil {
log.Debug(err)
}
log.Debug(path, args[0])
if cmdOut, err = exec.Command(cmd, args...).Output(); err != nil {
log.Debug(err)
}
return string(cmdOut), err
}
// CreateVol creates a FittedCluod volume
func CreateVol(tagName string, sizeGb int, encryption bool, kmsKeyID string) (string, error) {
var (
cmdOut []byte
err error
fcVolName string
)
sizeGbStr := strconv.Itoa(sizeGb)
initGb := (sizeGb + FcVolMaxCloudDisk - 1) / FcVolMaxCloudDisk
initGbStr := strconv.Itoa(initGb)
log.Debug("sizeGbStr=" + sizeGbStr + " initGbStr=" + initGbStr)
// Find the next available fcvol name
fcVolName, err = GetFcVolName("next")
if err != nil {
return "", err
}
cmd := "fcagent"
args := make([]string, 0, 8)
args = append(args, "createvol")
args = append(args, fcVolName)
args = append(args, sizeGbStr)
args = append(args, initGbStr)
args = append(args, "--delete_on_termination=no")
if encryption {
args = append(args, "--encryption=yes")
if kmsKeyID != "" {
args = append(args, "--kms_key="+kmsKeyID)
}
} else {
args = append(args, "--encryption=no")
}
args = append(args, "--ebs_tag="+tagName)
log.Debug(cmd, args)
if cmdOut, err = exec.Command(cmd, args...).Output(); err != nil {
log.Debug(err)
return string(cmdOut), err
}
return fcVolName, nil
}
// DelVol deletes a FittedCloud volume by name
func DelVol(fcVolName string) (string, error) {
var (
cmdOut []byte
err error
)
strs := strings.SplitAfterN(fcVolName, "/dev/", 2)
if len(strs) == 2 && strs[0] == "/dev/" {
fcVolName = strs[1]
}
log.Debug("fcVolName=", fcVolName)
cmd := "fcagent"
args := []string{
"delvol",
fcVolName,
"-donotdelebs"}
log.Debug(cmd, args)
if cmdOut, err = exec.Command(cmd, args...).Output(); err != nil {
log.Debug(err)
}
return string(cmdOut), err
}
func getFcVolName(devName string) (string, error) {
var (
cmdOut []byte
err error
)
cmd := "fcagent"
args := []string{
"getfcvolname",
devName}
log.Debug(cmd, args)
if cmdOut, err = exec.Command(cmd, args...).Output(); err != nil {
log.Debug(err)
}
return string(cmdOut), err
}
// GetFcVolName returns the FittedCloud volume name
func GetFcVolName(devName string) (string, error) {
var (
cmdOut string
err error
)
if cmdOut, err = getFcVolName(devName); err != nil {
return "", err
}
cmdOut = strings.TrimRight(cmdOut, "\n")
strs := strings.SplitAfterN(cmdOut, "fcvol=", 2)
if len(strs) == 2 {
if strs[1] == "NOTFOUND" {
return cmdOut, errors.New("fcvol not found")
}
cmdOut = strs[1]
}
return cmdOut, err
}