@@ -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 -
72108func (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
12961297func (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