github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/upgrades/toolstorage_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package upgrades_test 5 6 import ( 7 "io" 8 "strings" 9 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/agent" 14 "github.com/juju/juju/environs" 15 "github.com/juju/juju/environs/filestorage" 16 envtesting "github.com/juju/juju/environs/testing" 17 envtools "github.com/juju/juju/environs/tools" 18 jujutesting "github.com/juju/juju/juju/testing" 19 "github.com/juju/juju/state" 20 "github.com/juju/juju/state/toolstorage" 21 coretools "github.com/juju/juju/tools" 22 "github.com/juju/juju/upgrades" 23 "github.com/juju/juju/version" 24 ) 25 26 type migrateToolsStorageSuite struct { 27 jujutesting.JujuConnSuite 28 } 29 30 var _ = gc.Suite(&migrateToolsStorageSuite{}) 31 32 func (s *migrateToolsStorageSuite) SetUpTest(c *gc.C) { 33 s.JujuConnSuite.SetUpTest(c) 34 } 35 36 var migrateToolsVersions = []version.Binary{ 37 version.MustParseBinary("1.2.3-precise-amd64"), 38 version.MustParseBinary("2.3.4-trusty-ppc64el"), 39 } 40 41 func (s *migrateToolsStorageSuite) TestMigrateToolsStorageNoTools(c *gc.C) { 42 fakeToolsStorage := &fakeToolsStorage{ 43 stored: make(map[version.Binary]toolstorage.Metadata), 44 } 45 s.PatchValue(upgrades.StateToolsStorage, func(*state.State) (toolstorage.StorageCloser, error) { 46 return fakeToolsStorage, nil 47 }) 48 49 stor := s.Environ.(environs.EnvironStorage).Storage() 50 envtesting.RemoveFakeTools(c, stor, "releases") 51 envtesting.RemoveFakeToolsMetadata(c, stor) 52 err := upgrades.MigrateToolsStorage(s.State, &mockAgentConfig{}) 53 c.Assert(err, jc.ErrorIsNil) 54 c.Assert(fakeToolsStorage.stored, gc.HasLen, 0) 55 } 56 57 func (s *migrateToolsStorageSuite) TestMigrateToolsStorage(c *gc.C) { 58 stor := s.Environ.(environs.EnvironStorage).Storage() 59 envtesting.RemoveFakeTools(c, stor, "releases") 60 tools := envtesting.AssertUploadFakeToolsVersions(c, stor, "releases", "released", migrateToolsVersions...) 61 s.testMigrateToolsStorage(c, &mockAgentConfig{}, tools) 62 } 63 64 func (s *migrateToolsStorageSuite) TestMigrateToolsStorageLocalstorage(c *gc.C) { 65 storageDir := c.MkDir() 66 stor, err := filestorage.NewFileStorageWriter(storageDir) 67 c.Assert(err, jc.ErrorIsNil) 68 tools := envtesting.AssertUploadFakeToolsVersions(c, stor, "releases", "released", migrateToolsVersions...) 69 for _, providerType := range []string{"local", "manual"} { 70 config := &mockAgentConfig{ 71 values: map[string]string{ 72 agent.ProviderType: providerType, 73 agent.StorageDir: storageDir, 74 }, 75 } 76 s.testMigrateToolsStorage(c, config, tools) 77 } 78 } 79 80 func (s *migrateToolsStorageSuite) TestMigrateToolsStorageBadSHA256(c *gc.C) { 81 stor := s.Environ.(environs.EnvironStorage).Storage() 82 envtesting.AssertUploadFakeToolsVersions(c, stor, "releases", "released", migrateToolsVersions...) 83 // Overwrite one of the tools archives with junk, so the hash does not match. 84 err := stor.Put( 85 envtools.StorageName(migrateToolsVersions[0], "releases"), 86 strings.NewReader("junk"), 87 4, 88 ) 89 c.Assert(err, jc.ErrorIsNil) 90 err = upgrades.MigrateToolsStorage(s.State, &mockAgentConfig{}) 91 c.Assert(err, gc.ErrorMatches, "failed to fetch 1.2.3-precise-amd64 tools: hash mismatch") 92 } 93 94 func (s *migrateToolsStorageSuite) testMigrateToolsStorage(c *gc.C, agentConfig agent.Config, tools []*coretools.Tools) { 95 fakeToolsStorage := &fakeToolsStorage{ 96 stored: make(map[version.Binary]toolstorage.Metadata), 97 } 98 s.PatchValue(upgrades.StateToolsStorage, func(*state.State) (toolstorage.StorageCloser, error) { 99 return fakeToolsStorage, nil 100 }) 101 err := upgrades.MigrateToolsStorage(s.State, agentConfig) 102 c.Assert(err, jc.ErrorIsNil) 103 c.Assert(fakeToolsStorage.stored, gc.DeepEquals, map[version.Binary]toolstorage.Metadata{ 104 tools[0].Version: toolstorage.Metadata{ 105 Version: tools[0].Version, 106 Size: tools[0].Size, 107 SHA256: tools[0].SHA256, 108 }, 109 tools[1].Version: toolstorage.Metadata{ 110 Version: tools[1].Version, 111 Size: tools[1].Size, 112 SHA256: tools[1].SHA256, 113 }, 114 }) 115 } 116 117 type fakeToolsStorage struct { 118 toolstorage.Storage 119 stored map[version.Binary]toolstorage.Metadata 120 } 121 122 func (s *fakeToolsStorage) Close() error { 123 return nil 124 } 125 126 func (s *fakeToolsStorage) AddTools(r io.Reader, meta toolstorage.Metadata) error { 127 s.stored[meta.Version] = meta 128 return nil 129 }