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