| Giorgi Lekveishvili | 46743d4 | 2023-12-10 15:47:23 +0400 | [diff] [blame] | 1 | package tasks |
| 2 | |
| 3 | import ( |
| Giorgi Lekveishvili | d2f3dca | 2023-12-20 09:31:30 +0400 | [diff] [blame] | 4 | "context" |
| Giorgi Lekveishvili | 2df23db | 2023-12-14 07:55:22 +0400 | [diff] [blame] | 5 | "fmt" |
| Giorgi Lekveishvili | 46743d4 | 2023-12-10 15:47:23 +0400 | [diff] [blame] | 6 | |
| 7 | "github.com/charmbracelet/keygen" |
| 8 | |
| 9 | "github.com/giolekva/pcloud/core/installer" |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame] | 10 | "github.com/giolekva/pcloud/core/installer/dns" |
| 11 | "github.com/giolekva/pcloud/core/installer/http" |
| Giorgi Lekveishvili | 46743d4 | 2023-12-10 15:47:23 +0400 | [diff] [blame] | 12 | "github.com/giolekva/pcloud/core/installer/soft" |
| 13 | ) |
| 14 | |
| 15 | type state struct { |
| gio | 3cdee59 | 2024-04-17 10:15:56 +0400 | [diff] [blame] | 16 | infoListener EnvInfoListener |
| gio | 3cdee59 | 2024-04-17 10:15:56 +0400 | [diff] [blame] | 17 | nsCreator installer.NamespaceCreator |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame] | 18 | dnsFetcher installer.ZoneStatusFetcher |
| 19 | httpClient http.Client |
| 20 | dnsClient dns.Client |
| 21 | repo soft.RepoIO |
| 22 | repoClient soft.ClientGetter |
| gio | 3cdee59 | 2024-04-17 10:15:56 +0400 | [diff] [blame] | 23 | ssAdminKeys *keygen.KeyPair |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame] | 24 | ssClient soft.Client |
| gio | 3cdee59 | 2024-04-17 10:15:56 +0400 | [diff] [blame] | 25 | fluxUserName string |
| 26 | keys *keygen.KeyPair |
| 27 | appManager *installer.AppManager |
| 28 | appsRepo installer.AppRepository |
| 29 | infraAppManager *installer.InfraAppManager |
| Giorgi Lekveishvili | 46743d4 | 2023-12-10 15:47:23 +0400 | [diff] [blame] | 30 | } |
| 31 | |
| Giorgi Lekveishvili | ab7ff6e | 2024-03-29 13:11:30 +0400 | [diff] [blame] | 32 | type EnvInfoListener func(string) |
| 33 | |
| Giorgi Lekveishvili | 46743d4 | 2023-12-10 15:47:23 +0400 | [diff] [blame] | 34 | func NewCreateEnvTask( |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame] | 35 | env installer.EnvConfig, |
| Giorgi Lekveishvili | 46743d4 | 2023-12-10 15:47:23 +0400 | [diff] [blame] | 36 | nsCreator installer.NamespaceCreator, |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame] | 37 | dnsFetcher installer.ZoneStatusFetcher, |
| 38 | httpClient http.Client, |
| 39 | dnsClient dns.Client, |
| 40 | repo soft.RepoIO, |
| 41 | repoClient soft.ClientGetter, |
| gio | 3cdee59 | 2024-04-17 10:15:56 +0400 | [diff] [blame] | 42 | mgr *installer.InfraAppManager, |
| Giorgi Lekveishvili | ab7ff6e | 2024-03-29 13:11:30 +0400 | [diff] [blame] | 43 | infoListener EnvInfoListener, |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame] | 44 | ) (Task, installer.EnvDNS) { |
| Giorgi Lekveishvili | 77ee2dc | 2023-12-11 16:51:10 +0400 | [diff] [blame] | 45 | st := state{ |
| gio | 3cdee59 | 2024-04-17 10:15:56 +0400 | [diff] [blame] | 46 | infoListener: infoListener, |
| gio | 3cdee59 | 2024-04-17 10:15:56 +0400 | [diff] [blame] | 47 | nsCreator: nsCreator, |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame] | 48 | dnsFetcher: dnsFetcher, |
| 49 | httpClient: httpClient, |
| 50 | dnsClient: dnsClient, |
| gio | 3cdee59 | 2024-04-17 10:15:56 +0400 | [diff] [blame] | 51 | repo: repo, |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame] | 52 | repoClient: repoClient, |
| gio | 3cdee59 | 2024-04-17 10:15:56 +0400 | [diff] [blame] | 53 | infraAppManager: mgr, |
| Giorgi Lekveishvili | 46743d4 | 2023-12-10 15:47:23 +0400 | [diff] [blame] | 54 | } |
| Giorgi Lekveishvili | 2df23db | 2023-12-14 07:55:22 +0400 | [diff] [blame] | 55 | t := newSequentialParentTask( |
| Giorgi Lekveishvili | 77ee2dc | 2023-12-11 16:51:10 +0400 | [diff] [blame] | 56 | "Create env", |
| Giorgi Lekveishvili | 5c1b06e | 2024-03-28 15:19:44 +0400 | [diff] [blame] | 57 | true, |
| 58 | SetupConfigRepoTask(env, &st), |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame] | 59 | SetupZoneTask(env, mgr, &st), |
| 60 | SetupInfra(env, &st), |
| Giorgi Lekveishvili | 2df23db | 2023-12-14 07:55:22 +0400 | [diff] [blame] | 61 | ) |
| Giorgi Lekveishvili | ab7ff6e | 2024-03-29 13:11:30 +0400 | [diff] [blame] | 62 | t.afterDone = func() { |
| 63 | infoListener(fmt.Sprintf("dodo environment for %s has been provisioned successfully. Visit [https://welcome.%s](https://welcome.%s) to create administrative account and log into the system.", env.Domain, env.Domain, env.Domain)) |
| 64 | } |
| Giorgi Lekveishvili | d2f3dca | 2023-12-20 09:31:30 +0400 | [diff] [blame] | 65 | rctx, done := context.WithCancel(context.Background()) |
| Giorgi Lekveishvili | 2df23db | 2023-12-14 07:55:22 +0400 | [diff] [blame] | 66 | t.OnDone(func(_ error) { |
| Giorgi Lekveishvili | d2f3dca | 2023-12-20 09:31:30 +0400 | [diff] [blame] | 67 | done() |
| Giorgi Lekveishvili | 2df23db | 2023-12-14 07:55:22 +0400 | [diff] [blame] | 68 | }) |
| Giorgi Lekveishvili | d2f3dca | 2023-12-20 09:31:30 +0400 | [diff] [blame] | 69 | pr := NewFluxcdReconciler( // TODO(gio): make reconciler address a flag |
| 70 | "http://fluxcd-reconciler.dodo-fluxcd-reconciler.svc.cluster.local", |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame] | 71 | fmt.Sprintf("%s-flux", env.InfraName), |
| Giorgi Lekveishvili | d2f3dca | 2023-12-20 09:31:30 +0400 | [diff] [blame] | 72 | ) |
| 73 | er := NewFluxcdReconciler( |
| 74 | "http://fluxcd-reconciler.dodo-fluxcd-reconciler.svc.cluster.local", |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame] | 75 | env.Id, |
| Giorgi Lekveishvili | d2f3dca | 2023-12-20 09:31:30 +0400 | [diff] [blame] | 76 | ) |
| 77 | go pr.Reconcile(rctx) |
| 78 | go er.Reconcile(rctx) |
| gio | e72b54f | 2024-04-22 10:44:41 +0400 | [diff] [blame] | 79 | return t, installer.EnvDNS{ |
| 80 | Zone: env.Domain, |
| 81 | Address: fmt.Sprintf("http://dns-api.%sdns.svc.cluster.local/records-to-publish", env.NamespacePrefix), |
| 82 | } |
| Giorgi Lekveishvili | 2df23db | 2023-12-14 07:55:22 +0400 | [diff] [blame] | 83 | } |