Merge lp:~jimmiebtlr/juju-core/fix-no-peers-charms into lp:~go-bot/juju-core/trunk

Proposed by Jimmie Butler
Status: Needs review
Proposed branch: lp:~jimmiebtlr/juju-core/fix-no-peers-charms
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 198 lines (+52/-17)
5 files modified
charm/meta.go (+2/-2)
charm/meta_test.go (+15/-6)
schema/schema.go (+20/-0)
schema/schema_test.go (+9/-9)
testing/repo/quantal/empty-fields/metadata.yaml (+6/-0)
To merge this branch: bzr merge lp:~jimmiebtlr/juju-core/fix-no-peers-charms
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+221156@code.launchpad.net

Commit message

charm: accept missing relation maps

https://codereview.appspot.com/101810046/

Description of the change

Allow charms without a peer listed.

https://codereview.appspot.com/101810046/

To post a comment you must log in.
Revision history for this message
Jimmie Butler (jimmiebtlr) wrote :
Download full text (8.0 KiB)

Reviewers: mp+221156_code.launchpad.net,

Message:
Please take a look.

Description:
Allow charms without a peer listed.

https://code.launchpad.net/~jimmiebtlr/juju-core/fix-no-peers-charms/+merge/221156

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/101810046/

Affected files (+61, -24 lines):
   A [revision details]
   M charm/meta.go
   M charm/meta_test.go
   M schema/schema.go
   M schema/schema_test.go
   A testing/repo/quantal/empty-fields/metadata.yaml

Index: [revision details]
=== added file '[revision details]'
--- [revision details] 2012-01-01 00:00:00 +0000
+++ [revision details] 2012-01-01 00:00:00 +0000
@@ -0,0 +1,2 @@
+Old revision: tarmac-20140528050243-agcci9rl0vqrr911
+New revision: <email address hidden>

Index: charm/meta.go
=== modified file 'charm/meta.go'
--- charm/meta.go 2014-04-09 16:36:12 +0000
+++ charm/meta.go 2014-05-21 01:59:05 +0000
@@ -96,13 +96,13 @@
   Summary string
   Description string
   Subordinate bool
- Provides map[string]Relation `bson:",omitempty"`
- Requires map[string]Relation `bson:",omitempty"`
- Peers map[string]Relation `bson:",omitempty"`
- Format int `bson:",omitempty"`
- OldRevision int `bson:",omitempty"` // Obsolete
- Categories []string `bson:",omitempty"`
- Series string `bson:",omitempty"`
+ Provides map[string]Relation
+ Requires map[string]Relation
+ Peers map[string]Relation
+ Format int `bson:",omitempty"`
+ OldRevision int `bson:",omitempty"` // Obsolete
+ Categories []string `bson:",omitempty"`
+ Series string `bson:",omitempty"`
  }

  func generateRelationHooks(relName string, allHooks map[string]bool) {
@@ -262,10 +262,10 @@
  }

  func parseRelations(relations interface{}, role RelationRole)
map[string]Relation {
+ result := make(map[string]Relation)
   if relations == nil {
- return nil
+ return result
   }
- result := make(map[string]Relation)
   for name, rel := range relations.(map[string]interface{}) {
    relMap := rel.(map[string]interface{})
    relation := Relation{

Index: charm/meta_test.go
=== modified file 'charm/meta_test.go'
--- charm/meta_test.go 2014-04-09 16:36:12 +0000
+++ charm/meta_test.go 2014-05-28 05:01:55 +0000
@@ -93,8 +93,8 @@
    Interface: "mysql",
    Scope: charm.ScopeGlobal,
   })
- c.Assert(meta.Requires, gc.IsNil)
- c.Assert(meta.Peers, gc.IsNil)
+ c.Assert(meta.Requires, gc.DeepEquals, map[string]charm.Relation{})
+ c.Assert(meta.Peers, gc.DeepEquals, map[string]charm.Relation{})

   meta, err = charm.ReadMeta(repoMeta("riak"))
   c.Assert(err, gc.IsNil)
@@ -117,7 +117,7 @@
    Limit: 1,
    Scope: charm.ScopeGlobal,
   })
