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