31
31
enable_feature_flag_with_a_network_partition /1 ,
32
32
mark_feature_flag_as_enabled_with_a_network_partition /1 ,
33
33
required_feature_flag_enabled_by_default /1 ,
34
+ required_plugin_feature_flag_enabled_by_default /1 ,
35
+ required_plugin_feature_flag_enabled_after_activation /1 ,
34
36
plugin_stable_ff_enabled_on_initial_node_start /1 ,
35
37
36
38
clustering_ok_with_ff_disabled_everywhere /1 ,
@@ -62,6 +64,8 @@ groups() ->
62
64
enable_feature_flag_in_a_healthy_situation ,
63
65
enable_unsupported_feature_flag_in_a_healthy_situation ,
64
66
required_feature_flag_enabled_by_default ,
67
+ required_plugin_feature_flag_enabled_by_default ,
68
+ required_plugin_feature_flag_enabled_after_activation ,
65
69
plugin_stable_ff_enabled_on_initial_node_start
66
70
]},
67
71
{enabling_in_cluster , [],
@@ -70,7 +74,9 @@ groups() ->
70
74
enable_unsupported_feature_flag_in_a_healthy_situation ,
71
75
enable_feature_flag_with_a_network_partition ,
72
76
mark_feature_flag_as_enabled_with_a_network_partition ,
73
- required_feature_flag_enabled_by_default
77
+ required_feature_flag_enabled_by_default ,
78
+ required_plugin_feature_flag_enabled_by_default ,
79
+ required_plugin_feature_flag_enabled_after_activation
74
80
]},
75
81
{clustering , [],
76
82
[
@@ -168,9 +174,10 @@ init_per_group(enabling_on_single_node, Config) ->
168
174
[{rmq_nodes_count , 1 }]),
169
175
rabbit_ct_helpers :run_setup_steps (Config1 , [fun prepare_my_plugin /1 ]);
170
176
init_per_group (enabling_in_cluster , Config ) ->
171
- rabbit_ct_helpers :set_config (
172
- Config ,
173
- [{rmq_nodes_count , 5 }]);
177
+ Config1 = rabbit_ct_helpers :set_config (
178
+ Config ,
179
+ [{rmq_nodes_count , 5 }]),
180
+ rabbit_ct_helpers :run_setup_steps (Config1 , [fun prepare_my_plugin /1 ]);
174
181
init_per_group (clustering , Config ) ->
175
182
Config1 = rabbit_ct_helpers :set_config (
176
183
Config ,
@@ -194,81 +201,89 @@ end_per_group(_, Config) ->
194
201
init_per_testcase (Testcase , Config ) ->
195
202
rabbit_ct_helpers :testcase_started (Config , Testcase ),
196
203
TestNumber = rabbit_ct_helpers :testcase_number (Config , ? MODULE , Testcase ),
197
- case ? config (tc_group_properties , Config ) of
204
+ Config1 = case Testcase of
205
+ required_plugin_feature_flag_enabled_after_activation ->
206
+ rabbit_ct_helpers :set_config (
207
+ Config ,
208
+ [{start_rmq_with_plugins_disabled , true }]);
209
+ _ ->
210
+ Config
211
+ end ,
212
+ case ? config (tc_group_properties , Config1 ) of
198
213
[{name , registry } | _ ] ->
199
214
logger :set_primary_config (level , debug ),
200
- FeatureFlagsFile = filename :join (? config (priv_dir , Config ),
215
+ FeatureFlagsFile = filename :join (? config (priv_dir , Config1 ),
201
216
rabbit_misc :format (
202
217
" feature_flags-~ts " ,
203
218
[Testcase ])),
204
219
application :set_env (rabbit , feature_flags_file , FeatureFlagsFile ),
205
220
rabbit_ct_helpers :set_config (
206
- Config , {feature_flags_file , FeatureFlagsFile });
221
+ Config1 , {feature_flags_file , FeatureFlagsFile });
207
222
[{name , Name } | _ ]
208
223
when Name =:= enabling_on_single_node orelse
209
224
Name =:= clustering orelse
210
225
Name =:= activating_plugin ->
211
- ClusterSize = ? config (rmq_nodes_count , Config ),
212
- Config1 = rabbit_ct_helpers :set_config (
213
- Config ,
226
+ ClusterSize = ? config (rmq_nodes_count , Config1 ),
227
+ Config2 = rabbit_ct_helpers :set_config (
228
+ Config1 ,
214
229
[{rmq_nodename_suffix , Testcase },
215
230
{tcp_ports_base , {skip_n_nodes ,
216
231
TestNumber * ClusterSize }}
217
232
]),
218
- Config2 = rabbit_ct_helpers :merge_app_env (
219
- Config1 ,
233
+ Config3 = rabbit_ct_helpers :merge_app_env (
234
+ Config2 ,
220
235
{rabbit ,
221
236
[{log , [{file , [{level , debug }]}]}]}),
222
- Config3 = rabbit_ct_helpers :run_steps (
223
- Config2 ,
237
+ Config4 = rabbit_ct_helpers :run_steps (
238
+ Config3 ,
224
239
rabbit_ct_broker_helpers :setup_steps () ++
225
240
rabbit_ct_client_helpers :setup_steps ()),
226
- case Config3 of
241
+ case Config4 of
227
242
{skip , _ } ->
228
- Config3 ;
243
+ Config4 ;
229
244
_ ->
230
- case is_feature_flag_subsystem_available (Config3 ) of
245
+ case is_feature_flag_subsystem_available (Config4 ) of
231
246
true ->
232
247
% % We can declare a new feature flag at
233
248
% % runtime. All of them are supported but
234
249
% % still disabled.
235
- declare_arbitrary_feature_flag (Config3 ),
236
- Config3 ;
250
+ declare_arbitrary_feature_flag (Config4 ),
251
+ Config4 ;
237
252
false ->
238
- end_per_testcase (Testcase , Config3 ),
253
+ end_per_testcase (Testcase , Config4 ),
239
254
{skip , " Feature flags subsystem unavailable" }
240
255
end
241
256
end ;
242
257
[{name , enabling_in_cluster } | _ ] ->
243
- ClusterSize = ? config (rmq_nodes_count , Config ),
244
- Config1 = rabbit_ct_helpers :set_config (
245
- Config ,
258
+ ClusterSize = ? config (rmq_nodes_count , Config1 ),
259
+ Config2 = rabbit_ct_helpers :set_config (
260
+ Config1 ,
246
261
[{rmq_nodename_suffix , Testcase },
247
262
{tcp_ports_base , {skip_n_nodes ,
248
263
TestNumber * ClusterSize }},
249
264
{net_ticktime , 5 }
250
265
]),
251
- Config2 = rabbit_ct_helpers :merge_app_env (
252
- Config1 ,
266
+ Config3 = rabbit_ct_helpers :merge_app_env (
267
+ Config2 ,
253
268
{rabbit ,
254
269
[{log , [{file , [{level , debug }]}]}]}),
255
- Config3 = rabbit_ct_helpers :run_steps (
256
- Config2 ,
270
+ Config4 = rabbit_ct_helpers :run_steps (
271
+ Config3 ,
257
272
rabbit_ct_broker_helpers :setup_steps () ++
258
273
rabbit_ct_client_helpers :setup_steps ()),
259
- case Config3 of
274
+ case Config4 of
260
275
{skip , _ } ->
261
- Config3 ;
276
+ Config4 ;
262
277
_ ->
263
- case is_feature_flag_subsystem_available (Config3 ) of
278
+ case is_feature_flag_subsystem_available (Config4 ) of
264
279
true ->
265
280
% % We can declare a new feature flag at
266
281
% % runtime. All of them are supported but
267
282
% % still disabled.
268
- declare_arbitrary_feature_flag (Config3 ),
269
- Config3 ;
283
+ declare_arbitrary_feature_flag (Config4 ),
284
+ Config4 ;
270
285
false ->
271
- end_per_testcase (Testcase , Config3 ),
286
+ end_per_testcase (Testcase , Config4 ),
272
287
{skip , " Feature flags subsystem unavailable" }
273
288
end
274
289
end
@@ -996,14 +1011,6 @@ required_feature_flag_enabled_by_default(Config) ->
996
1011
True = lists :duplicate (ClusterSize , true ),
997
1012
False = lists :duplicate (ClusterSize , false ),
998
1013
999
- % % Restart the first node to make sure it evaluates again the list of
1000
- % % required flags. Indeed, the testsuite injects its required feature
1001
- % % flag after the nodes booted and we don't want to verify a
1002
- % % testsuite-specific handling.
1003
- % [Node | _] = rabbit_ct_broker_helpers:get_node_configs(Config, nodename),
1004
- % ?assertEqual(ok, rabbit_ct_broker_helpers:stop_node(Config, Node)),
1005
- % ?assertEqual(ok, rabbit_ct_broker_helpers:start_node(Config, Node)),
1006
-
1007
1014
% % The stable feature flag is supported but disabled.
1008
1015
? assertEqual (
1009
1016
True ,
@@ -1020,6 +1027,80 @@ required_feature_flag_enabled_by_default(Config) ->
1020
1027
True ,
1021
1028
is_feature_flag_enabled (Config , RequiredFName )).
1022
1029
1030
+ required_plugin_feature_flag_enabled_by_default (Config ) ->
1031
+ StableFName = plugin_ff ,
1032
+ RequiredFName = required_plugin_ff ,
1033
+ ClusterSize = ? config (rmq_nodes_count , Config ),
1034
+ True = lists :duplicate (ClusterSize , true ),
1035
+
1036
+ % % The stable feature flag is supported and enabled because the plugin is
1037
+ % % enabled during startup.
1038
+ ? assertEqual (
1039
+ True ,
1040
+ is_feature_flag_supported (Config , StableFName )),
1041
+ ? assertEqual (
1042
+ True ,
1043
+ is_feature_flag_enabled (Config , StableFName )),
1044
+
1045
+ % % Likewise for the required feature flag.
1046
+ ? assertEqual (
1047
+ True ,
1048
+ is_feature_flag_supported (Config , RequiredFName )),
1049
+ ? assertEqual (
1050
+ True ,
1051
+ is_feature_flag_enabled (Config , RequiredFName )).
1052
+
1053
+ required_plugin_feature_flag_enabled_after_activation (Config ) ->
1054
+ StableFName = plugin_ff ,
1055
+ RequiredFName = required_plugin_ff ,
1056
+ ClusterSize = ? config (rmq_nodes_count , Config ),
1057
+ True = lists :duplicate (ClusterSize , true ),
1058
+ False = lists :duplicate (ClusterSize , false ),
1059
+
1060
+ ? assertEqual (true , ? config (start_rmq_with_plugins_disabled , Config )),
1061
+
1062
+ % % The stable feature flag is unsupported.
1063
+ ? assertEqual (
1064
+ False ,
1065
+ is_feature_flag_supported (Config , StableFName )),
1066
+ ? assertEqual (
1067
+ False ,
1068
+ is_feature_flag_enabled (Config , StableFName )),
1069
+
1070
+ % % The required feature flag is unsupported.
1071
+ ? assertEqual (
1072
+ False ,
1073
+ is_feature_flag_supported (Config , RequiredFName )),
1074
+ ? assertEqual (
1075
+ False ,
1076
+ is_feature_flag_enabled (Config , RequiredFName )),
1077
+
1078
+ rabbit_ct_broker_helpers :enable_plugin (Config , 0 , " my_plugin" ),
1079
+
1080
+ LastI = ClusterSize - 1 ,
1081
+ rabbit_ct_broker_helpers :enable_plugin (Config , LastI , " my_plugin" ),
1082
+ TrueWhereEnabled = lists :map (
1083
+ fun
1084
+ (I ) when I =:= 0 orelse I =:= LastI -> true ;
1085
+ (_ ) -> false
1086
+ end , lists :seq (0 , LastI )),
1087
+
1088
+ % % The stable feature flag is supported but disabled.
1089
+ ? assertEqual (
1090
+ True ,
1091
+ is_feature_flag_supported (Config , StableFName )),
1092
+ ? assertEqual (
1093
+ False ,
1094
+ is_feature_flag_enabled (Config , StableFName )),
1095
+
1096
+ % % The required feature flag is supported and enabled.
1097
+ ? assertEqual (
1098
+ True ,
1099
+ is_feature_flag_supported (Config , RequiredFName )),
1100
+ ? assertEqual (
1101
+ TrueWhereEnabled ,
1102
+ is_feature_flag_enabled (Config , RequiredFName )).
1103
+
1023
1104
plugin_stable_ff_enabled_on_initial_node_start (Config ) ->
1024
1105
? assertEqual ([true ], is_feature_flag_supported (Config , plugin_ff )),
1025
1106
? assertEqual ([true ], is_feature_flag_enabled (Config , plugin_ff )),
0 commit comments