// updateAllMachines finds all machines and resets the stored state address // in each of them. The address does not include the port. func updateAllMachines(st *state.State, stateAddr string) error { machines, err := st.AllMachines() if err != nil { return err } pendingMachineCount := 0 done := make(chan error) for _, machine := range machines { // A newly resumed state server requires no updating, and more // than one state server is not yet support by this plugin. if machine.IsManager() || machine.Life() == state.Dead { continue } pendingMachineCount++ machine := machine go func() { err := runMachineUpdate(machine, setAgentAddressScript(stateAddr)) if err != nil { logger.Errorf("failed to update machine %s: %v", machine, err) } else { progress("updated machine %s", machine) } done <- err }() } err = nil for ; pendingMachineCount > 0; pendingMachineCount-- { if updateErr := <-done; updateErr != nil && err == nil { err = fmt.Errorf("machine update failed") } } return err }
// fetchMachines returns a map from top level machine id to machines, where machines[0] is the host // machine and machines[1..n] are any containers (including nested ones). // // If machineIds is non-nil, only machines whose IDs are in the set are returned. func fetchMachines(st *state.State, machineIds *set.Strings) (map[string][]*state.Machine, error) { v := make(map[string][]*state.Machine) machines, err := st.AllMachines() if err != nil { return nil, err } // AllMachines gives us machines sorted by id. for _, m := range machines { if machineIds != nil && !machineIds.Contains(m.Id()) { continue } parentId, ok := m.ParentId() if !ok { // Only top level host machines go directly into the machine map. v[m.Id()] = []*state.Machine{m} } else { topParentId := state.TopParentId(m.Id()) machines, ok := v[topParentId] if !ok { panic(fmt.Errorf("unexpected machine id %q", parentId)) } machines = append(machines, m) v[topParentId] = machines } } return v, nil }
func assertMachineCount(c *gc.C, st *state.State, expect int) { ms, err := st.AllMachines() c.Assert(err, gc.IsNil) c.Assert(ms, gc.HasLen, expect, gc.Commentf("%v", ms)) }