@@ -495,9 +495,9 @@ func (r *TemplateResource) Create(ctx context.Context, req resource.CreateReques
495
495
if idx > 0 {
496
496
newVersionRequest .TemplateID = & templateResp .ID
497
497
}
498
- versionResp ,err := newVersion (ctx ,client ,newVersionRequest )
498
+ versionResp ,err , logs := newVersion (ctx ,client ,newVersionRequest )
499
499
if err != nil {
500
- resp .Diagnostics .AddError ("Client Error" ,err . Error ( ))
500
+ resp .Diagnostics .AddError ("Provisioner Error" ,formatLogs ( err , logs ))
501
501
return
502
502
}
503
503
if idx == 0 {
@@ -701,13 +701,13 @@ func (r *TemplateResource) Update(ctx context.Context, req resource.UpdateReques
701
701
for idx := range newState .Versions {
702
702
if newState .Versions [idx ].ID .IsUnknown () {
703
703
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 {
705
705
Version :& newState .Versions [idx ],
706
706
OrganizationID :orgID ,
707
707
TemplateID :& templateID ,
708
708
})
709
709
if err != nil {
710
- resp .Diagnostics .AddError ("Client Error" ,err . Error ( ))
710
+ resp .Diagnostics .AddError ("Provisioner Error" ,formatLogs ( err , logs ))
711
711
return
712
712
}
713
713
versionResp ,err := client .TemplateVersion (ctx ,uploadResp .ID )
@@ -950,13 +950,14 @@ func uploadDirectory(ctx context.Context, client *codersdk.Client, logger slog.L
950
950
return & resp ,nil
951
951
}
952
952
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 ) {
954
954
const maxRetries = 3
955
+ var jobLogs []codersdk.ProvisionerJobLog
955
956
for retries := 0 ;retries < maxRetries ;retries ++ {
956
957
logs ,closer ,err := client .TemplateVersionLogsAfter (ctx ,version .ID ,0 )
957
958
defer closer .Close ()
958
959
if err != nil {
959
- return fmt .Errorf ("begin streaming logs: %w" ,err )
960
+ return jobLogs , fmt .Errorf ("begin streaming logs: %w" ,err )
960
961
}
961
962
for {
962
963
logs ,ok := <- logs
@@ -970,21 +971,24 @@ func waitForJob(ctx context.Context, client *codersdk.Client, version *codersdk.
970
971
"level" :logs .Level ,
971
972
"created_at" :logs .CreatedAt ,
972
973
})
974
+ if logs .Output != "" {
975
+ jobLogs = append (jobLogs ,logs )
976
+ }
973
977
}
974
978
latestResp ,err := client .TemplateVersion (ctx ,version .ID )
975
979
if err != nil {
976
- return err
980
+ return jobLogs , err
977
981
}
978
982
if latestResp .Job .Status .Active () {
979
983
tflog .Warn (ctx ,fmt .Sprintf ("provisioner job still active, continuing to wait...: %s" ,latestResp .Job .Status ))
980
984
continue
981
985
}
982
986
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 )
984
988
}
985
- return nil
989
+ return jobLogs , nil
986
990
}
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 )
988
992
}
989
993
990
994
type newVersionRequest struct {
@@ -993,22 +997,23 @@ type newVersionRequest struct {
993
997
TemplateID * uuid.UUID
994
998
}
995
999
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
997
1002
directory := req .Version .Directory .ValueString ()
998
1003
tflog .Info (ctx ,"uploading directory" )
999
1004
uploadResp ,err := uploadDirectory (ctx ,client ,slog .Make (newTFLogSink (ctx )),directory )
1000
1005
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
1002
1007
}
1003
1008
tflog .Info (ctx ,"successfully uploaded directory" )
1004
1009
tflog .Info (ctx ,"discovering and parsing vars files" )
1005
1010
varFiles ,err := codersdk .DiscoverVarsFiles (directory )
1006
1011
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
1008
1013
}
1009
1014
vars ,err := codersdk .ParseUserVariableValues (varFiles ,"" , []string {})
1010
1015
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
1012
1017
}
1013
1018
tflog .Info (ctx ,"discovered and parsed vars files" ,map [string ]any {
1014
1019
"vars" :vars ,
@@ -1033,15 +1038,15 @@ func newVersion(ctx context.Context, client *codersdk.Client, req newVersionRequ
1033
1038
tflog .Info (ctx ,"creating template version" )
1034
1039
versionResp ,err := client .CreateTemplateVersion (ctx ,req .OrganizationID ,tmplVerReq )
1035
1040
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
1037
1042
}
1038
1043
tflog .Info (ctx ,"waiting for template version import job." )
1039
- err = waitForJob (ctx ,client ,& versionResp )
1044
+ logs , err = waitForJob (ctx ,client ,& versionResp )
1040
1045
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
1042
1047
}
1043
1048
tflog .Info (ctx ,"successfully created template version" )
1044
- return & versionResp ,nil
1049
+ return & versionResp ,nil , logs
1045
1050
}
1046
1051
1047
1052
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
1309
1314
}
1310
1315
}
1311
1316
}
1317
+
1318
+ func formatLogs (err error ,logs []codersdk.ProvisionerJobLog )string {
1319
+ var b strings.Builder
1320
+ b .WriteString (err .Error ()+ "\n " )
1321
+ for _ ,log := range logs {
1322
+ if ! log .CreatedAt .IsZero () {
1323
+ b .WriteString (log .CreatedAt .Local ().Format ("2006-01-02 15:04:05.000Z07:00" )+ " " )
1324
+ }
1325
+ b .WriteString (log .Output + "\n " )
1326
+ }
1327
+ return b .String ()
1328
+ }