-
Notifications
You must be signed in to change notification settings - Fork 101
/
upgrade_latest_version_projects.go
87 lines (74 loc) · 2.79 KB
/
upgrade_latest_version_projects.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
package worker
import (
"context"
"github.com/rilldata/rill/admin"
"github.com/rilldata/rill/admin/database"
"github.com/rilldata/rill/runtime/pkg/observability"
"go.uber.org/zap"
)
func (w *Worker) upgradeLatestVersionProjects(ctx context.Context) error {
// Resolve 'latest' version
latestVersion := w.admin.ResolveLatestRuntimeVersion()
// Verify version is valid
err := w.admin.ValidateRuntimeVersion(latestVersion)
if err != nil {
return err
}
// Iterate over batches of projects with 'latest' version
limit := 100
afterName := ""
stop := false
for !stop {
// Get batch and update iterator variables
projs, err := w.admin.DB.FindProjectsByVersion(ctx, "latest", afterName, limit)
if err != nil {
return err
}
if len(projs) < limit {
stop = true
}
if len(projs) != 0 {
afterName = projs[len(projs)-1].Name
}
// Process batch
for _, proj := range projs {
err := w.upgradeAllDeploymentsForProject(ctx, proj, latestVersion)
if err != nil {
// We log the error, but continues to the next deployment
w.logger.Error("upgrade latest version projects: failed to upgrade project deployments", zap.String("project_id", proj.ID), zap.String("version", latestVersion), observability.ZapCtx(ctx), zap.Error(err))
}
}
}
return nil
}
func (w *Worker) upgradeAllDeploymentsForProject(ctx context.Context, proj *database.Project, latestVersion string) error {
// Get all project deployments
depls, err := w.admin.DB.FindDeploymentsForProject(ctx, proj.ID)
if err != nil {
return err
}
// Get project organization, we need this to create the deployment annotations
org, err := w.admin.DB.FindOrganization(ctx, proj.OrganizationID)
if err != nil {
return err
}
for _, depl := range depls {
if depl.RuntimeVersion != latestVersion {
w.logger.Info("upgrade latest version projects: upgrading deployment", zap.String("deployment_id", depl.ID), zap.String("provision_id", depl.ProvisionID), zap.String("instance_id", depl.RuntimeInstanceID), zap.String("version", latestVersion), observability.ZapCtx(ctx))
// Update deployment to latest version
err = w.admin.UpdateDeployment(ctx, depl, &admin.UpdateDeploymentOptions{
Version: latestVersion,
Branch: depl.Branch,
Variables: proj.ProdVariables,
Annotations: w.admin.NewDeploymentAnnotations(org, proj),
EvictCachedRepo: false,
})
if err != nil {
w.logger.Error("upgrade latest version projects: failed to upgrade deployment", zap.String("deployment_id", depl.ID), zap.String("version", latestVersion), observability.ZapCtx(ctx), zap.Error(err))
return err
}
w.logger.Info("upgrade latest version projects: upgraded deployment", zap.String("deployment_id", depl.ID), zap.String("version", latestVersion), observability.ZapCtx(ctx))
}
}
return nil
}