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 }