Merge lp:~dimitern/juju-core/146-apiprovisioner-addresses into lp:~go-bot/juju-core/trunk

Proposed by Dimiter Naydenov
Status: Merged
Approved by: Dimiter Naydenov
Approved revision: no longer in the source branch.
Merged at revision: 1891
Proposed branch: lp:~dimitern/juju-core/146-apiprovisioner-addresses
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 487 lines (+245/-93)
11 files modified
agent/agent.go (+0/-18)
state/api/provisioner/provisioner.go (+30/-0)
state/api/provisioner/provisioner_test.go (+23/-0)
state/apiserver/common/addresses.go (+92/-0)
state/apiserver/common/addresses_test.go (+45/-0)
state/apiserver/common/common_test.go (+2/-1)
state/apiserver/deployer/deployer.go (+2/-63)
state/apiserver/provisioner/provisioner.go (+2/-0)
state/apiserver/provisioner/provisioner_test.go (+28/-0)
worker/provisioner/authentication.go (+20/-10)
worker/provisioner/provisioner.go (+1/-1)
To merge this branch: bzr merge lp:~dimitern/juju-core/146-apiprovisioner-addresses
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+187719@code.launchpad.net

Commit message

api/provisioner: Addresses/CACert methods added

Like the deployer API, the provisioner API also
needs to provider StateAddresses(), APIAddresses(),
and CACert(), so we can use the up-to-date (not
localhost) addresses in NewAPIAuthenticator().

This is needed, because the addresses we get
from agent config are incorrect (use localhost),
and without this CL neither containers nor
machines can't connect to state/API server
at provisioning.

And because the same code is already in deployer,
I followed a suggestion to factor it out into
apiserver/common/addresses.

https://codereview.appspot.com/13963043/

R=fwereade

Description of the change

api/provisioner: Addresses/CACert methods added

Like the deployer API, the provisioner API also
needs to provider StateAddresses(), APIAddresses(),
and CACert(), so we can use the up-to-date (not
localhost) addresses in NewAPIAuthenticator().

This is needed, because the addresses we get
from agent config are incorrect (use localhost),
and without this CL neither containers nor
machines can't connect to state/API server
at provisioning.

And because the same code is already in deployer,
I followed a suggestion to factor it out into
apiserver/common/addresses.

https://codereview.appspot.com/13963043/

To post a comment you must log in.
Revision history for this message
Dimiter Naydenov (dimitern) wrote :

Reviewers: mp+187719_code.launchpad.net,

Message:
Please take a look.

Description:
api/provisioner: Addresses/CACert methods added

Like the deployer API, the provisioner API also
needs to provider StateAddresses(), APIAddresses(),
and CACert(), so we can use the up-to-date (not
localhost) addresses in NewAPIAuthenticator().

This is needed, because the addresses we get
from agent config are incorrect (use localhost),
and without this CL neither containers nor
machines can't connect to state/API server
at provisioning.

https://code.launchpad.net/~dimitern/juju-core/146-apiprovisioner-addresses/+merge/187719

(do not edit description out of merge proposal)

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

Affected files (+167, -11 lines):
   A [revision details]
   M state/api/provisioner/provisioner.go
   M state/api/provisioner/provisioner_test.go
   M state/apiserver/provisioner/provisioner.go
   M state/apiserver/provisioner/provisioner_test.go
   M worker/provisioner/authentication.go
   M worker/provisioner/provisioner.go

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

If the copy/paste is necessary to get this in time for 1.15, LGTM with
an immediate followup to deduplicate. Much rather see it in this branch
though.

https://codereview.appspot.com/13963043/

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

LGTM, thanks.

https://codereview.appspot.com/13963043/diff/6001/state/apiserver/common/addresses.go
File state/apiserver/common/addresses.go (right):

https://codereview.appspot.com/13963043/diff/6001/state/apiserver/common/addresses.go#newcode21
state/apiserver/common/addresses.go:21: // PasswordChanger implements a
common set of methods for getting
PasswordChanger? ;p

