Skip to content

Commit d596119

Browse files
authored
Merge pull request #544 from vshn/fix/keycloak-config
Enhance Keycloak configuration handling and resource copying
2 parents 7902833 + eef51cd commit d596119

File tree

3 files changed

+54
-24
lines changed

3 files changed

+54
-24
lines changed

pkg/comp-functions/functions/vshnkeycloak/deploy.go

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,9 @@ func handleCustomConfig(ctx context.Context, comp *vshnv1.VSHNKeycloak, svc *run
197197
l := svc.Log
198198
customConfigurationRef := comp.Spec.Parameters.Service.CustomConfigurationRef
199199
customEnvVariablesRef := comp.Spec.Parameters.Service.CustomEnvVariablesRef
200+
envFrom := comp.Spec.Parameters.Service.EnvFrom
200201

201-
if customConfigurationRef == nil && customEnvVariablesRef == nil {
202+
if customConfigurationRef == nil && customEnvVariablesRef == nil && envFrom == nil {
202203
return nil
203204
}
204205

@@ -242,6 +243,50 @@ func handleCustomConfig(ctx context.Context, comp *vshnv1.VSHNKeycloak, svc *run
242243
currentEnvHash = fmt.Sprintf("%x", md5.Sum(dataBytes))
243244
}
244245

246+
if envFrom != nil {
247+
var envFromData []byte
248+
for _, ef := range *envFrom {
249+
if ef.SecretRef != nil {
250+
sec := &corev1.Secret{}
251+
obj, err := svc.CopyKubeResource(ctx, sec, comp.GetName()+"-env-secret-"+ef.SecretRef.Name, ef.SecretRef.Name, comp.GetClaimNamespace(), comp.GetInstanceNamespace())
252+
if err != nil {
253+
l.Error(err, "cannot copy envFrom Secret", "secretName", ef.SecretRef.Name)
254+
svc.AddResult(runtime.NewWarningResult(fmt.Sprintf("cannot copy envFrom Secret %q: %s", ef.SecretRef.Name, err)))
255+
continue
256+
}
257+
dataBytes, err := json.Marshal(obj.(*corev1.Secret).Data)
258+
if err != nil {
259+
l.Error(err, "cannot marshal Secret data for hashing", "secretName", ef.SecretRef.Name)
260+
continue
261+
}
262+
envFromData = append(envFromData, dataBytes...)
263+
}
264+
if ef.ConfigMapRef != nil {
265+
cm := &corev1.ConfigMap{}
266+
obj, err := svc.CopyKubeResource(ctx, cm, comp.GetName()+"-env-cm-"+ef.ConfigMapRef.Name, ef.ConfigMapRef.Name, comp.GetClaimNamespace(), comp.GetInstanceNamespace())
267+
if err != nil {
268+
l.Error(err, "cannot copy envFrom ConfigMap", "configMapName", ef.ConfigMapRef.Name)
269+
svc.AddResult(runtime.NewWarningResult(fmt.Sprintf("cannot copy envFrom ConfigMap %q: %s", ef.ConfigMapRef.Name, err)))
270+
continue
271+
}
272+
dataBytes, err := json.Marshal(obj.(*corev1.ConfigMap).Data)
273+
if err != nil {
274+
l.Error(err, "cannot marshal ConfigMap data for hashing", "configMapName", ef.ConfigMapRef.Name)
275+
continue
276+
}
277+
envFromData = append(envFromData, dataBytes...)
278+
}
279+
}
280+
if len(envFromData) > 0 {
281+
envFromHash := fmt.Sprintf("%x", md5.Sum(envFromData))
282+
if currentEnvHash != "" {
283+
currentEnvHash = fmt.Sprintf("%x", md5.Sum([]byte(currentEnvHash+envFromHash)))
284+
} else {
285+
currentEnvHash = envFromHash
286+
}
287+
}
288+
}
289+
245290
lastConfigHash := comp.GetLastConfigHash()
246291
lastEnvHash := comp.GetLastEnvHash()
247292

@@ -798,25 +843,6 @@ func newValues(ctx context.Context, svc *runtime.ServiceRuntime, comp *vshnv1.VS
798843
}
799844

800845
func newRelease(ctx context.Context, svc *runtime.ServiceRuntime, comp *vshnv1.VSHNKeycloak, adminSecret, pgSecret string) (*xhelmv1.Release, error) {
801-
if comp.Spec.Parameters.Service.EnvFrom != nil {
802-
for _, r := range *comp.Spec.Parameters.Service.EnvFrom {
803-
if r.SecretRef != nil {
804-
obj := &corev1.Secret{}
805-
_, err := svc.CopyKubeResource(ctx, obj, comp.GetName()+"-env-secret-"+r.SecretRef.Name, r.SecretRef.Name, comp.GetClaimNamespace(), comp.GetInstanceNamespace())
806-
if err != nil {
807-
return nil, fmt.Errorf("cannot copy Keycloak env variable Secret to instance namespace: %w", err)
808-
}
809-
}
810-
if r.ConfigMapRef != nil {
811-
obj := &corev1.ConfigMap{}
812-
_, err := svc.CopyKubeResource(ctx, obj, comp.GetName()+"-env-cm-"+r.ConfigMapRef.Name, r.ConfigMapRef.Name, comp.GetClaimNamespace(), comp.GetInstanceNamespace())
813-
if err != nil {
814-
return nil, fmt.Errorf("cannot copy Keycloak env variable ConfigMap to instance namespace: %w", err)
815-
}
816-
}
817-
}
818-
}
819-
820846
values, err := newValues(ctx, svc, comp, adminSecret, pgSecret)
821847
if err != nil {
822848
return nil, err

pkg/comp-functions/functions/vshnkeycloak/maintenance.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,12 @@ import (
1414

1515
// AddMaintenanceJob will add a job to do the maintenance for the instance
1616
func AddMaintenanceJob(ctx context.Context, comp *vshnv1.VSHNKeycloak, svc *runtime.ServiceRuntime) *xfnproto.Result {
17-
if err := svc.GetObservedComposite(comp); err != nil {
18-
return runtime.NewFatalResult(fmt.Errorf("can't get desired composite: %w", err))
17+
// Try desired first but fall back to observed.
18+
// Config hash updates were observed to be dropped when only reading the observed composite.
19+
if err := svc.GetDesiredComposite(comp); err != nil {
20+
if err := svc.GetObservedComposite(comp); err != nil {
21+
return runtime.NewFatalResult(fmt.Errorf("can't get composite: %w", err))
22+
}
1923
}
2024

2125
maintTime := common.SetRandomMaintenanceSchedule(comp)

pkg/comp-functions/runtime/function_mgr.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1521,7 +1521,7 @@ func (s *ServiceRuntime) CopyKubeResource(ctx context.Context, obj client.Object
15211521
ProviderConfigIgnoreLabel: "true",
15221522
}
15231523

1524-
if err := s.SetDesiredKubeObject(observerObj, observerName, KubeOptionObserve, KubeOptionAddLabels(objectExtraLabels)); err != nil {
1524+
if err := s.SetDesiredKubeObject(observerObj, observerName, KubeOptionObserve, KubeOptionAllowDeletion, KubeOptionAddLabels(objectExtraLabels)); err != nil {
15251525
return nil, err
15261526
}
15271527

@@ -1532,7 +1532,7 @@ func (s *ServiceRuntime) CopyKubeResource(ctx context.Context, obj client.Object
15321532
instObj := obj.DeepCopyObject().(client.Object)
15331533
instObj.SetNamespace(toNS)
15341534

1535-
if err := s.SetDesiredKubeObject(instObj, resourceName); err != nil {
1535+
if err := s.SetDesiredKubeObject(instObj, resourceName, KubeOptionAllowDeletion); err != nil {
15361536
return nil, err
15371537
}
15381538

0 commit comments

Comments
 (0)