From abd0b377a523c27ced0f888ea66a481280b643e9 Mon Sep 17 00:00:00 2001
From: Sascha Schwarze <schwarzs@de.ibm.com>
Date: Wed, 18 Oct 2023 22:35:02 +0200
Subject: [PATCH] Fix BuildRun Status source

---
 deploy/crds/shipwright.io_buildruns.yaml      | 68 ++++++++-----------
 pkg/apis/build/v1beta1/buildrun_conversion.go |  8 +--
 pkg/apis/build/v1beta1/buildrun_types.go      |  7 +-
 .../build/v1beta1/zz_generated.deepcopy.go    | 10 ++-
 test/e2e/v1beta1/validators_test.go           | 12 ++--
 5 files changed, 44 insertions(+), 61 deletions(-)

diff --git a/deploy/crds/shipwright.io_buildruns.yaml b/deploy/crds/shipwright.io_buildruns.yaml
index d9278535af..51cb70047c 100644
--- a/deploy/crds/shipwright.io_buildruns.yaml
+++ b/deploy/crds/shipwright.io_buildruns.yaml
@@ -12520,45 +12520,35 @@ spec:
                     format: int64
                     type: integer
                 type: object
-              sources:
-                description: Sources holds the results emitted from the step definition
-                  of different sources
-                items:
-                  description: SourceResult holds the results emitted from the different
-                    sources
-                  properties:
-                    git:
-                      description: Git holds the results emitted from the source step
-                        of type git
-                      properties:
-                        branchName:
-                          description: BranchName holds the default branch name of
-                            the git source this will be set only when revision is
-                            not specified in Build object
-                          type: string
-                        commitAuthor:
-                          description: CommitAuthor holds the commit author of a git
-                            source
-                          type: string
-                        commitSha:
-                          description: CommitSha holds the commit sha of git source
-                          type: string
-                      type: object
-                    name:
-                      description: Name is the name of source
-                      type: string
-                    ociArtifact:
-                      description: OciArtifact holds the results emitted from the
-                        source step of type ociArtifact
-                      properties:
-                        digest:
-                          description: Digest hold the image digest result
-                          type: string
-                      type: object
-                  required:
-                  - name
-                  type: object
-                type: array
+              source:
+                description: Source holds the results emitted from the source step
+                properties:
+                  git:
+                    description: Git holds the results emitted from the source step
+                      of type git
+                    properties:
+                      branchName:
+                        description: BranchName holds the default branch name of the
+                          git source this will be set only when revision is not specified
+                          in Build object
+                        type: string
+                      commitAuthor:
+                        description: CommitAuthor holds the commit author of a git
+                          source
+                        type: string
+                      commitSha:
+                        description: CommitSha holds the commit sha of git source
+                        type: string
+                    type: object
+                  ociArtifact:
+                    description: OciArtifact holds the results emitted from the source
+                      step of type ociArtifact
+                    properties:
+                      digest:
+                        description: Digest hold the image digest result
+                        type: string
+                    type: object
+                type: object
               startTime:
                 description: StartTime is the time the build is actually started.
                 format: date-time
