Run executes the dynamic parameters test, which: 1. connects to the dynamic parameters stream 2. waits for the initial response 3. sends a change request 4. waits for the change response 5. closes the stream
(ctx context.Context, _ string, logs io.Writer)
| 36 | // 4. waits for the change response |
| 37 | // 5. closes the stream |
| 38 | func (r *Runner) Run(ctx context.Context, _ string, logs io.Writer) (retErr error) { |
| 39 | startTime := time.Now() |
| 40 | stream, err := r.client.TemplateVersionDynamicParameters(ctx, codersdk.Me, r.cfg.TemplateVersion) |
| 41 | if err != nil { |
| 42 | return xerrors.Errorf("connect to dynamic parameters stream: %w", err) |
| 43 | } |
| 44 | defer stream.Close(websocket.StatusNormalClosure) |
| 45 | respCh := stream.Chan() |
| 46 | |
| 47 | var initTime time.Time |
| 48 | select { |
| 49 | case <-ctx.Done(): |
| 50 | return ctx.Err() |
| 51 | case resp, ok := <-respCh: |
| 52 | if !ok { |
| 53 | return xerrors.Errorf("dynamic parameters stream closed before initial response") |
| 54 | } |
| 55 | initTime = time.Now() |
| 56 | r.cfg.Metrics.LatencyInitialResponseSeconds. |
| 57 | WithLabelValues(r.cfg.MetricLabelValues...). |
| 58 | Observe(initTime.Sub(startTime).Seconds()) |
| 59 | _, _ = fmt.Fprintf(logs, "initial response: %+v\n", resp) |
| 60 | if !slices.ContainsFunc(resp.Parameters, func(p codersdk.PreviewParameter) bool { |
| 61 | return p.Name == "zero" |
| 62 | }) { |
| 63 | return xerrors.Errorf("missing expected parameter: 'zero'") |
| 64 | } |
| 65 | if err := checkNoDiagnostics(resp); err != nil { |
| 66 | return xerrors.Errorf("unexpected initial response diagnostics: %w", err) |
| 67 | } |
| 68 | } |
| 69 | |
| 70 | err = stream.Send(codersdk.DynamicParametersRequest{ |
| 71 | ID: 1, |
| 72 | Inputs: map[string]string{ |
| 73 | "zero": "B", |
| 74 | }, |
| 75 | }) |
| 76 | if err != nil { |
| 77 | return xerrors.Errorf("send change request: %w", err) |
| 78 | } |
| 79 | select { |
| 80 | case <-ctx.Done(): |
| 81 | return ctx.Err() |
| 82 | case resp, ok := <-respCh: |
| 83 | if !ok { |
| 84 | return xerrors.Errorf("dynamic parameters stream closed before change response") |
| 85 | } |
| 86 | _, _ = fmt.Fprintf(logs, "change response: %+v\n", resp) |
| 87 | r.cfg.Metrics.LatencyChangeResponseSeconds. |
| 88 | WithLabelValues(r.cfg.MetricLabelValues...). |
| 89 | Observe(time.Since(initTime).Seconds()) |
| 90 | if resp.ID != 1 { |
| 91 | return xerrors.Errorf("unexpected response ID: %d", resp.ID) |
| 92 | } |
| 93 | if err := checkNoDiagnostics(resp); err != nil { |
| 94 | return xerrors.Errorf("unexpected change response diagnostics: %w", err) |
| 95 | } |