LEFT | RIGHT |
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 state.EntityFinder | 15 st state.EntityFinder |
16 getCanModify GetAuthFunc | 16 getCanModify GetAuthFunc |
17 } | 17 } |
18 | 18 |
19 // NewRemover returns a new Remover. The GetAuthFunc will be used on | 19 // NewRemover returns a new Remover. The GetAuthFunc will be used on |
20 // each invocation of Remove to determine current permissions. | 20 // each invocation of Remove to determine current permissions. |
21 func NewRemover(st state.EntityFinder, getCanModify GetAuthFunc) *Remover { | 21 func NewRemover(st state.EntityFinder, getCanModify GetAuthFunc) *Remover { |
22 return &Remover{ | 22 return &Remover{ |
23 st: st, | 23 st: st, |
24 getCanModify: getCanModify, | 24 getCanModify: getCanModify, |
25 } | 25 } |
26 } | 26 } |
27 | 27 |
28 func (r *Remover) removeEntity(entityp params.Entity) error { | 28 func (r *Remover) removeEntity(tag string) error { |
29 » entity, err := r.st.FindEntity(entityp.Tag) | 29 » entity, err := r.st.FindEntity(tag) |
30 if err != nil { | 30 if err != nil { |
31 return err | 31 return err |
32 } | 32 } |
33 remover, ok := entity.(interface { | 33 remover, ok := entity.(interface { |
34 state.Lifer | 34 state.Lifer |
35 state.Remover | 35 state.Remover |
| 36 state.EnsureDeader |
36 }) | 37 }) |
37 if !ok { | 38 if !ok { |
38 » » return NotSupportedError(entityp.Tag, "removal") | 39 » » return NotSupportedError(tag, "removal") |
39 } | 40 } |
40 // Only remove entites that are not Alive. | 41 // Only remove entites that are not Alive. |
41 if life := remover.Life(); life == state.Alive { | 42 if life := remover.Life(); life == state.Alive { |
42 » » return fmt.Errorf("cannot remove entity %q: still alive", entity
p.Tag) | 43 » » return fmt.Errorf("cannot remove entity %q: still alive", tag) |
43 } | 44 } |
44 if err = remover.EnsureDead(); err != nil { | 45 if err = remover.EnsureDead(); err != nil { |
45 return err | 46 return err |
46 } | 47 } |
47 return remover.Remove() | 48 return remover.Remove() |
48 } | 49 } |
49 | 50 |
50 // Remove removes every given entity from state, calling EnsureDead | 51 // Remove removes every given entity from state, calling EnsureDead |
51 // first, then Remove. It will fail if the entity is not present. | 52 // first, then Remove. It will fail if the entity is not present. |
52 func (r *Remover) Remove(args params.Entities) (params.ErrorResults, error) { | 53 func (r *Remover) Remove(args params.Entities) (params.ErrorResults, error) { |
53 result := params.ErrorResults{ | 54 result := params.ErrorResults{ |
54 Results: make([]params.ErrorResult, len(args.Entities)), | 55 Results: make([]params.ErrorResult, len(args.Entities)), |
55 } | 56 } |
56 if len(args.Entities) == 0 { | 57 if len(args.Entities) == 0 { |
57 return result, nil | 58 return result, nil |
58 } | 59 } |
59 canModify, err := r.getCanModify() | 60 canModify, err := r.getCanModify() |
60 if err != nil { | 61 if err != nil { |
61 return params.ErrorResults{}, err | 62 return params.ErrorResults{}, err |
62 } | 63 } |
63 for i, entity := range args.Entities { | 64 for i, entity := range args.Entities { |
64 err := ErrPerm | 65 err := ErrPerm |
65 if canModify(entity.Tag) { | 66 if canModify(entity.Tag) { |
66 » » » err = r.removeEntity(entity) | 67 » » » err = r.removeEntity(entity.Tag) |
67 } | 68 } |
68 result.Results[i].Error = ServerError(err) | 69 result.Results[i].Error = ServerError(err) |
69 } | 70 } |
70 return result, nil | 71 return result, nil |
71 } | 72 } |
LEFT | RIGHT |