@@ -3,6 +3,7 @@ package k8sutil
33import (
44 "strings"
55
6+ "github.com/cisco-open/k8s-objectmatcher/patch"
67 corev1 "k8s.io/api/core/v1"
78 "k8s.io/apimachinery/pkg/api/errors"
89 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -14,13 +15,15 @@ import (
1415)
1516
1617type serviceParameters struct {
18+ StsName string
1719 Ports []corev1.ServicePort
1820 Type corev1.ServiceType
1921 Annotations map [string ]string
2022}
2123
2224func generateServiceParams (cr * marklogicv1.MarklogicGroup ) serviceParameters {
2325 return serviceParameters {
26+ StsName : cr .Spec .Name ,
2427 Type : cr .Spec .Service .Type ,
2528 Ports : cr .Spec .Service .AdditionalPorts ,
2629 Annotations : cr .Spec .Service .Annotations ,
@@ -71,7 +74,7 @@ func generateServicePorts() []corev1.ServicePort {
7174func generateServiceDef (serviceMeta metav1.ObjectMeta , ownerRef metav1.OwnerReference , params serviceParameters ) * corev1.Service {
7275 var svcSpec corev1.ServiceSpec
7376 svcSpec = corev1.ServiceSpec {
74- Selector : serviceMeta . GetLabels ( ),
77+ Selector : getSelectorLabels ( params . StsName ),
7578 Ports : append (params .Ports , generateServicePorts ()... ),
7679 }
7780 if strings .HasSuffix (serviceMeta .Name , "-cluster" ) {
@@ -92,44 +95,17 @@ func generateServiceDef(serviceMeta metav1.ObjectMeta, ownerRef metav1.OwnerRefe
9295 return service
9396}
9497
95- func (oc * OperatorContext ) getService (namespace string , serviceName string ) (* corev1.Service , error ) {
96- logger := oc .ReqLogger
97-
98- var serviceInfo * corev1.Service
99- err := oc .Client .Get (oc .Ctx , types.NamespacedName {Name : serviceName , Namespace : namespace }, serviceInfo )
100- if err != nil {
101- logger .Info ("MarkLogic service get action is failed" )
102- return nil , err
103- }
104- logger .Info ("MarkLogic service get action is successful" )
105- return serviceInfo , nil
106- }
107-
108- func (oc * OperatorContext ) CreateOrUpdateService (namespace string , serviceMeta metav1.ObjectMeta , ownerDef metav1.OwnerReference ) error {
109- logger := oc .ReqLogger
110- serviceDef := generateServiceDef (serviceMeta , ownerDef , serviceParameters {})
111- _ , err := oc .getService (namespace , serviceMeta .Name )
112- if err != nil {
113- if errors .IsNotFound (err ) {
114- logger .Info ("MarkLogic service is not found, creating a new one" )
115- err = oc .createService (namespace , serviceDef )
116- if err != nil {
117- logger .Info ("MarkLogic service creation is failed" )
118- return err
119- }
120- logger .Info ("MarkLogic service creation is successful" )
121- return nil
122- }
123- return err
124- }
125- return nil
126- }
127-
12898func generateService (svcName string , cr * marklogicv1.MarklogicGroup ) * corev1.Service {
12999 labels := getCommonLabels (cr .Spec .Name )
100+ groupLabels := cr .Spec .Labels
101+ if groupLabels != nil {
102+ for key , value := range groupLabels {
103+ labels [key ] = value
104+ }
105+ }
130106 var svcParams serviceParameters = serviceParameters {}
131- svcObjectMeta := generateObjectMeta (svcName , cr .Namespace , labels , svcParams .Annotations )
132107 svcParams = generateServiceParams (cr )
108+ svcObjectMeta := generateObjectMeta (svcName , cr .Namespace , labels , svcParams .Annotations )
133109 service := generateServiceDef (svcObjectMeta , marklogicServerAsOwner (cr ), svcParams )
134110 return service
135111}
@@ -139,18 +115,21 @@ func (oc *OperatorContext) ReconcileServices() result.ReconcileResult {
139115 logger .Info ("service::Reconciling MarkLogic Service" )
140116 client := oc .Client
141117 cr := oc .MarklogicGroup
142- svc := & corev1.Service {}
118+ currentSvc := & corev1.Service {}
143119 headlessSvcName := cr .Spec .Name
144120 svcName := cr .Spec .Name + "-cluster"
145121 services := []string {headlessSvcName , svcName }
146122 for _ , service := range services {
147123 svcNsName := types.NamespacedName {Name : service , Namespace : cr .Namespace }
148- err := client .Get (oc .Ctx , svcNsName , svc )
124+ err := client .Get (oc .Ctx , svcNsName , currentSvc )
125+ svcDef := generateService (service , cr )
149126 if err != nil {
150127 if errors .IsNotFound (err ) {
151128 logger .Info ("MarkLogic service not found, creating a new one" )
152- svc = generateService (service , cr )
153- err = client .Create (oc .Ctx , svc )
129+ if err := patch .DefaultAnnotator .SetLastAppliedAnnotation (svcDef ); err != nil {
130+ logger .Error (err , "Failed to set last applied annotation for MarkLogic service" )
131+ }
132+ err = client .Create (oc .Ctx , svcDef )
154133 if err != nil {
155134 logger .Info ("MarkLogic service creation has failed" )
156135 return result .Error (err )
@@ -160,19 +139,33 @@ func (oc *OperatorContext) ReconcileServices() result.ReconcileResult {
160139 logger .Error (err , "MarkLogic service creation has failed" )
161140 return result .Error (err )
162141 }
142+ } else {
143+ patchDiff , err := patch .DefaultPatchMaker .Calculate (currentSvc , svcDef ,
144+ patch .IgnoreStatusFields (),
145+ patch .IgnoreVolumeClaimTemplateTypeMetaAndStatus (),
146+ patch .IgnoreField ("kind" ))
147+
148+ if err != nil {
149+ logger .Error (err , "Error calculating patch" )
150+ return result .Error (err )
151+ }
152+ if ! patchDiff .IsEmpty () {
153+ logger .Info ("MarkLogic service spec is different from the MarkLogicGroup spec, updating the service" )
154+ currentSvc .Spec = svcDef .Spec
155+ currentSvc .ObjectMeta .Annotations = svcDef .ObjectMeta .Annotations
156+ currentSvc .ObjectMeta .Labels = svcDef .ObjectMeta .Labels
157+ if err := patch .DefaultAnnotator .SetLastAppliedAnnotation (currentSvc ); err != nil {
158+ logger .Error (err , "Failed to set last applied annotation for MarkLogic service" )
159+ }
160+ err := oc .Client .Update (oc .Ctx , currentSvc )
161+ if err != nil {
162+ logger .Error (err , "Error updating MarkLogic service" )
163+ return result .Error (err )
164+ }
165+ } else {
166+ logger .Info ("MarkLogic service spec is the same" )
167+ }
163168 }
164169 }
165170 return result .Continue ()
166171}
167-
168- func (oc * OperatorContext ) createService (namespace string , service * corev1.Service ) error {
169- logger := oc .ReqLogger
170- client := oc .Client
171- err := client .Create (oc .Ctx , service )
172- if err != nil {
173- logger .Error (err , "MarkLogic service creation has failed" )
174- return err
175- }
176- logger .Info ("MarkLogic service creation is successful" )
177- return nil
178- }
0 commit comments