Skip to content

Commit cfef36e

Browse files
Merge pull request #330 from beagles/spec-field-propogation
Fix missing field propogation from parent to child specs
2 parents 4571c1d + 2316319 commit cfef36e

File tree

4 files changed

+52
-21
lines changed

4 files changed

+52
-21
lines changed

controllers/designate_controller.go

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ import (
6060
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
6161
)
6262

63+
// getOrDefault - helper for setting 'default' value if empty value in CR.
64+
func getOrDefault(source string, def string) string {
65+
if len(source) == 0 {
66+
return def
67+
}
68+
return source
69+
}
70+
6371
// GetClient -
6472
func (r *DesignateReconciler) GetClient() client.Client {
6573
return r.Client
@@ -1527,6 +1535,14 @@ func (r *DesignateReconciler) transportURLCreateOrUpdate(
15271535
return transportURL, op, err
15281536
}
15291537

1538+
// copyDesignateTemplateItems - copy elements from the central Spec to the sub-spec template.
1539+
func copyDesignateTemplateItems(src *designatev1beta1.DesignateSpecBase, dest *designatev1beta1.DesignateTemplate) {
1540+
dest.ServiceUser = getOrDefault(src.ServiceUser, "designate")
1541+
dest.DatabaseAccount = getOrDefault(src.DatabaseAccount, "designate")
1542+
dest.Secret = src.Secret
1543+
dest.PasswordSelectors.Service = getOrDefault(src.PasswordSelectors.Service, "DesignatePassword")
1544+
}
1545+
15301546
func (r *DesignateReconciler) apiDeploymentCreateOrUpdate(ctx context.Context, instance *designatev1beta1.Designate) (*designatev1beta1.DesignateAPI, controllerutil.OperationResult, error) {
15311547
deployment := &designatev1beta1.DesignateAPI{
15321548
ObjectMeta: metav1.ObjectMeta{
@@ -1549,10 +1565,8 @@ func (r *DesignateReconciler) apiDeploymentCreateOrUpdate(ctx context.Context, i
15491565
deployment.Spec = instance.Spec.DesignateAPI
15501566
// Add in transfers from umbrella Designate (this instance) spec
15511567
// TODO: Add logic to determine when to set/overwrite, etc
1552-
deployment.Spec.ServiceUser = instance.Spec.ServiceUser
1568+
copyDesignateTemplateItems(&instance.Spec.DesignateSpecBase, &deployment.Spec.DesignateTemplate)
15531569
deployment.Spec.DatabaseHostname = instance.Status.DatabaseHostname
1554-
deployment.Spec.DatabaseAccount = instance.Spec.DatabaseAccount
1555-
deployment.Spec.Secret = instance.Spec.Secret
15561570
deployment.Spec.ServiceAccount = instance.RbacResourceName()
15571571
deployment.Spec.TLS = instance.Spec.DesignateAPI.TLS
15581572
deployment.Spec.TransportURLSecret = instance.Status.TransportURLSecret
@@ -1593,10 +1607,8 @@ func (r *DesignateReconciler) centralDeploymentCreateOrUpdate(ctx context.Contex
15931607
deployment.Spec = instance.Spec.DesignateCentral
15941608
// Add in transfers from umbrella Designate CR (this instance) spec
15951609
// TODO: Add logic to determine when to set/overwrite, etc
1596-
deployment.Spec.ServiceUser = instance.Spec.ServiceUser
1610+
copyDesignateTemplateItems(&instance.Spec.DesignateSpecBase, &deployment.Spec.DesignateTemplate)
15971611
deployment.Spec.DatabaseHostname = instance.Status.DatabaseHostname
1598-
deployment.Spec.DatabaseAccount = instance.Spec.DatabaseAccount
1599-
deployment.Spec.Secret = instance.Spec.Secret
16001612
deployment.Spec.TransportURLSecret = instance.Status.TransportURLSecret
16011613
deployment.Spec.ServiceAccount = instance.RbacResourceName()
16021614
deployment.Spec.RedisHostIPs = instance.Status.RedisHostIPs
@@ -1637,10 +1649,8 @@ func (r *DesignateReconciler) workerDeploymentCreateOrUpdate(ctx context.Context
16371649
deployment.Spec = instance.Spec.DesignateWorker
16381650
// Add in transfers from umbrella Designate CR (this instance) spec
16391651
// TODO: Add logic to determine when to set/overwrite, etc
1640-
deployment.Spec.ServiceUser = instance.Spec.ServiceUser
1652+
copyDesignateTemplateItems(&instance.Spec.DesignateSpecBase, &deployment.Spec.DesignateTemplate)
16411653
deployment.Spec.DatabaseHostname = instance.Status.DatabaseHostname
1642-
deployment.Spec.DatabaseAccount = instance.Spec.DatabaseAccount
1643-
deployment.Spec.Secret = instance.Spec.Secret
16441654
deployment.Spec.TransportURLSecret = instance.Status.TransportURLSecret
16451655
deployment.Spec.ServiceAccount = instance.RbacResourceName()
16461656
deployment.Spec.TLS = instance.Spec.DesignateAPI.TLS.Ca
@@ -1681,25 +1691,22 @@ func (r *DesignateReconciler) mdnsStatefulSetCreateOrUpdate(ctx context.Context,
16811691
instance.Spec.DesignateMdns.Replicas = &minReplicas
16821692
}
16831693

1694+
if len(instance.Spec.DesignateMdns.ControlNetworkName) == 0 {
1695+
instance.Spec.DesignateMdns.ControlNetworkName = getOrDefault(instance.Spec.DesignateNetworkAttachment, "designate")
1696+
}
1697+
16841698
op, err := controllerutil.CreateOrUpdate(ctx, r.Client, statefulSet, func() error {
16851699
statefulSet.Spec = instance.Spec.DesignateMdns
16861700
// Add in transfers from umbrella Designate CR (this instance) spec
16871701
// TODO: Add logic to determine when to set/overwrite, etc
1688-
statefulSet.Spec.ServiceUser = instance.Spec.ServiceUser
1702+
copyDesignateTemplateItems(&instance.Spec.DesignateSpecBase, &statefulSet.Spec.DesignateTemplate)
16891703
statefulSet.Spec.DatabaseHostname = instance.Status.DatabaseHostname
1690-
statefulSet.Spec.DatabaseAccount = instance.Spec.DatabaseAccount
1691-
statefulSet.Spec.Secret = instance.Spec.Secret
16921704
statefulSet.Spec.TransportURLSecret = instance.Status.TransportURLSecret
16931705
statefulSet.Spec.ServiceAccount = instance.RbacResourceName()
16941706
statefulSet.Spec.TLS = instance.Spec.DesignateAPI.TLS.Ca
16951707
statefulSet.Spec.NodeSelector = instance.Spec.DesignateMdns.NodeSelector
16961708
statefulSet.Spec.TopologyRef = instance.Spec.DesignateMdns.TopologyRef
1697-
1698-
networkAttachment := "designate"
1699-
if instance.Spec.DesignateNetworkAttachment != "" {
1700-
networkAttachment = instance.Spec.DesignateNetworkAttachment
1701-
}
1702-
statefulSet.Spec.ControlNetworkName = networkAttachment
1709+
statefulSet.Spec.ControlNetworkName = instance.Spec.DesignateMdns.ControlNetworkName
17031710

17041711
err := controllerutil.SetControllerReference(instance, statefulSet, r.Scheme)
17051712
if err != nil {
@@ -1734,10 +1741,8 @@ func (r *DesignateReconciler) producerDeploymentCreateOrUpdate(ctx context.Conte
17341741
deployment.Spec = instance.Spec.DesignateProducer
17351742
// Add in transfers from umbrella Designate CR (this instance) spec
17361743
// TODO: Add logic to determine when to set/overwrite, etc
1737-
deployment.Spec.ServiceUser = instance.Spec.ServiceUser
1744+
copyDesignateTemplateItems(&instance.Spec.DesignateSpecBase, &deployment.Spec.DesignateTemplate)
17381745
deployment.Spec.DatabaseHostname = instance.Status.DatabaseHostname
1739-
deployment.Spec.DatabaseAccount = instance.Spec.DatabaseAccount
1740-
deployment.Spec.Secret = instance.Spec.Secret
17411746
deployment.Spec.TransportURLSecret = instance.Status.TransportURLSecret
17421747
deployment.Spec.ServiceAccount = instance.RbacResourceName()
17431748
deployment.Spec.RedisHostIPs = instance.Status.RedisHostIPs
@@ -1774,6 +1779,10 @@ func (r *DesignateReconciler) backendbind9StatefulSetCreateOrUpdate(ctx context.
17741779
instance.Spec.DesignateBackendbind9.TopologyRef = instance.Spec.TopologyRef
17751780
}
17761781

1782+
if len(instance.Spec.DesignateBackendbind9.ControlNetworkName) == 0 {
1783+
instance.Spec.DesignateBackendbind9.ControlNetworkName = getOrDefault(instance.Spec.DesignateNetworkAttachment, "designate")
1784+
}
1785+
17771786
op, err := controllerutil.CreateOrUpdate(ctx, r.Client, statefulSet, func() error {
17781787
statefulSet.Spec = instance.Spec.DesignateBackendbind9
17791788
// Add in transfers from umbrella Designate CR (this instance) spec
@@ -1784,6 +1793,7 @@ func (r *DesignateReconciler) backendbind9StatefulSetCreateOrUpdate(ctx context.
17841793
statefulSet.Spec.ServiceAccount = instance.RbacResourceName()
17851794
statefulSet.Spec.NodeSelector = instance.Spec.DesignateBackendbind9.NodeSelector
17861795
statefulSet.Spec.TopologyRef = instance.Spec.DesignateBackendbind9.TopologyRef
1796+
statefulSet.Spec.ControlNetworkName = instance.Spec.DesignateBackendbind9.ControlNetworkName
17871797

17881798
networkAttachment := "designate"
17891799
if instance.Spec.DesignateNetworkAttachment != "" {

tests/functional/designateapi_controller_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ var _ = Describe("DesignateAPI controller", func() {
7979
}
8080
})
8181

82+
It("should have a expected default values", func() {
83+
designateAPI := GetDesignateAPI((designateAPIName))
84+
Expect(designateAPI.Spec.ServiceUser).Should(Equal("designate"))
85+
Expect(designateAPI.Spec.DatabaseAccount).Should(Equal("designate"))
86+
Expect(designateAPI.Spec.PasswordSelectors.Service).Should(Equal("DesignatePassword"))
87+
})
88+
8289
It("should have a finalizer", func() {
8390
// the reconciler loop adds the finalizer so we have to wait for
8491
// it to run

tests/functional/designatecentral_controller_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,13 @@ var _ = Describe("DesignateCentral controller", func() {
7676
}, timeout, interval).Should(ContainElement("openstack.org/designatecentral"))
7777
})
7878

79+
It("should have a expected default values", func() {
80+
designateCentral := GetDesignateCentral((designateCentralName))
81+
Expect(designateCentral.Spec.ServiceUser).Should(Equal("designate"))
82+
Expect(designateCentral.Spec.DatabaseAccount).Should(Equal("designate"))
83+
Expect(designateCentral.Spec.PasswordSelectors.Service).Should(Equal("DesignatePassword"))
84+
})
85+
7986
It("should not create a secret", func() {
8087
secret := types.NamespacedName{
8188
Namespace: designateCentralName.Namespace,

tests/functional/designateproducer_controller_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,13 @@ var _ = Describe("DesignateProducer controller", func() {
7676
}, timeout, interval).Should(ContainElement("openstack.org/designateproducer"))
7777
})
7878

79+
It("should have a expected default values", func() {
80+
designateProducer := GetDesignateProducer((designateProducerName))
81+
Expect(designateProducer.Spec.ServiceUser).Should(Equal("designate"))
82+
Expect(designateProducer.Spec.DatabaseAccount).Should(Equal("designate"))
83+
Expect(designateProducer.Spec.PasswordSelectors.Service).Should(Equal("DesignatePassword"))
84+
})
85+
7986
It("should not create a secret", func() {
8087
secret := types.NamespacedName{
8188
Namespace: designateProducerName.Namespace,

0 commit comments

Comments
 (0)