@@ -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
+ }
0 commit comments