From 9b73e9dd7a4d6dc7165ec6b0ade948c3c955c98f Mon Sep 17 00:00:00 2001 From: lijie Date: Tue, 27 Feb 2024 18:23:45 +0800 Subject: [PATCH] refract: split function Signed-off-by: lijie --- tibuild/pkg/rest/service/dev_build_service.go | 91 +++++++++++-------- .../rest/service/dev_build_service_test.go | 6 +- 2 files changed, 58 insertions(+), 39 deletions(-) diff --git a/tibuild/pkg/rest/service/dev_build_service.go b/tibuild/pkg/rest/service/dev_build_service.go index 2fa953b..f7d2715 100644 --- a/tibuild/pkg/rest/service/dev_build_service.go +++ b/tibuild/pkg/rest/service/dev_build_service.go @@ -372,7 +372,7 @@ func (s DevbuildServer) MergeTektonStatus(ctx context.Context, id int, pipeline } else { status.Pipelines = append(status.Pipelines, pipeline) } - compute_tekton_status(status) + computeTektonStatus(status) if obj.Spec.PipelineEngine == TektonEngine { obj.Status.Status = obj.Status.TektonStatus.Status obj.Status.BuildReport = obj.Status.TektonStatus.BuildReport @@ -380,19 +380,49 @@ func (s DevbuildServer) MergeTektonStatus(ctx context.Context, id int, pipeline return s.Update(ctx, id, *obj, options) } -func compute_tekton_status(status *TektonStatus) { +func computeTektonStatus(status *TektonStatus) { + status.BuildReport = &BuildReport{} + collectTektonArtifacts(status.Pipelines, status.BuildReport) + status.PipelineStartAt = getTektonStartAt(status.Pipelines) + status.Status = computeTektonPhase(status.Pipelines) + if status.Status.IsCompleted() { + status.PipelineEndAt = getLatestEndAt(status.Pipelines) + } +} + +func collectTektonArtifacts(pipelines []TektonPipeline, report *BuildReport) { + for _, pipeline := range pipelines { + report.GitHash = pipeline.GitHash + for _, files := range pipeline.OrasArtifacts { + report.Binaries = append(report.Binaries, oras_to_files(pipeline.Platform, files)...) + } + for _, image := range pipeline.Images { + img := ImageArtifact{Platform: pipeline.Platform, URL: image.URL} + report.Images = append(report.Images, img) + } + } +} + +func getTektonStartAt(pipelines []TektonPipeline) *time.Time { + var startAt *time.Time = nil + for _, pipeline := range pipelines { + if pipeline.PipelineStartAt != nil { + if startAt == nil { + startAt = pipeline.PipelineStartAt + } else if pipeline.PipelineStartAt.Before(*startAt) { + startAt = pipeline.PipelineStartAt + } + } + } + return startAt +} + +func computeTektonPhase(pipelines []TektonPipeline) BuildStatus { phase := BuildStatusPending var success_platforms = map[Platform]struct{}{} var failure_platforms = map[Platform]struct{}{} var triggered_platforms = map[Platform]struct{}{} - var latest_endat *time.Time - if status.BuildReport == nil { - status.BuildReport = &BuildReport{} - } else { - status.BuildReport.Images = nil - status.BuildReport.Binaries = nil - } - for _, pipeline := range status.Pipelines { + for _, pipeline := range pipelines { switch pipeline.Status { case BuildStatusSuccess: success_platforms[pipeline.Platform] = struct{}{} @@ -400,40 +430,29 @@ func compute_tekton_status(status *TektonStatus) { failure_platforms[pipeline.Platform] = struct{}{} } triggered_platforms[pipeline.Platform] = struct{}{} - status.BuildReport.GitHash = pipeline.GitHash - for _, files := range pipeline.OrasArtifacts { - status.BuildReport.Binaries = append(status.BuildReport.Binaries, oras_to_files(pipeline.Platform, files)...) - } - for _, image := range pipeline.Images { - img := ImageArtifact{Platform: pipeline.Platform, URL: image.URL} - status.BuildReport.Images = append(status.BuildReport.Images, img) - } - if pipeline.PipelineStartAt != nil { - if status.PipelineStartAt == nil { - status.PipelineStartAt = pipeline.PipelineStartAt - } else if pipeline.PipelineStartAt.Before(*status.PipelineStartAt) { - status.PipelineStartAt = pipeline.PipelineStartAt - } - } - if pipeline.PipelineEndAt != nil { - if latest_endat == nil { - latest_endat = pipeline.PipelineEndAt - } else if latest_endat.Before(*pipeline.PipelineEndAt) { - latest_endat = pipeline.PipelineEndAt - } - } } if len(success_platforms) == len(triggered_platforms) { phase = BuildStatusSuccess } else if len(failure_platforms) != 0 { phase = BuildStatusFailure - } else if len(status.Pipelines) != 0 { + } else if len(pipelines) != 0 { phase = BuildStatusProcessing } - status.Status = phase - if status.Status.IsCompleted() { - status.PipelineEndAt = latest_endat + return phase +} + +func getLatestEndAt(pipelines []TektonPipeline) *time.Time { + var latest_endat *time.Time + for _, pipeline := range pipelines { + if pipeline.PipelineEndAt != nil { + if latest_endat == nil { + latest_endat = pipeline.PipelineEndAt + } else if latest_endat.Before(*pipeline.PipelineEndAt) { + latest_endat = pipeline.PipelineEndAt + } + } } + return latest_endat } func oras_to_files(platform Platform, oras OrasArtifact) []BinArtifact { diff --git a/tibuild/pkg/rest/service/dev_build_service_test.go b/tibuild/pkg/rest/service/dev_build_service_test.go index 11dfc15..2517833 100644 --- a/tibuild/pkg/rest/service/dev_build_service_test.go +++ b/tibuild/pkg/rest/service/dev_build_service_test.go @@ -376,7 +376,7 @@ func TestTektonStatusMerge(t *testing.T) { OrasArtifacts: []OrasArtifact{{Repo: "harbor.net/org/repo", Tag: "master", Files: []string{"c.tar.gz", "d.tar.gz"}}}}, }, } - compute_tekton_status(status) + computeTektonStatus(status) require.Equal(t, BuildStatusSuccess, status.Status) require.Equal(t, endtime.Sub(starttime), status.PipelineEndAt.Sub(*status.PipelineStartAt)) require.Equal(t, 2, len(status.BuildReport.Images)) @@ -396,7 +396,7 @@ func TestTektonStatusMerge(t *testing.T) { OrasArtifacts: []OrasArtifact{{Repo: "harbor.net/org/repo", Files: []string{"c.tar.gz", "d.tar.gz"}}}}, }, } - compute_tekton_status(status) + computeTektonStatus(status) require.Equal(t, BuildStatusProcessing, status.Status) }) t.Run("processing", func(t *testing.T) { @@ -412,7 +412,7 @@ func TestTektonStatusMerge(t *testing.T) { OrasArtifacts: []OrasArtifact{{Repo: "harbor.net/org/repo", Files: []string{"c.tar.gz", "d.tar.gz"}}}}, }, } - compute_tekton_status(status) + computeTektonStatus(status) require.Equal(t, BuildStatusFailure, status.Status) })