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
=== modified file 'agent/agent.go'
--- agent/agent.go 2013-09-25 16:18:20 +0000
+++ agent/agent.go 2013-09-26 13:42:07 +0000
@@ -87,12 +87,6 @@
87 // api connections.87 // api connections.
88 PasswordHash() string88 PasswordHash() string
8989
90 // StateAddresses returns all known state server addresses.
91 StateAddresses() []string
92
93 // APIAddresses returns all known API server addresses.
94 APIAddresses() []string
95
96 // APIServerDetails returns the details needed to run an API server.90 // APIServerDetails returns the details needed to run an API server.
97 APIServerDetails() (port int, cert, key []byte)91 APIServerDetails() (port int, cert, key []byte)
9892
@@ -311,18 +305,6 @@
311 }305 }
312}306}
313307
314func (c *configInternal) StateAddresses() []string {
315 addresses := make([]string, len(c.stateDetails.addresses))
316 copy(addresses, c.stateDetails.addresses)
317 return addresses
318}
319
320func (c *configInternal) APIAddresses() []string {
321 addresses := make([]string, len(c.apiDetails.addresses))
322 copy(addresses, c.apiDetails.addresses)
323 return addresses
324}
325
326func (c *configInternal) APIServerDetails() (port int, cert, key []byte) {308func (c *configInternal) APIServerDetails() (port int, cert, key []byte) {
327 return c.apiPort, c.stateServerCert, c.stateServerKey309 return c.apiPort, c.stateServerCert, c.stateServerKey
328}310}
329311
=== modified file 'state/api/provisioner/provisioner.go'
--- state/api/provisioner/provisioner.go 2013-09-19 12:10:31 +0000
+++ state/api/provisioner/provisioner.go 2013-09-26 13:42:07 +0000
@@ -101,3 +101,33 @@
101 w := watcher.NewStringsWatcher(st.caller, result)101 w := watcher.NewStringsWatcher(st.caller, result)
102 return w, nil102 return w, nil
103}103}
104
105// StateAddresses returns the list of addresses used to connect to the state.
106func (st *State) StateAddresses() ([]string, error) {
107 var result params.StringsResult
108 err := st.caller.Call("Provisioner", "", "StateAddresses", nil, &result)
109 if err != nil {
110 return nil, err
111 }
112 return result.Result, nil
113}
114
115// APIAddresses returns the list of addresses used to connect to the API.
116func (st *State) APIAddresses() ([]string, error) {
117 var result params.StringsResult
118 err := st.caller.Call("Provisioner", "", "APIAddresses", nil, &result)
119 if err != nil {
120 return nil, err
121 }
122 return result.Result, nil
123}
124
125// CACert returns the certificate used to validate the state connection.
126func (st *State) CACert() ([]byte, error) {
127 var result params.BytesResult
128 err := st.caller.Call("Provisioner", "", "CACert", nil, &result)
129 if err != nil {
130 return nil, err
131 }
132 return result.Result, nil
133}
104134
=== modified file 'state/api/provisioner/provisioner_test.go'
--- state/api/provisioner/provisioner_test.go 2013-09-19 12:10:31 +0000
+++ state/api/provisioner/provisioner_test.go 2013-09-26 13:42:07 +0000
@@ -337,3 +337,26 @@
337 statetesting.AssertStop(c, w)337 statetesting.AssertStop(c, w)
338 wc.AssertClosed()338 wc.AssertClosed()
339}339}
340
341func (s *provisionerSuite) TestStateAddresses(c *gc.C) {
342 stateAddresses, err := s.State.Addresses()
343 c.Assert(err, gc.IsNil)
344
345 addresses, err := s.provisioner.StateAddresses()
346 c.Assert(err, gc.IsNil)
347 c.Assert(addresses, gc.DeepEquals, stateAddresses)
348}
349
350func (s *provisionerSuite) TestAPIAddresses(c *gc.C) {
351 apiInfo := s.APIInfo(c)
352
353 addresses, err := s.provisioner.APIAddresses()
354 c.Assert(err, gc.IsNil)
355 c.Assert(addresses, gc.DeepEquals, apiInfo.Addrs)
356}
357
358func (s *provisionerSuite) TestCACert(c *gc.C) {
359 caCert, err := s.provisioner.CACert()
360 c.Assert(err, gc.IsNil)
361 c.Assert(caCert, gc.DeepEquals, s.State.CACert())
362}
340363
=== added file 'state/apiserver/common/addresses.go'
--- state/apiserver/common/addresses.go 1970-01-01 00:00:00 +0000
+++ state/apiserver/common/addresses.go 2013-09-26 13:42:07 +0000
@@ -0,0 +1,92 @@
1// Copyright 2013 Canonical Ltd.
2// Licensed under the AGPLv3, see LICENCE file for details.
3
4package common
5
6import (
7 "launchpad.net/juju-core/environs"
8 "launchpad.net/juju-core/environs/config"
9 "launchpad.net/juju-core/state"
10 "launchpad.net/juju-core/state/api"
11 "launchpad.net/juju-core/state/api/params"
12)
13
14// EnvironConfigAndCertGetter defines EnvironConfig and CACert
15// methods.
16type EnvironConfigAndCertGetter interface {
17 EnvironConfig() (*config.Config, error)
18 CACert() []byte
19}
20
21// Addresser implements a common set of methods for getting state and
22// API server addresses, and the CA certificate used to authenticate
23// them.
24type Addresser struct {
25 st EnvironConfigAndCertGetter
26}
27
28// NewAddresser returns a new Addresser.
29func NewAddresser(st EnvironConfigAndCertGetter) *Addresser {
30 return &Addresser{st}
31}
32
33// getEnvironStateInfo returns the state and API connection
34// information from the state and the environment.
35//
36// TODO(dimitern): Remove this once we have a way to get state/API
37// public addresses from state.
38// BUG(lp:1205371): This is temporary, until the Addresser worker
39// lands and we can take the addresses of all machines with
40// JobManageState.
41func (a *Addresser) getEnvironStateInfo() (*state.Info, *api.Info, error) {
42 cfg, err := a.st.EnvironConfig()
43 if err != nil {
44 return nil, nil, err
45 }
46 env, err := environs.New(cfg)
47 if err != nil {
48 return nil, nil, err
49 }
50 return env.StateInfo()
51}
52
53// StateAddresses returns the list of addresses used to connect to the state.
54//
55// TODO(dimitern): Remove this once we have a way to get state/API
56// public addresses from state.
57// BUG(lp:1205371): This is temporary, until the Addresser worker
58// lands and we can take the addresses of all machines with
59// JobManageState.
60func (a *Addresser) StateAddresses() (params.StringsResult, error) {
61 stateInfo, _, err := a.getEnvironStateInfo()
62 if err != nil {
63 return params.StringsResult{}, err
64 }
65 return params.StringsResult{
66 Result: stateInfo.Addrs,
67 }, nil
68}
69
70// APIAddresses returns the list of addresses used to connect to the API.
71//
72// TODO(dimitern): Remove this once we have a way to get state/API
73// public addresses from state.
74// BUG(lp:1205371): This is temporary, until the Addresser worker
75// lands and we can take the addresses of all machines with
76// JobManageState.
77func (a *Addresser) APIAddresses() (params.StringsResult, error) {
78 _, apiInfo, err := a.getEnvironStateInfo()
79 if err != nil {
80 return params.StringsResult{}, err
81 }
82 return params.StringsResult{
83 Result: apiInfo.Addrs,
84 }, nil
85}
86
87// CACert returns the certificate used to validate the state connection.
88func (a *Addresser) CACert() params.BytesResult {
89 return params.BytesResult{
90 Result: a.st.CACert(),
91 }
92}
093
=== added file 'state/apiserver/common/addresses_test.go'
--- state/apiserver/common/addresses_test.go 1970-01-01 00:00:00 +0000
+++ state/apiserver/common/addresses_test.go 2013-09-26 13:42:07 +0000
@@ -0,0 +1,45 @@
1// Copyright 2013 Canonical Ltd.
2// Licensed under the AGPLv3, see LICENCE file for details.
3
4package common_test
5
6import (
7 gc "launchpad.net/gocheck"
8
9 "launchpad.net/juju-core/juju/testing"
10 "launchpad.net/juju-core/state/apiserver/common"
11)
12
13type addresserSuite struct {
14 testing.JujuConnSuite
15 addresser *common.Addresser
16}
17
18var _ = gc.Suite(&addresserSuite{})
19
20func (s *addresserSuite) SetUpTest(c *gc.C) {
21 s.JujuConnSuite.SetUpTest(c)
22 s.addresser = common.NewAddresser(s.State)
23}
24
25func (s *addresserSuite) TestStateAddresses(c *gc.C) {
26 stateAddresses, err := s.State.Addresses()
27 c.Assert(err, gc.IsNil)
28
29 result, err := s.addresser.StateAddresses()
30 c.Assert(err, gc.IsNil)
31 c.Assert(result.Result, gc.DeepEquals, stateAddresses)
32}
33
34func (s *addresserSuite) TestAPIAddresses(c *gc.C) {
35 apiInfo := s.APIInfo(c)
36
37 result, err := s.addresser.APIAddresses()
38 c.Assert(err, gc.IsNil)
39 c.Assert(result.Result, gc.DeepEquals, apiInfo.Addrs)
40}
41
42func (s *addresserSuite) TestCACert(c *gc.C) {
43 result := s.addresser.CACert()
44 c.Assert(result.Result, gc.DeepEquals, s.State.CACert())
45}
046
=== modified file 'state/apiserver/common/common_test.go'
--- state/apiserver/common/common_test.go 2013-08-16 15:25:46 +0000
+++ state/apiserver/common/common_test.go 2013-09-26 13:42:07 +0000
@@ -10,10 +10,11 @@
10 gc "launchpad.net/gocheck"10 gc "launchpad.net/gocheck"
1111
12 "launchpad.net/juju-core/state/apiserver/common"12 "launchpad.net/juju-core/state/apiserver/common"
13 coretesting "launchpad.net/juju-core/testing"
13)14)
1415
15func TestAll(t *stdtesting.T) {16func TestAll(t *stdtesting.T) {
16 gc.TestingT(t)17 coretesting.MgoTestPackage(t)
17}18}
1819
19type commonSuite struct{}20type commonSuite struct{}
2021
=== modified file 'state/apiserver/deployer/deployer.go'
--- state/apiserver/deployer/deployer.go 2013-09-17 12:17:13 +0000
+++ state/apiserver/deployer/deployer.go 2013-09-26 13:42:07 +0000
@@ -6,10 +6,8 @@
6import (6import (
7 "fmt"7 "fmt"
88
9 "launchpad.net/juju-core/environs"
10 "launchpad.net/juju-core/names"9 "launchpad.net/juju-core/names"
11 "launchpad.net/juju-core/state"10 "launchpad.net/juju-core/state"
12 "launchpad.net/juju-core/state/api"
13 "launchpad.net/juju-core/state/api/params"11 "launchpad.net/juju-core/state/api/params"
14 "launchpad.net/juju-core/state/apiserver/common"12 "launchpad.net/juju-core/state/apiserver/common"
15 "launchpad.net/juju-core/state/watcher"13 "launchpad.net/juju-core/state/watcher"
@@ -20,6 +18,7 @@
20 *common.Remover18 *common.Remover
21 *common.PasswordChanger19 *common.PasswordChanger
22 *common.LifeGetter20 *common.LifeGetter
21 *common.Addresser
2322
24 st *state.State23 st *state.State
25 resources *common.Resources24 resources *common.Resources
@@ -76,6 +75,7 @@
76 Remover: common.NewRemover(st, true, getAuthFunc),75 Remover: common.NewRemover(st, true, getAuthFunc),
77 PasswordChanger: common.NewPasswordChanger(st, getAuthFunc),76 PasswordChanger: common.NewPasswordChanger(st, getAuthFunc),
78 LifeGetter: common.NewLifeGetter(st, getAuthFunc),77 LifeGetter: common.NewLifeGetter(st, getAuthFunc),
78 Addresser: common.NewAddresser(st),
79 st: st,79 st: st,
80 resources: resources,80 resources: resources,
81 authorizer: authorizer,81 authorizer: authorizer,
@@ -120,64 +120,3 @@
120 }120 }
121 return result, nil121 return result, nil
122}122}
123
124// getEnvironStateInfo returns the state and API connection
125// information from the state and the environment.
126//
127// TODO(dimitern): Remove this once we have a way to get state/API
128// public addresses from state.
129// BUG(lp:1205371): This is temporary, until the Addresser worker
130// lands and we can take the addresses of all machines with
131// JobManageState.
132func (d *DeployerAPI) getEnvironStateInfo() (*state.Info, *api.Info, error) {
133 cfg, err := d.st.EnvironConfig()
134 if err != nil {
135 return nil, nil, err
136 }
137 env, err := environs.New(cfg)
138 if err != nil {
139 return nil, nil, err
140 }
141 return env.StateInfo()
142}
143
144// StateAddresses returns the list of addresses used to connect to the state.
145//
146// TODO(dimitern): Remove this once we have a way to get state/API
147// public addresses from state.
148// BUG(lp:1205371): This is temporary, until the Addresser worker
149// lands and we can take the addresses of all machines with
150// JobManageState.
151func (d *DeployerAPI) StateAddresses() (params.StringsResult, error) {
152 stateInfo, _, err := d.getEnvironStateInfo()
153 if err != nil {
154 return params.StringsResult{}, err
155 }
156 return params.StringsResult{
157 Result: stateInfo.Addrs,
158 }, nil
159}
160
161// APIAddresses returns the list of addresses used to connect to the API.
162//
163// TODO(dimitern): Remove this once we have a way to get state/API
164// public addresses from state.
165// BUG(lp:1205371): This is temporary, until the Addresser worker
166// lands and we can take the addresses of all machines with
167// JobManageState.
168func (d *DeployerAPI) APIAddresses() (params.StringsResult, error) {
169 _, apiInfo, err := d.getEnvironStateInfo()
170 if err != nil {
171 return params.StringsResult{}, err
172 }
173 return params.StringsResult{
174 Result: apiInfo.Addrs,
175 }, nil
176}
177
178// CACert returns the certificate used to validate the state connection.
179func (d *DeployerAPI) CACert() params.BytesResult {
180 return params.BytesResult{
181 Result: d.st.CACert(),
182 }
183}
184123
=== modified file 'state/apiserver/provisioner/provisioner.go'
--- state/apiserver/provisioner/provisioner.go 2013-09-19 14:25:23 +0000
+++ state/apiserver/provisioner/provisioner.go 2013-09-26 13:42:07 +0000
@@ -22,6 +22,7 @@
22 *common.DeadEnsurer22 *common.DeadEnsurer
23 *common.PasswordChanger23 *common.PasswordChanger
24 *common.LifeGetter24 *common.LifeGetter
25 *common.Addresser
2526
26 st *state.State27 st *state.State
27 resources *common.Resources28 resources *common.Resources
@@ -69,6 +70,7 @@
69 DeadEnsurer: common.NewDeadEnsurer(st, getAuthFunc),70 DeadEnsurer: common.NewDeadEnsurer(st, getAuthFunc),
70 PasswordChanger: common.NewPasswordChanger(st, getAuthFunc),71 PasswordChanger: common.NewPasswordChanger(st, getAuthFunc),
71 LifeGetter: common.NewLifeGetter(st, getAuthFunc),72 LifeGetter: common.NewLifeGetter(st, getAuthFunc),
73 Addresser: common.NewAddresser(st),
72 st: st,74 st: st,
73 resources: resources,75 resources: resources,
74 authorizer: authorizer,76 authorizer: authorizer,
7577
=== modified file 'state/apiserver/provisioner/provisioner_test.go'
--- state/apiserver/provisioner/provisioner_test.go 2013-09-24 08:55:01 +0000
+++ state/apiserver/provisioner/provisioner_test.go 2013-09-26 13:42:07 +0000
@@ -621,3 +621,31 @@
621 c.Assert(err, gc.ErrorMatches, "permission denied")621 c.Assert(err, gc.ErrorMatches, "permission denied")
622 c.Assert(result, gc.DeepEquals, params.StringsWatchResult{})622 c.Assert(result, gc.DeepEquals, params.StringsWatchResult{})
623}623}
624
625func (s *provisionerSuite) TestStateAddresses(c *gc.C) {
626 addresses, err := s.State.Addresses()
627 c.Assert(err, gc.IsNil)
628
629 result, err := s.provisioner.StateAddresses()
630 c.Assert(err, gc.IsNil)
631 c.Assert(result, gc.DeepEquals, params.StringsResult{
632 Result: addresses,
633 })
634}
635
636func (s *provisionerSuite) TestAPIAddresses(c *gc.C) {
637 apiInfo := s.APIInfo(c)
638
639 result, err := s.provisioner.APIAddresses()
640 c.Assert(err, gc.IsNil)
641 c.Assert(result, gc.DeepEquals, params.StringsResult{
642 Result: apiInfo.Addrs,
643 })
644}
645
646func (s *provisionerSuite) TestCACert(c *gc.C) {
647 result := s.provisioner.CACert()
648 c.Assert(result, gc.DeepEquals, params.BytesResult{
649 Result: s.State.CACert(),
650 })
651}
624652
=== modified file 'worker/provisioner/authentication.go'
--- worker/provisioner/authentication.go 2013-09-25 16:18:20 +0000
+++ worker/provisioner/authentication.go 2013-09-26 13:42:07 +0000
@@ -6,10 +6,10 @@
6import (6import (
7 "fmt"7 "fmt"
88
9 "launchpad.net/juju-core/agent"
10 "launchpad.net/juju-core/environs"9 "launchpad.net/juju-core/environs"
11 "launchpad.net/juju-core/state"10 "launchpad.net/juju-core/state"
12 "launchpad.net/juju-core/state/api"11 "launchpad.net/juju-core/state/api"
12 apiprovisioner "launchpad.net/juju-core/state/api/provisioner"
13 "launchpad.net/juju-core/utils"13 "launchpad.net/juju-core/utils"
14)14)
1515
@@ -35,18 +35,28 @@
35 return &simpleAuth{stateInfo, apiInfo}, nil35 return &simpleAuth{stateInfo, apiInfo}, nil
36}36}
3737
38// NewAgentConfigAuthenticator gets the state and api info once from38// NewAPIAuthenticator gets the state and api info once from the
39// the agent configuration.39// provisioner API.
40func NewAgentConfigAuthenticator(agentConfig agent.Config) (AuthenticationProvider, error) {40func NewAPIAuthenticator(st *apiprovisioner.State) (AuthenticationProvider, error) {
41 // TODO(dimitern) Take these from the API, like the deployer does,41 stateAddresses, err := st.StateAddresses()
42 // so we'll always have up-to-date addresses.42 if err != nil {
43 return nil, err
44 }
45 apiAddresses, err := st.APIAddresses()
46 if err != nil {
47 return nil, err
48 }
49 caCert, err := st.CACert()
50 if err != nil {
51 return nil, err
52 }
43 stateInfo := &state.Info{53 stateInfo := &state.Info{
44 Addrs: agentConfig.StateAddresses(),54 Addrs: stateAddresses,
45 CACert: agentConfig.CACert(),55 CACert: caCert,
46 }56 }
47 apiInfo := &api.Info{57 apiInfo := &api.Info{
48 Addrs: agentConfig.APIAddresses(),58 Addrs: apiAddresses,
49 CACert: agentConfig.CACert(),59 CACert: caCert,
50 }60 }
51 return &simpleAuth{stateInfo, apiInfo}, nil61 return &simpleAuth{stateInfo, apiInfo}, nil
52}62}
5363
=== modified file 'worker/provisioner/provisioner.go'
--- worker/provisioner/provisioner.go 2013-09-25 16:18:20 +0000
+++ worker/provisioner/provisioner.go 2013-09-26 13:42:07 +0000
@@ -99,7 +99,7 @@
99 environConfigChanges = nil99 environConfigChanges = nil
100 }100 }
101101
102 auth, err := NewAgentConfigAuthenticator(p.agentConfig)102 auth, err := NewAPIAuthenticator(p.st)
103 if err != nil {103 if err != nil {
104 return err104 return err
105 }105 }

Subscribers

People subscribed via source and target branches

to status/vote changes: