|
105 | 105 | init/0, |
106 | 106 | get_state/1, |
107 | 107 | get_stability/1, |
| 108 | + get_require_level/1, |
108 | 109 | check_node_compatibility/1, check_node_compatibility/2, |
109 | 110 | sync_feature_flags_with_cluster/2, |
110 | 111 | refresh_feature_flags_after_app_load/0, |
|
147 | 148 | -type feature_props() :: #{desc => string(), |
148 | 149 | doc_url => string(), |
149 | 150 | stability => stability(), |
| 151 | + require_level => require_level(), |
150 | 152 | depends_on => [feature_name()], |
151 | 153 | callbacks => |
152 | 154 | #{callback_name() => callback_fun_name()}}. |
|
183 | 185 | desc => string(), |
184 | 186 | doc_url => string(), |
185 | 187 | stability => stability(), |
| 188 | + require_level => require_level(), |
186 | 189 | depends_on => [feature_name()], |
187 | 190 | callbacks => |
188 | 191 | #{callback_name() => callback_fun_name()}, |
|
207 | 210 | %% Experimental feature flags are not enabled by default on a fresh RabbitMQ |
208 | 211 | %% node. They must be enabled by the user. |
209 | 212 |
|
| 213 | +-type require_level() :: hard | soft. |
| 214 | +%% The level of requirement of a feature flag. |
| 215 | +%% |
| 216 | +%% A hard required feature flags must be enabled before a RabbitMQ node is |
| 217 | +%% upgraded to a version where it is required. |
| 218 | +%% |
| 219 | +%% A soft required feature flag will be automatically enabled when a RabbitMQ |
| 220 | +%% node is upgraded to a version where it is required. |
| 221 | + |
210 | 222 | -type callback_fun_name() :: {Module :: module(), Function :: atom()}. |
211 | 223 | %% The name of the module and function to call when changing the state of |
212 | 224 | %% the feature flag. |
@@ -755,6 +767,48 @@ get_stability(FeatureProps) when ?IS_DEPRECATION(FeatureProps) -> |
755 | 767 | permitted_by_default -> experimental |
756 | 768 | end. |
757 | 769 |
|
| 770 | +-spec get_require_level |
| 771 | +(FeatureName) -> RequireLevel | undefined when |
| 772 | + FeatureName :: feature_name(), |
| 773 | + RequireLevel :: require_level() | none; |
| 774 | +(FeatureProps) -> RequireLevel when |
| 775 | + FeatureProps :: |
| 776 | + feature_props_extended() | |
| 777 | + rabbit_deprecated_features:feature_props_extended(), |
| 778 | + RequireLevel :: require_level() | none. |
| 779 | +%% @doc |
| 780 | +%% Returns the requirement level of a feature flag. |
| 781 | +%% |
| 782 | +%% The possible requirement levels are: |
| 783 | +%% <ul> |
| 784 | +%% <li>`hard': the feature flag must be enabled before the RabbitMQ node is |
| 785 | +%% upgraded to a version where it is hard required.</li> |
| 786 | +%% <li>`soft': the feature flag will be automatically enabled wher a RabbitMQ |
| 787 | +%% node is upgraded to a version where it is soft required.</li> |
| 788 | +%% <li>`none': the feature flag is not required.</li> |
| 789 | +%% </ul> |
| 790 | +%% |
| 791 | +%% @param FeatureName The name of the feature flag to check. |
| 792 | +%% @param FeatureProps A feature flag properties map. |
| 793 | +%% @returns `hard', `soft' or `none', or `undefined' if the given feature flag |
| 794 | +%% name doesn't correspond to a known feature flag. |
| 795 | + |
| 796 | +get_require_level(FeatureName) when is_atom(FeatureName) -> |
| 797 | + case rabbit_ff_registry_wrapper:get(FeatureName) of |
| 798 | + undefined -> undefined; |
| 799 | + FeatureProps -> get_require_level(FeatureProps) |
| 800 | + end; |
| 801 | +get_require_level(FeatureProps) when ?IS_FEATURE_FLAG(FeatureProps) -> |
| 802 | + case get_stability(FeatureProps) of |
| 803 | + required -> maps:get(require_level, FeatureProps, soft); |
| 804 | + _ -> none |
| 805 | + end; |
| 806 | +get_require_level(FeatureProps) when ?IS_DEPRECATION(FeatureProps) -> |
| 807 | + case get_stability(FeatureProps) of |
| 808 | + required -> hard; |
| 809 | + _ -> none |
| 810 | + end. |
| 811 | + |
758 | 812 | %% ------------------------------------------------------------------- |
759 | 813 | %% Feature flags registry. |
760 | 814 | %% ------------------------------------------------------------------- |
@@ -913,6 +967,7 @@ assert_feature_flag_is_valid(FeatureName, FeatureProps) -> |
913 | 967 | ValidProps = [desc, |
914 | 968 | doc_url, |
915 | 969 | stability, |
| 970 | + require_level, |
916 | 971 | depends_on, |
917 | 972 | callbacks], |
918 | 973 | ?assertEqual([], maps:keys(FeatureProps) -- ValidProps), |
@@ -1363,7 +1418,7 @@ run_feature_flags_mod_on_remote_node(Node, Function, Args, Timeout) -> |
1363 | 1418 | sync_feature_flags_with_cluster([] = _Nodes, true = _NodeIsVirgin) -> |
1364 | 1419 | rabbit_ff_controller:enable_default(); |
1365 | 1420 | sync_feature_flags_with_cluster([] = _Nodes, false = _NodeIsVirgin) -> |
1366 | | - ok; |
| 1421 | + rabbit_ff_controller:enable_required(); |
1367 | 1422 | sync_feature_flags_with_cluster(Nodes, _NodeIsVirgin) -> |
1368 | 1423 | %% We don't use `rabbit_nodes:filter_running()' here because the given |
1369 | 1424 | %% `Nodes' list may contain nodes which are not members yet (the cluster |
|
0 commit comments