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

Delta Between Two Patch Sets: state/apiserver/common/remove.go

Issue 12551043: state: implement the single FindEntity method
Left Patch Set: Created 10 years, 7 months ago
Right 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:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « state/apiserver/common/password_test.go ('k') | state/apiserver/common/remove_test.go » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
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 }
LEFTRIGHT

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