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

Side by Side Diff: cmd/jujuc/server/relation-set.go

Issue 6446067: implement relation-set
Patch Set: Created 12 years, 8 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
(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 }
OLDNEW

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