Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(500)

Side by Side Diff: state/apiserver/common/remove.go

Issue 12551043: state: implement the single FindEntity method
Patch Set: state: implement the single FindEntity method Created 10 years, 7 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 Canonical Ltd. 1 // Copyright 2013 Canonical Ltd.
2 // Licensed under the AGPLv3, see LICENCE file for details. 2 // Licensed under the AGPLv3, see LICENCE file for details.
3 3
4 package common 4 package common
5 5
6 import ( 6 import (
7 "fmt" 7 "fmt"
8 8
9 "launchpad.net/juju-core/state" 9 "launchpad.net/juju-core/state"
10 "launchpad.net/juju-core/state/api/params" 10 "launchpad.net/juju-core/state/api/params"
11 ) 11 )
12 12
13 // Remover implements a common Remove method for use by various facades. 13 // Remover implements a common Remove method for use by various facades.
14 type Remover struct { 14 type Remover struct {
15 » st Removerer 15 » st state.EntityFinder
16 getCanModify GetAuthFunc 16 getCanModify GetAuthFunc
17 } 17 }
18 18
19 type Removerer interface {
20 // state.State implements Remover to provide ways for us to call
21 // object.Remove (for machines, units, etc). This is used to allow
22 // us to test with mocks without having to actually bring up
23 // state.
24 Remover(tag string) (state.Remover, error)
25 }
26
27 // NewRemover returns a new Remover. The GetAuthFunc will be used on 19 // NewRemover returns a new Remover. The GetAuthFunc will be used on
28 // each invocation of Remove to determine current permissions. 20 // each invocation of Remove to determine current permissions.
29 func NewRemover(st Removerer, getCanModify GetAuthFunc) *Remover { 21 func NewRemover(st state.EntityFinder, getCanModify GetAuthFunc) *Remover {
30 return &Remover{ 22 return &Remover{
31 st: st, 23 st: st,
32 getCanModify: getCanModify, 24 getCanModify: getCanModify,
33 } 25 }
34 } 26 }
35 27
36 func (r *Remover) removeEntity(entity params.Entity) (err error) { 28 func (r *Remover) removeEntity(entityp params.Entity) error {
dimitern 2013/08/07 09:13:09 s/entityp params.Entity/tag string/
rog 2013/08/07 12:20:44 Done.
37 » var remover state.Remover 29 » entity, err := r.st.FindEntity(entityp.Tag)
38 » if remover, err = r.st.Remover(entity.Tag); err != nil { 30 » if err != nil {
39 return err 31 return err
40 } 32 }
33 remover, ok := entity.(interface {
34 state.Lifer
35 state.Remover
36 })
37 if !ok {
38 return NotSupportedError(entityp.Tag, "removal")
39 }
41 // Only remove entites that are not Alive. 40 // Only remove entites that are not Alive.
42 if life := remover.Life(); life == state.Alive { 41 if life := remover.Life(); life == state.Alive {
43 » » return fmt.Errorf("cannot remove entity %q: still alive", entity .Tag) 42 » » return fmt.Errorf("cannot remove entity %q: still alive", entity p.Tag)
44 } 43 }
45 if err = remover.EnsureDead(); err != nil { 44 if err = remover.EnsureDead(); err != nil {
46 return err 45 return err
47 } 46 }
48 return remover.Remove() 47 return remover.Remove()
49 } 48 }
50 49
51 // Remove removes every given entity from state, calling EnsureDead 50 // Remove removes every given entity from state, calling EnsureDead
52 // first, then Remove. It will fail if the entity is not present. 51 // first, then Remove. It will fail if the entity is not present.
53 func (r *Remover) Remove(args params.Entities) (params.ErrorResults, error) { 52 func (r *Remover) Remove(args params.Entities) (params.ErrorResults, error) {
54 result := params.ErrorResults{ 53 result := params.ErrorResults{
55 Results: make([]params.ErrorResult, len(args.Entities)), 54 Results: make([]params.ErrorResult, len(args.Entities)),
56 } 55 }
57 if len(args.Entities) == 0 { 56 if len(args.Entities) == 0 {
58 return result, nil 57 return result, nil
59 } 58 }
60 canModify, err := r.getCanModify() 59 canModify, err := r.getCanModify()
61 if err != nil { 60 if err != nil {
62 return params.ErrorResults{}, err 61 return params.ErrorResults{}, err
63 } 62 }
64 for i, entity := range args.Entities { 63 for i, entity := range args.Entities {
65 err := ErrPerm 64 err := ErrPerm
66 if canModify(entity.Tag) { 65 if canModify(entity.Tag) {
67 err = r.removeEntity(entity) 66 err = r.removeEntity(entity)
68 } 67 }
69 result.Results[i].Error = ServerError(err) 68 result.Results[i].Error = ServerError(err)
70 } 69 }
71 return result, nil 70 return result, nil
72 } 71 }
OLDNEW

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b