You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pc...@apache.org on 2023/06/28 06:47:12 UTC

[camel-k] 05/07: feat: user 1001

This is an automated email from the ASF dual-hosted git repository.

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

commit 3ec31d49ee290d22f341389bba149009a25b6748
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Tue Jun 20 18:41:56 2023 +0200

    feat: user 1001
    
    This is the one used in the builder image
---
 build/Dockerfile                                   | 10 ++--
 .../bases/camel_v1_integrationplatform.yaml        |  3 --
 e2e/common/traits/builder_test.go                  |  9 ++--
 e2e/commonwithcustominstall/builder_test.go        |  2 +-
 .../incremental_build_test.go                      | 54 +++++++++++++++++++++-
 e2e/install/kustomize/uninstall_test.go            |  3 +-
 go.mod                                             |  2 +-
 go.sum                                             |  4 +-
 pkg/controller/build/build_pod.go                  | 13 +++---
 pkg/controller/catalog/initialize.go               |  4 +-
 pkg/platform/defaults.go                           |  2 +-
 pkg/util/defaults/defaults.go                      |  2 +-
 script/Makefile                                    |  2 +-
 13 files changed, 83 insertions(+), 27 deletions(-)

diff --git a/build/Dockerfile b/build/Dockerfile
index cd66cc6ab..92efe413b 100644
--- a/build/Dockerfile
+++ b/build/Dockerfile
@@ -45,14 +45,14 @@ ENV MAVEN_OPTS="${MAVEN_OPTS} -Dlogback.configurationFile=${MAVEN_HOME}/conf/log
 ADD build/_maven_output ${MVN_REPO}
 ADD build/_kamelets /kamelets
 
-RUN chgrp -R 0 ${MVN_REPO} \
-    && chmod -R g=u ${MVN_REPO} \
+RUN chgrp -R 1001 ${MVN_REPO} \
+    && chown -R 1001 ${MVN_REPO} \
     && chgrp -R 0 /kamelets \
     && chmod -R g=u /kamelets \
-    && chgrp -R 0 ${MAVEN_HOME} \
-    && chmod -R g=u ${MAVEN_HOME}
+    && chgrp -R 1001 ${MAVEN_HOME} \
+    && chown -R 1001 ${MAVEN_HOME}
 
-USER 1000
+USER 1001
 
 ADD build/_output/bin/kamel /usr/local/bin/kamel
 
diff --git a/config/samples/bases/camel_v1_integrationplatform.yaml b/config/samples/bases/camel_v1_integrationplatform.yaml
index fe0440802..30c582628 100644
--- a/config/samples/bases/camel_v1_integrationplatform.yaml
+++ b/config/samples/bases/camel_v1_integrationplatform.yaml
@@ -22,6 +22,3 @@ metadata:
   labels:
     app: "camel-k"
 spec:
-  build:
-    buildConfiguration:
-      strategy: pod
diff --git a/e2e/common/traits/builder_test.go b/e2e/common/traits/builder_test.go
index da8e6f39b..f876a2445 100644
--- a/e2e/common/traits/builder_test.go
+++ b/e2e/common/traits/builder_test.go
@@ -70,6 +70,7 @@ func TestBuilderTrait(t *testing.T) {
 			"-t", "builder.limit-cpu=1000m",
 			"-t", "builder.request-memory=2Gi",
 			"-t", "builder.limit-memory=3Gi",
+			"-t", "builder.strategy=pod",
 		).Execute()).To(Succeed())
 
 		Eventually(IntegrationPodPhase(ns, name), TestTimeoutLong).Should(Equal(corev1.PodRunning))
@@ -101,10 +102,11 @@ func TestBuilderTrait(t *testing.T) {
 			"--name", name,
 			"-t", "builder.tasks=custom1;alpine;tree",
 			"-t", "builder.tasks=custom2;alpine;cat maven/pom.xml",
+			"-t", "builder.strategy=pod",
 		).Execute()).To(Succeed())
 
 		Eventually(IntegrationPodPhase(ns, name), TestTimeoutLong).Should(Equal(corev1.PodRunning))
