camel-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From astefanu...@apache.org
Subject [camel-k] branch master updated: Fix #698: 2nd attempt
Date Wed, 29 May 2019 17:54:07 GMT
This is an automated email from the ASF dual-hosted git repository.

astefanutti pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git


The following commit(s) were added to refs/heads/master by this push:
     new c872017  Fix #698: 2nd attempt
c872017 is described below

commit c8720172137b05bf4422562f8308f379f63672f9
Author: nferraro <ni.ferraro@gmail.com>
AuthorDate: Wed May 29 15:16:09 2019 +0200

    Fix #698: 2nd attempt
---
 deploy/operator-deployment.yaml                  |  5 +++
 deploy/resources.go                              | 27 +++-------------
 pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go | 26 ++++++---------
 pkg/cmd/install.go                               |  4 ++-
 pkg/controller/build/schedule_pod.go             | 21 ++++++++++---
 pkg/controller/integration/initialize.go         |  3 ++
 pkg/controller/integrationplatform/create.go     |  8 ++---
 pkg/install/common.go                            | 24 +++++++++-----
 pkg/install/operator.go                          | 36 ++++++++++++++-------
 pkg/platform/operator.go                         | 40 ++++++++++++++++++++++++
 test/testing_env.go                              |  2 +-
 11 files changed, 129 insertions(+), 67 deletions(-)

diff --git a/deploy/operator-deployment.yaml b/deploy/operator-deployment.yaml
index 21f7ed6..82af532 100644
--- a/deploy/operator-deployment.yaml
+++ b/deploy/operator-deployment.yaml
@@ -36,3 +36,8 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.name
+            # NAMESPACE is always the operator namespace, independently from WATCH_NAMESPACE
+            - name: NAMESPACE
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.namespace
diff --git a/deploy/resources.go b/deploy/resources.go
index faafb19..71f27fa 100644
--- a/deploy/resources.go
+++ b/deploy/resources.go
@@ -10683,6 +10683,11 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.name
+            # NAMESPACE is always the operator namespace, independently from WATCH_NAMESPACE
+            - name: NAMESPACE
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.namespace
 
 `
 	Resources["operator-role-binding-knative.yaml"] =
@@ -11057,28 +11062,6 @@ spec:
     - runtime:kotlin
     - camel:core
 `
