Skip to content

Commit

Permalink
feat: amend ResourceStoreFactory to take a ResourceStoreGetter
Browse files Browse the repository at this point in the history
The ResourceStoreFactory now uses a ResourceStoreGetter for
TypeContainerImage. The ContainerImageResourceStore was pushed
up to an individual domain. Supporting functionality for the old
implemenation has been removed.

ContainerImageResourceStore is now provided to NewResourceStoreFactory
via a getter when a Resource domain is requested as a model service.
  • Loading branch information
hmlanigan committed Dec 4, 2024
1 parent d28eb9e commit a25d08e
Show file tree
Hide file tree
Showing 12 changed files with 235 additions and 122 deletions.
3 changes: 3 additions & 0 deletions core/resource/store/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,6 @@ func NewFingerprint(f hash.Fingerprint) Fingerprint {
// blob. This can be an object store metadata UUID or a container image metadata
// storage key.
type UUID string

// ResourceStoreGetter is a function which returns a ResourceStore.
type ResourceStoreGetter func() ResourceStore
5 changes: 2 additions & 3 deletions domain/containerimageresourcestore/service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (

"github.com/juju/juju/core/resource/store"
"github.com/juju/juju/domain/containerimageresourcestore"
charmresource "github.com/juju/juju/internal/charm/resource"
"github.com/juju/juju/internal/docker"
"github.com/juju/juju/internal/errors"
)
Expand Down Expand Up @@ -83,8 +82,8 @@ func (s Service) Put(
ctx context.Context,
storageKey string,
r io.Reader,
size int64,
fingerprint charmresource.Fingerprint,
_ int64,
_ store.Fingerprint,
) (store.UUID, error) {
respBuf := new(bytes.Buffer)
bytesRead, err := respBuf.ReadFrom(r)
Expand Down
7 changes: 3 additions & 4 deletions domain/containerimageresourcestore/service/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import (
resourcestore "github.com/juju/juju/core/resource/store"
resourcetesting "github.com/juju/juju/core/resource/testing"
"github.com/juju/juju/domain/containerimageresourcestore"
charmresource "github.com/juju/juju/internal/charm/resource"
"github.com/juju/juju/internal/docker"
"github.com/juju/juju/internal/errors"
)
Expand Down Expand Up @@ -74,7 +73,7 @@ func (s *containerImageResourceStoreSuite) TestContainerImageResourceStorePut(c
storageKey,
s.file,
0,
charmresource.Fingerprint{},
resourcestore.Fingerprint{},
)
c.Assert(err, jc.ErrorIsNil)
c.Assert(storageUUID, gc.Equals, expectedUUID)
Expand All @@ -92,7 +91,7 @@ func (s *containerImageResourceStoreSuite) TestContainerImageResourceStorePutEmp
storageKey,
bytes.NewReader([]byte{}),
0,
charmresource.Fingerprint{},
resourcestore.Fingerprint{},
)
c.Assert(err, gc.ErrorMatches, ".* zero bytes read")
}
Expand All @@ -117,7 +116,7 @@ func (s *containerImageResourceStoreSuite) TestContainerImageResourceStorePutErr
storageKey,
s.file,
0,
charmresource.Fingerprint{},
resourcestore.Fingerprint{},
)
c.Assert(err, jc.ErrorIs, kaboom)
}
Expand Down
36 changes: 0 additions & 36 deletions domain/resource/service/package_mock_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 3 additions & 14 deletions domain/resource/service/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,6 @@ type State interface {
}

type ResourceStoreGetter interface {
// AddStore injects a ResourceStore for the given type into the ResourceStoreFactory.
AddStore(t charmresource.Type, store store.ResourceStore)

// GetResourceStore returns the appropriate ResourceStore for the
// given resource type.
GetResourceStore(context.Context, charmresource.Type) (store.ResourceStore, error)
Expand All @@ -72,18 +69,10 @@ func NewService(
resourceStoreGetter ResourceStoreGetter,
logger logger.Logger,
) *Service {
// Note:
// The store for container image resources is really a DQLite table today.
// Using AddStore is a compromise to avoid injecting one service into
// another, as would happen if NewResourceStoreFactory had a second
// argument to provide a containerImageResourceStore.
resourceStoreGetter.AddStore(
charmresource.TypeContainerImage,
nil,
)
return &Service{
st: st,
logger: logger,
st: st,
resourceStoreGetter: resourceStoreGetter,
logger: logger,
}
}

Expand Down
1 change: 0 additions & 1 deletion domain/resource/service/resource_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,6 @@ func (s *resourceServiceSuite) setupMocks(c *gc.C) *gomock.Controller {

s.state = NewMockState(ctrl)
s.resourceStoreGetter = NewMockResourceStoreGetter(ctrl)
s.resourceStoreGetter.EXPECT().AddStore(charmresource.TypeContainerImage, gomock.Any())

s.service = NewService(s.state, s.resourceStoreGetter, loggertesting.WrapCheckLog(c))

Expand Down
16 changes: 15 additions & 1 deletion domain/services/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"github.com/juju/juju/core/model"
"github.com/juju/juju/core/objectstore"
"github.com/juju/juju/core/providertracker"
coreresourcestore "github.com/juju/juju/core/resource/store"
corestorage "github.com/juju/juju/core/storage"
agentprovisionerservice "github.com/juju/juju/domain/agentprovisioner/service"
agentprovisionerstate "github.com/juju/juju/domain/agentprovisioner/state"
Expand All @@ -29,6 +30,8 @@ import (
blockdevicestate "github.com/juju/juju/domain/blockdevice/state"
cloudimagemetadataservice "github.com/juju/juju/domain/cloudimagemetadata/service"
cloudimagemetadatastate "github.com/juju/juju/domain/cloudimagemetadata/state"
containerimageresourcestoreservice "github.com/juju/juju/domain/containerimageresourcestore/service"
containerimageresourcestorestate "github.com/juju/juju/domain/containerimageresourcestore/state"
keymanagerservice "github.com/juju/juju/domain/keymanager/service"
keymanagerstate "github.com/juju/juju/domain/keymanager/state"
keyupdaterservice "github.com/juju/juju/domain/keyupdater/service"
Expand Down Expand Up @@ -345,13 +348,24 @@ func (s *ModelServices) BlockCommand() *blockcommandservice.Service {
// Resource returns the service for persisting and retrieving application
// resources for the current model.
func (s *ModelServices) Resource() *resourceservice.Service {
containerImageResourceStoreGetter := func() coreresourcestore.ResourceStore {
return containerimageresourcestoreservice.NewService(
containerimageresourcestorestate.NewState(
changestream.NewTxnRunnerFactory(s.modelDB),
s.logger.Child("containerimageresourcestore.state"),
))
}
resourceStoreFactory := store.NewResourceStoreFactory(
s.objectstore,
containerImageResourceStoreGetter,
)
return resourceservice.NewService(
resourcestate.NewState(
changestream.NewTxnRunnerFactory(s.modelDB),
s.clock,
s.logger.Child("resource.state"),
),
store.NewResourceStoreFactory(s.objectstore),
resourceStoreFactory,
s.logger.Child("resource.service"),
)
}
Expand Down
7 changes: 3 additions & 4 deletions internal/resource/store/object_store_mock_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion internal/resource/store/package_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import (
gc "gopkg.in/check.v1"
)

//go:generate go run go.uber.org/mock/mockgen -typed -package resource -destination object_store_mock_test.go github.com/juju/juju/core/objectstore ObjectStore,ModelObjectStoreGetter
//go:generate go run go.uber.org/mock/mockgen -typed -package store -destination object_store_mock_test.go github.com/juju/juju/core/objectstore ObjectStore,ModelObjectStoreGetter
//go:generate go run go.uber.org/mock/mockgen -typed -package store -destination resource_store_mock_test.go github.com/juju/juju/core/resource/store ResourceStore

func TestPackage(t *testing.T) {
gc.TestingT(t)
Expand Down
159 changes: 159 additions & 0 deletions internal/resource/store/resource_store_mock_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit a25d08e

Please sign in to comment.