Skip to content

Commit b62461b

Browse files
pengzhoumlPeng Zhou
andauthored
MLE-21691: fix bug for service not updated when added new port (#92)
* MLE-21691: fix bug for service not updated when added new port * Fix Labels --------- Co-authored-by: Peng Zhou <[email protected]>
1 parent 9dcf315 commit b62461b

File tree

1 file changed

+38
-51
lines changed

1 file changed

+38
-51
lines changed

pkg/k8sutil/service.go

Lines changed: 38 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package k8sutil
33
import (
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

1617
type serviceParameters struct {
18+
StsName string
1719
Ports []corev1.ServicePort
1820
Type corev1.ServiceType
1921
Annotations map[string]string
2022
}
2123

2224
func 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 {
7174
func 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,11 @@ 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-
12898
func generateService(svcName string, cr *marklogicv1.MarklogicGroup) *corev1.Service {
12999
labels := getCommonLabels(cr.Spec.Name)
130100
var svcParams serviceParameters = serviceParameters{}
131-
svcObjectMeta := generateObjectMeta(svcName, cr.Namespace, labels, svcParams.Annotations)
132101
svcParams = generateServiceParams(cr)
102+
svcObjectMeta := generateObjectMeta(svcName, cr.Namespace, labels, svcParams.Annotations)
133103
service := generateServiceDef(svcObjectMeta, marklogicServerAsOwner(cr), svcParams)
134104
return service
135105
}
@@ -139,18 +109,21 @@ func (oc *OperatorContext) ReconcileServices() result.ReconcileResult {
139109
logger.Info("service::Reconciling MarkLogic Service")
140110
client := oc.Client
141111
cr := oc.MarklogicGroup
142-
svc := &corev1.Service{}
112+
currentSvc := &corev1.Service{}
143113
headlessSvcName := cr.Spec.Name
144114
svcName := cr.Spec.Name + "-cluster"
145115
services := []string{headlessSvcName, svcName}
146116
for _, service := range services {
147117
svcNsName := types.NamespacedName{Name: service, Namespace: cr.Namespace}
148-
err := client.Get(oc.Ctx, svcNsName, svc)
118+
err := client.Get(oc.Ctx, svcNsName, currentSvc)
119+
svcDef := generateService(service, cr)
149120
if err != nil {
150121
if errors.IsNotFound(err) {
151122
logger.Info("MarkLogic service not found, creating a new one")
152-
svc = generateService(service, cr)
153-
err = client.Create(oc.Ctx, svc)
123+
if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(svcDef); err != nil {
124+
logger.Error(err, "Failed to set last applied annotation for MarkLogic service")
125+
}
126+
err = client.Create(oc.Ctx, svcDef)
154127
if err != nil {
155128
logger.Info("MarkLogic service creation has failed")
156129
return result.Error(err)
@@ -160,19 +133,33 @@ func (oc *OperatorContext) ReconcileServices() result.ReconcileResult {
160133
logger.Error(err, "MarkLogic service creation has failed")
161134
return result.Error(err)
162135
}
136+
} else {
137+
patchDiff, err := patch.DefaultPatchMaker.Calculate(currentSvc, svcDef,
138+
patch.IgnoreStatusFields(),
139+
patch.IgnoreVolumeClaimTemplateTypeMetaAndStatus(),
140+
patch.IgnoreField("kind"))
141+
142+
if err != nil {
143+
logger.Error(err, "Error calculating patch")
144+
return result.Error(err)
145+
}
146+
if !patchDiff.IsEmpty() {
147+
logger.Info("MarkLogic service spec is different from the MarkLogicGroup spec, updating the service")
148+
currentSvc.Spec = svcDef.Spec
149+
currentSvc.ObjectMeta.Annotations = svcDef.ObjectMeta.Annotations
150+
currentSvc.ObjectMeta.Labels = svcDef.ObjectMeta.Labels
151+
if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(currentSvc); err != nil {
152+
logger.Error(err, "Failed to set last applied annotation for MarkLogic service")
153+
}
154+
err := oc.Client.Update(oc.Ctx, currentSvc)
155+
if err != nil {
156+
logger.Error(err, "Error updating MarkLogic service")
157+
return result.Error(err)
158+
}
159+
} else {
160+
logger.Info("MarkLogic service spec is the same")
161+
}
163162
}
164163
}
165164
return result.Continue()
166165
}
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

Comments
 (0)