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