@@ -3,7 +3,6 @@ package k8sutil
33import (
44 "strings"
55
6- "github.com/cisco-open/k8s-objectmatcher/patch"
76 corev1 "k8s.io/api/core/v1"
87 "k8s.io/apimachinery/pkg/api/errors"
98 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -15,15 +14,13 @@ import (
1514)
1615
1716type serviceParameters struct {
18- StsName string
1917 Ports []corev1.ServicePort
2018 Type corev1.ServiceType
2119 Annotations map [string ]string
2220}
2321
2422func generateServiceParams (cr * marklogicv1.MarklogicGroup ) serviceParameters {
2523 return serviceParameters {
26- StsName : cr .Spec .Name ,
2724 Type : cr .Spec .Service .Type ,
2825 Ports : cr .Spec .Service .AdditionalPorts ,
2926 Annotations : cr .Spec .Service .Annotations ,
@@ -74,7 +71,7 @@ func generateServicePorts() []corev1.ServicePort {
7471func generateServiceDef (serviceMeta metav1.ObjectMeta , ownerRef metav1.OwnerReference , params serviceParameters ) * corev1.Service {
7572 var svcSpec corev1.ServiceSpec
7673 svcSpec = corev1.ServiceSpec {
77- Selector : getSelectorLabels ( params . StsName ),
74+ Selector : serviceMeta . GetLabels ( ),
7875 Ports : append (params .Ports , generateServicePorts ()... ),
7976 }
8077 if strings .HasSuffix (serviceMeta .Name , "-cluster" ) {
@@ -95,17 +92,44 @@ func generateServiceDef(serviceMeta metav1.ObjectMeta, ownerRef metav1.OwnerRefe
9592 return service
9693}
9794
98- func generateService (svcName string , cr * marklogicv1.MarklogicGroup ) * corev1.Service {
99- labels := getCommonLabels (cr .Spec .Name )
100- groupLabels := cr .Spec .Labels
101- if groupLabels != nil {
102- for key , value := range groupLabels {
103- labels [key ] = value
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
104122 }
123+ return err
105124 }
125+ return nil
126+ }
127+
128+ func generateService (svcName string , cr * marklogicv1.MarklogicGroup ) * corev1.Service {
129+ labels := getCommonLabels (cr .Spec .Name )
106130 var svcParams serviceParameters = serviceParameters {}
107- svcParams = generateServiceParams (cr )
108131 svcObjectMeta := generateObjectMeta (svcName , cr .Namespace , labels , svcParams .Annotations )
132+ svcParams = generateServiceParams (cr )
109133 service := generateServiceDef (svcObjectMeta , marklogicServerAsOwner (cr ), svcParams )
110134 return service
111135}
@@ -115,21 +139,18 @@ func (oc *OperatorContext) ReconcileServices() result.ReconcileResult {
115139 logger .Info ("service::Reconciling MarkLogic Service" )
116140 client := oc .Client
117141 cr := oc .MarklogicGroup
118- currentSvc := & corev1.Service {}
142+ svc := & corev1.Service {}
119143 headlessSvcName := cr .Spec .Name
120144 svcName := cr .Spec .Name + "-cluster"
121145 services := []string {headlessSvcName , svcName }
122146 for _ , service := range services {
123147 svcNsName := types.NamespacedName {Name : service , Namespace : cr .Namespace }
124- err := client .Get (oc .Ctx , svcNsName , currentSvc )
125- svcDef := generateService (service , cr )
148+ err := client .Get (oc .Ctx , svcNsName , svc )
126149 if err != nil {
127150 if errors .IsNotFound (err ) {
128151 logger .Info ("MarkLogic service not found, creating a new one" )
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 )
152+ svc = generateService (service , cr )
153+ err = client .Create (oc .Ctx , svc )
133154 if err != nil {
134155 logger .Info ("MarkLogic service creation has failed" )
135156 return result .Error (err )
@@ -139,33 +160,19 @@ func (oc *OperatorContext) ReconcileServices() result.ReconcileResult {
139160 logger .Error (err , "MarkLogic service creation has failed" )
140161 return result .Error (err )
141162 }
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- }
168163 }
169164 }
170165 return result .Continue ()
171166}
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