소스 검색

Stop the resource timer after last expected event

Signed-off-by: Nicolas De Loof <[email protected]>
Nicolas De Loof 1 년 전
부모
커밋
3c4593f2ad
10개의 변경된 파일54개의 추가작업 그리고 16개의 파일을 삭제
  1. 19 2
      pkg/compose/convergence.go
  2. 1 1
      pkg/compose/start.go
  3. 3 0
      pkg/compose/up.go
  4. 1 1
      pkg/progress/event.go
  5. 3 0
      pkg/progress/noop.go
  6. 3 0
      pkg/progress/plain.go
  7. 3 0
      pkg/progress/quiet.go
  8. 19 11
      pkg/progress/tty.go
  9. 1 1
      pkg/progress/tty_test.go
  10. 1 0
      pkg/progress/writer.go

+ 19 - 2
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 {

+ 1 - 1
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

+ 3 - 0
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

+ 1 - 1
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())
 	}
 }

+ 3 - 0
pkg/progress/noop.go

@@ -38,3 +38,6 @@ func (p *noopWriter) TailMsgf(_ string, _ ...interface{}) {
 
 func (p *noopWriter) Stop() {
 }
+
+func (p *noopWriter) HasMore(bool) {
+}

+ 3 - 0
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) {
+}

+ 3 - 0
pkg/progress/quiet.go

@@ -35,3 +35,6 @@ func (q quiet) Events(_ []Event) {
 
 func (q quiet) TailMsgf(_ string, _ ...interface{}) {
 }
+
+func (q quiet) HasMore(bool) {
+}

+ 19 - 11
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() {

+ 1 - 1
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)

+ 1 - 0
pkg/progress/writer.go

@@ -36,6 +36,7 @@ type Writer interface {
 	Event(Event)
 	Events([]Event)
 	TailMsgf(string, ...interface{})
+	HasMore(more bool)
 }
 
 type writerKey struct{}