Skip to content

Commit eb122b9

Browse files
Closes #35
1 parent fd0c3fe commit eb122b9

File tree

3 files changed

+125
-3
lines changed

3 files changed

+125
-3
lines changed

src/api.rs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ use std::fmt;
2424

2525
use crate::error::Error;
2626
use crate::error::Error::{ClientErrorResponse, NotFound, ServerErrorResponse};
27-
use crate::responses::{DeprecatedFeatureList, FeatureFlagList, MessageList};
27+
use crate::responses::{
28+
DeprecatedFeatureList, FeatureFlag, FeatureFlagList, FeatureFlagStability, FeatureFlagState,
29+
MessageList,
30+
};
2831
use crate::{
2932
commons::{BindingDestinationType, UserLimitTarget, VirtualHostLimitTarget},
3033
path,
@@ -1176,12 +1179,52 @@ where
11761179
// Feature flags
11771180
//
11781181

1182+
/// Enables a feature flag.
1183+
/// This function is idempotent: enabling an already enabled feature flag
1184+
/// will succeed.
11791185
pub async fn list_feature_flags(&self) -> Result<FeatureFlagList> {
11801186
let response = self.http_get("feature-flags", None, None).await?;
11811187
let response = response.json().await?;
11821188
Ok(response)
11831189
}
11841190

1191+
/// Enables all stable feature flags.
1192+
/// This function is idempotent: enabling an already enabled feature flag
1193+
/// will succeed.
1194+
pub async fn enable_feature_flag(&self, name: &str) -> Result<()> {
1195+
let body = serde_json::json!({
1196+
"name": name
1197+
});
1198+
let _response = self
1199+
.http_put(path!("feature-flags", name, "enable"), &body, None, None)
1200+
.await?;
1201+
Ok(())
1202+
}
1203+
1204+
/// Enables all stable feature flags.
1205+
/// This function is idempotent: enabling an already enabled feature flag
1206+
/// will succeed.
1207+
pub async fn enable_all_stable_feature_flags(&self) -> Result<()> {
1208+
// PUT /api/feature-flags/{name}/enable does not support the special 'all' value like 'rabbitmqctl enable_feature_flag' does.
1209+
// Thus we do what management UI does: discover the stable disabled flags and enable
1210+
// them one by one.
1211+
let discovered_flags = self.list_feature_flags().await?;
1212+
let flags_to_enable: Vec<&FeatureFlag> = discovered_flags
1213+
.0
1214+
.iter()
1215+
.filter(|&ff| {
1216+
ff.state == FeatureFlagState::Disabled
1217+
&& ff.stability == FeatureFlagStability::Stable
1218+
})
1219+
.collect();
1220+
1221+
for ff in flags_to_enable {
1222+
self.enable_feature_flag(&ff.name).await?;
1223+
}
1224+
1225+
Ok(())
1226+
}
1227+
11851228
//
11861229
// Deprecated Features
11871230
//

src/blocking_api.rs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@
1515

1616
use crate::error::Error;
1717
use crate::error::Error::{ClientErrorResponse, NotFound, ServerErrorResponse};
18-
use crate::responses::{DeprecatedFeatureList, FeatureFlagList, OAuthConfiguration};
18+
use crate::responses::{
19+
DeprecatedFeatureList, FeatureFlag, FeatureFlagList, FeatureFlagStability, FeatureFlagState,
20+
OAuthConfiguration,
21+
};
1922
use crate::{
2023
commons::{BindingDestinationType, UserLimitTarget, VirtualHostLimitTarget},
2124
path,
@@ -1039,6 +1042,41 @@ where
10391042
Ok(response)
10401043
}
10411044

1045+
/// Enables a feature flag.
1046+
/// This function is idempotent: enabling an already enabled feature flag
1047+
/// will succeed.
1048+
pub fn enable_feature_flag(&self, name: &str) -> Result<()> {
1049+
let body = serde_json::json!({
1050+
"name": name
1051+
});
1052+
let _response = self.http_put(path!("feature-flags", name, "enable"), &body, None, None)?;
1053+
Ok(())
1054+
}
1055+
1056+
/// Enables all stable feature flags.
1057+
/// This function is idempotent: enabling an already enabled feature flag
1058+
/// will succeed.
1059+
pub fn enable_all_stable_feature_flags(&self) -> Result<()> {
1060+
// PUT /api/feature-flags/{name}/enable does not support the special 'all' value like 'rabbitmqctl enable_feature_flag' does.
1061+
// Thus we do what management UI does: discover the stable disabled flags and enable
1062+
// them one by one.
1063+
let discovered_flags = self.list_feature_flags()?;
1064+
let flags_to_enable: Vec<&FeatureFlag> = discovered_flags
1065+
.0
1066+
.iter()
1067+
.filter(|&ff| {
1068+
ff.state == FeatureFlagState::Disabled
1069+
&& ff.stability == FeatureFlagStability::Stable
1070+
})
1071+
.collect();
1072+
1073+
for ff in flags_to_enable {
1074+
self.enable_feature_flag(&ff.name)?;
1075+
}
1076+
1077+
Ok(())
1078+
}
1079+
10421080
//
10431081
// Deprecated Features
10441082
//

tests/feature_flag_tests.rs

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
14-
use rabbitmq_http_client::{blocking_api::Client, responses::FeatureFlagStability};
14+
use rabbitmq_http_client::{
15+
blocking_api::Client,
16+
responses::{FeatureFlagStability, FeatureFlagState},
17+
};
1518

1619
mod test_helpers;
1720
use crate::test_helpers::{endpoint, PASSWORD, USERNAME};
@@ -29,3 +32,41 @@ fn test_list_feature_flags() {
2932
.into_iter()
3033
.any(|ff| ff.name == "rabbitmq_4.0.0" && ff.stability == FeatureFlagStability::Stable));
3134
}
35+
36+
#[test]
37+
fn test_enable_a_feature_flag() {
38+
let endpoint = endpoint();
39+
let rc = Client::new(&endpoint, USERNAME, PASSWORD);
40+
let ff_name = "detailed_queues_endpoint";
41+
42+
let result1 = rc.enable_feature_flag(ff_name);
43+
assert!(result1.is_ok());
44+
45+
let result2 = rc.list_feature_flags();
46+
47+
assert!(result2.is_ok());
48+
let vec = result2.unwrap();
49+
assert!(vec
50+
.0
51+
.into_iter()
52+
.any(|ff| ff.name == ff_name && ff.state == FeatureFlagState::Enabled));
53+
}
54+
55+
#[test]
56+
fn test_enable_all_stable_feature_flags() {
57+
let endpoint = endpoint();
58+
let rc = Client::new(&endpoint, USERNAME, PASSWORD);
59+
let ff_name = "rabbitmq_4.0.0";
60+
61+
let result1 = rc.enable_all_stable_feature_flags();
62+
assert!(result1.is_ok());
63+
64+
let result2 = rc.list_feature_flags();
65+
66+
assert!(result2.is_ok());
67+
let vec = result2.unwrap();
68+
assert!(vec
69+
.0
70+
.into_iter()
71+
.any(|ff| ff.name == ff_name && ff.state == FeatureFlagState::Enabled));
72+
}

0 commit comments

Comments
 (0)