This is an automated email from the ASF dual-hosted git repository. pcongiusti pushed a commit to branch release-1.9.x in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit 9d094d71cda40bad70d4aab22a5f66ebf7081e1c Author: Antonin Stefanutti <anto...@stefanutti.fr> AuthorDate: Thu Jun 2 10:02:29 2022 +0200 feat(gc): Skip GC for first integration generation (cherry picked from commit 0dd6d8cb68d771ddfabb81a19a5d104e08b3e451) --- pkg/trait/gc.go | 46 +++++++++++++++++++++------------------------- pkg/trait/gc_test.go | 16 ++++++++++++++-- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/pkg/trait/gc.go b/pkg/trait/gc.go index a088367fb..ef20ae7b1 100644 --- a/pkg/trait/gc.go +++ b/pkg/trait/gc.go @@ -93,34 +93,30 @@ func (t *garbageCollectorTrait) Configure(e *Environment) (bool, error) { } func (t *garbageCollectorTrait) Apply(e *Environment) error { - switch e.Integration.Status.Phase { - - case v1.IntegrationPhaseDeploying, v1.IntegrationPhaseRunning, v1.IntegrationPhaseError: + if e.IntegrationInRunningPhases() && e.Integration.GetGeneration() > 1 { // Register a post action that deletes the existing resources that are labelled - // with the previous integration generations. - // TODO: this should be refined so that it's run when all the replicas for the newer generation - // are ready. + // with the previous integration generation(s). + // We make the assumption generation is a monotonically increasing strictly positive integer, + // in which case we can skip garbage collection on the first generation. + // TODO: this should be refined so that it's run when all the replicas for the newer generation are ready. e.PostActions = append(e.PostActions, func(env *Environment) error { return t.garbageCollectResources(env) }) + } - fallthrough - - default: - // Register a post processor that adds the required labels to the new resources - e.PostProcessors = append(e.PostProcessors, func(env *Environment) error { - generation := strconv.FormatInt(env.Integration.GetGeneration(), 10) - env.Resources.VisitMetaObject(func(resource metav1.Object) { - labels := resource.GetLabels() - // Label the resource with the current integration generation - labels["camel.apache.org/generation"] = generation - // Make sure the integration label is set - labels[v1.IntegrationLabel] = env.Integration.Name - resource.SetLabels(labels) - }) - return nil + // Register a post processor that adds the required labels to the new resources + e.PostProcessors = append(e.PostProcessors, func(env *Environment) error { + generation := strconv.FormatInt(env.Integration.GetGeneration(), 10) + env.Resources.VisitMetaObject(func(resource metav1.Object) { + labels := resource.GetLabels() + // Label the resource with the current integration generation + labels["camel.apache.org/generation"] = generation + // Make sure the integration label is set + labels[v1.IntegrationLabel] = env.Integration.Name + resource.SetLabels(labels) }) - } + return nil + }) return nil } @@ -222,12 +218,12 @@ func (t *garbageCollectorTrait) getDeletableTypes(e *Environment) (map[schema.Gr // Retrieve the permissions granted to the operator service account. // We assume the operator has only to garbage collect the resources it has created. - srr := &authorization.SelfSubjectRulesReview{ + ssrr := &authorization.SelfSubjectRulesReview{ Spec: authorization.SelfSubjectRulesReviewSpec{ Namespace: e.Integration.Namespace, }, } - res, err := e.Client.AuthorizationV1().SelfSubjectRulesReviews().Create(e.Ctx, srr, metav1.CreateOptions{}) + ssrr, err = e.Client.AuthorizationV1().SelfSubjectRulesReviews().Create(e.Ctx, ssrr, metav1.CreateOptions{}) if err != nil { return nil, err } @@ -236,7 +232,7 @@ func (t *garbageCollectorTrait) getDeletableTypes(e *Environment) (map[schema.Gr for _, APIResourceList := range APIResourceLists { for _, resource := range APIResourceList.APIResources { rule: - for _, rule := range res.Status.ResourceRules { + for _, rule := range ssrr.Status.ResourceRules { if !util.StringSliceContainsAnyOf(rule.Verbs, "delete", "*") { continue } diff --git a/pkg/trait/gc_test.go b/pkg/trait/gc_test.go index 9e76d1056..db8322f4e 100644 --- a/pkg/trait/gc_test.go +++ b/pkg/trait/gc_test.go @@ -44,11 +44,22 @@ func TestConfigureDisabledGarbageCollectorTraitDoesNotSucceed(t *testing.T) { assert.Nil(t, err) } -func TestApplyGarbageCollectorTraitDoesSucceed(t *testing.T) { +func TestApplyGarbageCollectorTraitFirstGenerationDoesSucceed(t *testing.T) { gcTrait, environment := createNominalGarbageCollectorTest() err := gcTrait.Apply(environment) + assert.Nil(t, err) + assert.Len(t, environment.PostProcessors, 1) + assert.Len(t, environment.PostActions, 0) +} + +func TestApplyGarbageCollectorTraitNextGenerationDoesSucceed(t *testing.T) { + gcTrait, environment := createNominalGarbageCollectorTest() + environment.Integration.Generation = 2 + + err := gcTrait.Apply(environment) + assert.Nil(t, err) assert.Len(t, environment.PostProcessors, 1) assert.Len(t, environment.PostActions, 1) @@ -73,7 +84,8 @@ func createNominalGarbageCollectorTest() (*garbageCollectorTrait, *Environment) Catalog: NewCatalog(nil), Integration: &v1.Integration{ ObjectMeta: metav1.ObjectMeta{ - Name: "integration-name", + Name: "integration-name", + Generation: 1, }, Status: v1.IntegrationStatus{ Phase: v1.IntegrationPhaseRunning,