github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/common/life.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package common 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/names/v5" 9 10 apiservererrors "github.com/juju/juju/apiserver/errors" 11 "github.com/juju/juju/core/life" 12 "github.com/juju/juju/rpc/params" 13 "github.com/juju/juju/state" 14 ) 15 16 // LifeGetter implements a common Life method for use by various facades. 17 type LifeGetter struct { 18 st state.EntityFinder 19 getCanRead GetAuthFunc 20 } 21 22 // NewLifeGetter returns a new LifeGetter. The GetAuthFunc will be used on 23 // each invocation of Life to determine current permissions. 24 func NewLifeGetter(st state.EntityFinder, getCanRead GetAuthFunc) *LifeGetter { 25 return &LifeGetter{ 26 st: st, 27 getCanRead: getCanRead, 28 } 29 } 30 31 func (lg *LifeGetter) oneLife(tag names.Tag) (life.Value, error) { 32 entity0, err := lg.st.FindEntity(tag) 33 if err != nil { 34 return "", err 35 } 36 entity, ok := entity0.(state.Lifer) 37 if !ok { 38 return "", apiservererrors.NotSupportedError(tag, "life cycles") 39 } 40 return life.Value(entity.Life().String()), nil 41 } 42 43 // Life returns the life status of every supplied entity, where available. 44 func (lg *LifeGetter) Life(args params.Entities) (params.LifeResults, error) { 45 result := params.LifeResults{ 46 Results: make([]params.LifeResult, len(args.Entities)), 47 } 48 if len(args.Entities) == 0 { 49 return result, nil 50 } 51 canRead, err := lg.getCanRead() 52 if err != nil { 53 return params.LifeResults{}, errors.Trace(err) 54 } 55 for i, entity := range args.Entities { 56 tag, err := names.ParseTag(entity.Tag) 57 if err != nil { 58 result.Results[i].Error = apiservererrors.ServerError(apiservererrors.ErrPerm) 59 continue 60 } 61 err = apiservererrors.ErrPerm 62 if canRead(tag) { 63 result.Results[i].Life, err = lg.oneLife(tag) 64 } 65 result.Results[i].Error = apiservererrors.ServerError(err) 66 } 67 return result, nil 68 }