(ctx context.Context, project *types.Project, name string, n *types.NetworkConfig)
| 1471 | } |
| 1472 | |
| 1473 | func (s *composeService) removeDivergedNetwork(ctx context.Context, project *types.Project, name string, n *types.NetworkConfig) (Containers, error) { |
| 1474 | // Remove services attached to this network to force recreation |
| 1475 | var services []string |
| 1476 | for _, service := range project.Services.Filter(func(config types.ServiceConfig) bool { |
| 1477 | _, ok := config.Networks[name] |
| 1478 | return ok |
| 1479 | }) { |
| 1480 | services = append(services, service.Name) |
| 1481 | } |
| 1482 | |
| 1483 | // Stop containers so we can remove network |
| 1484 | // They will be restarted (actually: recreated) with the updated network |
| 1485 | err := s.stop(ctx, project.Name, api.StopOptions{ |
| 1486 | Services: services, |
| 1487 | Project: project, |
| 1488 | }, nil) |
| 1489 | if err != nil { |
| 1490 | return nil, err |
| 1491 | } |
| 1492 | |
| 1493 | containers, err := s.getContainers(ctx, project.Name, oneOffExclude, true, services...) |
| 1494 | if err != nil { |
| 1495 | return nil, err |
| 1496 | } |
| 1497 | |
| 1498 | err = s.disconnectNetwork(ctx, n.Name, containers) |
| 1499 | if err != nil { |
| 1500 | return nil, err |
| 1501 | } |
| 1502 | |
| 1503 | _, err = s.apiClient().NetworkRemove(ctx, n.Name, client.NetworkRemoveOptions{}) |
| 1504 | eventName := fmt.Sprintf("Network %s", n.Name) |
| 1505 | s.events.On(removedEvent(eventName)) |
| 1506 | return containers, err |
| 1507 | } |
| 1508 | |
| 1509 | func (s *composeService) disconnectNetwork( |
| 1510 | ctx context.Context, |
no test coverage detected