This repository has been archived by the owner on Mar 24, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 70
/
planner.go
160 lines (141 loc) · 4.29 KB
/
planner.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package planner
import (
"context"
"github.com/go-kit/kit/log"
"github.com/mitchellh/cli"
"github.com/replicatedhq/libyaml"
"github.com/replicatedhq/ship/pkg/api"
"github.com/replicatedhq/ship/pkg/lifecycle/daemon/daemontypes"
"github.com/replicatedhq/ship/pkg/lifecycle/render/amazoneks"
"github.com/replicatedhq/ship/pkg/lifecycle/render/azureaks"
"github.com/replicatedhq/ship/pkg/lifecycle/render/docker"
"github.com/replicatedhq/ship/pkg/lifecycle/render/dockerlayer"
"github.com/replicatedhq/ship/pkg/lifecycle/render/github"
"github.com/replicatedhq/ship/pkg/lifecycle/render/googlegke"
"github.com/replicatedhq/ship/pkg/lifecycle/render/helm"
"github.com/replicatedhq/ship/pkg/lifecycle/render/inline"
"github.com/replicatedhq/ship/pkg/lifecycle/render/terraform"
"github.com/replicatedhq/ship/pkg/lifecycle/render/web"
"github.com/replicatedhq/ship/pkg/templates"
"github.com/spf13/afero"
"github.com/spf13/viper"
)
// A Plan is a list of PlanSteps to execute
type Plan []Step
// A Execute describes a single unit of work that Ship will do
// to render the application
type Step struct {
Description string `json:"description" yaml:"description" hcl:"description"`
Dest string `json:"dest" yaml:"dest" hcl:"dest"`
Execute func(ctx context.Context) error
Err error
}
// Planner is a thing that can plan and execute rendering
type Planner interface {
Build(
string,
[]api.Asset,
[]libyaml.ConfigGroup,
api.ReleaseMetadata,
map[string]interface{},
) (Plan, error)
Execute(context.Context, Plan) error
WithStatusReceiver(receiver daemontypes.StatusReceiver) Planner
}
type Factory func() *CLIPlanner
func (f Factory) WithStatusReceiver(receiver daemontypes.StatusReceiver) Planner {
return Factory(func() *CLIPlanner {
planner := f()
return &CLIPlanner{
Status: receiver,
Logger: planner.Logger,
Fs: planner.Fs,
UI: planner.UI,
Viper: planner.Viper,
BuilderBuilder: planner.BuilderBuilder,
Inline: planner.Inline,
Helm: planner.Helm,
Docker: planner.Docker,
DockerLayer: planner.DockerLayer,
GitHub: planner.GitHub,
Terraform: planner.Terraform,
Web: planner.Web,
AmazonEKS: planner.AmazonEKS,
GoogleGKE: planner.GoogleGKE,
AzureAKS: planner.AzureAKS,
}
})
}
func (f Factory) Build(
root string,
assets []api.Asset,
configGroups []libyaml.ConfigGroup,
releaseMeta api.ReleaseMetadata,
templateContext map[string]interface{},
) (Plan, error) {
planner := f()
return planner.Build(root, assets, configGroups, releaseMeta, templateContext)
}
func (f Factory) Execute(ctx context.Context, p Plan) error {
planner := f()
return planner.Execute(ctx, p)
}
// CLIPlanner is the default Planner
type CLIPlanner struct {
Logger log.Logger
Fs afero.Afero
UI cli.Ui
Viper *viper.Viper
Status daemontypes.StatusReceiver
BuilderBuilder *templates.BuilderBuilder
Inline inline.Renderer
Helm helm.Renderer
Docker docker.Renderer
DockerLayer *dockerlayer.Unpacker
Web web.Renderer
GitHub github.Renderer
Terraform terraform.Renderer
AmazonEKS amazoneks.Renderer
GoogleGKE googlegke.Renderer
AzureAKS azureaks.Renderer
}
// Use a factory so we can create instances and override the StatusReceiver on those instances.
func NewFactory(
v *viper.Viper,
logger log.Logger,
fs afero.Afero,
ui cli.Ui,
builderBuilder *templates.BuilderBuilder,
inlineRenderer inline.Renderer,
dockerRenderer docker.Renderer,
helmRenderer helm.Renderer,
dockerlayers *dockerlayer.Unpacker,
gh github.Renderer,
tf terraform.Renderer,
webRenderer web.Renderer,
amazonEKS amazoneks.Renderer,
googleGKE googlegke.Renderer,
azureAKS azureaks.Renderer,
status daemontypes.StatusReceiver,
) Planner {
return Factory(func() *CLIPlanner {
return &CLIPlanner{
Logger: logger,
Fs: fs,
UI: ui,
Viper: v,
BuilderBuilder: builderBuilder,
Inline: inlineRenderer,
Helm: helmRenderer,
Docker: dockerRenderer,
DockerLayer: dockerlayers,
GitHub: gh,
Terraform: tf,
Web: webRenderer,
AmazonEKS: amazonEKS,
GoogleGKE: googleGKE,
AzureAKS: azureAKS,
Status: status,
}
})
}