Skip to content

Commit c47506b

Browse files
committed
Allow artifact add to override org.opencontainers.image.title annotation
Signed-off-by: Daniel J Walsh <[email protected]>
1 parent 7fecff5 commit c47506b

File tree

3 files changed

+42
-13
lines changed

3 files changed

+42
-13
lines changed

pkg/libartifact/store/store.go

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,13 +221,6 @@ func (as ArtifactStore) Add(ctx context.Context, dest string, artifactBlobs []en
221221
return nil, errors.New("append option is not compatible with type option")
222222
}
223223

224-
// currently we don't allow override of the filename ; if a user requirement emerges,
225-
// we could seemingly accommodate but broadens possibilities of something bad happening
226-
// for things like `artifact extract`
227-
if _, hasTitle := options.Annotations[specV1.AnnotationTitle]; hasTitle {
228-
return nil, fmt.Errorf("cannot override filename with %s annotation", specV1.AnnotationTitle)
229-
}
230-
231224
locked := true
232225
as.lock.Lock()
233226
defer func() {
@@ -320,7 +313,17 @@ func (as ArtifactStore) Add(ctx context.Context, dest string, artifactBlobs []en
320313
}
321314

322315
annotations := maps.Clone(options.Annotations)
323-
annotations[specV1.AnnotationTitle] = artifactBlob.FileName
316+
if title, ok := annotations[specV1.AnnotationTitle]; ok {
317+
// Verify a duplicate AnnotationTitle is not in use in a different layer.
318+
for _, layer := range artifactManifest.Layers {
319+
if title == layer.Annotations[specV1.AnnotationTitle] {
320+
return nil, fmt.Errorf("duplicate layers %s labels within an artifact not allowed", specV1.AnnotationTitle)
321+
}
322+
}
323+
} else {
324+
// Only override if the user did not specify the Title
325+
annotations[specV1.AnnotationTitle] = artifactBlob.FileName
326+
}
324327

325328
newLayer := specV1.Descriptor{
326329
MediaType: options.FileMIMEType,
@@ -472,6 +475,11 @@ func (as ArtifactStore) BlobMountPaths(ctx context.Context, nameOrDigest string,
472475
mountPaths := make([]libartTypes.BlobMountPath, 0, len(arty.Manifest.Layers))
473476
for _, l := range arty.Manifest.Layers {
474477
title := l.Annotations[specV1.AnnotationTitle]
478+
for _, mp := range mountPaths {
479+
if title == mp.Name {
480+
return nil, fmt.Errorf("Annotation %q:%q is used in multiple different layers within artifact", specV1.AnnotationTitle, title)
481+
}
482+
}
475483
filename, err := generateArtifactBlobName(title, l.Digest)
476484
if err != nil {
477485
return nil, err

pkg/machine/ocipull/ociartifact.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const (
2727
artifactRegistry = "quay.io"
2828
artifactRepo = "podman"
2929
artifactImageName = "machine-os"
30-
artifactOriginalName = "org.opencontainers.image.title"
30+
artifactOriginalName = specV1.AnnotationTitle
3131
machineOS = "linux"
3232
)
3333

test/e2e/artifact_test.go

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/containers/podman/v5/utils"
1515
. "github.com/onsi/ginkgo/v2"
1616
. "github.com/onsi/gomega"
17+
imgspec "github.com/opencontainers/image-spec/specs-go/v1"
1718
)
1819

1920
const (
@@ -99,7 +100,10 @@ var _ = Describe("Podman artifact", func() {
99100
It("podman artifact add with options", func() {
100101
yamlType := "text/yaml"
101102
artifact1Name := "localhost/test/artifact1"
103+
artifact2Name := "localhost/test/artifact2"
104+
artifact3Name := "localhost/test/artifact3"
102105
artifact1File, err := createArtifactFile(1024)
106+
artifact2File, err := createArtifactFile(1024)
103107
Expect(err).ToNot(HaveOccurred())
104108

105109
artifactType := "octet/foobar"
@@ -115,9 +119,26 @@ var _ = Describe("Podman artifact", func() {
115119
Expect(a.Manifest.Layers[0].Annotations["flavor"]).To(Equal("lemon"))
116120
Expect(a.Manifest.Layers[0].MediaType).To(Equal(yamlType))
117121

118-
failSession := podmanTest.Podman([]string{"artifact", "add", "--annotation", "org.opencontainers.image.title=foobar", "foobar", artifact1File})
122+
title := RandomString(12)
123+
annotation3 := fmt.Sprintf("%s=%s", imgspec.AnnotationTitle, title)
124+
podmanTest.PodmanExitCleanly("artifact", "add", "--annotation", annotation3, artifact2Name, artifact1File)
125+
a = podmanTest.InspectArtifact(artifact2Name)
126+
Expect(a.Manifest.Layers[0].Annotations[imgspec.AnnotationTitle]).To(Equal(title))
127+
128+
failSession := podmanTest.Podman([]string{"artifact", "add", "--append", "--annotation", annotation3, artifact2Name, artifact2File})
119129
failSession.WaitWithDefaultTimeout()
120-
Expect(failSession).Should(ExitWithError(125, "Error: cannot override filename with org.opencontainers.image.title annotation"))
130+
Expect(failSession).Should(ExitWithError(125, "Error: duplicate layers org.opencontainers.image.title labels within an artifact not allowed"))
131+
132+
title = RandomString(12)
133+
annotation3 = fmt.Sprintf("%s=%s", imgspec.AnnotationTitle, title)
134+
podmanTest.PodmanExitCleanly("artifact", "add", "--append", "--annotation", annotation3, artifact2Name, artifact2File)
135+
a = podmanTest.InspectArtifact(artifact2Name)
136+
Expect(a.Manifest.Layers[1].Annotations[imgspec.AnnotationTitle]).To(Equal(title))
137+
138+
failSession = podmanTest.Podman([]string{"artifact", "add", "--annotation", annotation3, artifact3Name, artifact1File, artifact2File})
139+
failSession.WaitWithDefaultTimeout()
140+
Expect(failSession).Should(ExitWithError(125, "Error: duplicate layers org.opencontainers.image.title labels within an artifact not allowed"))
141+
121142
})
122143

123144
It("podman artifact add multiple", func() {
@@ -480,9 +501,9 @@ var _ = Describe("Podman artifact", func() {
480501
Expect(a.Manifest.Layers).To(HaveLen(3))
481502

482503
for _, l := range a.Manifest.Layers {
483-
layersNames[l.Annotations["org.opencontainers.image.title"]] += 1
504+
layersNames[l.Annotations[imgspec.AnnotationTitle]] += 1
484505

485-
if l.Annotations["org.opencontainers.image.title"] == filepath.Base(artifact3File) {
506+
if l.Annotations[imgspec.AnnotationTitle] == filepath.Base(artifact3File) {
486507
Expect(l.Annotations["color"]).To(Equal("blue"))
487508
} else {
488509
Expect(l.Annotations).To(HaveLen(1))

0 commit comments

Comments
 (0)