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