Left: | ||
Right: |
OLD | NEW |
---|---|
(Empty) | |
1 package server | |
2 | |
3 import ( | |
4 "fmt" | |
5 "launchpad.net/gnuflag" | |
6 "launchpad.net/goyaml" | |
7 "launchpad.net/juju-core/cmd" | |
8 "strconv" | |
9 "strings" | |
10 ) | |
11 | |
12 // RelationSetCommand implements the relation-set command. | |
13 type RelationSetCommand struct { | |
14 *HookContext | |
15 RelationId int | |
16 Settings map[string]interface{} | |
17 } | |
18 | |
19 func NewRelationSetCommand(ctx *HookContext) (cmd.Command, error) { | |
20 return &RelationSetCommand{HookContext: ctx, Settings: map[string]interf ace{}{}}, nil | |
21 } | |
22 | |
23 func (c *RelationSetCommand) Info() *cmd.Info { | |
24 return &cmd.Info{ | |
25 "relation-set", "<key=value> [, ...]", "set relation settings", "", | |
26 } | |
27 } | |
28 | |
29 func (c *RelationSetCommand) Init(f *gnuflag.FlagSet, args []string) error { | |
30 _, defaultId := c.relationIdentifiers() | |
31 relationId := "" | |
32 f.StringVar(&relationId, "r", defaultId, "relation id") | |
33 if err := f.Parse(true, args); err != nil { | |
34 return err | |
35 } | |
36 if relationId == "" { | |
37 if c.HookContext.RelationId == -1 { | |
38 return fmt.Errorf("no relation specified") | |
rog
2012/07/31 08:28:08
"running in a non-relation hook" or something simi
fwereade
2012/07/31 23:00:11
I don't think so -- the user might be specifying t
| |
39 } | |
40 c.RelationId = c.HookContext.RelationId | |
41 } else { | |
42 trim := relationId | |
43 if idx := strings.LastIndex(trim, ":"); idx != -1 { | |
44 trim = trim[idx+1:] | |
45 } | |
46 id, err := strconv.Atoi(trim) | |
47 if err != nil { | |
48 return fmt.Errorf("invalid relation id %q", relationId) | |
49 } | |
50 if _, found := c.Relations[id]; !found { | |
51 return fmt.Errorf("unknown relation id %q", relationId) | |
52 } | |
53 c.RelationId = id | |
54 } | |
55 args = f.Args() | |
56 if len(args) == 0 { | |
57 return fmt.Errorf("no settings specified") | |
58 } | |
59 for _, kv := range args { | |
60 parts := strings.SplitN(kv, "=", 2) | |
61 var err error | |
62 var value interface{} | |
63 if parts[0] == "" { | |
64 err = fmt.Errorf("no key specified") | |
65 } else { | |
66 err = goyaml.Unmarshal([]byte(parts[1]), &value) | |
rog
2012/07/31 08:28:08
this surprises me.
does this mean it's an error t
fwereade
2012/07/31 23:00:11
The glorious taste of sweet sweet crack, it emerge
rog
2012/08/03 13:49:42
that made me smile.
| |
67 } | |
68 if err != nil { | |
69 return fmt.Errorf("cannot parse %q: %v", kv, err) | |
70 } | |
71 c.Settings[parts[0]] = value | |
72 } | |
73 return nil | |
74 } | |
75 | |
76 func (c *RelationSetCommand) Run(ctx *cmd.Context) (err error) { | |
77 node, err := c.Relations[c.RelationId].Settings() | |
78 for k, v := range c.Settings { | |
79 if v != nil { | |
80 node.Set(k, v) | |
81 } else { | |
82 node.Delete(k) | |
83 } | |
84 } | |
85 return nil | |
86 } | |
OLD | NEW |