- c.Assert(meta.Requires, gc.IsNil)
+ c.Assert(meta.Requires, gc.DeepEquals, map[string]charm.Relation{})

   meta, err = charm.ReadMeta(repoMeta("terracotta"))
   c.Assert(err, gc.IsNil)
@@ -135,7 +135,7 @@
    Limit: 1,
    Scope: charm.ScopeGlobal,
   })
- c.Assert(meta.Requires, gc.IsNil)
+ c.Assert(meta.Requires, gc.DeepEquals, map[string]charm.Relation{})

   meta, err = charm.ReadMeta...

Read more...

Revision history for this message
William Reade (fwereade) wrote :

LGTM apart from the serialisation change. What prompted that?

https://codereview.appspot.com/101810046/diff/1/charm/meta.go
File charm/meta.go (right):

https://codereview.appspot.com/101810046/diff/1/charm/meta.go#newcode101
charm/meta.go:101: Peers map[string]Relation
why did these change?

https://codereview.appspot.com/101810046/

Revision history for this message
Jimmie Butler (jimmiebtlr) wrote :

I'll change the serialization back, my thinking on that section was to be
more explicit. It does seem unnecessary though.
On May 28, 2014 3:57 AM, "William Reade" <email address hidden>
wrote:

> LGTM apart from the serialisation change. What prompted that?
>
>
> https://codereview.appspot.com/101810046/diff/1/charm/meta.go
> File charm/meta.go (right):
>
> https://codereview.appspot.com/101810046/diff/1/charm/meta.go#newcode101
> charm/meta.go:101: Peers map[string]Relation
> why did these change?
>
> https://codereview.appspot.com/101810046/
>
> --
>
> https://code.launchpad.net/~jimmiebtlr/juju-core/fix-no-peers-charms/+merge/221156
> You are the owner of lp:~jimmiebtlr/juju-core/fix-no-peers-charms.
>

Revision history for this message
Jimmie Butler (jimmiebtlr) wrote :
Revision history for this message
William Reade (fwereade) wrote :

LGTM, I'm approving this despite the unnecessary lines in the test. A
followup that just dropped those would be very much appreciated.

https://codereview.appspot.com/101810046/diff/20001/charm/meta_test.go
File charm/meta_test.go (right):

https://codereview.appspot.com/101810046/diff/20001/charm/meta_test.go#newcode407
charm/meta_test.go:407: empty_input.Requires = nil
Aren't these nil already?

https://codereview.appspot.com/101810046/

Revision history for this message
Go Bot (go-bot) wrote :
Download full text (64.8 KiB)

The attempt to merge lp:~jimmiebtlr/juju-core/fix-no-peers-charms into lp:juju-core failed. Below is the output from the failed tests.

