本文整理汇总了Golang中github.com/juju/juju/apiserver/params.IsCodeNotFoundOrCodeUnauthorized函数的典型用法代码示例。如果您正苦于以下问题:Golang IsCodeNotFoundOrCodeUnauthorized函数的具体用法?Golang IsCodeNotFoundOrCodeUnauthorized怎么用?Golang IsCodeNotFoundOrCodeUnauthorized使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了IsCodeNotFoundOrCodeUnauthorized函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: SetUp
func (mr *Machiner) SetUp() (watcher.NotifyWatcher, error) {
// Find which machine we're responsible for.
m, err := mr.config.MachineAccessor.Machine(mr.config.Tag)
if params.IsCodeNotFoundOrCodeUnauthorized(err) {
return nil, worker.ErrTerminateAgent
} else if err != nil {
return nil, errors.Trace(err)
}
mr.machine = m
if mr.config.ClearMachineAddressesOnStart {
logger.Debugf("machine addresses ignored on start - resetting machine addresses")
if err := m.SetMachineAddresses(nil); err != nil {
return nil, errors.Annotate(err, "reseting machine addresses")
}
} else {
// Set the addresses in state to the host's addresses.
if err := setMachineAddresses(mr.config.Tag, m); err != nil {
return nil, errors.Annotate(err, "setting machine addresses")
}
}
// Mark the machine as started and log it.
if err := m.SetStatus(status.Started, "", nil); err != nil {
return nil, errors.Annotatef(err, "%s failed to set status started", mr.config.Tag)
}
logger.Infof("%q started", mr.config.Tag)
return m.Watch()
}
开发者ID:bac,项目名称:juju,代码行数:30,代码来源:machiner.go
示例2: findUnknownInstances
// findUnknownInstances finds instances which are not associated with a machine.
func (task *provisionerTask) findUnknownInstances(stopping []instance.Instance) ([]instance.Instance, error) {
// Make a copy of the instances we know about.
instances := make(map[instance.Id]instance.Instance)
for k, v := range task.instances {
instances[k] = v
}
for _, m := range task.machines {
instId, err := m.InstanceId()
switch {
case err == nil:
delete(instances, instId)
case params.IsCodeNotProvisioned(err):
case params.IsCodeNotFoundOrCodeUnauthorized(err):
default:
return nil, err
}
}
// Now remove all those instances that we are stopping already as we
// know about those and don't want to include them in the unknown list.
for _, inst := range stopping {
delete(instances, inst.Id())
}
var unknown []instance.Instance
for _, inst := range instances {
unknown = append(unknown, inst)
}
return unknown, nil
}
开发者ID:kakamessi99,项目名称:juju,代码行数:30,代码来源:provisioner_task.go
示例3: Handle
func (mr *Machiner) Handle(_ <-chan struct{}) error {
if err := mr.machine.Refresh(); params.IsCodeNotFoundOrCodeUnauthorized(err) {
// NOTE(axw) we can distinguish between NotFound and CodeUnauthorized,
// so we could call NotifyMachineDead here in case the agent failed to
// call NotifyMachineDead directly after setting the machine Dead in
// the first place. We're not doing that to be cautious: the machine
// could be missing from state due to invalid global state.
return worker.ErrTerminateAgent
} else if err != nil {
return err
}
life := mr.machine.Life()
if life == params.Alive {
observedConfig, err := getObservedNetworkConfig(networkingcommon.DefaultNetworkConfigSource())
if err != nil {
return errors.Annotate(err, "cannot discover observed network config")
} else if len(observedConfig) == 0 {
logger.Warningf("not updating network config: no observed config found to update")
}
if len(observedConfig) > 0 {
if err := mr.machine.SetObservedNetworkConfig(observedConfig); err != nil {
return errors.Annotate(err, "cannot update observed network config")
}
}
logger.Debugf("observed network config updated")
return nil
}
logger.Debugf("%q is now %s", mr.config.Tag, life)
if err := mr.machine.SetStatus(status.Stopped, "", nil); err != nil {
return errors.Annotatef(err, "%s failed to set status stopped", mr.config.Tag)
}
// Attempt to mark the machine Dead. If the machine still has units
// assigned, or storage attached, this will fail with
// CodeHasAssignedUnits or CodeMachineHasAttachedStorage respectively.
// Once units or storage are removed, the watcher will trigger again
// and we'll reattempt.
if err := mr.machine.EnsureDead(); err != nil {
if params.IsCodeHasAssignedUnits(err) {
return nil
}
if params.IsCodeMachineHasAttachedStorage(err) {
logger.Tracef("machine still has storage attached")
return nil
}
return errors.Annotatef(err, "%s failed to set machine to dead", mr.config.Tag)
}
// Report on the machine's death. It is important that we do this after
// the machine is Dead, because this is the mechanism we use to clean up
// the machine (uninstall). If we were to report before marking the machine
// as Dead, then we would risk uninstalling prematurely.
if mr.config.NotifyMachineDead != nil {
if err := mr.config.NotifyMachineDead(); err != nil {
return errors.Annotate(err, "reporting machine death")
}
}
return worker.ErrTerminateAgent
}
开发者ID:bac,项目名称:juju,代码行数:60,代码来源:machiner.go
示例4: NewActionRunner
// NewActionRunner exists to satisfy the Factory interface.
func (f *factory) NewActionRunner(actionId string) (Runner, error) {
ch, err := getCharm(f.paths.GetCharmDir())
if err != nil {
return nil, errors.Trace(err)
}
ok := names.IsValidAction(actionId)
if !ok {
return nil, &badActionError{actionId, "not valid actionId"}
}
tag := names.NewActionTag(actionId)
action, err := f.state.Action(tag)
if params.IsCodeNotFoundOrCodeUnauthorized(err) {
return nil, ErrActionNotAvailable
} else if params.IsCodeActionNotAvailable(err) {
return nil, ErrActionNotAvailable
} else if err != nil {
return nil, errors.Trace(err)
}
name := action.Name()
spec, ok := ch.Actions().ActionSpecs[name]
if !ok {
return nil, &badActionError{name, "not defined"}
}
params := action.Params()
if err := spec.ValidateParams(params); err != nil {
return nil, &badActionError{name, err.Error()}
}
actionData := newActionData(name, &tag, params)
ctx, err := f.contextFactory.ActionContext(actionData)
runner := NewRunner(ctx, f.paths)
return runner, nil
}
开发者ID:mhilton,项目名称:juju,代码行数:36,代码来源:factory.go
示例5: changed
// changed ensures that the named unit is deployed, recalled, or removed, as
// indicated by its state.
func (d *Deployer) changed(unitName string) error {
unitTag := names.NewUnitTag(unitName)
// Determine unit life state, and whether we're responsible for it.
logger.Infof("checking unit %q", unitName)
var life params.Life
unit, err := d.st.Unit(unitTag)
if params.IsCodeNotFoundOrCodeUnauthorized(err) {
life = params.Dead
} else if err != nil {
return err
} else {
life = unit.Life()
}
// Deployed units must be removed if they're Dead, or if the deployer
// is no longer responsible for them.
if d.deployed.Contains(unitName) {
if life == params.Dead {
if err := d.recall(unitName); err != nil {
return err
}
}
}
// The only units that should be deployed are those that (1) we are responsible
// for and (2) are Alive -- if we're responsible for a Dying unit that is not
// yet deployed, we should remove it immediately rather than undergo the hassle
// of deploying a unit agent purely so it can set itself to Dead.
if !d.deployed.Contains(unitName) {
if life == params.Alive {
return d.deploy(unit)
} else if unit != nil {
return d.remove(unit)
}
}
return nil
}
开发者ID:bac,项目名称:juju,代码行数:37,代码来源:deployer.go
示例6: Handle
func (mr *Machiner) Handle(_ <-chan struct{}) error {
if err := mr.machine.Refresh(); params.IsCodeNotFoundOrCodeUnauthorized(err) {
return worker.ErrTerminateAgent
} else if err != nil {
return err
}
life := mr.machine.Life()
if life == params.Alive {
return nil
}
logger.Debugf("%q is now %s", mr.tag, life)
if err := mr.machine.SetStatus(params.StatusStopped, "", nil); err != nil {
return errors.Annotatef(err, "%s failed to set status stopped", mr.tag)
}
// Attempt to mark the machine Dead. If the machine still has units
// assigned, or storage attached, this will fail with
// CodeHasAssignedUnits or CodeMachineHasAttachedStorage respectively.
// Once units or storage are removed, the watcher will trigger again
// and we'll reattempt.
if err := mr.machine.EnsureDead(); err != nil {
if params.IsCodeHasAssignedUnits(err) {
return nil
}
if params.IsCodeMachineHasAttachedStorage(err) {
logger.Tracef("machine still has storage attached")
return nil
}
return errors.Annotatef(err, "%s failed to set machine to dead", mr.tag)
}
return worker.ErrTerminateAgent
}
开发者ID:claudiu-coblis,项目名称:juju,代码行数:32,代码来源:machiner.go
示例7: populateMachineMaps
// populateMachineMaps updates task.instances. Also updates
// task.machines map if a list of IDs is given.
func (task *provisionerTask) populateMachineMaps(ids []string) error {
task.instances = make(map[instance.Id]instance.Instance)
instances, err := task.broker.AllInstances()
if err != nil {
return errors.Annotate(err, "failed to get all instances from broker")
}
for _, i := range instances {
task.instances[i.Id()] = i
}
// Update the machines map with new data for each of the machines in the
// change list.
// TODO(thumper): update for API server later to get all machines in one go.
for _, id := range ids {
machineTag := names.NewMachineTag(id)
machine, err := task.machineGetter.Machine(machineTag)
switch {
case params.IsCodeNotFoundOrCodeUnauthorized(err):
logger.Debugf("machine %q not found in state", id)
delete(task.machines, id)
case err == nil:
task.machines[id] = machine
default:
return errors.Annotatef(err, "failed to get machine %v", id)
}
}
return nil
}
开发者ID:kakamessi99,项目名称:juju,代码行数:31,代码来源:provisioner_task.go
示例8: SetPassword
// SetPassword is part of the ConnFacade interface.
func (facade *connFacade) SetPassword(entity names.Tag, password string) error {
var results params.ErrorResults
args := params.EntityPasswords{
Changes: []params.EntityPassword{{
Tag: entity.String(),
Password: password,
}},
}
err := facade.caller.FacadeCall("SetPasswords", args, &results)
if err != nil {
return errors.Trace(err)
}
if len(results.Results) != 1 {
return errors.Errorf("expected 1 result, got %d", len(results.Results))
}
if err := results.Results[0].Error; err != nil {
if params.IsCodeDead(err) {
return ErrDenied
} else if params.IsCodeNotFoundOrCodeUnauthorized(err) {
return ErrDenied
}
return errors.Trace(err)
}
return nil
}
开发者ID:bac,项目名称:juju,代码行数:26,代码来源:facade.go
示例9: Life
// Life is part of the ConnFacade interface.
func (facade *connFacade) Life(entity names.Tag) (Life, error) {
var results params.AgentGetEntitiesResults
args := params.Entities{
Entities: []params.Entity{{Tag: entity.String()}},
}
err := facade.caller.FacadeCall("GetEntities", args, &results)
if err != nil {
return "", errors.Trace(err)
}
if len(results.Entities) != 1 {
return "", errors.Errorf("expected 1 result, got %d", len(results.Entities))
}
if err := results.Entities[0].Error; err != nil {
if params.IsCodeNotFoundOrCodeUnauthorized(err) {
return "", ErrDenied
}
return "", errors.Trace(err)
}
life := Life(results.Entities[0].Life)
switch life {
case Alive, Dying, Dead:
return life, nil
}
return "", errors.Errorf("unknown life value %q", life)
}
开发者ID:bac,项目名称:juju,代码行数:26,代码来源:facade.go
示例10: FailAction
// FailAction is part of the operation.Callbacks interface.
func (opc *operationCallbacks) FailAction(actionId, message string) error {
if !names.IsValidAction(actionId) {
return errors.Errorf("invalid action id %q", actionId)
}
tag := names.NewActionTag(actionId)
err := opc.u.st.ActionFinish(tag, params.ActionFailed, nil, message)
if params.IsCodeNotFoundOrCodeUnauthorized(err) {
err = nil
}
return err
}
开发者ID:imoapps,项目名称:juju,代码行数:12,代码来源:op_callbacks.go
示例11: init
func (w *RemoteStateWatcher) init(unitTag names.UnitTag) (err error) {
// TODO(dfc) named return value is a time bomb
// TODO(axw) move this logic.
defer func() {
if params.IsCodeNotFoundOrCodeUnauthorized(err) {
err = worker.ErrTerminateAgent
}
}()
if w.unit, err = w.st.Unit(unitTag); err != nil {
return err
}
w.service, err = w.unit.Service()
if err != nil {
return err
}
return nil
}
开发者ID:ktsakalozos,项目名称:juju,代码行数:17,代码来源:watcher.go
示例12: setUp
func (w *RemoteStateWatcher) setUp(unitTag names.UnitTag) (err error) {
// TODO(dfc) named return value is a time bomb
// TODO(axw) move this logic.
defer func() {
cause := errors.Cause(err)
if params.IsCodeNotFoundOrCodeUnauthorized(cause) {
err = worker.ErrTerminateAgent
}
}()
if w.unit, err = w.st.Unit(unitTag); err != nil {
return errors.Trace(err)
}
w.service, err = w.unit.Application()
if err != nil {
return errors.Trace(err)
}
return nil
}
开发者ID:bac,项目名称:juju,代码行数:18,代码来源:watcher.go
示例13: Handle
func (mr *Machiner) Handle() error {
if err := mr.machine.Refresh(); params.IsCodeNotFoundOrCodeUnauthorized(err) {
return worker.ErrTerminateAgent
} else if err != nil {
return err
}
if mr.machine.Life() == params.Alive {
return nil
}
logger.Debugf("%q is now %s", mr.tag, mr.machine.Life())
if err := mr.machine.SetStatus(params.StatusStopped, "", nil); err != nil {
return fmt.Errorf("%s failed to set status stopped: %v", mr.tag, err)
}
// If the machine is Dying, it has no units,
// and can be safely set to Dead.
if err := mr.machine.EnsureDead(); err != nil {
return fmt.Errorf("%s failed to set machine to dead: %v", mr.tag, err)
}
return worker.ErrTerminateAgent
}
开发者ID:kapilt,项目名称:juju,代码行数:21,代码来源:machiner.go
示例14: relationsChanged
// relationsChanged responds to service relation changes.
func (w *RemoteStateWatcher) relationsChanged(keys []string) error {
w.mu.Lock()
defer w.mu.Unlock()
for _, key := range keys {
relationTag := names.NewRelationTag(key)
rel, err := w.st.Relation(relationTag)
if params.IsCodeNotFoundOrCodeUnauthorized(err) {
// If it's actually gone, this unit cannot have entered
// scope, and therefore never needs to know about it.
if ruw, ok := w.relations[relationTag]; ok {
worker.Stop(ruw)
delete(w.relations, relationTag)
delete(w.current.Relations, ruw.relationId)
}
} else if err != nil {
return errors.Trace(err)
} else {
if _, ok := w.relations[relationTag]; ok {
relationSnapshot := w.current.Relations[rel.Id()]
relationSnapshot.Life = rel.Life()
w.current.Relations[rel.Id()] = relationSnapshot
continue
}
ruw, err := w.st.WatchRelationUnits(relationTag, w.unit.Tag())
if err != nil {
return errors.Trace(err)
}
// Because of the delay before handing off responsibility to
// newRelationUnitsWatcher below, add to our own catacomb to
// ensure errors get picked up if they happen.
if err := w.catacomb.Add(ruw); err != nil {
return errors.Trace(err)
}
if err := w.watchRelationUnits(rel, relationTag, ruw); err != nil {
return errors.Trace(err)
}
}
}
return nil
}
开发者ID:AlexisBruemmer,项目名称:juju,代码行数:41,代码来源:watcher.go
示例15: SetUp
func (mr *Machiner) SetUp() (watcher.NotifyWatcher, error) {
// Find which machine we're responsible for.
m, err := mr.st.Machine(mr.tag)
if params.IsCodeNotFoundOrCodeUnauthorized(err) {
return nil, worker.ErrTerminateAgent
} else if err != nil {
return nil, err
}
mr.machine = m
// Set the addresses in state to the host's addresses.
if err := setMachineAddresses(mr.tag, m); err != nil {
return nil, err
}
// Mark the machine as started and log it.
if err := m.SetStatus(params.StatusStarted, "", nil); err != nil {
return nil, fmt.Errorf("%s failed to set status started: %v", mr.tag, err)
}
logger.Infof("%q started", mr.tag)
return m.Watch()
}
开发者ID:Pankov404,项目名称:juju,代码行数:23,代码来源:machiner.go
示例16: relationsChanged
// relationsChanged responds to service relation changes.
func (w *RemoteStateWatcher) relationsChanged(keys []string) error {
w.mu.Lock()
defer w.mu.Unlock()
for _, key := range keys {
relationTag := names.NewRelationTag(key)
rel, err := w.st.Relation(relationTag)
if params.IsCodeNotFoundOrCodeUnauthorized(err) {
// If it's actually gone, this unit cannot have entered
// scope, and therefore never needs to know about it.
if ruw, ok := w.relations[relationTag]; ok {
if err := ruw.Stop(); err != nil {
return errors.Trace(err)
}
delete(w.relations, relationTag)
delete(w.current.Relations, ruw.relationId)
}
} else if err != nil {
return err
} else {
if _, ok := w.relations[relationTag]; ok {
relationSnapshot := w.current.Relations[rel.Id()]
relationSnapshot.Life = rel.Life()
w.current.Relations[rel.Id()] = relationSnapshot
continue
}
in, err := w.st.WatchRelationUnits(relationTag, w.unit.Tag())
if err != nil {
return errors.Trace(err)
}
if err := w.watchRelationUnits(rel, relationTag, in); err != nil {
watcher.Stop(in, &w.tomb)
return errors.Trace(err)
}
}
}
return nil
}
开发者ID:ktsakalozos,项目名称:juju,代码行数:38,代码来源:watcher.go
示例17: loop
func (f *filter) loop(unitTag names.UnitTag) (err error) {
// TODO(dfc) named return value is a time bomb
defer func() {
if params.IsCodeNotFoundOrCodeUnauthorized(err) {
err = worker.ErrTerminateAgent
}
}()
if f.unit, err = f.st.Unit(unitTag); err != nil {
return err
}
if err = f.unitChanged(); err != nil {
return err
}
if err = f.meterStatusChanged(); err != nil {
return err
}
f.service, err = f.unit.Service()
if err != nil {
return err
}
if err = f.serviceChanged(); err != nil {
return err
}
unitw, err := f.unit.Watch()
if err != nil {
return err
}
defer f.maybeStopWatcher(unitw)
servicew, err := f.service.Watch()
if err != nil {
return err
}
defer f.maybeStopWatcher(servicew)
// configw and relationsw can get restarted, so we need to use
// their eventual values in the defer calls.
var configw apiwatcher.NotifyWatcher
var configChanges <-chan struct{}
curl, err := f.unit.CharmURL()
if err == nil {
configw, err = f.unit.WatchConfigSettings()
if err != nil {
return err
}
configChanges = configw.Changes()
f.upgradeFrom.url = curl
} else if err != uniter.ErrNoCharmURLSet {
filterLogger.Errorf("unit charm: %v", err)
return err
}
defer f.maybeStopWatcher(configw)
actionsw, err := f.unit.WatchActionNotifications()
if err != nil {
return err
}
f.actionsPending = make([]string, 0)
defer f.maybeStopWatcher(actionsw)
relationsw, err := f.service.WatchRelations()
if err != nil {
return err
}
defer f.maybeStopWatcher(relationsw)
meterStatusw, err := f.unit.WatchMeterStatus()
if err != nil {
return err
}
defer f.maybeStopWatcher(meterStatusw)
addressesw, err := f.unit.WatchAddresses()
if err != nil {
return err
}
defer watcher.Stop(addressesw, &f.tomb)
storagew, err := f.unit.WatchStorage()
if err != nil {
return err
}
defer watcher.Stop(storagew, &f.tomb)
leaderSettingsw, err := f.st.LeadershipSettings.WatchLeadershipSettings(f.service.Tag().Id())
if err != nil {
return err
}
defer watcher.Stop(leaderSettingsw, &f.tomb)
// Ignore external requests for leader settings behaviour until we see the first change.
var discardLeaderSettings <-chan struct{}
var wantLeaderSettings <-chan bool
// By default we send all leaderSettings onwards.
sendLeaderSettings := true
// Config events cannot be meaningfully discarded until one is available;
// once we receive the initial config and address changes, we unblock
// discard requests by setting this channel to its namesake on f.
var discardConfig chan struct{}
var seenConfigChange bool
var seenAddressChange bool
maybePrepareConfigEvent := func() {
if !seenAddressChange {
filterLogger.Debugf("no address change seen yet, skipping config event")
return
}
if !seenConfigChange {
//.........这里部分代码省略.........
开发者ID:Pankov404,项目名称:juju,代码行数:101,代码来源:filter.go
示例18: Update
// Update is part of the Relations interface.
func (r *relations) Update(ids []int) error {
for _, id := range ids {
if relationer, found := r.relationers[id]; found {
rel := relationer.ru.Relation()
if err := rel.Refresh(); err != nil {
return errors.Annotatef(err, "cannot update relation %q", rel)
}
if rel.Life() == params.Dying {
if err := r.setDying(id); err != nil {
return errors.Trace(err)
}
}
continue
}
// Relations that are not alive are simply skipped, because they
// were not previously known anyway.
rel, err := r.st.RelationById(id)
if err != nil {
if params.IsCodeNotFoundOrCodeUnauthorized(err) {
continue
}
return errors.Trace(err)
}
if rel.Life() != params.Alive {
continue
}
// Make sure we ignore relations not implemented by the unit's charm.
ch, err := corecharm.ReadCharmDir(r.charmDir)
if err != nil {
return errors.Trace(err)
}
if ep, err := rel.Endpoint(); err != nil {
return errors.Trace(err)
} else if !ep.ImplementedBy(ch) {
logger.Warningf("skipping relation with unknown endpoint %q", ep.Name)
continue
}
dir, err := relation.ReadStateDir(r.relationsDir, id)
if err != nil {
return errors.Trace(err)
}
err = r.add(rel, dir)
if err == nil {
r.relationers[id].StartHooks()
continue
}
e := dir.Remove()
if !params.IsCodeCannotEnterScope(err) {
return errors.Trace(err)
}
if e != nil {
return errors.Trace(e)
}
}
if ok, err := r.unit.IsPrincipal(); err != nil {
return errors.Trace(err)
} else if ok {
return nil
}
// If no Alive relations remain between a subordinate unit's service
// and its principal's service, the subordinate must become Dying.
for _, relationer := range r.relationers {
scope := relationer.ru.Endpoint().Scope
if scope == corecharm.ScopeContainer && !relationer.dying {
return nil
}
}
return r.unit.Destroy()
}
开发者ID:Pankov404,项目名称:juju,代码行数:70,代码来源:relations.go
示例19: update
func (r *relations) update(remote map[int]remotestate.RelationSnapshot) error {
for id, relationSnapshot := range remote {
if _, found := r.relationers[id]; found {
// We've seen this relation before. The only changes
// we care about are to the lifecycle state, and to
// the member settings versions. We handle differences
// in settings in nextRelationHook.
if relationSnapshot.Life == params.Dying {
if err := r.setDying(id); err != nil {
return errors.Trace(err)
}
}
continue
}
// Relations that are not alive are simply skipped, because they
// were not previously known anyway.
if relationSnapshot.Life != params.Alive {
continue
}
rel, err := r.st.RelationById(id)
if err != nil {
if params.IsCodeNotFoundOrCodeUnauthorized(err) {
continue
}
return errors.Trace(err)
}
// Make sure we ignore relations not implemented by the unit's charm.
ch, err := corecharm.ReadCharmDir(r.charmDir)
if err != nil {
return errors.Trace(err)
}
if ep, err := rel.Endpoint(); err != nil {
return errors.Trace(err)
} else if !ep.ImplementedBy(ch) {
logger.Warningf("skipping relation with unknown endpoint %q", ep.Name)
continue
}
dir, err := ReadStateDir(r.relationsDir, id)
if err != nil {
return errors.Trace(err)
}
addErr := r.add(rel, dir)
if addErr == nil {
continue
}
removeErr := dir.Remove()
if !params.IsCodeCannotEnterScope(addErr) {
return errors.Trace(addErr)
}
if removeErr != nil {
return errors.Trace(removeErr)
}
}
if ok, err := r.unit.IsPrincipal(); err != nil {
return errors.Trace(err)
} else if ok {
return nil
}
// If no Alive relations remain between a subordinate unit's service
// and its principal's service, the subordinate must become Dying.
for _, relationer := range r.relationers {
scope := relationer.ru.Endpoint().Scope
if scope == corecharm.ScopeContainer && !relationer.dying {
return nil
}
}
return r.unit.Destroy()
}
开发者ID:pmatulis,项目名称:juju,代码行数:68,代码来源:relations.go
示例20: loop
func (f *filter) loop(unitTag string) (err error) {
// TODO(dfc) named return value is a time bomb
defer func() {
if params.IsCodeNotFoundOrCodeUnauthorized(err) {
err = worker.ErrTerminateAgent
}
}()
tag, err := names.ParseUnitTag(unitTag)
if err != nil {
return err
}
if f.unit, err = f.st.Unit(tag); err != nil {
return err
}
if err = f.unitChanged(); err != nil {
return err
}
f.service, err = f.unit.Service()
if err != nil {
return err
}
if err = f.serviceChanged(); err != nil {
return err
}
unitw, err := f.unit.Watch()
if err != nil {
return err
}
defer f.maybeStopWatcher(unitw)
servicew, err := f.service.Watch()
if err != nil {
return err
}
defer f.maybeStopWatcher(servicew)
// configw and relationsw can get restarted, so we need to use
// their eventual values in the defer calls.
var configw apiwatcher.NotifyWatcher
var configChanges <-chan struct{}
curl, err := f.unit.CharmURL()
if err == nil {
configw, err = f.unit.WatchConfigSettings()
if err != nil {
return err
}
configChanges = configw.Changes()
f.upgradeFrom.url = curl
} else if err != uniter.ErrNoCharmURLSet {
filterLogger.Errorf("unit charm: %v", err)
return err
}
defer func() {
if configw != nil {
watcher.Stop(configw, &f.tomb)
}
}()
actionsw, err := f.unit.WatchActions()
if err != nil {
return err
}
f.actionsPending = make([]string, 0)
defer func() {
if actionsw != nil {
watcher.Stop(actionsw, &f.tomb)
}
}()
relationsw, err := f.service.WatchRelations()
if err != nil {
return err
}
defer func() {
if relationsw != nil {
watcher.Stop(relationsw, &f.tomb)
}
}()
var addressChanges <-chan struct{}
addressesw, err := f.unit.WatchAddresses()
if err != nil {
return err
}
defer watcher.Stop(addressesw, &f.tomb)
// Config events cannot be meaningfully discarded until one is available;
// once we receive the initial change, we unblock discard requests by
// setting this channel to its namesake on f.
var discardConfig chan struct{}
for {
var ok bool
select {
case <-f.tomb.Dying():
return tomb.ErrDying
// Handle watcher changes.
case _, ok = <-unitw.Changes():
filterLogger.Debugf("got unit change")
if !ok {
return watcher.MustErr(unitw)
}
if err = f.unitChanged(); err != nil {
return err
}
//.........这里部分代码省略.........
开发者ID:kapilt,项目名称:juju,代码行数:101,代码来源:filter.go
注:本文中的github.com/juju/juju/apiserver/params.IsCodeNotFoundOrCodeUnauthorized函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论