Skip to content

Commit dd3620e

Browse files
Fixes value for storage.oci.repository (#974)
Previously while providing repo url value for storage oci repository, chains controller was giving an error as `a digest must contain exactly one '@' separator (e.g. registry/repository@digest)` because, it was not able to add digest Hence this patch fixes it, by formatting the value provided by the user and thus storing the attestations/signatures in the provided location Signed-off-by: PuneetPunamiya <ppunamiy@redhat.com>
1 parent 482b72d commit dd3620e

2 files changed

Lines changed: 79 additions & 12 deletions

File tree

pkg/chains/storage/oci/legacy.go

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ type Backend struct {
5454
// NewStorageBackend returns a new OCI StorageBackend that stores signatures in an OCI registry
5555
func NewStorageBackend(ctx context.Context, client kubernetes.Interface, cfg config.Config) *Backend {
5656
return &Backend{
57-
cfg: cfg,
57+
cfg: cfg,
58+
5859
client: client,
5960
getAuthenticator: func(ctx context.Context, obj objects.TektonObject, client kubernetes.Interface) (remote.Option, error) {
6061
kc, err := k8schain.New(ctx, client,
@@ -119,12 +120,17 @@ func (b *Backend) uploadSignature(ctx context.Context, format simple.SimpleConta
119120
imageName := format.ImageName()
120121
logger.Infof("Uploading %s signature", imageName)
121122

122-
ref, err := newDigest(b.cfg, imageName)
123+
ref, err := name.NewDigest(imageName)
123124
if err != nil {
124125
return errors.Wrap(err, "getting digest")
125126
}
126127

127-
store, err := NewSimpleStorerFromConfig(WithTargetRepository(ref.Repository))
128+
repo, err := newRepo(b.cfg, ref)
129+
if err != nil {
130+
return errors.Wrapf(err, "getting storage repo for sub %s", imageName)
131+
}
132+
133+
store, err := NewSimpleStorerFromConfig(WithTargetRepository(repo))
128134
if err != nil {
129135
return err
130136
}
@@ -154,12 +160,17 @@ func (b *Backend) uploadAttestation(ctx context.Context, attestation in_toto.Sta
154160
imageName := fmt.Sprintf("%s@sha256:%s", subj.Name, subj.Digest["sha256"])
155161
logger.Infof("Starting attestation upload to OCI for %s...", imageName)
156162

157-
ref, err := newDigest(b.cfg, imageName)
163+
ref, err := name.NewDigest(imageName)
158164
if err != nil {
159165
return errors.Wrapf(err, "getting digest for subj %s", imageName)
160166
}
161167

162-
store, err := NewAttestationStorer(WithTargetRepository(ref.Repository))
168+
repo, err := newRepo(b.cfg, ref)
169+
if err != nil {
170+
return errors.Wrapf(err, "getting storage repo for sub %s", imageName)
171+
}
172+
173+
store, err := NewAttestationStorer(WithTargetRepository(repo))
163174
if err != nil {
164175
return err
165176
}
@@ -278,16 +289,14 @@ func (b *Backend) RetrieveArtifact(ctx context.Context, obj objects.TektonObject
278289
return m, nil
279290
}
280291

281-
func newDigest(cfg config.Config, imageName string) (name.Digest, error) {
282-
// Override image name from config if set.
283-
if r := cfg.Storage.OCI.Repository; r != "" {
284-
imageName = r
285-
}
286-
292+
func newRepo(cfg config.Config, imageName name.Digest) (name.Repository, error) {
287293
var opts []name.Option
288294
if cfg.Storage.OCI.Insecure {
289295
opts = append(opts, name.Insecure)
290296
}
291297

292-
return name.NewDigest(imageName, opts...)
298+
if storageOCIRepository := cfg.Storage.OCI.Repository; storageOCIRepository != "" {
299+
return name.NewRepository(storageOCIRepository, opts...)
300+
}
301+
return name.NewRepository(imageName.Repository.Name(), opts...)
293302
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
Copyright 2023 The Tekton Authors
3+
Licensed under the Apache License, Version 2.0 (the "License");
4+
you may not use this file except in compliance with the License.
5+
You may obtain a copy of the License at
6+
http://www.apache.org/licenses/LICENSE-2.0
7+
Unless required by applicable law or agreed to in writing, software
8+
distributed under the License is distributed on an "AS IS" BASIS,
9+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10+
See the License for the specific language governing permissions and
11+
limitations under the License.
12+
*/
13+
14+
package oci
15+
16+
import (
17+
"testing"
18+
19+
"github.com/google/go-containerregistry/pkg/name"
20+
"github.com/stretchr/testify/assert"
21+
"github.com/tektoncd/chains/pkg/config"
22+
)
23+
24+
func TestNewRepo(t *testing.T) {
25+
t.Run("Use any registry in storage oci repository", func(t *testing.T) {
26+
cfg := config.Config{}
27+
cfg.Storage.OCI.Repository = "example.com/foo"
28+
tests := []struct {
29+
imageName string
30+
expectedRepoName string
31+
}{
32+
{
33+
imageName: "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init@sha256:bc4f7468f87486e3835b09098c74cd7f54db2cf697cbb9b824271b95a2d0871e",
34+
expectedRepoName: "example.com/foo",
35+
},
36+
{
37+
imageName: "foo.io/bar/kaniko-chains@sha256:bc4f7468f87486e3835b09098c74cd7f54db2cf697cbb9b824271b95a2d0871e",
38+
expectedRepoName: "example.com/foo",
39+
},
40+
{
41+
imageName: "registry.com/spam/spam/spam/spam/spam/spam@sha256:bc4f7468f87486e3835b09098c74cd7f54db2cf697cbb9b824271b95a2d0871e",
42+
expectedRepoName: "example.com/foo",
43+
},
44+
}
45+
46+
for _, test := range tests {
47+
ref, err := name.NewDigest(test.imageName)
48+
if err != nil {
49+
t.Error(err)
50+
}
51+
repo, err := newRepo(cfg, ref)
52+
if err != nil {
53+
t.Error(err)
54+
}
55+
assert.Equal(t, repo.Name(), test.expectedRepoName)
56+
}
57+
})
58+
}

0 commit comments

Comments
 (0)