ok launchpad.net/juju-core 0.024s
ok launchpad.net/juju-core/agent 0.923s
ok launchpad.net/juju-core/agent/mongo 0.484s
ok launchpad.net/juju-core/agent/tools 0.180s
ok launchpad.net/juju-core/audit 0.013s
ok launchpad.net/juju-core/bzr 5.142s
ok launchpad.net/juju-core/cert 2.623s
ok launchpad.net/juju-core/charm 0.414s
? launchpad.net/juju-core/charm/hooks [no test files]
? launchpad.net/juju-core/charm/testing [no test files]
ok launchpad.net/juju-core/cloudinit 0.174s
ok launchpad.net/juju-core/cloudinit/sshinit 0.765s
ok launchpad.net/juju-core/cmd 0.183s
ok launchpad.net/juju-core/cmd/charm-admin 0.244s
? launchpad.net/juju-core/cmd/charmd [no test files]
? launchpad.net/juju-core/cmd/charmload [no test files]
ok launchpad.net/juju-core/cmd/envcmd 0.167s
ok launchpad.net/juju-core/cmd/juju 162.882s
ok launchpad.net/juju-core/cmd/jujud 69.584s
ok launchpad.net/juju-core/cmd/plugins/juju-metadata 9.346s
? launchpad.net/juju-core/cmd/plugins/juju-restore [no test files]
ok launchpad.net/juju-core/cmd/plugins/local 0.151s
? launchpad.net/juju-core/cmd/plugins/local/juju-local [no test files]
ok launchpad.net/juju-core/constraints 0.023s
ok launchpad.net/juju-core/container 0.169s
ok launchpad.net/juju-core/container/factory 0.194s
ok launchpad.net/juju-core/container/kvm 0.166s
ok launchpad.net/juju-core/container/kvm/mock 0.162s
? launchpad.net/juju-core/container/kvm/testing [no test files]
ok launchpad.net/juju-core/container/lxc 4.270s
? launchpad.net/juju-core/container/lxc/mock [no test files]
? launchpad.net/juju-core/container/lxc/testing [no test files]
? launchpad.net/juju-core/container/testing [no test files]
ok launchpad.net/juju-core/downloader 5.193s
ok launchpad.net/juju-core/environs 2.002s
ok launchpad.net/juju-core/environs/bootstrap 3.981s
ok launchpad.net/juju-core/environs/cloudinit 0.518s
ok launchpad.net/juju-core/environs/config 1.605s
ok launchpad.net/juju-core/environs/configstore 0.177s
ok launchpad.net/juju-core/environs/filestorage 0.029s
ok launchpad.net/juju-core/environs/httpstorage 0.732s
ok launchpad.net/juju-core/environs/imagemetadata 0.519s
? launchpad.net/juju-core/environs/imagemetadata/testing [no test files]
ok launchpad.net/juju-core/environs/instances 0.216s
ok launchpad.net/juju-core/environs/jujutest 0.162s
ok launchpad.net/juju-core/environs/manual 11.665s
? launchpad.net/juju-core/environs/network [no test files]
ok launchpad.net/juju-core/environs/simplestreams 0.273s
? launchpad.net/juju-core/environs/simplestreams/testing [no test files]
ok launchpad.net/juju-core/environs/sshstorage 1.162s
ok launchpad.net/juju-core/environs/storage 0.787s
ok launchpad.net/juju-core/environs/sync 41.865s
ok launchpad.net/juju-core/environs/testing 0.146s
ok launchpad.net/juju-core/environs/tools 4.741s
? launchpad.net/juju-core/environs/tools/testing [no test files]
ok launchpad.net/juju-core/instance 0.145s
? launchpad.net/juju-core/instance/tes...

Revision history for this message
John A Meinel (jameinel) wrote :

So these appear to be genuine test discrepancies. At the least places that expected an empty map seem to have a nil map. I'm not 100% sure what the best fix is, possibly just fix up the tests to expect something different.

Revision history for this message
Horacio Durán (hduran-8) wrote :

On 2014/06/02 09:11:54, fwereade wrote:
> LGTM, I'm approving this despite the unnecessary lines in the test. A
followup
> that just dropped those would be very much appreciated.

> https://codereview.appspot.com/101810046/diff/20001/charm/meta_test.go
> File charm/meta_test.go (right):

https://codereview.appspot.com/101810046/diff/20001/charm/meta_test.go#newcode407
> charm/meta_test.go:407: empty_input.Requires = nil
> Aren't these nil already?

LGTM Altough for the records I would appreciate a more detailed
description for the
merge proposal.

https://codereview.appspot.com/101810046/

Unmerged revisions

2717. By Jimmie Butler

Change test to pass with omitempty for relations.

2716. By Jimmie Butler

Merge in most recent master

2715. By Jimmie Butler

Remove serialization change

2714. By Jimmie Butler

Merge in most recent master

2713. By Jimmie Butler

Go fmt.

2712. By Jimmie Butler

Change test order, put error check first.

2711. By Jimmie Butler

Change test order to check error first.

2710. By Jimmie Butler

Merge with most recent master.

2709. By Jimmie Butler

Merge in most recent master

2708. By Jimmie Butler

