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 }