@@ -23,9 +23,21 @@ func (s *server) Provision(stream proto.DRPCProvisioner_ProvisionStream) error {
23
23
if request .GetCancel () != nil {
24
24
return nil
25
25
}
26
- // We expect the first message is start!
27
- if request .GetStart () == nil {
26
+
27
+ var (
28
+ applyRequest = request .GetApply ()
29
+ planRequest = request .GetPlan ()
30
+ )
31
+
32
+ var (
33
+ config * proto.Provision_Config
34
+ )
35
+ if applyRequest == nil && planRequest == nil {
28
36
return nil
37
+ } else if applyRequest != nil {
38
+ config = applyRequest .Config
39
+ } else if planRequest != nil {
40
+ config = planRequest .Config
29
41
}
30
42
31
43
// Create a context for graceful cancellation bound to the stream
@@ -73,17 +85,16 @@ func (s *server) Provision(stream proto.DRPCProvisioner_ProvisionStream) error {
73
85
logger : s .logger .Named ("execution_logs" ),
74
86
stream : stream ,
75
87
}
76
- start := request .GetStart ()
77
88
78
- e := s .executor (start .Directory )
89
+ e := s .executor (config .Directory )
79
90
if err = e .checkMinVersion (ctx ); err != nil {
80
91
return err
81
92
}
82
93
logTerraformEnvVars (sink )
83
94
84
- statefilePath := filepath .Join (start .Directory , "terraform.tfstate" )
85
- if len (start .State ) > 0 {
86
- err = os .WriteFile (statefilePath , start .State , 0o600 )
95
+ statefilePath := filepath .Join (config .Directory , "terraform.tfstate" )
96
+ if len (config .State ) > 0 {
97
+ err = os .WriteFile (statefilePath , config .State , 0o600 )
87
98
if err != nil {
88
99
return xerrors .Errorf ("write statefile %q: %w" , statefilePath , err )
89
100
}
@@ -94,7 +105,7 @@ func (s *server) Provision(stream proto.DRPCProvisioner_ProvisionStream) error {
94
105
// e.g. bad template param values and cannot be deleted. This is just for
95
106
// contingency, in the future we will try harder to prevent workspaces being
96
107
// broken this hard.
97
- if start .Metadata .WorkspaceTransition == proto .WorkspaceTransition_DESTROY && len (start .State ) == 0 {
108
+ if config .Metadata .WorkspaceTransition == proto .WorkspaceTransition_DESTROY && len (config .State ) == 0 {
98
109
_ = stream .Send (& proto.Provision_Response {
99
110
Type : & proto.Provision_Response_Log {
100
111
Log : & proto.Log {
@@ -127,24 +138,23 @@ func (s *server) Provision(stream proto.DRPCProvisioner_ProvisionStream) error {
127
138
}
128
139
s .logger .Debug (ctx , "ran initialization" )
129
140
130
- env , err := provisionEnv (start )
131
- if err != nil {
132
- return err
133
- }
134
- vars , err := provisionVars (start )
135
- if err != nil {
136
- return err
137
- }
138
141
var resp * proto.Provision_Response
139
- if start .DryRun {
140
- resp , err = e .plan (ctx , killCtx , env , vars , sink ,
141
- start .Metadata .WorkspaceTransition == proto .WorkspaceTransition_DESTROY )
142
- } else {
143
- resp , err = e .apply (ctx , killCtx , env , vars , sink ,
144
- start .Metadata .WorkspaceTransition == proto .WorkspaceTransition_DESTROY )
145
- }
146
- if err != nil {
147
- if start .DryRun {
142
+ if planRequest != nil {
143
+ env , err := planEnv (planRequest )
144
+ if err != nil {
145
+ return err
146
+ }
147
+
148
+ vars , err := planVars (planRequest )
149
+ if err != nil {
150
+ return err
151
+ }
152
+
153
+ resp , err = e .plan (
154
+ ctx , killCtx , env , vars , sink ,
155
+ config .Metadata .WorkspaceTransition == proto .WorkspaceTransition_DESTROY ,
156
+ )
157
+ if err != nil {
148
158
if ctx .Err () != nil {
149
159
return stream .Send (& proto.Provision_Response {
150
160
Type : & proto.Provision_Response_Complete {
@@ -156,6 +166,13 @@ func (s *server) Provision(stream proto.DRPCProvisioner_ProvisionStream) error {
156
166
}
157
167
return xerrors .Errorf ("plan terraform: %w" , err )
158
168
}
169
+ return stream .Send (resp )
170
+ }
171
+ // Must be apply
172
+ resp , err = e .apply (
173
+ ctx , killCtx , applyRequest .Plan , sink ,
174
+ )
175
+ if err != nil {
159
176
errorMessage := err .Error ()
160
177
// Terraform can fail and apply and still need to store it's state.
161
178
// In this case, we return Complete with an explicit error message.
@@ -169,13 +186,12 @@ func (s *server) Provision(stream proto.DRPCProvisioner_ProvisionStream) error {
169
186
},
170
187
})
171
188
}
172
-
173
189
return stream .Send (resp )
174
190
}
175
191
176
- func provisionVars ( start * proto.Provision_Start ) ([]string , error ) {
192
+ func planVars ( plan * proto.Provision_Plan ) ([]string , error ) {
177
193
vars := []string {}
178
- for _ , param := range start .ParameterValues {
194
+ for _ , param := range plan .ParameterValues {
179
195
switch param .DestinationScheme {
180
196
case proto .ParameterDestination_ENVIRONMENT_VARIABLE :
181
197
continue
@@ -188,21 +204,21 @@ func provisionVars(start *proto.Provision_Start) ([]string, error) {
188
204
return vars , nil
189
205
}
190
206
191
- func provisionEnv ( start * proto.Provision_Start ) ([]string , error ) {
207
+ func planEnv ( plan * proto.Provision_Plan ) ([]string , error ) {
192
208
env := safeEnviron ()
193
209
env = append (env ,
194
- "CODER_AGENT_URL=" + start .Metadata .CoderUrl ,
195
- "CODER_WORKSPACE_TRANSITION=" + strings .ToLower (start .Metadata .WorkspaceTransition .String ()),
196
- "CODER_WORKSPACE_NAME=" + start .Metadata .WorkspaceName ,
197
- "CODER_WORKSPACE_OWNER=" + start .Metadata .WorkspaceOwner ,
198
- "CODER_WORKSPACE_OWNER_EMAIL=" + start .Metadata .WorkspaceOwnerEmail ,
199
- "CODER_WORKSPACE_ID=" + start .Metadata .WorkspaceId ,
200
- "CODER_WORKSPACE_OWNER_ID=" + start .Metadata .WorkspaceOwnerId ,
210
+ "CODER_AGENT_URL=" + plan . Config .Metadata .CoderUrl ,
211
+ "CODER_WORKSPACE_TRANSITION=" + strings .ToLower (plan . Config .Metadata .WorkspaceTransition .String ()),
212
+ "CODER_WORKSPACE_NAME=" + plan . Config .Metadata .WorkspaceName ,
213
+ "CODER_WORKSPACE_OWNER=" + plan . Config .Metadata .WorkspaceOwner ,
214
+ "CODER_WORKSPACE_OWNER_EMAIL=" + plan . Config .Metadata .WorkspaceOwnerEmail ,
215
+ "CODER_WORKSPACE_ID=" + plan . Config .Metadata .WorkspaceId ,
216
+ "CODER_WORKSPACE_OWNER_ID=" + plan . Config .Metadata .WorkspaceOwnerId ,
201
217
)
202
218
for key , value := range provisionersdk .AgentScriptEnv () {
203
219
env = append (env , key + "=" + value )
204
220
}
205
- for _ , param := range start .ParameterValues {
221
+ for _ , param := range plan .ParameterValues {
206
222
switch param .DestinationScheme {
207
223
case proto .ParameterDestination_ENVIRONMENT_VARIABLE :
208
224
env = append (env , fmt .Sprintf ("%s=%s" , param .Name , param .Value ))
0 commit comments