@@ -25,9 +25,14 @@ import (
2525 "github.com/Netcracker/pgskipper-operator/pkg/util"
2626 "go.uber.org/zap"
2727 corev1 "k8s.io/api/core/v1"
28+ "k8s.io/apimachinery/pkg/api/errors"
29+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2830 "k8s.io/apimachinery/pkg/types"
31+ "k8s.io/apimachinery/pkg/util/intstr"
2932)
3033
34+ const operatorName = "postgres-operator"
35+
3136var (
3237 log = util .GetLogger ()
3338 namespace = util .GetNameSpace ()
@@ -81,6 +86,9 @@ func InitDRManager() {
8186 if err := util .ExecuteWithRetries (pgManager .setStatus ); err != nil {
8287 log .Warn ("not able to set SM status with retries, " , zap .Error (err ))
8388 }
89+ if err := ensureOperatorService (helper ); err != nil {
90+ log .Error ("Can not ensure operator service" , zap .Error (err ))
91+ }
8492
8593 // Check if status running, then operator was restarted while site manager status was running, we decide to fail it
8694 if cr .Status .SiteManagerStatus .Status == "running" {
@@ -97,6 +105,103 @@ func InitDRManager() {
97105 http .Handle ("/pre-configure" , helper .Middleware (http .HandlerFunc (pgManager .processPreConfigureRequest )))
98106}
99107
108+ func ensureOperatorService (helper * k8sHelper.Helper ) error {
109+ client , _ := util .GetClient ()
110+ namespace := util .GetNameSpace ()
111+
112+ oServ := & corev1.Service {}
113+ err := client .Get (context .Background (), types.NamespacedName {
114+ Name : operatorName , Namespace : namespace ,
115+ }, oServ )
116+ if err != nil {
117+ if errors .IsNotFound (err ) {
118+ // this is almost copy 'n paste of /operator-framework/operator-sdk@v0.8.0/pkg/metrics/metrics.go#initOperatorService
119+ // but this does not set ownerReference to the service
120+ // hence we do not need finalizers rights
121+ log .Info ("Operator service not found, creating new one." )
122+ oServ = getOperatorService (operatorName , namespace )
123+ if err = helper .CreateServiceIfNotExists (oServ ); err != nil {
124+ log .Error (fmt .Sprintf ("can't create service: %s" , operatorName ), zap .Error (err ))
125+ return err
126+ }
127+ } else {
128+ log .Error ("can't get operator service" , zap .Error (err ))
129+ return err
130+ }
131+ return err
132+ }
133+ for _ , port := range oServ .Spec .Ports {
134+ // checking if site manager already exists
135+ if port .Name == "site-manager" || port .Port == 8080 {
136+ log .Info ("Site manager port exists, no need to update, exiting." )
137+ return nil
138+ }
139+ }
140+ oServ .Spec .Ports = append (oServ .Spec .Ports , corev1.ServicePort {
141+ Name : "site-manager" ,
142+ Protocol : corev1 .ProtocolTCP ,
143+ Port : 8080 ,
144+ TargetPort : intstr.IntOrString {
145+ Type : intstr .Int ,
146+ IntVal : 8080 ,
147+ },
148+ })
149+
150+ if err = client .Update (context .TODO (), oServ ); err != nil {
151+ log .Error (fmt .Sprintf ("can't update service: %s" , operatorName ), zap .Error (err ))
152+ return err
153+ }
154+
155+ return nil
156+ }
157+
158+ func getOperatorService (operatorName string , namespace string ) * corev1.Service {
159+ label := map [string ]string {"name" : operatorName }
160+ return & corev1.Service {
161+ ObjectMeta : metav1.ObjectMeta {
162+ Name : operatorName ,
163+ Namespace : namespace ,
164+ Labels : label ,
165+ },
166+ TypeMeta : metav1.TypeMeta {
167+ Kind : "Service" ,
168+ APIVersion : "v1" ,
169+ },
170+ Spec : corev1.ServiceSpec {
171+ Ports : []corev1.ServicePort {
172+ {
173+ Port : 8383 ,
174+ Protocol : corev1 .ProtocolTCP ,
175+ TargetPort : intstr.IntOrString {
176+ Type : intstr .Int ,
177+ IntVal : 8383 ,
178+ },
179+ Name : "metrics" ,
180+ },
181+ {
182+ Port : 8080 ,
183+ Protocol : corev1 .ProtocolTCP ,
184+ TargetPort : intstr.IntOrString {
185+ Type : intstr .Int ,
186+ IntVal : 8080 ,
187+ },
188+ Name : "site-manager" ,
189+ },
190+ {
191+ Port : 8443 ,
192+ Protocol : corev1 .ProtocolTCP ,
193+ TargetPort : intstr.IntOrString {
194+ Type : intstr .Int ,
195+ IntVal : 8443 ,
196+ },
197+ Name : "web-tls" ,
198+ },
199+ },
200+ Selector : label ,
201+ },
202+ }
203+ }
204+
100205func getCloudSqlCm (helper * k8sHelper.Helper ) * corev1.ConfigMap {
101206 cloudSqlCm , err := helper .GetConfigMap ("cloud-sql-configuration" )
102207 if err != nil {
0 commit comments