github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/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/olli-ai/jx/v2/pkg/gits"
    12  	"github.com/olli-ai/jx/v2/pkg/tekton"
    13  	"github.com/olli-ai/jx/v2/pkg/tekton/syntax"
    14  	"github.com/olli-ai/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  }