github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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 "gopkg.in/juju/names.v2" 9 10 "github.com/juju/juju/apiserver/params" 11 "github.com/juju/juju/state" 12 ) 13 14 // LifeGetter implements a common Life method for use by various facades. 15 type LifeGetter struct { 16 st state.EntityFinder 17 getCanRead GetAuthFunc 18 } 19 20 // NewLifeGetter returns a new LifeGetter. The GetAuthFunc will be used on 21 // each invocation of Life to determine current permissions. 22 func NewLifeGetter(st state.EntityFinder, getCanRead GetAuthFunc) *LifeGetter { 23 return &LifeGetter{ 24 st: st, 25 getCanRead: getCanRead, 26 } 27 } 28 29 func (lg *LifeGetter) oneLife(tag names.Tag) (params.Life, error) { 30 entity0, err := lg.st.FindEntity(tag) 31 if err != nil { 32 return "", err 33 } 34 entity, ok := entity0.(state.Lifer) 35 if !ok { 36 return "", NotSupportedError(tag, "life cycles") 37 } 38 return params.Life(entity.Life().String()), nil 39 } 40 41 // Life returns the life status of every supplied entity, where available. 42 func (lg *LifeGetter) Life(args params.Entities) (params.LifeResults, error) { 43 result := params.LifeResults{ 44 Results: make([]params.LifeResult, len(args.Entities)), 45 } 46 if len(args.Entities) == 0 { 47 return result, nil 48 } 49 canRead, err := lg.getCanRead() 50 if err != nil { 51 return params.LifeResults{}, errors.Trace(err) 52 } 53 for i, entity := range args.Entities { 54 tag, err := names.ParseTag(entity.Tag) 55 if err != nil { 56 result.Results[i].Error = ServerError(ErrPerm) 57 continue 58 } 59 err = ErrPerm 60 if canRead(tag) { 61 result.Results[i].Life, err = lg.oneLife(tag) 62 } 63 result.Results[i].Error = ServerError(err) 64 } 65 return result, nil 66 }