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 }