Skip to content

Commit 24cc295

Browse files
Merge pull request #319 from beagles/fix-config-handling
Fix bugs and inconsistencies in config handling
2 parents afc915d + bfdee84 commit 24cc295

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)