diff --git a/app/cli/cmd/attestation_status.go b/app/cli/cmd/attestation_status.go index 425b5becd..a62867814 100644 --- a/app/cli/cmd/attestation_status.go +++ b/app/cli/cmd/attestation_status.go @@ -21,6 +21,7 @@ import ( "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" + "github.com/muesli/reflow/wrap" "github.com/spf13/cobra" "github.com/chainloop-dev/chainloop/app/cli/internal/action" @@ -126,25 +127,33 @@ func materialsTable(status *action.AttestationStatusResult) error { mt := newTableWriter() mt.SetTitle("Materials") - header := table.Row{"Name", "Type", "Set", "Required", "Is output"} - if full { - header = append(header, "Value") - } - - mt.AppendHeader(header) for _, m := range status.Materials { - row := table.Row{m.Name, m.Type, hBool(m.Set), hBool(m.Required)} - var outputInfo string + mt.AppendRow(table.Row{"Name", m.Name}) + mt.AppendRow(table.Row{"Type", m.Type}) + mt.AppendRow(table.Row{"Set", hBool(m.Set)}) + mt.AppendRow(table.Row{"Required", hBool(m.Required)}) if m.IsOutput { - outputInfo = "x" + mt.AppendRow(table.Row{"Is output", "Yes"}) } - row = append(row, outputInfo) if full { - row = append(row, m.Value) + if m.Value != "" { + mt.AppendRow(table.Row{"Value", wrap.String(m.Value, 100)}) + } + + if m.Hash != "" { + mt.AppendRow(table.Row{"Digest", m.Hash}) + } + } + + if len(m.Annotations) > 0 { + mt.AppendRow(table.Row{"Annotations", "------"}) + for _, a := range m.Annotations { + mt.AppendRow(table.Row{"", fmt.Sprintf("%s: %s", a.Name, a.Value)}) + } } - mt.AppendRow(row) + mt.AppendSeparator() } mt.Render() diff --git a/app/cli/internal/action/attestation_status.go b/app/cli/internal/action/attestation_status.go index 73627983d..d771d5a16 100644 --- a/app/cli/internal/action/attestation_status.go +++ b/app/cli/internal/action/attestation_status.go @@ -20,6 +20,7 @@ import ( "time" v1 "github.com/chainloop-dev/chainloop/app/cli/api/attestation/v1" + pbc "github.com/chainloop-dev/chainloop/app/controlplane/api/workflowcontract/v1" "github.com/chainloop-dev/chainloop/internal/attestation/crafter" ) @@ -37,11 +38,11 @@ type AttestationStatusResult struct { WorkflowMeta *AttestationStatusWorkflowMeta Materials []AttestationStatusResultMaterial EnvVars map[string]string - RunnerContext *AttestaionResultRunnerContext + RunnerContext *AttestationResultRunnerContext DryRun bool } -type AttestaionResultRunnerContext struct { +type AttestationResultRunnerContext struct { EnvVars map[string]string JobURL, RunnerType string } @@ -51,7 +52,7 @@ type AttestationStatusWorkflowMeta struct { } type AttestationStatusResultMaterial struct { - Name, Type, Value string + *Material Set, IsOutput, Required bool } @@ -93,12 +94,19 @@ func (action *AttestationStatus) Run() (*AttestationStatusResult, error) { // Materials for _, m := range c.CraftingState.InputSchema.Materials { materialResult := &AttestationStatusResultMaterial{ - Name: m.Name, Type: m.Type.String(), IsOutput: m.Output, Required: !m.Optional, + Material: &Material{ + Name: m.Name, Type: m.Type.String(), + Annotations: pbAnnotationsToAction(m.Annotations), + }, + IsOutput: m.Output, Required: !m.Optional, } + // If it has been added already we load the value if cm, found := c.CraftingState.Attestation.Materials[m.Name]; found { + if err := setMaterialValue(cm, materialResult.Material); err != nil { + return nil, err + } materialResult.Set = true - materialResult.Value = getMaterialSetValue(cm) } res.Materials = append(res.Materials, *materialResult) @@ -114,7 +122,7 @@ func (action *AttestationStatus) Run() (*AttestationStatusResult, error) { } res.EnvVars = envVars - res.RunnerContext = &AttestaionResultRunnerContext{ + res.RunnerContext = &AttestationResultRunnerContext{ EnvVars: c.Runner.ResolveEnvVars(), RunnerType: att.RunnerType.String(), JobURL: att.RunnerUrl, @@ -123,15 +131,32 @@ func (action *AttestationStatus) Run() (*AttestationStatusResult, error) { return res, nil } -func getMaterialSetValue(w *v1.Attestation_Material) string { +func pbAnnotationsToAction(in []*pbc.Annotation) []*Annotation { + res := make([]*Annotation, 0, len(in)) + + for _, a := range in { + res = append(res, &Annotation{ + Name: a.GetName(), + Value: a.GetValue(), + }) + } + + return res +} + +func setMaterialValue(w *v1.Attestation_Material, o *Material) error { switch m := w.GetM().(type) { case *v1.Attestation_Material_String_: - return m.String_.GetValue() + o.Value = m.String_.GetValue() case *v1.Attestation_Material_ContainerImage_: - return fmt.Sprintf("%s@%s", m.ContainerImage.GetName(), m.ContainerImage.GetDigest()) + o.Value = m.ContainerImage.GetName() + o.Hash = m.ContainerImage.GetDigest() case *v1.Attestation_Material_Artifact_: - return fmt.Sprintf("%s@%s", m.Artifact.GetName(), m.Artifact.GetDigest()) + o.Value = m.Artifact.GetName() + o.Hash = m.Artifact.GetDigest() + default: + return fmt.Errorf("unknown material type: %T", m) } - return "" + return nil }