Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 70d992e

Browse files
committed
chore: dump provisioner logs on error
1 parent 4c8cf7d commit 70d992e

File tree

2 files changed

+36
-19
lines changed

2 files changed

+36
-19
lines changed

internal/provider/template_data_source_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func TestAccTemplateDataSource(t *testing.T) {
2828
require.NoError(t, err)
2929
orgID := firstUser.OrganizationIDs[0]
3030

31-
version, err := newVersion(ctx, client, newVersionRequest{
31+
version, err, _ := newVersion(ctx, client, newVersionRequest{
3232
OrganizationID: orgID,
3333
Version: &TemplateVersion{
3434
Name: types.StringValue("main"),

internal/provider/template_resource.go

+35-18
Original file line numberDiff line numberDiff line change
@@ -495,9 +495,9 @@ func (r *TemplateResource) Create(ctx context.Context, req resource.CreateReques
495495
if idx > 0 {
496496
newVersionRequest.TemplateID = &templateResp.ID
497497
}
498-
versionResp, err := newVersion(ctx, client, newVersionRequest)
498+
versionResp, err, logs := newVersion(ctx, client, newVersionRequest)
499499
if err != nil {
500-
resp.Diagnostics.AddError("Client Error", err.Error())
500+
resp.Diagnostics.AddError("Provisioner Error", formatLogs(logs))
501501
return
502502
}
503503
if idx == 0 {
@@ -701,13 +701,13 @@ func (r *TemplateResource) Update(ctx context.Context, req resource.UpdateReques
701701
for idx := range newState.Versions {
702702
if newState.Versions[idx].ID.IsUnknown() {
703703
tflog.Info(ctx, "discovered a new or modified template version")
704-
uploadResp, err := newVersion(ctx, client, newVersionRequest{
704+
uploadResp, err, logs := newVersion(ctx, client, newVersionRequest{
705705
Version: &newState.Versions[idx],
706706
OrganizationID: orgID,
707707
TemplateID: &templateID,
708708
})
709709
if err != nil {
710-
resp.Diagnostics.AddError("Client Error", err.Error())
710+
resp.Diagnostics.AddError("Client Error", formatLogs(logs))
711711
return
712712
}
713713
versionResp, err := client.TemplateVersion(ctx, uploadResp.ID)
@@ -950,13 +950,14 @@ func uploadDirectory(ctx context.Context, client *codersdk.Client, logger slog.L
950950
return &resp, nil
951951
}
952952

953-
func waitForJob(ctx context.Context, client *codersdk.Client, version *codersdk.TemplateVersion) error {
953+
func waitForJob(ctx context.Context, client *codersdk.Client, version *codersdk.TemplateVersion) ([]codersdk.ProvisionerJobLog, error) {
954954
const maxRetries = 3
955+
var jobLogs []codersdk.ProvisionerJobLog
955956
for retries := 0; retries < maxRetries; retries++ {
956957
logs, closer, err := client.TemplateVersionLogsAfter(ctx, version.ID, 0)
957958
defer closer.Close()
958959
if err != nil {
959-
return fmt.Errorf("begin streaming logs: %w", err)
960+
return jobLogs, fmt.Errorf("begin streaming logs: %w", err)
960961
}
961962
for {
962963
logs, ok := <-logs
@@ -970,21 +971,24 @@ func waitForJob(ctx context.Context, client *codersdk.Client, version *codersdk.
970971
"level": logs.Level,
971972
"created_at": logs.CreatedAt,
972973
})
974+
if logs.Output != "" {
975+
jobLogs = append(jobLogs, logs)
976+
}
973977
}
974978
latestResp, err := client.TemplateVersion(ctx, version.ID)
975979
if err != nil {
976-
return err
980+
return jobLogs, err
977981
}
978982
if latestResp.Job.Status.Active() {
979983
tflog.Warn(ctx, fmt.Sprintf("provisioner job still active, continuing to wait...: %s", latestResp.Job.Status))
980984
continue
981985
}
982986
if latestResp.Job.Status != codersdk.ProvisionerJobSucceeded {
983-
return fmt.Errorf("provisioner job did not succeed: %s (%s)", latestResp.Job.Status, latestResp.Job.Error)
987+
return jobLogs, fmt.Errorf("provisioner job did not succeed: %s (%s)", latestResp.Job.Status, latestResp.Job.Error)
984988
}
985-
return nil
989+
return jobLogs, nil
986990
}
987-
return fmt.Errorf("provisioner job did not complete after %d retries", maxRetries)
991+
return jobLogs, fmt.Errorf("provisioner job did not complete after %d retries", maxRetries)
988992
}
989993

990994
type newVersionRequest struct {
@@ -993,22 +997,23 @@ type newVersionRequest struct {
993997
TemplateID *uuid.UUID
994998
}
995999

996-
func newVersion(ctx context.Context, client *codersdk.Client, req newVersionRequest) (*codersdk.TemplateVersion, error) {
1000+
func newVersion(ctx context.Context, client *codersdk.Client, req newVersionRequest) (*codersdk.TemplateVersion, error, []codersdk.ProvisionerJobLog) {
1001+
var logs []codersdk.ProvisionerJobLog
9971002
directory := req.Version.Directory.ValueString()
9981003
tflog.Info(ctx, "uploading directory")
9991004
uploadResp, err := uploadDirectory(ctx, client, slog.Make(newTFLogSink(ctx)), directory)
10001005
if err != nil {
1001-
return nil, fmt.Errorf("failed to upload directory: %s", err)
1006+
return nil, fmt.Errorf("failed to upload directory: %s", err), logs
10021007
}
10031008
tflog.Info(ctx, "successfully uploaded directory")
10041009
tflog.Info(ctx, "discovering and parsing vars files")
10051010
varFiles, err := codersdk.DiscoverVarsFiles(directory)
10061011
if err != nil {
1007-
return nil, fmt.Errorf("failed to discover vars files: %s", err)
1012+
return nil, fmt.Errorf("failed to discover vars files: %s", err), logs
10081013
}
10091014
vars, err := codersdk.ParseUserVariableValues(varFiles, "", []string{})
10101015
if err != nil {
1011-
return nil, fmt.Errorf("failed to parse user variable values: %s", err)
1016+
return nil, fmt.Errorf("failed to parse user variable values: %s", err), logs
10121017
}
10131018
tflog.Info(ctx, "discovered and parsed vars files", map[string]any{
10141019
"vars": vars,
@@ -1033,15 +1038,15 @@ func newVersion(ctx context.Context, client *codersdk.Client, req newVersionRequ
10331038
tflog.Info(ctx, "creating template version")
10341039
versionResp, err := client.CreateTemplateVersion(ctx, req.OrganizationID, tmplVerReq)
10351040
if err != nil {
1036-
return nil, fmt.Errorf("failed to create template version: %s", err)
1041+
return nil, fmt.Errorf("failed to create template version: %s", err), logs
10371042
}
10381043
tflog.Info(ctx, "waiting for template version import job.")
1039-
err = waitForJob(ctx, client, &versionResp)
1044+
logs, err = waitForJob(ctx, client, &versionResp)
10401045
if err != nil {
1041-
return nil, fmt.Errorf("failed to wait for job: %s", err)
1046+
return nil, fmt.Errorf("failed to wait for job: %s", err), logs
10421047
}
10431048
tflog.Info(ctx, "successfully created template version")
1044-
return &versionResp, nil
1049+
return &versionResp, nil, logs
10451050
}
10461051

10471052
func markActive(ctx context.Context, client *codersdk.Client, templateID uuid.UUID, versionID uuid.UUID) error {
@@ -1309,3 +1314,15 @@ func (planVersions Versions) reconcileVersionIDs(lv LastVersionsByHash, configVe
13091314
}
13101315
}
13111316
}
1317+
1318+
func formatLogs(logs []codersdk.ProvisionerJobLog) string {
1319+
var b strings.Builder
1320+
for _, log := range logs {
1321+
if !log.CreatedAt.IsZero() {
1322+
b.WriteString(log.CreatedAt.Local().Format("2006-01-02 15:04:05.000Z07:00") + " ")
1323+
}
1324+
b.WriteString(log.Output)
1325+
b.WriteString("\n")
1326+
}
1327+
return b.String()
1328+
}

0 commit comments

Comments
 (0)