From 3c4593f2ad2583ab0c8e3af767685a36062aff80 Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Thu, 11 Jan 2024 17:03:40 +0100 Subject: [PATCH] Stop the resource timer after last expected event Signed-off-by: Nicolas De Loof --- pkg/compose/convergence.go | 21 +++++++++++++++++++-- pkg/compose/start.go | 2 +- pkg/compose/up.go | 3 +++ pkg/progress/event.go | 2 +- pkg/progress/noop.go | 3 +++ pkg/progress/plain.go | 3 +++ pkg/progress/quiet.go | 3 +++ pkg/progress/tty.go | 30 +++++++++++++++++++----------- pkg/progress/tty_test.go | 2 +- pkg/progress/writer.go | 1 + 10 files changed, 54 insertions(+), 16 deletions(-) diff --git a/pkg/compose/convergence.go b/pkg/compose/convergence.go index 4ba31ff09ac..1f9dac1c098 100644 --- a/pkg/compose/convergence.go +++ b/pkg/compose/convergence.go @@ -737,7 +737,7 @@ func (s *composeService) isServiceCompleted(ctx context.Context, containers Cont return false, 0, nil } -func (s *composeService) startService(ctx context.Context, project *types.Project, service types.ServiceConfig, containers Containers) error { +func (s *composeService) startService(ctx context.Context, project *types.Project, service types.ServiceConfig, containers Containers, wait bool) error { if service.Deploy != nil && service.Deploy.Replicas != nil && *service.Deploy.Replicas == 0 { return nil } @@ -765,11 +765,28 @@ func (s *composeService) startService(ctx context.Context, project *types.Projec if err != nil { return err } - w.Event(progress.StartedEvent(eventName)) + status := progress.Done + if wait || dependencyWaiting(project, service.Name) { + status = progress.Working + } + w.Event(progress.NewEvent(eventName, status, "Started")) } return nil } +func dependencyWaiting(project *types.Project, name string) bool { + for _, service := range project.Services { + depends, ok := service.DependsOn[name] + if !ok { + continue + } + if depends.Condition == types.ServiceConditionHealthy { + return true + } + } + return false +} + func mergeLabels(ls ...types.Labels) types.Labels { merged := types.Labels{} for _, l := range ls { diff --git a/pkg/compose/start.go b/pkg/compose/start.go index dd35a2e94cc..c87788b94c1 100644 --- a/pkg/compose/start.go +++ b/pkg/compose/start.go @@ -129,7 +129,7 @@ func (s *composeService) start(ctx context.Context, projectName string, options return err } - return s.startService(ctx, project, service, containers) + return s.startService(ctx, project, service, containers, options.Wait) }) if err != nil { return err diff --git a/pkg/compose/up.go b/pkg/compose/up.go index 8236adff0b5..be6bbdb1490 100644 --- a/pkg/compose/up.go +++ b/pkg/compose/up.go @@ -33,11 +33,14 @@ import ( func (s *composeService) Up(ctx context.Context, project *types.Project, options api.UpOptions) error { //nolint:gocyclo err := progress.Run(ctx, tracing.SpanWrapFunc("project/up", tracing.ProjectOptions(project), func(ctx context.Context) error { + w := progress.ContextWriter(ctx) + w.HasMore(options.Start.Attach == nil) err := s.create(ctx, project, options.Create) if err != nil { return err } if options.Start.Attach == nil { + w.HasMore(false) return s.start(ctx, project.Name, options.Start, nil) } return nil diff --git a/pkg/progress/event.go b/pkg/progress/event.go index 26aca98d8d5..32dbac6af1f 100644 --- a/pkg/progress/event.go +++ b/pkg/progress/event.go @@ -191,6 +191,6 @@ func (e *Event) Spinner() any { case Error: return ErrorColor(spinnerError) default: - return e.spinner.String() + return CountColor(e.spinner.String()) } } diff --git a/pkg/progress/noop.go b/pkg/progress/noop.go index 98852705c9a..57a9d97701e 100644 --- a/pkg/progress/noop.go +++ b/pkg/progress/noop.go @@ -38,3 +38,6 @@ func (p *noopWriter) TailMsgf(_ string, _ ...interface{}) { func (p *noopWriter) Stop() { } + +func (p *noopWriter) HasMore(bool) { +} diff --git a/pkg/progress/plain.go b/pkg/progress/plain.go index 4a061e18315..bd66984a4e2 100644 --- a/pkg/progress/plain.go +++ b/pkg/progress/plain.go @@ -64,3 +64,6 @@ func (p *plainWriter) TailMsgf(msg string, args ...interface{}) { func (p *plainWriter) Stop() { p.done <- true } + +func (p *plainWriter) HasMore(bool) { +} diff --git a/pkg/progress/quiet.go b/pkg/progress/quiet.go index 5c5530d76e0..b9f2765eba1 100644 --- a/pkg/progress/quiet.go +++ b/pkg/progress/quiet.go @@ -35,3 +35,6 @@ func (q quiet) Events(_ []Event) { func (q quiet) TailMsgf(_ string, _ ...interface{}) { } + +func (q quiet) HasMore(bool) { +} diff --git a/pkg/progress/tty.go b/pkg/progress/tty.go index c6b80681905..20322636ddf 100644 --- a/pkg/progress/tty.go +++ b/pkg/progress/tty.go @@ -33,17 +33,18 @@ import ( ) type ttyWriter struct { - out io.Writer - events map[string]Event - eventIDs []string - repeated bool - numLines int - done chan bool - mtx *sync.Mutex - tailEvents []string - dryRun bool - skipChildEvents bool - progressTitle string + out io.Writer + events map[string]Event + eventIDs []string + repeated bool + numLines int + done chan bool + mtx *sync.Mutex + tailEvents []string + dryRun bool + skipChildEvents bool + progressTitle string + hasFollowupAction bool } func (w *ttyWriter) Start(ctx context.Context) error { @@ -70,6 +71,10 @@ func (w *ttyWriter) Stop() { w.done <- true } +func (w *ttyWriter) HasMore(b bool) { + w.hasFollowupAction = b +} + func (w *ttyWriter) Event(e Event) { w.mtx.Lock() defer w.mtx.Unlock() @@ -82,6 +87,9 @@ func (w *ttyWriter) event(e Event) { } if _, ok := w.events[e.ID]; ok { last := w.events[e.ID] + if e.Status == Done && w.hasFollowupAction { + e.Status = Working + } switch e.Status { case Done, Error, Warning: if last.endTime.IsZero() { diff --git a/pkg/progress/tty_test.go b/pkg/progress/tty_test.go index 6ffdf2bec64..fc484b7c035 100644 --- a/pkg/progress/tty_test.go +++ b/pkg/progress/tty_test.go @@ -42,7 +42,7 @@ func TestLineText(t *testing.T) { lineWidth := len(fmt.Sprintf("%s %s", ev.ID, ev.Text)) out := tty().lineText(ev, "", 50, lineWidth, false) - assert.Equal(t, out, " . id Text Status \x1b[34m0.0s \x1b[0m\n") + assert.Equal(t, out, " \x1b[33m.\x1b[0m id Text Status \x1b[34m0.0s \x1b[0m\n") ev.Status = Done out = tty().lineText(ev, "", 50, lineWidth, false) diff --git a/pkg/progress/writer.go b/pkg/progress/writer.go index f1dec3c7966..b6d60e3da99 100644 --- a/pkg/progress/writer.go +++ b/pkg/progress/writer.go @@ -36,6 +36,7 @@ type Writer interface { Event(Event) Events([]Event) TailMsgf(string, ...interface{}) + HasMore(more bool) } type writerKey struct{}