This is an automated email from the ASF dual-hosted git repository. tsato pushed a commit to branch release-1.9.x in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit cad2e06c6ba9d052ea0c0a32e7d43f8b4e6a2644 Author: Christoph Deppisch <[email protected]> AuthorDate: Wed Jun 29 08:58:06 2022 +0200 fix(#3393): Make CronJob functionality optional - Explicitly check for CronJob batch/v1 API availability before using it - CronJob batch/v1 API is not available on OpenShift 3.x - Disable cron job e2e test on OpenShift 3.x (cherry picked from commit ee05ecca0a1fcd536aec65b366f5a5193eef4182) --- e2e/common/cli/install_test.go | 6 ++--- e2e/common/cron_test.go | 12 ++++++++++ pkg/cmd/operator/operator.go | 26 ++++++++++++++++------ .../integration/integration_controller.go | 7 ++++-- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/e2e/common/cli/install_test.go b/e2e/common/cli/install_test.go index b52f6c772..dfcefa0f9 100644 --- a/e2e/common/cli/install_test.go +++ b/e2e/common/cli/install_test.go @@ -38,7 +38,7 @@ import ( "github.com/apache/camel-k/pkg/util/defaults" "github.com/apache/camel-k/pkg/util/kubernetes" "github.com/apache/camel-k/pkg/util/openshift" - console "github.com/openshift/api/console/v1" + consolev1 "github.com/openshift/api/console/v1" ) func TestBasicInstallation(t *testing.T) { @@ -97,11 +97,11 @@ func TestConsoleCliDownload(t *testing.T) { ocp, err := openshift.IsOpenShift(TestClient()) assert.Nil(t, err) - ok, err := kubernetes.IsAPIResourceInstalled(TestClient(), "console.openshift.io/v1", reflect.TypeOf(console.ConsoleCLIDownload{}).Name()) + ok, err := kubernetes.IsAPIResourceInstalled(TestClient(), "console.openshift.io/v1", reflect.TypeOf(consolev1.ConsoleCLIDownload{}).Name()) assert.Nil(t, err) if !ocp || !ok { - t.Skip("This test requires ConsoleCliDownload object which is available on OpenShift 4 only.") + t.Skip("This test requires ConsoleCliDownload object which is available on OpenShift 4+ only.") return } diff --git a/e2e/common/cron_test.go b/e2e/common/cron_test.go index dc26197db..85b5ac211 100644 --- a/e2e/common/cron_test.go +++ b/e2e/common/cron_test.go @@ -23,17 +23,29 @@ limitations under the License. package common import ( + "reflect" "testing" . "github.com/onsi/gomega" + "github.com/stretchr/testify/assert" + batchv1 "k8s.io/api/batch/v1" corev1 "k8s.io/api/core/v1" . "github.com/apache/camel-k/e2e/support" v1 "github.com/apache/camel-k/pkg/apis/camel/v1" + "github.com/apache/camel-k/pkg/util/kubernetes" ) func TestRunCronExample(t *testing.T) { + ok, err := kubernetes.IsAPIResourceInstalled(TestClient(), batchv1.SchemeGroupVersion.Group, reflect.TypeOf(batchv1.CronJob{}).Name()) + assert.Nil(t, err) + + if !ok { + t.Skip("This test requires CronJob batch/v1 API installed.") + return + } + WithNewTestNamespace(t, func(ns string) { Expect(Kamel("install", "-n", ns).Execute()).To(Succeed()) diff --git a/pkg/cmd/operator/operator.go b/pkg/cmd/operator/operator.go index 1b555fd30..8a8ffa2a7 100644 --- a/pkg/cmd/operator/operator.go +++ b/pkg/cmd/operator/operator.go @@ -23,6 +23,7 @@ import ( "fmt" "math/rand" "os" + "reflect" "runtime" "strconv" "time" @@ -34,6 +35,7 @@ import ( coordination "k8s.io/api/coordination/v1" corev1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/selection" "k8s.io/client-go/tools/leaderelection/resourcelock" @@ -152,6 +154,22 @@ func Run(healthPort, monitoringPort int32, leaderElection bool, leaderElectionID exitOnError(err, "cannot create Integration label selector") selector := labels.NewSelector().Add(*hasIntegrationLabel) + selectors := cache.SelectorsByObject{ + &corev1.Pod{}: {Label: selector}, + &appsv1.Deployment{}: {Label: selector}, + &batchv1.Job{}: {Label: selector}, + &servingv1.Service{}: {Label: selector}, + } + + if ok, err := kubernetes.IsAPIResourceInstalled(c, batchv1.SchemeGroupVersion.String(), reflect.TypeOf(batchv1.CronJob{}).Name()); ok && err == nil { + selectors[&batchv1.CronJob{}] = struct { + Label labels.Selector + Field fields.Selector + }{ + Label: selector, + } + } + mgr, err := manager.New(c.GetConfig(), manager.Options{ Namespace: watchNamespace, EventBroadcaster: broadcaster, @@ -164,13 +182,7 @@ func Run(healthPort, monitoringPort int32, leaderElection bool, leaderElectionID MetricsBindAddress: ":" + strconv.Itoa(int(monitoringPort)), NewCache: cache.BuilderWithOptions( cache.Options{ - SelectorsByObject: cache.SelectorsByObject{ - &corev1.Pod{}: {Label: selector}, - &appsv1.Deployment{}: {Label: selector}, - &batchv1.CronJob{}: {Label: selector}, - &batchv1.Job{}: {Label: selector}, - &servingv1.Service{}: {Label: selector}, - }, + SelectorsByObject: selectors, }, ), }) diff --git a/pkg/controller/integration/integration_controller.go b/pkg/controller/integration/integration_controller.go index 4fb05c8be..2ee389e2d 100644 --- a/pkg/controller/integration/integration_controller.go +++ b/pkg/controller/integration/integration_controller.go @@ -203,8 +203,6 @@ func add(mgr manager.Manager, c client.Client, r reconcile.Reconciler) error { })). // Watch for the owned Deployments Owns(&appsv1.Deployment{}, builder.WithPredicates(StatusChangedPredicate{})). - // Watch for the owned CronJobs - Owns(&batchv1.CronJob{}, builder.WithPredicates(StatusChangedPredicate{})). // Watch for the Integration Pods Watches(&source.Kind{Type: &corev1.Pod{}}, handler.EnqueueRequestsFromMapFunc(func(a ctrl.Object) []reconcile.Request { @@ -223,6 +221,11 @@ func add(mgr manager.Manager, c client.Client, r reconcile.Reconciler) error { } })) + if ok, err := kubernetes.IsAPIResourceInstalled(c, batchv1.SchemeGroupVersion.String(), reflect.TypeOf(batchv1.CronJob{}).Name()); ok && err == nil { + // Watch for the owned CronJobs + b.Owns(&batchv1.CronJob{}, builder.WithPredicates(StatusChangedPredicate{})) + } + // Watch for the owned Knative Services conditionally if ok, err := kubernetes.IsAPIResourceInstalled(c, servingv1.SchemeGroupVersion.String(), reflect.TypeOf(servingv1.Service{}).Name()); err != nil { return err
