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  }