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/04/12 11:59:03 UTC

[camel-k] 02/05: core(operator): NodeSelector factory

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 4af9bd3e5769e57cd4e86bde43dfea6352db406c
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Fri Mar 26 12:49:32 2021 +0100

    core(operator): NodeSelector factory
    
    Adding a factory to simplify creation of NodeSelectors and related unit tests
---
 pkg/util/kubernetes/core_factory_test.go | 39 ++++++++++++++++++++++++++++++++
 pkg/util/kubernetes/factory.go           | 15 ++++++++++++
 2 files changed, 54 insertions(+)

diff --git a/pkg/util/kubernetes/core_factory_test.go b/pkg/util/kubernetes/core_factory_test.go
index 9903246..2a751e2 100644
--- a/pkg/util/kubernetes/core_factory_test.go
+++ b/pkg/util/kubernetes/core_factory_test.go
@@ -95,3 +95,42 @@ func TestValueTolerations(t *testing.T) {
 	assert.Equal(t, v1.TaintEffectNoSchedule, toleration[3].Effect)
 	assert.Equal(t, int64(120), *toleration[3].TolerationSeconds)
 }
+
+func TestValidNodeSelectors(t *testing.T) {
+	validNodeSelectors := [][]string{
+		{"key1=value"},
+		{"kubernetes.io/hostname=worker0"},
+		{"disktype=ssd"},
+		{"key=path-to-value"},
+		{"keyNum=123"},
+	}
+	for _, vds := range validNodeSelectors {
+		_, err := GetNodeSelectors(vds)
+		assert.Nil(t, err)
+	}
+}
+
+func TestInvalidNodeSelectors(t *testing.T) {
+	validNodeSelectors := [][]string{
+		{"key1"},
+		{"kubernetes.io@hostname=worker0"},
+		{"key=path/to/value"},
+	}
+	for _, vds := range validNodeSelectors {
+		_, err := GetNodeSelectors(vds)
+		assert.NotNil(t, err)
+	}
+}
+
+func TestValueNodeSelectors(t *testing.T) {
+	nodeSelectorsArray := []string{
+		"key=value",
+		"kubernetes.io/hostname=worker0",
+	}
+	nodeSelectors, err := GetNodeSelectors(nodeSelectorsArray)
+	assert.Nil(t, err)
+	assert.Equal(t, 2, len(nodeSelectors))
+
+	assert.Equal(t, "value", nodeSelectors["key"])
+	assert.Equal(t, "worker0", nodeSelectors["kubernetes.io/hostname"])
+}
diff --git a/pkg/util/kubernetes/factory.go b/pkg/util/kubernetes/factory.go
index a85c472..af9266d 100644
--- a/pkg/util/kubernetes/factory.go
+++ b/pkg/util/kubernetes/factory.go
@@ -26,6 +26,7 @@ import (
 )
 
 var validTaintRegexp = regexp.MustCompile(`^([\w\/_\-\.]+)(=)?([\w_\-\.]+)?:(NoSchedule|NoExecute|PreferNoSchedule):?(\d*)?$`)
+var validNodeSelectorRegexp = regexp.MustCompile(`^([\w\/_\-\.]+)=([\w_\-\.]+)$`)
 
 // GetTolerations build an array of Tolerations from an array of string
 func NewTolerations(taints []string) ([]corev1.Toleration, error) {
@@ -60,3 +61,17 @@ func NewTolerations(taints []string) ([]corev1.Toleration, error) {
 
 	return tolerations, nil
 }
+
+// GetNodeSelectors build a map of NodeSelectors from an array of string
+func GetNodeSelectors(nsArray []string) (map[string]string, error) {
+	nodeSelectors := make(map[string]string)
+	for _, ns := range nsArray {
+		if !validNodeSelectorRegexp.MatchString(ns) {
+			return nil, fmt.Errorf("could not match node selector %v", ns)
+		}
+		// Parse the regexp groups
+		groups := validNodeSelectorRegexp.FindStringSubmatch(ns)
+		nodeSelectors[groups[1]] = groups[2]
+	}
+	return nodeSelectors, nil
+}