(ctx context.Context, templateID uuid.UUID, numPresets, numPresetPrebuilds int)
| 328 | } |
| 329 | |
| 330 | func (r *Runner) createTemplateVersion(ctx context.Context, templateID uuid.UUID, numPresets, numPresetPrebuilds int) (codersdk.TemplateVersion, error) { |
| 331 | tarData, err := TemplateTarData(numPresets, numPresetPrebuilds) |
| 332 | if err != nil { |
| 333 | return codersdk.TemplateVersion{}, xerrors.Errorf("create prebuilds template tar: %w", err) |
| 334 | } |
| 335 | uploadResp, err := r.client.Upload(ctx, codersdk.ContentTypeTar, bytes.NewReader(tarData)) |
| 336 | if err != nil { |
| 337 | return codersdk.TemplateVersion{}, xerrors.Errorf("upload prebuilds template tar: %w", err) |
| 338 | } |
| 339 | |
| 340 | versionReq := codersdk.CreateTemplateVersionRequest{ |
| 341 | TemplateID: templateID, |
| 342 | FileID: uploadResp.ID, |
| 343 | Message: "Template version for scaletest prebuilds", |
| 344 | StorageMethod: codersdk.ProvisionerStorageMethodFile, |
| 345 | Provisioner: codersdk.ProvisionerTypeTerraform, |
| 346 | ProvisionerTags: r.cfg.ProvisionerTags, |
| 347 | } |
| 348 | version, err := r.client.CreateTemplateVersion(ctx, r.cfg.OrganizationID, versionReq) |
| 349 | if err != nil { |
| 350 | return codersdk.TemplateVersion{}, xerrors.Errorf("create template version: %w", err) |
| 351 | } |
| 352 | if version.MatchedProvisioners != nil && version.MatchedProvisioners.Count == 0 { |
| 353 | return codersdk.TemplateVersion{}, xerrors.Errorf("no provisioners matched for template version") |
| 354 | } |
| 355 | |
| 356 | const pollInterval = 2 * time.Second |
| 357 | versionCtx, cancel := context.WithTimeout(ctx, r.cfg.TemplateVersionJobTimeout) |
| 358 | defer cancel() |
| 359 | |
| 360 | tkr := r.cfg.Clock.TickerFunc(versionCtx, pollInterval, func() error { |
| 361 | version, err := r.client.TemplateVersion(versionCtx, version.ID) |
| 362 | if err != nil { |
| 363 | return xerrors.Errorf("get template version: %w", err) |
| 364 | } |
| 365 | switch version.Job.Status { |
| 366 | case codersdk.ProvisionerJobSucceeded: |
| 367 | return errTickerDone |
| 368 | case codersdk.ProvisionerJobPending, codersdk.ProvisionerJobRunning: |
| 369 | return nil |
| 370 | default: |
| 371 | return xerrors.Errorf("template version provisioning failed: status %s", version.Job.Status) |
| 372 | } |
| 373 | }) |
| 374 | err = tkr.Wait() |
| 375 | if !xerrors.Is(err, errTickerDone) { |
| 376 | return codersdk.TemplateVersion{}, xerrors.Errorf("wait for template version provisioning: %w", err) |
| 377 | } |
| 378 | return version, nil |
| 379 | } |
| 380 | |
| 381 | var errTickerDone = xerrors.New("done") |
| 382 |
no test coverage detected