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 }