func (fum *FakeUnitManager) GetUnitStates(filter pkg.Set) (map[string]*UnitState, error) { fum.RLock() defer fum.RUnlock() states := make(map[string]*UnitState) for _, name := range filter.Values() { if _, ok := fum.u[name]; ok { states[name] = &UnitState{"loaded", "active", "running", "", "", name} } } return states, nil }
func (m *systemdUnitManager) GetUnitStates(filter pkg.Set) (map[string]*unit.UnitState, error) { // Unfortunately we need to lock for the entire operation to ensure we // have a consistent view of the hashes. Otherwise, Load/Unload // operations could mutate the hashes before we've retrieved the state // for every unit in the filter, since they won't necessarily all be // present in the initial ListUnits() call. m.mutex.Lock() defer m.mutex.Unlock() dbusStatuses, err := m.systemd.ListUnits() if err != nil { return nil, err } states := make(map[string]*unit.UnitState) for _, dus := range dbusStatuses { if !filter.Contains(dus.Name) { continue } us := &unit.UnitState{ LoadState: dus.LoadState, ActiveState: dus.ActiveState, SubState: dus.SubState, } if h, ok := m.hashes[dus.Name]; ok { us.UnitHash = h.String() } states[dus.Name] = us } // grab data on subscribed units that didn't show up in ListUnits, most // likely due to being inactive for _, name := range filter.Values() { if _, ok := states[name]; ok { continue } us, err := m.getUnitState(name) if err != nil { return nil, err } if h, ok := m.hashes[name]; ok { us.UnitHash = h.String() } states[name] = us } return states, nil }
func (ar *AgentReconciler) calculateTasksForOffer(dState *agentState, ms *machine.MachineState, j *job.Job, bids pkg.Set, taskchan chan *task) { if bids.Contains(ms.ID) { log.V(1).Infof("Bid already submitted for unresolved JobOffer(%s)", j.Name) return } if able, reason := ar.ableToRun(dState, ms, j); !able { log.V(1).Infof("Not bidding on Job(%s): %s", j.Name, reason) return } taskchan <- &task{ Type: taskTypeSubmitBid, Job: j, Reason: taskReasonAbleToResolveOffer, } }
// Generate returns and fills a channel with *UnitStateHeartbeat objects. Objects will // only be returned for units to which this generator is currently subscribed. func (g *UnitStateGenerator) Generate() (<-chan *UnitStateHeartbeat, error) { var lastSubscribed pkg.Set if g.lastSubscribed != nil { lastSubscribed = g.lastSubscribed.Copy() } subscribed := g.subscribed.Copy() g.lastSubscribed = subscribed reportable, err := g.mgr.GetUnitStates(subscribed) if err != nil { return nil, err } beatchan := make(chan *UnitStateHeartbeat) go func() { for name, us := range reportable { us := us beatchan <- &UnitStateHeartbeat{ Name: name, State: us, } } if lastSubscribed != nil { // For all units that were part of the subscription list // last time Generate ran, but are now not part of that // list, send nil-State heartbeats to signal removal for _, name := range lastSubscribed.Sub(subscribed).Values() { beatchan <- &UnitStateHeartbeat{ Name: name, } } } close(beatchan) }() return beatchan, nil }
func (m *systemdUnitManager) GetUnitStates(filter pkg.Set) (map[string]*unit.UnitState, error) { // Unfortunately we need to lock for the entire operation to ensure we // have a consistent view of the hashes. Otherwise, Load/Unload // operations could mutate the hashes before we've retrieved the state // for every unit in the filter, since they won't necessarily all be // present in the initial ListUnits() call. fallback := false m.mutex.Lock() defer m.mutex.Unlock() dbusStatuses, err := m.systemd.ListUnitsByNames(filter.Values()) if err != nil { fallback = true log.Debugf("ListUnitsByNames is not implemented in your systemd version (requires at least systemd 230), fallback to ListUnits: %v", err) dbusStatuses, err = m.systemd.ListUnits() if err != nil { return nil, err } } states := make(map[string]*unit.UnitState) for _, dus := range dbusStatuses { if fallback && !filter.Contains(dus.Name) { // If filter could not be applied on DBus side, we will filter unit files here continue } us := &unit.UnitState{ LoadState: dus.LoadState, ActiveState: dus.ActiveState, SubState: dus.SubState, } if h, ok := m.hashes[dus.Name]; ok { us.UnitHash = h.String() } states[dus.Name] = us } // grab data on subscribed units that didn't show up in ListUnits in fallback mode, most // likely due to being inactive if fallback { for _, name := range filter.Values() { if _, ok := states[name]; ok { continue } us, err := m.getUnitState(name) if err != nil { return nil, err } if h, ok := m.hashes[name]; ok { us.UnitHash = h.String() } states[name] = us } } return states, nil }