-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
104 lines (91 loc) · 2.38 KB
/
main.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
package main
import (
"github.com/ovrclk/gestalt"
g "github.com/ovrclk/gestalt/builder"
"github.com/ovrclk/gestalt/component"
)
func DevServer() gestalt.Component {
return g.Group("dev-server").
Run(g.SH("cleanup", "echo", "cleanup")).
Run(g.BG().
Run(g.SH("start", "while true; do echo .; sleep 1; done"))).
Run(g.SH("wait", "sleep", "10")).
Run(g.Retry(5).
Run(g.SH("check", "echo", "check")))
}
// create a new farm
func GroupUp() gestalt.Component {
check := g.SH("check", "echo", "a", "{{group-name}}-id", "b").
FN(g.Capture("_", "group-host", "_")).
WithMeta(g.Export("group-host"))
return g.Group("group-up").
Run(
g.SH("create", "echo", "create-group", "{{group-name}}")).
Run(
g.Retry(60 * 5).
Run(check)).
WithMeta(g.Require("group-name").Export("group-host"))
}
// teardown farm
func GroupDown() gestalt.Component {
return g.Group("group-down").
Run(g.SH("down", "echo", "group:down", "{{group-name}}")).
WithMeta(g.Require("group-name"))
}
// create farm, ensure deletion after child components run
func GroupUpDown() component.Ensure {
return g.Ensure("groups").
First(GroupUp()).
Finally(GroupDown())
}
// create leader on farm host.
func UserUp() gestalt.Component {
create := g.SH("create",
"{{group-host}}", "user:create", "{{user-name}}")
get := g.SH("get", "echo", "{{group-host}}-user").
FN(g.
Columns("user-host").
EnsureCount(1).
Capture("user-host")).
WithMeta(g.Export("user-host"))
check := g.SH("check",
"echo", "ping", "{{user-host}}")
return g.Group("user-up").
Run(create).
Run(
g.Retry(60 * 5).
Run(get)).
Run(
g.Retry(60 * 5).
Run(check)).
WithMeta(g.
Require("group-host", "user-name").
Export("leader-host"))
}
// destroy leader.
func UserDown() gestalt.Component {
delete := g.SH("delete",
"echo", "delete", "{{group-host}}", "user:down", "{{user-name}}")
return g.Group("user-down").
Run(delete).
WithMeta(g.Require("group-host", "user-name"))
}
// create then ensure destruction of leader.
func UserUpDown() component.Ensure {
return g.Ensure("users").
First(UserUp()).
Finally(UserDown())
}
func Suite() gestalt.Component {
return g.Suite("app").
Run(DevServer()).
Run(GroupUpDown().
Run(UserUpDown())).
WithMeta(g.Require("group-name", "user-name"))
}
func main() {
gestalt.Run(Suite().
WithMeta(g.
Default("group-name", "g1").
Default("user-name", "u1")))
}