Skip to content

Commit 33018a6

Browse files
committed
Check cagent annotation
Signed-off-by: David Gageot <david.gageot@docker.com>
1 parent 3443593 commit 33018a6

5 files changed

Lines changed: 28 additions & 11 deletions

File tree

cmd/root/push.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ func newPushCmd() *cobra.Command {
2727
func runPushCommand(cmd *cobra.Command, args []string) error {
2828
telemetry.TrackCommand("push", args)
2929

30+
ctx := cmd.Context()
3031
filePath := args[0]
3132
tag := args[1]
3233
out := cli.NewPrinter(cmd.OutOrStdout())
@@ -36,7 +37,7 @@ func runPushCommand(cmd *cobra.Command, args []string) error {
3637
return err
3738
}
3839

39-
_, err = oci.PackageFileAsOCIToStore(filePath, tag, store)
40+
_, err = oci.PackageFileAsOCIToStore(ctx, filePath, tag, store)
4041
if err != nil {
4142
return fmt.Errorf("failed to build artifact: %w", err)
4243
}

pkg/agentfile/resolver_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ agents:
112112

113113
// Package as OCI artifact
114114
ociRef := "test.registry.io/myorg/testagent:v1"
115-
_, err = oci.PackageFileAsOCIToStore(agentFile, ociRef, store)
115+
_, err = oci.PackageFileAsOCIToStore(t.Context(), agentFile, ociRef, store)
116116
require.NoError(t, err)
117117

118118
ctx, cancel := context.WithTimeout(t.Context(), 5*time.Second)
@@ -156,7 +156,7 @@ agents:
156156
`
157157
updatedFile := filepath.Join(t.TempDir(), "updated-agent.yaml")
158158
require.NoError(t, os.WriteFile(updatedFile, []byte(updatedContent), 0o644))
159-
_, err = oci.PackageFileAsOCIToStore(updatedFile, ociRef, store)
159+
_, err = oci.PackageFileAsOCIToStore(t.Context(), updatedFile, ociRef, store)
160160
require.NoError(t, err)
161161

162162
// Third resolution (simulating reload after update)
@@ -202,9 +202,9 @@ agents:
202202
// Package as different OCI artifacts
203203
ociRef1 := "test.io/org/agent1:v1"
204204
ociRef2 := "test.io/org/agent2:v1"
205-
_, err = oci.PackageFileAsOCIToStore(agent1File, ociRef1, store)
205+
_, err = oci.PackageFileAsOCIToStore(t.Context(), agent1File, ociRef1, store)
206206
require.NoError(t, err)
207-
_, err = oci.PackageFileAsOCIToStore(agent2File, ociRef2, store)
207+
_, err = oci.PackageFileAsOCIToStore(t.Context(), agent2File, ociRef2, store)
208208
require.NoError(t, err)
209209

210210
ctx, cancel := context.WithTimeout(t.Context(), 5*time.Second)
@@ -252,7 +252,7 @@ agents:
252252

253253
// Package as OCI artifact
254254
ociRef := "test.io/cleanup/agent:v1"
255-
_, err = oci.PackageFileAsOCIToStore(agentFile, ociRef, store)
255+
_, err = oci.PackageFileAsOCIToStore(t.Context(), agentFile, ociRef, store)
256256
require.NoError(t, err)
257257

258258
ctx, cancel := context.WithCancel(t.Context())

pkg/oci/package_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ description: "Test application"
2222
require.NoError(t, err)
2323

2424
tag := "test-app:v1.0.0"
25-
digest, err := PackageFileAsOCIToStore(testFile, tag, store)
25+
digest, err := PackageFileAsOCIToStore(t.Context(), testFile, tag, store)
2626
require.NoError(t, err)
2727

2828
assert.NotEmpty(t, digest)
@@ -54,7 +54,7 @@ description: "Test application"
5454
func TestPackageFileAsOCIToStoreMissingFile(t *testing.T) {
5555
store, err := content.NewStore(content.WithBaseDir(t.TempDir()))
5656
require.NoError(t, err)
57-
_, err = PackageFileAsOCIToStore("/non/existent/file.txt", "test:latest", store)
57+
_, err = PackageFileAsOCIToStore(t.Context(), "/non/existent/file.txt", "test:latest", store)
5858
require.Error(t, err)
5959
}
6060

@@ -64,7 +64,7 @@ func TestPackageFileAsOCIToStoreInvalidTag(t *testing.T) {
6464

6565
store, err := content.NewStore(content.WithBaseDir(t.TempDir()))
6666
require.NoError(t, err)
67-
_, err = PackageFileAsOCIToStore(testFile, "", store)
67+
_, err = PackageFileAsOCIToStore(t.Context(), testFile, "", store)
6868
require.Error(t, err)
6969
}
7070

@@ -106,7 +106,7 @@ func TestPackageFileAsOCIToStoreDifferentFileTypes(t *testing.T) {
106106
require.NoError(t, os.WriteFile(testFile, []byte(tc.content), 0o644))
107107

108108
// Package the file as OCI artifact
109-
digest, err := PackageFileAsOCIToStore(testFile, tc.tag, store)
109+
digest, err := PackageFileAsOCIToStore(t.Context(), testFile, tc.tag, store)
110110
require.NoError(t, err)
111111

112112
digests = append(digests, digest)

pkg/remote/pull.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ func Pull(ctx context.Context, registryRef string, opts ...crane.Option) (string
3232
localRef := ref.Context().RepositoryStr() + ":" + ref.Identifier()
3333
if meta, metaErr := store.GetArtifactMetadata(localRef); metaErr == nil {
3434
if meta.Digest == remoteDigest {
35+
if !hasCagentAnnotation(meta.Annotations) {
36+
return "", fmt.Errorf("artifact %s found in store wasn't created by cagent", localRef)
37+
}
3538
return meta.Digest, nil
3639
}
3740
}
@@ -41,10 +44,23 @@ func Pull(ctx context.Context, registryRef string, opts ...crane.Option) (string
4144
return "", fmt.Errorf("pulling image from registry %s: %w", registryRef, err)
4245
}
4346

47+
manifest, err := img.Manifest()
48+
if err != nil {
49+
return "", fmt.Errorf("getting manifest from pulled image: %w", err)
50+
}
51+
if !hasCagentAnnotation(manifest.Annotations) {
52+
return "", fmt.Errorf("artifact %s found in store wasn't created by cagent", localRef)
53+
}
54+
4455
digest, err := store.StoreArtifact(img, localRef)
4556
if err != nil {
4657
return "", fmt.Errorf("storing artifact in content store: %w", err)
4758
}
4859

4960
return digest, nil
5061
}
62+
63+
func hasCagentAnnotation(annotations map[string]string) bool {
64+
_, exists := annotations["io.docker.cagent.version"]
65+
return exists
66+
}

pkg/server/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ func (s *Server) pushAgent(c echo.Context) error {
769769
return echo.NewHTTPError(http.StatusInternalServerError, "failed to create content store")
770770
}
771771

772-
digest, err := oci.PackageFileAsOCIToStore(validatedFilepath, req.Tag, store)
772+
digest, err := oci.PackageFileAsOCIToStore(c.Request().Context(), validatedFilepath, req.Tag, store)
773773
if err != nil {
774774
slog.Error("Failed to build artifact", "filepath", validatedFilepath, "tag", req.Tag, "error", err)
775775
return echo.NewHTTPError(http.StatusInternalServerError, "failed to build artifact")

0 commit comments

Comments
 (0)