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:    &params.Error{Code: params.CodeNotProvisioned},
    44  		replaceErr: worker.ErrTerminateAgent,
    45  	}, {
    46  		openErr:    &params.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, &params.Error{Code: params.CodeUnauthorized}
    68  		}
    69  		return nil, &params.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, &params.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{} }