Add envFrom support to Postgresql spec (#3118)
* add envFrom support * generate files --------- Co-authored-by: Felix Kunde <felix-kunde@gmx.de>
This commit is contained in:
parent
1b460310a2
commit
ca9513c831
|
|
@ -454,6 +454,51 @@ spec:
|
||||||
- name
|
- name
|
||||||
type: object
|
type: object
|
||||||
type: array
|
type: array
|
||||||
|
envFrom:
|
||||||
|
items:
|
||||||
|
description: EnvFromSource represents the source of a set of ConfigMaps
|
||||||
|
properties:
|
||||||
|
configMapRef:
|
||||||
|
description: The ConfigMap to select from
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
default: ""
|
||||||
|
description: |-
|
||||||
|
Name of the referent.
|
||||||
|
This field is effectively required, but due to backwards compatibility is
|
||||||
|
allowed to be empty. Instances of this type with an empty value here are
|
||||||
|
almost certainly wrong.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
||||||
|
type: string
|
||||||
|
optional:
|
||||||
|
description: Specify whether the ConfigMap must be defined
|
||||||
|
type: boolean
|
||||||
|
type: object
|
||||||
|
x-kubernetes-map-type: atomic
|
||||||
|
prefix:
|
||||||
|
description: An optional identifier to prepend to each key in
|
||||||
|
the ConfigMap. Must be a C_IDENTIFIER.
|
||||||
|
type: string
|
||||||
|
secretRef:
|
||||||
|
description: The Secret to select from
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
default: ""
|
||||||
|
description: |-
|
||||||
|
Name of the referent.
|
||||||
|
This field is effectively required, but due to backwards compatibility is
|
||||||
|
allowed to be empty. Instances of this type with an empty value here are
|
||||||
|
almost certainly wrong.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
||||||
|
type: string
|
||||||
|
optional:
|
||||||
|
description: Specify whether the Secret must be defined
|
||||||
|
type: boolean
|
||||||
|
type: object
|
||||||
|
x-kubernetes-map-type: atomic
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
x-kubernetes-list-type: atomic
|
||||||
initContainers:
|
initContainers:
|
||||||
items:
|
items:
|
||||||
description: A single application container that you want to run
|
description: A single application container that you want to run
|
||||||
|
|
|
||||||
|
|
@ -454,6 +454,52 @@ spec:
|
||||||
- name
|
- name
|
||||||
type: object
|
type: object
|
||||||
type: array
|
type: array
|
||||||
|
envFrom:
|
||||||
|
items:
|
||||||
|
description: EnvFromSource represents the source of a set of ConfigMaps
|
||||||
|
or Secrets
|
||||||
|
properties:
|
||||||
|
configMapRef:
|
||||||
|
description: The ConfigMap to select from
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
default: ""
|
||||||
|
description: |-
|
||||||
|
Name of the referent.
|
||||||
|
This field is effectively required, but due to backwards compatibility is
|
||||||
|
allowed to be empty. Instances of this type with an empty value here are
|
||||||
|
almost certainly wrong.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
||||||
|
type: string
|
||||||
|
optional:
|
||||||
|
description: Specify whether the ConfigMap must be defined
|
||||||
|
type: boolean
|
||||||
|
type: object
|
||||||
|
x-kubernetes-map-type: atomic
|
||||||
|
prefix:
|
||||||
|
description: |-
|
||||||
|
Optional text to prepend to the name of each environment variable.
|
||||||
|
May consist of any printable ASCII characters except '='.
|
||||||
|
type: string
|
||||||
|
secretRef:
|
||||||
|
description: The Secret to select from
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
default: ""
|
||||||
|
description: |-
|
||||||
|
Name of the referent.
|
||||||
|
This field is effectively required, but due to backwards compatibility is
|
||||||
|
allowed to be empty. Instances of this type with an empty value here are
|
||||||
|
almost certainly wrong.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
||||||
|
type: string
|
||||||
|
optional:
|
||||||
|
description: Specify whether the Secret must be defined
|
||||||
|
type: boolean
|
||||||
|
type: object
|
||||||
|
x-kubernetes-map-type: atomic
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
initContainers:
|
initContainers:
|
||||||
items:
|
items:
|
||||||
description: A single application container that you want to run
|
description: A single application container that you want to run
|
||||||
|
|
|
||||||
|
|
@ -454,6 +454,52 @@ spec:
|
||||||
- name
|
- name
|
||||||
type: object
|
type: object
|
||||||
type: array
|
type: array
|
||||||
|
envFrom:
|
||||||
|
items:
|
||||||
|
description: EnvFromSource represents the source of a set of ConfigMaps
|
||||||
|
or Secrets
|
||||||
|
properties:
|
||||||
|
configMapRef:
|
||||||
|
description: The ConfigMap to select from
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
default: ""
|
||||||
|
description: |-
|
||||||
|
Name of the referent.
|
||||||
|
This field is effectively required, but due to backwards compatibility is
|
||||||
|
allowed to be empty. Instances of this type with an empty value here are
|
||||||
|
almost certainly wrong.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
||||||
|
type: string
|
||||||
|
optional:
|
||||||
|
description: Specify whether the ConfigMap must be defined
|
||||||
|
type: boolean
|
||||||
|
type: object
|
||||||
|
x-kubernetes-map-type: atomic
|
||||||
|
prefix:
|
||||||
|
description: |-
|
||||||
|
Optional text to prepend to the name of each environment variable.
|
||||||
|
May consist of any printable ASCII characters except '='.
|
||||||
|
type: string
|
||||||
|
secretRef:
|
||||||
|
description: The Secret to select from
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
default: ""
|
||||||
|
description: |-
|
||||||
|
Name of the referent.
|
||||||
|
This field is effectively required, but due to backwards compatibility is
|
||||||
|
allowed to be empty. Instances of this type with an empty value here are
|
||||||
|
almost certainly wrong.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
|
||||||
|
type: string
|
||||||
|
optional:
|
||||||
|
description: Specify whether the Secret must be defined
|
||||||
|
type: boolean
|
||||||
|
type: object
|
||||||
|
x-kubernetes-map-type: atomic
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
initContainers:
|
initContainers:
|
||||||
items:
|
items:
|
||||||
description: A single application container that you want to run
|
description: A single application container that you want to run
|
||||||
|
|
|
||||||
|
|
@ -124,6 +124,7 @@ type PostgresSpec struct {
|
||||||
AdditionalVolumes []AdditionalVolume `json:"additionalVolumes,omitempty"`
|
AdditionalVolumes []AdditionalVolume `json:"additionalVolumes,omitempty"`
|
||||||
Streams []Stream `json:"streams,omitempty"`
|
Streams []Stream `json:"streams,omitempty"`
|
||||||
Env []v1.EnvVar `json:"env,omitempty"`
|
Env []v1.EnvVar `json:"env,omitempty"`
|
||||||
|
EnvFrom []v1.EnvFromSource `json:"envFrom,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||||
|
|
|
||||||
|
|
@ -1016,6 +1016,13 @@ func (in *PostgresSpec) DeepCopyInto(out *PostgresSpec) {
|
||||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if in.EnvFrom != nil {
|
||||||
|
in, out := &in.EnvFrom, &out.EnvFrom
|
||||||
|
*out = make([]corev1.EnvFromSource, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -229,6 +229,63 @@ func TestStatefulSetUpdateWithEnv(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestStatefulSetUpdateWithEnvFrom(t *testing.T) {
|
||||||
|
oldSpec := &acidv1.PostgresSpec{
|
||||||
|
TeamID: "myapp", NumberOfInstances: 1,
|
||||||
|
Resources: &acidv1.Resources{
|
||||||
|
ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")},
|
||||||
|
ResourceLimits: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")},
|
||||||
|
},
|
||||||
|
Volume: acidv1.Volume{
|
||||||
|
Size: "1G",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
oldSS, err := cl.generateStatefulSet(oldSpec)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("in %s no StatefulSet created %v", t.Name(), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
newSpec := oldSpec.DeepCopy()
|
||||||
|
newSS, err := cl.generateStatefulSet(newSpec)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("in %s no StatefulSet created %v", t.Name(), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(oldSS, newSS) {
|
||||||
|
t.Errorf("in %s StatefulSet's must be equal", t.Name())
|
||||||
|
}
|
||||||
|
|
||||||
|
newSpec.EnvFrom = []v1.EnvFromSource{
|
||||||
|
{
|
||||||
|
ConfigMapRef: &v1.ConfigMapEnvSource{
|
||||||
|
LocalObjectReference: v1.LocalObjectReference{
|
||||||
|
Name: "test-configmap",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SecretRef: &v1.SecretEnvSource{
|
||||||
|
LocalObjectReference: v1.LocalObjectReference{
|
||||||
|
Name: "test-secret",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
newSS, err = cl.generateStatefulSet(newSpec)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("in %s no StatefulSet created %v", t.Name(), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if reflect.DeepEqual(oldSS, newSS) {
|
||||||
|
t.Errorf("in %s StatefulSet's must be not equal", t.Name())
|
||||||
|
}
|
||||||
|
|
||||||
|
postgresContainer := newSS.Spec.Template.Spec.Containers[0]
|
||||||
|
if !reflect.DeepEqual(postgresContainer.EnvFrom, newSpec.EnvFrom) {
|
||||||
|
t.Errorf("expected envFrom %v, got %v", newSpec.EnvFrom, postgresContainer.EnvFrom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestInitRobotUsers(t *testing.T) {
|
func TestInitRobotUsers(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
testCase string
|
testCase string
|
||||||
|
|
|
||||||
|
|
@ -697,6 +697,7 @@ func generateContainer(
|
||||||
dockerImage *string,
|
dockerImage *string,
|
||||||
resourceRequirements *v1.ResourceRequirements,
|
resourceRequirements *v1.ResourceRequirements,
|
||||||
envVars []v1.EnvVar,
|
envVars []v1.EnvVar,
|
||||||
|
envFrom []v1.EnvFromSource,
|
||||||
volumeMounts []v1.VolumeMount,
|
volumeMounts []v1.VolumeMount,
|
||||||
privilegedMode bool,
|
privilegedMode bool,
|
||||||
privilegeEscalationMode *bool,
|
privilegeEscalationMode *bool,
|
||||||
|
|
@ -723,6 +724,7 @@ func generateContainer(
|
||||||
},
|
},
|
||||||
VolumeMounts: volumeMounts,
|
VolumeMounts: volumeMounts,
|
||||||
Env: envVars,
|
Env: envVars,
|
||||||
|
EnvFrom: envFrom,
|
||||||
SecurityContext: &v1.SecurityContext{
|
SecurityContext: &v1.SecurityContext{
|
||||||
AllowPrivilegeEscalation: privilegeEscalationMode,
|
AllowPrivilegeEscalation: privilegeEscalationMode,
|
||||||
Privileged: &privilegedMode,
|
Privileged: &privilegedMode,
|
||||||
|
|
@ -1385,6 +1387,7 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.Statef
|
||||||
&effectiveDockerImage,
|
&effectiveDockerImage,
|
||||||
resourceRequirements,
|
resourceRequirements,
|
||||||
spiloEnvVars,
|
spiloEnvVars,
|
||||||
|
spec.EnvFrom,
|
||||||
volumeMounts,
|
volumeMounts,
|
||||||
c.OpConfig.Resources.SpiloPrivileged,
|
c.OpConfig.Resources.SpiloPrivileged,
|
||||||
c.OpConfig.Resources.SpiloAllowPrivilegeEscalation,
|
c.OpConfig.Resources.SpiloAllowPrivilegeEscalation,
|
||||||
|
|
@ -2385,6 +2388,7 @@ func (c *Cluster) generateLogicalBackupJob() (*batchv1.CronJob, error) {
|
||||||
&c.OpConfig.LogicalBackup.LogicalBackupDockerImage,
|
&c.OpConfig.LogicalBackup.LogicalBackupDockerImage,
|
||||||
resourceRequirements,
|
resourceRequirements,
|
||||||
envVars,
|
envVars,
|
||||||
|
nil,
|
||||||
[]v1.VolumeMount{},
|
[]v1.VolumeMount{},
|
||||||
c.OpConfig.SpiloPrivileged, // use same value as for normal DB pods
|
c.OpConfig.SpiloPrivileged, // use same value as for normal DB pods
|
||||||
c.OpConfig.SpiloAllowPrivilegeEscalation,
|
c.OpConfig.SpiloAllowPrivilegeEscalation,
|
||||||
|
|
|
||||||
|
|
@ -4488,6 +4488,48 @@ func TestGenerateCapabilities(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGenerateContainerWithEnvFrom(t *testing.T) {
|
||||||
|
dockerImage := "test-image"
|
||||||
|
resourceRequirements := &v1.ResourceRequirements{
|
||||||
|
Requests: v1.ResourceList{
|
||||||
|
v1.ResourceCPU: resource.MustParse("100m"),
|
||||||
|
v1.ResourceMemory: resource.MustParse("100Mi"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
envVars := []v1.EnvVar{{Name: "TEST_VAR", Value: "test-value"}}
|
||||||
|
envFrom := []v1.EnvFromSource{
|
||||||
|
{
|
||||||
|
ConfigMapRef: &v1.ConfigMapEnvSource{
|
||||||
|
LocalObjectReference: v1.LocalObjectReference{Name: "test-configmap"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SecretRef: &v1.SecretEnvSource{
|
||||||
|
LocalObjectReference: v1.LocalObjectReference{Name: "test-secret"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
container := generateContainer(
|
||||||
|
constants.PostgresContainerName,
|
||||||
|
&dockerImage,
|
||||||
|
resourceRequirements,
|
||||||
|
envVars,
|
||||||
|
envFrom,
|
||||||
|
[]v1.VolumeMount{},
|
||||||
|
false,
|
||||||
|
util.False(),
|
||||||
|
nil,
|
||||||
|
)
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(container.Env, envVars) {
|
||||||
|
t.Errorf("expected env %v, got %v", envVars, container.Env)
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(container.EnvFrom, envFrom) {
|
||||||
|
t.Errorf("expected envFrom %v, got %v", envFrom, container.EnvFrom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestTopologySpreadConstraints(t *testing.T) {
|
func TestTopologySpreadConstraints(t *testing.T) {
|
||||||
clusterName := "acid-test-cluster"
|
clusterName := "acid-test-cluster"
|
||||||
namespace := "default"
|
namespace := "default"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue