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 }