From c4870d990cb0f7398d0cb569ee438f4a24e57f22 Mon Sep 17 00:00:00 2001 From: Andrew Block Date: Sun, 2 Jul 2023 07:21:15 -0500 Subject: [PATCH] Add created OCI annotation Signed-off-by: Andrew Block --- pkg/registry/client.go | 10 +++++++++- pkg/registry/util.go | 11 ++++++++--- pkg/registry/util_test.go | 4 ++-- pkg/registry/utils_test.go | 14 +++++++------- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/pkg/registry/client.go b/pkg/registry/client.go index f9569b62b39..509f82d4ae8 100644 --- a/pkg/registry/client.go +++ b/pkg/registry/client.go @@ -498,6 +498,7 @@ type ( pushOperation struct { provData []byte strictMode bool + test bool } ) @@ -551,7 +552,7 @@ func (c *Client) Push(data []byte, ref string, options ...PushOption) (*PushResu descriptors = append(descriptors, provDescriptor) } - ociAnnotations := generateOCIAnnotations(meta) + ociAnnotations := generateOCIAnnotations(meta, operation.test) manifestData, manifest, err := content.GenerateManifest(&configDescriptor, ociAnnotations, descriptors...) if err != nil { @@ -616,6 +617,13 @@ func PushOptStrictMode(strictMode bool) PushOption { } } +// PushOptTest returns a function that sets whether test setting on push +func PushOptTest(test bool) PushOption { + return func(operation *pushOperation) { + operation.test = test + } +} + // Tags provides a sorted list all semver compliant tags for a given repository func (c *Client) Tags(ref string) ([]string, error) { parsedReference, err := registry.ParseReference(ref) diff --git a/pkg/registry/util.go b/pkg/registry/util.go index a4b90c80ccf..822124cc4fc 100644 --- a/pkg/registry/util.go +++ b/pkg/registry/util.go @@ -23,6 +23,7 @@ import ( "io" "net/http" "strings" + "time" "github.com/Masterminds/semver/v3" ocispec "github.com/opencontainers/image-spec/specs-go/v1" @@ -163,10 +164,10 @@ func NewRegistryClientWithTLS(out io.Writer, certFile, keyFile, caFile string, i } // generateOCIAnnotations will generate OCI annotations to include within the OCI manifest -func generateOCIAnnotations(meta *chart.Metadata) map[string]string { +func generateOCIAnnotations(meta *chart.Metadata, test bool) map[string]string { // Get annotations from Chart attributes - ociAnnotations := generateChartOCIAnnotations(meta) + ociAnnotations := generateChartOCIAnnotations(meta, test) // Copy Chart annotations annotations: @@ -187,7 +188,7 @@ annotations: } // getChartOCIAnnotations will generate OCI annotations from the provided chart -func generateChartOCIAnnotations(meta *chart.Metadata) map[string]string { +func generateChartOCIAnnotations(meta *chart.Metadata, test bool) map[string]string { chartOCIAnnotations := map[string]string{} chartOCIAnnotations = addToMap(chartOCIAnnotations, ocispec.AnnotationDescription, meta.Description) @@ -195,6 +196,10 @@ func generateChartOCIAnnotations(meta *chart.Metadata) map[string]string { chartOCIAnnotations = addToMap(chartOCIAnnotations, ocispec.AnnotationVersion, meta.Version) chartOCIAnnotations = addToMap(chartOCIAnnotations, ocispec.AnnotationURL, meta.Home) + if !test { + chartOCIAnnotations = addToMap(chartOCIAnnotations, ocispec.AnnotationCreated, time.Now().UTC().Format(time.RFC3339)) + } + if len(meta.Sources) > 0 { chartOCIAnnotations = addToMap(chartOCIAnnotations, ocispec.AnnotationSource, meta.Sources[0]) } diff --git a/pkg/registry/util_test.go b/pkg/registry/util_test.go index 3066257ade0..fe5eb93ce3c 100644 --- a/pkg/registry/util_test.go +++ b/pkg/registry/util_test.go @@ -137,7 +137,7 @@ func TestGenerateOCIChartAnnotations(t *testing.T) { for _, tt := range tests { - result := generateChartOCIAnnotations(tt.chart) + result := generateChartOCIAnnotations(tt.chart, true) if !reflect.DeepEqual(tt.expect, result) { t.Errorf("%s: expected map %v, got %v", tt.name, tt.expect, result) @@ -206,7 +206,7 @@ func TestGenerateOCIAnnotations(t *testing.T) { for _, tt := range tests { - result := generateOCIAnnotations(tt.chart) + result := generateOCIAnnotations(tt.chart, true) if !reflect.DeepEqual(tt.expect, result) { t.Errorf("%s: expected map %v, got %v", tt.name, tt.expect, result) diff --git a/pkg/registry/utils_test.go b/pkg/registry/utils_test.go index bdeacc71204..664a3d84cc2 100644 --- a/pkg/registry/utils_test.go +++ b/pkg/registry/utils_test.go @@ -216,7 +216,7 @@ func initCompromisedRegistryTestServer() string { func testPush(suite *TestSuite) { // Bad bytes ref := fmt.Sprintf("%s/testrepo/testchart:1.2.3", suite.DockerRegistryHost) - _, err := suite.RegistryClient.Push([]byte("hello"), ref) + _, err := suite.RegistryClient.Push([]byte("hello"), ref, PushOptTest(true)) suite.NotNil(err, "error pushing non-chart bytes") // Load a test chart @@ -227,20 +227,20 @@ func testPush(suite *TestSuite) { // non-strict ref (chart name) ref = fmt.Sprintf("%s/testrepo/boop:%s", suite.DockerRegistryHost, meta.Version) - _, err = suite.RegistryClient.Push(chartData, ref) + _, err = suite.RegistryClient.Push(chartData, ref, PushOptTest(true)) suite.NotNil(err, "error pushing non-strict ref (bad basename)") // non-strict ref (chart name), with strict mode disabled - _, err = suite.RegistryClient.Push(chartData, ref, PushOptStrictMode(false)) + _, err = suite.RegistryClient.Push(chartData, ref, PushOptStrictMode(false), PushOptTest(true)) suite.Nil(err, "no error pushing non-strict ref (bad basename), with strict mode disabled") // non-strict ref (chart version) ref = fmt.Sprintf("%s/testrepo/%s:latest", suite.DockerRegistryHost, meta.Name) - _, err = suite.RegistryClient.Push(chartData, ref) + _, err = suite.RegistryClient.Push(chartData, ref, PushOptTest(true)) suite.NotNil(err, "error pushing non-strict ref (bad tag)") // non-strict ref (chart version), with strict mode disabled - _, err = suite.RegistryClient.Push(chartData, ref, PushOptStrictMode(false)) + _, err = suite.RegistryClient.Push(chartData, ref, PushOptStrictMode(false), PushOptTest(true)) suite.Nil(err, "no error pushing non-strict ref (bad tag), with strict mode disabled") // basic push, good ref @@ -249,7 +249,7 @@ func testPush(suite *TestSuite) { meta, err = extractChartMeta(chartData) suite.Nil(err, "no error extracting chart meta") ref = fmt.Sprintf("%s/testrepo/%s:%s", suite.DockerRegistryHost, meta.Name, meta.Version) - _, err = suite.RegistryClient.Push(chartData, ref) + _, err = suite.RegistryClient.Push(chartData, ref, PushOptTest(true)) suite.Nil(err, "no error pushing good ref") _, err = suite.RegistryClient.Pull(ref) @@ -267,7 +267,7 @@ func testPush(suite *TestSuite) { // push with prov ref = fmt.Sprintf("%s/testrepo/%s:%s", suite.DockerRegistryHost, meta.Name, meta.Version) - result, err := suite.RegistryClient.Push(chartData, ref, PushOptProvData(provData)) + result, err := suite.RegistryClient.Push(chartData, ref, PushOptProvData(provData), PushOptTest(true)) suite.Nil(err, "no error pushing good ref with prov") _, err = suite.RegistryClient.Pull(ref)