forked from flynn/flynn
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathadd_app_action.go
93 lines (80 loc) · 1.93 KB
/
add_app_action.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
package bootstrap
import (
"fmt"
ct "github.com/flynn/flynn/controller/types"
"github.com/flynn/flynn/pkg/random"
)
type AddAppAction struct {
ID string `json:"id"`
FromStep string `json:"from_step"`
App *ct.App `json:"app"`
}
func init() {
Register("add-app", &AddAppAction{})
}
type AppState struct {
*ct.ExpandedFormation
Formation *ct.Formation `json:"formation"`
Resources []*ct.Resource `json:"resources"`
}
func (a *AddAppAction) Run(s *State) error {
data, ok := s.StepData[a.FromStep].(*RunAppState)
if !ok {
return fmt.Errorf("bootstrap: unable to find step %q", a.FromStep)
}
as := &AppState{
ExpandedFormation: &ct.ExpandedFormation{},
Resources: make([]*ct.Resource, 0, len(data.Resources)),
}
s.StepData[a.ID] = as
client, err := s.ControllerClient()
if err != nil {
return err
}
a.App.ID = data.App.ID
if err := client.CreateApp(a.App); err != nil {
return err
}
as.App = a.App
if err := client.CreateArtifact(data.Artifact); err != nil {
return err
}
as.Artifact = data.Artifact
if err := client.CreateRelease(data.Release); err != nil {
return err
}
as.Release = data.Release
for i, p := range data.Providers {
if provider, ok := s.Providers[p.Name]; ok {
p = provider
} else {
if err := client.CreateProvider(p); err != nil {
return err
}
s.Providers[p.Name] = p
}
resource := &ct.Resource{
ID: random.UUID(),
ProviderID: p.ID,
ExternalID: data.Resources[i].ID,
Env: data.Resources[i].Env,
}
if err := client.PutResource(resource); err != nil {
return err
}
as.Resources = append(as.Resources, resource)
}
formation := &ct.Formation{
AppID: data.App.ID,
ReleaseID: data.Release.ID,
Processes: data.Processes,
}
if err := client.PutFormation(formation); err != nil {
return err
}
as.Formation = formation
if err := client.SetAppRelease(data.App.ID, data.Release.ID); err != nil {
return err
}
return nil
}