-
Notifications
You must be signed in to change notification settings - Fork 6
/
common.go
191 lines (161 loc) · 5 KB
/
common.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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
package common
import (
"errors"
log "github.com/Sirupsen/logrus"
types "github.com/codedellemc/scaleio-framework/scaleio-scheduler/types"
)
const (
//RebootCmdline reboot now
RebootCmdline = "shutdown -r now"
//RebootCheck check for the reboot
RebootCheck = "reboot in 1 minute"
)
var (
//ErrInitialStateFailed failed to get the initial state
ErrInitialStateFailed = errors.New("Failed to get the initial cluster state")
//ErrFindNodeFailed failed to find MDM Pair
ErrFindNodeFailed = errors.New("Failed to find the specific node")
//ErrMdmPairFailed failed to find MDM Pair
ErrMdmPairFailed = errors.New("Failed to Find MDM Pair")
//ErrStateChangeNotAcknowledged failed to find MDM Pair
ErrStateChangeNotAcknowledged = errors.New("The node state change was not acknowledged")
)
//PersonaStringToID String -> PersonaID
func PersonaStringToID(persona string) int {
switch persona {
case "primary":
return types.PersonaMdmPrimary
case "secondary":
return types.PersonaMdmSecondary
case "tiebreaker":
return types.PersonaTb
case "data":
return types.PersonaNode
default:
return types.PersonaUnknown
}
}
//PersonaIDToString PersonaID -> String
func PersonaIDToString(persona int) string {
switch persona {
case types.PersonaMdmPrimary:
return "primary"
case types.PersonaMdmSecondary:
return "secondary"
case types.PersonaTb:
return "tiebreaker"
case types.PersonaNode:
return "data"
default:
return "unknown"
}
}
//GetSelfNode gets self
func GetSelfNode(state *types.ScaleIOFramework, executorID string) *types.ScaleIONode {
log.Infoln("getSelfNode ENTER")
for _, node := range state.ScaleIO.Nodes {
if executorID == node.ExecutorID {
log.Infoln("getSelfNode Found:", node.ExecutorID)
log.Infoln("getSelfNode LEAVE")
return node
}
}
log.Infoln("getSelfNode NOT FOUND")
log.Infoln("getSelfNode LEAVE")
return nil
}
func getNodeType(state *types.ScaleIOFramework, nodeType int) (*types.ScaleIONode, error) {
for _, node := range state.ScaleIO.Nodes {
if node.Persona == nodeType {
log.Infoln("Found MDM Node:", node.ExecutorID, "Persona:", node.Persona)
return node, nil
}
}
return nil, ErrFindNodeFailed
}
//GetPrimaryMdmNode gets the Primary node
func GetPrimaryMdmNode(state *types.ScaleIOFramework) (*types.ScaleIONode, error) {
return getNodeType(state, types.PersonaMdmPrimary)
}
//GetSecondaryMdmNode gets the Secondary node
func GetSecondaryMdmNode(state *types.ScaleIOFramework) (*types.ScaleIONode, error) {
return getNodeType(state, types.PersonaMdmSecondary)
}
//GetTiebreakerMdmNode gets the TB node
func GetTiebreakerMdmNode(state *types.ScaleIOFramework) (*types.ScaleIONode, error) {
return getNodeType(state, types.PersonaTb)
}
func getMdmNodes(state *types.ScaleIOFramework) ([]types.ScaleIONode, error) {
log.Infoln("getMdmNodes ENTER")
pri, err := GetPrimaryMdmNode(state)
if err != nil {
log.Infoln("Failed to find Primary MDM")
log.Infoln("getMdmNodes LEAVE")
return nil, ErrMdmPairFailed
}
sec, err := GetSecondaryMdmNode(state)
if err != nil {
log.Infoln("Failed to find Secondary MDM")
log.Infoln("getMdmNodes LEAVE")
return nil, ErrMdmPairFailed
}
var col []types.ScaleIONode
col = append(col, *pri)
col = append(col, *sec)
log.Infoln("Found MDM Pair")
log.Infoln("getMdmNodes LEAVE")
return col, nil
}
//CreateMdmPairString just like it sounds
func CreateMdmPairString(state *types.ScaleIOFramework) (string, error) {
//use pre-configured MDM nodes
if state.ScaleIO.Preconfig.PreConfigEnabled {
str := state.ScaleIO.Preconfig.PrimaryMdmAddress + "," +
state.ScaleIO.Preconfig.SecondaryMdmAddress
log.Debugln("Using Pre-Configured MDMs:", str)
return str, nil
}
log.Debugln("Creating MDMs based on Configuration")
nodes, err := getMdmNodes(state)
if err != nil {
return "", err
}
str := ""
for _, node := range nodes {
if len(str) > 0 {
str += ","
}
str += node.IPAddress
}
log.Debugln("IP String:", str)
return str, nil
}
//GenerateSdsName creates the SDS name for this given node
func GenerateSdsName(node *types.ScaleIONode) string {
str := "sds-" + node.Hostname
return str
}
//GetGatewayAddress returns the ScaleIO gateway address
func GetGatewayAddress(state *types.ScaleIOFramework) (string, error) {
if state.ScaleIO.Preconfig.PreConfigEnabled &&
state.ScaleIO.Preconfig.GatewayAddress != "" {
log.Debugln("Using Pre-Configured Gateway:",
state.ScaleIO.Preconfig.GatewayAddress)
return state.ScaleIO.Preconfig.GatewayAddress, nil
} else if state.ScaleIO.Preconfig.PreConfigEnabled {
log.Debugln("Pre-Configured Gateway Not Set:",
state.ScaleIO.Preconfig.PrimaryMdmAddress)
return state.ScaleIO.Preconfig.PrimaryMdmAddress, nil
} else if state.ScaleIO.LbGateway != "" {
log.Debugln("Using Load Balancing Gateway:",
state.ScaleIO.LbGateway)
return state.ScaleIO.LbGateway, nil
}
pri, err := GetPrimaryMdmNode(state)
if err != nil {
log.Errorln("Unable to find the Primary MDM node")
return "", err
}
log.Debugln("Determined Gateway:", pri.IPAddress)
return pri.IPAddress, nil
}