func (s *FortressSuite) TestWorkersIndependent(c *gc.C) { fix := newFixture(c) defer fix.TearDown(c) // Create a separate worker and associated guard from the same manifold. worker2, err := fix.manifold.Start(nil) c.Assert(err, jc.ErrorIsNil) defer CheckStop(c, worker2) var guard2 fortress.Guard err = fix.manifold.Output(worker2, &guard2) c.Assert(err, jc.ErrorIsNil) // Unlock the separate worker; check the original worker is unaffected. err = guard2.Unlock() c.Assert(err, jc.ErrorIsNil) AssertLocked(c, fix.Guest(c)) }
// updateCharmDir sets charm directory availability for sharing among // concurrent workers according to local operation state. func updateCharmDir(opState operation.State, guard fortress.Guard, abort fortress.Abort) error { var changing bool // Determine if the charm content is changing. if opState.Kind == operation.Install || opState.Kind == operation.Upgrade { changing = true } else if opState.Kind == operation.RunHook && opState.Hook != nil && opState.Hook.Kind == hooks.UpgradeCharm { changing = true } available := opState.Started && !opState.Stopped && !changing logger.Tracef("charmdir: available=%v opState: started=%v stopped=%v changing=%v", available, opState.Started, opState.Stopped, changing) if available { return guard.Unlock() } else { return guard.Lockdown(abort) } }