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 2022/01/19 08:40:49 UTC
[camel-k] 23/32: fix(e2e): Add container registry to NO_PROXY
This is an automated email from the ASF dual-hosted git repository.
astefanutti pushed a commit to branch release-1.7.x
in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit 96880223d872ae6d48627256f00a6f995d51a650
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Tue Jan 11 09:27:13 2022 +0100
fix(e2e): Add container registry to NO_PROXY
---
e2e/common/traits/environment_test.go | 26 ++++++--
e2e/support/regexp.go | 119 ++++++++++++++++++++++++++++++++++
2 files changed, 138 insertions(+), 7 deletions(-)
diff --git a/e2e/common/traits/environment_test.go b/e2e/common/traits/environment_test.go
index 9ec4de9..065251c 100644
--- a/e2e/common/traits/environment_test.go
+++ b/e2e/common/traits/environment_test.go
@@ -24,6 +24,7 @@ package traits
import (
"fmt"
+ "os"
"strings"
"testing"
@@ -38,21 +39,32 @@ import (
func TestEnvironmentTrait(t *testing.T) {
WithNewTestNamespace(t, func(ns string) {
- // Retrieve the Kubernetes Service ClusterIPs to populate the NO_PROXY environment variable
- svc := Service("default", "kubernetes")()
- Expect(svc).NotTo(BeNil())
-
+ // HTTP proxy configuration
+ httpProxy := "http://proxy"
noProxy := []string{
".cluster.local",
".svc",
"localhost",
".apache.org",
}
+
+ // Retrieve the Kubernetes Service ClusterIPs to populate the NO_PROXY environment variable
+ svc := Service("default", "kubernetes")()
+ Expect(svc).NotTo(BeNil())
+
noProxy = append(noProxy, svc.Spec.ClusterIPs...)
+ // Retrieve the internal container registry to populate the NO_PROXY environment variable
+ if registry, ok := os.LookupEnv("KAMEL_INSTALL_REGISTRY"); ok {
+ domain := RegistryRegexp.FindString(registry)
+ Expect(domain).NotTo(BeNil())
+ domain = strings.Split(domain, ":")[0]
+ noProxy = append(noProxy, domain)
+ }
+
// Install Camel K with the HTTP proxy environment variable
Expect(Kamel("install", "-n", ns,
- "--operator-env-vars", fmt.Sprintf("HTTP_PROXY=http://proxy"),
+ "--operator-env-vars", fmt.Sprintf("HTTP_PROXY=%s", httpProxy),
"--operator-env-vars", "NO_PROXY="+strings.Join(noProxy, ","),
).Execute()).To(Succeed())
@@ -65,7 +77,7 @@ func TestEnvironmentTrait(t *testing.T) {
Expect(IntegrationPod(ns, "java")()).To(WithTransform(podEnvVars, And(
ContainElement(corev1.EnvVar{Name: "CAMEL_K_VERSION", Value: defaults.Version}),
ContainElement(corev1.EnvVar{Name: "NAMESPACE", Value: ns}),
- ContainElement(corev1.EnvVar{Name: "HTTP_PROXY", Value: "http://proxy"}),
+ ContainElement(corev1.EnvVar{Name: "HTTP_PROXY", Value: httpProxy}),
ContainElement(corev1.EnvVar{Name: "NO_PROXY", Value: strings.Join(noProxy, ",")}),
)))
})
@@ -97,7 +109,7 @@ func TestEnvironmentTrait(t *testing.T) {
Expect(IntegrationPod(ns, "java")()).To(WithTransform(podEnvVars, And(
ContainElement(corev1.EnvVar{Name: "CAMEL_K_VERSION", Value: defaults.Version}),
ContainElement(corev1.EnvVar{Name: "NAMESPACE", Value: ns}),
- Not(ContainElement(corev1.EnvVar{Name: "HTTP_PROXY", Value: "http://proxy"})),
+ Not(ContainElement(corev1.EnvVar{Name: "HTTP_PROXY", Value: httpProxy})),
Not(ContainElement(corev1.EnvVar{Name: "NO_PROXY", Value: strings.Join(noProxy, ",")})),
)))
})
diff --git a/e2e/support/regexp.go b/e2e/support/regexp.go
new file mode 100644
index 0000000..ba44168
--- /dev/null
+++ b/e2e/support/regexp.go
@@ -0,0 +1,119 @@
+//go:build integration
+// +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 support
+
+import "regexp"
+
+var (
+ // alphaNumericRegexp defines the alpha numeric atom, typically a
+ // component of names. This only allows lower case characters and digits.
+ alphaNumericRegexp = match(`[a-z0-9]+`)
+
+ // separatorRegexp defines the separators allowed to be embedded in name
+ // components. This allow one period, one or two underscore and multiple
+ // dashes.
+ separatorRegexp = match(`(?:[._]|__|[-]*)`)
+
+ // nameComponentRegexp restricts registry path component names to start
+ // with at least one letter or number, with following parts able to be
+ // separated by one period, one or two underscore and multiple dashes.
+ nameComponentRegexp = expression(
+ alphaNumericRegexp,
+ optional(repeated(separatorRegexp, alphaNumericRegexp)))
+
+ // domainComponentRegexp restricts the registry domain component of a
+ // repository name to start with a component as defined by DomainRegexp
+ // and followed by an optional port.
+ domainComponentRegexp = match(`(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])`)
+
+ // DomainRegexp defines the structure of potential domain components
+ // that may be part of image names. This is purposely a subset of what is
+ // allowed by DNS to ensure backwards compatibility with Docker image
+ // names.
+ DomainRegexp = expression(
+ domainComponentRegexp,
+ optional(repeated(literal(`.`), domainComponentRegexp)),
+ optional(literal(`:`), match(`[0-9]+`)))
+
+ RegistryRegexp = anchored(
+ capture(DomainRegexp),
+ optional(
+ literal(`/`),
+ nameComponentRegexp,
+ optional(repeated(literal(`/`), nameComponentRegexp)),
+ ),
+ )
+)
+
+// match compiles the string to a regular expression.
+var match = regexp.MustCompile
+
+// literal compiles s into a literal regular expression, escaping any regexp
+// reserved characters.
+func literal(s string) *regexp.Regexp {
+ re := match(regexp.QuoteMeta(s))
+
+ if _, complete := re.LiteralPrefix(); !complete {
+ panic("must be a literal")
+ }
+
+ return re
+}
+
+// expression defines a full expression, where each regular expression must
+// follow the previous.
+func expression(res ...*regexp.Regexp) *regexp.Regexp {
+ var s string
+ for _, re := range res {
+ s += re.String()
+ }
+
+ return match(s)
+}
+
+// optional wraps the expression in a non-capturing group and makes the
+// production optional.
+func optional(res ...*regexp.Regexp) *regexp.Regexp {
+ return match(group(expression(res...)).String() + `?`)
+}
+
+// repeated wraps the regexp in a non-capturing group to get one or more
+// matches.
+func repeated(res ...*regexp.Regexp) *regexp.Regexp {
+ return match(group(expression(res...)).String() + `+`)
+}
+
+// group wraps the regexp in a non-capturing group.
+func group(res ...*regexp.Regexp) *regexp.Regexp {
+ return match(`(?:` + expression(res...).String() + `)`)
+}
+
+// capture wraps the expression in a capturing group.
+func capture(res ...*regexp.Regexp) *regexp.Regexp {
+ return match(`(` + expression(res...).String() + `)`)
+}
+
+// anchored anchors the regular expression by adding start and end delimiters.
+func anchored(res ...*regexp.Regexp) *regexp.Regexp {
+ return match(`^` + expression(res...).String() + `$`)
+}