Skip to content

Commit 3a3147d

Browse files
committed
unit tests
1 parent a9a05d4 commit 3a3147d

File tree

5 files changed

+162
-4
lines changed

5 files changed

+162
-4
lines changed

coderd/workspacebuilds_test.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,3 +1151,80 @@ func TestMigrateLegacyToRichParameters(t *testing.T) {
11511151
require.Len(t, buildParameters, 1)
11521152
require.Equal(t, "carrot", buildParameters[0].Value)
11531153
}
1154+
1155+
func TestWorkspaceBuildDebugMode(t *testing.T) {
1156+
t.Parallel()
1157+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
1158+
user := coderdtest.CreateFirstUser(t, client)
1159+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
1160+
Parse: echo.ParseComplete,
1161+
ProvisionPlan: echo.ProvisionComplete,
1162+
ProvisionApply: []*proto.Provision_Response{{
1163+
Type: &proto.Provision_Response_Log{
1164+
Log: &proto.Log{
1165+
Level: proto.LogLevel_DEBUG,
1166+
Output: "want-it",
1167+
},
1168+
},
1169+
}, {
1170+
Type: &proto.Provision_Response_Log{
1171+
Log: &proto.Log{
1172+
Level: proto.LogLevel_TRACE,
1173+
Output: "dont-want-it",
1174+
},
1175+
},
1176+
}, {
1177+
Type: &proto.Provision_Response_Log{
1178+
Log: &proto.Log{
1179+
Level: proto.LogLevel_DEBUG,
1180+
Output: "done",
1181+
},
1182+
},
1183+
}, {
1184+
Type: &proto.Provision_Response_Complete{
1185+
Complete: &proto.Provision_Complete{},
1186+
},
1187+
}},
1188+
})
1189+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
1190+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
1191+
1192+
// Create workspace
1193+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
1194+
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
1195+
1196+
// Create workspace build
1197+
// ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1198+
//defer cancel()
1199+
ctx := context.Background()
1200+
1201+
build, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{
1202+
TemplateVersionID: workspace.LatestBuild.TemplateVersionID,
1203+
Transition: codersdk.WorkspaceTransitionStart,
1204+
ProvisionerState: []byte(" "),
1205+
LogLevel: "debug",
1206+
})
1207+
require.Nil(t, err)
1208+
1209+
build = coderdtest.AwaitWorkspaceBuildJob(t, client, build.ID)
1210+
1211+
// Watch for incoming logs
1212+
logs, closer, err := client.WorkspaceBuildLogsAfter(ctx, build.ID, 0)
1213+
require.NoError(t, err)
1214+
defer closer.Close()
1215+
1216+
for {
1217+
log, ok := <-logs
1218+
if !ok {
1219+
break
1220+
}
1221+
1222+
if log.Output == "dont-want-it" {
1223+
require.Failf(t, "unexpected log message", "%s log message shouldn't be logged: %s", log.Level, log.Output)
1224+
}
1225+
1226+
if log.Output == "done" {
1227+
return
1228+
}
1229+
}
1230+
}

provisioner/echo/serve.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,12 @@ func (e *echo) Provision(stream proto.DRPCProvisioner_ProvisionStream) error {
192192
if err != nil {
193193
return xerrors.Errorf("unmarshal: %w", err)
194194
}
195-
err = stream.Send(&response)
195+
r, ok := filterLogResponses(config, &response)
196+
if !ok {
197+
continue
198+
}
199+
200+
err = stream.Send(r)
196201
if err != nil {
197202
return err
198203
}
@@ -282,3 +287,23 @@ func Tar(responses *Responses) ([]byte, error) {
282287
}
283288
return buffer.Bytes(), nil
284289
}
290+
291+
func filterLogResponses(config *proto.Provision_Config, response *proto.Provision_Response) (*proto.Provision_Response, bool) {
292+
responseLog, ok := response.Type.(*proto.Provision_Response_Log)
293+
if !ok {
294+
// Pass all non-log responses
295+
return response, true
296+
}
297+
298+
if config.ProvisionerLogLevel == "" {
299+
// Don't change the default behavior of "echo"
300+
return response, true
301+
}
302+
303+
provisionerLogLevel := proto.LogLevel_value[strings.ToUpper(config.ProvisionerLogLevel)]
304+
if int32(responseLog.Log.Level) < provisionerLogLevel {
305+
// Log level is not enabled
306+
return nil, false
307+
}
308+
return response, true
309+
}

