github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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 func (s *AgentToolsSuite) TestCheckTools(c *gc.C) { 30 sConfig := coretesting.FakeConfig() 31 sConfig = sConfig.Merge(coretesting.Attrs{ 32 "agent-version": "2.5.0", 33 }) 34 cfg, err := config.New(config.NoDefaults, sConfig) 35 c.Assert(err, jc.ErrorIsNil) 36 fakeNewEnvirons := func(*config.Config) (environs.Environ, error) { 37 return dummyEnviron{}, nil 38 } 39 s.PatchValue(&newEnvirons, fakeNewEnvirons) 40 var ( 41 calledWithMajor, calledWithMinor int 42 ) 43 fakeToolFinder := func(e environs.Environ, maj int, min int, stream string, filter coretools.Filter) (coretools.List, error) { 44 calledWithMajor = maj 45 calledWithMinor = min 46 ver := version.Binary{Number: version.Number{Major: maj, Minor: min}} 47 t := coretools.Tools{Version: ver, URL: "http://example.com", Size: 1} 48 c.Assert(calledWithMajor, gc.Equals, 2) 49 c.Assert(calledWithMinor, gc.Equals, 5) 50 c.Assert(stream, gc.Equals, "released") 51 return coretools.List{&t}, nil 52 } 53 54 ver, err := checkToolsAvailability(cfg, fakeToolFinder) 55 c.Assert(err, jc.ErrorIsNil) 56 c.Assert(ver, gc.Not(gc.Equals), version.Zero) 57 c.Assert(ver, gc.Equals, version.Number{Major: 2, Minor: 5, Patch: 0}) 58 } 59 60 func (s *AgentToolsSuite) TestCheckToolsNonReleasedStream(c *gc.C) { 61 sConfig := coretesting.FakeConfig() 62 sConfig = sConfig.Merge(coretesting.Attrs{ 63 "agent-version": "2.5-alpha1", 64 "agent-stream": "proposed", 65 }) 66 cfg, err := config.New(config.NoDefaults, sConfig) 67 c.Assert(err, jc.ErrorIsNil) 68 fakeNewEnvirons := func(*config.Config) (environs.Environ, error) { 69 return dummyEnviron{}, nil 70 } 71 s.PatchValue(&newEnvirons, fakeNewEnvirons) 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(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 modelGetter struct { 97 } 98 99 func (e *modelGetter) Model() (*state.Model, error) { 100 return &state.Model{}, nil 101 } 102 103 func (s *AgentToolsSuite) TestUpdateToolsAvailability(c *gc.C) { 104 fakeNewEnvirons := func(*config.Config) (environs.Environ, error) { 105 return dummyEnviron{}, nil 106 } 107 s.PatchValue(&newEnvirons, fakeNewEnvirons) 108 109 fakeEnvConfig := func(_ *state.Model) (*config.Config, error) { 110 sConfig := coretesting.FakeConfig() 111 sConfig = sConfig.Merge(coretesting.Attrs{ 112 "agent-version": "2.5.0", 113 }) 114 return config.New(config.NoDefaults, sConfig) 115 } 116 s.PatchValue(&envConfig, fakeEnvConfig) 117 118 fakeToolFinder := func(_ environs.Environ, _ int, _ int, _ string, _ coretools.Filter) (coretools.List, error) { 119 ver := version.Binary{Number: version.Number{Major: 2, Minor: 5, Patch: 2}} 120 olderVer := version.Binary{Number: version.Number{Major: 2, Minor: 5, Patch: 1}} 121 t := coretools.Tools{Version: ver, URL: "http://example.com", Size: 1} 122 tOld := coretools.Tools{Version: olderVer, URL: "http://example.com", Size: 1} 123 return coretools.List{&t, &tOld}, nil 124 } 125 126 var ver version.Number 127 fakeUpdate := func(_ *state.Model, v version.Number) error { 128 ver = v 129 return nil 130 } 131 132 err := updateToolsAvailability(&modelGetter{}, fakeToolFinder, fakeUpdate) 133 c.Assert(err, jc.ErrorIsNil) 134 135 c.Assert(ver, gc.Not(gc.Equals), version.Zero) 136 c.Assert(ver, gc.Equals, version.Number{Major: 2, Minor: 5, Patch: 2}) 137 } 138 139 func (s *AgentToolsSuite) TestUpdateToolsAvailabilityNoMatches(c *gc.C) { 140 fakeNewEnvirons := func(*config.Config) (environs.Environ, error) { 141 return dummyEnviron{}, nil 142 } 143 s.PatchValue(&newEnvirons, fakeNewEnvirons) 144 145 fakeEnvConfig := func(_ *state.Model) (*config.Config, error) { 146 sConfig := coretesting.FakeConfig() 147 sConfig = sConfig.Merge(coretesting.Attrs{ 148 "agent-version": "2.5.0", 149 }) 150 return config.New(config.NoDefaults, sConfig) 151 } 152 s.PatchValue(&envConfig, fakeEnvConfig) 153 154 // No new tools available. 155 fakeToolFinder := func(_ environs.Environ, _ int, _ int, _ string, _ coretools.Filter) (coretools.List, error) { 156 return nil, errors.NotFoundf("tools") 157 } 158 159 // Update should never be called. 160 fakeUpdate := func(_ *state.Model, v version.Number) error { 161 c.Fail() 162 return nil 163 } 164 165 err := updateToolsAvailability(&modelGetter{}, fakeToolFinder, fakeUpdate) 166 c.Assert(err, jc.ErrorIsNil) 167 }