Skip to content

Commit bfdee84

Browse files
committed
Fix bugs and inconsistencies in config handling
Besides some cleanups, duplication was reduced and a simple volume/mount declaration mechanism replaces the various volumes.go files - avoiding potential inconsistences. Also fixed is a the DefaultConfigOverwrite handling that will help with RBAC workarounds - particularly allowing a common override to be defined or overridden at the service specific override level. Previously there was a central designate.conf created to avoid repetition in the service specific configs. This has been cleaned up and the required watch filters setup so updates are performed if the common config is updated.
1 parent 565e4c4 commit bfdee84

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1099
-2113
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ golangci-lint:
123123

124124
.PHONY: test
125125
test: manifests generate fmt vet envtest ginkgo ## Run tests.
126-
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) -v debug --bin-dir $(LOCALBIN) use $(ENVTEST_K8S_VERSION) -p path)" OPERATOR_TEMPLATES="$(shell pwd)/templates" $(GINKGO) --trace --cover --coverpkg=../../pkg/,../../controllers,../../api/v1beta1 --coverprofile cover.out --covermode=atomic --randomize-all ${PROC_CMD} $(GINKGO_ARGS) ./tests/...
126+
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) -v debug --bin-dir $(LOCALBIN) use $(ENVTEST_K8S_VERSION) -p path)" OPERATOR_TEMPLATES="$(shell pwd)/templates" $(GINKGO) -v --trace --cover --coverpkg=../../pkg/,../../controllers,../../api/v1beta1 --coverprofile cover.out --covermode=atomic --randomize-all ${PROC_CMD} $(GINKGO_ARGS) ./tests/...
127127

128128
##@ Build
129129

controllers/designate_controller.go

