@@ -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 ("Provisioner 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
990994type 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
10471052func 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