diff --git a/pkg/apis/build/v1beta1/buildrun_conversion.go b/pkg/apis/build/v1beta1/buildrun_conversion.go
index 4d1e213b70..27f3c0d30e 100644
--- a/pkg/apis/build/v1beta1/buildrun_conversion.go
+++ b/pkg/apis/build/v1beta1/buildrun_conversion.go
@@ -137,14 +137,12 @@ func (src *BuildRun) ConvertFrom(ctx context.Context, obj *unstructured.Unstruct
 
 	src.Spec.ConvertFrom(&alphaBuildRun.Spec)
 
-	sources := []SourceResult{}
+	var sourceStatus *SourceResult
 	for _, s := range alphaBuildRun.Status.Sources {
-		sr := SourceResult{
-			Name:        s.Name,
+		sourceStatus = &SourceResult{
 			Git:         (*GitSourceResult)(s.Git),
 			OciArtifact: (*OciArtifactSourceResult)(s.Bundle),
 		}
-		sources = append(sources, sr)
 	}
 
 	conditions := []Condition{}
@@ -169,7 +167,7 @@ func (src *BuildRun) ConvertFrom(ctx context.Context, obj *unstructured.Unstruct
 	}
 
 	src.Status = BuildRunStatus{
-		Sources:        sources,
+		Source:         sourceStatus,
 		Output:         (*Output)(alphaBuildRun.Status.Output),
 		Conditions:     conditions,
 		TaskRunName:    alphaBuildRun.Status.LatestTaskRunRef,
diff --git a/pkg/apis/build/v1beta1/buildrun_types.go b/pkg/apis/build/v1beta1/buildrun_types.go
index 2880a42130..7a40e822b0 100644
--- a/pkg/apis/build/v1beta1/buildrun_types.go
+++ b/pkg/apis/build/v1beta1/buildrun_types.go
@@ -110,8 +110,6 @@ const (
 
 // SourceResult holds the results emitted from the different sources
 type SourceResult struct {
-	// Name is the name of source
-	Name string `json:"name"`
 
 	// Git holds the results emitted from the
 	// source step of type git
@@ -162,11 +160,10 @@ type Output struct {
 
 // BuildRunStatus defines the observed state of BuildRun
 type BuildRunStatus struct {
-	// Sources holds the results emitted from the step definition
-	// of different sources
+	// Source holds the results emitted from the source step
 	//
 	// +optional
-	Sources []SourceResult `json:"sources,omitempty"`
+	Source *SourceResult `json:"source,omitempty"`
 
 	// Output holds the results emitted from step definition of an output
 	//
diff --git a/pkg/apis/build/v1beta1/zz_generated.deepcopy.go b/pkg/apis/build/v1beta1/zz_generated.deepcopy.go
index f7660573fa..4c3dc1dfeb 100644
--- a/pkg/apis/build/v1beta1/zz_generated.deepcopy.go
+++ b/pkg/apis/build/v1beta1/zz_generated.deepcopy.go
@@ -296,12 +296,10 @@ func (in *BuildRunSpec) DeepCopy() *BuildRunSpec {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *BuildRunStatus) DeepCopyInto(out *BuildRunStatus) {
 	*out = *in
-	if in.Sources != nil {
-		in, out := &in.Sources, &out.Sources
-		*out = make([]SourceResult, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
+	if in.Source != nil {
+		in, out := &in.Source, &out.Source
+		*out = new(SourceResult)
+		(*in).DeepCopyInto(*out)
 	}
 	if in.Output != nil {
 		in, out := &in.Output, &out.Output
diff --git a/test/e2e/v1beta1/validators_test.go b/test/e2e/v1beta1/validators_test.go
index 46eb6f9a8e..05d1bcb2fb 100644
--- a/test/e2e/v1beta1/validators_test.go
+++ b/test/e2e/v1beta1/validators_test.go
@@ -157,7 +157,7 @@ func validateBuildRunResultsFromGitSource(testBuildRun *buildv1beta1.BuildRun) {
 	testBuildRun, err := testBuild.GetBR(testBuildRun.Name)
 	Expect(err).ToNot(HaveOccurred())
 
-	Expect(len(testBuildRun.Status.Sources)).To(Equal(1))
+	Expect(testBuildRun.Status.Source).ToNot(BeNil())
 
 	// Only run the TaskRun checks if Tekton objects can be accessed
 	if os.Getenv(EnvVarVerifyTektonObjects) == "true" {
@@ -167,11 +167,11 @@ func validateBuildRunResultsFromGitSource(testBuildRun *buildv1beta1.BuildRun) {
 		for _, result := range tr.Status.TaskRunResults {
 			switch result.Name {
 			case "shp-source-default-commit-sha":
-				Expect(result.Value.StringVal).To(Equal(testBuildRun.Status.Sources[0].Git.CommitSha))
+				Expect(result.Value.StringVal).To(Equal(testBuildRun.Status.Source.Git.CommitSha))
 			case "shp-source-default-commit-author":
-				Expect(result.Value.StringVal).To(Equal(testBuildRun.Status.Sources[0].Git.CommitAuthor))
+				Expect(result.Value.StringVal).To(Equal(testBuildRun.Status.Source.Git.CommitAuthor))
 			case "shp-source-default-branch-name":
-				Expect(result.Value.StringVal).To(Equal(testBuildRun.Status.Sources[0].Git.BranchName))
+				Expect(result.Value.StringVal).To(Equal(testBuildRun.Status.Source.Git.BranchName))
 			case "shp-image-digest":
 				Expect(result.Value.StringVal).To(Equal(testBuildRun.Status.Output.Digest))
 			case "shp-image-size":
@@ -187,7 +187,7 @@ func validateBuildRunResultsFromBundleSource(testBuildRun *buildv1beta1.BuildRun
 	testBuildRun, err := testBuild.GetBR(testBuildRun.Name)
 	Expect(err).ToNot(HaveOccurred())
 
-	Expect(len(testBuildRun.Status.Sources)).To(Equal(1))
+	Expect(testBuildRun.Status.Source).ToNot(BeNil())
 
 	// Only run the TaskRun checks if Tekton objects can be accessed
 	if os.Getenv(EnvVarVerifyTektonObjects) == "true" {
@@ -197,7 +197,7 @@ func validateBuildRunResultsFromBundleSource(testBuildRun *buildv1beta1.BuildRun
 		for _, result := range tr.Status.TaskRunResults {
 			switch result.Name {
 			case "shp-source-default-image-digest":
-				Expect(result.Value.StringVal).To(Equal(testBuildRun.Status.Sources[0].OciArtifact.Digest))
+				Expect(result.Value.StringVal).To(Equal(testBuildRun.Status.Source.OciArtifact.Digest))
 			case "shp-image-digest":
 				Expect(result.Value.StringVal).To(Equal(testBuildRun.Status.Output.Digest))
 			case "shp-image-size":