Skip to content

Commit f6ae5ee

Browse files
authored
Merge pull request #3 from ucloud/fixed/wait_sentinel_ready
Fixed/wait sentinel ready
2 parents f9a5871 + 92b0e41 commit f6ae5ee

File tree

15 files changed

+367
-126
lines changed

15 files changed

+367
-126
lines changed

cmd/manager/main.go

+3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"github.com/ucloud/redis-operator/pkg/apis"
1515
"github.com/ucloud/redis-operator/pkg/controller"
16+
"github.com/ucloud/redis-operator/pkg/controller/rediscluster"
1617
clusterMetrics "github.com/ucloud/redis-operator/pkg/metrics"
1718
"github.com/ucloud/redis-operator/pkg/util"
1819

@@ -53,6 +54,8 @@ func main() {
5354
// be added before calling pflag.Parse().
5455
pflag.CommandLine.AddFlagSet(zap.FlagSet())
5556

57+
pflag.CommandLine.AddFlagSet(rediscluster.FlagSet())
58+
5659
// Add flags registered by imported packages (e.g. glog and
5760
// controller-runtime)
5861
pflag.CommandLine.AddGoFlagSet(flag.CommandLine)

go.mod

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
module github.com/ucloud/redis-operator
22

33
require (
4-
github.com/NYTimes/gziphandler v1.0.1 // indirect
54
github.com/go-logr/logr v0.1.0
65
github.com/go-redis/redis v6.15.2+incompatible
76
github.com/onsi/ginkgo v1.7.0
@@ -32,3 +31,5 @@ replace (
3231
sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.1.12
3332
sigs.k8s.io/controller-tools => sigs.k8s.io/controller-tools v0.1.11-0.20190411181648-9d55346c2bde
3433
)
34+
35+
go 1.13

go.sum

+7-7
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
55
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
66
cloud.google.com/go v0.37.2 h1:4y4L7BdHenTfZL0HervofNTHh9Ad6mNX72cQvl+5eH0=
77
cloud.google.com/go v0.37.2/go.mod h1:H8IAquKe2L30IxoupDgqTaQvKSwF/c8prYHynGIWQbA=
8-
contrib.go.opencensus.io/exporter/ocagent v0.4.9/go.mod h1:ueLzZcP7LPhPulEBukGn4aLh7Mx9YJwpVJ9nL2FYltw=
98
contrib.go.opencensus.io/exporter/ocagent v0.4.11 h1:Zwy9skaqR2igcEfSVYDuAsbpa33N0RPtnYTHEe2whPI=
109
contrib.go.opencensus.io/exporter/ocagent v0.4.11/go.mod h1:7ihiYRbdcVfW4m4wlXi9WRPdv79C0fStcjNlyE6ek9s=
1110
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
1211
git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
1312
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
1413
github.com/Azure/go-autorest v11.1.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
15-
github.com/Azure/go-autorest v11.5.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
1614
github.com/Azure/go-autorest v11.7.0+incompatible h1:gzma19dc9ejB75D90E5S+/wXouzpZyA+CV+/MJPSD/k=
1715
github.com/Azure/go-autorest v11.7.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
1816
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
@@ -91,6 +89,7 @@ github.com/evanphx/json-patch v4.1.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi
9189
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4=
9290
github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=
9391
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
92+
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
9493
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
9594
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
9695
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
@@ -101,7 +100,6 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
101100
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
102101
github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg=
103102
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
104-
github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
105103
github.com/go-logr/zapr v0.1.1 h1:qXBXPDdNncunGs7XeEpsJt8wCjYBygluzfdLO0G5baE=
106104
github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
107105
github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
@@ -120,7 +118,6 @@ github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6
120118
github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
121119
github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
122120
github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
123-
github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
124121
github.com/go-openapi/spec v0.19.0 h1:A4SZ6IWh3lnjH0rG0Z5lkxazMGBECtrZcbyYQi+64k4=
125122
github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
126123
github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
@@ -145,6 +142,7 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a
145142
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
146143
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
147144
github.com/golang/glog v0.0.0-20141105023935-44145f04b68c/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
145+
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
148146
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
149147
github.com/golang/groupcache v0.0.0-20180924190550-6f2cf27854a4/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
150148
github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -161,6 +159,7 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l
161159
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
162160
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
163161
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
162+
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
164163
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
165164
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
166165
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
@@ -180,7 +179,6 @@ github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsC
180179
github.com/googleapis/gnostic v0.2.0 h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhpy9g=
181180
github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
182181
github.com/gophercloud/gophercloud v0.0.0-20180330165814-781450b3c4fc/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4=
183-
github.com/gophercloud/gophercloud v0.0.0-20190318015731-ff9851476e98/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
184182
github.com/gophercloud/gophercloud v0.0.0-20190408160324-6c7ac67f8855 h1:3dfUujjROkkXcwIpsh9z6bjOhPFooLpxejc7qgX13/g=
185183
github.com/gophercloud/gophercloud v0.0.0-20190408160324-6c7ac67f8855/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
186184
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
@@ -229,10 +227,12 @@ github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f26
229227
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
230228
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
231229
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
230+
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
232231
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
233232
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
234233
github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
235234
github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
235+
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
236236
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
237237
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
238238
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
@@ -280,7 +280,6 @@ github.com/operator-framework/operator-registry v1.0.1/go.mod h1:1xEdZjjUg2hPEd5
280280
github.com/operator-framework/operator-registry v1.0.4/go.mod h1:hve6YwcjM2nGVlscLtNsp9sIIBkNZo6jlJgzWw7vP9s=
281281
github.com/operator-framework/operator-sdk v0.8.1-0.20190711220207-283ac6f58bec h1:e84CuDFGCiXcehOzXgxSY80wWwWO1/HcuMm3HDTWy58=
282282
github.com/operator-framework/operator-sdk v0.8.1-0.20190711220207-283ac6f58bec/go.mod h1:7eW7ldXmvenehIMVdO2zCdERf/828Mrftq4u7GS0I68=
283-
github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34=
284283
github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g=
285284
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
286285
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
@@ -488,6 +487,7 @@ google.golang.org/grpc v1.19.1 h1:TrBcJ1yqAl1G++wO39nD/qtgpsW9/1+QGrluyMGEYgM=
488487
google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
489488
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
490489
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
490+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
491491
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
492492
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
493493
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
@@ -550,7 +550,7 @@ sigs.k8s.io/controller-runtime v0.1.12/go.mod h1:HFAYoOh6XMV+jKF1UjFwrknPbowfyHE
550550
sigs.k8s.io/controller-tools v0.1.11-0.20190411181648-9d55346c2bde h1:ZkaHf5rNYzIB6CB82keKMQNv7xxkqT0ylOBdfJPfi+k=
551551
sigs.k8s.io/controller-tools v0.1.11-0.20190411181648-9d55346c2bde/go.mod h1:ATWLRP3WGxuAN9HcT2LaKHReXIH+EZGzRuMHuxjXfhQ=
552552
sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
553-
sigs.k8s.io/testing_frameworks v0.1.0/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U=
553+
sigs.k8s.io/testing_frameworks v0.1.1 h1:cP2l8fkA3O9vekpy5Ks8mmA0NW/F7yBdXf8brkWhVrs=
554554
sigs.k8s.io/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U=
555555
sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
556556
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=

pkg/client/k8s/configmap.go

+13
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ type ConfigMap interface {
2424
DeleteConfigMap(namespace string, name string) error
2525
// ListConfigMaps get set of ConfigMaps on a given namespace
2626
ListConfigMaps(namespace string) (*corev1.ConfigMapList, error)
27+
CreateIfNotExistsConfigMap(namespace string, configMap *corev1.ConfigMap) error
2728
}
2829

2930
// ConfigMapOption is the configMap client interface implementation that using API calls to kubernetes.
@@ -75,6 +76,18 @@ func (p *ConfigMapOption) UpdateConfigMap(namespace string, configMap *corev1.Co
7576
return nil
7677
}
7778

79+
// CreateIfNotExistsConfigMap implement the ConfigMap.Interface
80+
func (p *ConfigMapOption) CreateIfNotExistsConfigMap(namespace string, configMap *corev1.ConfigMap) error {
81+
if _, err := p.GetConfigMap(namespace, configMap.Name); err != nil {
82+
// If no resource we need to create.
83+
if errors.IsNotFound(err) {
84+
return p.CreateConfigMap(namespace, configMap)
85+
}
86+
return err
87+
}
88+
return nil
89+
}
90+
7891
// CreateOrUpdateConfigMap implement the ConfigMap.Interface
7992
func (p *ConfigMapOption) CreateOrUpdateConfigMap(namespace string, configMap *corev1.ConfigMap) error {
8093
storedConfigMap, err := p.GetConfigMap(namespace, configMap.Name)

pkg/client/k8s/poddisruptionbudget.go

+15
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type PodDisruptionBudget interface {
2323
CreateOrUpdatePodDisruptionBudget(namespace string, podDisruptionBudget *policyv1beta1.PodDisruptionBudget) error
2424
// DeletePodDisruptionBudget will delete the given podDisruptionBudget
2525
DeletePodDisruptionBudget(namespace string, name string) error
26+
CreateIfNotExistsPodDisruptionBudget(namespace string, podDisruptionBudget *policyv1beta1.PodDisruptionBudget) error
2627
}
2728

2829
// PodDisruptionBudgetOption is the podDisruptionBudget client implementation using API calls to kubernetes.
@@ -92,6 +93,20 @@ func (p *PodDisruptionBudgetOption) CreateOrUpdatePodDisruptionBudget(namespace
9293
return p.UpdatePodDisruptionBudget(namespace, podDisruptionBudget)
9394
}
9495

96+
// CreateIfNotExistsPodDisruptionBudget implement the PodDisruptionBudget.Interface
97+
func (p *PodDisruptionBudgetOption) CreateIfNotExistsPodDisruptionBudget(namespace string, podDisruptionBudget *policyv1beta1.PodDisruptionBudget) error {
98+
_, err := p.GetPodDisruptionBudget(namespace, podDisruptionBudget.Name)
99+
if err != nil {
100+
// If no resource we need to create.
101+
if errors.IsNotFound(err) {
102+
return p.CreatePodDisruptionBudget(namespace, podDisruptionBudget)
103+
}
104+
return err
105+
}
106+
107+
return nil
108+
}
109+
95110
// DeletePodDisruptionBudget implement the PodDisruptionBudget.Interface
96111
func (p *PodDisruptionBudgetOption) DeletePodDisruptionBudget(namespace string, name string) error {
97112
podDisruptionBudget := &policyv1beta1.PodDisruptionBudget{}

pkg/client/k8s/statefulset.go

+19-5
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@ package k8s
33
import (
44
"context"
55
"fmt"
6+
7+
"github.com/go-logr/logr"
68
appsv1 "k8s.io/api/apps/v1"
79
corev1 "k8s.io/api/core/v1"
810
"k8s.io/apimachinery/pkg/api/errors"
911
"k8s.io/apimachinery/pkg/labels"
1012
"k8s.io/apimachinery/pkg/types"
11-
1213
"sigs.k8s.io/controller-runtime/pkg/client"
13-
14-
"github.com/go-logr/logr"
1514
)
1615

1716
// StatefulSet the StatefulSet client that knows how to interact with kubernetes to manage them
@@ -30,6 +29,7 @@ type StatefulSet interface {
3029
DeleteStatefulSet(namespace string, name string) error
3130
// ListStatefulSets get set of StatefulSet on a given namespace
3231
ListStatefulSets(namespace string) (*appsv1.StatefulSetList, error)
32+
CreateIfNotExistsStatefulSet(namespace string, statefulSet *appsv1.StatefulSet) error
3333
}
3434

3535
// StatefulSetOption is the StatefulSet client implementation using API calls to kubernetes.
@@ -112,14 +112,28 @@ func (s *StatefulSetOption) CreateOrUpdateStatefulSet(namespace string, stateful
112112
// Set the correct resource version to ensure we are on the latest version. This way the only valid
113113
// namespace is our spec(https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#concurrency-control-and-consistency),
114114
// we will replace the current namespace state.
115-
s.logger.WithValues("namespace", namespace, "storedStatefulSet", statefulSet.ObjectMeta.Name).V(3).Info(fmt.Sprintf("storedStatefulSet Spec:\n %+v", storedStatefulSet))
115+
s.logger.WithValues("namespace", namespace, "storedStatefulSet", statefulSet.ObjectMeta.Name).V(5).Info(fmt.Sprintf("storedStatefulSet Spec:\n %+v", storedStatefulSet))
116116

117117
statefulSet.ResourceVersion = storedStatefulSet.ResourceVersion
118-
s.logger.WithValues("namespace", namespace, "statefulSet", statefulSet.ObjectMeta.Name).V(3).Info(fmt.Sprintf("Stateful Spec:\n %+v", statefulSet))
118+
s.logger.WithValues("namespace", namespace, "statefulSet", statefulSet.ObjectMeta.Name).V(5).Info(fmt.Sprintf("Stateful Spec:\n %+v", statefulSet))
119119

120120
return s.UpdateStatefulSet(namespace, statefulSet)
121121
}
122122

123+
// CreateIfNotExistsStatefulSet implement the StatefulSet.Interface
124+
func (s *StatefulSetOption) CreateIfNotExistsStatefulSet(namespace string, statefulSet *appsv1.StatefulSet) error {
125+
_, err := s.GetStatefulSet(namespace, statefulSet.Name)
126+
if err != nil {
127+
// If no resource we need to create.
128+
if errors.IsNotFound(err) {
129+
return s.CreateStatefulSet(namespace, statefulSet)
130+
}
131+
return err
132+
}
133+
134+
return nil
135+
}
136+
123137
// DeleteStatefulSet implement the StatefulSet.Interface
124138
func (s *StatefulSetOption) DeleteStatefulSet(namespace, name string) error {
125139
statefulset := &appsv1.StatefulSet{}

pkg/controller/rediscluster/checker.go

+39-12
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@ package rediscluster
33
import (
44
"errors"
55
"fmt"
6-
"github.com/ucloud/redis-operator/pkg/controller/clustercache"
76
"time"
7+
8+
redisv1beta1 "github.com/ucloud/redis-operator/pkg/apis/redis/v1beta1"
9+
"github.com/ucloud/redis-operator/pkg/controller/clustercache"
10+
"github.com/ucloud/redis-operator/pkg/util"
811
)
912

1013
const (
11-
timeToPrepare = 2 * time.Minute
14+
checkInterval = 5 * time.Second
15+
timeOut = 30 * time.Second
1216
needRequeueMsg = "need requeue"
1317
)
1418

@@ -33,9 +37,8 @@ func (r *RedisClusterHandler) CheckAndHeal(meta *clustercache.Meta) error {
3337
return needRequeueErr
3438
}
3539
if err := r.rcChecker.CheckSentinelNumber(meta.Obj); err != nil {
36-
r.logger.WithValues("namespace", meta.Obj.Namespace, "name", meta.Obj.Name).V(2).Info("number of sentinel mismatch, this could be for a change on the deployment")
37-
r.eventsCli.UpdateCluster(meta.Obj, "wait for all redis sentinel start")
38-
return needRequeueErr
40+
r.eventsCli.FailedCluster(meta.Obj, err.Error())
41+
return nil
3942
}
4043

4144
nMasters, err := r.rcChecker.GetNumberMasters(meta.Obj, meta.Auth)
@@ -97,18 +100,24 @@ func (r *RedisClusterHandler) CheckAndHeal(meta *clustercache.Meta) error {
97100
}
98101
}
99102
}
103+
// TODO: check sentinel's number
104+
//for _, sip := range sentinels {
105+
// if err := r.rcChecker.CheckSentinelNumberInMemory(sip, meta.Obj, meta.Auth); err != nil {
106+
// r.logger.WithValues("namespace", meta.Obj.Namespace, "name", meta.Obj.Name).Info(err.Error())
107+
// if err := r.rcHealer.RestoreSentinel(sip, meta.Auth); err != nil {
108+
// return err
109+
// }
110+
// return needRequeueErr
111+
// }
112+
//}
100113
for _, sip := range sentinels {
101-
if err := r.rcChecker.CheckSentinelNumberInMemory(sip, meta.Obj, meta.Auth); err != nil {
114+
if err := r.rcChecker.CheckSentinelSlavesNumberInMemory(sip, meta.Obj, meta.Auth); err != nil {
102115
r.logger.WithValues("namespace", meta.Obj.Namespace, "name", meta.Obj.Name).Info(err.Error())
103116
if err := r.rcHealer.RestoreSentinel(sip, meta.Auth); err != nil {
104117
return err
105118
}
106-
}
107-
}
108-
for _, sip := range sentinels {
109-
if err := r.rcChecker.CheckSentinelSlavesNumberInMemory(sip, meta.Obj, meta.Auth); err != nil {
110-
r.logger.WithValues("namespace", meta.Obj.Namespace, "name", meta.Obj.Name).Info(err.Error())
111-
if err := r.rcHealer.RestoreSentinel(sip, meta.Auth); err != nil {
119+
if err := r.waitRestoreSentinelOK(sip, meta.Obj, meta.Auth); err != nil {
120+
r.logger.WithValues("namespace", meta.Obj.Namespace, "name", meta.Obj.Name).Info(err.Error())
112121
return err
113122
}
114123
}
@@ -151,3 +160,21 @@ func (r *RedisClusterHandler) setSentinelConfig(meta *clustercache.Meta, sentine
151160
}
152161
return nil
153162
}
163+
164+
func (r *RedisClusterHandler) waitRestoreSentinelOK(sentinel string, rc *redisv1beta1.RedisCluster, auth *util.AuthConfig) error {
165+
timer := time.NewTimer(timeOut)
166+
defer timer.Stop()
167+
for {
168+
select {
169+
case <-timer.C:
170+
return fmt.Errorf("wait for resetore sentinel timeout")
171+
default:
172+
if err := r.rcChecker.CheckSentinelSlavesNumberInMemory(sentinel, rc, auth); err != nil {
173+
r.logger.WithValues("namespace", rc.Namespace, "name", rc.Name).Info(err.Error())
174+
time.Sleep(checkInterval)
175+
} else {
176+
return nil
177+
}
178+
}
179+
}
180+
}

0 commit comments

Comments
 (0)