Lines changed: 101 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import (
3535
"sigs.k8s.io/controller-runtime/pkg/reconcile"
3636

3737
"github.com/go-logr/logr"
38-
networkv1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1"
3938
designatev1beta1 "github.com/openstack-k8s-operators/designate-operator/api/v1beta1"
4039
"github.com/openstack-k8s-operators/designate-operator/pkg/designate"
4140
rabbitmqv1 "github.com/openstack-k8s-operators/infra-operator/apis/rabbitmq/v1beta1"
@@ -68,6 +67,43 @@ func getOrDefault(source string, def string) string {
6867
return source
6968
}
7069

70+
// helper function for retrieving a secret.
71+
func getSecret(
72+
ctx context.Context,
73+
h *helper.Helper,
74+
namespace string,
75+
conditions *condition.Conditions,
76+
secretName string,
77+
envVars *map[string]env.Setter,
78+
prefix string,
79+
) (ctrl.Result, error) {
80+
secret, hash, err := oko_secret.GetSecret(ctx, h, secretName, namespace)
81+
if err != nil {
82+
if k8s_errors.IsNotFound(err) {
83+
h.GetLogger().Info(fmt.Sprintf("Secret %s not found", secretName))
84+
conditions.Set(condition.FalseCondition(
85+
condition.InputReadyCondition,
86+
condition.RequestedReason,
87+
condition.SeverityInfo,
88+
condition.InputReadyWaitingMessage))
89+
return ctrl.Result{RequeueAfter: time.Duration(10) * time.Second}, nil
90+
}
91+
conditions.Set(condition.FalseCondition(
92+
condition.InputReadyCondition,
93+
condition.ErrorReason,
94+
condition.SeverityWarning,
95+
condition.InputReadyErrorMessage,
96+
err.Error()))
97+
return ctrl.Result{}, err
98+
}
99+
100+
// Add a prefix to the var name to avoid accidental collision with other non-secret
101+
// vars. The secret names themselves will be unique.
102+
(*envVars)[prefix+secret.Name] = env.SetValue(hash)
103+
104+
return ctrl.Result{}, nil
105+
}
106+
71107
// GetClient -
72108
func (r *DesignateReconciler) GetClient() client.Client {
73109
return r.Client
@@ -217,7 +253,6 @@ func (r *DesignateReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
217253
condition.UnknownCondition(designatev1beta1.DesignateMdnsReadyCondition, condition.InitReason, designatev1beta1.DesignateMdnsReadyInitMessage),
218254
condition.UnknownCondition(designatev1beta1.DesignateProducerReadyCondition, condition.InitReason, designatev1beta1.DesignateProducerReadyInitMessage),
219255
condition.UnknownCondition(designatev1beta1.DesignateBackendbind9ReadyCondition, condition.InitReason, designatev1beta1.DesignateBackendbind9ReadyInitMessage),
220-
condition.UnknownCondition(condition.NetworkAttachmentsReadyCondition, condition.InitReason, condition.NetworkAttachmentsReadyInitMessage),
221256
// service account, role, rolebinding conditions
222257
condition.UnknownCondition(condition.ServiceAccountReadyCondition, condition.InitReason, condition.ServiceAccountReadyInitMessage),
223258
condition.UnknownCondition(condition.RoleReadyCondition, condition.InitReason, condition.RoleReadyInitMessage),
@@ -404,10 +439,13 @@ func (r *DesignateReconciler) reconcileInit(
404439
if err != nil {
405440
return ctrl.Result{}, err
406441
} else if hashChanged {
407-
// Hash changed and instance status should be updated (which will be done by main defer func),
408-
// so we need to return and reconcile again
409-
Log.Info("input hashes have changed, restarting reconcile")
410-
return ctrl.Result{}, nil
442+
Log.Info("input hashes have changed")
443+
instance.Status.Conditions.MarkFalse(
444+
condition.ServiceConfigReadyCondition,
445+
condition.InitReason,
446+
condition.SeverityInfo,
447+
condition.ServiceConfigReadyInitMessage)
448+
return ctrl.Result{}, err
411449
}
412450
// Create ConfigMaps and Secrets - end
413451

@@ -632,43 +670,7 @@ func (r *DesignateReconciler) reconcileNormal(ctx context.Context, instance *des
632670
common.AppSelector: designate.ServiceName,
633671
}
634672

635-
// Note: Dkehn - this will remain in the code base until determination of DNS server connections are determined.
636-
// networks to attach to
637-
nadList := []networkv1.NetworkAttachmentDefinition{}
638-
for _, netAtt := range instance.Spec.DesignateAPI.NetworkAttachments {
639-
nad, err := nad.GetNADWithName(ctx, helper, netAtt, instance.Namespace)
640-
if err != nil {
641-
if k8s_errors.IsNotFound(err) {
642-
Log.Info(fmt.Sprintf("network-attachment-definition %s not found", netAtt))
643-
instance.Status.Conditions.Set(condition.FalseCondition(
644-
condition.NetworkAttachmentsReadyCondition,
645-
condition.RequestedReason,
646-
condition.SeverityInfo,
647-
condition.NetworkAttachmentsReadyWaitingMessage,
648-
netAtt))
649-
return ctrl.Result{RequeueAfter: time.Second * 10}, nil
650-
}
651-
instance.Status.Conditions.Set(condition.FalseCondition(
652-
condition.NetworkAttachmentsReadyCondition,
653-
condition.ErrorReason,
654-
condition.SeverityWarning,
655-
condition.NetworkAttachmentsReadyErrorMessage,
656-
err.Error()))
657-
return ctrl.Result{}, err
658-
}
659-
660-
if nad != nil {
661-
nadList = append(nadList, *nad)
662-
}
663-
}
664-
665-
serviceAnnotations, err := nad.EnsureNetworksAnnotation(nadList)
666-
if err != nil {
667-
return ctrl.Result{}, fmt.Errorf("failed create network annotation from %s: %w",
668-
instance.Spec.DesignateAPI.NetworkAttachments, err)
669-
}
670-
671-
instance.Status.Conditions.MarkTrue(condition.NetworkAttachmentsReadyCondition, condition.NetworkAttachmentsReadyMessage)
673+
serviceAnnotations := make(map[string]string)
672674

673675
// Handle service init
674676
ctrlResult, err := r.reconcileInit(ctx, instance, helper, serviceLabels, serviceAnnotations)
@@ -677,7 +679,6 @@ func (r *DesignateReconciler) reconcileNormal(ctx context.Context, instance *des
677679
} else if (ctrlResult != ctrl.Result{}) {
678680
return ctrlResult, nil
679681
}
680-
instance.Status.Conditions.MarkTrue(condition.NetworkAttachmentsReadyCondition, condition.NetworkAttachmentsReadyMessage)
681682

682683
// Handle service update
683684
ctrlResult, err = r.reconcileUpdate(ctx, instance)
@@ -890,6 +891,7 @@ func (r *DesignateReconciler) reconcileNormal(ctx context.Context, instance *des
890891
if err := r.Client.Status().Update(ctx, instance); err != nil {
891892
return ctrl.Result{}, fmt.Errorf("failed to update status hash: %w", err)
892893
}
894+
893895
jobDef := designate.PoolUpdateJob(instance, serviceLabels, serviceAnnotations)
894896

895897
Log.Info("Initializing pool update job")
@@ -1292,7 +1294,6 @@ func (r *DesignateReconciler) reconcileUpgrade(ctx context.Context, instance *de
12921294
}
12931295

12941296
// generateServiceConfigMaps - create secrets which hold scripts and service configuration
1295-
// TODO add DefaultConfigOverwrite
12961297
func (r *DesignateReconciler) generateServiceConfigMaps(
12971298
ctx context.Context,
12981299
h *helper.Helper,
@@ -1379,10 +1380,6 @@ func (r *DesignateReconciler) generateServiceConfigMaps(
13791380
"my.cnf": designateDb.GetDatabaseClientConfig(tlsCfg), //(oschwart) for now just get the default my.cnf
13801381
}
13811382

1382-
for key, data := range instance.Spec.DefaultConfigOverwrite {
1383-
customData[key] = data
1384-
}
1385-
13861383
databaseAccount := designateDb.GetAccount()
13871384
dbSecret := designateDb.GetSecret()
13881385

@@ -1397,7 +1394,6 @@ func (r *DesignateReconciler) generateServiceConfigMaps(
13971394
designate.DatabaseName,
13981395
),
13991396
}
1400-
templateParameters["ServiceUser"] = instance.Spec.ServiceUser
14011397

14021398
transportURLSecret, _, err := oko_secret.GetSecret(ctx, h, instance.Status.TransportURLSecret, instance.Namespace)
14031399
if err != nil {
@@ -1441,26 +1437,70 @@ func (r *DesignateReconciler) generateServiceConfigMaps(
14411437
}
14421438
templateParameters["AdminPassword"] = string(adminPasswordSecret.Data["DesignatePassword"])
14431439

1440+
redisIPs, err := getRedisServiceIPs(ctx, instance, h)
1441+
if err != nil {
1442+
instance.Status.Conditions.Set(condition.FalseCondition(
1443+
condition.InputReadyCondition,
1444+
condition.ErrorReason,
1445+
condition.SeverityWarning,
1446+
condition.InputReadyErrorMessage,
1447+
err.Error()))
1448+
return err
1449+
}
1450+
1451+
if len(redisIPs) == 0 {
1452+
err = fmt.Errorf("unable to configure designate deployment without Redis")
1453+
instance.Status.Conditions.Set(condition.FalseCondition(
1454+
condition.InputReadyCondition,
1455+
condition.ErrorReason,
1456+
condition.SeverityWarning,
1457+
condition.InputReadyErrorMessage,
1458+
err.Error()))
1459+
return err
1460+
}
1461+
1462+
sort.Strings(redisIPs)
1463+
1464+
// TODO(beagles): This should be set to sentinel services! There seems to be a problem with sentinels at them moment.
1465+
// We should also check for IPv6 validity.
1466+
backendURL := fmt.Sprintf("redis://%s:6379/", redisIPs[0])
1467+
if tlsCfg != nil {
1468+
backendURL = fmt.Sprintf("%s?ssl=true", backendURL)
1469+
}
1470+
templateParameters["CoordinationBackendURL"] = backendURL
1471+
14441472
cms := []util.Template{
14451473
// ScriptsConfigMap
14461474
{
1447-
Name: fmt.Sprintf("%s-scripts", instance.Name),
1448-
Namespace: instance.Namespace,
1449-
Type: util.TemplateTypeScripts,
1450-
InstanceType: instance.Kind,
1451-
AdditionalTemplate: map[string]string{"common.sh": "/common/common.sh"},
1452-
Labels: cmLabels,
1475+
Name: designate.ScriptsVolumeName(instance.Name),
1476+
Namespace: instance.Namespace,
1477+
Type: util.TemplateTypeScripts,
1478+
InstanceType: instance.Kind,
1479+
AdditionalTemplate: map[string]string{
1480+
"common.sh": "/common/common.sh",
1481+
"init.sh": "/common/init.sh",
1482+
},
1483+
Labels: cmLabels,
14531484
},
1454-
// ConfigMap
1485+
// This will be the common config for all OpenStack based services. This will be merged with
1486+
// service specific configurations.
14551487
{
1456-
Name: fmt.Sprintf("%s-config-data", instance.Name),
1488+
Name: designate.ConfigVolumeName(instance.Name),
14571489
Namespace: instance.Namespace,
14581490
Type: util.TemplateTypeConfig,
14591491
InstanceType: instance.Kind,
14601492
CustomData: customData,
14611493
ConfigOptions: templateParameters,
14621494
Labels: cmLabels,
14631495
},
1496+
{
1497+
Name: designate.DefaultsVolumeName(instance.Name),
1498+
Namespace: instance.Namespace,
1499+
Type: util.TemplateTypeNone,
1500+
InstanceType: instance.Kind,
1501+
CustomData: instance.Spec.DefaultConfigOverwrite,
1502+
Labels: cmLabels,
1503+
},
14641504
}
14651505

14661506
err = oko_secret.EnsureSecrets(ctx, h, instance, cms, envVars)
@@ -1491,7 +1531,7 @@ func (r *DesignateReconciler) createHashOfInputHashes(
14911531

14921532
envHash, err := util.ObjectHash(mergedMapVars)
14931533
if err != nil {
1494-
Log.Info("XXX - Error creating hash")
1534+
Log.Info("Error creating hash")
14951535
return "", changed, err
14961536
}
14971537
combinedHashes = append(combinedHashes, envHash)
@@ -1616,6 +1656,7 @@ func (r *DesignateReconciler) centralDeploymentCreateOrUpdate(ctx context.Contex
16161656
deployment.Spec.DatabaseHostname = instance.Status.DatabaseHostname
16171657
deployment.Spec.TransportURLSecret = instance.Status.TransportURLSecret
16181658
deployment.Spec.ServiceAccount = instance.RbacResourceName()
1659+
// TODO(beagles): redundant but we cannot remove them from the API for the time being so let's keep this here.
16191660
deployment.Spec.RedisHostIPs = instance.Status.RedisHostIPs
16201661
deployment.Spec.TLS = instance.Spec.DesignateAPI.TLS.Ca
16211662
deployment.Spec.NodeSelector = instance.Spec.DesignateCentral.NodeSelector
@@ -1794,7 +1835,6 @@ func (r *DesignateReconciler) backendbind9StatefulSetCreateOrUpdate(ctx context.
17941835
// TODO: Add logic to determine when to set/overwrite, etc
17951836
statefulSet.Spec.ServiceUser = instance.Spec.ServiceUser
17961837
statefulSet.Spec.Secret = instance.Spec.Secret
1797-
statefulSet.Spec.PasswordSelectors = instance.Spec.PasswordSelectors
17981838
statefulSet.Spec.ServiceAccount = instance.RbacResourceName()
17991839
statefulSet.Spec.NodeSelector = instance.Spec.DesignateBackendbind9.NodeSelector
18001840
statefulSet.Spec.TopologyRef = instance.Spec.DesignateBackendbind9.TopologyRef
@@ -1804,7 +1844,7 @@ func (r *DesignateReconciler) backendbind9StatefulSetCreateOrUpdate(ctx context.
18041844
if instance.Spec.DesignateNetworkAttachment != "" {
18051845
networkAttachment = instance.Spec.DesignateNetworkAttachment
18061846
}
1807-
statefulSet.Spec.ControlNetworkName = networkAttachment
1847+
statefulSet.Spec.ControlNetworkName = getOrDefault(instance.Spec.DesignateBackendbind9.ControlNetworkName, networkAttachment)
18081848

18091849
err := controllerutil.SetControllerReference(instance, statefulSet, r.Scheme)
18101850
if err != nil {

0 commit comments

Comments
 (0)