visitInDependencyOrder processes services from leaves to roots so that dependencies are reconciled before the services that depend on them.
(g *Graph)
| 379 | // visitInDependencyOrder processes services from leaves to roots so that |
| 380 | // dependencies are reconciled before the services that depend on them. |
| 381 | func (r *reconciler) visitInDependencyOrder(g *Graph) error { |
| 382 | visited := map[string]bool{} |
| 383 | // Sort vertex keys for deterministic plan output in tests |
| 384 | keys := sortedKeys(g.Vertices) |
| 385 | for { |
| 386 | // Find a vertex whose all children are visited |
| 387 | var next *Vertex |
| 388 | for _, k := range keys { |
| 389 | v := g.Vertices[k] |
| 390 | if visited[v.Key] { |
| 391 | continue |
| 392 | } |
| 393 | allChildrenVisited := true |
| 394 | for _, child := range v.Children { |
| 395 | if !visited[child.Key] { |
| 396 | allChildrenVisited = false |
| 397 | break |
| 398 | } |
| 399 | } |
| 400 | if allChildrenVisited { |
| 401 | next = v |
| 402 | break |
| 403 | } |
| 404 | } |
| 405 | if next == nil { |
| 406 | break // all visited |
| 407 | } |
| 408 | visited[next.Key] = true |
| 409 | |
| 410 | service, err := r.project.GetService(next.Service) |
| 411 | if err != nil { |
| 412 | return err |
| 413 | } |
| 414 | if err := r.reconcileService(service); err != nil { |
| 415 | return err |
| 416 | } |
| 417 | } |
| 418 | return nil |
| 419 | } |
| 420 | |
| 421 | // reconcileService handles a single service: scale down, recreate diverged, |
| 422 | // start stopped, scale up. |
no test coverage detected