Skip to content

Commit 1ebb0f5

Browse files
api-clients-generation-pipeline[bot]ci.datadog-api-spec
andauthored
add api spec for feature flags allocations and exposure schedules endpoints (#1442)
Co-authored-by: ci.datadog-api-spec <packages@datadoghq.com>
1 parent 557230b commit 1ebb0f5

File tree

52 files changed

+7294
-18
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+7294
-18
lines changed

.generator/schemas/v2/openapi.yaml

Lines changed: 1224 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Create targeting rules for a flag env returns "Created" response
2+
use chrono::{DateTime, Utc};
3+
use datadog_api_client::datadog;
4+
use datadog_api_client::datadogV2::api_feature_flags::FeatureFlagsAPI;
5+
use datadog_api_client::datadogV2::model::AllocationDataRequest;
6+
use datadog_api_client::datadogV2::model::AllocationDataType;
7+
use datadog_api_client::datadogV2::model::AllocationType;
8+
use datadog_api_client::datadogV2::model::ConditionOperator;
9+
use datadog_api_client::datadogV2::model::ConditionRequest;
10+
use datadog_api_client::datadogV2::model::CreateAllocationsRequest;
11+
use datadog_api_client::datadogV2::model::ExposureRolloutStepRequest;
12+
use datadog_api_client::datadogV2::model::ExposureScheduleRequest;
13+
use datadog_api_client::datadogV2::model::GuardrailMetricRequest;
14+
use datadog_api_client::datadogV2::model::GuardrailTriggerAction;
15+
use datadog_api_client::datadogV2::model::RolloutOptionsRequest;
16+
use datadog_api_client::datadogV2::model::RolloutStrategy;
17+
use datadog_api_client::datadogV2::model::TargetingRuleRequest;
18+
use datadog_api_client::datadogV2::model::UpsertAllocationRequest;
19+
use datadog_api_client::datadogV2::model::VariantWeightRequest;
20+
use uuid::Uuid;
21+
22+
#[tokio::main]
23+
async fn main() {
24+
let body = CreateAllocationsRequest::new(AllocationDataRequest::new(
25+
UpsertAllocationRequest::new(
26+
"prod-rollout".to_string(),
27+
"Production Rollout".to_string(),
28+
AllocationType::FEATURE_GATE,
29+
)
30+
.experiment_id(Some("550e8400-e29b-41d4-a716-446655440030".to_string()))
31+
.exposure_schedule(
32+
ExposureScheduleRequest::new(
33+
RolloutOptionsRequest::new(RolloutStrategy::UNIFORM_INTERVALS)
34+
.autostart(Some(false))
35+
.selection_interval_ms(3600000),
36+
vec![ExposureRolloutStepRequest::new(0.5, 1, false)
37+
.id(Uuid::parse_str("550e8400-e29b-41d4-a716-446655440040")
38+
.expect("invalid UUID"))
39+
.interval_ms(Some(3600000))],
40+
)
41+
.absolute_start_time(Some(
42+
DateTime::parse_from_rfc3339("2025-06-13T12:00:00+00:00")
43+
.expect("Failed to parse datetime")
44+
.with_timezone(&Utc),
45+
))
46+
.control_variant_id(Some("550e8400-e29b-41d4-a716-446655440012".to_string()))
47+
.control_variant_key(Some("control".to_string()))
48+
.id(Uuid::parse_str("550e8400-e29b-41d4-a716-446655440010").expect("invalid UUID")),
49+
)
50+
.guardrail_metrics(vec![GuardrailMetricRequest::new(
51+
"metric-error-rate".to_string(),
52+
GuardrailTriggerAction::PAUSE,
53+
)])
54+
.id(Uuid::parse_str("550e8400-e29b-41d4-a716-446655440020").expect("invalid UUID"))
55+
.targeting_rules(vec![TargetingRuleRequest::new(vec![
56+
ConditionRequest::new(
57+
"user_tier".to_string(),
58+
ConditionOperator::ONE_OF,
59+
vec!["premium".to_string(), "enterprise".to_string()],
60+
),
61+
])])
62+
.variant_weights(vec![VariantWeightRequest::new(50.0)
63+
.variant_id(
64+
Uuid::parse_str("550e8400-e29b-41d4-a716-446655440001").expect("invalid UUID"),
65+
)
66+
.variant_key("control".to_string())]),
67+
AllocationDataType::ALLOCATIONS,
68+
));
69+
let configuration = datadog::Configuration::new();
70+
let api = FeatureFlagsAPI::with_config(configuration);
71+
let resp = api
72+
.create_allocations_for_feature_flag_in_environment(
73+
Uuid::parse_str("550e8400-e29b-41d4-a716-446655440000").expect("invalid UUID"),
74+
Uuid::parse_str("550e8400-e29b-41d4-a716-446655440001").expect("invalid UUID"),
75+
body,
76+
)
77+
.await;
78+
if let Ok(value) = resp {
79+
println!("{:#?}", value);
80+
} else {
81+
println!("{:#?}", resp.unwrap_err());
82+
}
83+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Create allocation for a flag in an environment returns "Created" response
2+
use datadog_api_client::datadog;
3+
use datadog_api_client::datadogV2::api_feature_flags::FeatureFlagsAPI;
4+
use datadog_api_client::datadogV2::model::AllocationDataRequest;
5+
use datadog_api_client::datadogV2::model::AllocationDataType;
6+
use datadog_api_client::datadogV2::model::AllocationType;
7+
use datadog_api_client::datadogV2::model::CreateAllocationsRequest;
8+
use datadog_api_client::datadogV2::model::UpsertAllocationRequest;
9+
use datadog_api_client::datadogV2::model::VariantWeightRequest;
10+
11+
#[tokio::main]
12+
async fn main() {
13+
// there is a valid "feature_flag" in the system
14+
let feature_flag_data_attributes_variants_0_id = uuid::Uuid::parse_str(
15+
&std::env::var("FEATURE_FLAG_DATA_ATTRIBUTES_VARIANTS_0_ID").unwrap(),
16+
)
17+
.expect("Invalid UUID");
18+
let feature_flag_data_id =
19+
uuid::Uuid::parse_str(&std::env::var("FEATURE_FLAG_DATA_ID").unwrap())
20+
.expect("Invalid UUID");
21+
22+
// there is a valid "environment" in the system
23+
let environment_data_id = uuid::Uuid::parse_str(&std::env::var("ENVIRONMENT_DATA_ID").unwrap())
24+
.expect("Invalid UUID");
25+
let body = CreateAllocationsRequest::new(AllocationDataRequest::new(
26+
UpsertAllocationRequest::new(
27+
"new-targeting-rule-example-feature-flag".to_string(),
28+
"New targeting rule Example-Feature-Flag".to_string(),
29+
AllocationType::CANARY,
30+
)
31+
.guardrail_metrics(vec![])
32+
.targeting_rules(vec![])
33+
.variant_weights(vec![VariantWeightRequest::new(100.0)
34+
.variant_id(feature_flag_data_attributes_variants_0_id.clone())]),
35+
AllocationDataType::ALLOCATIONS,
36+
));
37+
let configuration = datadog::Configuration::new();
38+
let api = FeatureFlagsAPI::with_config(configuration);
39+
let resp = api
40+
.create_allocations_for_feature_flag_in_environment(
41+
feature_flag_data_id.clone(),
42+
environment_data_id.clone(),
43+
body,
44+
)
45+
.await;
46+
if let Ok(value) = resp {
47+
println!("{:#?}", value);
48+
} else {
49+
println!("{:#?}", resp.unwrap_err());
50+
}
51+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Pause a progressive rollout returns "OK" response
2+
use datadog_api_client::datadog;
3+
use datadog_api_client::datadogV2::api_feature_flags::FeatureFlagsAPI;
4+
use uuid::Uuid;
5+
6+
#[tokio::main]
7+
async fn main() {
8+
let configuration = datadog::Configuration::new();
9+
let api = FeatureFlagsAPI::with_config(configuration);
10+
let resp = api
11+
.pause_exposure_schedule(
12+
Uuid::parse_str("550e8400-e29b-41d4-a716-446655440010").expect("invalid UUID"),
13+
)
14+
.await;
15+
if let Ok(value) = resp {
16+
println!("{:#?}", value);
17+
} else {
18+
println!("{:#?}", resp.unwrap_err());
19+
}
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Resume a progressive rollout returns "OK" response
2+
use datadog_api_client::datadog;
3+
use datadog_api_client::datadogV2::api_feature_flags::FeatureFlagsAPI;
4+
use uuid::Uuid;
5+
6+
#[tokio::main]
7+
async fn main() {
8+
let configuration = datadog::Configuration::new();
9+
let api = FeatureFlagsAPI::with_config(configuration);
10+
let resp = api
11+
.resume_exposure_schedule(
12+
Uuid::parse_str("550e8400-e29b-41d4-a716-446655440010").expect("invalid UUID"),
13+
)
14+
.await;
15+
if let Ok(value) = resp {
16+
println!("{:#?}", value);
17+
} else {
18+
println!("{:#?}", resp.unwrap_err());
19+
}
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Start a progressive rollout returns "OK" response
2+
use datadog_api_client::datadog;
3+
use datadog_api_client::datadogV2::api_feature_flags::FeatureFlagsAPI;
4+
use uuid::Uuid;
5+
6+
#[tokio::main]
7+
async fn main() {
8+
let configuration = datadog::Configuration::new();
9+
let api = FeatureFlagsAPI::with_config(configuration);
10+
let resp = api
11+
.start_exposure_schedule(
12+
Uuid::parse_str("550e8400-e29b-41d4-a716-446655440010").expect("invalid UUID"),
13+
)
14+
.await;
15+
if let Ok(value) = resp {
16+
println!("{:#?}", value);
17+
} else {
18+
println!("{:#?}", resp.unwrap_err());
19+
}
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Stop a progressive rollout returns "OK" response
2+
use datadog_api_client::datadog;
3+
use datadog_api_client::datadogV2::api_feature_flags::FeatureFlagsAPI;
4+
use uuid::Uuid;
5+
6+
#[tokio::main]
7+
async fn main() {
8+
let configuration = datadog::Configuration::new();
9+
let api = FeatureFlagsAPI::with_config(configuration);
10+
let resp = api
11+
.stop_exposure_schedule(
12+
Uuid::parse_str("550e8400-e29b-41d4-a716-446655440010").expect("invalid UUID"),
13+
)
14+
.await;
15+
if let Ok(value) = resp {
16+
println!("{:#?}", value);
17+
} else {
18+
println!("{:#?}", resp.unwrap_err());
19+
}
20+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Update targeting rules for a flag returns "OK" response
2+
use chrono::{DateTime, Utc};
3+
use datadog_api_client::datadog;
4+
use datadog_api_client::datadogV2::api_feature_flags::FeatureFlagsAPI;
5+
use datadog_api_client::datadogV2::model::AllocationDataRequest;
6+
use datadog_api_client::datadogV2::model::AllocationDataType;
7+
use datadog_api_client::datadogV2::model::AllocationType;
8+
use datadog_api_client::datadogV2::model::ConditionOperator;
9+
use datadog_api_client::datadogV2::model::ConditionRequest;
10+
use datadog_api_client::datadogV2::model::ExposureRolloutStepRequest;
11+
use datadog_api_client::datadogV2::model::ExposureScheduleRequest;
12+
use datadog_api_client::datadogV2::model::GuardrailMetricRequest;
13+
use datadog_api_client::datadogV2::model::GuardrailTriggerAction;
14+
use datadog_api_client::datadogV2::model::OverwriteAllocationsRequest;
15+
use datadog_api_client::datadogV2::model::RolloutOptionsRequest;
16+
use datadog_api_client::datadogV2::model::RolloutStrategy;
17+
use datadog_api_client::datadogV2::model::TargetingRuleRequest;
18+
use datadog_api_client::datadogV2::model::UpsertAllocationRequest;
19+
use datadog_api_client::datadogV2::model::VariantWeightRequest;
20+
use uuid::Uuid;
21+
22+
#[tokio::main]
23+
async fn main() {
24+
let body = OverwriteAllocationsRequest::new(vec![AllocationDataRequest::new(
25+
UpsertAllocationRequest::new(
26+
"prod-rollout".to_string(),
27+
"Production Rollout".to_string(),
28+
AllocationType::FEATURE_GATE,
29+
)
30+
.experiment_id(Some("550e8400-e29b-41d4-a716-446655440030".to_string()))
31+
.exposure_schedule(
32+
ExposureScheduleRequest::new(
33+
RolloutOptionsRequest::new(RolloutStrategy::UNIFORM_INTERVALS)
34+
.autostart(Some(false))
35+
.selection_interval_ms(3600000),
36+
vec![ExposureRolloutStepRequest::new(0.5, 1, false)
37+
.id(Uuid::parse_str("550e8400-e29b-41d4-a716-446655440040")
38+
.expect("invalid UUID"))
39+
.interval_ms(Some(3600000))],
40+
)
41+
.absolute_start_time(Some(
42+
DateTime::parse_from_rfc3339("2025-06-13T12:00:00+00:00")
43+
.expect("Failed to parse datetime")
44+
.with_timezone(&Utc),
45+
))
46+
.control_variant_id(Some("550e8400-e29b-41d4-a716-446655440012".to_string()))
47+
.control_variant_key(Some("control".to_string()))
48+
.id(Uuid::parse_str("550e8400-e29b-41d4-a716-446655440010").expect("invalid UUID")),
49+
)
50+
.guardrail_metrics(vec![GuardrailMetricRequest::new(
51+
"metric-error-rate".to_string(),
52+
GuardrailTriggerAction::PAUSE,
53+
)])
54+
.id(Uuid::parse_str("550e8400-e29b-41d4-a716-446655440020").expect("invalid UUID"))
55+
.targeting_rules(vec![TargetingRuleRequest::new(vec![
56+
ConditionRequest::new(
57+
"user_tier".to_string(),
58+
ConditionOperator::ONE_OF,
59+
vec!["premium".to_string(), "enterprise".to_string()],
60+
),
61+
])])
62+
.variant_weights(vec![VariantWeightRequest::new(50.0)
63+
.variant_id(
64+
Uuid::parse_str("550e8400-e29b-41d4-a716-446655440001").expect("invalid UUID"),
65+
)
66+
.variant_key("control".to_string())]),
67+
AllocationDataType::ALLOCATIONS,
68+
)]);
69+
let configuration = datadog::Configuration::new();
70+
let api = FeatureFlagsAPI::with_config(configuration);
71+
let resp = api
72+
.update_allocations_for_feature_flag_in_environment(
73+
Uuid::parse_str("550e8400-e29b-41d4-a716-446655440000").expect("invalid UUID"),
74+
Uuid::parse_str("550e8400-e29b-41d4-a716-446655440001").expect("invalid UUID"),
75+
body,
76+
)
77+
.await;
78+
if let Ok(value) = resp {
79+
println!("{:#?}", value);
80+
} else {
81+
println!("{:#?}", resp.unwrap_err());
82+
}
83+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Update targeting rules for a flag in an environment returns "OK" response
2+
use datadog_api_client::datadog;
3+
use datadog_api_client::datadogV2::api_feature_flags::FeatureFlagsAPI;
4+
use datadog_api_client::datadogV2::model::AllocationDataRequest;
5+
use datadog_api_client::datadogV2::model::AllocationDataType;
6+
use datadog_api_client::datadogV2::model::AllocationType;
7+
use datadog_api_client::datadogV2::model::ExposureRolloutStepRequest;
8+
use datadog_api_client::datadogV2::model::ExposureScheduleRequest;
9+
use datadog_api_client::datadogV2::model::OverwriteAllocationsRequest;
10+
use datadog_api_client::datadogV2::model::RolloutOptionsRequest;
11+
use datadog_api_client::datadogV2::model::RolloutStrategy;
12+
use datadog_api_client::datadogV2::model::UpsertAllocationRequest;
13+
use datadog_api_client::datadogV2::model::VariantWeightRequest;
14+
15+
#[tokio::main]
16+
async fn main() {
17+
// there is a valid "feature_flag" in the system
18+
let feature_flag_data_attributes_variants_0_id = uuid::Uuid::parse_str(
19+
&std::env::var("FEATURE_FLAG_DATA_ATTRIBUTES_VARIANTS_0_ID").unwrap(),
20+
)
21+
.expect("Invalid UUID");
22+
let feature_flag_data_id =
23+
uuid::Uuid::parse_str(&std::env::var("FEATURE_FLAG_DATA_ID").unwrap())
24+
.expect("Invalid UUID");
25+
26+
// there is a valid "environment" in the system
27+
let environment_data_id = uuid::Uuid::parse_str(&std::env::var("ENVIRONMENT_DATA_ID").unwrap())
28+
.expect("Invalid UUID");
29+
let body = OverwriteAllocationsRequest::new(vec![AllocationDataRequest::new(
30+
UpsertAllocationRequest::new(
31+
"overwrite-allocation-example-feature-flag".to_string(),
32+
"New targeting rule Example-Feature-Flag".to_string(),
33+
AllocationType::CANARY,
34+
)
35+
.exposure_schedule(ExposureScheduleRequest::new(
36+
RolloutOptionsRequest::new(RolloutStrategy::UNIFORM_INTERVALS)
37+
.autostart(Some(false))
38+
.selection_interval_ms(86400000),
39+
vec![
40+
ExposureRolloutStepRequest::new(0.05, 0, false).interval_ms(None),
41+
ExposureRolloutStepRequest::new(0.25, 1, false).interval_ms(None),
42+
ExposureRolloutStepRequest::new(1.0, 2, false).interval_ms(None),
43+
],
44+
))
45+
.guardrail_metrics(vec![])
46+
.targeting_rules(vec![])
47+
.variant_weights(vec![VariantWeightRequest::new(100.0)
48+
.variant_id(feature_flag_data_attributes_variants_0_id.clone())]),
49+
AllocationDataType::ALLOCATIONS,
50+
)]);
51+
let configuration = datadog::Configuration::new();
52+
let api = FeatureFlagsAPI::with_config(configuration);
53+
let resp = api
54+
.update_allocations_for_feature_flag_in_environment(
55+
feature_flag_data_id.clone(),
56+
environment_data_id.clone(),
57+
body,
58+
)
59+
.await;
60+
if let Ok(value) = resp {
61+
println!("{:#?}", value);
62+
} else {
63+
println!("{:#?}", resp.unwrap_err());
64+
}
65+
}

0 commit comments

Comments
 (0)