Skip to content

Commit 2d7dec0

Browse files
committed
Move state/storage.go to state/storage/
This moves storage (blobstore) code out of state, and into the state/storage package. The storage code is inconsequential to state itself, it just happens to be co-resident in the Mongo database. The moved code does not depend on state, but instead takes an environment UUID and an mgo.Session derived from a state.State. In the future we should also move the ToolStorage code, removing the dependency of state on blobstore altogether.
1 parent 2a03d49 commit 2d7dec0

25 files changed

+211
-153
lines changed

apiserver/charms.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"github.com/juju/juju/apiserver/client"
2929
apihttp "github.com/juju/juju/apiserver/http"
3030
"github.com/juju/juju/apiserver/params"
31+
"github.com/juju/juju/state/storage"
3132
)
3233

3334
// charmsHandler handles charm upload through HTTPS in the API server.
@@ -407,7 +408,7 @@ func (h *charmsHandler) processGet(r *http.Request) (string, string, error) {
407408
// downloadCharm downloads the given charm name from the provider storage and
408409
// saves the corresponding zip archive to the given charmArchivePath.
409410
func (h *charmsHandler) downloadCharm(curl *charm.URL, charmArchivePath string) error {
410-
storage := h.state.Storage()
411+
storage := storage.NewStorage(h.state.EnvironUUID(), h.state.MongoSession())
411412
ch, err := h.state.Charm(curl)
412413
if err != nil {
413414
return errors.Annotate(err, "cannot get charm from state")

apiserver/charms_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/juju/juju/apiserver/params"
2424
jujutesting "github.com/juju/juju/juju/testing"
2525
"github.com/juju/juju/state"
26+
"github.com/juju/juju/state/storage"
2627
"github.com/juju/juju/testcharms"
2728
"github.com/juju/juju/testing/factory"
2829
)
@@ -225,7 +226,7 @@ func (s *charmsSuite) TestUploadRespectsLocalRevision(c *gc.C) {
225226

226227
c.Assert(sch.BundleSha256(), gc.Equals, expectedSHA256)
227228

228-
storage := s.State.Storage()
229+
storage := storage.NewStorage(s.State.EnvironUUID(), s.State.MongoSession())
229230
reader, _, err := storage.Get(sch.StoragePath())
230231
c.Assert(err, jc.ErrorIsNil)
231232
defer reader.Close()
@@ -302,7 +303,7 @@ func (s *charmsSuite) TestUploadRepackagesNestedArchives(c *gc.C) {
302303
// Get it from the storage and try to read it as a bundle - it
303304
// should succeed, because it was repackaged during upload to
304305
// strip nested dirs.
305-
storage := s.State.Storage()
306+
storage := storage.NewStorage(s.State.EnvironUUID(), s.State.MongoSession())
306307
reader, _, err := storage.Get(sch.StoragePath())
307308
c.Assert(err, jc.ErrorIsNil)
308309
defer reader.Close()

apiserver/client/client.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/juju/juju/network"
2727
"github.com/juju/juju/state"
2828
"github.com/juju/juju/state/multiwatcher"
29+
"github.com/juju/juju/state/storage"
2930
"github.com/juju/juju/version"
3031
)
3132

@@ -36,7 +37,7 @@ func init() {
3637
var (
3738
logger = loggo.GetLogger("juju.apiserver.client")
3839

39-
stateStorage = (*state.State).Storage
40+
newStateStorage = storage.NewStorage
4041
)
4142

4243
type API struct {
@@ -1158,7 +1159,7 @@ func (c *Client) AddCharm(args params.CharmURL) error {
11581159

11591160
// StoreCharmArchive stores a charm archive in environment storage.
11601161
func StoreCharmArchive(st *state.State, curl *charm.URL, ch charm.Charm, r io.Reader, size int64, sha256 string) error {
1161-
storage := stateStorage(st)
1162+
storage := newStateStorage(st.EnvironUUID(), st.MongoSession())
11621163
storagePath, err := charmArchiveStoragePath(curl)
11631164
if err != nil {
11641165
return errors.Annotate(err, "cannot generate charm archive name")

apiserver/client/client_test.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
gc "gopkg.in/check.v1"
1919
"gopkg.in/juju/charm.v4"
2020
charmtesting "gopkg.in/juju/charm.v4/testing"
21+
"gopkg.in/mgo.v2"
2122

2223
"github.com/juju/juju/agent"
2324
"github.com/juju/juju/api"
@@ -35,6 +36,7 @@ import (
3536
"github.com/juju/juju/state"
3637
"github.com/juju/juju/state/multiwatcher"
3738
"github.com/juju/juju/state/presence"
39+
"github.com/juju/juju/state/storage"
3840
"github.com/juju/juju/testcharms"
3941
coretesting "github.com/juju/juju/testing"
4042
"github.com/juju/juju/testing/factory"
@@ -3113,8 +3115,8 @@ func (s *clientSuite) TestAddCharm(c *gc.C) {
31133115
s.makeMockCharmStore()
31143116

31153117
var blobs blobs
3116-
s.PatchValue(client.StateStorage, func(st *state.State) state.Storage {
3117-
storage := st.Storage()
3118+
s.PatchValue(client.NewStateStorage, func(uuid string, session *mgo.Session) storage.Storage {
3119+
storage := storage.NewStorage(uuid, session)
31183120
return &recordingStorage{Storage: storage, blobs: &blobs}
31193121
})
31203122

@@ -3147,7 +3149,7 @@ func (s *clientSuite) TestAddCharm(c *gc.C) {
31473149
c.Assert(err, jc.ErrorIsNil)
31483150

31493151
// Verify it's in state and it got uploaded.
3150-
storage := s.State.Storage()
3152+
storage := storage.NewStorage(s.State.EnvironUUID(), s.State.MongoSession())
31513153
sch, err = s.State.Charm(curl)
31523154
c.Assert(err, jc.ErrorIsNil)
31533155
s.assertUploaded(c, storage, sch.StoragePath(), sch.BundleSha256())
@@ -3230,7 +3232,7 @@ func (b *blobs) check() {
32303232
}
32313233

32323234
type recordingStorage struct {
3233-
state.Storage
3235+
storage.Storage
32343236
putBarrier *sync.WaitGroup
32353237
blobs *blobs
32363238
}
@@ -3262,8 +3264,8 @@ func (s *clientSuite) TestAddCharmConcurrently(c *gc.C) {
32623264

32633265
var putBarrier sync.WaitGroup
32643266
var blobs blobs
3265-
s.PatchValue(client.StateStorage, func(st *state.State) state.Storage {
3266-
storage := st.Storage()
3267+
s.PatchValue(client.NewStateStorage, func(uuid string, session *mgo.Session) storage.Storage {
3268+
storage := storage.NewStorage(uuid, session)
32673269
return &recordingStorage{Storage: storage, blobs: &blobs, putBarrier: &putBarrier}
32683270
})
32693271

@@ -3308,7 +3310,7 @@ func (s *clientSuite) TestAddCharmConcurrently(c *gc.C) {
33083310
}
33093311
}
33103312

3311-
storage := s.State.Storage()
3313+
storage := storage.NewStorage(s.State.EnvironUUID(), s.State.MongoSession())
33123314
s.assertUploaded(c, storage, sch.StoragePath(), sch.BundleSha256())
33133315
}
33143316

@@ -3337,7 +3339,7 @@ func (s *clientSuite) TestAddCharmOverwritesPlaceholders(c *gc.C) {
33373339
c.Assert(sch.IsUploaded(), jc.IsTrue)
33383340
}
33393341

3340-
func (s *clientSuite) assertUploaded(c *gc.C, storage state.Storage, storagePath, expectedSHA256 string) {
3342+
func (s *clientSuite) assertUploaded(c *gc.C, storage storage.Storage, storagePath, expectedSHA256 string) {
33413343
reader, _, err := storage.Get(storagePath)
33423344
c.Assert(err, jc.ErrorIsNil)
33433345
defer reader.Close()

apiserver/client/export_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ var (
77
ParseSettingsCompatible = parseSettingsCompatible
88
RemoteParamsForMachine = remoteParamsForMachine
99
GetAllUnitNames = getAllUnitNames
10-
StateStorage = &stateStorage
10+
NewStateStorage = &newStateStorage
1111
)
1212

1313
var MachineJobFromParams = machineJobFromParams

cmd/jujud/bootstrap.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"github.com/juju/juju/network"
3232
"github.com/juju/juju/state"
3333
"github.com/juju/juju/state/multiwatcher"
34+
"github.com/juju/juju/state/storage"
3435
"github.com/juju/juju/state/toolstorage"
3536
"github.com/juju/juju/utils/ssh"
3637
"github.com/juju/juju/version"
@@ -40,7 +41,7 @@ import (
4041
var (
4142
agentInitializeState = agent.InitializeState
4243
sshGenerateKey = ssh.GenerateKey
43-
stateStorage = (*state.State).Storage
44+
newStateStorage = storage.NewStorage
4445
minSocketTimeout = 1 * time.Minute
4546
)
4647

@@ -221,7 +222,8 @@ func (c *BootstrapCommand) Run(_ *cmd.Context) error {
221222

222223
// Add custom image metadata to environment storage.
223224
if c.ImageMetadataDir != "" {
224-
if err := c.storeCustomImageMetadata(stateStorage(st)); err != nil {
225+
stor := newStateStorage(st.EnvironUUID(), st.MongoSession())
226+
if err := c.storeCustomImageMetadata(stor); err != nil {
225227
return err
226228
}
227229
}
@@ -379,7 +381,7 @@ func (c *BootstrapCommand) populateTools(st *state.State, env environs.Environ)
379381
// storeCustomImageMetadata reads the custom image metadata from disk,
380382
// and stores the files in environment storage with the same relative
381383
// paths.
382-
func (c *BootstrapCommand) storeCustomImageMetadata(stor state.Storage) error {
384+
func (c *BootstrapCommand) storeCustomImageMetadata(stor storage.Storage) error {
383385
logger.Debugf("storing custom image metadata from %q", c.ImageMetadataDir)
384386
return filepath.Walk(c.ImageMetadataDir, func(abspath string, info os.FileInfo, err error) error {
385387
if err != nil {

cmd/jujud/bootstrap_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/juju/utils"
2222
"github.com/juju/utils/set"
2323
gc "gopkg.in/check.v1"
24+
"gopkg.in/mgo.v2"
2425
goyaml "gopkg.in/yaml.v1"
2526

2627
"github.com/juju/juju/agent"
@@ -42,6 +43,7 @@ import (
4243
"github.com/juju/juju/provider/dummy"
4344
"github.com/juju/juju/state"
4445
"github.com/juju/juju/state/multiwatcher"
46+
statestorage "github.com/juju/juju/state/storage"
4547
statetesting "github.com/juju/juju/state/testing"
4648
"github.com/juju/juju/testing"
4749
"github.com/juju/juju/tools"
@@ -650,7 +652,7 @@ func (s *BootstrapSuite) TestImageMetadata(c *gc.C) {
650652
}
651653

652654
var stor statetesting.MapStorage
653-
s.PatchValue(&stateStorage, func(*state.State) state.Storage {
655+
s.PatchValue(&newStateStorage, func(string, *mgo.Session) statestorage.Storage {
654656
return &stor
655657
})
656658

cmd/jujud/machine.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import (
4848
"github.com/juju/juju/service/common"
4949
"github.com/juju/juju/state"
5050
"github.com/juju/juju/state/multiwatcher"
51+
"github.com/juju/juju/state/storage"
5152
coretools "github.com/juju/juju/tools"
5253
"github.com/juju/juju/version"
5354
"github.com/juju/juju/worker"
@@ -668,7 +669,9 @@ func (a *MachineAgent) StateWorker() (worker.Worker, error) {
668669
return nil, err
669670
}
670671
reportOpenedState(st)
671-
registerSimplestreamsDataSource(st.Storage())
672+
673+
stor := storage.NewStorage(st.EnvironUUID(), st.MongoSession())
674+
registerSimplestreamsDataSource(stor)
672675

673676
singularStateConn := singularStateConn{st.MongoSession(), m}
674677
runner := newRunner(connectionIsFatal(st), moreImportant)

cmd/jujud/simplestreams.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,19 @@ import (
1212

1313
"github.com/juju/juju/environs"
1414
"github.com/juju/juju/environs/simplestreams"
15-
"github.com/juju/juju/environs/storage"
16-
"github.com/juju/juju/state"
15+
envstorage "github.com/juju/juju/environs/storage"
16+
"github.com/juju/juju/state/storage"
1717
)
1818

1919
// environmentStorageDataSource is a simplestreams.DataSource that
2020
// retrieves simplestreams metadata from environment storage.
2121
type environmentStorageDataSource struct {
22-
stor state.Storage
22+
stor storage.Storage
2323
}
2424

2525
// NewEnvironmentStorageDataSource returns a new datasource that retrieves
2626
// metadata from environment storage.
27-
func NewEnvironmentStorageDataSource(stor state.Storage) simplestreams.DataSource {
27+
func NewEnvironmentStorageDataSource(stor storage.Storage) simplestreams.DataSource {
2828
return environmentStorageDataSource{stor}
2929
}
3030

@@ -37,7 +37,7 @@ func (d environmentStorageDataSource) Description() string {
3737
func (d environmentStorageDataSource) Fetch(file string) (io.ReadCloser, string, error) {
3838
logger.Debugf("fetching %q", file)
3939

40-
r, _, err := d.stor.Get(path.Join(storage.BaseImagesPath, file))
40+
r, _, err := d.stor.Get(path.Join(envstorage.BaseImagesPath, file))
4141
if err != nil {
4242
return nil, "", err
4343
}
@@ -52,7 +52,7 @@ func (d environmentStorageDataSource) Fetch(file string) (io.ReadCloser, string,
5252

5353
// URL is defined in simplestreams.DataSource.
5454
func (d environmentStorageDataSource) URL(file string) (string, error) {
55-
path := path.Join(storage.BaseImagesPath, file)
55+
path := path.Join(envstorage.BaseImagesPath, file)
5656
return fmt.Sprintf("environment-storage://%s", path), nil
5757
}
5858

@@ -61,7 +61,7 @@ func (d environmentStorageDataSource) SetAllowRetry(allow bool) {
6161
}
6262

6363
// registerSimplestreamsDataSource registers a environmentStorageDataSource.
64-
func registerSimplestreamsDataSource(stor state.Storage) {
64+
func registerSimplestreamsDataSource(stor storage.Storage) {
6565
ds := NewEnvironmentStorageDataSource(stor)
6666
environs.RegisterImageDataSourceFunc(ds.Description(), func(environs.Environ) (simplestreams.DataSource, error) {
6767
return ds, nil

cmd/jujud/upgrade.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/juju/juju/mongo"
1616
"github.com/juju/juju/state"
1717
"github.com/juju/juju/state/multiwatcher"
18+
"github.com/juju/juju/state/storage"
1819
"github.com/juju/juju/upgrades"
1920
"github.com/juju/juju/version"
2021
"github.com/juju/juju/worker"
@@ -175,7 +176,8 @@ func (c *upgradeWorkerContext) run(stop <-chan struct{}) error {
175176
return errors.Trace(err)
176177
}
177178

178-
registerSimplestreamsDataSource(c.st.Storage())
179+
stor := storage.NewStorage(c.st.EnvironUUID(), c.st.MongoSession())
180+
registerSimplestreamsDataSource(stor)
179181
}
180182
if err := c.runUpgrades(); err != nil {
181183
// Only return an error from the worker if the connection to

juju/testing/conn.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"github.com/juju/juju/mongo"
3737
"github.com/juju/juju/provider/dummy"
3838
"github.com/juju/juju/state"
39+
statestorage "github.com/juju/juju/state/storage"
3940
"github.com/juju/juju/state/toolstorage"
4041
"github.com/juju/juju/testcharms"
4142
"github.com/juju/juju/testing"
@@ -439,7 +440,7 @@ func addCharm(st *state.State, curl *charm.URL, ch charm.Charm) (*state.Charm, e
439440
return nil, err
440441
}
441442

442-
stor := st.Storage()
443+
stor := statestorage.NewStorage(st.EnvironUUID(), st.MongoSession())
443444
storagePath := fmt.Sprintf("/charms/%s-%s", curl.String(), digest)
444445
if err := stor.Put(storagePath, f, size); err != nil {
445446
return nil, fmt.Errorf("cannot put charm: %v", err)

juju/testing/repo.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"github.com/juju/juju/environs/config"
1515
"github.com/juju/juju/state"
16+
"github.com/juju/juju/state/storage"
1617
)
1718

1819
// RepoSuite acts as a JujuConnSuite but also sets up
@@ -71,7 +72,7 @@ func (s *RepoSuite) AssertCharmUploaded(c *gc.C, curl *charm.URL) {
7172
ch, err := s.State.Charm(curl)
7273
c.Assert(err, jc.ErrorIsNil)
7374

74-
storage := s.State.Storage()
75+
storage := storage.NewStorage(s.State.EnvironUUID(), s.State.MongoSession())
7576
r, _, err := storage.Get(ch.StoragePath())
7677
c.Assert(err, jc.ErrorIsNil)
7778
defer r.Close()

state/export_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ const (
2727
)
2828

2929
var (
30-
GetManagedStorage = (*State).getManagedStorage
3130
ToolstorageNewStorage = &toolstorageNewStorage
3231
MachineIdLessThan = machineIdLessThan
3332
NewAddress = newAddress

state/storage/package_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright 2014 Canonical Ltd.
2+
// Licensed under the AGPLv3, see LICENCE file for details.
3+
4+
package storage_test
5+
6+
import (
7+
stdtesting "testing"
8+
9+
"github.com/juju/juju/testing"
10+
)
11+
12+
// TestPackage integrates the tests into gotest.
13+
func TestPackage(t *stdtesting.T) {
14+
testing.MgoTestPackage(t)
15+
}

0 commit comments

Comments
 (0)