https://codereview.appspot.com/13963043/diff/6001/state/apiserver/common/addresses.go#newcode22
state/apiserver/common/addresses.go:22: // state and API addresses, as
well as the CA certificated, used to
"state and API server addresses, and the CA certificate used to
authenticate them."?

https://codereview.appspot.com/13963043/

Revision history for this message
Dimiter Naydenov (dimitern) wrote :

Please take a look.

https://codereview.appspot.com/13963043/diff/6001/state/apiserver/common/addresses.go
File state/apiserver/common/addresses.go (right):

https://codereview.appspot.com/13963043/diff/6001/state/apiserver/common/addresses.go#newcode21
state/apiserver/common/addresses.go:21: // PasswordChanger implements a
common set of methods for getting
On 2013/09/26 13:28:35, fwereade wrote:
> PasswordChanger? ;p

oops :) Fixed.

https://codereview.appspot.com/13963043/diff/6001/state/apiserver/common/addresses.go#newcode22
state/apiserver/common/addresses.go:22: // state and API addresses, as
well as the CA certificated, used to
On 2013/09/26 13:28:35, fwereade wrote:
> "state and API server addresses, and the CA certificate used to
authenticate
> them."?

Done.

https://codereview.appspot.com/13963043/

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'agent/agent.go'
2--- agent/agent.go 2013-09-25 16:18:20 +0000
3+++ agent/agent.go 2013-09-26 13:42:07 +0000
4@@ -87,12 +87,6 @@
5 // api connections.
6 PasswordHash() string
7
8- // StateAddresses returns all known state server addresses.
9- StateAddresses() []string
10-
11- // APIAddresses returns all known API server addresses.
12- APIAddresses() []string
13-
14 // APIServerDetails returns the details needed to run an API server.
15 APIServerDetails() (port int, cert, key []byte)
16
17@@ -311,18 +305,6 @@
18 }
19 }
20
21-func (c *configInternal) StateAddresses() []string {
22- addresses := make([]string, len(c.stateDetails.addresses))
23- copy(addresses, c.stateDetails.addresses)
24- return addresses
25-}
26-
27-func (c *configInternal) APIAddresses() []string {
28- addresses := make([]string, len(c.apiDetails.addresses))
29- copy(addresses, c.apiDetails.addresses)
30- return addresses
31-}
32-
33 func (c *configInternal) APIServerDetails() (port int, cert, key []byte) {
34 return c.apiPort, c.stateServerCert, c.stateServerKey
35 }
36
37=== modified file 'state/api/provisioner/provisioner.go'
38--- state/api/provisioner/provisioner.go 2013-09-19 12:10:31 +0000
39+++ state/api/provisioner/provisioner.go 2013-09-26 13:42:07 +0000
40@@ -101,3 +101,33 @@
41 w := watcher.NewStringsWatcher(st.caller, result)
42 return w, nil
43 }
44+
45+// StateAddresses returns the list of addresses used to connect to the state.
46+func (st *State) StateAddresses() ([]string, error) {
47+ var result params.StringsResult
48+ err := st.caller.Call("Provisioner", "", "StateAddresses", nil, &result)
49+ if err != nil {
50+ return nil, err
51+ }
52+ return result.Result, nil
53+}
54+
55+// APIAddresses returns the list of addresses used to connect to the API.
56+func (st *State) APIAddresses() ([]string, error) {
57+ var result params.StringsResult
58+ err := st.caller.Call("Provisioner", "", "APIAddresses", nil, &result)
59+ if err != nil {
60+ return nil, err
61+ }
62+ return result.Result, nil
63+}
64+
65+// CACert returns the certificate used to validate the state connection.
66+func (st *State) CACert() ([]byte, error) {
67+ var result params.BytesResult
68+ err := st.caller.Call("Provisioner", "", "CACert", nil, &result)
69+ if err != nil {
70+ return nil, err
71+ }
72+ return result.Result, nil
73+}
74
75=== modified file 'state/api/provisioner/provisioner_test.go'
76--- state/api/provisioner/provisioner_test.go 2013-09-19 12:10:31 +0000
77+++ state/api/provisioner/provisioner_test.go 2013-09-26 13:42:07 +0000
78@@ -337,3 +337,26 @@
79 statetesting.AssertStop(c, w)
80 wc.AssertClosed()
81 }
82+
83+func (s *provisionerSuite) TestStateAddresses(c *gc.C) {
84+ stateAddresses, err := s.State.Addresses()
85+ c.Assert(err, gc.IsNil)
86+
87+ addresses, err := s.provisioner.StateAddresses()
88+ c.Assert(err, gc.IsNil)
89+ c.Assert(addresses, gc.DeepEquals, stateAddresses)
90+}
91+
92+func (s *provisionerSuite) TestAPIAddresses(c *gc.C) {
93+ apiInfo := s.APIInfo(c)
94+
95+ addresses, err := s.provisioner.APIAddresses()
96+ c.Assert(err, gc.IsNil)
97+ c.Assert(addresses, gc.DeepEquals, apiInfo.Addrs)
98+}
99+
100+func (s *provisionerSuite) TestCACert(c *gc.C) {
101+ caCert, err := s.provisioner.CACert()
102+ c.Assert(err, gc.IsNil)
103+ c.Assert(caCert, gc.DeepEquals, s.State.CACert())
104+}
105
106=== added file 'state/apiserver/common/addresses.go'
107--- state/apiserver/common/addresses.go 1970-01-01 00:00:00 +0000
108+++ state/apiserver/common/addresses.go 2013-09-26 13:42:07 +0000
109@@ -0,0 +1,92 @@
110+// Copyright 2013 Canonical Ltd.
111+// Licensed under the AGPLv3, see LICENCE file for details.
112+
113+package common
114+
115+import (
116+ "launchpad.net/juju-core/environs"
117+ "launchpad.net/juju-core/environs/config"
118+ "launchpad.net/juju-core/state"
119+ "launchpad.net/juju-core/state/api"
120+ "launchpad.net/juju-core/state/api/params"
121+)
122+
123+// EnvironConfigAndCertGetter defines EnvironConfig and CACert
124+// methods.
125+type EnvironConfigAndCertGetter interface {
126+ EnvironConfig() (*config.Config, error)
127+ CACert() []byte
128+}
129+
130+// Addresser implements a common set of methods for getting state and
131+// API server addresses, and the CA certificate used to authenticate
132+// them.
133+type Addresser struct {
134+ st EnvironConfigAndCertGetter
135+}
136+
137+// NewAddresser returns a new Addresser.
138+func NewAddresser(st EnvironConfigAndCertGetter) *Addresser {
139+ return &Addresser{st}
140+}
141+
142+// getEnvironStateInfo returns the state and API connection
143+// information from the state and the environment.
144+//
145+// TODO(dimitern): Remove this once we have a way to get state/API
146+// public addresses from state.
147+// BUG(lp:1205371): This is temporary, until the Addresser worker
148+// lands and we can take the addresses of all machines with
149+// JobManageState.
150+func (a *Addresser) getEnvironStateInfo() (*state.Info, *api.Info, error) {
151+ cfg, err := a.st.EnvironConfig()
152+ if err != nil {
153+ return nil, nil, err
154+ }
155+ env, err := environs.New(cfg)
156+ if err != nil {
157+ return nil, nil, err
158+ }
159+ return env.StateInfo()
160+}
161+
162+// StateAddresses returns the list of addresses used to connect to the state.
163+//
164+// TODO(dimitern): Remove this once we have a way to get state/API
165+// public addresses from state.
166+// BUG(lp:1205371): This is temporary, until the Addresser worker
167+// lands and we can take the addresses of all machines with
168+// JobManageState.
169+func (a *Addresser) StateAddresses() (params.StringsResult, error) {
170+ stateInfo, _, err := a.getEnvironStateInfo()
171+ if err != nil {
172+ return params.StringsResult{}, err
173+ }
174+ return params.StringsResult{
175+ Result: stateInfo.Addrs,
176+ }, nil
177+}
178+
179+// APIAddresses returns the list of addresses used to connect to the API.
180+//
181+// TODO(dimitern): Remove this once we have a way to get state/API
182+// public addresses from state.
183+// BUG(lp:1205371): This is temporary, until the Addresser worker
184+// lands and we can take the addresses of all machines with
185+// JobManageState.
186+func (a *Addresser) APIAddresses() (params.StringsResult, error) {
187+ _, apiInfo, err := a.getEnvironStateInfo()
188+ if err != nil {
189+ return params.StringsResult{}, err
190+ }
191+ return params.StringsResult{
192+ Result: apiInfo.Addrs,
193+ }, nil
194+}
195+
196+// CACert returns the certificate used to validate the state connection.
197+func (a *Addresser) CACert() params.BytesResult {
198+ return params.BytesResult{
199+ Result: a.st.CACert(),
200+ }
201+}
202
203=== added file 'state/apiserver/common/addresses_test.go'
204--- state/apiserver/common/addresses_test.go 1970-01-01 00:00:00 +0000
205+++ state/apiserver/common/addresses_test.go 2013-09-26 13:42:07 +0000
206@@ -0,0 +1,45 @@
207+// Copyright 2013 Canonical Ltd.
208+// Licensed under the AGPLv3, see LICENCE file for details.
209+
210+package common_test
211+
212+import (
213+ gc "launchpad.net/gocheck"
214+
215+ "launchpad.net/juju-core/juju/testing"
216+ "launchpad.net/juju-core/state/apiserver/common"
217+)
218+
219+type addresserSuite struct {
220+ testing.JujuConnSuite
221+ addresser *common.Addresser
222+}
223+
224+var _ = gc.Suite(&addresserSuite{})
225+
226+func (s *addresserSuite) SetUpTest(c *gc.C) {
227+ s.JujuConnSuite.SetUpTest(c)
228+ s.addresser = common.NewAddresser(s.State)
229+}
230+
231+func (s *addresserSuite) TestStateAddresses(c *gc.C) {
232+ stateAddresses, err := s.State.Addresses()
233+ c.Assert(err, gc.IsNil)
234+
235+ result, err := s.addresser.StateAddresses()
236+ c.Assert(err, gc.IsNil)
237+ c.Assert(result.Result, gc.DeepEquals, stateAddresses)
238+}
239+
240+func (s *addresserSuite) TestAPIAddresses(c *gc.C) {
241+ apiInfo := s.APIInfo(c)
242+
243+ result, err := s.addresser.APIAddresses()
244+ c.Assert(err, gc.IsNil)
245+ c.Assert(result.Result, gc.DeepEquals, apiInfo.Addrs)
246+}
247+
248+func (s *addresserSuite) TestCACert(c *gc.C) {
249+ result := s.addresser.CACert()
250+ c.Assert(result.Result, gc.DeepEquals, s.State.CACert())
251+}
252
253=== modified file 'state/apiserver/common/common_test.go'
254--- state/apiserver/common/common_test.go 2013-08-16 15:25:46 +0000
255+++ state/apiserver/common/common_test.go 2013-09-26 13:42:07 +0000
256@@ -10,10 +10,11 @@
257 gc "launchpad.net/gocheck"
258
259 "launchpad.net/juju-core/state/apiserver/common"
260+ coretesting "launchpad.net/juju-core/testing"
261 )
262
263 func TestAll(t *stdtesting.T) {
264- gc.TestingT(t)
265+ coretesting.MgoTestPackage(t)
266 }
267
268 type commonSuite struct{}
269
270=== modified file 'state/apiserver/deployer/deployer.go'
271--- state/apiserver/deployer/deployer.go 2013-09-17 12:17:13 +0000
272+++ state/apiserver/deployer/deployer.go 2013-09-26 13:42:07 +0000
273@@ -6,10 +6,8 @@
274 import (
275 "fmt"
276
277- "launchpad.net/juju-core/environs"
278 "launchpad.net/juju-core/names"
279 "launchpad.net/juju-core/state"
280- "launchpad.net/juju-core/state/api"
281 "launchpad.net/juju-core/state/api/params"
282 "launchpad.net/juju-core/state/apiserver/common"
283 "launchpad.net/juju-core/state/watcher"
284@@ -20,6 +18,7 @@
285 *common.Remover
286 *common.PasswordChanger
287 *common.LifeGetter
288+ *common.Addresser
289
290 st *state.State
291 resources *common.Resources
292@@ -76,6 +75,7 @@
293 Remover: common.NewRemover(st, true, getAuthFunc),
294 PasswordChanger: common.NewPasswordChanger(st, getAuthFunc),
295 LifeGetter: common.NewLifeGetter(st, getAuthFunc),
296+ Addresser: common.NewAddresser(st),
297 st: st,
298 resources: resources,
299 authorizer: authorizer,
300@@ -120,64 +120,3 @@
301 }
302 return result, nil
303 }
304-
305-// getEnvironStateInfo returns the state and API connection
306-// information from the state and the environment.
307-//
308-// TODO(dimitern): Remove this once we have a way to get state/API
309-// public addresses from state.
310-// BUG(lp:1205371): This is temporary, until the Addresser worker
311-// lands and we can take the addresses of all machines with
312-// JobManageState.
313-func (d *DeployerAPI) getEnvironStateInfo() (*state.Info, *api.Info, error) {
314- cfg, err := d.st.EnvironConfig()
315- if err != nil {
316- return nil, nil, err
317- }
318- env, err := environs.New(cfg)
319- if err != nil {
320- return nil, nil, err
321- }
322- return env.StateInfo()
323-}
324-
325-// StateAddresses returns the list of addresses used to connect to the state.
326-//
327-// TODO(dimitern): Remove this once we have a way to get state/API
328-// public addresses from state.
329-// BUG(lp:1205371): This is temporary, until the Addresser worker
330-// lands and we can take the addresses of all machines with
331-// JobManageState.
332-func (d *DeployerAPI) StateAddresses() (params.StringsResult, error) {
333- stateInfo, _, err := d.getEnvironStateInfo()
334- if err != nil {
335- return params.StringsResult{}, err
336- }
337- return params.StringsResult{
338- Result: stateInfo.Addrs,
339- }, nil
340-}
341-
342-// APIAddresses returns the list of addresses used to connect to the API.
343-//
344-// TODO(dimitern): Remove this once we have a way to get state/API
345-// public addresses from state.
346-// BUG(lp:1205371): This is temporary, until the Addresser worker
347-// lands and we can take the addresses of all machines with
348-// JobManageState.
349-func (d *DeployerAPI) APIAddresses() (params.StringsResult, error) {
350- _, apiInfo, err := d.getEnvironStateInfo()
351- if err != nil {
352- return params.StringsResult{}, err
353- }
354- return params.StringsResult{
355- Result: apiInfo.Addrs,
356- }, nil
357-}
358-
359-// CACert returns the certificate used to validate the state connection.
360-func (d *DeployerAPI) CACert() params.BytesResult {
361- return params.BytesResult{
362- Result: d.st.CACert(),
363- }
364-}
365
366=== modified file 'state/apiserver/provisioner/provisioner.go'
367--- state/apiserver/provisioner/provisioner.go 2013-09-19 14:25:23 +0000
368+++ state/apiserver/provisioner/provisioner.go 2013-09-26 13:42:07 +0000
369@@ -22,6 +22,7 @@
370 *common.DeadEnsurer
371 *common.PasswordChanger
372 *common.LifeGetter
373+ *common.Addresser
374
375 st *state.State
376 resources *common.Resources
377@@ -69,6 +70,7 @@
378 DeadEnsurer: common.NewDeadEnsurer(st, getAuthFunc),
379 PasswordChanger: common.NewPasswordChanger(st, getAuthFunc),
380 LifeGetter: common.NewLifeGetter(st, getAuthFunc),
381+ Addresser: common.NewAddresser(st),
382 st: st,
383 resources: resources,
384 authorizer: authorizer,
385
386=== modified file 'state/apiserver/provisioner/provisioner_test.go'
387--- state/apiserver/provisioner/provisioner_test.go 2013-09-24 08:55:01 +0000
388+++ state/apiserver/provisioner/provisioner_test.go 2013-09-26 13:42:07 +0000
389@@ -621,3 +621,31 @@
390 c.Assert(err, gc.ErrorMatches, "permission denied")
391 c.Assert(result, gc.DeepEquals, params.StringsWatchResult{})
392 }
393+
394+func (s *provisionerSuite) TestStateAddresses(c *gc.C) {
395+ addresses, err := s.State.Addresses()
396+ c.Assert(err, gc.IsNil)
397+
398+ result, err := s.provisioner.StateAddresses()
399+ c.Assert(err, gc.IsNil)
400+ c.Assert(result, gc.DeepEquals, params.StringsResult{
401+ Result: addresses,
402+ })
403+}
404+
405+func (s *provisionerSuite) TestAPIAddresses(c *gc.C) {
406+ apiInfo := s.APIInfo(c)
407+
408+ result, err := s.provisioner.APIAddresses()
409+ c.Assert(err, gc.IsNil)
410+ c.Assert(result, gc.DeepEquals, params.StringsResult{
411+ Result: apiInfo.Addrs,
412+ })
413+}
414+
415+func (s *provisionerSuite) TestCACert(c *gc.C) {
416+ result := s.provisioner.CACert()
417+ c.Assert(result, gc.DeepEquals, params.BytesResult{
418+ Result: s.State.CACert(),
419+ })
420+}
421
422=== modified file 'worker/provisioner/authentication.go'
423--- worker/provisioner/authentication.go 2013-09-25 16:18:20 +0000
424+++ worker/provisioner/authentication.go 2013-09-26 13:42:07 +0000
425@@ -6,10 +6,10 @@
426 import (
427 "fmt"
428
429- "launchpad.net/juju-core/agent"
430 "launchpad.net/juju-core/environs"
431 "launchpad.net/juju-core/state"
432 "launchpad.net/juju-core/state/api"
433+ apiprovisioner "launchpad.net/juju-core/state/api/provisioner"
434 "launchpad.net/juju-core/utils"
435 )
436
437@@ -35,18 +35,28 @@
438 return &simpleAuth{stateInfo, apiInfo}, nil
439 }
440
441-// NewAgentConfigAuthenticator gets the state and api info once from
442-// the agent configuration.
443-func NewAgentConfigAuthenticator(agentConfig agent.Config) (AuthenticationProvider, error) {
444- // TODO(dimitern) Take these from the API, like the deployer does,
445- // so we'll always have up-to-date addresses.
446+// NewAPIAuthenticator gets the state and api info once from the
447+// provisioner API.
448+func NewAPIAuthenticator(st *apiprovisioner.State) (AuthenticationProvider, error) {
449+ stateAddresses, err := st.StateAddresses()
450+ if err != nil {
451+ return nil, err
452+ }
453+ apiAddresses, err := st.APIAddresses()
454+ if err != nil {
455+ return nil, err
456+ }
457+ caCert, err := st.CACert()
458+ if err != nil {
459+ return nil, err
460+ }
461 stateInfo := &state.Info{
462- Addrs: agentConfig.StateAddresses(),
463- CACert: agentConfig.CACert(),
464+ Addrs: stateAddresses,
465+ CACert: caCert,
466 }
467 apiInfo := &api.Info{
468- Addrs: agentConfig.APIAddresses(),
469- CACert: agentConfig.CACert(),
470+ Addrs: apiAddresses,
471+ CACert: caCert,
472 }
473 return &simpleAuth{stateInfo, apiInfo}, nil
474 }
475
476=== modified file 'worker/provisioner/provisioner.go'
477--- worker/provisioner/provisioner.go 2013-09-25 16:18:20 +0000
478+++ worker/provisioner/provisioner.go 2013-09-26 13:42:07 +0000
479@@ -99,7 +99,7 @@
480 environConfigChanges = nil
481 }
482
483- auth, err := NewAgentConfigAuthenticator(p.agentConfig)
484+ auth, err := NewAPIAuthenticator(p.st)
485 if err != nil {
486 return err
487 }

Subscribers

People subscribed via source and target branches

to status/vote changes: