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