Skip to content

Commit 4b3f70b

Browse files
lukebakkenmergify[bot]
authored andcommitted
Validate and normalize instance state configuration
Adds validation for the `aws_ec2_instance_states` configuration to ensure only valid EC2 instance state names are used. The validation filters out invalid states and logs a warning, allowing the node to start with the valid states. The `validate_instance_states/1` function checks each configured state against the list of valid EC2 instance states defined in the `?VALID_EC2_INSTANCE_STATES` macro. Invalid states are discarded and logged as a warning. The `normalize_state/1` function handles both atom and string inputs, converting atoms to strings for consistent handling. This supports configuration via `advanced.config` with atoms (`[running, pending]`) or via `rabbitmq.conf` with strings (`["running", "pending"]`). Tests verify validation works correctly for: - All valid states (strings) - Mixed valid and invalid states (filters out invalid) - Atom inputs (normalizes to strings) - Mixed valid and invalid atoms (cherry picked from commit 41d5030)
1 parent 12696c9 commit 4b3f70b

2 files changed

Lines changed: 35 additions & 1 deletion

File tree

deps/rabbitmq_peer_discovery_aws/src/rabbit_peer_discovery_aws.erl

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030

3131
-define(BACKEND_CONFIG_KEY, peer_discovery_aws).
3232

33+
-define(VALID_EC2_INSTANCE_STATES, ["pending", "running", "shutting-down", "terminated", "stopping", "stopped"]).
34+
3335
-define(CONFIG_MAPPING,
3436
#{
3537
aws_autoscaling => #peer_discovery_config_entry_meta{
@@ -321,9 +323,32 @@ maybe_add_instance_state_filters(QArgs, Num) ->
321323
[] ->
322324
QArgs;
323325
[_|_] ->
324-
add_instance_state_filters(States, QArgs, Num)
326+
ValidStates = validate_instance_states(States),
327+
add_instance_state_filters(ValidStates, QArgs, Num)
325328
end.
326329

330+
-spec validate_instance_states(list()) -> list().
331+
validate_instance_states(States) ->
332+
NormalizedStates = [normalize_state(State) || State <- States],
333+
{Valid, Invalid} = lists:partition(
334+
fun(State) -> lists:member(State, ?VALID_EC2_INSTANCE_STATES) end,
335+
NormalizedStates),
336+
case Invalid of
337+
[] ->
338+
ok;
339+
[_|_] ->
340+
rabbit_log:warning(
341+
"Ignoring invalid EC2 instance states in configuration: ~tp. "
342+
"Valid states are: ~tp", [Invalid, ?VALID_EC2_INSTANCE_STATES])
343+
end,
344+
Valid.
345+
346+
-spec normalize_state(atom() | string()) -> string().
347+
normalize_state(State) when is_atom(State) ->
348+
atom_to_list(State);
349+
normalize_state(State) when is_list(State) ->
350+
State.
351+
327352
-spec add_instance_state_filters(list(), filters(), integer()) -> filters().
328353
add_instance_state_filters(States, QArgs, Num) ->
329354
FilterName = {"Filter." ++ integer_to_list(Num) ++ ".Name", "instance-state-name"},

deps/rabbitmq_peer_discovery_aws/test/unit_SUITE.erl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ groups() ->
2323
{unit, [], [
2424
maybe_add_tag_filters,
2525
maybe_add_instance_state_filters,
26+
validate_instance_states,
2627
get_hostname_name_from_reservation_set,
2728
registration_support,
2829
network_interface_sorting,
@@ -64,6 +65,14 @@ maybe_add_instance_state_filters(_Config) ->
6465
?assertEqual(Expectation, Result),
6566
application:unset_env(rabbit, cluster_formation).
6667

68+
validate_instance_states(_Config) ->
69+
ValidStates = ["pending", "running", "shutting-down", "terminated", "stopping", "stopped"],
70+
?assertEqual(ValidStates, rabbit_peer_discovery_aws:validate_instance_states(ValidStates)),
71+
?assertEqual(["running"], rabbit_peer_discovery_aws:validate_instance_states(["running", "invalid"])),
72+
?assertEqual([], rabbit_peer_discovery_aws:validate_instance_states(["bogus", "invalid"])),
73+
?assertEqual(["running", "pending"], rabbit_peer_discovery_aws:validate_instance_states([running, pending])),
74+
?assertEqual(["running"], rabbit_peer_discovery_aws:validate_instance_states([running, invalid])).
75+
6776
get_hostname_name_from_reservation_set(_Config) ->
6877
ok = eunit:test({
6978
foreach,

0 commit comments

Comments
 (0)