You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by as...@apache.org on 2021/03/30 17:20:55 UTC

[camel-k] 13/20: test: Maven CA secret e2e tests

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

commit 84d8910d6e9c3ae412a526a62b420497542864d1
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Mon Mar 29 15:01:33 2021 +0200

    test: Maven CA secret e2e tests
---
 e2e/common/build/files/Java.java         |  28 ++++
 e2e/common/build/maven_ca_secret_test.go | 276 +++++++++++++++++++++++++++++++
 script/Makefile                          |   1 +
 3 files changed, 305 insertions(+)

diff --git a/e2e/common/build/files/Java.java b/e2e/common/build/files/Java.java
new file mode 100644
index 0000000..66fef5f
--- /dev/null
+++ b/e2e/common/build/files/Java.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class Java extends RouteBuilder {
+  @Override
+  public void configure() throws Exception {
+	  from("timer:tick")
+	  .setHeader("m").constant("string!")
+	  .setBody().simple("Magic${header.m}")
+      .log("${body}");
+  }
+}
diff --git a/e2e/common/build/maven_ca_secret_test.go b/e2e/common/build/maven_ca_secret_test.go
new file mode 100644
index 0000000..a3e06d5
--- /dev/null
+++ b/e2e/common/build/maven_ca_secret_test.go
@@ -0,0 +1,276 @@
+// +build integration
+
+// To enable compilation of this file in Goland, go to "Settings -> Go -> Vendoring & Build Tags -> Custom Tags" and add "integration"
+
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+*/
+
+package build
+
+import (
+	"crypto/rand"
+	"crypto/rsa"
+	"crypto/x509"
+	"crypto/x509/pkix"
+	"encoding/pem"
+	"fmt"
+	"math/big"
+	rand2 "math/rand"
+	"testing"
+	"time"
+
+	. "github.com/onsi/gomega"
+	. "github.com/onsi/gomega/gstruct"
+
+	appsv1 "k8s.io/api/apps/v1"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/util/intstr"
+
+	. "github.com/apache/camel-k/e2e/support"
+)
+
+func TestMavenCASecret(t *testing.T) {
+	WithNewTestNamespace(t, func(ns string) {
+		hostname := fmt.Sprintf("%s.%s.svc", "nexus", ns)
+		tlsMountPath := "/etc/tls/private"
+
+		// Generate the TLS certificate
+		serialNumber := big.NewInt(rand2.Int63())
+		cert := &x509.Certificate{
+			SerialNumber: serialNumber,
+			Subject: pkix.Name{
+				Organization: []string{"Camel K test"},
+			},
+			DNSNames:              []string{hostname},
+			NotBefore:             time.Now(),
+			NotAfter:              time.Now().AddDate(1, 0, 0),
+			ExtKeyUsage:           []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
+			KeyUsage:              x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
+			BasicConstraintsValid: true,
+		}
+
+		// generate certPem private key
+		certPrivateKey, err := rsa.GenerateKey(rand.Reader, 2048)
+		Expect(err).To(BeNil())
+
+		privateKeyBytes := x509.MarshalPKCS1PrivateKey(certPrivateKey)
+		// encode for storing into secret
+		privateKeyPem := pem.EncodeToMemory(
+			&pem.Block{
+				Type:  "RSA PRIVATE KEY",
+				Bytes: privateKeyBytes,
+			},
+		)
+		certBytes, err := x509.CreateCertificate(rand.Reader, cert, cert, &certPrivateKey.PublicKey, certPrivateKey)
+		Expect(err).To(BeNil())
+
+		// encode for storing into secret
+		certPem := pem.EncodeToMemory(&pem.Block{
+			Type:  "CERTIFICATE",
+			Bytes: certBytes,
+		})
+
+		secret := &corev1.Secret{
+			TypeMeta: metav1.TypeMeta{
+				Kind:       "Secret",
+				APIVersion: corev1.SchemeGroupVersion.String(),
+			},
+			ObjectMeta: metav1.ObjectMeta{
+				Namespace: ns,
+				Name:      "tls-secret",
+			},
+			Type: corev1.SecretTypeTLS,
+			Data: map[string][]byte{
+				corev1.TLSCertKey:       certPem,
+				corev1.TLSPrivateKeyKey: privateKeyPem,
+			},
+		}
+		Expect(TestClient().Create(TestContext, secret)).To(Succeed())
+
+		// HTTPD configuration
+		config := &corev1.ConfigMap{
+			TypeMeta: metav1.TypeMeta{
+				Kind:       "ConfigMap",
+				APIVersion: corev1.SchemeGroupVersion.String(),
+			},
+			ObjectMeta: metav1.ObjectMeta{
+				Namespace: ns,
+				Name:      "httd-config",
+			},
+			Data: map[string]string{
+				"httpd.conf": fmt.Sprintf(`
+ServerRoot "/usr/local/apache2"
+
+LoadModule ssl_module modules/mod_ssl.so
+
+ErrorLog /proc/self/fd/2
+
+LogLevel warn
+
+Listen 443
+
+ProxyRequests Off
+ProxyPreserveHost On
+
+<VirtualHost *:443>
+  SSLEngine on
+
+  SSLCertificateFile "%s/%s"
+  SSLCertificateKeyFile "%s/%s"
+
+  AllowEncodedSlashes NoDecode
+
+  ServerName %s
+  ProxyPass / http://localhost:8081/ nocanon
+  ProxyPassReverse / http://localhost:8081/
+  RequestHeader set X-Forwarded-Proto "https"
+</VirtualHost>
+`,
+					tlsMountPath, corev1.TLSCertKey, tlsMountPath, corev1.TLSPrivateKeyKey, hostname,
+				),
+			},
+		}
+		Expect(TestClient().Create(TestContext, config)).To(Succeed())
+
+		// Deploy Nexus
+		// https://help.sonatype.com/repomanager3/installation/run-behind-a-reverse-proxy
+		deployment := &appsv1.Deployment{
+			TypeMeta: metav1.TypeMeta{
+				Kind:       "Deployment",
+				APIVersion: appsv1.SchemeGroupVersion.String(),
+			},
+			ObjectMeta: metav1.ObjectMeta{
+				Namespace: ns,
+				Name:      "nexus",
+			},
+			Spec: appsv1.DeploymentSpec{
+				Selector: &metav1.LabelSelector{
+					MatchLabels: map[string]string{
+						"camel-k": "maven-test-nexus",
+					},
+				},
+				Template: corev1.PodTemplateSpec{
+					ObjectMeta: metav1.ObjectMeta{
+						Labels: map[string]string{
+							"camel-k": "maven-test-nexus",
+						},
+					},
+					Spec: corev1.PodSpec{
+						Containers: []corev1.Container{
+							{
+								Name:  "httpd",
+								Image: "httpd:2.4.46",
+								VolumeMounts: []corev1.VolumeMount{
+									{
+										Name:      "tls",
+										ReadOnly:  true,
+										MountPath: tlsMountPath,
+									},
+									{
+										Name:      "httpd",
+										ReadOnly:  true,
+										MountPath: "/usr/local/apache2/conf",
+										SubPath:   "httpd.conf",
+									},
+								},
+							},
+							{
+								Name:  "nexus",
+								Image: "sonatype/nexus3:3.30.0",
+								Ports: []corev1.ContainerPort{
+									{
+										Name:          "nexus",
+										ContainerPort: 8081,
+									},
+								},
+							},
+						},
+						Volumes: []corev1.Volume{
+							{
+								Name: "tls",
+								VolumeSource: corev1.VolumeSource{
+									Secret: &corev1.SecretVolumeSource{
+										SecretName: secret.Name,
+									},
+								},
+							},
+							{
+								Name: "httpd",
+								VolumeSource: corev1.VolumeSource{
+									ConfigMap: &corev1.ConfigMapVolumeSource{
+										LocalObjectReference: corev1.LocalObjectReference{
+											Name: config.Name,
+										},
+									},
+								},
+							},
+						},
+					},
+				},
+			},
+		}
+		Expect(TestClient().Create(TestContext, deployment)).To(Succeed())
+
+		service := &corev1.Service{
+			TypeMeta: metav1.TypeMeta{
+				Kind:       "Service",
+				APIVersion: corev1.SchemeGroupVersion.String(),
+			},
+			ObjectMeta: metav1.ObjectMeta{
+				Namespace: ns,
+				Name:      deployment.Name,
+			},
+			Spec: corev1.ServiceSpec{
+				Selector: deployment.Spec.Template.Labels,
+				Ports: []corev1.ServicePort{
+					{
+						Name:       "https",
+						Port:       443,
+						TargetPort: intstr.FromString("https"),
+					},
+				},
+			},
+		}
+		Expect(TestClient().Create(TestContext, service)).To(Succeed())
+
+		// Wait for the Deployment to become ready
+		Eventually(Deployment(ns, deployment.Name)).Should(PointTo(MatchFields(IgnoreExtras,
+			Fields{
+				"Status": MatchFields(IgnoreExtras,
+					Fields{
+						"ReadyReplicas": Equal(int32(1)),
+					}),
+			}),
+		))
+
+		// Install Camel K with the Maven CA secret
+		Expect(Kamel("install", "-n", ns,
+			"--maven-repository", fmt.Sprintf(`https://%s/nexus/content/groups/public@id\=nexus@snapshots`, hostname),
+			"--maven-ca-secret", secret.Name+"/"+corev1.TLSCertKey,
+		).Execute()).To(Succeed())
+
+		// Run the Integration
+		name := "java"
+		Expect(Kamel("run", "-n", ns, "files/Java.java",
+			"--name", name,
+		).Execute()).To(Succeed())
+
+		// Clean up
+		Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
+	})
+}
diff --git a/script/Makefile b/script/Makefile
index 0cf0dde..1d315b4 100644
--- a/script/Makefile
+++ b/script/Makefile
@@ -149,6 +149,7 @@ test: build
 test-integration: build
 	STAGING_RUNTIME_REPO="$(STAGING_RUNTIME_REPO)" \
 	go test -timeout 60m -v ./e2e/common -tags=integration && \
+	go test -timeout 60m -v ./e2e/common/build -tags=integration && \
 	go test -timeout 60m -v ./e2e/common/cli -tags=integration && \
 	go test -timeout 60m -v ./e2e/common/languages -tags=integration && \
 	go test -timeout 60m -v ./e2e/common/traits -tags=integration