provisioner/echo/serve_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ func TestEcho(t *testing.T) {
7979
responses := []*proto.Provision_Response{{
8080
Type: &proto.Provision_Response_Log{
8181
Log: &proto.Log{
82+
Level: proto.LogLevel_INFO,
8283
Output: "log-output",
8384
},
8485
},
@@ -115,6 +116,59 @@ func TestEcho(t *testing.T) {
115116
require.Equal(t, responses[1].GetComplete().Resources[0].Name,
116117
complete.GetComplete().Resources[0].Name)
117118
})
119+
120+
t.Run("ProvisionWithLogLevel", func(t *testing.T) {
121+
t.Parallel()
122+
123+
responses := []*proto.Provision_Response{{
124+
Type: &proto.Provision_Response_Log{
125+
Log: &proto.Log{
126+
Level: proto.LogLevel_TRACE,
127+
Output: "log-output-trace",
128+
},
129+
},
130+
}, {
131+
Type: &proto.Provision_Response_Log{
132+
Log: &proto.Log{
133+
Level: proto.LogLevel_INFO,
134+
Output: "log-output-info",
135+
},
136+
},
137+
}, {
138+
Type: &proto.Provision_Response_Complete{
139+
Complete: &proto.Provision_Complete{
140+
Resources: []*proto.Resource{{
141+
Name: "resource",
142+
}},
143+
},
144+
},
145+
}}
146+
data, err := echo.Tar(&echo.Responses{
147+
ProvisionApply: responses,
148+
})
149+
require.NoError(t, err)
150+
client, err := api.Provision(ctx)
151+
require.NoError(t, err)
152+
err = client.Send(&proto.Provision_Request{
153+
Type: &proto.Provision_Request_Plan{
154+
Plan: &proto.Provision_Plan{
155+
Config: &proto.Provision_Config{
156+
Directory: unpackTar(t, fs, data),
157+
ProvisionerLogLevel: "debug",
158+
},
159+
},
160+
},
161+
})
162+
require.NoError(t, err)
163+
log, err := client.Recv()
164+
require.NoError(t, err)
165+
// Skip responses[0] as it's trace level
166+
require.Equal(t, responses[1].GetLog().Output, log.GetLog().Output)
167+
complete, err := client.Recv()
168+
require.NoError(t, err)
169+
require.Equal(t, responses[2].GetComplete().Resources[0].Name,
170+
complete.GetComplete().Resources[0].Name)
171+
})
118172
}
119173

120174
func unpackTar(t *testing.T, fs afero.Fs, data []byte) string {

provisioner/terraform/executor.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,11 @@ func readAndLog(sink logSink, r io.Reader, done chan<- any, level proto.LogLevel
473473

474474
logLevel := convertTerraformLogLevel(log.Level, sink)
475475
if logLevel == proto.LogLevel_TRACE {
476-
continue // skip TRACE log entries as they produce a lot of noise
476+
// Skip TRACE log entries as they produce a lot of noise
477+
//
478+
// FIXME consider config.ProvisionerLogLevel to enable custom level logging
479+
// instead of "just-debug-level" mode.
480+
continue
477481
}
478482

479483
// Degrade JSON log entries marked as INFO as these are logs produced in debug mode.

provisioner/terraform/provision.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,6 @@ func provisionEnv(config *proto.Provision_Config, params []*proto.ParameterValue
239239

240240
if logLevel == "debug" {
241241
// TF_LOG=JSON enables all kind of logging: trace-debug-info-warn-error.
242-
// Coder shows info-warn-error by default, so we need to filter "trace" log entries,
243-
// on the upper layer.
244242
// The idea behind using TF_LOG=JSON instead of TF_LOG=debug is ensuring the proper log format.
245243
env = append(env, "TF_LOG=JSON")
246244
}

0 commit comments

Comments
 (0)