From cd5c0f5c674fcd9658ffacf7ee54bd2934fe0b62 Mon Sep 17 00:00:00 2001 From: Pasquale Congiusti Date: Tue, 1 Jun 2021 10:41:48 +0200 Subject: [PATCH] feat(cmd/run): resource option refactoring * Provide support for configmap, secret or local file * Refactoring the structure of mount points to distinguish clearly between config and resource options Ref #2003 --- pkg/apis/camel/v1/common_types.go | 11 +-- .../camel/v1/integration_types_support.go | 9 +++ pkg/cmd/run.go | 46 ++---------- pkg/cmd/run_help.go | 55 +++++++++++--- pkg/cmd/run_test.go | 8 +-- pkg/trait/environment.go | 4 +- pkg/trait/jvm.go | 1 - pkg/trait/jvm_test.go | 8 +-- pkg/trait/trait_test.go | 24 ++++--- pkg/trait/trait_types.go | 72 ++++++++++++++----- pkg/trait/util.go | 28 ++++++++ 11 files changed, 175 insertions(+), 91 deletions(-) diff --git a/pkg/apis/camel/v1/common_types.go b/pkg/apis/camel/v1/common_types.go index f3668efeba..83dd2d8bf1 100644 --- a/pkg/apis/camel/v1/common_types.go +++ b/pkg/apis/camel/v1/common_types.go @@ -24,8 +24,9 @@ import ( // ConfigurationSpec -- type ConfigurationSpec struct { - Type string `json:"type"` - Value string `json:"value"` + Type string `json:"type"` + Value string `json:"value"` + ResourceType string `json:"resourceType,omitempty"` } // Artifact -- @@ -186,9 +187,11 @@ type ResourceSpec struct { } const ( - // ResourceTypeData -- + // ResourceTypeData represents a generic data resource ResourceTypeData ResourceType = "data" - // ResourceTypeOpenAPI -- + // ResourceTypeConfig represents a config resource known to runtime + ResourceTypeConfig ResourceType = "config" + // ResourceTypeOpenAPI represents an OpenAPI config resource ResourceTypeOpenAPI ResourceType = "openapi" ) diff --git a/pkg/apis/camel/v1/integration_types_support.go b/pkg/apis/camel/v1/integration_types_support.go index f7e505e43f..038787ca69 100644 --- a/pkg/apis/camel/v1/integration_types_support.go +++ b/pkg/apis/camel/v1/integration_types_support.go @@ -110,6 +110,15 @@ func (in *IntegrationSpec) AddConfiguration(confType string, confValue string) { }) } +// AddConfigurationAsResourceType will set a configuration specified with a resource type +func (in *IntegrationSpec) AddConfigurationAsResourceType(confType string, confValue string, resourceType string) { + in.Configuration = append(in.Configuration, ConfigurationSpec{ + Type: confType, + Value: confValue, + ResourceType: resourceType, + }) +} + // AddDependency -- func (in *IntegrationSpec) AddDependency(dependency string) { if in.Dependencies == nil { diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go index a474425887..2d4e7105bf 100644 --- a/pkg/cmd/run.go +++ b/pkg/cmd/run.go @@ -80,6 +80,7 @@ func newCmdRun(rootCmdOptions *RootCmdOptions) (*cobra.Command, *runCmdOptions) cmd.Flags().StringArrayP("property", "p", nil, "Add a runtime property or properties file (syntax: [my-key=my-value|file:/path/to/my-conf.properties])") cmd.Flags().StringArray("build-property", nil, "Add a build time property or properties file (syntax: [my-key=my-value|file:/path/to/my-conf.properties])") cmd.Flags().StringArray("config", nil, "Add runtime configuration from a Configmap, a Secret or a file (syntax: [configmap|secret|file]:name)") + cmd.Flags().StringArray("resource", nil, "Add runtime resource from a Configmap, a Secret or a file (syntax: [configmap|secret|file]:name)") cmd.Flags().StringArray("configmap", nil, "[Deprecated] Add a ConfigMap") cmd.Flags().StringArray("secret", nil, "[Deprecated] Add a Secret") cmd.Flags().StringArray("maven-repository", nil, "Add a maven repository") @@ -92,7 +93,6 @@ func newCmdRun(rootCmdOptions *RootCmdOptions) (*cobra.Command, *runCmdOptions) cmd.Flags().StringArray("logging-level", nil, "Configure the logging level. e.g. \"--logging-level org.apache.camel=DEBUG\"") cmd.Flags().StringP("output", "o", "", "Output format. One of: json|yaml") cmd.Flags().Bool("compression", false, "Enable storage of sources and resources as a compressed binary blobs") - cmd.Flags().StringArray("resource", nil, "Add a resource") cmd.Flags().StringArray("open-api", nil, "Add an OpenAPI v2 spec") cmd.Flags().StringArrayP("volume", "v", nil, "Mount a volume into the integration container. E.g \"-v pvcname:/container/path\"") cmd.Flags().StringArrayP("env", "e", nil, "Set an environment variable in the integration container. E.g \"-e MY_VAR=my-value\"") @@ -537,16 +537,13 @@ func (o *runCmdOptions) updateIntegrationCode(c client.Client, sources []string, } for _, resource := range o.Resources { - rawData, contentType, err := loadRawContent(resource) - if err != nil { - return nil, err - } - - resourceSpec, err := binaryOrTextResource(path.Base(resource), rawData, contentType, o.Compression) - if err != nil { - return nil, err + if config, parseErr := ParseConfigOption(resource); parseErr == nil { + if applyResourceOptionErr := ApplyResourceOption(config, &integration.Spec, c, namespace, o.Compression); applyResourceOptionErr != nil { + return nil, applyResourceOptionErr + } + } else { + return nil, parseErr } - integration.Spec.AddResources(resourceSpec) } for _, resource := range o.OpenAPIs { @@ -710,35 +707,6 @@ func keyValueProps(value string) (*properties.Properties, error) { return properties.Load([]byte(value), properties.UTF8) } -func binaryOrTextResource(fileName string, data []byte, contentType string, base64Compression bool) (v1.ResourceSpec, error) { - resourceSpec := v1.ResourceSpec{ - DataSpec: v1.DataSpec{ - Name: fileName, - ContentKey: fileName, - ContentType: contentType, - Compression: false, - }, - Type: v1.ResourceTypeData, - } - - if !base64Compression && isBinary(contentType) { - resourceSpec.RawContent = data - return resourceSpec, nil - } - // either is a text resource or base64 compression is enabled - if base64Compression { - content, err := compressToString(data) - if err != nil { - return resourceSpec, err - } - resourceSpec.Content = content - resourceSpec.Compression = true - } else { - resourceSpec.Content = string(data) - } - return resourceSpec, nil -} - func (o *runCmdOptions) GetIntegrationName(sources []string) string { name := "" if o.IntegrationName != "" { diff --git a/pkg/cmd/run_help.go b/pkg/cmd/run_help.go index 2f78b79724..927d7b86bd 100644 --- a/pkg/cmd/run_help.go +++ b/pkg/cmd/run_help.go @@ -76,43 +76,82 @@ func ParseConfigOption(item string) (*RunConfigOption, error) { return newRunConfigOption(cot, groups[2]), nil } -// ApplyConfigOption will set the proper option behavior to the IntegrationSpec -func ApplyConfigOption(config *RunConfigOption, integrationSpec *v1.IntegrationSpec, c client.Client, namespace string, enableCompression bool) error { +func applyOption(config *RunConfigOption, integrationSpec *v1.IntegrationSpec, + c client.Client, namespace string, enableCompression bool, resourceType v1.ResourceType) error { switch config.ConfigType { case ConfigOptionTypeConfigmap: cm := kubernetes.LookupConfigmap(context.Background(), c, namespace, config.Value) if cm == nil { fmt.Printf("Warn: %s Configmap not found in %s namespace, make sure to provide it before the Integration can run\n", config.Value, namespace) - } else if cm.BinaryData != nil { + } else if resourceType != v1.ResourceTypeData && cm.BinaryData != nil { return fmt.Errorf("you cannot provide a binary config, use a text file instead") } - integrationSpec.AddConfiguration(string(config.ConfigType), config.Value) + integrationSpec.AddConfigurationAsResourceType(string(config.ConfigType), config.Value, string(resourceType)) case ConfigOptionTypeSecret: secret := kubernetes.LookupSecret(context.Background(), c, namespace, config.Value) if secret == nil { fmt.Printf("Warn: %s Secret not found in %s namespace, make sure to provide it before the Integration can run\n", config.Value, namespace) } - integrationSpec.AddConfiguration(string(config.ConfigType), config.Value) + integrationSpec.AddConfigurationAsResourceType(string(config.ConfigType), config.Value, string(resourceType)) case ConfigOptionTypeFile: // Don't allow a binary non compressed resource rawData, contentType, err := loadRawContent(config.Value) if err != nil { return err } - if !enableCompression && isBinary(contentType) { + if resourceType != v1.ResourceTypeData && !enableCompression && isBinary(contentType) { return fmt.Errorf("you cannot provide a binary config, use a text file or check --resource flag instead") } - resourceSpec, err := binaryOrTextResource(path.Base(config.Value), rawData, contentType, enableCompression) + resourceSpec, err := binaryOrTextResource(path.Base(config.Value), rawData, contentType, enableCompression, resourceType) if err != nil { return err } integrationSpec.AddResources(resourceSpec) default: // Should never reach this - return fmt.Errorf("invalid config option type %s", config.ConfigType) + return fmt.Errorf("invalid option type %s", config.ConfigType) } return nil } + +// ApplyConfigOption will set the proper --config option behavior to the IntegrationSpec +func ApplyConfigOption(config *RunConfigOption, integrationSpec *v1.IntegrationSpec, c client.Client, namespace string, enableCompression bool) error { + return applyOption(config, integrationSpec, c, namespace, enableCompression, v1.ResourceTypeConfig) +} + +// ApplyResourceOption will set the proper --resource option behavior to the IntegrationSpec +func ApplyResourceOption(config *RunConfigOption, integrationSpec *v1.IntegrationSpec, c client.Client, namespace string, enableCompression bool) error { + return applyOption(config, integrationSpec, c, namespace, enableCompression, v1.ResourceTypeData) +} + +func binaryOrTextResource(fileName string, data []byte, contentType string, base64Compression bool, resourceType v1.ResourceType) (v1.ResourceSpec, error) { + resourceSpec := v1.ResourceSpec{ + DataSpec: v1.DataSpec{ + Name: fileName, + ContentKey: fileName, + ContentType: contentType, + Compression: false, + }, + Type: resourceType, + } + + if !base64Compression && isBinary(contentType) { + resourceSpec.RawContent = data + return resourceSpec, nil + } + // either is a text resource or base64 compression is enabled + if base64Compression { + content, err := compressToString(data) + if err != nil { + return resourceSpec, err + } + resourceSpec.Content = content + resourceSpec.Compression = true + } else { + resourceSpec.Content = string(data) + } + return resourceSpec, nil +} diff --git a/pkg/cmd/run_test.go b/pkg/cmd/run_test.go index b3895a3bc0..2054e93ac6 100644 --- a/pkg/cmd/run_test.go +++ b/pkg/cmd/run_test.go @@ -485,7 +485,7 @@ func TestRunWithSavedValues(t *testing.T) { }*/ func TestRunBinaryResource(t *testing.T) { - binaryResourceSpec, err := binaryOrTextResource("file.ext", []byte{1, 2, 3, 4}, "application/octet-stream", false) + binaryResourceSpec, err := binaryOrTextResource("file.ext", []byte{1, 2, 3, 4}, "application/octet-stream", false, v1.ResourceTypeData) assert.Nil(t, err) assert.Equal(t, "", binaryResourceSpec.Content) assert.NotNil(t, binaryResourceSpec.RawContent) @@ -497,7 +497,7 @@ func TestRunBinaryResource(t *testing.T) { func TestRunBinaryCompressedResource(t *testing.T) { data := []byte{1, 2, 3, 4} base64Compressed, _ := compressToString(data) - binaryResourceSpec, err := binaryOrTextResource("file.ext", data, "application/octet-stream", true) + binaryResourceSpec, err := binaryOrTextResource("file.ext", data, "application/octet-stream", true, v1.ResourceTypeData) assert.Nil(t, err) assert.Equal(t, base64Compressed, binaryResourceSpec.Content) assert.Nil(t, binaryResourceSpec.RawContent) @@ -507,7 +507,7 @@ func TestRunBinaryCompressedResource(t *testing.T) { } func TestRunTextResource(t *testing.T) { - textResourceSpec, err := binaryOrTextResource("file.ext", []byte("hello world"), "text/plain", false) + textResourceSpec, err := binaryOrTextResource("file.ext", []byte("hello world"), "text/plain", false, v1.ResourceTypeData) assert.Nil(t, err) assert.Equal(t, "hello world", textResourceSpec.Content) assert.Nil(t, textResourceSpec.RawContent) @@ -519,7 +519,7 @@ func TestRunTextResource(t *testing.T) { func TestRunTextCompressedResource(t *testing.T) { data := []byte("hello horld") base64Compressed, _ := compressToString(data) - textResourceSpec, err := binaryOrTextResource("file.ext", []byte("hello horld"), "text/plain", true) + textResourceSpec, err := binaryOrTextResource("file.ext", []byte("hello horld"), "text/plain", true, v1.ResourceTypeData) assert.Nil(t, err) assert.Equal(t, base64Compressed, textResourceSpec.Content) assert.Nil(t, textResourceSpec.RawContent) diff --git a/pkg/trait/environment.go b/pkg/trait/environment.go index 30b396ec05..bfc8cae57c 100644 --- a/pkg/trait/environment.go +++ b/pkg/trait/environment.go @@ -72,8 +72,8 @@ func (t *environmentTrait) Apply(e *Environment) error { envvar.SetVal(&e.EnvVars, envVarCamelKIntegration, e.Integration.Name) } envvar.SetVal(&e.EnvVars, envVarCamelKRuntimeVersion, e.RuntimeVersion) - envvar.SetVal(&e.EnvVars, envVarMountPathConfigMaps, configMapsMountPath) - envvar.SetVal(&e.EnvVars, envVarMountPathSecrets, secretsMountPath) + envvar.SetVal(&e.EnvVars, envVarMountPathConfigMaps, configConfigmapsMountPath) + envvar.SetVal(&e.EnvVars, envVarMountPathSecrets, configSecretsMountPath) if util.IsNilOrTrue(t.ContainerMeta) { envvar.SetValFrom(&e.EnvVars, envVarNamespace, "metadata.namespace") diff --git a/pkg/trait/jvm.go b/pkg/trait/jvm.go index 2d722e2072..725f84c8c6 100644 --- a/pkg/trait/jvm.go +++ b/pkg/trait/jvm.go @@ -95,7 +95,6 @@ func (t *jvmTrait) Apply(e *Environment) error { classpath := strset.New() - classpath.Add(resourcesMountPath) classpath.Add("./resources") for _, artifact := range kit.Status.Artifacts { diff --git a/pkg/trait/jvm_test.go b/pkg/trait/jvm_test.go index 2572dc1aee..cfa925cbf9 100644 --- a/pkg/trait/jvm_test.go +++ b/pkg/trait/jvm_test.go @@ -103,12 +103,12 @@ func TestApplyJvmTraitWithDeploymentResource(t *testing.T) { assert.Nil(t, err) - cp := strset.New("/etc/camel/resources", "./resources", "/mount/path").List() + cp := strset.New("./resources", "/mount/path").List() sort.Strings(cp) assert.Equal(t, []string{ "-cp", - "./resources:/etc/camel/resources:/mount/path", + "./resources:/mount/path", "io.quarkus.bootstrap.runner.QuarkusEntryPoint", }, d.Spec.Template.Spec.Containers[0].Args) } @@ -135,12 +135,12 @@ func TestApplyJvmTraitWithKNativeResource(t *testing.T) { assert.Nil(t, err) - cp := strset.New("/etc/camel/resources", "./resources", "/mount/path").List() + cp := strset.New("./resources", "/mount/path").List() sort.Strings(cp) assert.Equal(t, []string{ "-cp", - "./resources:/etc/camel/resources:/mount/path", + "./resources:/mount/path", "io.quarkus.bootstrap.runner.QuarkusEntryPoint", }, s.Spec.Template.Spec.Containers[0].Args) } diff --git a/pkg/trait/trait_test.go b/pkg/trait/trait_test.go index e1bea3b047..f49a5b087a 100644 --- a/pkg/trait/trait_test.go +++ b/pkg/trait/trait_test.go @@ -253,12 +253,14 @@ func TestConfigureVolumesAndMountsTextResourcesAndProperties(t *testing.T) { Value: "a=b", }, { - Type: "configmap", - Value: "test-configmap", + Type: "configmap", + Value: "test-configmap", + ResourceType: "config", }, { - Type: "secret", - Value: "test-secret", + Type: "secret", + Value: "test-secret", + ResourceType: "config", }, { Type: "volume", @@ -313,7 +315,7 @@ func TestConfigureVolumesAndMountsTextResourcesAndProperties(t *testing.T) { m = findVVolumeMount(mnts, func(m corev1.VolumeMount) bool { return m.Name == "i-resource-001" }) assert.NotNil(t, m) - assert.Equal(t, "/etc/camel/resources/res2.txt", m.MountPath) + assert.Equal(t, "/etc/camel/data/resources/res2.txt", m.MountPath) v = findVolume(vols, func(v corev1.Volume) bool { return v.ConfigMap.Name == TestDeploymentName+"-resource-002" }) assert.NotNil(t, v) @@ -324,7 +326,7 @@ func TestConfigureVolumesAndMountsTextResourcesAndProperties(t *testing.T) { m = findVVolumeMount(mnts, func(m corev1.VolumeMount) bool { return m.Name == "i-resource-002" }) assert.NotNil(t, m) - assert.Equal(t, "/etc/camel/resources/res3.txt", m.MountPath) + assert.Equal(t, "/etc/camel/data/resources/res3.txt", m.MountPath) v = findVolume(vols, func(v corev1.Volume) bool { return v.ConfigMap.Name == TestDeploymentName+"-resource-003" }) assert.NotNil(t, v) @@ -335,7 +337,7 @@ func TestConfigureVolumesAndMountsTextResourcesAndProperties(t *testing.T) { m = findVVolumeMount(mnts, func(m corev1.VolumeMount) bool { return m.Name == "i-resource-003" }) assert.NotNil(t, m) - assert.Equal(t, "/etc/camel/resources/res4.txt", m.MountPath) + assert.Equal(t, "/etc/camel/data/resources/res4.txt", m.MountPath) v = findVolume(vols, func(v corev1.Volume) bool { return v.ConfigMap.Name == "test-configmap" }) assert.NotNil(t, v) @@ -345,7 +347,7 @@ func TestConfigureVolumesAndMountsTextResourcesAndProperties(t *testing.T) { m = findVVolumeMount(mnts, func(m corev1.VolumeMount) bool { return m.Name == "test-configmap" }) assert.NotNil(t, m) - assert.Equal(t, path.Join(configMapsMountPath, "test-configmap"), m.MountPath) + assert.Equal(t, path.Join(configConfigmapsMountPath, "test-configmap"), m.MountPath) v = findVolume(vols, func(v corev1.Volume) bool { return v.Name == "test-secret" }) assert.NotNil(t, v) @@ -354,7 +356,7 @@ func TestConfigureVolumesAndMountsTextResourcesAndProperties(t *testing.T) { m = findVVolumeMount(mnts, func(m corev1.VolumeMount) bool { return m.Name == "test-secret" }) assert.NotNil(t, m) - assert.Equal(t, path.Join(secretsMountPath, "test-secret"), m.MountPath) + assert.Equal(t, path.Join(configSecretsMountPath, "test-secret"), m.MountPath) v = findVolume(vols, func(v corev1.Volume) bool { return v.Name == "testvolume-data" }) assert.NotNil(t, v) @@ -478,7 +480,7 @@ func TestConfigureVolumesAndMountsBinaryAndTextResources(t *testing.T) { m := findVVolumeMount(mnts, func(m corev1.VolumeMount) bool { return m.Name == v.Name }) assert.NotNil(t, m) - assert.Equal(t, "/etc/camel/resources/res1.bin", m.MountPath) + assert.Equal(t, "/etc/camel/data/resources/res1.bin", m.MountPath) v = findVolume(vols, func(v corev1.Volume) bool { return v.ConfigMap.Name == "my-cm2" }) assert.NotNil(t, v) @@ -489,7 +491,7 @@ func TestConfigureVolumesAndMountsBinaryAndTextResources(t *testing.T) { m = findVVolumeMount(mnts, func(m corev1.VolumeMount) bool { return m.Name == v.Name }) assert.NotNil(t, m) - assert.Equal(t, "/etc/camel/resources/res2.txt", m.MountPath) + assert.Equal(t, "/etc/camel/data/resources/res2.txt", m.MountPath) } func TestOnlySomeTraitsInfluenceBuild(t *testing.T) { diff --git a/pkg/trait/trait_types.go b/pkg/trait/trait_types.go index 2ca1095ab8..f5f5209a73 100644 --- a/pkg/trait/trait_types.go +++ b/pkg/trait/trait_types.go @@ -46,13 +46,17 @@ import ( const True = "true" var ( - basePath = "/etc/camel" - confDPath = path.Join(basePath, "conf.d") - sourcesMountPath = path.Join(basePath, "sources") - resourcesMountPath = path.Join(basePath, "resources") - configMapsMountPath = path.Join(confDPath, "_configmaps") - secretsMountPath = path.Join(confDPath, "_secrets") - serviceBindingsMountPath = path.Join(confDPath, "_servicebindings") + basePath = "/etc/camel" + confDPath = path.Join(basePath, "conf.d") + sourcesMountPath = path.Join(basePath, "sources") + dataDefaultMountPath = path.Join(basePath, "data") + dataResourcesMountPath = path.Join(dataDefaultMountPath, "resources") + dataConfigmapsMountPath = path.Join(dataDefaultMountPath, "configmaps") + dataSecretsMountPath = path.Join(dataDefaultMountPath, "secrets") + configResourcesMountPath = path.Join(confDPath, "_resources") + configConfigmapsMountPath = path.Join(confDPath, "_configmaps") + configSecretsMountPath = path.Join(confDPath, "_secrets") + serviceBindingsMountPath = path.Join(confDPath, "_servicebindings") ) // Identifiable represent an identifiable type @@ -461,7 +465,7 @@ func (e *Environment) computeConfigMaps() []ctrl.Object { } for i, r := range e.Integration.Spec.Resources { - if r.Type != v1.ResourceTypeData { + if r.Type == v1.ResourceTypeOpenAPI { continue } if r.ContentRef != "" { @@ -599,7 +603,7 @@ func (e *Environment) configureVolumesAndMounts(vols *[]corev1.Volume, mnts *[]c } for i, r := range e.Integration.Resources() { - if r.Type != v1.ResourceTypeData { + if r.Type == v1.ResourceTypeOpenAPI { continue } @@ -607,7 +611,8 @@ func (e *Environment) configureVolumesAndMounts(vols *[]corev1.Volume, mnts *[]c refName := fmt.Sprintf("i-resource-%03d", i) resName := strings.TrimPrefix(r.Name, "/") cmKey := "content" - resPath := path.Join(resourcesMountPath, resName) + resourceMountPoint := getResourceMountPoint(r.Type) + resPath := path.Join(resourceMountPoint, resName) if r.ContentRef != "" { cmName = r.ContentRef @@ -688,15 +693,15 @@ func (e *Environment) configureVolumesAndMounts(vols *[]corev1.Volume, mnts *[]c // // Volumes :: Additional ConfigMaps // - for _, cmName := range e.collectConfigurationValues("configmap") { - refName := kubernetes.SanitizeLabel(cmName) + for _, configmaps := range e.collectConfigurations("configmap") { + refName := kubernetes.SanitizeLabel(configmaps["value"]) *vols = append(*vols, corev1.Volume{ Name: refName, VolumeSource: corev1.VolumeSource{ ConfigMap: &corev1.ConfigMapVolumeSource{ LocalObjectReference: corev1.LocalObjectReference{ - Name: cmName, + Name: configmaps["value"], }, }, }, @@ -704,7 +709,7 @@ func (e *Environment) configureVolumesAndMounts(vols *[]corev1.Volume, mnts *[]c *mnts = append(*mnts, corev1.VolumeMount{ Name: refName, - MountPath: path.Join(configMapsMountPath, strings.ToLower(cmName)), + MountPath: path.Join(getConfigmapMountPoint(configmaps["resourceType"]), strings.ToLower(configmaps["value"])), ReadOnly: true, }) } @@ -730,21 +735,21 @@ func (e *Environment) configureVolumesAndMounts(vols *[]corev1.Volume, mnts *[]c MountPath: path.Join(serviceBindingsMountPath, strings.ToLower(sb)), }) } - for _, secretName := range e.collectConfigurationValues("secret") { - refName := kubernetes.SanitizeLabel(secretName) + for _, secret := range e.collectConfigurations("secret") { + refName := kubernetes.SanitizeLabel(secret["value"]) *vols = append(*vols, corev1.Volume{ Name: refName, VolumeSource: corev1.VolumeSource{ Secret: &corev1.SecretVolumeSource{ - SecretName: secretName, + SecretName: secret["value"], }, }, }) *mnts = append(*mnts, corev1.VolumeMount{ Name: refName, - MountPath: path.Join(secretsMountPath, strings.ToLower(secretName)), + MountPath: path.Join(getSecretMountPoint(secret["resourceType"]), strings.ToLower(secret["value"])), ReadOnly: true, }) } @@ -779,6 +784,33 @@ func (e *Environment) configureVolumesAndMounts(vols *[]corev1.Volume, mnts *[]c } } +func getResourceMountPoint(resourceType v1.ResourceType) string { + switch resourceType { + case v1.ResourceTypeData: + return dataResourcesMountPath + } + // Default, config type + return configResourcesMountPath +} + +func getConfigmapMountPoint(resourceType string) string { + switch resourceType { + case "data": + return dataConfigmapsMountPath + } + // Default, config type + return configConfigmapsMountPath +} + +func getSecretMountPoint(resourceType string) string { + switch resourceType { + case "data": + return dataSecretsMountPath + } + // Default, config type + return configSecretsMountPath +} + func (e *Environment) collectConfigurationValues(configurationType string) []string { return collectConfigurationValues(configurationType, e.Platform, e.IntegrationKit, e.Integration) } @@ -791,6 +823,10 @@ func (e *Environment) collectConfigurationPairs(configurationType string) []vari return collectConfigurationPairs(configurationType, e.Platform, e.IntegrationKit, e.Integration) } +func (e *Environment) collectConfigurations(configurationType string) []map[string]string { + return collectConfigurations(configurationType, e.Platform, e.IntegrationKit, e.Integration) +} + func (e *Environment) getIntegrationContainer() *corev1.Container { containerName := defaultContainerName dt := e.Catalog.GetTrait(containerTraitID) diff --git a/pkg/trait/util.go b/pkg/trait/util.go index 695b7ee412..c1504a26ae 100644 --- a/pkg/trait/util.go +++ b/pkg/trait/util.go @@ -76,6 +76,34 @@ func collectConfigurationValues(configurationType string, configurable ...v1.Con return s } +func collectConfigurations(configurationType string, configurable ...v1.Configurable) []map[string]string { + var result []map[string]string + + for _, c := range configurable { + c := c + + if c == nil || reflect.ValueOf(c).IsNil() { + continue + } + + entries := c.Configurations() + if entries == nil { + continue + } + + for _, entry := range entries { + if entry.Type == configurationType { + var item = make(map[string]string) + item["value"] = entry.Value + item["resourceType"] = entry.ResourceType + result = append(result, item) + } + } + } + + return result +} + func collectConfigurationPairs(configurationType string, configurable ...v1.Configurable) []variable { result := make([]variable, 0)