github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/state/apiserver/common/remove.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 "fmt" 8 9 "launchpad.net/juju-core/state" 10 "launchpad.net/juju-core/state/api/params" 11 ) 12 13 // Remover implements a common Remove method for use by various facades. 14 type Remover struct { 15 st state.EntityFinder 16 callEnsureDead bool 17 getCanModify GetAuthFunc 18 } 19 20 // NewRemover returns a new Remover. The callEnsureDead flag specifies 21 // whether EnsureDead should be called on an entity before 22 // removing. The GetAuthFunc will be used on each invocation of Remove 23 // to determine current permissions. 24 func NewRemover(st state.EntityFinder, callEnsureDead bool, getCanModify GetAuthFunc) *Remover { 25 return &Remover{ 26 st: st, 27 callEnsureDead: callEnsureDead, 28 getCanModify: getCanModify, 29 } 30 } 31 32 func (r *Remover) removeEntity(tag string) error { 33 entity, err := r.st.FindEntity(tag) 34 if err != nil { 35 return err 36 } 37 remover, ok := entity.(interface { 38 state.Lifer 39 state.Remover 40 state.EnsureDeader 41 }) 42 if !ok { 43 return NotSupportedError(tag, "removal") 44 } 45 // Only remove entites that are not Alive. 46 if life := remover.Life(); life == state.Alive { 47 return fmt.Errorf("cannot remove entity %q: still alive", tag) 48 } 49 if r.callEnsureDead { 50 if err := remover.EnsureDead(); err != nil { 51 return err 52 } 53 } 54 return remover.Remove() 55 } 56 57 // Remove removes every given entity from state, calling EnsureDead 58 // first, then Remove. It will fail if the entity is not present. 59 func (r *Remover) Remove(args params.Entities) (params.ErrorResults, error) { 60 result := params.ErrorResults{ 61 Results: make([]params.ErrorResult, len(args.Entities)), 62 } 63 if len(args.Entities) == 0 { 64 return result, nil 65 } 66 canModify, err := r.getCanModify() 67 if err != nil { 68 return params.ErrorResults{}, err 69 } 70 for i, entity := range args.Entities { 71 err := ErrPerm 72 if canModify(entity.Tag) { 73 err = r.removeEntity(entity.Tag) 74 } 75 result.Results[i].Error = ServerError(err) 76 } 77 return result, nil 78 }