github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/apiserver/agenttools/agenttools_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package agenttools
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	"github.com/juju/version"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/environs"
    13  	"github.com/juju/juju/environs/config"
    14  	"github.com/juju/juju/state"
    15  	coretesting "github.com/juju/juju/testing"
    16  	coretools "github.com/juju/juju/tools"
    17  )
    18  
    19  var _ = gc.Suite(&AgentToolsSuite{})
    20  
    21  type AgentToolsSuite struct {
    22  	coretesting.BaseSuite
    23  }
    24  
    25  type dummyEnviron struct {
    26  	environs.Environ
    27  }
    28  
    29  type configGetter struct {
    30  	cfg *config.Config
    31  }
    32  
    33  func (s *configGetter) ModelConfig() (*config.Config, error) {
    34  	return s.cfg, nil
    35  }
    36  
    37  func (s *AgentToolsSuite) TestCheckTools(c *gc.C) {
    38  	sConfig := coretesting.FakeConfig()
    39  	sConfig = sConfig.Merge(coretesting.Attrs{
    40  		"agent-version": "2.5.0",
    41  	})
    42  	cfg, err := config.New(config.NoDefaults, sConfig)
    43  	c.Assert(err, jc.ErrorIsNil)
    44  	var (
    45  		calledWithMajor, calledWithMinor int
    46  	)
    47  	fakeToolFinder := func(e environs.Environ, maj int, min int, stream string, filter coretools.Filter) (coretools.List, error) {
    48  		calledWithMajor = maj
    49  		calledWithMinor = min
    50  		ver := version.Binary{Number: version.Number{Major: maj, Minor: min}}
    51  		t := coretools.Tools{Version: ver, URL: "http://example.com", Size: 1}
    52  		c.Assert(calledWithMajor, gc.Equals, 2)
    53  		c.Assert(calledWithMinor, gc.Equals, 5)
    54  		c.Assert(stream, gc.Equals, "released")
    55  		return coretools.List{&t}, nil
    56  	}
    57  
    58  	ver, err := checkToolsAvailability(getDummyEnviron, cfg, fakeToolFinder)
    59  	c.Assert(err, jc.ErrorIsNil)
    60  	c.Assert(ver, gc.Not(gc.Equals), version.Zero)
    61  	c.Assert(ver, gc.Equals, version.Number{Major: 2, Minor: 5, Patch: 0})
    62  }
    63  
    64  func (s *AgentToolsSuite) TestCheckToolsNonReleasedStream(c *gc.C) {
    65  	sConfig := coretesting.FakeConfig()
    66  	sConfig = sConfig.Merge(coretesting.Attrs{
    67  		"agent-version": "2.5-alpha1",
    68  		"agent-stream":  "proposed",
    69  	})
    70  	cfg, err := config.New(config.NoDefaults, sConfig)
    71  	c.Assert(err, jc.ErrorIsNil)
    72  	var (
    73  		calledWithMajor, calledWithMinor int
    74  		calledWithStreams                []string
    75  	)
    76  	fakeToolFinder := func(e environs.Environ, maj int, min int, stream string, filter coretools.Filter) (coretools.List, error) {
    77  		calledWithMajor = maj
    78  		calledWithMinor = min
    79  		calledWithStreams = append(calledWithStreams, stream)
    80  		if stream == "released" {
    81  			return nil, coretools.ErrNoMatches
    82  		}
    83  		ver := version.Binary{Number: version.Number{Major: maj, Minor: min}}
    84  		t := coretools.Tools{Version: ver, URL: "http://example.com", Size: 1}
    85  		c.Assert(calledWithMajor, gc.Equals, 2)
    86  		c.Assert(calledWithMinor, gc.Equals, 5)
    87  		return coretools.List{&t}, nil
    88  	}
    89  	ver, err := checkToolsAvailability(getDummyEnviron, cfg, fakeToolFinder)
    90  	c.Assert(err, jc.ErrorIsNil)
    91  	c.Assert(calledWithStreams, gc.DeepEquals, []string{"released", "proposed"})
    92  	c.Assert(ver, gc.Not(gc.Equals), version.Zero)
    93  	c.Assert(ver, gc.Equals, version.Number{Major: 2, Minor: 5, Patch: 0})
    94  }
    95  
    96  type mockState struct {
    97  	configGetter
    98  }
    99  
   100  func (e *mockState) Model() (*state.Model, error) {
   101  	return &state.Model{}, nil
   102  }
   103  
   104  func (s *AgentToolsSuite) TestUpdateToolsAvailability(c *gc.C) {
   105  	fakeModelConfig := func(_ *state.Model) (*config.Config, error) {
   106  		sConfig := coretesting.FakeConfig()
   107  		sConfig = sConfig.Merge(coretesting.Attrs{
   108  			"agent-version": "2.5.0",
   109  		})
   110  		return config.New(config.NoDefaults, sConfig)
   111  	}
   112  	s.PatchValue(&modelConfig, fakeModelConfig)
   113  
   114  	fakeToolFinder := func(_ environs.Environ, _ int, _ int, _ string, _ coretools.Filter) (coretools.List, error) {
   115  		ver := version.Binary{Number: version.Number{Major: 2, Minor: 5, Patch: 2}}
   116  		olderVer := version.Binary{Number: version.Number{Major: 2, Minor: 5, Patch: 1}}
   117  		t := coretools.Tools{Version: ver, URL: "http://example.com", Size: 1}
   118  		tOld := coretools.Tools{Version: olderVer, URL: "http://example.com", Size: 1}
   119  		return coretools.List{&t, &tOld}, nil
   120  	}
   121  
   122  	var ver version.Number
   123  	fakeUpdate := func(_ *state.Model, v version.Number) error {
   124  		ver = v
   125  		return nil
   126  	}
   127  
   128  	cfg, err := config.New(config.NoDefaults, coretesting.FakeConfig())
   129  	c.Assert(err, jc.ErrorIsNil)
   130  	err = updateToolsAvailability(&mockState{configGetter{cfg}}, getDummyEnviron, fakeToolFinder, fakeUpdate)
   131  	c.Assert(err, jc.ErrorIsNil)
   132  
   133  	c.Assert(ver, gc.Not(gc.Equals), version.Zero)
   134  	c.Assert(ver, gc.Equals, version.Number{Major: 2, Minor: 5, Patch: 2})
   135  }
   136  
   137  func (s *AgentToolsSuite) TestUpdateToolsAvailabilityNoMatches(c *gc.C) {
   138  	fakeModelConfig := func(_ *state.Model) (*config.Config, error) {
   139  		sConfig := coretesting.FakeConfig()
   140  		sConfig = sConfig.Merge(coretesting.Attrs{
   141  			"agent-version": "2.5.0",
   142  		})
   143  		return config.New(config.NoDefaults, sConfig)
   144  	}
   145  	s.PatchValue(&modelConfig, fakeModelConfig)
   146  
   147  	// No new tools available.
   148  	fakeToolFinder := func(_ environs.Environ, _ int, _ int, _ string, _ coretools.Filter) (coretools.List, error) {
   149  		return nil, errors.NotFoundf("tools")
   150  	}
   151  
   152  	// Update should never be called.
   153  	fakeUpdate := func(_ *state.Model, v version.Number) error {
   154  		c.Fail()
   155  		return nil
   156  	}
   157  
   158  	cfg, err := config.New(config.NoDefaults, coretesting.FakeConfig())
   159  	c.Assert(err, jc.ErrorIsNil)
   160  	err = updateToolsAvailability(&mockState{configGetter{cfg}}, getDummyEnviron, fakeToolFinder, fakeUpdate)
   161  	c.Assert(err, jc.ErrorIsNil)
   162  }
   163  
   164  func getDummyEnviron() (environs.Environ, error) {
   165  	return dummyEnviron{}, nil
   166  }