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  }