Left: | ||
Right: |
OLD | NEW |
---|---|
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 } |
OLD | NEW |