-	Resources["platform-integration-context-spring-boot.yaml"] =
-		`
-apiVersion: camel.apache.org/v1alpha1
-kind: IntegrationContext
-metadata:
-  name: spring-boot
-  labels:
-    app: "camel-k"
-    camel.apache.org/context.created.by.kind: Operator
-    camel.apache.org/context.created.by.name: camel-k-operator
-    camel.apache.org/context.type: platform
-spec:
-  dependencies:
-    - runtime:jvm
-    - runtime:spring-boot
-    - camel:core
-  traits:
-    springboot:
-      configuration:
-        enabled: "true"
-
-`
 	Resources["user-cluster-role.yaml"] =
 		`
 kind: ClusterRole
diff --git a/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
index ac2e148..1233a9e 100644
--- a/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
@@ -1,21 +1,5 @@
 // +build !ignore_autogenerated
 
-/*
-Copyright The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
 // Code generated by deepcopy-gen. DO NOT EDIT.
 
 package v1alpha1
@@ -799,6 +783,11 @@ func (in *IntegrationPlatformSpec) DeepCopyInto(out *IntegrationPlatformSpec)
{
 			(*out)[key] = *val.DeepCopy()
 		}
 	}
+	if in.Configuration != nil {
+		in, out := &in.Configuration, &out.Configuration
+		*out = make([]ConfigurationSpec, len(*in))
+		copy(*out, *in)
+	}
 	return
 }
 
@@ -899,6 +888,11 @@ func (in *IntegrationStatus) DeepCopyInto(out *IntegrationStatus) {
 		*out = new(Failure)
 		(*in).DeepCopyInto(*out)
 	}
+	if in.Configuration != nil {
+		in, out := &in.Configuration, &out.Configuration
+		*out = make([]ConfigurationSpec, len(*in))
+		copy(*out, *in)
+	}
 	return
 }
 
diff --git a/pkg/cmd/install.go b/pkg/cmd/install.go
index 658d623..a2ca340 100644
--- a/pkg/cmd/install.go
+++ b/pkg/cmd/install.go
@@ -69,6 +69,7 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
 	cmd.Flags().StringVar(&impl.camelVersion, "camel-version", "", "Set the camel version")
 	cmd.Flags().StringVar(&impl.runtimeVersion, "runtime-version", "", "Set the camel-k
runtime version")
 	cmd.Flags().StringVar(&impl.baseImage, "base-image", "", "Set the base image used to
run integrations")
+	cmd.Flags().StringVar(&impl.operatorImage, "operator-image", "", "Set the operator image
used for the operator deployment")
 	cmd.Flags().StringSliceVar(&impl.contexts, "context", nil, "Add a camel context to build
at startup, by default all known contexts are built")
 	cmd.Flags().StringVar(&impl.buildStrategy, "build-strategy", "", "Set the build strategy")
 	cmd.Flags().StringVar(&impl.buildTimeout, "build-timeout", "", "Set how long the build
process can last")
@@ -96,6 +97,7 @@ type installCmdOptions struct {
 	camelVersion         string
 	runtimeVersion       string
 	baseImage            string
+	operatorImage        string
 	localRepository      string
 	buildStrategy        string
 	buildTimeout         string
@@ -139,7 +141,7 @@ func (o *installCmdOptions) install(_ *cobra.Command, _ []string) error
{
 
 		namespace := o.Namespace
 
-		err = install.OperatorOrCollect(o.Context, c, namespace, collection)
+		err = install.OperatorOrCollect(o.Context, c, namespace, o.operatorImage, collection)
 		if err != nil {
 			return err
 		}
diff --git a/pkg/controller/build/schedule_pod.go b/pkg/controller/build/schedule_pod.go
index 8bbb7c9..be34557 100644
--- a/pkg/controller/build/schedule_pod.go
+++ b/pkg/controller/build/schedule_pod.go
@@ -21,6 +21,9 @@ import (
 	"context"
 	"sync"
 
+	"github.com/apache/camel-k/pkg/platform"
+	"github.com/apache/camel-k/pkg/util/defaults"
+
 	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -31,7 +34,6 @@ import (
 	"github.com/pkg/errors"
 
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
-	"github.com/apache/camel-k/pkg/util/defaults"
 )
 
 // NewSchedulePodAction creates a new schedule action
@@ -88,10 +90,16 @@ func (action *schedulePodAction) Handle(ctx context.Context, build *v1alpha1.Bui
 		return nil
 	}
 
+	// Try to get operator image name before starting the build
+	operatorImage, err := platform.GetCurrentOperatorImage(ctx, action.client)
+	if err != nil {
+		return err
+	}
+
 	// Otherwise, let's create the build pod
 	// We may want to explicitly manage build priority as opposed to relying on
 	// the reconcile loop to handle the queuing
-	pod := newBuildPod(build)
+	pod := newBuildPod(build, operatorImage)
 
 	// Set the Build instance as the owner and controller
 	if err := controllerutil.SetControllerReference(build, pod, action.client.GetScheme());
err != nil {
@@ -115,7 +123,11 @@ func (action *schedulePodAction) Handle(ctx context.Context, build *v1alpha1.Bui
 	return action.client.Status().Update(ctx, target)
 }
 
-func newBuildPod(build *v1alpha1.Build) *corev1.Pod {
+func newBuildPod(build *v1alpha1.Build, operatorImage string) *corev1.Pod {
+	builderImage := operatorImage
+	if builderImage == "" {
+		builderImage = defaults.ImageName + ":" + defaults.Version
+	}
 	pod := &corev1.Pod{
 		TypeMeta: metav1.TypeMeta{
 			APIVersion: corev1.SchemeGroupVersion.String(),
@@ -130,7 +142,8 @@ func newBuildPod(build *v1alpha1.Build) *corev1.Pod {
 			Containers: []corev1.Container{
 				{
 					Name:  "builder",
-					Image: defaults.ImageName + ":" + defaults.Version,
+					Image: builderImage,
+					ImagePullPolicy: "IfNotPresent",
 					Args: []string{
 						"camel-k-builder",
 						build.Namespace,
diff --git a/pkg/controller/integration/initialize.go b/pkg/controller/integration/initialize.go
index 636b0f6..b2e716e 100644
--- a/pkg/controller/integration/initialize.go
+++ b/pkg/controller/integration/initialize.go
@@ -50,6 +50,9 @@ func (action *initializeAction) CanHandle(integration *v1alpha1.Integration)
boo
 // Handle handles the integrations
 func (action *initializeAction) Handle(ctx context.Context, integration *v1alpha1.Integration)
error {
 	pl, err := platform.GetCurrentPlatform(ctx, action.client, integration.Namespace)
+	if err != nil {
+		return err
+	}
 
 	// The integration platform needs to be ready before starting to create integrations
 	if err != nil || pl.Status.Phase != v1alpha1.IntegrationPlatformPhaseReady {
diff --git a/pkg/controller/integrationplatform/create.go b/pkg/controller/integrationplatform/create.go
index 572fb31..023852e 100644
--- a/pkg/controller/integrationplatform/create.go
+++ b/pkg/controller/integrationplatform/create.go
@@ -50,7 +50,7 @@ func (action *createAction) Handle(ctx context.Context, platform *v1alpha1.Integ
 	for k := range deploy.Resources {
 		if strings.HasPrefix(k, "camel-catalog-") {
 			action.L.Infof("Installing camel catalog: %s", k)
-			err := install.Resources(ctx, action.client, platform.Namespace, k)
+			err := install.Resources(ctx, action.client, platform.Namespace, install.IdentityResourceCustomizer,
k)
 			if err != nil {
 				return err
 			}
@@ -79,21 +79,21 @@ func (action *createAction) Handle(ctx context.Context, platform *v1alpha1.Integ
 
 		if len(res) > 0 {
 			action.L.Info("Installing custom platform resources")
-			err := install.Resources(ctx, action.client, platform.Namespace, res...)
+			err := install.Resources(ctx, action.client, platform.Namespace, install.IdentityResourceCustomizer,
res...)
 			if err != nil {
 				return err
 			}
 		}
 	} else {
 		action.L.Info("Installing default platform resources")
-		err := install.Resources(ctx, action.client, platform.Namespace, p.DefaultContexts...)
+		err := install.Resources(ctx, action.client, platform.Namespace, install.IdentityResourceCustomizer,
p.DefaultContexts...)
 		if err != nil {
 			return err
 		}
 
 		if platform.Spec.Profile == v1alpha1.TraitProfileKnative {
 			action.L.Info("Installing knative resources")
-			err := install.Resources(ctx, action.client, platform.Namespace, p.KnativeContexts...)
+			err := install.Resources(ctx, action.client, platform.Namespace, install.IdentityResourceCustomizer,
p.KnativeContexts...)
 			if err != nil {
 				return err
 			}
diff --git a/pkg/install/common.go b/pkg/install/common.go
index d7a15fb..f8a9fbe 100644
--- a/pkg/install/common.go
+++ b/pkg/install/common.go
@@ -29,15 +29,23 @@ import (
 	"k8s.io/apimachinery/pkg/runtime"
 )
 
+// ResourceCustomizer can be used to inject code that changes the objects before they are
created
+type ResourceCustomizer func(object runtime.Object)runtime.Object
+// IdentityResourceCustomizer is a ResourceCustomizer that does nothing
+var IdentityResourceCustomizer = func(object runtime.Object)runtime.Object {
+	return object
+}
+
+
 // Resources installs named resources from the project resource directory
-func Resources(ctx context.Context, c client.Client, namespace string, names ...string) error
{
-	return ResourcesOrCollect(ctx, c, namespace, nil, names...)
+func Resources(ctx context.Context, c client.Client, namespace string, customizer ResourceCustomizer,
names ...string) error {
+	return ResourcesOrCollect(ctx, c, namespace, nil, customizer, names...)
 }
 
 // ResourcesOrCollect --
-func ResourcesOrCollect(ctx context.Context, c client.Client, namespace string, collection
*kubernetes.Collection, names ...string) error {
+func ResourcesOrCollect(ctx context.Context, c client.Client, namespace string, collection
*kubernetes.Collection, customizer ResourceCustomizer, names ...string) error {
 	for _, name := range names {
-		if err := ResourceOrCollect(ctx, c, namespace, collection, name); err != nil {
+		if err := ResourceOrCollect(ctx, c, namespace, collection, customizer, name); err != nil
{
 			return err
 		}
 	}
@@ -45,18 +53,18 @@ func ResourcesOrCollect(ctx context.Context, c client.Client, namespace
string,
 }
 
 // Resource installs a single named resource from the project resource directory
-func Resource(ctx context.Context, c client.Client, namespace string, name string) error
{
-	return ResourceOrCollect(ctx, c, namespace, nil, name)
+func Resource(ctx context.Context, c client.Client, namespace string, customizer ResourceCustomizer,
name string) error {
+	return ResourceOrCollect(ctx, c, namespace, nil, customizer, name)
 }
 
 // ResourceOrCollect --
-func ResourceOrCollect(ctx context.Context, c client.Client, namespace string, collection
*kubernetes.Collection, name string) error {
+func ResourceOrCollect(ctx context.Context, c client.Client, namespace string, collection
*kubernetes.Collection, customizer ResourceCustomizer, name string) error {
 	obj, err := kubernetes.LoadResourceFromYaml(c.GetScheme(), deploy.Resources[name])
 	if err != nil {
 		return err
 	}
 
-	return RuntimeObjectOrCollect(ctx, c, namespace, collection, obj)
+	return RuntimeObjectOrCollect(ctx, c, namespace, collection, customizer(obj))
 }
 
 // RuntimeObject installs a single runtime object
diff --git a/pkg/install/operator.go b/pkg/install/operator.go
index aa2be13..8b1c8bb 100644
--- a/pkg/install/operator.go
+++ b/pkg/install/operator.go
@@ -21,6 +21,9 @@ import (
 	"context"
 	"errors"
 
+	v1 "k8s.io/api/apps/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+
 	"github.com/apache/camel-k/deploy"
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
 	"github.com/apache/camel-k/pkg/client"
@@ -31,22 +34,33 @@ import (
 )
 
 // Operator installs the operator resources in the given namespace
-func Operator(ctx context.Context, c client.Client, namespace string) error {
-	return OperatorOrCollect(ctx, c, namespace, nil)
+func Operator(ctx context.Context, c client.Client, customImage string, namespace string)
error {
+	return OperatorOrCollect(ctx, c, namespace, customImage, nil)
 }
 
 // OperatorOrCollect installs the operator resources or adds them to the collector if present
-func OperatorOrCollect(ctx context.Context, c client.Client, namespace string, collection
*kubernetes.Collection) error {
+func OperatorOrCollect(ctx context.Context, c client.Client, namespace string, customImage
string, collection *kubernetes.Collection) error {
+	customizer := IdentityResourceCustomizer
+	if customImage != "" {
+		customizer = func(o runtime.Object) runtime.Object {
+			if d, ok := o.(*v1.Deployment); ok {
+				if d.Labels["camel.apache.org/component"] == "operator" {
+					d.Spec.Template.Spec.Containers[0].Image = customImage
+				}
+			}
+			return o
+		}
+	}
 	isOpenshift, err := openshift.IsOpenShift(c)
 	if err != nil {
 		return err
 	}
 	if isOpenshift {
-		if err := installOpenshift(ctx, c, namespace, collection); err != nil {
+		if err := installOpenshift(ctx, c, namespace, customizer, collection); err != nil {
 			return err
 		}
 	} else {
-		if err := installKubernetes(ctx, c, namespace, collection); err != nil {
+		if err := installKubernetes(ctx, c, namespace, customizer, collection); err != nil {
 			return err
 		}
 	}
@@ -61,8 +75,8 @@ func OperatorOrCollect(ctx context.Context, c client.Client, namespace string,
c
 	return nil
 }
 
-func installOpenshift(ctx context.Context, c client.Client, namespace string, collection
*kubernetes.Collection) error {
-	return ResourcesOrCollect(ctx, c, namespace, collection,
+func installOpenshift(ctx context.Context, c client.Client, namespace string, customizer
ResourceCustomizer, collection *kubernetes.Collection) error {
+	return ResourcesOrCollect(ctx, c, namespace, collection, customizer,
 		"operator-service-account.yaml",
 		"operator-role-openshift.yaml",
 		"operator-role-binding.yaml",
@@ -70,8 +84,8 @@ func installOpenshift(ctx context.Context, c client.Client, namespace string,
co
 	)
 }
 
-func installKubernetes(ctx context.Context, c client.Client, namespace string, collection
*kubernetes.Collection) error {
-	return ResourcesOrCollect(ctx, c, namespace, collection,
+func installKubernetes(ctx context.Context, c client.Client, namespace string, customizer
ResourceCustomizer, collection *kubernetes.Collection) error {
+	return ResourcesOrCollect(ctx, c, namespace, collection, customizer,
 		"operator-service-account.yaml",
 		"operator-role-kubernetes.yaml",
 		"operator-role-binding.yaml",
@@ -80,7 +94,7 @@ func installKubernetes(ctx context.Context, c client.Client, namespace string,
c
 }
 
 func installKnative(ctx context.Context, c client.Client, namespace string, collection *kubernetes.Collection)
error {
-	return ResourcesOrCollect(ctx, c, namespace, collection,
+	return ResourcesOrCollect(ctx, c, namespace, collection, IdentityResourceCustomizer,
 		"operator-role-knative.yaml",
 		"operator-role-binding-knative.yaml",
 	)
@@ -143,7 +157,7 @@ func Example(ctx context.Context, c client.Client, namespace string) error
{
 
 // ExampleOrCollect --
 func ExampleOrCollect(ctx context.Context, c client.Client, namespace string, collection
*kubernetes.Collection) error {
-	return ResourcesOrCollect(ctx, c, namespace, collection,
+	return ResourcesOrCollect(ctx, c, namespace, collection, IdentityResourceCustomizer,
 		"cr-example.yaml",
 	)
 }
diff --git a/pkg/platform/operator.go b/pkg/platform/operator.go
new file mode 100644
index 0000000..4431364
--- /dev/null
+++ b/pkg/platform/operator.go
@@ -0,0 +1,40 @@
+package platform
+
+import (
+	"context"
+	"errors"
+	"os"
+
+	v1 "k8s.io/api/core/v1"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+)
+
+const operatorNamespaceEnvVariable = "NAMESPACE"
+const operatorPodNameEnvVariable = "POD_NAME"
+
+// GetCurrentOperatorImage returns the image currently used by the running operator if present
(when running out of cluster, it may be absent).
+func GetCurrentOperatorImage(ctx context.Context, c client.Client) (string, error) {
+	var podNamespace string
+	var podName string
+	var envSet bool
+	if podNamespace, envSet = os.LookupEnv(operatorNamespaceEnvVariable); !envSet || podNamespace
== "" {
+		return "", nil
+	}
+	if podName, envSet = os.LookupEnv(operatorPodNameEnvVariable); !envSet || podName == ""
{
+		return "", nil
+	}
+
+	podKey := client.ObjectKey{
+		Namespace: podNamespace,
+		Name:      podName,
+	}
+	pod := v1.Pod{}
+
+	if err := c.Get(ctx, podKey, &pod); err != nil {
+		return "", err
+	}
+	if len(pod.Spec.Containers) == 0 {
+		return "", errors.New("no containers found in operator pod")
+	}
+	return pod.Spec.Containers[0].Image, nil
+}
diff --git a/test/testing_env.go b/test/testing_env.go
index dbeae00..91763c6 100644
--- a/test/testing_env.go
+++ b/test/testing_env.go
@@ -55,7 +55,7 @@ func init() {
 		panic(err)
 	}
 
-	err = install.Operator(testContext, testClient, getTargetNamespace())
+	err = install.Operator(testContext, testClient, "", getTargetNamespace())
 	if err != nil {
 		panic(err)
 	}


Mime
View raw message