github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/state/binarystorage_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package state_test
     5  
     6  import (
     7  	"fmt"
     8  	"io/ioutil"
     9  	"strings"
    10  
    11  	"github.com/juju/errors"
    12  	jc "github.com/juju/testing/checkers"
    13  	jujutxn "github.com/juju/txn"
    14  	"github.com/juju/utils"
    15  	"github.com/juju/utils/set"
    16  	"github.com/juju/version"
    17  	gc "gopkg.in/check.v1"
    18  	"gopkg.in/juju/blobstore.v2"
    19  	"gopkg.in/juju/names.v2"
    20  
    21  	"github.com/juju/juju/mongo"
    22  	"github.com/juju/juju/state"
    23  	"github.com/juju/juju/state/binarystorage"
    24  	"github.com/juju/juju/storage"
    25  	"github.com/juju/juju/testing"
    26  	"github.com/juju/juju/tools"
    27  )
    28  
    29  type tooler interface {
    30  	lifer
    31  	AgentTools() (*tools.Tools, error)
    32  	SetAgentVersion(v version.Binary) error
    33  	Refresh() error
    34  }
    35  
    36  func testAgentTools(c *gc.C, obj tooler, agent string) {
    37  	// object starts with zero'd tools.
    38  	t, err := obj.AgentTools()
    39  	c.Assert(t, gc.IsNil)
    40  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
    41  
    42  	err = obj.SetAgentVersion(version.Binary{})
    43  	c.Assert(err, gc.ErrorMatches, fmt.Sprintf("cannot set agent version for %s: empty series or arch", agent))
    44  
    45  	v2 := version.MustParseBinary("7.8.9-quantal-amd64")
    46  	err = obj.SetAgentVersion(v2)
    47  	c.Assert(err, jc.ErrorIsNil)
    48  	t3, err := obj.AgentTools()
    49  	c.Assert(err, jc.ErrorIsNil)
    50  	c.Assert(t3.Version, gc.DeepEquals, v2)
    51  	err = obj.Refresh()
    52  	c.Assert(err, jc.ErrorIsNil)
    53  	t3, err = obj.AgentTools()
    54  	c.Assert(err, jc.ErrorIsNil)
    55  	c.Assert(t3.Version, gc.DeepEquals, v2)
    56  
    57  	testWhenDying(c, obj, noErr, deadErr, func() error {
    58  		return obj.SetAgentVersion(v2)
    59  	})
    60  }
    61  
    62  type binaryStorageSuite struct {
    63  	ConnSuite
    64  
    65  	controllerUUID string
    66  	modelUUID      string
    67  	st             *state.State
    68  }
    69  
    70  var _ = gc.Suite(&binaryStorageSuite{})
    71  
    72  func (s *binaryStorageSuite) SetUpTest(c *gc.C) {
    73  	s.ConnSuite.SetUpTest(c)
    74  
    75  	// Store the controller UUID.
    76  	model, err := s.State.ControllerModel()
    77  	c.Assert(err, jc.ErrorIsNil)
    78  	s.controllerUUID = model.UUID()
    79  
    80  	// Create a new model and store its UUID.
    81  	s.modelUUID = utils.MustNewUUID().String()
    82  	cfg := testing.CustomModelConfig(c, testing.Attrs{
    83  		"name": "new-model",
    84  		"uuid": s.modelUUID,
    85  	})
    86  	_, s.st, err = s.State.NewModel(state.ModelArgs{
    87  		CloudName:   "dummy",
    88  		CloudRegion: "dummy-region",
    89  		Config:      cfg,
    90  		Owner:       names.NewLocalUserTag("test-admin"),
    91  		StorageProviderRegistry: storage.StaticProviderRegistry{},
    92  	})
    93  	c.Assert(err, jc.ErrorIsNil)
    94  	s.AddCleanup(func(*gc.C) {
    95  		s.st.Close()
    96  	})
    97  }
    98  
    99  type storageOpener func() (binarystorage.StorageCloser, error)
   100  
   101  func (s *binaryStorageSuite) TestToolsStorage(c *gc.C) {
   102  	s.testStorage(c, "toolsmetadata", s.State.ToolsStorage)
   103  }
   104  
   105  func (s *binaryStorageSuite) TestToolsStorageParamsControllerModel(c *gc.C) {
   106  	s.testStorageParams(c, "toolsmetadata", []string{s.State.ModelUUID()}, s.State.ToolsStorage)
   107  }
   108  
   109  func (s *binaryStorageSuite) TestToolsStorageParamsHostedModel(c *gc.C) {
   110  	s.testStorageParams(c, "toolsmetadata", []string{s.State.ModelUUID(), s.modelUUID}, s.st.ToolsStorage)
   111  }
   112  
   113  func (s *binaryStorageSuite) TestGUIArchiveStorage(c *gc.C) {
   114  	s.testStorage(c, "guimetadata", s.State.GUIStorage)
   115  }
   116  
   117  func (s *binaryStorageSuite) TestGUIArchiveStorageParams(c *gc.C) {
   118  	s.testStorageParams(c, "guimetadata", []string{s.controllerUUID}, s.st.GUIStorage)
   119  }
   120  
   121  func (s *binaryStorageSuite) testStorage(c *gc.C, collName string, openStorage storageOpener) {
   122  	session := s.State.MongoSession()
   123  	collectionNames, err := session.DB("juju").CollectionNames()
   124  	c.Assert(err, jc.ErrorIsNil)
   125  	nameSet := set.NewStrings(collectionNames...)
   126  	c.Assert(nameSet.Contains(collName), jc.IsFalse)
   127  
   128  	storage, err := openStorage()
   129  	c.Assert(err, jc.ErrorIsNil)
   130  	defer func() {
   131  		err := storage.Close()
   132  		c.Assert(err, jc.ErrorIsNil)
   133  	}()
   134  
   135  	err = storage.Add(strings.NewReader(""), binarystorage.Metadata{})
   136  	c.Assert(err, jc.ErrorIsNil)
   137  
   138  	collectionNames, err = session.DB("juju").CollectionNames()
   139  	c.Assert(err, jc.ErrorIsNil)
   140  	nameSet = set.NewStrings(collectionNames...)
   141  	c.Assert(nameSet.Contains(collName), jc.IsTrue)
   142  }
   143  
   144  func (s *binaryStorageSuite) testStorageParams(c *gc.C, collName string, uuids []string, openStorage storageOpener) {
   145  	var uuidArgs []string
   146  	s.PatchValue(state.BinarystorageNew, func(
   147  		modelUUID string,
   148  		managedStorage blobstore.ManagedStorage,
   149  		metadataCollection mongo.Collection,
   150  		runner jujutxn.Runner,
   151  	) binarystorage.Storage {
   152  		uuidArgs = append(uuidArgs, modelUUID)
   153  		c.Assert(managedStorage, gc.NotNil)
   154  		c.Assert(metadataCollection.Name(), gc.Equals, collName)
   155  		c.Assert(runner, gc.NotNil)
   156  		return nil
   157  	})
   158  
   159  	storage, err := openStorage()
   160  	c.Assert(err, jc.ErrorIsNil)
   161  	storage.Close()
   162  	c.Assert(uuidArgs, jc.DeepEquals, uuids)
   163  }
   164  
   165  func (s *binaryStorageSuite) TestToolsStorageLayered(c *gc.C) {
   166  	modelTools, err := s.st.ToolsStorage()
   167  	c.Assert(err, jc.ErrorIsNil)
   168  	defer modelTools.Close()
   169  
   170  	controllerTools, err := s.State.ToolsStorage()
   171  	c.Assert(err, jc.ErrorIsNil)
   172  	defer controllerTools.Close()
   173  
   174  	err = modelTools.Add(strings.NewReader("abc"), binarystorage.Metadata{Version: "1.0", Size: 3})
   175  	c.Assert(err, jc.ErrorIsNil)
   176  	err = controllerTools.Add(strings.NewReader("defg"), binarystorage.Metadata{Version: "1.0", Size: 4})
   177  	c.Assert(err, jc.ErrorIsNil)
   178  	err = controllerTools.Add(strings.NewReader("def"), binarystorage.Metadata{Version: "2.0", Size: 3})
   179  	c.Assert(err, jc.ErrorIsNil)
   180  
   181  	all, err := modelTools.AllMetadata()
   182  	c.Assert(err, jc.ErrorIsNil)
   183  	c.Assert(all, jc.DeepEquals, []binarystorage.Metadata{
   184  		{Version: "1.0", Size: 3},
   185  		{Version: "2.0", Size: 3},
   186  	})
   187  
   188  	assertContents := func(v, contents string) {
   189  		_, rc, err := modelTools.Open(v)
   190  		c.Assert(err, jc.ErrorIsNil)
   191  		c.Assert(rc, gc.NotNil)
   192  		defer rc.Close()
   193  		data, err := ioutil.ReadAll(rc)
   194  		c.Assert(err, jc.ErrorIsNil)
   195  		c.Assert(string(data), gc.Equals, contents)
   196  	}
   197  	assertContents("1.0", "abc")
   198  	assertContents("2.0", "def")
   199  }