From 51612a6ddb4c02f000038e5a55d8806405e27092 Mon Sep 17 00:00:00 2001 From: Steve Tooke Date: Thu, 18 Apr 2024 15:42:55 +0100 Subject: [PATCH] Support annotations with `attest artifact` (#170) --- cmd/kosli/attestArtifact.go | 8 ++++++++ cmd/kosli/attestArtifact_test.go | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/cmd/kosli/attestArtifact.go b/cmd/kosli/attestArtifact.go index 2efe8f785..f0243f337 100644 --- a/cmd/kosli/attestArtifact.go +++ b/cmd/kosli/attestArtifact.go @@ -20,6 +20,7 @@ type attestArtifactOptions struct { payload AttestArtifactPayload externalFingerprints map[string]string externalURLs map[string]string + annotations map[string]string } type AttestArtifactPayload struct { @@ -33,6 +34,7 @@ type AttestArtifactPayload struct { Name string `json:"template_reference_name"` TrailName string `json:"trail_name"` ExternalURLs map[string]*URLInfo `json:"external_urls,omitempty"` + Annotations map[string]string `json:"annotations,omitempty"` } const attestArtifactShortDesc = `Attest an artifact creation to a Kosli flow. ` @@ -119,6 +121,7 @@ func newAttestArtifactCmd(out io.Writer) *cobra.Command { cmd.Flags().StringVarP(&o.payload.TrailName, "trail", "T", "", trailNameFlag) cmd.Flags().StringToStringVar(&o.externalFingerprints, "external-fingerprint", map[string]string{}, externalFingerprintFlag) cmd.Flags().StringToStringVar(&o.externalURLs, "external-url", map[string]string{}, externalURLFlag) + cmd.Flags().StringToStringVar(&o.annotations, "annotate", map[string]string{}, annotationFlag) addFingerprintFlags(cmd, o.fingerprintOptions) addDryRunFlag(cmd) @@ -149,6 +152,11 @@ func (o *attestArtifactOptions) run(args []string) error { return err } + o.payload.Annotations, err = proccessAnnotations(o.annotations) + if err != nil { + return err + } + if o.payload.Fingerprint == "" { o.payload.Fingerprint, err = GetSha256Digest(args[0], o.fingerprintOptions, logger) if err != nil { diff --git a/cmd/kosli/attestArtifact_test.go b/cmd/kosli/attestArtifact_test.go index 486e4319b..c65de747a 100644 --- a/cmd/kosli/attestArtifact_test.go +++ b/cmd/kosli/attestArtifact_test.go @@ -87,6 +87,17 @@ func (suite *AttestArtifactCommandTestSuite) TestAttestArtifactCmd() { cmd: fmt.Sprintf("attest artifact testdata/file1 --fingerprint 7509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9 --name cli --commit HEAD --build-url example.com --commit-url example.com --external-url file=https://example.com --external-fingerprint file=7509e5bda0 %s", suite.defaultKosliArguments), golden: "Error: Input payload validation failed: map[external_urls.file.fingerprint:'7509e5bda0' does not match '^[a-f0-9]{64}$']\n", }, + { + name: "can attest with annotations against a trail", + cmd: fmt.Sprintf("attest artifact testdata/file1 --fingerprint 7509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9 --name cli --commit HEAD --build-url example.com --commit-url example.com --annotate foo=bar --annotate baz=\"data with spaces\" %s", suite.defaultKosliArguments), + golden: "artifact testdata/file1 was attested with fingerprint: 7509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9\n", + }, + { + wantError: true, + name: "fails when annotation is not valid", + cmd: fmt.Sprintf("attest artifact testdata/file1 --fingerprint 7509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9 --name cli --commit HEAD --build-url example.com --commit-url example.com --annotate foo.baz=bar %s", suite.defaultKosliArguments), + golden: "Error: --annotate flag should be in the format key=value. Invalid key: 'foo.baz'. Key can only contain [A-Za-z0-9_].\n", + }, } runTestCmd(suite.T(), tests)