@@ -92,136 +92,99 @@ func TestConfigFileOtherFields(t *testing.T) {
92
92
assert .Equal (t , false , cfg .SocketOpts .ReuseAddress , "ReuseAddress does not match" )
93
93
}
94
94
95
- func TestConfigFileFeatureGates (t * testing.T ) {
96
- testCases := []struct {
97
- name string
98
- serverFeatureGatesJSON string
99
- experimentalStopGRPCServiceOnDefrag string
100
- experimentalInitialCorruptCheck string
101
- expectErr bool
102
- expectedFeatures map [featuregate.Feature ]bool
103
- }{
104
- {
105
- name : "default" ,
106
- expectedFeatures : map [featuregate.Feature ]bool {
107
- features .DistributedTracing : false ,
108
- features .StopGRPCServiceOnDefrag : false ,
109
- features .InitialCorruptCheck : false ,
110
- },
111
- },
95
+ func defaultFeatureGates () map [featuregate.Feature ]bool {
96
+ fgs := make (map [featuregate.Feature ]bool )
97
+ for fg , fgspec := range features .DefaultEtcdServerFeatureGates {
98
+ fgs [fg ] = fgspec .Default
99
+ }
100
+ return fgs
101
+ }
102
+
103
+ func defaultFeatureGatesWithFG (fg featuregate.Feature , enabled bool ) map [featuregate.Feature ]bool {
104
+ fgs := defaultFeatureGates ()
105
+ fgs [fg ] = enabled
106
+ return fgs
107
+ }
108
+
109
+ func defaultFeatureGatesWithFGs (fgs2 []featuregate.Feature , enabled bool ) map [featuregate.Feature ]bool {
110
+ fgs := defaultFeatureGates ()
111
+ for _ , f := range fgs2 {
112
+ fgs [f ] = enabled
113
+ }
114
+ return fgs
115
+ }
116
+
117
+ func testCasesForFeaturegate (experimentalKey , fgname string , fg featuregate.Feature ) []featureTestCase {
118
+ return []featureTestCase {
112
119
{
113
- name : "cannot set both experimental flag and feature gate flag" ,
114
- serverFeatureGatesJSON : "StopGRPCServiceOnDefrag=true" ,
115
- experimentalStopGRPCServiceOnDefrag : "false" ,
116
- expectErr : true ,
120
+ name : "cannot set both experimental flag and feature gate flag" ,
121
+ serverFeatureGatesJSON : fgname + "=true" ,
122
+ experimentalKey : experimentalKey ,
123
+ experimentalValue : false ,
124
+ expectErr : true ,
117
125
},
118
126
{
119
- name : "cannot set both experimental flag and feature gate flag for InitialCorruptCheck " ,
120
- serverFeatureGatesJSON : "InitialCorruptCheck=true" ,
121
- experimentalInitialCorruptCheck : "false" ,
122
- expectErr : true ,
127
+ name : "can set feature gate to true from experimental flag" ,
128
+ experimentalKey : experimentalKey ,
129
+ experimentalValue : true ,
130
+ expectedFeatures : defaultFeatureGatesWithFG ( fg , true ) ,
123
131
},
124
132
{
125
- name : "ok to set different experimental flag and feature gate flag" ,
126
- serverFeatureGatesJSON : "DistributedTracing=true" ,
127
- experimentalStopGRPCServiceOnDefrag : "true" ,
128
- expectedFeatures : map [featuregate.Feature ]bool {
129
- features .DistributedTracing : true ,
130
- features .StopGRPCServiceOnDefrag : true ,
131
- features .InitialCorruptCheck : false ,
132
- },
133
+ name : "can set feature gate to false from experimental flag" ,
134
+ experimentalKey : experimentalKey ,
135
+ experimentalValue : false ,
136
+ expectedFeatures : defaultFeatureGatesWithFG (fg , false ),
133
137
},
134
138
{
135
- name : "can set feature gate to true from experimental flag" ,
136
- experimentalStopGRPCServiceOnDefrag : "true" ,
137
- expectedFeatures : map [featuregate.Feature ]bool {
138
- features .StopGRPCServiceOnDefrag : true ,
139
- features .DistributedTracing : false ,
140
- features .InitialCorruptCheck : false ,
141
- },
139
+ name : "can set feature gate " + fgname + " to true from feature gate flag" ,
140
+ serverFeatureGatesJSON : fgname + "=true" ,
141
+ expectedFeatures : defaultFeatureGatesWithFG (fg , true ),
142
142
},
143
143
{
144
- name : "can set feature gate to false from experimental flag" ,
145
- experimentalStopGRPCServiceOnDefrag : "false" ,
146
- expectedFeatures : map [featuregate.Feature ]bool {
147
- features .StopGRPCServiceOnDefrag : false ,
148
- features .DistributedTracing : false ,
149
- features .InitialCorruptCheck : false ,
150
- },
151
- },
152
- {
153
- name : "can set feature gate experimentalInitialCorruptCheck to true from experimental flag" ,
154
- experimentalInitialCorruptCheck : "true" ,
155
- expectedFeatures : map [featuregate.Feature ]bool {
156
- features .StopGRPCServiceOnDefrag : false ,
157
- features .DistributedTracing : false ,
158
- features .InitialCorruptCheck : true ,
159
- },
160
- },
161
- {
162
- name : "can set feature gate experimentalInitialCorruptCheck to false from experimental flag" ,
163
- experimentalInitialCorruptCheck : "false" ,
164
- expectedFeatures : map [featuregate.Feature ]bool {
165
- features .StopGRPCServiceOnDefrag : false ,
166
- features .DistributedTracing : false ,
167
- features .InitialCorruptCheck : false ,
168
- },
169
- },
170
- {
171
- name : "can set feature gate StopGRPCServiceOnDefrag to true from feature gate flag" ,
172
- serverFeatureGatesJSON : "StopGRPCServiceOnDefrag=true" ,
173
- expectedFeatures : map [featuregate.Feature ]bool {
174
- features .StopGRPCServiceOnDefrag : true ,
175
- features .DistributedTracing : false ,
176
- features .InitialCorruptCheck : false ,
177
- },
144
+ name : "can set feature gate to false from feature gate flag" ,
145
+ serverFeatureGatesJSON : fgname + "=false" ,
146
+ expectedFeatures : defaultFeatureGatesWithFG (fg , false ),
178
147
},
148
+ }
149
+ }
150
+
151
+ type featureTestCase struct {
152
+ name string
153
+ serverFeatureGatesJSON string
154
+ expectErr bool
155
+ expectedFeatures map [featuregate.Feature ]bool
156
+ experimentalKey string
157
+ experimentalValue bool
158
+ }
159
+
160
+ func TestConfigFileFeatureGates (t * testing.T ) {
161
+ testCases := []featureTestCase {
179
162
{
180
- name : "can set feature gate InitialCorruptCheck to true from feature gate flag" ,
181
- serverFeatureGatesJSON : "InitialCorruptCheck=true" ,
182
- expectedFeatures : map [featuregate.Feature ]bool {
183
- features .StopGRPCServiceOnDefrag : false ,
184
- features .DistributedTracing : false ,
185
- features .InitialCorruptCheck : true ,
186
- },
163
+ name : "default" ,
164
+ expectedFeatures : defaultFeatureGates (),
187
165
},
188
166
{
189
- name : "can set feature gate to false from feature gate flag" ,
190
- serverFeatureGatesJSON : "StopGRPCServiceOnDefrag=false" ,
191
- expectedFeatures : map [featuregate.Feature ]bool {
192
- features .StopGRPCServiceOnDefrag : false ,
193
- features .DistributedTracing : false ,
194
- features .InitialCorruptCheck : false ,
195
- },
167
+ name : "ok to set different experimental flag and feature gate flag" ,
168
+ serverFeatureGatesJSON : "DistributedTracing=true" ,
169
+ experimentalKey : "experimental-stop-grpc-service-on-defrag" ,
170
+ experimentalValue : true ,
171
+ expectedFeatures : defaultFeatureGatesWithFGs ([]featuregate.Feature {features .StopGRPCServiceOnDefrag , features .DistributedTracing }, true ),
196
172
},
197
173
}
174
+
175
+ testCases = append (testCases , testCasesForFeaturegate ("experimental-stop-grpc-service-on-defrag" , "StopGRPCServiceOnDefrag" , features .StopGRPCServiceOnDefrag )... )
176
+ testCases = append (testCases , testCasesForFeaturegate ("experimental-initial-corrupt-check" , "InitialCorruptCheck" , features .InitialCorruptCheck )... )
177
+
198
178
for _ , tc := range testCases {
199
179
t .Run (tc .name , func (t * testing.T ) {
200
- yc := struct {
201
- ExperimentalStopGRPCServiceOnDefrag * bool `json:"experimental-stop-grpc-service-on-defrag,omitempty"`
202
- ExperimentalInitialCorruptCheck * bool `json:"experimental-initial-corrupt-check,omitempty"`
203
- ServerFeatureGatesJSON string `json:"feature-gates"`
204
- }{
205
- ServerFeatureGatesJSON : tc .serverFeatureGatesJSON ,
206
- }
180
+ ycmap := make (map [string ]interface {})
181
+ ycmap ["feature-gates" ] = tc .serverFeatureGatesJSON
207
182
208
- if tc .experimentalInitialCorruptCheck != "" {
209
- experimentalInitialCorruptCheck , err := strconv .ParseBool (tc .experimentalInitialCorruptCheck )
210
- if err != nil {
211
- t .Fatal (err )
212
- }
213
- yc .ExperimentalInitialCorruptCheck = & experimentalInitialCorruptCheck
214
- }
215
-
216
- if tc .experimentalStopGRPCServiceOnDefrag != "" {
217
- experimentalStopGRPCServiceOnDefrag , err := strconv .ParseBool (tc .experimentalStopGRPCServiceOnDefrag )
218
- if err != nil {
219
- t .Fatal (err )
220
- }
221
- yc .ExperimentalStopGRPCServiceOnDefrag = & experimentalStopGRPCServiceOnDefrag
183
+ if tc .experimentalKey != "" {
184
+ ycmap [tc .experimentalKey ] = tc .experimentalValue
222
185
}
223
186
224
- b , err := yaml .Marshal (& yc )
187
+ b , err := yaml .Marshal (ycmap )
225
188
if err != nil {
226
189
t .Fatal (err )
227
190
}
0 commit comments