github.com/jenkins-x/jx/v2@v2.1.155/pkg/tekton/pipeline_info_test.go (about) 1 // +build unit 2 3 package tekton_test 4 5 import ( 6 "path" 7 "testing" 8 "time" 9 10 "github.com/google/go-cmp/cmp" 11 "github.com/jenkins-x/jx/v2/pkg/gits" 12 "github.com/jenkins-x/jx/v2/pkg/tekton" 13 "github.com/jenkins-x/jx/v2/pkg/tekton/syntax" 14 "github.com/jenkins-x/jx/v2/pkg/tekton/tekton_helpers_test" 15 "github.com/stretchr/testify/assert" 16 tektonfake "github.com/tektoncd/pipeline/pkg/client/clientset/versioned/fake" 17 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 18 "k8s.io/apimachinery/pkg/runtime" 19 ) 20 21 func TestCreatePipelineRunInfo(t *testing.T) { 22 t.Parallel() 23 ns := "jx" 24 testCases := []struct { 25 name string 26 expected *tekton.PipelineRunInfo 27 prName string 28 }{{ 29 name: "pr-yaml", 30 expected: &tekton.PipelineRunInfo{ 31 Branch: "PR-1", 32 Build: "1", 33 BuildNumber: 1, 34 Context: "pr-build", 35 GitInfo: &gits.GitRepository{ 36 Host: "github.com", 37 Name: "bdd-spring-1567745634", 38 Organisation: "cb-kubecd", 39 Project: "cb-kubecd", 40 Scheme: "https", 41 URL: "https://github.com/cb-kubecd/bdd-spring-1567745634.git", 42 }, 43 GitURL: "https://github.com/cb-kubecd/bdd-spring-1567745634.git", 44 LastCommitSHA: "c6bd3e0221a122dca3a00e87cb9188daed2e1d44", 45 BaseSHA: "441de50841eb31130c8a59ae0edc00d97f6b7b97", 46 Name: "cb-kubecd-bdd-spring-1567745634-PR-1-1", 47 Organisation: "cb-kubecd", 48 Pipeline: "cb-kubecd/bdd-spring-1567745634/PR-1", 49 PipelineRun: "cb-kubecd-bdd-spring-1567745634-s92nd-1", 50 Repository: "bdd-spring-1567745634", 51 Stages: []*tekton.StageInfo{{ 52 Name: syntax.DefaultStageNameForBuildPack, 53 CreatedTime: *parseTime(t, "2019-09-06T05:24:17Z"), 54 FirstStepImage: "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/bash:v0.5.1", 55 PodName: "cb-kubecd-bdd-spring-1567745634-s92nd-1-from-build-pack-x8hsc-pod-f15fe6", 56 Task: "cb-kubecd-bdd-spring-1567745634-s92nd-from-build-pack-1", 57 TaskRun: "cb-kubecd-bdd-spring-1567745634-s92nd-1-from-build-pack-x8hsc", 58 Parents: []string{}, 59 }}, 60 Type: tekton.BuildPipeline.String(), 61 CreatedTime: *parseTime(t, "2019-09-06T05:24:17Z"), 62 }, 63 prName: "cb-kubecd-bdd-spring-1567745634-s92nd-1", 64 }, { 65 name: "batch-yaml", 66 expected: &tekton.PipelineRunInfo{ 67 Branch: "PR-1", 68 Build: "1", 69 BuildNumber: 1, 70 Context: "pr-build", 71 GitInfo: &gits.GitRepository{ 72 Host: "github.com", 73 Name: "bdd-spring-1567745634", 74 Organisation: "cb-kubecd", 75 Project: "cb-kubecd", 76 Scheme: "https", 77 URL: "https://github.com/cb-kubecd/bdd-spring-1567745634.git", 78 }, 79 GitURL: "https://github.com/cb-kubecd/bdd-spring-1567745634.git", 80 LastCommitSHA: "c6bd3e0221a122dca3a00e87cb9188daed2e1d44", 81 BaseSHA: "441de50841eb31130c8a59ae0edc00d97f6b7b97", 82 Name: "cb-kubecd-bdd-spring-1567745634-PR-1-1", 83 Organisation: "cb-kubecd", 84 Pipeline: "cb-kubecd/bdd-spring-1567745634/PR-1", 85 PipelineRun: "cb-kubecd-bdd-spring-1567745634-s92nd-1", 86 Repository: "bdd-spring-1567745634", 87 Stages: []*tekton.StageInfo{{ 88 Name: syntax.DefaultStageNameForBuildPack, 89 CreatedTime: *parseTime(t, "2019-09-06T05:24:17Z"), 90 FirstStepImage: "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/bash:v0.5.1", 91 PodName: "cb-kubecd-bdd-spring-1567745634-s92nd-1-from-build-pack-x8hsc-pod-f15fe6", 92 Task: "cb-kubecd-bdd-spring-1567745634-s92nd-from-build-pack-1", 93 TaskRun: "cb-kubecd-bdd-spring-1567745634-s92nd-1-from-build-pack-x8hsc", 94 Parents: []string{}, 95 }}, 96 Type: tekton.BuildPipeline.String(), 97 CreatedTime: *parseTime(t, "2019-09-06T05:24:17Z"), 98 }, 99 prName: "cb-kubecd-bdd-spring-1567745634-s92nd-1", 100 }, { 101 name: "from-build-pack-init-containers", 102 expected: &tekton.PipelineRunInfo{ 103 Branch: "master", 104 Build: "1", 105 BuildNumber: 1, 106 GitInfo: &gits.GitRepository{ 107 Host: "github.com", 108 Name: "jx-demo-qs", 109 Organisation: "abayer", 110 Project: "abayer", 111 Scheme: "https", 112 URL: "https://github.com/abayer/jx-demo-qs", 113 }, 114 GitURL: "https://github.com/abayer/jx-demo-qs", 115 Name: "abayer-jx-demo-qs-master-1", 116 Organisation: "abayer", 117 Pipeline: "abayer/jx-demo-qs/master", 118 PipelineRun: "abayer-jx-demo-qs-master-1", 119 Repository: "jx-demo-qs", 120 Stages: []*tekton.StageInfo{{ 121 Name: syntax.DefaultStageNameForBuildPack, 122 CreatedTime: *parseTime(t, "2019-02-21T17:10:48-05:00"), 123 FirstStepImage: "gcr.io/k8s-prow/entrypoint@sha256:7c7cd8906ce4982ffee326218e9fc75da2d4896d53cabc9833b9cc8d2d6b2b8f", 124 PodName: "abayer-jx-demo-qs-master-1-build-vhz8d-pod-cd8cba", 125 Task: "abayer-jx-demo-qs-master", 126 TaskRun: "abayer-jx-demo-qs-master-1-build-vhz8d", 127 Parents: []string{}, 128 }}, 129 Type: tekton.BuildPipeline.String(), 130 CreatedTime: *parseTime(t, "2019-02-21T17:10:48-05:00"), 131 }, 132 prName: "abayer-jx-demo-qs-master-1", 133 }, { 134 name: "from-yaml-init-containers", 135 expected: &tekton.PipelineRunInfo{ 136 Branch: "master", 137 Build: "1", 138 BuildNumber: 1, 139 GitInfo: &gits.GitRepository{ 140 Host: "github.com", 141 Name: "js-test-repo", 142 Organisation: "abayer", 143 Project: "abayer", 144 Scheme: "https", 145 URL: "https://github.com/abayer/js-test-repo", 146 }, 147 GitURL: "https://github.com/abayer/js-test-repo", 148 Name: "abayer-js-test-repo-master-1", 149 Organisation: "abayer", 150 Pipeline: "abayer/js-test-repo/master", 151 PipelineRun: "abayer-js-test-repo-master-1", 152 Repository: "js-test-repo", 153 Stages: []*tekton.StageInfo{{ 154 Name: "Build", 155 CreatedTime: *parseTime(t, "2019-02-21T17:02:43-05:00"), 156 FirstStepImage: "gcr.io/k8s-prow/entrypoint@sha256:7c7cd8906ce4982ffee326218e9fc75da2d4896d53cabc9833b9cc8d2d6b2b8f", 157 PodName: "abayer-js-test-repo-master-1-build-ttvzf-pod-937200", 158 Task: "abayer-js-test-repo-master-build", 159 TaskRun: "abayer-js-test-repo-master-1-build-ttvzf", 160 Parents: []string{}, 161 }, { 162 Name: "Second", 163 CreatedTime: *parseTime(t, "2019-02-21T17:03:56-05:00"), 164 FirstStepImage: "gcr.io/knative-nightly/github.com/knative/build-pipeline/cmd/bash:v20190221-c649b42c", 165 PodName: "abayer-js-test-repo-master-1-second-9czt5-pod-62d12d", 166 Task: "abayer-js-test-repo-master-second", 167 TaskRun: "abayer-js-test-repo-master-1-second-9czt5", 168 Parents: []string{}, 169 }}, 170 Type: tekton.BuildPipeline.String(), 171 CreatedTime: *parseTime(t, "2019-02-21T17:02:43-05:00"), 172 }, 173 prName: "abayer-js-test-repo-master-1", 174 }, { 175 name: "from-yaml-nested-stages-init-containers", 176 expected: &tekton.PipelineRunInfo{ 177 Branch: "nested", 178 Build: "1", 179 BuildNumber: 1, 180 GitInfo: &gits.GitRepository{ 181 Host: "github.com", 182 Name: "js-test-repo", 183 Organisation: "abayer", 184 Project: "abayer", 185 Scheme: "https", 186 URL: "https://github.com/abayer/js-test-repo", 187 }, 188 GitURL: "https://github.com/abayer/js-test-repo", 189 Name: "abayer-js-test-repo-nested-1", 190 Organisation: "abayer", 191 Pipeline: "abayer/js-test-repo/nested", 192 PipelineRun: "abayer-js-test-repo-nested-1", 193 Repository: "js-test-repo", 194 Stages: []*tekton.StageInfo{{ 195 Name: "Parent", 196 Parents: []string{}, 197 Stages: []*tekton.StageInfo{{ 198 Name: "Build", 199 CreatedTime: *parseTime(t, "2019-02-21T17:07:36-05:00"), 200 FirstStepImage: "gcr.io/k8s-prow/entrypoint@sha256:7c7cd8906ce4982ffee326218e9fc75da2d4896d53cabc9833b9cc8d2d6b2b8f", 201 PodName: "abayer-js-test-repo-nested-1-build-hpqp5-pod-7a19f8", 202 Task: "abayer-js-test-repo-nested-build", 203 TaskRun: "abayer-js-test-repo-nested-1-build-hpqp5", 204 Parents: []string{"Parent"}, 205 }, { 206 Name: "Second", 207 CreatedTime: *parseTime(t, "2019-02-21T17:08:54-05:00"), 208 FirstStepImage: "gcr.io/knative-nightly/github.com/knative/build-pipeline/cmd/bash:v20190221-c649b42c", 209 PodName: "abayer-js-test-repo-nested-1-second-bxxzl-pod-a32406", 210 Task: "abayer-js-test-repo-nested-second", 211 TaskRun: "abayer-js-test-repo-nested-1-second-bxxzl", 212 Parents: []string{"Parent"}, 213 }}, 214 }}, 215 Type: tekton.BuildPipeline.String(), 216 CreatedTime: *parseTime(t, "2019-02-21T17:07:36-05:00"), 217 }, 218 prName: "abayer-js-test-repo-nested-1", 219 }, { 220 name: "from-yaml-pre-tekton-0.5", 221 expected: &tekton.PipelineRunInfo{ 222 Branch: "master", 223 Build: "1", 224 BuildNumber: 1, 225 GitInfo: &gits.GitRepository{ 226 Host: "github.com", 227 Name: "js-test-repo", 228 Organisation: "abayer", 229 Project: "abayer", 230 Scheme: "https", 231 URL: "https://github.com/abayer/js-test-repo", 232 }, 233 GitURL: "https://github.com/abayer/js-test-repo", 234 Name: "abayer-js-test-repo-master-1", 235 Organisation: "abayer", 236 Pipeline: "abayer/js-test-repo/master", 237 PipelineRun: "abayer-js-test-repo-master-1", 238 Repository: "js-test-repo", 239 Stages: []*tekton.StageInfo{{ 240 Name: "Build", 241 CreatedTime: *parseTime(t, "2019-03-05T15:06:13-05:00"), 242 FirstStepImage: "us.gcr.io/abayer-jx-experiment/entrypoint-fec85961206220d94e063e541ce30870@sha256:10e2a043d8fb52e6e05f633e7627aa9103d08330a97b9944b9b62a9c099e23d1", 243 PodName: "abayer-js-test-repo-master-1-build-jmcbd-pod-a726d6", 244 Task: "abayer-js-test-repo-master-build", 245 TaskRun: "abayer-js-test-repo-master-1-build-jmcbd", 246 Parents: []string{}, 247 }, { 248 Name: "Second", 249 CreatedTime: *parseTime(t, "2019-03-05T15:07:05-05:00"), 250 FirstStepImage: "us.gcr.io/abayer-jx-experiment/entrypoint-fec85961206220d94e063e541ce30870@sha256:10e2a043d8fb52e6e05f633e7627aa9103d08330a97b9944b9b62a9c099e23d1", 251 PodName: "abayer-js-test-repo-master-1-second-wglk8-pod-762f8d", 252 Task: "abayer-js-test-repo-master-second", 253 TaskRun: "abayer-js-test-repo-master-1-second-wglk8", 254 Parents: []string{}, 255 }}, 256 Type: tekton.BuildPipeline.String(), 257 CreatedTime: *parseTime(t, "2019-03-05T15:06:13-05:00"), 258 }, 259 prName: "abayer-js-test-repo-master-1", 260 }, { 261 name: "from-yaml", 262 expected: &tekton.PipelineRunInfo{ 263 Branch: "master", 264 Build: "1", 265 BuildNumber: 1, 266 GitInfo: &gits.GitRepository{ 267 Host: "github.com", 268 Name: "js-test-repo", 269 Organisation: "abayer", 270 Project: "abayer", 271 Scheme: "https", 272 URL: "https://github.com/abayer/js-test-repo", 273 }, 274 GitURL: "https://github.com/abayer/js-test-repo", 275 Name: "abayer-js-test-repo-master-1", 276 Organisation: "abayer", 277 Pipeline: "abayer/js-test-repo/master", 278 PipelineRun: "abayer-js-test-repo-master-1", 279 Repository: "js-test-repo", 280 Stages: []*tekton.StageInfo{{ 281 Name: "Build", 282 CreatedTime: *parseTime(t, "2019-03-05T15:06:13-05:00"), 283 FirstStepImage: "us.gcr.io/abayer-jx-experiment/entrypoint-fec85961206220d94e063e541ce30870@sha256:10e2a043d8fb52e6e05f633e7627aa9103d08330a97b9944b9b62a9c099e23d1", 284 PodName: "abayer-js-test-repo-master-1-build-jmcbd-pod-a726d6", 285 Task: "abayer-js-test-repo-master-build", 286 TaskRun: "abayer-js-test-repo-master-1-build-jmcbd", 287 Parents: []string{}, 288 }, { 289 Name: "Second", 290 CreatedTime: *parseTime(t, "2019-03-05T15:07:05-05:00"), 291 FirstStepImage: "us.gcr.io/abayer-jx-experiment/entrypoint-fec85961206220d94e063e541ce30870@sha256:10e2a043d8fb52e6e05f633e7627aa9103d08330a97b9944b9b62a9c099e23d1", 292 PodName: "abayer-js-test-repo-master-1-second-wglk8-pod-762f8d", 293 Task: "abayer-js-test-repo-master-second", 294 TaskRun: "abayer-js-test-repo-master-1-second-wglk8", 295 Parents: []string{}, 296 }}, 297 Type: tekton.BuildPipeline.String(), 298 CreatedTime: *parseTime(t, "2019-03-05T15:06:13-05:00"), 299 }, 300 prName: "abayer-js-test-repo-master-1", 301 }, { 302 name: "completed-from-yaml", 303 expected: nil, 304 prName: "abayer-js-test-repo-master-1", 305 }, { 306 name: "completed-from-build-pack", 307 expected: nil, 308 prName: "abayer-jx-demo-qs-master-1", 309 }} 310 311 for _, tt := range testCases { 312 t.Run(tt.name, func(t *testing.T) { 313 testCaseDir := path.Join("test_data", "pipeline_info", tt.name) 314 315 jxObjects := []runtime.Object{tekton_helpers_test.AssertLoadSinglePipelineActivity(t, testCaseDir)} 316 structure := tekton_helpers_test.AssertLoadSinglePipelineStructure(t, testCaseDir) 317 if structure != nil { 318 jxObjects = append(jxObjects, structure) 319 } 320 321 tektonObjects := []runtime.Object{tekton_helpers_test.AssertLoadSinglePipelineRun(t, testCaseDir), tekton_helpers_test.AssertLoadSinglePipeline(t, testCaseDir)} 322 tektonObjects = append(tektonObjects, tekton_helpers_test.AssertLoadTasks(t, testCaseDir)) 323 tektonObjects = append(tektonObjects, tekton_helpers_test.AssertLoadTaskRuns(t, testCaseDir)) 324 tektonObjects = append(tektonObjects, tekton_helpers_test.AssertLoadPipelineResources(t, testCaseDir)) 325 tektonClient := tektonfake.NewSimpleClientset(tektonObjects...) 326 327 podList := tekton_helpers_test.AssertLoadPods(t, testCaseDir) 328 329 pr, err := tektonClient.TektonV1alpha1().PipelineRuns(ns).Get(tt.prName, metav1.GetOptions{}) 330 if err != nil { 331 t.Fatalf("Error fetching PipelineRun: %s", err) 332 } 333 pri, err := tekton.CreatePipelineRunInfo(tt.prName, podList, structure, pr) 334 if err != nil { 335 t.Fatalf("Error creating PipelineRunInfo: %s", err) 336 } 337 if pri == nil { 338 if tt.expected != nil { 339 t.Errorf("Nil PipelineRunInfo but expected one") 340 } 341 } else { 342 for _, stage := range pri.Stages { 343 scrubPods(stage) 344 } 345 346 if d := cmp.Diff(tt.expected, pri); d != "" && tt.expected != nil { 347 t.Errorf("Generated PipelineRunInfo did not match expected: %s", d) 348 } 349 } 350 }) 351 } 352 } 353 354 func parseTime(t *testing.T, timeString string) *time.Time { 355 parsed, err := time.Parse(time.RFC3339, timeString) 356 if assert.NoError(t, err, "Failed to parse date %s", timeString) { 357 return &parsed 358 } 359 return nil 360 } 361 362 func scrubPods(s *tekton.StageInfo) { 363 s.Pod = nil 364 for _, child := range s.Stages { 365 scrubPods(child) 366 } 367 for _, child := range s.Parallel { 368 scrubPods(child) 369 } 370 }