Remove unneeded statement in parseRelation.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'charm/meta.go'
2--- charm/meta.go 2014-04-09 16:36:12 +0000
3+++ charm/meta.go 2014-05-29 01:51:08 +0000
4@@ -262,10 +262,10 @@
5 }
6
7 func parseRelations(relations interface{}, role RelationRole) map[string]Relation {
8+ result := make(map[string]Relation)
9 if relations == nil {
10- return nil
11+ return result
12 }
13- result := make(map[string]Relation)
14 for name, rel := range relations.(map[string]interface{}) {
15 relMap := rel.(map[string]interface{})
16 relation := Relation{
17
18=== modified file 'charm/meta_test.go'
19--- charm/meta_test.go 2014-04-09 16:36:12 +0000
20+++ charm/meta_test.go 2014-05-29 01:51:08 +0000
21@@ -93,8 +93,8 @@
22 Interface: "mysql",
23 Scope: charm.ScopeGlobal,
24 })
25- c.Assert(meta.Requires, gc.IsNil)
26- c.Assert(meta.Peers, gc.IsNil)
27+ c.Assert(meta.Requires, gc.DeepEquals, map[string]charm.Relation{})
28+ c.Assert(meta.Peers, gc.DeepEquals, map[string]charm.Relation{})
29
30 meta, err = charm.ReadMeta(repoMeta("riak"))
31 c.Assert(err, gc.IsNil)
32@@ -117,7 +117,7 @@
33 Limit: 1,
34 Scope: charm.ScopeGlobal,
35 })
36- c.Assert(meta.Requires, gc.IsNil)
37+ c.Assert(meta.Requires, gc.DeepEquals, map[string]charm.Relation{})
38
39 meta, err = charm.ReadMeta(repoMeta("terracotta"))
40 c.Assert(err, gc.IsNil)
41@@ -135,7 +135,7 @@
42 Limit: 1,
43 Scope: charm.ScopeGlobal,
44 })
45- c.Assert(meta.Requires, gc.IsNil)
46+ c.Assert(meta.Requires, gc.DeepEquals, map[string]charm.Relation{})
47
48 meta, err = charm.ReadMeta(repoMeta("wordpress"))
49 c.Assert(err, gc.IsNil)
50@@ -160,7 +160,13 @@
51 Optional: true,
52 Scope: charm.ScopeGlobal,
53 })
54- c.Assert(meta.Peers, gc.IsNil)
55+ c.Assert(meta.Peers, gc.DeepEquals, map[string]charm.Relation{})
56+
57+ meta, err = charm.ReadMeta(repoMeta("empty-fields"))
58+ c.Assert(err, gc.IsNil)
59+ c.Assert(meta.Provides, gc.DeepEquals, map[string]charm.Relation{})
60+ c.Assert(meta.Requires, gc.DeepEquals, map[string]charm.Relation{})
61+ c.Assert(meta.Peers, gc.DeepEquals, map[string]charm.Relation{})
62 }
63
64 var relationsConstraintsTests = []struct {
65@@ -396,12 +402,15 @@
66 for i, codec := range codecs {
67 c.Logf("codec %d", i)
68 empty_input := charm.Meta{}
69+ empty_input.Provides = nil
70+ empty_input.Peers = nil
71+ empty_input.Requires = nil
72 data, err := codec.Marshal(empty_input)
73 c.Assert(err, gc.IsNil)
74 var empty_output charm.Meta
75 err = codec.Unmarshal(data, &empty_output)
76 c.Assert(err, gc.IsNil)
77- c.Assert(empty_input, gc.DeepEquals, empty_output)
78+ c.Assert(empty_output, gc.DeepEquals, empty_input)
79 }
80 }
81
82
83=== modified file 'schema/schema.go'
84--- schema/schema.go 2014-01-15 10:50:11 +0000
85+++ schema/schema.go 2014-05-29 01:51:08 +0000
86@@ -293,6 +293,11 @@
87
88 func (c mapC) Coerce(v interface{}, path []string) (interface{}, error) {
89 rv := reflect.ValueOf(v)
90+
91+ // treat nil value as empty map
92+ if rv.Kind() == reflect.Invalid {
93+ return make(map[interface{}]interface{}), nil
94+ }
95 if rv.Kind() != reflect.Map {
96 return nil, error_{"map", v, path}
97 }
98@@ -334,6 +339,11 @@
99
100 func (c stringMapC) Coerce(v interface{}, path []string) (interface{}, error) {
101 rv := reflect.ValueOf(v)
102+
103+ // treat nil value as empty map
104+ if rv.Kind() == reflect.Invalid {
105+ return make(map[string]interface{}), nil
106+ }
107 if rv.Kind() != reflect.Map {
108 return nil, error_{"map", v, path}
109 }
110@@ -399,6 +409,11 @@
111
112 func (c fieldMapC) Coerce(v interface{}, path []string) (interface{}, error) {
113 rv := reflect.ValueOf(v)
114+
115+ // treat nil value as empty map
116+ if rv.Kind() == reflect.Invalid {
117+ return make(map[string]interface{}), nil
118+ }
119 if rv.Kind() != reflect.Map {
120 return nil, error_{"map", v, path}
121 }
122@@ -488,6 +503,11 @@
123
124 func (c mapSetC) Coerce(v interface{}, path []string) (interface{}, error) {
125 rv := reflect.ValueOf(v)
126+
127+ // treat nil value as empty map
128+ if rv.Kind() == reflect.Invalid {
129+ return make(map[string]interface{}), nil
130+ }
131 if rv.Kind() != reflect.Map {
132 return nil, error_{"map", v, path}
133 }
134
135=== modified file 'schema/schema_test.go'
136--- schema/schema_test.go 2014-01-14 13:10:26 +0000
137+++ schema/schema_test.go 2014-05-29 01:51:08 +0000
138@@ -250,8 +250,8 @@
139 c.Assert(err, gc.ErrorMatches, "<path>: expected map, got int\\(42\\)")
140
141 out, err = sch.Coerce(nil, aPath)
142- c.Assert(out, gc.IsNil)
143- c.Assert(err, gc.ErrorMatches, "<path>: expected map, got nothing")
144+ c.Assert(err, gc.IsNil)
145+ c.Assert(out, gc.DeepEquals, map[interface{}]interface{}{})
146
147 out, err = sch.Coerce(map[int]int{1: 1}, aPath)
148 c.Assert(out, gc.IsNil)
149@@ -274,12 +274,12 @@
150 c.Assert(out, gc.DeepEquals, map[string]interface{}{"a": int64(1), "b": int64(2)})
151
152 out, err = sch.Coerce(42, aPath)
153- c.Assert(out, gc.IsNil)
154 c.Assert(err, gc.ErrorMatches, "<path>: expected map, got int\\(42\\)")
155+ c.Assert(out, gc.IsNil)
156
157 out, err = sch.Coerce(nil, aPath)
158- c.Assert(out, gc.IsNil)
159- c.Assert(err, gc.ErrorMatches, "<path>: expected map, got nothing")
160+ c.Assert(err, gc.IsNil)
161+ c.Assert(out, gc.DeepEquals, map[string]interface{}{})
162
163 out, err = sch.Coerce(map[int]int{1: 1}, aPath)
164 c.Assert(out, gc.IsNil)
165@@ -306,8 +306,8 @@
166 c.Assert(err, gc.ErrorMatches, "<path>: expected map, got int\\(42\\)")
167
168 out, err = sch.Coerce(nil, aPath)
169- c.Assert(out, gc.IsNil)
170- c.Assert(err, gc.ErrorMatches, "<path>: expected map, got nothing")
171+ c.Assert(err, gc.IsNil)
172+ c.Assert(out, gc.DeepEquals, map[string]interface{}{})
173
174 out, err = sch.Coerce(map[string]interface{}{"a": "A", "b": "C"}, aPath)
175 c.Assert(out, gc.IsNil)
176@@ -416,8 +416,8 @@
177 c.Assert(err, gc.ErrorMatches, `<path>: expected map, got int\(42\)`)
178
179 out, err = sch.Coerce(nil, aPath)
180- c.Assert(out, gc.IsNil)
181- c.Assert(err, gc.ErrorMatches, `<path>: expected map, got nothing`)
182+ c.Assert(err, gc.IsNil)
183+ c.Assert(out, gc.DeepEquals, map[string]interface{}{})
184
185 // First path entry shouldn't have dots in an error message.
186 out, err = sch.Coerce(map[string]int{"a": 1}, nil)
187
188=== added directory 'testing/repo/quantal/empty-fields'
189=== added file 'testing/repo/quantal/empty-fields/metadata.yaml'
190--- testing/repo/quantal/empty-fields/metadata.yaml 1970-01-01 00:00:00 +0000
191+++ testing/repo/quantal/empty-fields/metadata.yaml 2014-05-29 01:51:08 +0000
192@@ -0,0 +1,6 @@
193+name: empty-fields
194+summary: "Kerosene powered blender"
195+description: "Description here"
196+provides:
197+peers:
198+requires:

Subscribers

People subscribed via source and target branches

to status/vote changes: