Skip to content

Commit a1d9fe2

Browse files
authored
feat: stop creation and mounting of flagd-config config map in case of kubernetes sync-provider (#126)
* feat: stop creation and mounting of flagd-config config map in case of kubernetes sync-provider Signed-off-by: Skye Gill <[email protected]> * simplify IsKubernetes Signed-off-by: Skye Gill <[email protected]> * bump package with vulnerability Signed-off-by: Skye Gill <[email protected]> Signed-off-by: Skye Gill <[email protected]>
1 parent 33474fe commit a1d9fe2

File tree

5 files changed

+53
-42
lines changed

5 files changed

+53
-42
lines changed

apis/core/v1alpha1/featureflagconfiguration_types.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ type FlagDSpec struct {
5050
type FeatureFlagSyncProvider struct {
5151
Name string `json:"name"`
5252
}
53+
54+
func (ffsp FeatureFlagSyncProvider) IsKubernetes() bool {
55+
return ffsp.Name == "kubernetes"
56+
}
57+
5358
type FeatureFlagServiceProvider struct {
5459
// +kubebuilder:validation:Enum=flagd
5560
Name string `json:"name"`

config/samples/end-to-end.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ spec:
7070
spec:
7171
containers:
7272
- name: open-feature-demo
73-
image: ghcr.io/open-feature/open-feature-demo:latest
73+
image: ghcr.io/open-feature/playground-app:v0.1.1
7474
args:
7575
- flagd
7676
ports:

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ require (
6767
golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 // indirect
6868
golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 // indirect
6969
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
70-
golang.org/x/text v0.3.7 // indirect
70+
golang.org/x/text v0.3.8 // indirect
7171
golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 // indirect
7272
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
7373
google.golang.org/appengine v1.6.7 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
845845
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
846846
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
847847
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
848+
golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY=
849+
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
848850
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
849851
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
850852
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=

webhooks/pod_webhook.go

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -74,29 +74,32 @@ func (m *PodMutator) Handle(ctx context.Context, req admission.Request) admissio
7474
return admission.Denied(err.Error())
7575
}
7676

77-
// Check for ConfigMap and create it if it doesn't exist
78-
cm := corev1.ConfigMap{}
79-
if err := m.Client.Get(ctx, client.ObjectKey{Name: val, Namespace: req.Namespace}, &cm); errors.IsNotFound(err) {
80-
err := m.createConfigMap(ctx, val, req.Namespace, pod)
81-
if err != nil {
82-
m.Log.V(1).Info(fmt.Sprintf("failed to create config map %s error: %s", val, err.Error()))
83-
return admission.Errored(http.StatusInternalServerError, err)
77+
// Check to see whether the FeatureFlagConfiguration has service or sync overrides
78+
ff := m.getFeatureFlag(ctx, val, req.Namespace)
79+
80+
if ff.Spec.SyncProvider != nil && !ff.Spec.SyncProvider.IsKubernetes() {
81+
// Check for ConfigMap and create it if it doesn't exist (only required if sync provider isn't kubernetes)
82+
cm := corev1.ConfigMap{}
83+
if err := m.Client.Get(ctx, client.ObjectKey{Name: val, Namespace: req.Namespace}, &cm); errors.IsNotFound(err) {
84+
err := m.createConfigMap(ctx, val, req.Namespace, pod)
85+
if err != nil {
86+
m.Log.V(1).Info(fmt.Sprintf("failed to create config map %s error: %s", val, err.Error()))
87+
return admission.Errored(http.StatusInternalServerError, err)
88+
}
8489
}
85-
}
8690

87-
// Add owner reference of the pod's owner
88-
if !podOwnerIsOwner(pod, cm) {
89-
reference := pod.OwnerReferences[0]
90-
reference.Controller = utils.FalseVal()
91-
cm.OwnerReferences = append(cm.OwnerReferences, reference)
92-
err := m.Client.Update(ctx, &cm)
93-
if err != nil {
94-
m.Log.V(1).Info(fmt.Sprintf("failed to update owner reference for %s error: %s", val, err.Error()))
91+
// Add owner reference of the pod's owner
92+
if !podOwnerIsOwner(pod, cm) {
93+
reference := pod.OwnerReferences[0]
94+
reference.Controller = utils.FalseVal()
95+
cm.OwnerReferences = append(cm.OwnerReferences, reference)
96+
err := m.Client.Update(ctx, &cm)
97+
if err != nil {
98+
m.Log.V(1).Info(fmt.Sprintf("failed to update owner reference for %s error: %s", val, err.Error()))
99+
}
95100
}
96101
}
97102

98-
// Check to see whether the FeatureFlagConfiguration has service or sync overrides
99-
ff := m.getFeatureFlag(ctx, val, req.Namespace)
100103
marshaledPod, err := m.injectSidecar(pod, val, &ff)
101104
if err != nil {
102105
return admission.Errored(http.StatusInternalServerError, err)
@@ -196,17 +199,6 @@ func (m *PodMutator) getFeatureFlag(ctx context.Context, name string, namespace
196199

197200
func (m *PodMutator) injectSidecar(pod *corev1.Pod, configMap string, featureFlag *corev1alpha1.FeatureFlagConfiguration) ([]byte, error) {
198201
m.Log.V(1).Info(fmt.Sprintf("Creating sidecar for pod %s/%s", pod.Namespace, pod.Name))
199-
// Inject the agent
200-
pod.Spec.Volumes = append(pod.Spec.Volumes, corev1.Volume{
201-
Name: "flagd-config",
202-
VolumeSource: corev1.VolumeSource{
203-
ConfigMap: &corev1.ConfigMapVolumeSource{
204-
LocalObjectReference: corev1.LocalObjectReference{
205-
Name: configMap,
206-
},
207-
},
208-
},
209-
})
210202

211203
commandSequence := []string{
212204
"start", "--uri", "/etc/flagd/config.json",
@@ -217,11 +209,28 @@ func (m *PodMutator) injectSidecar(pod *corev1.Pod, configMap string, featureFla
217209
commandSequence = append(commandSequence, "--service-provider")
218210
commandSequence = append(commandSequence, "http")
219211
}
212+
213+
var volumeMounts []corev1.VolumeMount
220214
// Adds the sync provider if it is set
221-
if featureFlag.Spec.SyncProvider != nil {
222-
if featureFlag.Spec.SyncProvider.Name != "kubernetes" {
223-
commandSequence = append(commandSequence, "--sync-provider")
224-
commandSequence = append(commandSequence, featureFlag.Spec.SyncProvider.Name)
215+
if featureFlag.Spec.SyncProvider != nil && !featureFlag.Spec.SyncProvider.IsKubernetes() {
216+
commandSequence = append(commandSequence, "--sync-provider")
217+
commandSequence = append(commandSequence, featureFlag.Spec.SyncProvider.Name)
218+
// inject config map as volume if sync provider not kubernetes
219+
pod.Spec.Volumes = append(pod.Spec.Volumes, corev1.Volume{
220+
Name: "flagd-config",
221+
VolumeSource: corev1.VolumeSource{
222+
ConfigMap: &corev1.ConfigMapVolumeSource{
223+
LocalObjectReference: corev1.LocalObjectReference{
224+
Name: configMap,
225+
},
226+
},
227+
},
228+
})
229+
volumeMounts = []corev1.VolumeMount{
230+
{
231+
Name: "flagd-config",
232+
MountPath: "/etc/flagd",
233+
},
225234
}
226235
} else {
227236
featureFlag.Spec.SyncProvider = &corev1alpha1.FeatureFlagSyncProvider{
@@ -253,13 +262,8 @@ func (m *PodMutator) injectSidecar(pod *corev1.Pod, configMap string, featureFla
253262
Image: "ghcr.io/open-feature/flagd:" + FlagDTag,
254263
Args: commandSequence,
255264
ImagePullPolicy: FlagDImagePullPolicy,
256-
VolumeMounts: []corev1.VolumeMount{
257-
{
258-
Name: "flagd-config",
259-
MountPath: "/etc/flagd",
260-
},
261-
},
262-
Env: envs,
265+
VolumeMounts: volumeMounts,
266+
Env: envs,
263267
Ports: []corev1.ContainerPort{
264268
{
265269
Name: "metrics",

0 commit comments

Comments
 (0)