From 0760bbc4a4bca77f7136e6021f97253c64feec3e Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Mon, 15 Apr 2024 08:34:38 +0200 Subject: [PATCH 1/2] Revert "Stop the resource timer after last expected event" This reverts commit a4ddbcb6b2caf12826926d164d47319ac01fa6d4. Signed-off-by: Nicolas De Loof --- pkg/compose/convergence.go | 21 ++------------------- pkg/compose/start.go | 2 +- pkg/compose/up.go | 1 - 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, 16 insertions(+), 52 deletions(-) diff --git a/pkg/compose/convergence.go b/pkg/compose/convergence.go index 6fb6f3e3c9..3b680fe77c 100644 --- a/pkg/compose/convergence.go +++ b/pkg/compose/convergence.go @@ -757,7 +757,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, wait bool) error { +func (s *composeService) startService(ctx context.Context, project *types.Project, service types.ServiceConfig, containers Containers) error { if service.Deploy != nil && service.Deploy.Replicas != nil && *service.Deploy.Replicas == 0 { return nil } @@ -785,28 +785,11 @@ func (s *composeService) startService(ctx context.Context, project *types.Projec if err != nil { return err } - status := progress.Done - if wait || dependencyWaiting(project, service.Name) { - status = progress.Working - } - w.Event(progress.NewEvent(eventName, status, "Started")) + w.Event(progress.StartedEvent(eventName)) } 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 c87788b94c..dd35a2e94c 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, options.Wait) + return s.startService(ctx, project, service, containers) }) if err != nil { return err diff --git a/pkg/compose/up.go b/pkg/compose/up.go index a657e16806..97c07368b5 100644 --- a/pkg/compose/up.go +++ b/pkg/compose/up.go @@ -43,7 +43,6 @@ func (s *composeService) Up(ctx context.Context, project *types.Project, options 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 32dbac6af1..26aca98d8d 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 CountColor(e.spinner.String()) + return e.spinner.String() } } diff --git a/pkg/progress/noop.go b/pkg/progress/noop.go index 57a9d97701..98852705c9 100644 --- a/pkg/progress/noop.go +++ b/pkg/progress/noop.go @@ -38,6 +38,3 @@ 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 bd66984a4e..4a061e1831 100644 --- a/pkg/progress/plain.go +++ b/pkg/progress/plain.go @@ -64,6 +64,3 @@ 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 b9f2765eba..5c5530d76e 100644 --- a/pkg/progress/quiet.go +++ b/pkg/progress/quiet.go @@ -35,6 +35,3 @@ 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 0675beede6..4544d47c7a 100644 --- a/pkg/progress/tty.go +++ b/pkg/progress/tty.go @@ -33,18 +33,17 @@ 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 - hasFollowupAction bool + 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 } func (w *ttyWriter) Start(ctx context.Context) error { @@ -71,10 +70,6 @@ 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() @@ -87,9 +82,6 @@ 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 fc484b7c03..6ffdf2bec6 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, " \x1b[33m.\x1b[0m id Text Status \x1b[34m0.0s \x1b[0m\n") + assert.Equal(t, out, " . 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 b6d60e3da9..f1dec3c796 100644 --- a/pkg/progress/writer.go +++ b/pkg/progress/writer.go @@ -36,7 +36,6 @@ type Writer interface { Event(Event) Events([]Event) TailMsgf(string, ...interface{}) - HasMore(more bool) } type writerKey struct{} From e583c1f9276308f0b390a1b91e81fe51e10a55b3 Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Mon, 15 Apr 2024 08:54:55 +0200 Subject: [PATCH 2/2] progress for resource can be restarted after more Working event comes Signed-off-by: Nicolas De Loof --- internal/desktop/file_shares.go | 3 --- pkg/compose/create.go | 8 ++------ pkg/compose/scale.go | 2 +- pkg/compose/up.go | 3 +-- pkg/compose/watch.go | 2 +- pkg/progress/event.go | 6 +++++- pkg/progress/spinner.go | 4 ++++ pkg/progress/tty.go | 7 ++----- pkg/progress/tty_test.go | 2 +- 9 files changed, 17 insertions(+), 20 deletions(-) diff --git a/internal/desktop/file_shares.go b/internal/desktop/file_shares.go index cf4af09c31..8c5c6e6033 100644 --- a/internal/desktop/file_shares.go +++ b/internal/desktop/file_shares.go @@ -139,9 +139,6 @@ func NewFileShareManager(cli *Client, projectName string, hostPaths []string) *F // flow can continue. func (m *FileShareManager) EnsureExists(ctx context.Context) (err error) { w := progress.ContextWriter(ctx) - // TODO(milas): this should be a per-node option, not global - w.HasMore(false) - w.Event(progress.NewEvent(fileShareProgressID, progress.Working, "")) defer func() { if err != nil { diff --git a/pkg/compose/create.go b/pkg/compose/create.go index 7dc3b115b8..ad78c329f9 100644 --- a/pkg/compose/create.go +++ b/pkg/compose/create.go @@ -68,11 +68,11 @@ type createConfigs struct { func (s *composeService) Create(ctx context.Context, project *types.Project, createOpts api.CreateOptions) error { return progress.RunWithTitle(ctx, func(ctx context.Context) error { - return s.create(ctx, project, createOpts, false) + return s.create(ctx, project, createOpts) }, s.stdinfo(), "Creating") } -func (s *composeService) create(ctx context.Context, project *types.Project, options api.CreateOptions, willAttach bool) error { +func (s *composeService) create(ctx context.Context, project *types.Project, options api.CreateOptions) error { if len(options.Services) == 0 { options.Services = project.ServiceNames() } @@ -113,10 +113,6 @@ func (s *composeService) create(ctx context.Context, project *types.Project, opt "--remove-orphans flag to clean it up.", orphans.names()) } } - - if willAttach { - progress.ContextWriter(ctx).HasMore(willAttach) - } return newConvergence(options.Services, observedState, s).apply(ctx, project, options) } diff --git a/pkg/compose/scale.go b/pkg/compose/scale.go index b10aea0954..985cc129d1 100644 --- a/pkg/compose/scale.go +++ b/pkg/compose/scale.go @@ -26,7 +26,7 @@ import ( func (s *composeService) Scale(ctx context.Context, project *types.Project, options api.ScaleOptions) error { return progress.Run(ctx, tracing.SpanWrapFunc("project/scale", tracing.ProjectOptions(ctx, project), func(ctx context.Context) error { - err := s.create(ctx, project, api.CreateOptions{Services: options.Services}, true) + err := s.create(ctx, project, api.CreateOptions{Services: options.Services}) if err != nil { return err } diff --git a/pkg/compose/up.go b/pkg/compose/up.go index 97c07368b5..1a3e928957 100644 --- a/pkg/compose/up.go +++ b/pkg/compose/up.go @@ -37,8 +37,7 @@ 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(ctx, project), func(ctx context.Context) error { - w := progress.ContextWriter(ctx) - err := s.create(ctx, project, options.Create, options.Start.Attach != nil) + err := s.create(ctx, project, options.Create) if err != nil { return err } diff --git a/pkg/compose/watch.go b/pkg/compose/watch.go index 1cf61157e8..3654e5e7c8 100644 --- a/pkg/compose/watch.go +++ b/pkg/compose/watch.go @@ -470,7 +470,7 @@ func (s *composeService) handleWatchBatch(ctx context.Context, project *types.Pr Services: []string{serviceName}, Inherit: true, Recreate: api.RecreateForce, - }, true) + }) if err != nil { options.LogTo.Log(api.WatchLogger, fmt.Sprintf("Failed to recreate service after update. Error: %v", err)) return err diff --git a/pkg/progress/event.go b/pkg/progress/event.go index 26aca98d8d..267dbe192b 100644 --- a/pkg/progress/event.go +++ b/pkg/progress/event.go @@ -176,6 +176,10 @@ func (e *Event) stop() { e.spinner.Stop() } +func (e *Event) hasMore() { + e.spinner.Restart() +} + var ( spinnerDone = "✔" spinnerWarning = "!" @@ -191,6 +195,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/spinner.go b/pkg/progress/spinner.go index 3e757acf47..3756e944f9 100644 --- a/pkg/progress/spinner.go +++ b/pkg/progress/spinner.go @@ -64,3 +64,7 @@ func (s *spinner) String() string { func (s *spinner) Stop() { s.stop = true } + +func (s *spinner) Restart() { + s.stop = false +} diff --git a/pkg/progress/tty.go b/pkg/progress/tty.go index 4544d47c7a..87a3b2d6b1 100644 --- a/pkg/progress/tty.go +++ b/pkg/progress/tty.go @@ -84,14 +84,11 @@ func (w *ttyWriter) event(e Event) { last := w.events[e.ID] switch e.Status { case Done, Error, Warning: - if last.endTime.IsZero() { + if last.Status != e.Status { last.stop() } case Working: - if !last.endTime.IsZero() { - // already done, don't overwrite - return - } + last.hasMore() } last.Status = e.Status last.Text = e.Text diff --git a/pkg/progress/tty_test.go b/pkg/progress/tty_test.go index 6ffdf2bec6..fc484b7c03 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)