@@ -192,7 +192,8 @@ all_tests() ->
192192 priority_queue_2_1_ratio ,
193193 requeue_multiple_true ,
194194 requeue_multiple_false ,
195- subscribe_from_each
195+ subscribe_from_each ,
196+ leader_health_check
196197 ].
197198
198199memory_tests () ->
@@ -4145,6 +4146,129 @@ amqpl_headers(Config) ->
41454146 ok = amqp_channel :cast (Ch , # 'basic.ack' {delivery_tag = DeliveryTag ,
41464147 multiple = true }).
41474148
4149+ leader_health_check (Config ) ->
4150+ VHost1 = <<" vhost1" >>,
4151+ VHost2 = <<" vhost2" >>,
4152+
4153+ set_up_vhost (Config , VHost1 ),
4154+ set_up_vhost (Config , VHost2 ),
4155+
4156+ % % check empty vhost
4157+ ? assertEqual ([],
4158+ rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4159+ [<<" .*" >>, VHost1 ])),
4160+ ? assertEqual ([],
4161+ rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4162+ [<<" .*" >>, across_all_vhosts ])),
4163+
4164+ Conn1 = rabbit_ct_client_helpers :open_unmanaged_connection (Config , 0 , VHost1 ),
4165+ {ok , Ch1 } = amqp_connection :open_channel (Conn1 ),
4166+
4167+ Conn2 = rabbit_ct_client_helpers :open_unmanaged_connection (Config , 0 , VHost2 ),
4168+ {ok , Ch2 } = amqp_connection :open_channel (Conn2 ),
4169+
4170+ Qs1 = [<<" Q.1" >>, <<" Q.2" >>, <<" Q.3" >>],
4171+ Qs2 = [<<" Q.4" >>, <<" Q.5" >>, <<" Q.6" >>],
4172+
4173+ % % in vhost1
4174+ [? assertEqual ({'queue.declare_ok' , Q , 0 , 0 },
4175+ declare (Ch1 , Q , [{<<" x-queue-type" >>, longstr , <<" quorum" >>}]))
4176+ || Q <- Qs1 ],
4177+
4178+ % % in vhost2
4179+ [? assertEqual ({'queue.declare_ok' , Q , 0 , 0 },
4180+ declare (Ch2 , Q , [{<<" x-queue-type" >>, longstr , <<" quorum" >>}]))
4181+ || Q <- Qs2 ],
4182+
4183+ % % test sucessful health checks in vhost1, vhost2, across_all_vhosts
4184+ ? assertEqual ([], rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4185+ [<<" .*" >>, VHost1 ])),
4186+ ? assertEqual ([], rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4187+ [<<" Q.*" >>, VHost1 ])),
4188+ [? assertEqual ([], rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4189+ [Q , VHost1 ])) || Q <- Qs1 ],
4190+
4191+ ? assertEqual ([], rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4192+ [<<" .*" >>, VHost2 ])),
4193+ ? assertEqual ([], rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4194+ [<<" Q.*" >>, VHost2 ])),
4195+ [? assertEqual ([], rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4196+ [Q , VHost2 ])) || Q <- Qs2 ],
4197+
4198+ ? assertEqual ([], rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4199+ [<<" .*" >>, across_all_vhosts ])),
4200+ ? assertEqual ([], rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4201+ [<<" Q.*" >>, across_all_vhosts ])),
4202+
4203+ % % clear leaderboard
4204+ Qs = rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_amqqueue , list , []),
4205+
4206+ [{_Q1_ClusterName , _Q1Res },
4207+ {_Q2_ClusterName , _Q2Res },
4208+ {_Q3_ClusterName , _Q3Res },
4209+ {_Q4_ClusterName , _Q4Res },
4210+ {_Q5_ClusterName , _Q5Res },
4211+ {_Q6_ClusterName , _Q6Res }] = QQ_Clusters =
4212+ lists :usort (
4213+ [begin
4214+ {ClusterName , _ } = amqqueue :get_pid (Q ),
4215+ {ClusterName , amqqueue :get_name (Q )}
4216+ end
4217+ || Q <- Qs , amqqueue :get_type (Q ) == rabbit_quorum_queue ]),
4218+
4219+ [Q1Data , Q2Data , Q3Data , Q4Data , Q5Data , Q6Data ] = QQ_Data =
4220+ [begin
4221+ rabbit_ct_broker_helpers :rpc (Config , 0 , ra_leaderboard , clear , [Q_ClusterName ]),
4222+ _QData = amqqueue :to_printable (Q_Res , rabbit_quorum_queue )
4223+ end
4224+ || {Q_ClusterName , Q_Res } <- QQ_Clusters ],
4225+
4226+ % % test failed health checks in vhost1, vhost2, across_all_vhosts
4227+ ? assertEqual ([Q1Data ], rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4228+ [<<" Q.1" >>, VHost1 ])),
4229+ ? assertEqual ([Q2Data ], rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4230+ [<<" Q.2" >>, VHost1 ])),
4231+ ? assertEqual ([Q3Data ], rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4232+ [<<" Q.3" >>, VHost1 ])),
4233+ ? assertEqual ([Q1Data , Q2Data , Q3Data ],
4234+ lists :usort (rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4235+ [<<" .*" >>, VHost1 ]))),
4236+ ? assertEqual ([Q1Data , Q2Data , Q3Data ],
4237+ lists :usort (rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4238+ [<<" Q.*" >>, VHost1 ]))),
4239+
4240+ ? assertEqual ([Q4Data ], rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4241+ [<<" Q.4" >>, VHost2 ])),
4242+ ? assertEqual ([Q5Data ], rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4243+ [<<" Q.5" >>, VHost2 ])),
4244+ ? assertEqual ([Q6Data ], rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4245+ [<<" Q.6" >>, VHost2 ])),
4246+ ? assertEqual ([Q4Data , Q5Data , Q6Data ],
4247+ lists :usort (rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4248+ [<<" .*" >>, VHost2 ]))),
4249+ ? assertEqual ([Q4Data , Q5Data , Q6Data ],
4250+ lists :usort (rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4251+ [<<" Q.*" >>, VHost2 ]))),
4252+
4253+ ? assertEqual (QQ_Data ,
4254+ lists :usort (rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4255+ [<<" Q.*" >>, across_all_vhosts ]))),
4256+ ? assertEqual (QQ_Data ,
4257+ lists :usort (rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue , leader_health_check ,
4258+ [<<" Q.*" >>, across_all_vhosts ]))),
4259+
4260+ % % cleanup
4261+ [? assertMatch (# 'queue.delete_ok' {},
4262+ amqp_channel :call (Ch1 , # 'queue.delete' {queue = Q }))
4263+ || Q <- Qs1 ],
4264+ [? assertMatch (# 'queue.delete_ok' {},
4265+ amqp_channel :call (Ch1 , # 'queue.delete' {queue = Q }))
4266+ || Q <- Qs2 ],
4267+
4268+ amqp_connection :close (Conn1 ),
4269+ amqp_connection :close (Conn2 ).
4270+
4271+
41484272leader_locator_client_local (Config ) ->
41494273 [Server1 | _ ] = Servers = rabbit_ct_broker_helpers :get_node_configs (Config , nodename ),
41504274 Q = ? config (queue_name , Config ),
@@ -4465,6 +4589,11 @@ declare_passive(Ch, Q, Args) ->
44654589 auto_delete = false ,
44664590 passive = true ,
44674591 arguments = Args }).
4592+
4593+ set_up_vhost (Config , VHost ) ->
4594+ rabbit_ct_broker_helpers :add_vhost (Config , VHost ),
4595+ rabbit_ct_broker_helpers :set_full_permissions (Config , <<" guest" >>, VHost ).
4596+
44684597assert_queue_type (Server , Q , Expected ) ->
44694598 assert_queue_type (Server , <<" /" >>, Q , Expected ).
44704599
0 commit comments