-
Notifications
You must be signed in to change notification settings - Fork 0
/
group.go
142 lines (115 loc) · 3.19 KB
/
group.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
package main
import (
"github.com/gin-gonic/gin"
"log"
"net/http"
)
func putGroup(c *gin.Context) {
var json GroupPutData
if c.BindJSON(&json) == nil {
if json.State == "" || json.Name == "" {
c.JSON(http.StatusInternalServerError, gin.H{"error": "invalid message format"})
}
}
// start transaction
err, tid := f5.StartTransaction()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err})
}
group := cfg.Groups[json.Name]
if debug {
log.Printf("debug putGroup processing group %s, setting to %s\n", group, json.State)
}
for pkey, pool := range group.Pools {
if debug {
log.Printf("debug putGroup processing pool %s\n", pkey)
}
for _, member := range pool.Blue {
if json.State == "blue" {
log.Printf("enabling %s blue member: %s\n", pkey, member)
f5.OnlinePoolMember(pkey, member)
}
if json.State == "green" {
log.Printf("disabling %s blue member: %s\n", pkey, member)
f5.OfflinePoolMember(pkey, member)
}
}
for _, member := range pool.Green {
if json.State == "green" {
log.Printf("enabling %s green member: %s\n", pkey, member)
f5.OnlinePoolMember(pkey, member)
}
if json.State == "blue" {
log.Printf("disabling %s green member: %s\n", pkey, member)
f5.OfflinePoolMember(pkey, member)
}
}
}
err = f5.CommitTransaction(tid)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err})
}
showGroup(c)
}
func showGroup(c *gin.Context) {
if debug {
log.Printf("debug processing groups\n")
}
for gkey, group := range cfg.Groups {
if debug {
log.Printf("debug processing group %s\n", gkey)
}
var gblue int = 0
var ggreen int = 0
// if val, ok := dict["foo"]; ok { //do something here }
for pkey, pool := range group.Pools {
if debug {
log.Printf(" debug processing pool %s\n", pkey)
}
var pblue int = 0
var pgreen int = 0
err, resp, members := f5.ShowPoolMembers(pkey)
if err != nil {
group.Pools[pkey] = group.Pools[pkey].SetError(resp.Message)
// c.JSON(http.StatusInternalServerError, gin.H{"error": err, "message": resp.Message})
continue
}
for _, member := range members.Items {
// check each member - whether blue or green - maybe use a map here?
if member.Session == "monitor-enabled" {
for _, bmember := range pool.Blue {
if bmember == member.FullPath {
gblue++
pblue++
break
}
}
for _, bmember := range pool.Green {
if bmember == member.FullPath {
ggreen++
pgreen++
break
}
}
}
}
if pblue > 0 {
group.Pools[pkey] = group.Pools[pkey].SetState("blue")
} else if ggreen > 0 {
group.Pools[pkey] = group.Pools[pkey].SetState("green")
}
if (pblue > 0) && (pgreen > 0) {
group.Pools[pkey] = group.Pools[pkey].SetState("orange")
}
} // end range group.Pools
if gblue > 0 {
cfg.Groups[gkey] = cfg.Groups[gkey].SetState("blue")
} else if ggreen > 0 {
cfg.Groups[gkey] = cfg.Groups[gkey].SetState("green")
}
if (gblue > 0) && (ggreen > 0) {
cfg.Groups[gkey] = cfg.Groups[gkey].SetState("orange")
}
} // end range cfg.Groups
c.JSON(http.StatusOK, gin.H{"data": cfg.Groups, "user": currentUser})
}