github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/worker/apicaller/open_test.go (about) 1 // Copyright 2012-2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package apicaller 5 6 import ( 7 "fmt" 8 9 "github.com/juju/utils" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/agent" 13 "github.com/juju/juju/api" 14 "github.com/juju/juju/apiserver/params" 15 "github.com/juju/juju/state/multiwatcher" 16 coretesting "github.com/juju/juju/testing" 17 "github.com/juju/juju/worker" 18 ) 19 20 type OpenAPIStateSuite struct { 21 coretesting.BaseSuite 22 } 23 24 var _ = gc.Suite(&OpenAPIStateSuite{}) 25 26 func (s *OpenAPIStateSuite) SetUpTest(c *gc.C) { 27 s.BaseSuite.SetUpTest(c) 28 s.PatchValue(&checkProvisionedStrategy, utils.AttemptStrategy{}) 29 } 30 31 func (s *OpenAPIStateSuite) TestOpenAPIStateReplaceErrors(c *gc.C) { 32 type replaceErrors struct { 33 openErr error 34 replaceErr error 35 } 36 var apiError error 37 s.PatchValue(&apiOpen, func(info *api.Info, opts api.DialOpts) (api.Connection, error) { 38 return nil, apiError 39 }) 40 errReplacePairs := []replaceErrors{{ 41 fmt.Errorf("blah"), nil, 42 }, { 43 openErr: ¶ms.Error{Code: params.CodeNotProvisioned}, 44 replaceErr: worker.ErrTerminateAgent, 45 }, { 46 openErr: ¶ms.Error{Code: params.CodeUnauthorized}, 47 replaceErr: worker.ErrTerminateAgent, 48 }} 49 for i, test := range errReplacePairs { 50 c.Logf("test %d", i) 51 apiError = test.openErr 52 _, _, err := OpenAPIState(fakeAgent{}) 53 if test.replaceErr == nil { 54 c.Check(err, gc.Equals, test.openErr) 55 } else { 56 c.Check(err, gc.Equals, test.replaceErr) 57 } 58 } 59 } 60 61 func (s *OpenAPIStateSuite) TestOpenAPIStateWaitsProvisioned(c *gc.C) { 62 s.PatchValue(&checkProvisionedStrategy.Min, 5) 63 var called int 64 s.PatchValue(&apiOpen, func(info *api.Info, opts api.DialOpts) (api.Connection, error) { 65 called++ 66 if called == checkProvisionedStrategy.Min-1 { 67 return nil, ¶ms.Error{Code: params.CodeUnauthorized} 68 } 69 return nil, ¶ms.Error{Code: params.CodeNotProvisioned} 70 }) 71 _, _, err := OpenAPIState(fakeAgent{}) 72 c.Assert(err, gc.Equals, worker.ErrTerminateAgent) 73 c.Assert(called, gc.Equals, checkProvisionedStrategy.Min-1) 74 } 75 76 func (s *OpenAPIStateSuite) TestOpenAPIStateWaitsProvisionedGivesUp(c *gc.C) { 77 s.PatchValue(&checkProvisionedStrategy.Min, 5) 78 var called int 79 s.PatchValue(&apiOpen, func(info *api.Info, opts api.DialOpts) (api.Connection, error) { 80 called++ 81 return nil, ¶ms.Error{Code: params.CodeNotProvisioned} 82 }) 83 _, _, err := OpenAPIState(fakeAgent{}) 84 c.Assert(err, gc.Equals, worker.ErrTerminateAgent) 85 // +1 because we always attempt at least once outside the attempt strategy 86 // (twice if the API server initially returns CodeUnauthorized.) 87 c.Assert(called, gc.Equals, checkProvisionedStrategy.Min+1) 88 } 89 90 type fakeAgent struct { 91 agent.Agent 92 } 93 94 func (fakeAgent) CurrentConfig() agent.Config { 95 return fakeAPIOpenConfig{} 96 } 97 98 type fakeAPIOpenConfig struct { 99 agent.Config 100 } 101 102 func (fakeAPIOpenConfig) APIInfo() *api.Info { return &api.Info{} } 103 func (fakeAPIOpenConfig) OldPassword() string { return "old" } 104 func (fakeAPIOpenConfig) Jobs() []multiwatcher.MachineJob { return []multiwatcher.MachineJob{} }