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 2019/03/14 07:32:39 UTC
[camel-k] branch master updated: resources: add options to
configure mount path and key
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 3466736 resources: add options to configure mount path and key
3466736 is described below
commit 3466736df7bd2241140ee253aaffcc0358ad93ff
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Wed Mar 13 18:52:48 2019 +0100
resources: add options to configure mount path and key
---
pkg/apis/camel/v1alpha1/integration_types.go | 4 +-
pkg/controller/integration/build_image.go | 8 +-
pkg/trait/trait_test.go | 119 +++++++++++++++++++++++++++
pkg/trait/trait_types.go | 37 +++++++--
4 files changed, 158 insertions(+), 10 deletions(-)
diff --git a/pkg/apis/camel/v1alpha1/integration_types.go b/pkg/apis/camel/v1alpha1/integration_types.go
index e695af8..69c29e0 100644
--- a/pkg/apis/camel/v1alpha1/integration_types.go
+++ b/pkg/apis/camel/v1alpha1/integration_types.go
@@ -59,6 +59,7 @@ type DataSpec struct {
Name string `json:"name,omitempty"`
Content string `json:"content,omitempty"`
ContentRef string `json:"contentRef,omitempty"`
+ ContentKey string `json:"contentKey,omitempty"`
Compression bool `json:"compression,omitempty"`
}
@@ -68,7 +69,8 @@ type ResourceType string
// ResourceSpec --
type ResourceSpec struct {
DataSpec
- Type ResourceType `json:"type,omitempty"`
+ Type ResourceType `json:"type,omitempty"`
+ MountPath string `json:"mountPath,omitempty"`
}
const (
diff --git a/pkg/controller/integration/build_image.go b/pkg/controller/integration/build_image.go
index 3b9b565..beaddf3 100644
--- a/pkg/controller/integration/build_image.go
+++ b/pkg/controller/integration/build_image.go
@@ -235,9 +235,15 @@ func (action *buildImageAction) inlineResources(ctx context.Context, integration
}
for _, data := range resources {
+ t := path.Join("resources", data.Name)
+
+ if data.MountPath != "" {
+ t = path.Join(data.MountPath, data.Name)
+ }
+
r.Resources = append(r.Resources, builder.Resource{
Content: []byte(data.Content),
- Target: path.Join("resources", data.Name),
+ Target: t,
})
}
diff --git a/pkg/trait/trait_test.go b/pkg/trait/trait_test.go
index 31a80d9..ed02a94 100644
--- a/pkg/trait/trait_test.go
+++ b/pkg/trait/trait_test.go
@@ -165,6 +165,125 @@ func TestTraitDecode(t *testing.T) {
assert.Equal(t, false, *svc.Enabled)
}
+func TestConfigureVolumesAndMounts(t *testing.T) {
+ env := Environment{
+ Integration: &v1alpha1.Integration{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: TestDeployment,
+ Namespace: "ns",
+ },
+ Spec: v1alpha1.IntegrationSpec{
+ Resources: []v1alpha1.ResourceSpec{
+ {
+ DataSpec: v1alpha1.DataSpec{
+ Name: "res1.txt",
+ ContentRef: "my-cm1",
+ ContentKey: "my-key1",
+ },
+ Type: "data",
+ MountPath: "/etc/m1",
+ },
+ {
+ DataSpec: v1alpha1.DataSpec{
+ Name: "res2.txt",
+ ContentRef: "my-cm2",
+ },
+ Type: "data",
+ },
+ {
+ DataSpec: v1alpha1.DataSpec{
+ Name: "res3.txt",
+ ContentKey: "my-key3",
+ },
+ Type: "data",
+ },
+ {
+ DataSpec: v1alpha1.DataSpec{
+ Name: "res4.txt",
+ },
+ Type: "data",
+ },
+ },
+ },
+ },
+ }
+
+ vols := make([]corev1.Volume, 0)
+ mnts := make([]corev1.VolumeMount, 0)
+
+ env.ConfigureVolumesAndMounts(false, &vols, &mnts)
+
+ assert.Len(t, vols, 5)
+ assert.Len(t, mnts, 5)
+
+ v := findVolume(vols, func(v corev1.Volume) bool { return v.ConfigMap.Name == "my-cm1" })
+ assert.NotNil(t, v)
+ assert.NotNil(t, v.VolumeSource.ConfigMap)
+ assert.Len(t, v.VolumeSource.ConfigMap.Items, 1)
+ assert.Equal(t, "my-key1", v.VolumeSource.ConfigMap.Items[0].Key)
+ assert.Equal(t, "res1.txt", v.VolumeSource.ConfigMap.Items[0].Path)
+
+ m := findVVolumeMount(mnts, func(m corev1.VolumeMount) bool { return m.Name == "i-resource-000" })
+ assert.NotNil(t, m)
+ assert.Equal(t, "/etc/m1", m.MountPath)
+
+ v = findVolume(vols, func(v corev1.Volume) bool { return v.ConfigMap.Name == "my-cm2" })
+ assert.NotNil(t, v)
+ assert.NotNil(t, v.VolumeSource.ConfigMap)
+ assert.Len(t, v.VolumeSource.ConfigMap.Items, 1)
+ assert.Equal(t, "content", v.VolumeSource.ConfigMap.Items[0].Key)
+ assert.Equal(t, "res2.txt", v.VolumeSource.ConfigMap.Items[0].Path)
+
+ m = findVVolumeMount(mnts, func(m corev1.VolumeMount) bool { return m.Name == "i-resource-001" })
+ assert.NotNil(t, m)
+ assert.Equal(t, "/etc/camel/resources/i-resource-001", m.MountPath)
+
+ v = findVolume(vols, func(v corev1.Volume) bool { return v.ConfigMap.Name == TestDeployment+"-resource-002" })
+ assert.NotNil(t, v)
+ assert.NotNil(t, v.VolumeSource.ConfigMap)
+ assert.Len(t, v.VolumeSource.ConfigMap.Items, 1)
+ assert.Equal(t, "my-key3", v.VolumeSource.ConfigMap.Items[0].Key)
+ assert.Equal(t, "res3.txt", v.VolumeSource.ConfigMap.Items[0].Path)
+
+ m = findVVolumeMount(mnts, func(m corev1.VolumeMount) bool { return m.Name == "i-resource-002" })
+ assert.NotNil(t, m)
+ assert.Equal(t, "/etc/camel/resources/i-resource-002", m.MountPath)
+
+ v = findVolume(vols, func(v corev1.Volume) bool { return v.ConfigMap.Name == TestDeployment+"-resource-003" })
+ assert.NotNil(t, v)
+ assert.NotNil(t, v.VolumeSource.ConfigMap)
+ assert.Len(t, v.VolumeSource.ConfigMap.Items, 1)
+ assert.Equal(t, "content", v.VolumeSource.ConfigMap.Items[0].Key)
+ assert.Equal(t, "res4.txt", v.VolumeSource.ConfigMap.Items[0].Path)
+
+ m = findVVolumeMount(mnts, func(m corev1.VolumeMount) bool { return m.Name == "i-resource-003" })
+ assert.NotNil(t, m)
+ assert.Equal(t, "/etc/camel/resources/i-resource-003", m.MountPath)
+
+}
+
+func findVolume(vols []corev1.Volume, condition func(corev1.Volume) bool) *corev1.Volume {
+ for _, v := range vols {
+ v := v
+ if condition(v) {
+ return &v
+ }
+ }
+
+ return nil
+}
+
+func findVVolumeMount(vols []corev1.VolumeMount, condition func(corev1.VolumeMount) bool) *corev1.VolumeMount {
+ for _, v := range vols {
+ v := v
+ if condition(v) {
+ return &v
+ }
+ }
+
+ return nil
+}
+
func processTestEnv(t *testing.T, env *Environment) *kubernetes.Collection {
catalog := NewTraitTestCatalog()
err := catalog.apply(env)
diff --git a/pkg/trait/trait_types.go b/pkg/trait/trait_types.go
index 106f38a..de16160 100644
--- a/pkg/trait/trait_types.go
+++ b/pkg/trait/trait_types.go
@@ -319,11 +319,19 @@ func (e *Environment) ComputeConfigMaps(container bool) []runtime.Object {
maps = append(maps, &cm)
}
- for i, s := range e.Integration.Spec.Resources {
- if s.Type != v1alpha1.ResourceTypeData {
+ for i, r := range e.Integration.Spec.Resources {
+ if r.Type != v1alpha1.ResourceTypeData {
+ continue
+ }
+ if r.ContentRef != "" {
continue
}
+ cmKey := "content"
+ if r.ContentKey != "" {
+ cmKey = r.ContentKey
+ }
+
cm := corev1.ConfigMap{
TypeMeta: metav1.TypeMeta{
Kind: "ConfigMap",
@@ -336,12 +344,12 @@ func (e *Environment) ComputeConfigMaps(container bool) []runtime.Object {
"camel.apache.org/integration": e.Integration.Name,
},
Annotations: map[string]string{
- "camel.apache.org/resource.name": s.Name,
- "camel.apache.org/resource.compression": strconv.FormatBool(s.Compression),
+ "camel.apache.org/resource.name": r.Name,
+ "camel.apache.org/resource.compression": strconv.FormatBool(r.Compression),
},
},
Data: map[string]string{
- "content": s.Content,
+ cmKey: r.Content,
},
}
@@ -402,6 +410,7 @@ func (e *Environment) ConfigureVolumesAndMounts(container bool, vols *[]corev1.V
cmName := fmt.Sprintf("%s-source-%03d", e.Integration.Name, i)
refName := fmt.Sprintf("i-source-%03d", i)
resName := strings.TrimPrefix(s.Name, "/")
+ resPath := path.Join("/etc/camel/sources", refName)
if s.ContentRef != "" {
cmName = s.ContentRef
@@ -426,7 +435,7 @@ func (e *Environment) ConfigureVolumesAndMounts(container bool, vols *[]corev1.V
*mnts = append(*mnts, corev1.VolumeMount{
Name: refName,
- MountPath: path.Join("/etc/camel/sources", refName),
+ MountPath: resPath,
})
}
@@ -438,6 +447,18 @@ func (e *Environment) ConfigureVolumesAndMounts(container bool, vols *[]corev1.V
cmName := fmt.Sprintf("%s-resource-%03d", e.Integration.Name, i)
refName := fmt.Sprintf("i-resource-%03d", i)
resName := strings.TrimPrefix(r.Name, "/")
+ cmKey := "content"
+ resPath := path.Join("/etc/camel/resources", refName)
+
+ if r.ContentRef != "" {
+ cmName = r.ContentRef
+ }
+ if r.ContentKey != "" {
+ cmKey = r.ContentKey
+ }
+ if r.MountPath != "" {
+ resPath = r.MountPath
+ }
*vols = append(*vols, corev1.Volume{
Name: refName,
@@ -448,7 +469,7 @@ func (e *Environment) ConfigureVolumesAndMounts(container bool, vols *[]corev1.V
},
Items: []corev1.KeyToPath{
{
- Key: "content",
+ Key: cmKey,
Path: resName,
},
},
@@ -458,7 +479,7 @@ func (e *Environment) ConfigureVolumesAndMounts(container bool, vols *[]corev1.V
*mnts = append(*mnts, corev1.VolumeMount{
Name: refName,
- MountPath: path.Join("/etc/camel/resources", refName),
+ MountPath: resPath,
})
}
}