@@ -495,9 +495,9 @@ func (r *TemplateResource) Create(ctx context.Context, req resource.CreateReques
495495if idx > 0 {
496496newVersionRequest .TemplateID = & templateResp .ID
497497}
498- versionResp ,err := newVersion (ctx ,client ,newVersionRequest )
498+ versionResp ,err , logs := newVersion (ctx ,client ,newVersionRequest )
499499if err != nil {
500- resp .Diagnostics .AddError ("Client Error" ,err . Error ( ))
500+ resp .Diagnostics .AddError ("Provisioner Error" ,formatLogs ( err , logs ))
501501return
502502}
503503if idx == 0 {
@@ -701,13 +701,13 @@ func (r *TemplateResource) Update(ctx context.Context, req resource.UpdateReques
701701for idx := range newState .Versions {
702702if newState .Versions [idx ].ID .IsUnknown () {
703703tflog .Info (ctx ,"discovered a new or modified template version" )
704- uploadResp ,err := newVersion (ctx ,client ,newVersionRequest {
704+ uploadResp ,err , logs := newVersion (ctx ,client ,newVersionRequest {
705705Version :& newState .Versions [idx ],
706706OrganizationID :orgID ,
707707TemplateID :& templateID ,
708708})
709709if err != nil {
710- resp .Diagnostics .AddError ("Client Error" ,err . Error ( ))
710+ resp .Diagnostics .AddError ("Provisioner Error" ,formatLogs ( err , logs ))
711711return
712712}
713713versionResp ,err := client .TemplateVersion (ctx ,uploadResp .ID )
@@ -950,13 +950,14 @@ func uploadDirectory(ctx context.Context, client *codersdk.Client, logger slog.L
950950return & 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 ) {
954954const maxRetries = 3
955+ var jobLogs []codersdk.ProvisionerJobLog
955956for retries := 0 ;retries < maxRetries ;retries ++ {
956957logs ,closer ,err := client .TemplateVersionLogsAfter (ctx ,version .ID ,0 )
957958defer closer .Close ()
958959if err != nil {
959- return fmt .Errorf ("begin streaming logs: %w" ,err )
960+ return jobLogs , fmt .Errorf ("begin streaming logs: %w" ,err )
960961}
961962for {
962963logs ,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}
974978latestResp ,err := client .TemplateVersion (ctx ,version .ID )
975979if err != nil {
976- return err
980+ return jobLogs , err
977981}
978982if latestResp .Job .Status .Active () {
979983tflog .Warn (ctx ,fmt .Sprintf ("provisioner job still active, continuing to wait...: %s" ,latestResp .Job .Status ))
980984continue
981985}
982986if 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 {
993997TemplateID * 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
9971002directory := req .Version .Directory .ValueString ()
9981003tflog .Info (ctx ,"uploading directory" )
9991004uploadResp ,err := uploadDirectory (ctx ,client ,slog .Make (newTFLogSink (ctx )),directory )
10001005if 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}
10031008tflog .Info (ctx ,"successfully uploaded directory" )
10041009tflog .Info (ctx ,"discovering and parsing vars files" )
10051010varFiles ,err := codersdk .DiscoverVarsFiles (directory )
10061011if 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}
10091014vars ,err := codersdk .ParseUserVariableValues (varFiles ,"" , []string {})
10101015if 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}
10131018tflog .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
10331038tflog .Info (ctx ,"creating template version" )
10341039versionResp ,err := client .CreateTemplateVersion (ctx ,req .OrganizationID ,tmplVerReq )
10351040if 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}
10381043tflog .Info (ctx ,"waiting for template version import job." )
1039- err = waitForJob (ctx ,client ,& versionResp )
1044+ logs , err = waitForJob (ctx ,client ,& versionResp )
10401045if 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}
10431048tflog .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 (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+ }