10
10
-include_lib (" common_test/include/ct.hrl" ).
11
11
-include_lib (" amqp_client/include/amqp_client.hrl" ).
12
12
13
+
13
14
-compile (export_all ).
14
15
15
16
all () ->
@@ -20,6 +21,7 @@ all() ->
20
21
groups () ->
21
22
[
22
23
{cluster_size_2 , [], [
24
+ target_count_policy ,
23
25
policy_ttl ,
24
26
operator_policy_ttl ,
25
27
operator_retroactive_policy_ttl ,
@@ -149,13 +151,72 @@ operator_retroactive_policy_publish_ttl(Config) ->
149
151
rabbit_ct_client_helpers :close_connection (Conn ),
150
152
passed .
151
153
154
+ target_count_policy (Config ) ->
155
+ [Server | _ ] = Nodes = rabbit_ct_broker_helpers :get_node_configs (Config , nodename ),
156
+ {Conn , Ch } = rabbit_ct_client_helpers :open_connection_and_channel (Config , 0 ),
157
+ QName = <<" policy_ha" >>,
158
+ declare (Ch , QName ),
159
+ BNodes = [atom_to_binary (N ) || N <- Nodes ],
160
+
161
+ AllPolicy = [{<<" ha-mode" >>, <<" all" >>}],
162
+ ExactlyPolicyOne = [{<<" ha-mode" >>, <<" exactly" >>},
163
+ {<<" ha-params" >>, 1 }],
164
+ ExactlyPolicyTwo = [{<<" ha-mode" >>, <<" exactly" >>},
165
+ {<<" ha-params" >>, 2 }],
166
+ NodesPolicyAll = [{<<" ha-mode" >>, <<" nodes" >>},
167
+ {<<" ha-params" >>, BNodes }],
168
+ NodesPolicyOne = [{<<" ha-mode" >>, <<" nodes" >>},
169
+ {<<" ha-params" >>, [hd (BNodes )]}],
170
+
171
+ % % ALL has precedence
172
+ Opts = #{config => Config ,
173
+ server => Server ,
174
+ qname => QName },
175
+
176
+ verify_policies (AllPolicy , ExactlyPolicyTwo , [{<<" ha-mode" >>, <<" all" >>}], Opts ),
177
+
178
+ verify_policies (ExactlyPolicyTwo , AllPolicy , [{<<" ha-mode" >>, <<" all" >>}], Opts ),
179
+
180
+ verify_policies (AllPolicy , NodesPolicyAll , [{<<" ha-mode" >>, <<" all" >>}], Opts ),
181
+
182
+ verify_policies (NodesPolicyAll , AllPolicy , [{<<" ha-mode" >>, <<" all" >>}], Opts ),
183
+
184
+ % % exactly has precedence over nodes
185
+ verify_policies (ExactlyPolicyTwo , NodesPolicyAll ,[{<<" ha-mode" >>, <<" exactly" >>}, {<<" ha-params" >>, 2 }], Opts ),
186
+
187
+ verify_policies (NodesPolicyAll , ExactlyPolicyTwo , [{<<" ha-mode" >>, <<" exactly" >>}, {<<" ha-params" >>, 2 }], Opts ),
188
+
189
+ % % Highest exactly value has precedence
190
+ verify_policies (ExactlyPolicyTwo , ExactlyPolicyOne , [{<<" ha-mode" >>, <<" exactly" >>}, {<<" ha-params" >>, 2 }], Opts ),
191
+
192
+ verify_policies (ExactlyPolicyOne , ExactlyPolicyTwo , [{<<" ha-mode" >>, <<" exactly" >>}, {<<" ha-params" >>, 2 }], Opts ),
193
+
194
+ % % Longest node count has precedence
195
+ SortedNodes = lists :sort (BNodes ),
196
+ verify_policies (NodesPolicyAll , NodesPolicyOne , [{<<" ha-mode" >>, <<" nodes" >>}, {<<" ha-params" >>, SortedNodes }], Opts ),
197
+ verify_policies (NodesPolicyOne , NodesPolicyAll , [{<<" ha-mode" >>, <<" nodes" >>}, {<<" ha-params" >>, SortedNodes }], Opts ),
198
+
199
+ delete (Ch , QName ),
200
+ rabbit_ct_broker_helpers :clear_policy (Config , 0 , <<" policy" >>),
201
+ rabbit_ct_broker_helpers :clear_operator_policy (Config , 0 , <<" op_policy" >>),
202
+ rabbit_ct_client_helpers :close_channel (Ch ),
203
+ rabbit_ct_client_helpers :close_connection (Conn ),
204
+ passed .
205
+
206
+
152
207
% %----------------------------------------------------------------------------
153
208
154
209
155
210
declare (Ch , Q ) ->
156
211
amqp_channel :call (Ch , # 'queue.declare' {queue = Q ,
157
212
durable = true }).
158
213
214
+ declare (Ch , Q , Args ) ->
215
+ amqp_channel :call (Ch , # 'queue.declare' {queue = Q ,
216
+ durable = true ,
217
+ auto_delete = false ,
218
+ arguments = Args }).
219
+
159
220
delete (Ch , Q ) ->
160
221
amqp_channel :call (Ch , # 'queue.delete' {queue = Q }).
161
222
@@ -201,4 +262,27 @@ get_messages(Number, Ch, Q) ->
201
262
exit (failed )
202
263
end .
203
264
265
+ check_policy_value (Server , QName , Value ) ->
266
+ {ok , Q } = rpc :call (Server , rabbit_amqqueue , lookup , [rabbit_misc :r (<<" /" >>, queue , QName )]),
267
+ proplists :get_value (Value , rpc :call (Server , rabbit_policy , effective_definition , [Q ])).
268
+
269
+ verify_policies (Policy , OperPolicy , VerifyFuns , #{config := Config ,
270
+ server := Server ,
271
+ qname := QName }) ->
272
+ rabbit_ct_broker_helpers :set_policy (Config , 0 , <<" policy" >>,
273
+ <<" policy_ha" >>, <<" queues" >>,
274
+ Policy ),
275
+ rabbit_ct_broker_helpers :set_operator_policy (Config , 0 , <<" op_policy" >>,
276
+ <<" policy_ha" >>, <<" queues" >>,
277
+ OperPolicy ),
278
+ verify_policy (VerifyFuns , Server , QName ).
279
+
280
+ verify_policy ([], _ , _ ) ->
281
+ ok ;
282
+ verify_policy ([{HA , Expect } | Tail ], Server , QName ) ->
283
+ ct :print (" >>> Expect: ~p >>> actual ~p " ,[Expect , check_policy_value (Server , QName , HA )]),
284
+ Expect = check_policy_value (Server , QName , HA ),
285
+ verify_policy (Tail , Server , QName ).
286
+
287
+
204
288
% %----------------------------------------------------------------------------
0 commit comments