本文整理汇总了Golang中launchpad/net/juju-core/state/watcher.Stop函数的典型用法代码示例。如果您正苦于以下问题:Golang Stop函数的具体用法?Golang Stop怎么用?Golang Stop使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了Stop函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: TestStop
func (s *WatcherSuite) TestStop(c *C) {
t := &tomb.Tomb{}
watcher.Stop(&dummyWatcher{nil}, t)
c.Assert(t.Err(), Equals, tomb.ErrStillAlive)
watcher.Stop(&dummyWatcher{errors.New("BLAM")}, t)
c.Assert(t.Err(), ErrorMatches, "BLAM")
}
示例2: loop
func (p *Provisioner) loop() error {
environWatcher := p.st.WatchEnvironConfig()
defer watcher.Stop(environWatcher, &p.tomb)
var err error
p.environ, err = worker.WaitForEnviron(environWatcher, p.tomb.Dying())
if err != nil {
return err
}
auth, err := NewSimpleAuthenticator(p.environ)
if err != nil {
return err
}
// Start a new worker for the environment provider.
// Start responding to changes in machines, and to any further updates
// to the environment config.
instanceBroker, err := p.getBroker()
if err != nil {
return err
}
machineWatcher, err := p.getWatcher()
if err != nil {
return err
}
environmentProvisioner := NewProvisionerTask(
p.machineId,
p.st,
machineWatcher,
instanceBroker,
auth)
defer watcher.Stop(environmentProvisioner, &p.tomb)
for {
select {
case <-p.tomb.Dying():
return tomb.ErrDying
case <-environmentProvisioner.Dying():
err := environmentProvisioner.Err()
logger.Errorf("environment provisioner died: %v", err)
return err
case cfg, ok := <-environWatcher.Changes():
if !ok {
return watcher.MustErr(environWatcher)
}
if err := p.setConfig(cfg); err != nil {
logger.Errorf("loaded invalid environment configuration: %v", err)
}
}
}
panic("not reached")
}
示例3: stopWatchers
// stopWatchers stops all the firewaller's watchers.
func (fw *Firewaller) stopWatchers() {
watcher.Stop(fw.environWatcher, &fw.tomb)
watcher.Stop(fw.machinesWatcher, &fw.tomb)
for _, unitd := range fw.unitds {
watcher.Stop(unitd, &fw.tomb)
}
for _, serviced := range fw.serviceds {
watcher.Stop(serviced, &fw.tomb)
}
for _, machined := range fw.machineds {
watcher.Stop(machined, &fw.tomb)
}
}
示例4: loop
func (p *Provisioner) loop() error {
environWatcher := p.st.WatchEnvironConfig()
defer watcher.Stop(environWatcher, &p.tomb)
var err error
p.environ, err = worker.WaitForEnviron(environWatcher, p.tomb.Dying())
if err != nil {
return err
}
// Get a new StateInfo from the environment: the one used to
// launch the agent may refer to localhost, which will be
// unhelpful when attempting to run an agent on a new machine.
if p.stateInfo, p.apiInfo, err = p.environ.StateInfo(); err != nil {
return err
}
// Call processMachines to stop any unknown instances before watching machines.
if err := p.processMachines(nil); err != nil {
return err
}
// Start responding to changes in machines, and to any further updates
// to the environment config.
machinesWatcher := p.st.WatchMachines()
defer watcher.Stop(machinesWatcher, &p.tomb)
// START OMIT
// launchpad.net/juju-core/worker/provisioner/provisioner.go
for {
select {
case <-p.tomb.Dying():
return tomb.ErrDying
case cfg, ok := <-environWatcher.Changes():
if !ok {
return watcher.MustErr(environWatcher)
}
if err := p.setConfig(cfg); err != nil {
log.Errorf("worker/provisioner: loaded invalid environment configuration: %v", err)
}
case ids, ok := <-machinesWatcher.Changes():
if !ok {
return watcher.MustErr(machinesWatcher)
}
if err := p.processMachines(ids); err != nil {
return err
}
}
}
// END OMIT
panic("not reached")
}
示例5: loop
func (nw *notifyWorker) loop() error {
w, err := nw.handler.SetUp()
if err != nil {
if w != nil {
// We don't bother to propagate an error, because we
// already have an error
w.Stop()
}
return err
}
defer propagateTearDown(nw.handler, &nw.tomb)
defer watcher.Stop(w, &nw.tomb)
for {
select {
case <-nw.tomb.Dying():
return tomb.ErrDying
case _, ok := <-w.Changes():
if !ok {
return nw.mustErr(w)
}
if err := nw.handler.Handle(); err != nil {
return err
}
}
}
}
示例6: loop
func (nw *notifyWorker) loop() error {
var w api.NotifyWatcher
var err error
defer handlerTearDown(nw.handler, &nw.tomb)
if w, err = nw.handler.SetUp(); err != nil {
if w != nil {
// We don't bother to propogate an error, because we
// already have an error
w.Stop()
}
return err
}
defer watcher.Stop(w, &nw.tomb)
for {
select {
case <-nw.tomb.Dying():
return tomb.ErrDying
case _, ok := <-w.Changes():
if !ok {
return nw.closedHandler(w)
}
if err := nw.handler.Handle(); err != nil {
return err
}
}
}
panic("unreachable")
}
示例7: addRelation
// addRelation causes the unit agent to join the supplied relation, and to
// store persistent state in the supplied dir.
func (u *Uniter) addRelation(rel *state.Relation, dir *relation.StateDir) error {
log.Printf("worker/uniter: joining relation %q", rel)
ru, err := rel.Unit(u.unit)
if err != nil {
return err
}
r := NewRelationer(ru, dir, u.relationHooks)
w := u.unit.Watch()
defer watcher.Stop(w, &u.tomb)
for {
select {
case <-u.tomb.Dying():
return tomb.ErrDying
case _, ok := <-w.Changes():
if !ok {
return watcher.MustErr(w)
}
if err := r.Join(); err == state.ErrCannotEnterScopeYet {
log.Printf("worker/uniter: cannot enter scope for relation %q; waiting for subordinate to be removed", rel)
continue
} else if err != nil {
return err
}
log.Printf("worker/uniter: joined relation %q", rel)
u.relationers[rel.Id()] = r
return nil
}
}
panic("unreachable")
}
示例8: watchLoop
// watchLoop watches the service's exposed flag for changes.
func (sd *serviceData) watchLoop(exposed bool) {
defer sd.tomb.Done()
w := sd.service.Watch()
defer watcher.Stop(w, &sd.tomb)
for {
select {
case <-sd.tomb.Dying():
return
case _, ok := <-w.Changes():
if !ok {
sd.fw.tomb.Kill(watcher.MustErr(w))
return
}
if err := sd.service.Refresh(); err != nil {
if !errors.IsNotFoundError(err) {
sd.fw.tomb.Kill(err)
}
return
}
change := sd.service.IsExposed()
if change == exposed {
continue
}
exposed = change
select {
case sd.fw.exposedChange <- &exposedChange{sd, change}:
case <-sd.tomb.Dying():
return
}
}
}
}
示例9: loop
func (d *Deployer) loop() error {
machine, err := d.st.Machine(d.machineId)
if err != nil {
return err
}
machineUnitsWatcher := machine.WatchUnits()
defer watcher.Stop(machineUnitsWatcher, &d.tomb)
deployed, err := d.ctx.DeployedUnits()
if err != nil {
return err
}
for _, unitName := range deployed {
d.deployed.Add(unitName)
if err := d.changed(unitName); err != nil {
return err
}
}
for {
select {
case <-d.tomb.Dying():
return tomb.ErrDying
case changes, ok := <-machineUnitsWatcher.Changes():
if !ok {
return watcher.MustErr(machineUnitsWatcher)
}
for _, unitName := range changes {
if err := d.changed(unitName); err != nil {
return err
}
}
}
}
panic("unreachable")
}
示例10: ModeTerminating
// ModeTerminating marks the unit dead and returns ErrTerminateAgent.
func ModeTerminating(u *Uniter) (next Mode, err error) {
defer modeContext("ModeTerminating", &err)()
if err = u.unit.SetStatus(params.StatusStopped, ""); err != nil {
return nil, err
}
w := u.unit.Watch()
defer watcher.Stop(w, &u.tomb)
for {
select {
case <-u.tomb.Dying():
return nil, tomb.ErrDying
case _, ok := <-w.Changes():
if !ok {
return nil, watcher.MustErr(w)
}
if err := u.unit.Refresh(); err != nil {
return nil, err
}
if len(u.unit.SubordinateNames()) > 0 {
continue
}
// The unit is known to be Dying; so if it didn't have subordinates
// just above, it can't acquire new ones before this call.
if err := u.unit.EnsureDead(); err != nil {
return nil, err
}
return nil, worker.ErrTerminateAgent
}
}
}
示例11: loop
func (task *provisionerTask) loop() error {
logger.Infof("Starting up provisioner task %s", task.machineId)
defer watcher.Stop(task.machineWatcher, &task.tomb)
// When the watcher is started, it will have the initial changes be all
// the machines that are relevant. Also, since this is available straight
// away, we know there will be some changes right off the bat.
for {
select {
case <-task.tomb.Dying():
logger.Infof("Shutting down provisioner task %s", task.machineId)
return tomb.ErrDying
case ids, ok := <-task.machineWatcher.Changes():
if !ok {
return watcher.MustErr(task.machineWatcher)
}
// TODO(dfc; lp:1042717) fire process machines periodically to shut down unknown
// instances.
if err := task.processMachines(ids); err != nil {
logger.Errorf("Process machines failed: %v", err)
return err
}
}
}
}
示例12: loop
func (mr *Machiner) loop() error {
m, err := mr.st.Machine(mr.id)
if state.IsNotFound(err) {
return worker.ErrDead
} else if err != nil {
return err
}
w := m.Watch()
defer watcher.Stop(w, &mr.tomb)
for {
select {
case <-mr.tomb.Dying():
return tomb.ErrDying
case <-w.Changes():
if err := m.Refresh(); state.IsNotFound(err) {
return worker.ErrDead
} else if err != nil {
return err
}
if m.Life() != state.Alive {
// If the machine is Dying, it has no units,
// and can be safely set to Dead.
if err := m.EnsureDead(); err != nil {
return err
}
return worker.ErrDead
}
}
}
panic("unreachable")
}
示例13: finish
func (w *RelationUnitsWatcher) finish() {
watcher.Stop(w.sw, &w.tomb)
for _, watchedValue := range w.watching.Values() {
w.st.watcher.Unwatch(w.st.settings.Name, watchedValue, w.updates)
}
close(w.updates)
close(w.out)
w.tomb.Done()
}
示例14: loop
func (q *AliveHookQueue) loop(initial *State) {
defer q.tomb.Done()
defer watcher.Stop(q.w, &q.tomb)
// Consume initial event, and reconcile with initial state, by inserting
// a new RelationUnitsChange before the initial event, which schedules
// every missing unit for immediate departure before anything else happens
// (apart from a single potential required post-joined changed event).
ch1, ok := <-q.w.Changes()
if !ok {
q.tomb.Kill(watcher.MustErr(q.w))
return
}
if len(ch1.Departed) != 0 {
panic("AliveHookQueue must be started with a fresh RelationUnitsWatcher")
}
q.changedPending = initial.ChangedPending
ch0 := state.RelationUnitsChange{}
for unit, version := range initial.Members {
q.info[unit] = &unitInfo{
unit: unit,
version: version,
joined: true,
}
if _, found := ch1.Changed[unit]; !found {
ch0.Departed = append(ch0.Departed, unit)
}
}
q.update(ch0)
q.update(ch1)
var next hook.Info
var out chan<- hook.Info
for {
if q.empty() {
out = nil
} else {
out = q.out
next = q.next()
}
select {
case <-q.tomb.Dying():
return
case ch, ok := <-q.w.Changes():
if !ok {
q.tomb.Kill(watcher.MustErr(q.w))
return
}
q.update(ch)
case out <- next:
q.pop()
}
}
}
示例15: NewDeployer
// NewDeployer returns a Deployer that deploys and recalls unit agents via
// mgr, according to membership and lifecycle changes notified by w.
func NewDeployer(st *state.State, mgr Manager, w *state.UnitsWatcher) *Deployer {
d := &Deployer{
st: st,
mgr: mgr,
entityName: w.EntityName(),
deployed: map[string]bool{},
}
go func() {
defer d.tomb.Done()
defer watcher.Stop(w, &d.tomb)
d.tomb.Kill(d.loop(w))
}()
return d
}