Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitc7a5d22

Browse files
committed
feat: add dynamic parameters evaluate api
Used when a websocket is too heavy
1 parent2e7cd0f commitc7a5d22

File tree

2 files changed

+102
-44
lines changed

2 files changed

+102
-44
lines changed

‎coderd/coderd.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1156,7 +1156,10 @@ func New(options *Options) *API {
11561156
r.Use(
11571157
httpmw.RequireExperiment(api.Experiments,codersdk.ExperimentDynamicParameters),
11581158
)
1159-
r.Get("/dynamic-parameters",api.templateVersionDynamicParameters)
1159+
r.Route("/dynamic-parameters/",func(r chi.Router) {
1160+
r.Get("/evaluate",api.templateVersionDynamicParameters)
1161+
r.Get("/",api.templateVersionDynamicParameters)
1162+
})
11601163
})
11611164
})
11621165
r.Route("/users",func(r chi.Router) {

‎coderd/parameters.go

Lines changed: 98 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -29,57 +29,86 @@ import (
2929
"github.com/coder/websocket"
3030
)
3131

32+
// @Summary Evaluate dynamic parameters for template version
33+
// @ID evaluate-dynamic-parameters-by-template-version
34+
// @Security CoderSessionToken
35+
// @Tags Templates
36+
// @Param templateversion path string true "Template version ID" format(uuid)
37+
// @Accept json
38+
// @Produce json
39+
// @Router /templateversions/{templateversion}/dynamic-parameters/evaluate [post]
40+
func (api*API)templateVersionDynamicParametersEvaluate(rw http.ResponseWriter,r*http.Request) {
41+
ctx:=r.Context()
42+
varreq codersdk.DynamicParametersRequest
43+
if!httpapi.Read(ctx,rw,r,&req) {
44+
return
45+
}
46+
47+
api.templateVersionDynamicParameters(false,req)(rw,r)
48+
}
49+
3250
// @Summary Open dynamic parameters WebSocket by template version
3351
// @ID open-dynamic-parameters-websocket-by-template-version
3452
// @Security CoderSessionToken
3553
// @Tags Templates
36-
// @Param user path string true "Template version ID" format(uuid)
3754
// @Param templateversion path string true "Template version ID" format(uuid)
3855
// @Success 101
3956
// @Router /templateversions/{templateversion}/dynamic-parameters [get]
40-
func (api*API)templateVersionDynamicParameters(rw http.ResponseWriter,r*http.Request) {
41-
ctx:=r.Context()
42-
templateVersion:=httpmw.TemplateVersionParam(r)
57+
func (api*API)templateVersionDynamicParametersWebsocket(rw http.ResponseWriter,r*http.Request) {
58+
apikey:=httpmw.APIKey(r)
59+
60+
api.templateVersionDynamicParameters(true, codersdk.DynamicParametersRequest{
61+
ID:-1,
62+
Inputs:map[string]string{},
63+
OwnerID:apikey.UserID,
64+
})(rw,r)
65+
}
4366

44-
// Check that the job has completed successfully
45-
job,err:=api.Database.GetProvisionerJobByID(ctx,templateVersion.JobID)
46-
ifhttpapi.Is404Error(err) {
47-
httpapi.ResourceNotFound(rw)
48-
return
49-
}
50-
iferr!=nil {
51-
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
52-
Message:"Internal error fetching provisioner job.",
53-
Detail:err.Error(),
54-
})
55-
return
56-
}
57-
if!job.CompletedAt.Valid {
58-
httpapi.Write(ctx,rw,http.StatusTooEarly, codersdk.Response{
59-
Message:"Template version job has not finished",
60-
})
61-
return
62-
}
67+
func (api*API)templateVersionDynamicParameters(listenbool,initial codersdk.DynamicParametersRequest)func(rw http.ResponseWriter,r*http.Request) {
68+
returnfunc(rw http.ResponseWriter,r*http.Request) {
69+
ctx:=r.Context()
70+
templateVersion:=httpmw.TemplateVersionParam(r)
6371

64-
tf,err:=api.Database.GetTemplateVersionTerraformValues(ctx,templateVersion.ID)
65-
iferr!=nil&&!xerrors.Is(err,sql.ErrNoRows) {
66-
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
67-
Message:"Failed to retrieve Terraform values for template version",
68-
Detail:err.Error(),
69-
})
70-
return
71-
}
72+
// Check that the job has completed successfully
73+
job,err:=api.Database.GetProvisionerJobByID(ctx,templateVersion.JobID)
74+
ifhttpapi.Is404Error(err) {
75+
httpapi.ResourceNotFound(rw)
76+
return
77+
}
78+
iferr!=nil {
79+
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
80+
Message:"Internal error fetching provisioner job.",
81+
Detail:err.Error(),
82+
})
83+
return
84+
}
85+
if!job.CompletedAt.Valid {
86+
httpapi.Write(ctx,rw,http.StatusTooEarly, codersdk.Response{
87+
Message:"Template version job has not finished",
88+
})
89+
return
90+
}
7291

73-
ifwsbuilder.ProvisionerVersionSupportsDynamicParameters(tf.ProvisionerdVersion) {
74-
api.handleDynamicParameters(rw,r,tf,templateVersion)
75-
}else {
76-
api.handleStaticParameters(rw,r,templateVersion.ID)
92+
tf,err:=api.Database.GetTemplateVersionTerraformValues(ctx,templateVersion.ID)
93+
iferr!=nil&&!xerrors.Is(err,sql.ErrNoRows) {
94+
httpapi.Write(ctx,rw,http.StatusInternalServerError, codersdk.Response{
95+
Message:"Failed to retrieve Terraform values for template version",
96+
Detail:err.Error(),
97+
})
98+
return
99+
}
100+
101+
ifwsbuilder.ProvisionerVersionSupportsDynamicParameters(tf.ProvisionerdVersion) {
102+
api.handleDynamicParameters(listen,rw,r,tf,templateVersion,initial)
103+
}else {
104+
api.handleStaticParameters(listen,rw,r,templateVersion.ID,initial)
105+
}
77106
}
78107
}
79108