-		Eventually(IntegrationConditionStatus(ns, name, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+		Eventually(IntegrationConditionStatus(ns, name, v1.IntegrationConditionReady), TestTimeoutLong).Should(Equal(corev1.ConditionTrue))
 		Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
 
 		integrationKitName := IntegrationKit(ns, name)()
@@ -144,13 +146,14 @@ func TestBuilderTrait(t *testing.T) {
 		Expect(KamelRunWithID(operatorID, ns, "files/Java.java",
 			"--name", name,
 			"-t", "builder.tasks=custom1;alpine;cat missingfile.txt",
+			"-t", "builder.strategy=pod",
 		).Execute()).To(Succeed())
 
 		Eventually(IntegrationPhase(ns, name)).Should(Equal(v1.IntegrationPhaseBuildingKit))
 		integrationKitName := IntegrationKit(ns, name)()
 		// Check containers conditions
-		Eventually(Build(ns, integrationKitName), TestTimeoutShort).ShouldNot(BeNil())
-		Eventually(BuildConditions(ns, integrationKitName), TestTimeoutShort).ShouldNot(BeNil())
+		Eventually(Build(ns, integrationKitName), TestTimeoutLong).ShouldNot(BeNil())
+		Eventually(BuildConditions(ns, integrationKitName), TestTimeoutLong).ShouldNot(BeNil())
 		Eventually(
 			Build(ns, integrationKitName)().Status.GetCondition(v1.BuildConditionType("Container custom1 succeeded")).Status,
 			TestTimeoutShort).Should(Equal(corev1.ConditionFalse))
diff --git a/e2e/commonwithcustominstall/builder_test.go b/e2e/commonwithcustominstall/builder_test.go
index 245eb160f..b1f2007ae 100644
--- a/e2e/commonwithcustominstall/builder_test.go
+++ b/e2e/commonwithcustominstall/builder_test.go
@@ -59,7 +59,7 @@ func TestBuilderTimeout(t *testing.T) {
 
 		t.Run("run yaml", func(t *testing.T) {
 			name := "yaml"
-			Expect(KamelRunWithID(operatorID, ns, "files/yaml.yaml").Execute()).To(Succeed())
+			Expect(KamelRunWithID(operatorID, ns, "files/yaml.yaml", "-t", "builder.strategy=pod").Execute()).To(Succeed())
 			// As the build hits timeout, it keeps trying building
 			Eventually(IntegrationPhase(ns, name)).Should(Equal(v1.IntegrationPhaseBuildingKit))
 			integrationKitName := IntegrationKit(ns, name)()
diff --git a/e2e/commonwithcustominstall/incremental_build_test.go b/e2e/commonwithcustominstall/incremental_build_test.go
index 0af991041..fe68dc9d7 100644
--- a/e2e/commonwithcustominstall/incremental_build_test.go
+++ b/e2e/commonwithcustominstall/incremental_build_test.go
@@ -34,7 +34,7 @@ import (
 	"github.com/apache/camel-k/v2/pkg/util/defaults"
 )
 
-func TestRunIncrementalBuild(t *testing.T) {
+func TestRunIncrementalBuildRoutine(t *testing.T) {
 	WithNewTestNamespace(t, func(ns string) {
 		operatorID := "camel-k-incremental-build"
 		Expect(KamelInstallWithID(operatorID, ns).Execute()).To(Succeed())
@@ -48,12 +48,63 @@ func TestRunIncrementalBuild(t *testing.T) {
 		Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
 		integrationKitName := IntegrationKit(ns, name)()
 		Eventually(Kit(ns, integrationKitName)().Status.BaseImage).Should(Equal(defaults.BaseImage()))
+
+		t.Run("Reuse previous kit", func(t *testing.T) {
+			nameClone := "java-clone"
+			Expect(KamelRunWithID(operatorID, ns, "files/Java.java",
+				"--name", nameClone,
+			).Execute()).To(Succeed())
+			Eventually(IntegrationPodPhase(ns, nameClone), TestTimeoutLong).Should(Equal(corev1.PodRunning))
+			Eventually(IntegrationConditionStatus(ns, nameClone, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+			Eventually(IntegrationLogs(ns, nameClone), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
+			integrationCloneKitName := IntegrationKit(ns, nameClone)()
+			Eventually(integrationCloneKitName).Should(Equal(integrationKitName))
+		})
+
+		t.Run("Create incremental kit", func(t *testing.T) {
+			// Another integration that should be built on top of the previous IntegrationKit
+			// just add a new random dependency
+			nameIncremental := "java-incremental"
+			Expect(KamelRunWithID(operatorID, ns, "files/Java.java",
+				"--name", nameIncremental,
+				"-d", "camel:zipfile",
+			).Execute()).To(Succeed())
+			Eventually(IntegrationPodPhase(ns, nameIncremental), TestTimeoutLong).Should(Equal(corev1.PodRunning))
+			Eventually(IntegrationConditionStatus(ns, nameIncremental, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+			Eventually(IntegrationLogs(ns, nameIncremental), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
+			integrationIncrementalKitName := IntegrationKit(ns, nameIncremental)()
+			// the container comes in a format like
+			// 10.108.177.66/test-d7cad110-bb1d-4e79-8a0e-ebd44f6fe5d4/camel-k-kit-c8357r4k5tp6fn1idm60@sha256:d49716f0429ad8b23a1b8d20a357d64b1aa42a67c1a2a534ebd4c54cd598a18d
+			// we should be save just to check the substring is contained
+			Eventually(Kit(ns, integrationIncrementalKitName)().Status.BaseImage).Should(ContainSubstring(integrationKitName))
+		})
+
+		Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
+	})
+}
+
+func TestRunIncrementalBuildPod(t *testing.T) {
+	WithNewTestNamespace(t, func(ns string) {
+		operatorID := "camel-k-incremental-build"
+		Expect(KamelInstallWithID(operatorID, ns).Execute()).To(Succeed())
+
+		name := "java"
+		Expect(KamelRunWithID(operatorID, ns, "files/Java.java",
+			"--name", name,
+			"-t", "builder.strategy=pod",
+		).Execute()).To(Succeed())
+		Eventually(IntegrationPodPhase(ns, name), TestTimeoutLong).Should(Equal(corev1.PodRunning))
+		Eventually(IntegrationConditionStatus(ns, name, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+		Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
+		integrationKitName := IntegrationKit(ns, name)()
+		Eventually(Kit(ns, integrationKitName)().Status.BaseImage).Should(Equal(defaults.BaseImage()))
 		Eventually(BuilderPodsCount(ns)).Should(Equal(1))
 
 		t.Run("Reuse previous kit", func(t *testing.T) {
 			nameClone := "java-clone"
 			Expect(KamelRunWithID(operatorID, ns, "files/Java.java",
 				"--name", nameClone,
+				"-t", "builder.strategy=pod",
 			).Execute()).To(Succeed())
 			Eventually(IntegrationPodPhase(ns, nameClone), TestTimeoutLong).Should(Equal(corev1.PodRunning))
 			Eventually(IntegrationConditionStatus(ns, nameClone, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
@@ -70,6 +121,7 @@ func TestRunIncrementalBuild(t *testing.T) {
 			Expect(KamelRunWithID(operatorID, ns, "files/Java.java",
 				"--name", nameIncremental,
 				"-d", "camel:zipfile",
+				"-t", "builder.strategy=pod",
 			).Execute()).To(Succeed())
 			Eventually(IntegrationPodPhase(ns, nameIncremental), TestTimeoutLong).Should(Equal(corev1.PodRunning))
 			Eventually(IntegrationConditionStatus(ns, nameIncremental, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
diff --git a/e2e/install/kustomize/uninstall_test.go b/e2e/install/kustomize/uninstall_test.go
index efbef85ed..c56bc74f5 100644
--- a/e2e/install/kustomize/uninstall_test.go
+++ b/e2e/install/kustomize/uninstall_test.go
@@ -65,7 +65,8 @@ func TestKustomizeUninstallBasic(t *testing.T) {
 		Eventually(OperatorPod(ns)).Should(BeNil())
 		Eventually(Platform(ns)).Should(BeNil())
 		// The operator can dynamically create a for its builders
-		Eventually(Role(ns)).Should(HaveLen(1))
+		// so, in case there is a build strategy "pod", expect this to have 1 role
+		Eventually(Role(ns)).Should(BeNil())
 		Eventually(ClusterRole()).Should(BeNil())
 		// CRDs should be still there
 		Eventually(CRDs()).Should(HaveLen(ExpectedCRDs))
diff --git a/go.mod b/go.mod
index 684067128..b8f8ec238 100644
--- a/go.mod
+++ b/go.mod
@@ -100,7 +100,7 @@ require (
 	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/google/gnostic v0.6.9 // indirect
 	github.com/google/go-cmp v0.5.9 // indirect
-	github.com/google/go-containerregistry v0.13.0 // indirect
+	github.com/google/go-containerregistry v0.15.2 // indirect
 	github.com/google/go-querystring v1.1.0 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 // indirect
diff --git a/go.sum b/go.sum
index 4fffd419c..0f49ed9cb 100644
--- a/go.sum
+++ b/go.sum
@@ -333,8 +333,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
 github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-containerregistry v0.13.0 h1:y1C7Z3e149OJbOPDBxLYR8ITPz8dTKqQwjErKVHJC8k=
-github.com/google/go-containerregistry v0.13.0/go.mod h1:J9FQ+eSS4a1aC2GNZxvNpbWhgp0487v+cgiilB4FqDo=
+github.com/google/go-containerregistry v0.15.2 h1:MMkSh+tjSdnmJZO7ljvEqV1DjfekB6VUEAZgy3a+TQE=
+github.com/google/go-containerregistry v0.15.2/go.mod h1:wWK+LnOv4jXMM23IT/F1wdYftGWGr47Is8CG+pmHK1Q=
 github.com/google/go-github/v52 v52.0.0 h1:uyGWOY+jMQ8GVGSX8dkSwCzlehU3WfdxQ7GweO/JP7M=
 github.com/google/go-github/v52 v52.0.0/go.mod h1:WJV6VEEUPuMo5pXqqa2ZCZEdbQqua4zAk2MZTIo+m+4=
 github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
diff --git a/pkg/controller/build/build_pod.go b/pkg/controller/build/build_pod.go
index 7f4f6df72..4627e8806 100644
--- a/pkg/controller/build/build_pod.go
+++ b/pkg/controller/build/build_pod.go
@@ -113,8 +113,7 @@ var (
 )
 
 func newBuildPod(ctx context.Context, c ctrl.Reader, build *v1.Build) (*corev1.Pod, error) {
-	// TODO we must find a way to run this non-root
-	var ugfid int64 = 0
+	var ugfid int64 = 1001
 	pod := &corev1.Pod{
 		TypeMeta: metav1.TypeMeta{
 			APIVersion: corev1.SchemeGroupVersion.String(),
@@ -264,10 +263,6 @@ func addBuildTaskToPod(build *v1.Build, taskName string, pod *corev1.Pod) {
 			Name:  "HOME",
 			Value: filepath.Join(builderDir, build.Name),
 		},
-		/*corev1.EnvVar{
-			Name:  "MAVEN_USER_HOME",
-			Value: "/usr/share/maven",
-		},*/
 	)
 
 	container := corev1.Container{
@@ -384,6 +379,7 @@ func addBuildahTaskToPod(ctx context.Context, c ctrl.Reader, build *v1.Build, ta
 		image = fmt.Sprintf("%s:v%s", builder.BuildahDefaultImageName, defaults.BuildahVersion)
 	}
 
+	var root int64 = 0
 	container := corev1.Container{
 		Name:            task.Name,
 		Image:           image,
@@ -393,6 +389,11 @@ func addBuildahTaskToPod(ctx context.Context, c ctrl.Reader, build *v1.Build, ta
 		Env:             env,
 		WorkingDir:      filepath.Join(builderDir, build.Name, builder.ContextDir),
 		VolumeMounts:    volumeMounts,
+		// Buildah requires root privileges
+		SecurityContext: &corev1.SecurityContext{
+			RunAsUser:  &root,
+			RunAsGroup: &root,
+		},
 	}
 
 	pod.Spec.Volumes = append(pod.Spec.Volumes, volumes...)
diff --git a/pkg/controller/catalog/initialize.go b/pkg/controller/catalog/initialize.go
index c21dd73c7..79935bcf8 100644
--- a/pkg/controller/catalog/initialize.go
+++ b/pkg/controller/catalog/initialize.go
@@ -175,7 +175,7 @@ func initializeS2i(ctx context.Context, c client.Client, ip *v1.IntegrationPlatf
 	// Dockfile
 	dockerfile := string([]byte(`
 		FROM ` + catalog.Spec.GetQuarkusToolingImage() + `
-		USER 1000
+		USER 1001
 		ADD /usr/local/bin/kamel /usr/local/bin/kamel
 		ADD /usr/share/maven/mvnw/ /usr/share/maven/mvnw/
 		ADD ` + defaults.LocalRepository + ` ` + defaults.LocalRepository + `
@@ -382,6 +382,8 @@ func initializeS2i(ctx context.Context, c client.Client, ip *v1.IntegrationPlatf
 func imageExistsSpectrum(options spectrum.Options) bool {
 	Log.Infof("Checking if Camel K builder container %s already exists...", options.Base)
 	ctrImg, err := spectrum.Pull(options)
+	// Ignore the error-indent-flow as we save the need to declare a dependency explicitly
+	// nolint: revive
 	if ctrImg != nil && err == nil {
 		if hash, err := ctrImg.Digest(); err != nil {
 			Log.Errorf(err, "Cannot calculate digest")
diff --git a/pkg/platform/defaults.go b/pkg/platform/defaults.go
index aff2bf41b..8f694f48f 100644
--- a/pkg/platform/defaults.go
+++ b/pkg/platform/defaults.go
@@ -82,7 +82,7 @@ func ConfigureDefaults(ctx context.Context, c client.Client, p *v1.IntegrationPl
 	}
 
 	if p.Status.Build.BuildConfiguration.Strategy == "" {
-		p.Status.Build.BuildConfiguration.Strategy = v1.BuildStrategyPod
+		p.Status.Build.BuildConfiguration.Strategy = v1.BuildStrategyRoutine
 		log.Debugf("Integration Platform %s [%s]: setting build strategy %s", p.Name, p.Namespace, p.Status.Build.BuildConfiguration.Strategy)
 	}
 
diff --git a/pkg/util/defaults/defaults.go b/pkg/util/defaults/defaults.go
index 3afb9b8d5..6720f42eb 100644
--- a/pkg/util/defaults/defaults.go
+++ b/pkg/util/defaults/defaults.go
@@ -29,7 +29,7 @@ const (
 	DefaultRuntimeVersion = "2.16.0-SNAPSHOT"
 
 	// BuildahVersion --
-	BuildahVersion = "1.23.3"
+	BuildahVersion = "1.30.0"
 
 	// KanikoVersion --
 	KanikoVersion = "1.9.1"
diff --git a/script/Makefile b/script/Makefile
index d72b2fc3d..065f86565 100644
--- a/script/Makefile
+++ b/script/Makefile
@@ -24,7 +24,7 @@ VERSION ?= 2.0.0-SNAPSHOT
 LAST_RELEASED_IMAGE_NAME := camel-k-operator
 LAST_RELEASED_VERSION ?= 1.12.1
 RUNTIME_VERSION := 2.16.0-SNAPSHOT
-BUILDAH_VERSION := 1.23.3
+BUILDAH_VERSION := 1.30.0
 KANIKO_VERSION := 1.9.1
 CONTROLLER_GEN_VERSION := v0.6.1
 CODEGEN_VERSION := v0.25.6