github.com/jenkins-x/jx/v2@v2.1.155/pkg/cmd/gc/gc_activities_test.go (about)

     1  // +build unit
     2  
     3  package gc
     4  
     5  import (
     6  	"testing"
     7  	"time"
     8  
     9  	jenkinsv1 "github.com/jenkins-x/jx-api/pkg/apis/jenkins.io/v1"
    10  	v1 "github.com/jenkins-x/jx-api/pkg/apis/jenkins.io/v1"
    11  	"github.com/jenkins-x/jx/v2/pkg/cmd/clients/fake"
    12  	"github.com/jenkins-x/jx/v2/pkg/cmd/testhelpers"
    13  	tektonv1alpha1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1"
    14  	tektonv1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
    15  	corev1 "k8s.io/api/core/v1"
    16  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    17  	prowjobv1 "k8s.io/test-infra/prow/apis/prowjobs/v1"
    18  	"knative.dev/pkg/apis"
    19  
    20  	"github.com/stretchr/testify/assert"
    21  
    22  	"github.com/jenkins-x/jx/v2/pkg/cmd/opts"
    23  )
    24  
    25  func TestGCPipelineActivitiesWithBatchAndPRBuilds(t *testing.T) {
    26  	t.Parallel()
    27  
    28  	commonOpts := opts.NewCommonOptionsWithFactory(fake.NewFakeFactory())
    29  	options := &commonOpts
    30  	testhelpers.ConfigureTestOptions(options, options.Git(), options.Helm())
    31  
    32  	o := &GCActivitiesOptions{
    33  		CommonOptions:           options,
    34  		PullRequestAgeLimit:     time.Hour * 24 * 30,
    35  		ReleaseAgeLimit:         time.Hour * 48,
    36  		ReleaseHistoryLimit:     5,
    37  		PullRequestHistoryLimit: 2,
    38  		PipelineRunAgeLimit:     time.Hour * 2,
    39  		ProwJobAgeLimit:         time.Hour * 24 * 7,
    40  	}
    41  
    42  	jxClient, ns, err := options.JXClientAndDevNamespace()
    43  	assert.NoError(t, err)
    44  	tektonClient, ns, err := options.TektonClient()
    45  	assert.NoError(t, err)
    46  	prowJobClient, ns, err := options.ProwJobClient()
    47  	assert.NoError(t, err)
    48  
    49  	err = options.ModifyDevEnvironment(func(env *v1.Environment) error {
    50  		env.Spec.TeamSettings.PromotionEngine = jenkinsv1.PromotionEngineProw
    51  		return nil
    52  	})
    53  	assert.NoError(t, err)
    54  
    55  	nowMinusThirtyOneDays := time.Now().AddDate(0, 0, -31)
    56  	nowMinusThreeDays := time.Now().AddDate(0, 0, -3)
    57  	nowMinusTwoDays := time.Now().AddDate(0, 0, -2)
    58  	nowMinusOneDay := time.Now().AddDate(0, 0, -1)
    59  	nowMinusOneHour := time.Now().Add(-1 * time.Hour)
    60  	nowMinusThreeHours := time.Now().Add(-3 * time.Hour)
    61  
    62  	_, err = jxClient.JenkinsV1().PipelineActivities(ns).Create(&v1.PipelineActivity{
    63  		ObjectMeta: metav1.ObjectMeta{
    64  			Name: "1",
    65  			Labels: map[string]string{
    66  				v1.LabelBranch: "PR-1",
    67  			},
    68  		},
    69  		Spec: v1.PipelineActivitySpec{
    70  			Pipeline:           "org/project/PR-1",
    71  			CompletedTimestamp: &metav1.Time{Time: nowMinusThreeDays},
    72  		},
    73  	})
    74  	assert.NoError(t, err)
    75  
    76  	_, err = jxClient.JenkinsV1().PipelineActivities(ns).Create(&v1.PipelineActivity{
    77  		ObjectMeta: metav1.ObjectMeta{
    78  			Name: "2",
    79  			Labels: map[string]string{
    80  				v1.LabelBranch: "PR-1",
    81  			},
    82  		},
    83  		Spec: v1.PipelineActivitySpec{
    84  			Pipeline: "org/project/PR-1",
    85  			// No completion time, to make sure this doesn't get deleted.
    86  		},
    87  	})
    88  	assert.NoError(t, err)
    89  
    90  	_, err = jxClient.JenkinsV1().PipelineActivities(ns).Create(&v1.PipelineActivity{
    91  		ObjectMeta: metav1.ObjectMeta{
    92  			Name: "3",
    93  			Labels: map[string]string{
    94  				v1.LabelBranch: "PR-1",
    95  			},
    96  		},
    97  		Spec: v1.PipelineActivitySpec{
    98  			Pipeline:           "org/project/PR-1",
    99  			CompletedTimestamp: &metav1.Time{Time: nowMinusTwoDays},
   100  		},
   101  	})
   102  	assert.NoError(t, err)
   103  
   104  	_, err = jxClient.JenkinsV1().PipelineActivities(ns).Create(&v1.PipelineActivity{
   105  		ObjectMeta: metav1.ObjectMeta{
   106  			Name: "4",
   107  			Labels: map[string]string{
   108  				v1.LabelBranch: "PR-1",
   109  			},
   110  		},
   111  		Spec: v1.PipelineActivitySpec{
   112  			Pipeline:           "org/project/PR-1",
   113  			CompletedTimestamp: &metav1.Time{Time: nowMinusOneDay},
   114  		},
   115  	})
   116  	assert.NoError(t, err)
   117  
   118  	// To handle potential weirdness around ordering, make sure that the oldest PR activity is in a random
   119  	// spot in the order.
   120  	_, err = jxClient.JenkinsV1().PipelineActivities(ns).Create(&v1.PipelineActivity{
   121  		ObjectMeta: metav1.ObjectMeta{
   122  			Name: "0",
   123  			Labels: map[string]string{
   124  				v1.LabelBranch: "PR-1",
   125  			},
   126  		},
   127  		Spec: v1.PipelineActivitySpec{
   128  			Pipeline:           "org/project/PR-1",
   129  			CompletedTimestamp: &metav1.Time{Time: nowMinusThirtyOneDays},
   130  		},
   131  	})
   132  	assert.NoError(t, err)
   133  
   134  	_, err = jxClient.JenkinsV1().PipelineActivities(ns).Create(&v1.PipelineActivity{
   135  		ObjectMeta: metav1.ObjectMeta{
   136  			Name: "5",
   137  			Labels: map[string]string{
   138  				v1.LabelBranch: "batch",
   139  			},
   140  		},
   141  		Spec: v1.PipelineActivitySpec{
   142  			Pipeline:           "org/project/batch",
   143  			CompletedTimestamp: &metav1.Time{Time: nowMinusThreeDays},
   144  		},
   145  	})
   146  	assert.NoError(t, err)
   147  
   148  	_, err = jxClient.JenkinsV1().PipelineActivities(ns).Create(&v1.PipelineActivity{
   149  		ObjectMeta: metav1.ObjectMeta{
   150  			Name: "6",
   151  			Labels: map[string]string{
   152  				v1.LabelBranch: "master",
   153  			},
   154  		},
   155  		Spec: v1.PipelineActivitySpec{
   156  			Pipeline:           "org/project/master",
   157  			CompletedTimestamp: &metav1.Time{Time: nowMinusThreeDays},
   158  		},
   159  	})
   160  	assert.NoError(t, err)
   161  
   162  	run1 := &tektonv1alpha1.PipelineRun{
   163  		ObjectMeta: metav1.ObjectMeta{
   164  			Name: "run1",
   165  		},
   166  		Status: tektonv1alpha1.PipelineRunStatus{
   167  			PipelineRunStatusFields: tektonv1beta1.PipelineRunStatusFields{
   168  				CompletionTime: &metav1.Time{Time: nowMinusThreeHours},
   169  			},
   170  		},
   171  	}
   172  	run1.Status.SetCondition(&apis.Condition{
   173  		Type:   apis.ConditionSucceeded,
   174  		Status: corev1.ConditionFalse,
   175  	})
   176  	_, err = tektonClient.TektonV1alpha1().PipelineRuns(ns).Create(run1)
   177  	assert.NoError(t, err)
   178  
   179  	run2 := &tektonv1alpha1.PipelineRun{
   180  		ObjectMeta: metav1.ObjectMeta{
   181  			Name: "run2",
   182  		},
   183  		Status: tektonv1alpha1.PipelineRunStatus{
   184  			PipelineRunStatusFields: tektonv1beta1.PipelineRunStatusFields{
   185  				CompletionTime: &metav1.Time{Time: nowMinusOneHour},
   186  			},
   187  		},
   188  	}
   189  	run2.Status.SetCondition(&apis.Condition{
   190  		Type:   apis.ConditionSucceeded,
   191  		Status: corev1.ConditionFalse,
   192  	})
   193  	_, err = tektonClient.TektonV1alpha1().PipelineRuns(ns).Create(run2)
   194  	assert.NoError(t, err)
   195  
   196  	run3 := &tektonv1alpha1.PipelineRun{
   197  		ObjectMeta: metav1.ObjectMeta{
   198  			Name: "run3",
   199  		},
   200  		Status: tektonv1alpha1.PipelineRunStatus{
   201  			PipelineRunStatusFields: tektonv1beta1.PipelineRunStatusFields{
   202  				CompletionTime: &metav1.Time{Time: nowMinusThreeHours},
   203  			},
   204  		},
   205  	}
   206  	run1.Status.SetCondition(&apis.Condition{
   207  		Type:   apis.ConditionSucceeded,
   208  		Status: corev1.ConditionUnknown,
   209  	})
   210  	_, err = tektonClient.TektonV1alpha1().PipelineRuns(ns).Create(run3)
   211  	assert.NoError(t, err)
   212  
   213  	_, err = prowJobClient.ProwV1().ProwJobs(ns).Create(&prowjobv1.ProwJob{
   214  		ObjectMeta: metav1.ObjectMeta{
   215  			Name: "job1",
   216  		},
   217  		Status: prowjobv1.ProwJobStatus{
   218  			CompletionTime: &metav1.Time{Time: nowMinusThirtyOneDays},
   219  		},
   220  	})
   221  	assert.NoError(t, err)
   222  	_, err = prowJobClient.ProwV1().ProwJobs(ns).Create(&prowjobv1.ProwJob{
   223  		ObjectMeta: metav1.ObjectMeta{
   224  			Name: "job2",
   225  		},
   226  		Status: prowjobv1.ProwJobStatus{},
   227  	})
   228  	assert.NoError(t, err)
   229  	_, err = prowJobClient.ProwV1().ProwJobs(ns).Create(&prowjobv1.ProwJob{
   230  		ObjectMeta: metav1.ObjectMeta{
   231  			Name: "job3",
   232  		},
   233  		Status: prowjobv1.ProwJobStatus{
   234  			CompletionTime: &metav1.Time{Time: nowMinusThreeDays},
   235  		},
   236  	})
   237  	assert.NoError(t, err)
   238  
   239  	err = o.Run()
   240  	assert.NoError(t, err)
   241  
   242  	activities, err := jxClient.JenkinsV1().PipelineActivities(ns).List(metav1.ListOptions{})
   243  	assert.NoError(t, err)
   244  
   245  	assert.Len(t, activities.Items, 4, "Two of the activities should've been garbage collected")
   246  
   247  	var verifier []bool
   248  	for _, v := range activities.Items {
   249  		if v.BranchName() == "batch" || v.BranchName() == "PR-1" {
   250  			verifier = append(verifier, true)
   251  		}
   252  	}
   253  	assert.Len(t, verifier, 4, "Both PR and Batch builds should've been verified")
   254  
   255  	runs, err := tektonClient.TektonV1alpha1().PipelineRuns(ns).List(metav1.ListOptions{})
   256  	assert.NoError(t, err)
   257  
   258  	assert.Len(t, runs.Items, 2, "One PipelineRun should've been garbage collected")
   259  
   260  	var remainingRun *tektonv1alpha1.PipelineRun
   261  	var incompleteRun *tektonv1alpha1.PipelineRun
   262  
   263  	for _, r := range runs.Items {
   264  		if r.Name == "run2" {
   265  			remainingRun = r.DeepCopy()
   266  		}
   267  		if r.Name == "run3" {
   268  			incompleteRun = r.DeepCopy()
   269  		}
   270  	}
   271  	assert.NotNil(t, remainingRun)
   272  	assert.NotNil(t, incompleteRun)
   273  	assert.NotNil(t, remainingRun.Status.CompletionTime)
   274  	assert.Equal(t, nowMinusOneHour, remainingRun.Status.CompletionTime.Time, "Expected completion time for remaining PipelineRun of %s, but is %s", nowMinusOneHour, remainingRun.Status.CompletionTime.Time)
   275  
   276  	assert.False(t, incompleteRun.IsDone())
   277  
   278  	jobs, err := prowJobClient.ProwV1().ProwJobs(ns).List(metav1.ListOptions{})
   279  	assert.NoError(t, err)
   280  
   281  	assert.Len(t, jobs.Items, 2, "One of three ProwJobs should've been garbage collected")
   282  
   283  	var job1 *prowjobv1.ProwJob
   284  	var job2 *prowjobv1.ProwJob
   285  	var job3 *prowjobv1.ProwJob
   286  
   287  	for _, job := range jobs.Items {
   288  		if job.Name == "job1" {
   289  			job1 = &job
   290  		} else if job.Name == "job2" {
   291  			job2 = &job
   292  		} else if job.Name == "job3" {
   293  			job3 = &job
   294  		}
   295  	}
   296  	assert.Nil(t, job1, "ProwJob job1 completed more than 7 days ago and so should have been deleted")
   297  	assert.NotNil(t, job2, "ProwJob job2 has no completion time and so shouldn't have been deleted")
   298  	assert.NotNil(t, job3, "ProwJob job3 completed less than 7 days ago and so shouldn't have been deleted")
   299  }