80109
typepreviewFunctionfunc(ctx context.Context,ownerID uuid.UUID,valuesmap[string]string) (*preview.Output, hcl.Diagnostics)
81110

82-
func (api*API)handleDynamicParameters(rw http.ResponseWriter,r*http.Request,tf database.TemplateVersionTerraformValue,templateVersion database.TemplateVersion) {
111+
func (api*API)handleDynamicParameters(listenbool,rw http.ResponseWriter,r*http.Request,tf database.TemplateVersionTerraformValue,templateVersion database.TemplateVersion,initial codersdk.DynamicParametersRequest) {
83112
var (
84113
ctx=r.Context()
85114
apikey=httpmw.APIKey(r)
@@ -159,7 +188,7 @@ func (api *API) handleDynamicParameters(rw http.ResponseWriter, r *http.Request,
159188
},
160189
}
161190

162-
api.handleParameterWebsocket(rw,r,apikey.UserID,func(ctx context.Context,ownerID uuid.UUID,valuesmap[string]string) (*preview.Output, hcl.Diagnostics) {
191+
dynamicRender:=func(ctx context.Context,ownerID uuid.UUID,valuesmap[string]string) (*preview.Output, hcl.Diagnostics) {
163192
ifownerID==uuid.Nil {
164193
// Default to the authenticated user
165194
// Nice for testing
@@ -186,10 +215,15 @@ func (api *API) handleDynamicParameters(rw http.ResponseWriter, r *http.Request,
186215
}
187216

188217
returnpreview.Preview(ctx,input,templateFS)
189-
})
218+
}
219+
iflisten {
220+
api.handleParameterWebsocket(rw,r,initial,dynamicRender)
221+
}else {
222+
api.handleParameterEvaluate(rw,r,initial,dynamicRender)
223+
}
190224
}
191225

192-
func (api*API)handleStaticParameters(rw http.ResponseWriter,r*http.Request,version uuid.UUID) {
226+
func (api*API)handleStaticParameters(listenbool,rw http.ResponseWriter,r*http.Request,version uuid.UUID,initial codersdk.DynamicParametersRequest) {
193227
ctx:=r.Context()
194228
dbTemplateVersionParameters,err:=api.Database.GetTemplateVersionParameters(ctx,version)
195229
iferr!=nil {
@@ -275,7 +309,7 @@ func (api *API) handleStaticParameters(rw http.ResponseWriter, r *http.Request,
275309
params=append(params,param)
276310
}
277311

278-
api.handleParameterWebsocket(rw,r,uuid.Nil,func(_ context.Context,_ uuid.UUID,valuesmap[string]string) (*preview.Output, hcl.Diagnostics) {
312+
staticRender:=func(_ context.Context,_ uuid.UUID,valuesmap[string]string) (*preview.Output, hcl.Diagnostics) {
279313
fori:=rangeparams {
280314
param:=&params[i]
281315
paramValue,ok:=values[param.Name]
@@ -297,10 +331,31 @@ func (api *API) handleStaticParameters(rw http.ResponseWriter, r *http.Request,
297331
Detail:"To restore full functionality, please re-import the terraform as a new template version.",
298332
},
299333
}
300-
})
334+
}
335+
iflisten {
336+
api.handleParameterWebsocket(rw,r,initial,staticRender)
337+
}else {
338+
api.handleParameterEvaluate(rw,r,initial,staticRender)
339+
}
340+
}
341+
342+
func (api*API)handleParameterEvaluate(rw http.ResponseWriter,r*http.Request,initial codersdk.DynamicParametersRequest,renderpreviewFunction) {
343+
ctx:=r.Context()
344+
345+
// Send an initial form state, computed without any user input.
346+
result,diagnostics:=render(ctx,initial.OwnerID,initial.Inputs)
347+
response:= codersdk.DynamicParametersResponse{
348+
ID:-1,// Always start with -1.
349+
Diagnostics:db2sdk.HCLDiagnostics(diagnostics),
350+
}
351+
ifresult!=nil {
352+
response.Parameters=db2sdk.List(result.Parameters,db2sdk.PreviewParameter)
353+
}
354+
355+
httpapi.Write(ctx,rw,http.StatusOK,response)
301356
}
302357

303-
func (api*API)handleParameterWebsocket(rw http.ResponseWriter,r*http.Request,ownerID uuid.UUID,renderpreviewFunction) {
358+
func (api*API)handleParameterWebsocket(rw http.ResponseWriter,r*http.Request,initial codersdk.DynamicParametersRequest,renderpreviewFunction) {
304359
ctx,cancel:=context.WithTimeout(r.Context(),30*time.Minute)
305360
defercancel()
306361

@@ -320,7 +375,7 @@ func (api *API) handleParameterWebsocket(rw http.ResponseWriter, r *http.Request
320375
)
321376

322377
// Send an initial form state, computed without any user input.
323-
result,diagnostics:=render(ctx,ownerID,map[string]string{})
378+
result,diagnostics:=render(ctx,initial.OwnerID,initial.Inputs)
324379
response:= codersdk.DynamicParametersResponse{
325380
ID:-1,// Always start with -1.
326381
Diagnostics:db2sdk.HCLDiagnostics(diagnostics),

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp