Skip to content

Commit 65b9c3b

Browse files
committed
feat(application): add methods to retireve charm by SHA
We recently added methods to the object store metdata service to retrieve an object's metadata by it's SHA. Now we use this method to retireve the blob itself from the objectstore, in internal/objectstore. Whilst we're here, re-work the errors Also, wire this through into the application service.
1 parent 2f92af7 commit 65b9c3b

File tree

26 files changed

+1168
-91
lines changed

26 files changed

+1168
-91
lines changed

apiserver/common/mocks/objectstore_mock.go

Lines changed: 40 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apiserver/facades/client/application/objectstore_mock_test.go

Lines changed: 40 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apiserver/facades/client/machinemanager/objectstore_mock_test.go

Lines changed: 40 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apiserver/facades/controller/charmrevisionupdater/mocks/objectstore.go

Lines changed: 40 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apiserver/facades/controller/migrationmaster/mocks/objectstore.go

Lines changed: 40 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/objectstore/metadata.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ type ObjectStoreMetadata interface {
3434
// GetMetadata returns the persistence metadata for the specified path.
3535
GetMetadata(ctx context.Context, path string) (Metadata, error)
3636

37+
// GetMetadataBySHA256Prefix returns the persistence metadata for the object
38+
// with SHA256 starting with the provided prefix.
39+
GetMetadataBySHA256Prefix(ctx context.Context, sha256Prefix string) (Metadata, error)
40+
3741
// PutMetadata adds a new specified path for the persistence metadata.
3842
PutMetadata(ctx context.Context, metadata Metadata) (UUID, error)
3943

core/objectstore/objectstore.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,16 @@ type ObjectStore interface {
9191
type ReadObjectStore interface {
9292
// Get returns an io.ReadCloser for data at path, namespaced to the
9393
// model.
94+
//
95+
// If the object does not exist, an [objectstore.ObjectNotFound]
96+
// error is returned.
9497
Get(context.Context, string) (io.ReadCloser, int64, error)
98+
99+
// GetBySHA256Prefix returns an io.ReadCloser for any object with the a SHA256
100+
// hash starting with a given prefix, namespaced to the model.
101+
//
102+
// If no object is found, an [objectstore.ObjectNotFound] error is returned.
103+
GetBySHA256Prefix(context.Context, string) (io.ReadCloser, int64, error)
95104
}
96105

97106
// WriteObjectStore represents an object store that can only be written to.

domain/application/charm/store/store.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import (
1111
"os"
1212

1313
"github.com/juju/juju/core/objectstore"
14+
applicationerrors "github.com/juju/juju/domain/application/errors"
1415
"github.com/juju/juju/internal/errors"
16+
objectstoreerrors "github.com/juju/juju/internal/objectstore/errors"
1517
"github.com/juju/juju/internal/uuid"
1618
)
1719

@@ -78,6 +80,26 @@ func (s *CharmStore) Get(ctx context.Context, archivePath string) (io.ReadCloser
7880
return nil, errors.Errorf("getting object store: %w", err)
7981
}
8082
reader, _, err := store.Get(ctx, archivePath)
83+
if errors.Is(err, objectstoreerrors.ObjectNotFound) {
84+
return nil, applicationerrors.CharmNotFound
85+
}
86+
if err != nil {
87+
return nil, errors.Errorf("getting charm: %w", err)
88+
}
89+
return reader, nil
90+
}
91+
92+
// GetBySHA256Prefix retrieves a ReadCloser for a charm archive who's SHA256 hash
93+
// starts with the provided prefix.
94+
func (s *CharmStore) GetBySHA256Prefix(ctx context.Context, sha256Prefix string) (io.ReadCloser, error) {
95+
store, err := s.objectStoreGetter.GetObjectStore(ctx)
96+
if err != nil {
97+
return nil, errors.Errorf("getting object store: %w", err)
98+
}
99+
reader, _, err := store.GetBySHA256Prefix(ctx, sha256Prefix)
100+
if errors.Is(err, objectstoreerrors.ObjectNotFound) {
101+
return nil, applicationerrors.CharmNotFound
102+
}
81103
if err != nil {
82104
return nil, errors.Errorf("getting charm: %w", err)
83105
}

domain/application/charm/store/store_mock_test.go

Lines changed: 40 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)