@@ -30,7 +30,6 @@ import (
3030 "k8s.io/apimachinery/pkg/api/errors"
3131 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3232 "k8s.io/apimachinery/pkg/runtime"
33- "k8s.io/apimachinery/pkg/util/intstr"
3433 ctrl "sigs.k8s.io/controller-runtime"
3534 "sigs.k8s.io/controller-runtime/pkg/client"
3635 "sigs.k8s.io/controller-runtime/pkg/log"
@@ -130,179 +129,26 @@ func (r *EtcdClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request)
130129
131130// ensureClusterObjects creates or updates all objects owned by cluster CR
132131func (r * EtcdClusterReconciler ) ensureClusterObjects (
133- ctx context.Context , cluster * etcdaenixiov1alpha1.EtcdCluster , isClusterInitialized bool ) error {
132+ ctx context.Context , cluster * etcdaenixiov1alpha1.EtcdCluster , isClusterReady bool ) error {
134133 // 1. create or update configmap <name>-cluster-state
135- if err := r . ensureClusterStateConfigMap (ctx , cluster , isClusterInitialized ); err != nil {
134+ if err := factory . CreateOrUpdateClusterStateConfigMap (ctx , cluster , isClusterReady , r . Client , r . Scheme ); err != nil {
136135 return err
137136 }
138- if err := r . ensureClusterService (ctx , cluster ); err != nil {
137+ if err := factory . CreateOrUpdateClusterService (ctx , cluster , r . Client , r . Scheme ); err != nil {
139138 return err
140139 }
141140 // 2. create or update statefulset
142141 if err := factory .CreateOrUpdateStatefulSet (ctx , cluster , r .Client , r .Scheme ); err != nil {
143142 return err
144143 }
145144 // 3. create or update ClusterIP Service
146- if err := r . ensureClusterClientService (ctx , cluster ); err != nil {
145+ if err := factory . CreateOrUpdateClientService (ctx , cluster , r . Client , r . Scheme ); err != nil {
147146 return err
148147 }
149148
150149 return nil
151150}
152151
153- func (r * EtcdClusterReconciler ) ensureClusterService (ctx context.Context , cluster * etcdaenixiov1alpha1.EtcdCluster ) error {
154- svc := & corev1.Service {}
155- err := r .Get (ctx , client.ObjectKey {
156- Namespace : cluster .Namespace ,
157- Name : cluster .Name ,
158- }, svc )
159- // Service exists, skip creation
160- if err == nil {
161- return nil
162- }
163- if ! errors .IsNotFound (err ) {
164- return fmt .Errorf ("cannot get cluster service: %w" , err )
165- }
166-
167- svc = & corev1.Service {
168- ObjectMeta : metav1.ObjectMeta {
169- Name : cluster .Name ,
170- Namespace : cluster .Namespace ,
171- Labels : map [string ]string {
172- "app.kubernetes.io/name" : "etcd" ,
173- "app.kubernetes.io/instance" : cluster .Name ,
174- "app.kubernetes.io/managed-by" : "etcd-operator" ,
175- },
176- },
177- Spec : corev1.ServiceSpec {
178- Ports : []corev1.ServicePort {
179- {Name : "peer" , TargetPort : intstr .FromInt32 (2380 ), Port : 2380 , Protocol : corev1 .ProtocolTCP },
180- {Name : "client" , TargetPort : intstr .FromInt32 (2379 ), Port : 2379 , Protocol : corev1 .ProtocolTCP },
181- },
182- Type : corev1 .ServiceTypeClusterIP ,
183- ClusterIP : "None" ,
184- Selector : map [string ]string {
185- "app.kubernetes.io/name" : "etcd" ,
186- "app.kubernetes.io/instance" : cluster .Name ,
187- "app.kubernetes.io/managed-by" : "etcd-operator" ,
188- },
189- PublishNotReadyAddresses : true ,
190- },
191- }
192- if err = ctrl .SetControllerReference (cluster , svc , r .Scheme ); err != nil {
193- return fmt .Errorf ("cannot set controller reference: %w" , err )
194- }
195- if err = r .Create (ctx , svc ); err != nil {
196- return fmt .Errorf ("cannot create cluster service: %w" , err )
197- }
198- return nil
199- }
200-
201- func (r * EtcdClusterReconciler ) ensureClusterClientService (ctx context.Context , cluster * etcdaenixiov1alpha1.EtcdCluster ) error {
202- svc := & corev1.Service {}
203- err := r .Get (ctx , client.ObjectKey {
204- Namespace : cluster .Namespace ,
205- Name : r .getClientServiceName (cluster ),
206- }, svc )
207- // Service exists, skip creation
208- if err == nil {
209- return nil
210- }
211- if ! errors .IsNotFound (err ) {
212- return fmt .Errorf ("cannot get cluster client service: %w" , err )
213- }
214-
215- svc = & corev1.Service {
216- ObjectMeta : metav1.ObjectMeta {
217- Name : r .getClientServiceName (cluster ),
218- Namespace : cluster .Namespace ,
219- Labels : map [string ]string {
220- "app.kubernetes.io/name" : "etcd" ,
221- "app.kubernetes.io/instance" : cluster .Name ,
222- "app.kubernetes.io/managed-by" : "etcd-operator" ,
223- },
224- },
225- Spec : corev1.ServiceSpec {
226- Ports : []corev1.ServicePort {
227- {Name : "client" , TargetPort : intstr .FromInt32 (2379 ), Port : 2379 , Protocol : corev1 .ProtocolTCP },
228- },
229- Type : corev1 .ServiceTypeClusterIP ,
230- Selector : map [string ]string {
231- "app.kubernetes.io/name" : "etcd" ,
232- "app.kubernetes.io/instance" : cluster .Name ,
233- "app.kubernetes.io/managed-by" : "etcd-operator" ,
234- },
235- },
236- }
237- if err = ctrl .SetControllerReference (cluster , svc , r .Scheme ); err != nil {
238- return fmt .Errorf ("cannot set controller reference: %w" , err )
239- }
240- if err = r .Create (ctx , svc ); err != nil {
241- return fmt .Errorf ("cannot create cluster client service: %w" , err )
242- }
243- return nil
244- }
245-
246- // ensureClusterStateConfigMap creates or updates cluster state configmap.
247- func (r * EtcdClusterReconciler ) ensureClusterStateConfigMap (
248- ctx context.Context , cluster * etcdaenixiov1alpha1.EtcdCluster , isClusterInitialized bool ) error {
249- configMap := & corev1.ConfigMap {}
250- err := r .Get (ctx , client.ObjectKey {
251- Namespace : cluster .Namespace ,
252- Name : factory .GetClusterStateConfigMapName (cluster ),
253- }, configMap )
254- // configmap exists, skip editing.
255- if err == nil {
256- if isClusterInitialized {
257- // update cluster state to existing
258- configMap .Data ["ETCD_INITIAL_CLUSTER_STATE" ] = "existing"
259- if err = r .Update (ctx , configMap ); err != nil {
260- return fmt .Errorf ("cannot update cluster state configmap: %w" , err )
261- }
262- }
263- return nil
264- }
265-
266- // configmap does not exist, create with cluster state "new"
267- if errors .IsNotFound (err ) {
268- initialCluster := ""
269- for i := int32 (0 ); i < * cluster .Spec .Replicas ; i ++ {
270- if i > 0 {
271- initialCluster += ","
272- }
273- initialCluster += fmt .Sprintf ("%s-%d=https://%s-%d.%s.%s.svc:2380" ,
274- cluster .Name , i ,
275- cluster .Name , i , cluster .Name , cluster .Namespace ,
276- )
277- }
278-
279- configMap = & corev1.ConfigMap {
280- ObjectMeta : metav1.ObjectMeta {
281- Namespace : cluster .Namespace ,
282- Name : factory .GetClusterStateConfigMapName (cluster ),
283- },
284- Data : map [string ]string {
285- "ETCD_INITIAL_CLUSTER_STATE" : "new" ,
286- "ETCD_INITIAL_CLUSTER" : initialCluster ,
287- "ETCD_INITIAL_CLUSTER_TOKEN" : cluster .Name + "-" + cluster .Namespace ,
288- },
289- }
290- if err := ctrl .SetControllerReference (cluster , configMap , r .Scheme ); err != nil {
291- return fmt .Errorf ("cannot set controller reference: %w" , err )
292- }
293- if err := r .Create (ctx , configMap ); err != nil {
294- return fmt .Errorf ("cannot create cluster state configmap: %w" , err )
295- }
296- return nil
297- }
298-
299- return fmt .Errorf ("cannot get cluster state configmap: %w" , err )
300- }
301-
302- func (r * EtcdClusterReconciler ) getClientServiceName (cluster * etcdaenixiov1alpha1.EtcdCluster ) string {
303- return cluster .Name + "-client"
304- }
305-
306152// updateStatusOnErr wraps error and updates EtcdCluster status
307153func (r * EtcdClusterReconciler ) updateStatusOnErr (ctx context.Context , cluster * etcdaenixiov1alpha1.EtcdCluster , err error ) (ctrl.Result , error ) {
308154 res , statusErr := r .updateStatus (ctx , cluster )
0 commit comments