blob: 340648c991a6686a893171747d50e47f8ff91400 [file] [log] [blame]
Giorgi Lekveishvili46743d42023-12-10 15:47:23 +04001package tasks
2
3import (
4 "context"
5 "fmt"
6 "net"
7
8 "github.com/charmbracelet/keygen"
9
10 "github.com/giolekva/pcloud/core/installer"
11 "github.com/giolekva/pcloud/core/installer/soft"
12)
13
14type state struct {
15 publicIPs []net.IP
16 nsCreator installer.NamespaceCreator
17 repo installer.RepoIO
18 ssClient *soft.Client
19 fluxUserName string
20 keys *keygen.KeyPair
21}
22
23type createEnvTask struct {
24 basicTask
25 env Env
26 st state
27 createConfigRepo Task
28}
29
30type Env struct {
31 PCloudEnvName string
32 Name string
33 ContactEmail string
34 Domain string
35 AdminPublicKey string
36}
37
38func NewCreateEnvTask(
39 env Env,
40 publicIPs []net.IP,
41 nsCreator installer.NamespaceCreator,
42 repo installer.RepoIO,
43) Task {
44 ctx := context.Background()
45 e := &createEnvTask{
46 basicTask: basicTask{
47 title: fmt.Sprintf("Create %s environment", env.Domain),
48 },
49 env: env,
50 st: state{
51 publicIPs: publicIPs,
52 nsCreator: nsCreator,
53 repo: repo,
54 },
55 }
56 e.createConfigRepo = NewCreateConfigRepoTask(env, &e.st)
57 e.AddSubtask(e.createConfigRepo)
58 initRepo := NewInitConfigRepoTask(env, &e.st)
59 e.AddSubtask(initRepo)
60 e.createConfigRepo.OnDone(func(err error) {
61 if err == nil {
62 initRepo.Start()
63 } else {
64 e.callDoneListeners(err)
65 }
66 })
67 activate := NewActivateEnvTask(env, &e.st)
68 e.AddSubtask(activate)
69 initRepo.OnDone(func(err error) {
70 if err == nil {
71 activate.Start()
72 } else {
73 e.callDoneListeners(err)
74 }
75 })
76 dns := NewDNSResolverTask(env.Domain, publicIPs, ctx, env, &e.st)
77 e.AddSubtask(dns)
78 activate.OnDone(func(err error) {
79 if err == nil {
80 dns.Start()
81 } else {
82 e.callDoneListeners(err)
83 }
84 })
85 setupInfra := NewSetupInfraAppsTask(env, &e.st)
86 e.AddSubtask(setupInfra)
87 dns.OnDone(func(err error) {
88 if err == nil {
89 setupInfra.Start()
90 } else {
91 e.callDoneListeners(err)
92 }
93 })
94 setupInfra.OnDone(func(err error) {
95 e.callDoneListeners(err)
96 })
97 return e
98}
99
100func (t *createEnvTask) Start() {
101 go t.createConfigRepo.Start()
102}