diff --git a/.generator/schemas/v1/openapi.yaml b/.generator/schemas/v1/openapi.yaml index a38d274f9..3e86f3a82 100644 --- a/.generator/schemas/v1/openapi.yaml +++ b/.generator/schemas/v1/openapi.yaml @@ -11900,6 +11900,60 @@ components: example: UTC type: string type: object + SLOCountDefinition: + description: 'A count-based (metric) SLI specification, composed of three parts: + the good events formula, the total events formula, + + and the underlying queries.' + example: + good_events_formula: query1 - query2 + queries: + - data_source: metrics + name: query1 + query: sum:trace.servlet.request.hits{*} by {env}.as_count() + - data_source: metrics + name: query2 + query: sum:trace.servlet.request.errors{*} by {env}.as_count() + total_events_formula: query1 + properties: + good_events_formula: + $ref: '#/components/schemas/SLOFormula' + queries: + example: + - data_source: metrics + name: query1 + query: sum:trace.servlet.request.hits{*} by {env}.as_count() + items: + $ref: '#/components/schemas/SLODataSourceQueryDefinition' + minItems: 1 + type: array + total_events_formula: + $ref: '#/components/schemas/SLOFormula' + required: + - good_events_formula + - total_events_formula + - queries + type: object + SLOCountSpec: + additionalProperties: false + description: A metric SLI specification. + example: + count: + good_events_formula: query1 - query2 + queries: + - data_source: metrics + name: query1 + query: sum:trace.servlet.request.hits{*} by {env}.as_count() + - data_source: metrics + name: query2 + query: sum:trace.servlet.request.errors{*} by {env}.as_count() + total_events_formula: query1 + properties: + count: + $ref: '#/components/schemas/SLOCountDefinition' + required: + - count + type: object SLOCreator: description: The creator of the SLO nullable: true @@ -12747,8 +12801,12 @@ components: type: string query: $ref: '#/components/schemas/ServiceLevelObjectiveQuery' + description: The metric query used to define a count-based SLO as the ratio + of good events to total events. sli_specification: $ref: '#/components/schemas/SLOSliSpec' + description: A generic SLI specification. This is currently used for time-slice + and count-based (metric) SLOs only. tags: description: 'A list of tags associated with this service level objective. @@ -12804,10 +12862,11 @@ components: type: number type: object SLOSliSpec: - description: A generic SLI specification. This is currently used for time-slice - SLOs only. + description: A generic SLI specification. This is used for time-slice and count-based + (metric) SLOs only. oneOf: - $ref: '#/components/schemas/SLOTimeSliceSpec' + - $ref: '#/components/schemas/SLOCountSpec' SLOState: description: State of the SLO. enum: @@ -13959,7 +14018,8 @@ components: - type type: object ServiceLevelObjectiveQuery: - description: 'A metric-based SLO. **Required if type is `metric`**. Note that + description: 'A count-based (metric) SLO query. This field is superseded by + `sli_specification` but is retained for backwards compatibility. Note that Datadog only allows the sum by aggregator to be used because this will sum up all request counts instead of averaging diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index 83eb28817..73c6d6737 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -14428,7 +14428,7 @@ components: key: cost_center value: engineering case_insensitivity: false - if_not_exists: true + if_tag_exists: do_not_apply query: account_id:"123456789" AND service:"web-api" reference_table: null id: New Ruleset @@ -14473,7 +14473,7 @@ components: example: false type: boolean mapping: - $ref: '#/components/schemas/CreateRulesetRequestDataAttributesRulesItemsMapping' + $ref: '#/components/schemas/DataAttributesRulesItemsMapping' metadata: $ref: '#/components/schemas/RulesetItemMetadata' name: @@ -14488,31 +14488,6 @@ components: - enabled - name type: object - CreateRulesetRequestDataAttributesRulesItemsMapping: - description: The definition of `CreateRulesetRequestDataAttributesRulesItemsMapping` - object. - nullable: true - properties: - destination_key: - description: The `mapping` `destination_key`. - example: '' - type: string - if_not_exists: - description: The `mapping` `if_not_exists`. - example: false - type: boolean - source_keys: - description: The `mapping` `source_keys`. - example: - - '' - items: - type: string - type: array - required: - - destination_key - - if_not_exists - - source_keys - type: object CreateRulesetRequestDataAttributesRulesItemsQuery: description: The definition of `CreateRulesetRequestDataAttributesRulesItemsQuery` object. @@ -14524,16 +14499,17 @@ components: description: The `query` `case_insensitivity`. type: boolean if_not_exists: - description: The `query` `if_not_exists`. - example: false + deprecated: true + description: Deprecated. Use `if_tag_exists` instead. The `query` `if_not_exists`. type: boolean + if_tag_exists: + $ref: '#/components/schemas/DataAttributesRulesItemsIfTagExists' query: description: The `query` `query`. example: '' type: string required: - addition - - if_not_exists - query type: object CreateRulesetRequestDataAttributesRulesItemsQueryAddition: @@ -14567,8 +14543,12 @@ components: $ref: '#/components/schemas/CreateRulesetRequestDataAttributesRulesItemsReferenceTableFieldPairsItems' type: array if_not_exists: - description: The `reference_table` `if_not_exists`. + deprecated: true + description: Deprecated. Use `if_tag_exists` instead. The `reference_table` + `if_not_exists`. type: boolean + if_tag_exists: + $ref: '#/components/schemas/DataAttributesRulesItemsIfTagExists' source_keys: description: The `reference_table` `source_keys`. example: @@ -18273,6 +18253,42 @@ components: - INTEGRATION_SCREENBOARD - INTEGRATION_TIMEBOARD - HOST_TIMEBOARD + DataAttributesRulesItemsIfTagExists: + description: The behavior when the tag already exists. + enum: + - append + - do_not_apply + - replace + type: string + x-enum-varnames: + - APPEND + - DO_NOT_APPLY + - REPLACE + DataAttributesRulesItemsMapping: + description: The definition of `DataAttributesRulesItemsMapping` object. + nullable: true + properties: + destination_key: + description: The `mapping` `destination_key`. + example: '' + type: string + if_not_exists: + deprecated: true + description: Deprecated. Use `if_tag_exists` instead. The `mapping` `if_not_exists`. + type: boolean + if_tag_exists: + $ref: '#/components/schemas/DataAttributesRulesItemsIfTagExists' + source_keys: + description: The `mapping` `source_keys`. + example: + - '' + items: + type: string + type: array + required: + - destination_key + - source_keys + type: object DataDeletionResponseItem: description: The created data deletion request information. properties: @@ -50015,13 +50031,13 @@ components: key: abc value: ww case_insensitivity: false - if_not_exists: true + if_tag_exists: do_not_apply query: billingcurrency:"USD" AND account_name:"SZA96462" AND billingcurrency:"USD" reference_table: null - enabled: true mapping: destination_key: h - if_not_exists: true + if_tag_exists: do_not_apply source_keys: - accountname - accountownerid @@ -50041,7 +50057,7 @@ components: output_key: status - input_column: status_description output_key: dess - if_not_exists: false + if_tag_exists: append source_keys: - http_status - status_description @@ -50074,13 +50090,13 @@ components: key: environment value: production case_insensitivity: false - if_not_exists: true + if_tag_exists: do_not_apply query: billingcurrency:"USD" AND account_name:"prod-account" reference_table: null - enabled: true mapping: destination_key: team_owner - if_not_exists: true + if_tag_exists: do_not_apply source_keys: - account_name - service @@ -50100,7 +50116,7 @@ components: output_key: status - input_column: status_description output_key: dess - if_not_exists: false + if_tag_exists: append source_keys: - http_status - status_description @@ -50125,7 +50141,7 @@ components: key: cost_center value: engineering case_insensitivity: true - if_not_exists: true + if_tag_exists: do_not_apply query: account_name:"dev-*" reference_table: null version: 1 @@ -50236,7 +50252,7 @@ components: example: false type: boolean mapping: - $ref: '#/components/schemas/RulesetRespDataAttributesRulesItemsMapping' + $ref: '#/components/schemas/DataAttributesRulesItemsMapping' metadata: $ref: '#/components/schemas/RulesetItemMetadata' name: @@ -50251,31 +50267,6 @@ components: - enabled - name type: object - RulesetRespDataAttributesRulesItemsMapping: - description: The definition of `RulesetRespDataAttributesRulesItemsMapping` - object. - nullable: true - properties: - destination_key: - description: The `mapping` `destination_key`. - example: '' - type: string - if_not_exists: - description: The `mapping` `if_not_exists`. - example: false - type: boolean - source_keys: - description: The `mapping` `source_keys`. - example: - - '' - items: - type: string - type: array - required: - - destination_key - - if_not_exists - - source_keys - type: object RulesetRespDataAttributesRulesItemsQuery: description: The definition of `RulesetRespDataAttributesRulesItemsQuery` object. nullable: true @@ -50286,16 +50277,17 @@ components: description: The `query` `case_insensitivity`. type: boolean if_not_exists: - description: The `query` `if_not_exists`. - example: false + deprecated: true + description: Deprecated. Use `if_tag_exists` instead. The `query` `if_not_exists`. type: boolean + if_tag_exists: + $ref: '#/components/schemas/DataAttributesRulesItemsIfTagExists' query: description: The `query` `query`. example: '' type: string required: - addition - - if_not_exists - query type: object RulesetRespDataAttributesRulesItemsQueryAddition: @@ -50329,8 +50321,12 @@ components: $ref: '#/components/schemas/RulesetRespDataAttributesRulesItemsReferenceTableFieldPairsItems' type: array if_not_exists: - description: The `reference_table` `if_not_exists`. + deprecated: true + description: Deprecated. Use `if_tag_exists` instead. The `reference_table` + `if_not_exists`. type: boolean + if_tag_exists: + $ref: '#/components/schemas/DataAttributesRulesItemsIfTagExists' source_keys: description: The `reference_table` `source_keys`. example: @@ -65276,13 +65272,13 @@ components: key: cost_center value: engineering case_insensitivity: false - if_not_exists: true + if_tag_exists: do_not_apply query: account_id:"123456789" AND service:"web-api" reference_table: null - enabled: true mapping: destination_key: team_owner - if_not_exists: true + if_tag_exists: do_not_apply source_keys: - account_name - account_id @@ -65302,7 +65298,7 @@ components: output_key: status - input_column: status_description output_key: dess - if_not_exists: false + if_tag_exists: append source_keys: - http_status - status_description @@ -65354,7 +65350,7 @@ components: example: false type: boolean mapping: - $ref: '#/components/schemas/UpdateRulesetRequestDataAttributesRulesItemsMapping' + $ref: '#/components/schemas/DataAttributesRulesItemsMapping' metadata: $ref: '#/components/schemas/RulesetItemMetadata' name: @@ -65369,31 +65365,6 @@ components: - enabled - name type: object - UpdateRulesetRequestDataAttributesRulesItemsMapping: - description: The definition of `UpdateRulesetRequestDataAttributesRulesItemsMapping` - object. - nullable: true - properties: - destination_key: - description: The `mapping` `destination_key`. - example: '' - type: string - if_not_exists: - description: The `mapping` `if_not_exists`. - example: false - type: boolean - source_keys: - description: The `mapping` `source_keys`. - example: - - '' - items: - type: string - type: array - required: - - destination_key - - if_not_exists - - source_keys - type: object UpdateRulesetRequestDataAttributesRulesItemsQuery: description: The definition of `UpdateRulesetRequestDataAttributesRulesItemsQuery` object. @@ -65405,16 +65376,17 @@ components: description: The `query` `case_insensitivity`. type: boolean if_not_exists: - description: The `query` `if_not_exists`. - example: false + deprecated: true + description: Deprecated. Use `if_tag_exists` instead. The `query` `if_not_exists`. type: boolean + if_tag_exists: + $ref: '#/components/schemas/DataAttributesRulesItemsIfTagExists' query: description: The `query` `query`. example: '' type: string required: - addition - - if_not_exists - query type: object UpdateRulesetRequestDataAttributesRulesItemsQueryAddition: @@ -65448,8 +65420,12 @@ components: $ref: '#/components/schemas/UpdateRulesetRequestDataAttributesRulesItemsReferenceTableFieldPairsItems' type: array if_not_exists: - description: The `reference_table` `if_not_exists`. + deprecated: true + description: Deprecated. Use `if_tag_exists` instead. The `reference_table` + `if_not_exists`. type: boolean + if_tag_exists: + $ref: '#/components/schemas/DataAttributesRulesItemsIfTagExists' source_keys: description: The `reference_table` `source_keys`. example: diff --git a/examples/v1_service-level-objectives_CreateSLO_512760759.rs b/examples/v1_service-level-objectives_CreateSLO_512760759.rs new file mode 100644 index 000000000..ef2a8215e --- /dev/null +++ b/examples/v1_service-level-objectives_CreateSLO_512760759.rs @@ -0,0 +1,61 @@ +// Create a new metric SLO object using sli_specification returns "OK" response +use datadog_api_client::datadog; +use datadog_api_client::datadogV1::api_service_level_objectives::ServiceLevelObjectivesAPI; +use datadog_api_client::datadogV1::model::FormulaAndFunctionMetricDataSource; +use datadog_api_client::datadogV1::model::FormulaAndFunctionMetricQueryDefinition; +use datadog_api_client::datadogV1::model::SLOCountDefinition; +use datadog_api_client::datadogV1::model::SLOCountSpec; +use datadog_api_client::datadogV1::model::SLODataSourceQueryDefinition; +use datadog_api_client::datadogV1::model::SLOFormula; +use datadog_api_client::datadogV1::model::SLOSliSpec; +use datadog_api_client::datadogV1::model::SLOThreshold; +use datadog_api_client::datadogV1::model::SLOTimeframe; +use datadog_api_client::datadogV1::model::SLOType; +use datadog_api_client::datadogV1::model::ServiceLevelObjectiveRequest; + +#[tokio::main] +async fn main() { + let body = ServiceLevelObjectiveRequest::new( + "Example-Service-Level-Objective".to_string(), + vec![SLOThreshold::new(99.0, SLOTimeframe::SEVEN_DAYS) + .target_display("99.0".to_string()) + .warning(99.5 as f64) + .warning_display("99.5".to_string())], + SLOType::METRIC, + ) + .description(Some("Metric SLO using sli_specification".to_string())) + .sli_specification(SLOSliSpec::SLOCountSpec(Box::new(SLOCountSpec::new( + SLOCountDefinition::new( + SLOFormula::new("query1 - query2".to_string()), + vec![ + SLODataSourceQueryDefinition::FormulaAndFunctionMetricQueryDefinition(Box::new( + FormulaAndFunctionMetricQueryDefinition::new( + FormulaAndFunctionMetricDataSource::METRICS, + "query1".to_string(), + "sum:httpservice.hits{*}.as_count()".to_string(), + ), + )), + SLODataSourceQueryDefinition::FormulaAndFunctionMetricQueryDefinition(Box::new( + FormulaAndFunctionMetricQueryDefinition::new( + FormulaAndFunctionMetricDataSource::METRICS, + "query2".to_string(), + "sum:httpservice.errors{*}.as_count()".to_string(), + ), + )), + ], + SLOFormula::new("query1".to_string()), + ), + )))) + .tags(vec!["env:prod".to_string(), "type:count".to_string()]) + .target_threshold(99.0 as f64) + .timeframe(SLOTimeframe::SEVEN_DAYS) + .warning_threshold(99.5 as f64); + let configuration = datadog::Configuration::new(); + let api = ServiceLevelObjectivesAPI::with_config(configuration); + let resp = api.create_slo(body).await; + if let Ok(value) = resp { + println!("{:#?}", value); + } else { + println!("{:#?}", resp.unwrap_err()); + } +} diff --git a/examples/v2_cloud-cost-management_CreateTagPipelinesRuleset.rs b/examples/v2_cloud-cost-management_CreateTagPipelinesRuleset.rs index df2c12598..276069d2d 100644 --- a/examples/v2_cloud-cost-management_CreateTagPipelinesRuleset.rs +++ b/examples/v2_cloud-cost-management_CreateTagPipelinesRuleset.rs @@ -28,10 +28,10 @@ async fn main() { "engineering".to_string(), ), ), - true, r#"account_id:"123456789" AND service:"web-api""#.to_string(), ) - .case_insensitivity(false), + .case_insensitivity(false) + .if_not_exists(true), )) .reference_table(None), ]) diff --git a/examples/v2_cloud-cost-management_CreateTagPipelinesRuleset_1897535856.rs b/examples/v2_cloud-cost-management_CreateTagPipelinesRuleset_1897535856.rs new file mode 100644 index 000000000..960a322ee --- /dev/null +++ b/examples/v2_cloud-cost-management_CreateTagPipelinesRuleset_1897535856.rs @@ -0,0 +1,51 @@ +// Create tag pipeline ruleset with if_tag_exists returns "OK" response +use datadog_api_client::datadog; +use datadog_api_client::datadogV2::api_cloud_cost_management::CloudCostManagementAPI; +use datadog_api_client::datadogV2::model::CreateRulesetRequest; +use datadog_api_client::datadogV2::model::CreateRulesetRequestData; +use datadog_api_client::datadogV2::model::CreateRulesetRequestDataAttributes; +use datadog_api_client::datadogV2::model::CreateRulesetRequestDataAttributesRulesItems; +use datadog_api_client::datadogV2::model::CreateRulesetRequestDataAttributesRulesItemsQuery; +use datadog_api_client::datadogV2::model::CreateRulesetRequestDataAttributesRulesItemsQueryAddition; +use datadog_api_client::datadogV2::model::CreateRulesetRequestDataType; +use datadog_api_client::datadogV2::model::DataAttributesRulesItemsIfTagExists; + +#[tokio::main] +async fn main() { + let body = CreateRulesetRequest::new().data( + CreateRulesetRequestData::new(CreateRulesetRequestDataType::CREATE_RULESET) + .attributes( + CreateRulesetRequestDataAttributes::new(vec![ + CreateRulesetRequestDataAttributesRulesItems::new( + true, + "Add Cost Center Tag".to_string(), + ) + .mapping(None) + .query(Some( + CreateRulesetRequestDataAttributesRulesItemsQuery::new( + Some( + CreateRulesetRequestDataAttributesRulesItemsQueryAddition::new( + "cost_center".to_string(), + "engineering".to_string(), + ), + ), + r#"account_id:"123456789" AND service:"web-api""#.to_string(), + ) + .case_insensitivity(false) + .if_tag_exists(DataAttributesRulesItemsIfTagExists::REPLACE), + )) + .reference_table(None), + ]) + .enabled(true), + ) + .id("New Ruleset".to_string()), + ); + let configuration = datadog::Configuration::new(); + let api = CloudCostManagementAPI::with_config(configuration); + let resp = api.create_tag_pipelines_ruleset(body).await; + if let Ok(value) = resp { + println!("{:#?}", value); + } else { + println!("{:#?}", resp.unwrap_err()); + } +} diff --git a/examples/v2_cloud-cost-management_UpdateTagPipelinesRuleset.rs b/examples/v2_cloud-cost-management_UpdateTagPipelinesRuleset.rs index 5a5802d81..2108d656a 100644 --- a/examples/v2_cloud-cost-management_UpdateTagPipelinesRuleset.rs +++ b/examples/v2_cloud-cost-management_UpdateTagPipelinesRuleset.rs @@ -1,11 +1,11 @@ // Update tag pipeline ruleset returns "OK" response use datadog_api_client::datadog; use datadog_api_client::datadogV2::api_cloud_cost_management::CloudCostManagementAPI; +use datadog_api_client::datadogV2::model::DataAttributesRulesItemsMapping; use datadog_api_client::datadogV2::model::UpdateRulesetRequest; use datadog_api_client::datadogV2::model::UpdateRulesetRequestData; use datadog_api_client::datadogV2::model::UpdateRulesetRequestDataAttributes; use datadog_api_client::datadogV2::model::UpdateRulesetRequestDataAttributesRulesItems; -use datadog_api_client::datadogV2::model::UpdateRulesetRequestDataAttributesRulesItemsMapping; use datadog_api_client::datadogV2::model::UpdateRulesetRequestDataType; #[tokio::main] @@ -20,11 +20,11 @@ async fn main() { "Account Name Mapping".to_string(), ) .mapping(Some( - UpdateRulesetRequestDataAttributesRulesItemsMapping::new( + DataAttributesRulesItemsMapping::new( "team_owner".to_string(), - true, vec!["account_name".to_string(), "account_id".to_string()], - ), + ) + .if_not_exists(true), )) .query(None) .reference_table(None)], diff --git a/examples/v2_cloud-cost-management_UpdateTagPipelinesRuleset_1964644735.rs b/examples/v2_cloud-cost-management_UpdateTagPipelinesRuleset_1964644735.rs new file mode 100644 index 000000000..f6046fa95 --- /dev/null +++ b/examples/v2_cloud-cost-management_UpdateTagPipelinesRuleset_1964644735.rs @@ -0,0 +1,47 @@ +// Update tag pipeline ruleset with if_tag_exists returns "OK" response +use datadog_api_client::datadog; +use datadog_api_client::datadogV2::api_cloud_cost_management::CloudCostManagementAPI; +use datadog_api_client::datadogV2::model::DataAttributesRulesItemsIfTagExists; +use datadog_api_client::datadogV2::model::DataAttributesRulesItemsMapping; +use datadog_api_client::datadogV2::model::UpdateRulesetRequest; +use datadog_api_client::datadogV2::model::UpdateRulesetRequestData; +use datadog_api_client::datadogV2::model::UpdateRulesetRequestDataAttributes; +use datadog_api_client::datadogV2::model::UpdateRulesetRequestDataAttributesRulesItems; +use datadog_api_client::datadogV2::model::UpdateRulesetRequestDataType; + +#[tokio::main] +async fn main() { + let body = UpdateRulesetRequest::new().data( + UpdateRulesetRequestData::new(UpdateRulesetRequestDataType::UPDATE_RULESET) + .attributes( + UpdateRulesetRequestDataAttributes::new( + true, + vec![UpdateRulesetRequestDataAttributesRulesItems::new( + true, + "Account Name Mapping".to_string(), + ) + .mapping(Some( + DataAttributesRulesItemsMapping::new( + "team_owner".to_string(), + vec!["account_name".to_string(), "account_id".to_string()], + ) + .if_tag_exists(DataAttributesRulesItemsIfTagExists::REPLACE), + )) + .query(None) + .reference_table(None)], + ) + .last_version(3611102), + ) + .id("New Ruleset".to_string()), + ); + let configuration = datadog::Configuration::new(); + let api = CloudCostManagementAPI::with_config(configuration); + let resp = api + .update_tag_pipelines_ruleset("ee10c3ff-312f-464c-b4f6-46adaa6d00a1".to_string(), body) + .await; + if let Ok(value) = resp { + println!("{:#?}", value); + } else { + println!("{:#?}", resp.unwrap_err()); + } +} diff --git a/src/datadogV1/model/mod.rs b/src/datadogV1/model/mod.rs index 900a8052d..311929679 100644 --- a/src/datadogV1/model/mod.rs +++ b/src/datadogV1/model/mod.rs @@ -1268,6 +1268,10 @@ pub mod model_slo_data_source_query_definition; pub use self::model_slo_data_source_query_definition::SLODataSourceQueryDefinition; pub mod model_slo_time_slice_interval; pub use self::model_slo_time_slice_interval::SLOTimeSliceInterval; +pub mod model_slo_count_spec; +pub use self::model_slo_count_spec::SLOCountSpec; +pub mod model_slo_count_definition; +pub use self::model_slo_count_definition::SLOCountDefinition; pub mod model_slo_sli_spec; pub use self::model_slo_sli_spec::SLOSliSpec; pub mod model_slo_threshold; diff --git a/src/datadogV1/model/model_service_level_objective.rs b/src/datadogV1/model/model_service_level_objective.rs index 6f0a90228..e9a4abd5a 100644 --- a/src/datadogV1/model/model_service_level_objective.rs +++ b/src/datadogV1/model/model_service_level_objective.rs @@ -62,12 +62,12 @@ pub struct ServiceLevelObjective { /// The name of the service level objective object. #[serde(rename = "name")] pub name: String, - /// A metric-based SLO. **Required if type is `metric`**. Note that Datadog only allows the sum by aggregator + /// A count-based (metric) SLO query. This field is superseded by `sli_specification` but is retained for backwards compatibility. Note that Datadog only allows the sum by aggregator /// to be used because this will sum up all request counts instead of averaging them, or taking the max or /// min of all of those requests. #[serde(rename = "query")] pub query: Option, - /// A generic SLI specification. This is currently used for time-slice SLOs only. + /// A generic SLI specification. This is used for time-slice and count-based (metric) SLOs only. #[serde(rename = "sli_specification")] pub sli_specification: Option, /// A list of tags associated with this service level objective. diff --git a/src/datadogV1/model/model_service_level_objective_query.rs b/src/datadogV1/model/model_service_level_objective_query.rs index ef4e31f8f..ffadba75c 100644 --- a/src/datadogV1/model/model_service_level_objective_query.rs +++ b/src/datadogV1/model/model_service_level_objective_query.rs @@ -6,7 +6,7 @@ use serde::{Deserialize, Deserializer, Serialize}; use serde_with::skip_serializing_none; use std::fmt::{self, Formatter}; -/// A metric-based SLO. **Required if type is `metric`**. Note that Datadog only allows the sum by aggregator +/// A count-based (metric) SLO query. This field is superseded by `sli_specification` but is retained for backwards compatibility. Note that Datadog only allows the sum by aggregator /// to be used because this will sum up all request counts instead of averaging them, or taking the max or /// min of all of those requests. #[non_exhaustive] diff --git a/src/datadogV1/model/model_service_level_objective_request.rs b/src/datadogV1/model/model_service_level_objective_request.rs index 1a673bd88..d666fab2b 100644 --- a/src/datadogV1/model/model_service_level_objective_request.rs +++ b/src/datadogV1/model/model_service_level_objective_request.rs @@ -36,12 +36,12 @@ pub struct ServiceLevelObjectiveRequest { /// The name of the service level objective object. #[serde(rename = "name")] pub name: String, - /// A metric-based SLO. **Required if type is `metric`**. Note that Datadog only allows the sum by aggregator + /// A count-based (metric) SLO query. This field is superseded by `sli_specification` but is retained for backwards compatibility. Note that Datadog only allows the sum by aggregator /// to be used because this will sum up all request counts instead of averaging them, or taking the max or /// min of all of those requests. #[serde(rename = "query")] pub query: Option, - /// A generic SLI specification. This is currently used for time-slice SLOs only. + /// A generic SLI specification. This is used for time-slice and count-based (metric) SLOs only. #[serde(rename = "sli_specification")] pub sli_specification: Option, /// A list of tags associated with this service level objective. diff --git a/src/datadogV1/model/model_slo_count_definition.rs b/src/datadogV1/model/model_slo_count_definition.rs new file mode 100644 index 000000000..108f9dc88 --- /dev/null +++ b/src/datadogV1/model/model_slo_count_definition.rs @@ -0,0 +1,122 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. +use serde::de::{Error, MapAccess, Visitor}; +use serde::{Deserialize, Deserializer, Serialize}; +use serde_with::skip_serializing_none; +use std::fmt::{self, Formatter}; + +/// A count-based (metric) SLI specification, composed of three parts: the good events formula, the total events formula, +/// and the underlying queries. +#[non_exhaustive] +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize)] +pub struct SLOCountDefinition { + /// A formula that specifies how to combine the results of multiple queries. + #[serde(rename = "good_events_formula")] + pub good_events_formula: crate::datadogV1::model::SLOFormula, + #[serde(rename = "queries")] + pub queries: Vec, + /// A formula that specifies how to combine the results of multiple queries. + #[serde(rename = "total_events_formula")] + pub total_events_formula: crate::datadogV1::model::SLOFormula, + #[serde(flatten)] + pub additional_properties: std::collections::BTreeMap, + #[serde(skip)] + #[serde(default)] + pub(crate) _unparsed: bool, +} + +impl SLOCountDefinition { + pub fn new( + good_events_formula: crate::datadogV1::model::SLOFormula, + queries: Vec, + total_events_formula: crate::datadogV1::model::SLOFormula, + ) -> SLOCountDefinition { + SLOCountDefinition { + good_events_formula, + queries, + total_events_formula, + additional_properties: std::collections::BTreeMap::new(), + _unparsed: false, + } + } + + pub fn additional_properties( + mut self, + value: std::collections::BTreeMap, + ) -> Self { + self.additional_properties = value; + self + } +} + +impl<'de> Deserialize<'de> for SLOCountDefinition { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct SLOCountDefinitionVisitor; + impl<'a> Visitor<'a> for SLOCountDefinitionVisitor { + type Value = SLOCountDefinition; + + fn expecting(&self, f: &mut Formatter<'_>) -> fmt::Result { + f.write_str("a mapping") + } + + fn visit_map(self, mut map: M) -> Result + where + M: MapAccess<'a>, + { + let mut good_events_formula: Option = None; + let mut queries: Option< + Vec, + > = None; + let mut total_events_formula: Option = None; + let mut additional_properties: std::collections::BTreeMap< + String, + serde_json::Value, + > = std::collections::BTreeMap::new(); + let mut _unparsed = false; + + while let Some((k, v)) = map.next_entry::()? { + match k.as_str() { + "good_events_formula" => { + good_events_formula = + Some(serde_json::from_value(v).map_err(M::Error::custom)?); + } + "queries" => { + queries = Some(serde_json::from_value(v).map_err(M::Error::custom)?); + } + "total_events_formula" => { + total_events_formula = + Some(serde_json::from_value(v).map_err(M::Error::custom)?); + } + &_ => { + if let Ok(value) = serde_json::from_value(v.clone()) { + additional_properties.insert(k, value); + } + } + } + } + let good_events_formula = good_events_formula + .ok_or_else(|| M::Error::missing_field("good_events_formula"))?; + let queries = queries.ok_or_else(|| M::Error::missing_field("queries"))?; + let total_events_formula = total_events_formula + .ok_or_else(|| M::Error::missing_field("total_events_formula"))?; + + let content = SLOCountDefinition { + good_events_formula, + queries, + total_events_formula, + additional_properties, + _unparsed, + }; + + Ok(content) + } + } + + deserializer.deserialize_any(SLOCountDefinitionVisitor) + } +} diff --git a/src/datadogV1/model/model_slo_count_spec.rs b/src/datadogV1/model/model_slo_count_spec.rs new file mode 100644 index 000000000..160b78af3 --- /dev/null +++ b/src/datadogV1/model/model_slo_count_spec.rs @@ -0,0 +1,74 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. +use serde::de::{Error, MapAccess, Visitor}; +use serde::{Deserialize, Deserializer, Serialize}; +use serde_with::skip_serializing_none; +use std::fmt::{self, Formatter}; + +/// A metric SLI specification. +#[non_exhaustive] +#[skip_serializing_none] +#[derive(Clone, Debug, PartialEq, Serialize)] +pub struct SLOCountSpec { + /// A count-based (metric) SLI specification, composed of three parts: the good events formula, the total events formula, + /// and the underlying queries. + #[serde(rename = "count")] + pub count: crate::datadogV1::model::SLOCountDefinition, + #[serde(skip)] + #[serde(default)] + pub(crate) _unparsed: bool, +} + +impl SLOCountSpec { + pub fn new(count: crate::datadogV1::model::SLOCountDefinition) -> SLOCountSpec { + SLOCountSpec { + count, + _unparsed: false, + } + } +} + +impl<'de> Deserialize<'de> for SLOCountSpec { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct SLOCountSpecVisitor; + impl<'a> Visitor<'a> for SLOCountSpecVisitor { + type Value = SLOCountSpec; + + fn expecting(&self, f: &mut Formatter<'_>) -> fmt::Result { + f.write_str("a mapping") + } + + fn visit_map(self, mut map: M) -> Result + where + M: MapAccess<'a>, + { + let mut count: Option = None; + let mut _unparsed = false; + + while let Some((k, v)) = map.next_entry::()? { + match k.as_str() { + "count" => { + count = Some(serde_json::from_value(v).map_err(M::Error::custom)?); + } + &_ => { + return Err(serde::de::Error::custom( + "Additional properties not allowed", + )); + } + } + } + let count = count.ok_or_else(|| M::Error::missing_field("count"))?; + + let content = SLOCountSpec { count, _unparsed }; + + Ok(content) + } + } + + deserializer.deserialize_any(SLOCountSpecVisitor) + } +} diff --git a/src/datadogV1/model/model_slo_response_data.rs b/src/datadogV1/model/model_slo_response_data.rs index 56b1e9ac5..e27bcb6ca 100644 --- a/src/datadogV1/model/model_slo_response_data.rs +++ b/src/datadogV1/model/model_slo_response_data.rs @@ -65,12 +65,12 @@ pub struct SLOResponseData { /// The name of the service level objective object. #[serde(rename = "name")] pub name: Option, - /// A metric-based SLO. **Required if type is `metric`**. Note that Datadog only allows the sum by aggregator + /// A count-based (metric) SLO query. This field is superseded by `sli_specification` but is retained for backwards compatibility. Note that Datadog only allows the sum by aggregator /// to be used because this will sum up all request counts instead of averaging them, or taking the max or /// min of all of those requests. #[serde(rename = "query")] pub query: Option, - /// A generic SLI specification. This is currently used for time-slice SLOs only. + /// A generic SLI specification. This is used for time-slice and count-based (metric) SLOs only. #[serde(rename = "sli_specification")] pub sli_specification: Option, /// A list of tags associated with this service level objective. diff --git a/src/datadogV1/model/model_slo_sli_spec.rs b/src/datadogV1/model/model_slo_sli_spec.rs index 12687266a..b0578a3b4 100644 --- a/src/datadogV1/model/model_slo_sli_spec.rs +++ b/src/datadogV1/model/model_slo_sli_spec.rs @@ -3,12 +3,13 @@ // Copyright 2019-Present Datadog, Inc. use serde::{Deserialize, Deserializer, Serialize}; -/// A generic SLI specification. This is currently used for time-slice SLOs only. +/// A generic SLI specification. This is used for time-slice and count-based (metric) SLOs only. #[non_exhaustive] #[derive(Clone, Debug, PartialEq, Serialize)] #[serde(untagged)] pub enum SLOSliSpec { SLOTimeSliceSpec(Box), + SLOCountSpec(Box), UnparsedObject(crate::datadog::UnparsedObject), } @@ -25,6 +26,13 @@ impl<'de> Deserialize<'de> for SLOSliSpec { return Ok(SLOSliSpec::SLOTimeSliceSpec(_v)); } } + if let Ok(_v) = + serde_json::from_value::>(value.clone()) + { + if !_v._unparsed { + return Ok(SLOSliSpec::SLOCountSpec(_v)); + } + } return Ok(SLOSliSpec::UnparsedObject(crate::datadog::UnparsedObject { value, diff --git a/src/datadogV2/model/mod.rs b/src/datadogV2/model/mod.rs index 0626a19f6..bd048f077 100644 --- a/src/datadogV2/model/mod.rs +++ b/src/datadogV2/model/mod.rs @@ -7852,8 +7852,10 @@ pub mod model_ruleset_resp_data_attributes_modified; pub use self::model_ruleset_resp_data_attributes_modified::RulesetRespDataAttributesModified; pub mod model_ruleset_resp_data_attributes_rules_items; pub use self::model_ruleset_resp_data_attributes_rules_items::RulesetRespDataAttributesRulesItems; -pub mod model_ruleset_resp_data_attributes_rules_items_mapping; -pub use self::model_ruleset_resp_data_attributes_rules_items_mapping::RulesetRespDataAttributesRulesItemsMapping; +pub mod model_data_attributes_rules_items_mapping; +pub use self::model_data_attributes_rules_items_mapping::DataAttributesRulesItemsMapping; +pub mod model_data_attributes_rules_items_if_tag_exists; +pub use self::model_data_attributes_rules_items_if_tag_exists::DataAttributesRulesItemsIfTagExists; pub mod model_ruleset_resp_data_attributes_rules_items_query; pub use self::model_ruleset_resp_data_attributes_rules_items_query::RulesetRespDataAttributesRulesItemsQuery; pub mod model_ruleset_resp_data_attributes_rules_items_query_addition; @@ -7872,8 +7874,6 @@ pub mod model_create_ruleset_request_data_attributes; pub use self::model_create_ruleset_request_data_attributes::CreateRulesetRequestDataAttributes; pub mod model_create_ruleset_request_data_attributes_rules_items; pub use self::model_create_ruleset_request_data_attributes_rules_items::CreateRulesetRequestDataAttributesRulesItems; -pub mod model_create_ruleset_request_data_attributes_rules_items_mapping; -pub use self::model_create_ruleset_request_data_attributes_rules_items_mapping::CreateRulesetRequestDataAttributesRulesItemsMapping; pub mod model_create_ruleset_request_data_attributes_rules_items_query; pub use self::model_create_ruleset_request_data_attributes_rules_items_query::CreateRulesetRequestDataAttributesRulesItemsQuery; pub mod model_create_ruleset_request_data_attributes_rules_items_query_addition; @@ -7916,8 +7916,6 @@ pub mod model_update_ruleset_request_data_attributes; pub use self::model_update_ruleset_request_data_attributes::UpdateRulesetRequestDataAttributes; pub mod model_update_ruleset_request_data_attributes_rules_items; pub use self::model_update_ruleset_request_data_attributes_rules_items::UpdateRulesetRequestDataAttributesRulesItems; -pub mod model_update_ruleset_request_data_attributes_rules_items_mapping; -pub use self::model_update_ruleset_request_data_attributes_rules_items_mapping::UpdateRulesetRequestDataAttributesRulesItemsMapping; pub mod model_update_ruleset_request_data_attributes_rules_items_query; pub use self::model_update_ruleset_request_data_attributes_rules_items_query::UpdateRulesetRequestDataAttributesRulesItemsQuery; pub mod model_update_ruleset_request_data_attributes_rules_items_query_addition; diff --git a/src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items.rs b/src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items.rs index 5f6cc3e93..185bab2ae 100644 --- a/src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items.rs +++ b/src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items.rs @@ -14,15 +14,13 @@ pub struct CreateRulesetRequestDataAttributesRulesItems { /// The `items` `enabled`. #[serde(rename = "enabled")] pub enabled: bool, - /// The definition of `CreateRulesetRequestDataAttributesRulesItemsMapping` object. + /// The definition of `DataAttributesRulesItemsMapping` object. #[serde( rename = "mapping", default, with = "::serde_with::rust::double_option" )] - pub mapping: Option< - Option, - >, + pub mapping: Option>, /// The `items` `metadata`. #[serde( rename = "metadata", @@ -69,7 +67,7 @@ impl CreateRulesetRequestDataAttributesRulesItems { pub fn mapping( mut self, - value: Option, + value: Option, ) -> Self { self.mapping = Some(value); self @@ -125,7 +123,9 @@ impl<'de> Deserialize<'de> for CreateRulesetRequestDataAttributesRulesItems { M: MapAccess<'a>, { let mut enabled: Option = None; - let mut mapping: Option> = None; + let mut mapping: Option< + Option, + > = None; let mut metadata: Option>> = None; let mut name: Option = None; let mut query: Option< diff --git a/src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items_query.rs b/src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items_query.rs index 66ccc9673..33b83c49c 100644 --- a/src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items_query.rs +++ b/src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items_query.rs @@ -19,9 +19,13 @@ pub struct CreateRulesetRequestDataAttributesRulesItemsQuery { /// The `query` `case_insensitivity`. #[serde(rename = "case_insensitivity")] pub case_insensitivity: Option, - /// The `query` `if_not_exists`. + /// Deprecated. Use `if_tag_exists` instead. The `query` `if_not_exists`. + #[deprecated] #[serde(rename = "if_not_exists")] - pub if_not_exists: bool, + pub if_not_exists: Option, + /// The behavior when the tag already exists. + #[serde(rename = "if_tag_exists")] + pub if_tag_exists: Option, /// The `query` `query`. #[serde(rename = "query")] pub query: String, @@ -37,24 +41,41 @@ impl CreateRulesetRequestDataAttributesRulesItemsQuery { addition: Option< crate::datadogV2::model::CreateRulesetRequestDataAttributesRulesItemsQueryAddition, >, - if_not_exists: bool, query: String, ) -> CreateRulesetRequestDataAttributesRulesItemsQuery { + #[allow(deprecated)] CreateRulesetRequestDataAttributesRulesItemsQuery { addition, case_insensitivity: None, - if_not_exists, + if_not_exists: None, + if_tag_exists: None, query, additional_properties: std::collections::BTreeMap::new(), _unparsed: false, } } + #[allow(deprecated)] pub fn case_insensitivity(mut self, value: bool) -> Self { self.case_insensitivity = Some(value); self } + #[allow(deprecated)] + pub fn if_not_exists(mut self, value: bool) -> Self { + self.if_not_exists = Some(value); + self + } + + #[allow(deprecated)] + pub fn if_tag_exists( + mut self, + value: crate::datadogV2::model::DataAttributesRulesItemsIfTagExists, + ) -> Self { + self.if_tag_exists = Some(value); + self + } + pub fn additional_properties( mut self, value: std::collections::BTreeMap, @@ -84,6 +105,9 @@ impl<'de> Deserialize<'de> for CreateRulesetRequestDataAttributesRulesItemsQuery let mut addition: Option> = None; let mut case_insensitivity: Option = None; let mut if_not_exists: Option = None; + let mut if_tag_exists: Option< + crate::datadogV2::model::DataAttributesRulesItemsIfTagExists, + > = None; let mut query: Option = None; let mut additional_properties: std::collections::BTreeMap< String, @@ -104,9 +128,27 @@ impl<'de> Deserialize<'de> for CreateRulesetRequestDataAttributesRulesItemsQuery Some(serde_json::from_value(v).map_err(M::Error::custom)?); } "if_not_exists" => { + if v.is_null() { + continue; + } if_not_exists = Some(serde_json::from_value(v).map_err(M::Error::custom)?); } + "if_tag_exists" => { + if v.is_null() { + continue; + } + if_tag_exists = + Some(serde_json::from_value(v).map_err(M::Error::custom)?); + if let Some(ref _if_tag_exists) = if_tag_exists { + match _if_tag_exists { + crate::datadogV2::model::DataAttributesRulesItemsIfTagExists::UnparsedObject(_if_tag_exists) => { + _unparsed = true; + }, + _ => {} + } + } + } "query" => { query = Some(serde_json::from_value(v).map_err(M::Error::custom)?); } @@ -118,14 +160,14 @@ impl<'de> Deserialize<'de> for CreateRulesetRequestDataAttributesRulesItemsQuery } } let addition = addition.ok_or_else(|| M::Error::missing_field("addition"))?; - let if_not_exists = - if_not_exists.ok_or_else(|| M::Error::missing_field("if_not_exists"))?; let query = query.ok_or_else(|| M::Error::missing_field("query"))?; + #[allow(deprecated)] let content = CreateRulesetRequestDataAttributesRulesItemsQuery { addition, case_insensitivity, if_not_exists, + if_tag_exists, query, additional_properties, _unparsed, diff --git a/src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items_reference_table.rs b/src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items_reference_table.rs index 445afbd97..317aada53 100644 --- a/src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items_reference_table.rs +++ b/src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items_reference_table.rs @@ -17,9 +17,13 @@ pub struct CreateRulesetRequestDataAttributesRulesItemsReferenceTable { /// The `reference_table` `field_pairs`. #[serde(rename = "field_pairs")] pub field_pairs: Vec, - /// The `reference_table` `if_not_exists`. + /// Deprecated. Use `if_tag_exists` instead. The `reference_table` `if_not_exists`. + #[deprecated] #[serde(rename = "if_not_exists")] pub if_not_exists: Option, + /// The behavior when the tag already exists. + #[serde(rename = "if_tag_exists")] + pub if_tag_exists: Option, /// The `reference_table` `source_keys`. #[serde(rename = "source_keys")] pub source_keys: Vec, @@ -39,10 +43,12 @@ impl CreateRulesetRequestDataAttributesRulesItemsReferenceTable { source_keys: Vec, table_name: String, ) -> CreateRulesetRequestDataAttributesRulesItemsReferenceTable { + #[allow(deprecated)] CreateRulesetRequestDataAttributesRulesItemsReferenceTable { case_insensitivity: None, field_pairs, if_not_exists: None, + if_tag_exists: None, source_keys, table_name, additional_properties: std::collections::BTreeMap::new(), @@ -50,16 +56,27 @@ impl CreateRulesetRequestDataAttributesRulesItemsReferenceTable { } } + #[allow(deprecated)] pub fn case_insensitivity(mut self, value: bool) -> Self { self.case_insensitivity = Some(value); self } + #[allow(deprecated)] pub fn if_not_exists(mut self, value: bool) -> Self { self.if_not_exists = Some(value); self } + #[allow(deprecated)] + pub fn if_tag_exists( + mut self, + value: crate::datadogV2::model::DataAttributesRulesItemsIfTagExists, + ) -> Self { + self.if_tag_exists = Some(value); + self + } + pub fn additional_properties( mut self, value: std::collections::BTreeMap, @@ -89,6 +106,9 @@ impl<'de> Deserialize<'de> for CreateRulesetRequestDataAttributesRulesItemsRefer let mut case_insensitivity: Option = None; let mut field_pairs: Option> = None; let mut if_not_exists: Option = None; + let mut if_tag_exists: Option< + crate::datadogV2::model::DataAttributesRulesItemsIfTagExists, + > = None; let mut source_keys: Option> = None; let mut table_name: Option = None; let mut additional_properties: std::collections::BTreeMap< @@ -117,6 +137,21 @@ impl<'de> Deserialize<'de> for CreateRulesetRequestDataAttributesRulesItemsRefer if_not_exists = Some(serde_json::from_value(v).map_err(M::Error::custom)?); } + "if_tag_exists" => { + if v.is_null() { + continue; + } + if_tag_exists = + Some(serde_json::from_value(v).map_err(M::Error::custom)?); + if let Some(ref _if_tag_exists) = if_tag_exists { + match _if_tag_exists { + crate::datadogV2::model::DataAttributesRulesItemsIfTagExists::UnparsedObject(_if_tag_exists) => { + _unparsed = true; + }, + _ => {} + } + } + } "source_keys" => { source_keys = Some(serde_json::from_value(v).map_err(M::Error::custom)?); @@ -137,10 +172,12 @@ impl<'de> Deserialize<'de> for CreateRulesetRequestDataAttributesRulesItemsRefer source_keys.ok_or_else(|| M::Error::missing_field("source_keys"))?; let table_name = table_name.ok_or_else(|| M::Error::missing_field("table_name"))?; + #[allow(deprecated)] let content = CreateRulesetRequestDataAttributesRulesItemsReferenceTable { case_insensitivity, field_pairs, if_not_exists, + if_tag_exists, source_keys, table_name, additional_properties, diff --git a/src/datadogV2/model/model_data_attributes_rules_items_if_tag_exists.rs b/src/datadogV2/model/model_data_attributes_rules_items_if_tag_exists.rs new file mode 100644 index 000000000..6195f14bd --- /dev/null +++ b/src/datadogV2/model/model_data_attributes_rules_items_if_tag_exists.rs @@ -0,0 +1,54 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +use serde::{Deserialize, Deserializer, Serialize, Serializer}; + +#[non_exhaustive] +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum DataAttributesRulesItemsIfTagExists { + APPEND, + DO_NOT_APPLY, + REPLACE, + UnparsedObject(crate::datadog::UnparsedObject), +} + +impl ToString for DataAttributesRulesItemsIfTagExists { + fn to_string(&self) -> String { + match self { + Self::APPEND => String::from("append"), + Self::DO_NOT_APPLY => String::from("do_not_apply"), + Self::REPLACE => String::from("replace"), + Self::UnparsedObject(v) => v.value.to_string(), + } + } +} + +impl Serialize for DataAttributesRulesItemsIfTagExists { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + match self { + Self::UnparsedObject(v) => v.serialize(serializer), + _ => serializer.serialize_str(self.to_string().as_str()), + } + } +} + +impl<'de> Deserialize<'de> for DataAttributesRulesItemsIfTagExists { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s: String = String::deserialize(deserializer)?; + Ok(match s.as_str() { + "append" => Self::APPEND, + "do_not_apply" => Self::DO_NOT_APPLY, + "replace" => Self::REPLACE, + _ => Self::UnparsedObject(crate::datadog::UnparsedObject { + value: serde_json::Value::String(s.into()), + }), + }) + } +} diff --git a/src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items_mapping.rs b/src/datadogV2/model/model_data_attributes_rules_items_mapping.rs similarity index 59% rename from src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items_mapping.rs rename to src/datadogV2/model/model_data_attributes_rules_items_mapping.rs index 8bca397df..ae221b58b 100644 --- a/src/datadogV2/model/model_create_ruleset_request_data_attributes_rules_items_mapping.rs +++ b/src/datadogV2/model/model_data_attributes_rules_items_mapping.rs @@ -6,17 +6,21 @@ use serde::{Deserialize, Deserializer, Serialize}; use serde_with::skip_serializing_none; use std::fmt::{self, Formatter}; -/// The definition of `CreateRulesetRequestDataAttributesRulesItemsMapping` object. +/// The definition of `DataAttributesRulesItemsMapping` object. #[non_exhaustive] #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize)] -pub struct CreateRulesetRequestDataAttributesRulesItemsMapping { +pub struct DataAttributesRulesItemsMapping { /// The `mapping` `destination_key`. #[serde(rename = "destination_key")] pub destination_key: String, - /// The `mapping` `if_not_exists`. + /// Deprecated. Use `if_tag_exists` instead. The `mapping` `if_not_exists`. + #[deprecated] #[serde(rename = "if_not_exists")] - pub if_not_exists: bool, + pub if_not_exists: Option, + /// The behavior when the tag already exists. + #[serde(rename = "if_tag_exists")] + pub if_tag_exists: Option, /// The `mapping` `source_keys`. #[serde(rename = "source_keys")] pub source_keys: Vec, @@ -27,21 +31,37 @@ pub struct CreateRulesetRequestDataAttributesRulesItemsMapping { pub(crate) _unparsed: bool, } -impl CreateRulesetRequestDataAttributesRulesItemsMapping { +impl DataAttributesRulesItemsMapping { pub fn new( destination_key: String, - if_not_exists: bool, source_keys: Vec, - ) -> CreateRulesetRequestDataAttributesRulesItemsMapping { - CreateRulesetRequestDataAttributesRulesItemsMapping { + ) -> DataAttributesRulesItemsMapping { + #[allow(deprecated)] + DataAttributesRulesItemsMapping { destination_key, - if_not_exists, + if_not_exists: None, + if_tag_exists: None, source_keys, additional_properties: std::collections::BTreeMap::new(), _unparsed: false, } } + #[allow(deprecated)] + pub fn if_not_exists(mut self, value: bool) -> Self { + self.if_not_exists = Some(value); + self + } + + #[allow(deprecated)] + pub fn if_tag_exists( + mut self, + value: crate::datadogV2::model::DataAttributesRulesItemsIfTagExists, + ) -> Self { + self.if_tag_exists = Some(value); + self + } + pub fn additional_properties( mut self, value: std::collections::BTreeMap, @@ -51,14 +71,14 @@ impl CreateRulesetRequestDataAttributesRulesItemsMapping { } } -impl<'de> Deserialize<'de> for CreateRulesetRequestDataAttributesRulesItemsMapping { +impl<'de> Deserialize<'de> for DataAttributesRulesItemsMapping { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { - struct CreateRulesetRequestDataAttributesRulesItemsMappingVisitor; - impl<'a> Visitor<'a> for CreateRulesetRequestDataAttributesRulesItemsMappingVisitor { - type Value = CreateRulesetRequestDataAttributesRulesItemsMapping; + struct DataAttributesRulesItemsMappingVisitor; + impl<'a> Visitor<'a> for DataAttributesRulesItemsMappingVisitor { + type Value = DataAttributesRulesItemsMapping; fn expecting(&self, f: &mut Formatter<'_>) -> fmt::Result { f.write_str("a mapping") @@ -70,6 +90,9 @@ impl<'de> Deserialize<'de> for CreateRulesetRequestDataAttributesRulesItemsMappi { let mut destination_key: Option = None; let mut if_not_exists: Option = None; + let mut if_tag_exists: Option< + crate::datadogV2::model::DataAttributesRulesItemsIfTagExists, + > = None; let mut source_keys: Option> = None; let mut additional_properties: std::collections::BTreeMap< String, @@ -84,9 +107,27 @@ impl<'de> Deserialize<'de> for CreateRulesetRequestDataAttributesRulesItemsMappi Some(serde_json::from_value(v).map_err(M::Error::custom)?); } "if_not_exists" => { + if v.is_null() { + continue; + } if_not_exists = Some(serde_json::from_value(v).map_err(M::Error::custom)?); } + "if_tag_exists" => { + if v.is_null() { + continue; + } + if_tag_exists = + Some(serde_json::from_value(v).map_err(M::Error::custom)?); + if let Some(ref _if_tag_exists) = if_tag_exists { + match _if_tag_exists { + crate::datadogV2::model::DataAttributesRulesItemsIfTagExists::UnparsedObject(_if_tag_exists) => { + _unparsed = true; + }, + _ => {} + } + } + } "source_keys" => { source_keys = Some(serde_json::from_value(v).map_err(M::Error::custom)?); @@ -100,14 +141,14 @@ impl<'de> Deserialize<'de> for CreateRulesetRequestDataAttributesRulesItemsMappi } let destination_key = destination_key.ok_or_else(|| M::Error::missing_field("destination_key"))?; - let if_not_exists = - if_not_exists.ok_or_else(|| M::Error::missing_field("if_not_exists"))?; let source_keys = source_keys.ok_or_else(|| M::Error::missing_field("source_keys"))?; - let content = CreateRulesetRequestDataAttributesRulesItemsMapping { + #[allow(deprecated)] + let content = DataAttributesRulesItemsMapping { destination_key, if_not_exists, + if_tag_exists, source_keys, additional_properties, _unparsed, @@ -117,6 +158,6 @@ impl<'de> Deserialize<'de> for CreateRulesetRequestDataAttributesRulesItemsMappi } } - deserializer.deserialize_any(CreateRulesetRequestDataAttributesRulesItemsMappingVisitor) + deserializer.deserialize_any(DataAttributesRulesItemsMappingVisitor) } } diff --git a/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items.rs b/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items.rs index 741f61d4e..002b71b27 100644 --- a/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items.rs +++ b/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items.rs @@ -14,14 +14,13 @@ pub struct RulesetRespDataAttributesRulesItems { /// The `items` `enabled`. #[serde(rename = "enabled")] pub enabled: bool, - /// The definition of `RulesetRespDataAttributesRulesItemsMapping` object. + /// The definition of `DataAttributesRulesItemsMapping` object. #[serde( rename = "mapping", default, with = "::serde_with::rust::double_option" )] - pub mapping: - Option>, + pub mapping: Option>, /// The `items` `metadata`. #[serde( rename = "metadata", @@ -66,7 +65,7 @@ impl RulesetRespDataAttributesRulesItems { pub fn mapping( mut self, - value: Option, + value: Option, ) -> Self { self.mapping = Some(value); self @@ -121,7 +120,7 @@ impl<'de> Deserialize<'de> for RulesetRespDataAttributesRulesItems { { let mut enabled: Option = None; let mut mapping: Option< - Option, + Option, > = None; let mut metadata: Option>> = None; let mut name: Option = None; diff --git a/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items_mapping.rs b/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items_mapping.rs deleted file mode 100644 index 9b69b3ac4..000000000 --- a/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items_mapping.rs +++ /dev/null @@ -1,122 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2019-Present Datadog, Inc. -use serde::de::{Error, MapAccess, Visitor}; -use serde::{Deserialize, Deserializer, Serialize}; -use serde_with::skip_serializing_none; -use std::fmt::{self, Formatter}; - -/// The definition of `RulesetRespDataAttributesRulesItemsMapping` object. -#[non_exhaustive] -#[skip_serializing_none] -#[derive(Clone, Debug, PartialEq, Serialize)] -pub struct RulesetRespDataAttributesRulesItemsMapping { - /// The `mapping` `destination_key`. - #[serde(rename = "destination_key")] - pub destination_key: String, - /// The `mapping` `if_not_exists`. - #[serde(rename = "if_not_exists")] - pub if_not_exists: bool, - /// The `mapping` `source_keys`. - #[serde(rename = "source_keys")] - pub source_keys: Vec, - #[serde(flatten)] - pub additional_properties: std::collections::BTreeMap, - #[serde(skip)] - #[serde(default)] - pub(crate) _unparsed: bool, -} - -impl RulesetRespDataAttributesRulesItemsMapping { - pub fn new( - destination_key: String, - if_not_exists: bool, - source_keys: Vec, - ) -> RulesetRespDataAttributesRulesItemsMapping { - RulesetRespDataAttributesRulesItemsMapping { - destination_key, - if_not_exists, - source_keys, - additional_properties: std::collections::BTreeMap::new(), - _unparsed: false, - } - } - - pub fn additional_properties( - mut self, - value: std::collections::BTreeMap, - ) -> Self { - self.additional_properties = value; - self - } -} - -impl<'de> Deserialize<'de> for RulesetRespDataAttributesRulesItemsMapping { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - struct RulesetRespDataAttributesRulesItemsMappingVisitor; - impl<'a> Visitor<'a> for RulesetRespDataAttributesRulesItemsMappingVisitor { - type Value = RulesetRespDataAttributesRulesItemsMapping; - - fn expecting(&self, f: &mut Formatter<'_>) -> fmt::Result { - f.write_str("a mapping") - } - - fn visit_map(self, mut map: M) -> Result - where - M: MapAccess<'a>, - { - let mut destination_key: Option = None; - let mut if_not_exists: Option = None; - let mut source_keys: Option> = None; - let mut additional_properties: std::collections::BTreeMap< - String, - serde_json::Value, - > = std::collections::BTreeMap::new(); - let mut _unparsed = false; - - while let Some((k, v)) = map.next_entry::()? { - match k.as_str() { - "destination_key" => { - destination_key = - Some(serde_json::from_value(v).map_err(M::Error::custom)?); - } - "if_not_exists" => { - if_not_exists = - Some(serde_json::from_value(v).map_err(M::Error::custom)?); - } - "source_keys" => { - source_keys = - Some(serde_json::from_value(v).map_err(M::Error::custom)?); - } - &_ => { - if let Ok(value) = serde_json::from_value(v.clone()) { - additional_properties.insert(k, value); - } - } - } - } - let destination_key = - destination_key.ok_or_else(|| M::Error::missing_field("destination_key"))?; - let if_not_exists = - if_not_exists.ok_or_else(|| M::Error::missing_field("if_not_exists"))?; - let source_keys = - source_keys.ok_or_else(|| M::Error::missing_field("source_keys"))?; - - let content = RulesetRespDataAttributesRulesItemsMapping { - destination_key, - if_not_exists, - source_keys, - additional_properties, - _unparsed, - }; - - Ok(content) - } - } - - deserializer.deserialize_any(RulesetRespDataAttributesRulesItemsMappingVisitor) - } -} diff --git a/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items_query.rs b/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items_query.rs index 4796e5b9a..2bf621365 100644 --- a/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items_query.rs +++ b/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items_query.rs @@ -18,9 +18,13 @@ pub struct RulesetRespDataAttributesRulesItemsQuery { /// The `query` `case_insensitivity`. #[serde(rename = "case_insensitivity")] pub case_insensitivity: Option, - /// The `query` `if_not_exists`. + /// Deprecated. Use `if_tag_exists` instead. The `query` `if_not_exists`. + #[deprecated] #[serde(rename = "if_not_exists")] - pub if_not_exists: bool, + pub if_not_exists: Option, + /// The behavior when the tag already exists. + #[serde(rename = "if_tag_exists")] + pub if_tag_exists: Option, /// The `query` `query`. #[serde(rename = "query")] pub query: String, @@ -34,24 +38,41 @@ pub struct RulesetRespDataAttributesRulesItemsQuery { impl RulesetRespDataAttributesRulesItemsQuery { pub fn new( addition: Option, - if_not_exists: bool, query: String, ) -> RulesetRespDataAttributesRulesItemsQuery { + #[allow(deprecated)] RulesetRespDataAttributesRulesItemsQuery { addition, case_insensitivity: None, - if_not_exists, + if_not_exists: None, + if_tag_exists: None, query, additional_properties: std::collections::BTreeMap::new(), _unparsed: false, } } + #[allow(deprecated)] pub fn case_insensitivity(mut self, value: bool) -> Self { self.case_insensitivity = Some(value); self } + #[allow(deprecated)] + pub fn if_not_exists(mut self, value: bool) -> Self { + self.if_not_exists = Some(value); + self + } + + #[allow(deprecated)] + pub fn if_tag_exists( + mut self, + value: crate::datadogV2::model::DataAttributesRulesItemsIfTagExists, + ) -> Self { + self.if_tag_exists = Some(value); + self + } + pub fn additional_properties( mut self, value: std::collections::BTreeMap, @@ -85,6 +106,9 @@ impl<'de> Deserialize<'de> for RulesetRespDataAttributesRulesItemsQuery { > = None; let mut case_insensitivity: Option = None; let mut if_not_exists: Option = None; + let mut if_tag_exists: Option< + crate::datadogV2::model::DataAttributesRulesItemsIfTagExists, + > = None; let mut query: Option = None; let mut additional_properties: std::collections::BTreeMap< String, @@ -105,9 +129,27 @@ impl<'de> Deserialize<'de> for RulesetRespDataAttributesRulesItemsQuery { Some(serde_json::from_value(v).map_err(M::Error::custom)?); } "if_not_exists" => { + if v.is_null() { + continue; + } if_not_exists = Some(serde_json::from_value(v).map_err(M::Error::custom)?); } + "if_tag_exists" => { + if v.is_null() { + continue; + } + if_tag_exists = + Some(serde_json::from_value(v).map_err(M::Error::custom)?); + if let Some(ref _if_tag_exists) = if_tag_exists { + match _if_tag_exists { + crate::datadogV2::model::DataAttributesRulesItemsIfTagExists::UnparsedObject(_if_tag_exists) => { + _unparsed = true; + }, + _ => {} + } + } + } "query" => { query = Some(serde_json::from_value(v).map_err(M::Error::custom)?); } @@ -119,14 +161,14 @@ impl<'de> Deserialize<'de> for RulesetRespDataAttributesRulesItemsQuery { } } let addition = addition.ok_or_else(|| M::Error::missing_field("addition"))?; - let if_not_exists = - if_not_exists.ok_or_else(|| M::Error::missing_field("if_not_exists"))?; let query = query.ok_or_else(|| M::Error::missing_field("query"))?; + #[allow(deprecated)] let content = RulesetRespDataAttributesRulesItemsQuery { addition, case_insensitivity, if_not_exists, + if_tag_exists, query, additional_properties, _unparsed, diff --git a/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items_reference_table.rs b/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items_reference_table.rs index aa791c48e..99030c6c2 100644 --- a/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items_reference_table.rs +++ b/src/datadogV2/model/model_ruleset_resp_data_attributes_rules_items_reference_table.rs @@ -19,9 +19,13 @@ pub struct RulesetRespDataAttributesRulesItemsReferenceTable { pub field_pairs: Vec< crate::datadogV2::model::RulesetRespDataAttributesRulesItemsReferenceTableFieldPairsItems, >, - /// The `reference_table` `if_not_exists`. + /// Deprecated. Use `if_tag_exists` instead. The `reference_table` `if_not_exists`. + #[deprecated] #[serde(rename = "if_not_exists")] pub if_not_exists: Option, + /// The behavior when the tag already exists. + #[serde(rename = "if_tag_exists")] + pub if_tag_exists: Option, /// The `reference_table` `source_keys`. #[serde(rename = "source_keys")] pub source_keys: Vec, @@ -41,10 +45,12 @@ impl RulesetRespDataAttributesRulesItemsReferenceTable { source_keys: Vec, table_name: String, ) -> RulesetRespDataAttributesRulesItemsReferenceTable { + #[allow(deprecated)] RulesetRespDataAttributesRulesItemsReferenceTable { case_insensitivity: None, field_pairs, if_not_exists: None, + if_tag_exists: None, source_keys, table_name, additional_properties: std::collections::BTreeMap::new(), @@ -52,16 +58,27 @@ impl RulesetRespDataAttributesRulesItemsReferenceTable { } } + #[allow(deprecated)] pub fn case_insensitivity(mut self, value: bool) -> Self { self.case_insensitivity = Some(value); self } + #[allow(deprecated)] pub fn if_not_exists(mut self, value: bool) -> Self { self.if_not_exists = Some(value); self } + #[allow(deprecated)] + pub fn if_tag_exists( + mut self, + value: crate::datadogV2::model::DataAttributesRulesItemsIfTagExists, + ) -> Self { + self.if_tag_exists = Some(value); + self + } + pub fn additional_properties( mut self, value: std::collections::BTreeMap, @@ -91,6 +108,9 @@ impl<'de> Deserialize<'de> for RulesetRespDataAttributesRulesItemsReferenceTable let mut case_insensitivity: Option = None; let mut field_pairs: Option> = None; let mut if_not_exists: Option = None; + let mut if_tag_exists: Option< + crate::datadogV2::model::DataAttributesRulesItemsIfTagExists, + > = None; let mut source_keys: Option> = None; let mut table_name: Option = None; let mut additional_properties: std::collections::BTreeMap< @@ -119,6 +139,21 @@ impl<'de> Deserialize<'de> for RulesetRespDataAttributesRulesItemsReferenceTable if_not_exists = Some(serde_json::from_value(v).map_err(M::Error::custom)?); } + "if_tag_exists" => { + if v.is_null() { + continue; + } + if_tag_exists = + Some(serde_json::from_value(v).map_err(M::Error::custom)?); + if let Some(ref _if_tag_exists) = if_tag_exists { + match _if_tag_exists { + crate::datadogV2::model::DataAttributesRulesItemsIfTagExists::UnparsedObject(_if_tag_exists) => { + _unparsed = true; + }, + _ => {} + } + } + } "source_keys" => { source_keys = Some(serde_json::from_value(v).map_err(M::Error::custom)?); @@ -139,10 +174,12 @@ impl<'de> Deserialize<'de> for RulesetRespDataAttributesRulesItemsReferenceTable source_keys.ok_or_else(|| M::Error::missing_field("source_keys"))?; let table_name = table_name.ok_or_else(|| M::Error::missing_field("table_name"))?; + #[allow(deprecated)] let content = RulesetRespDataAttributesRulesItemsReferenceTable { case_insensitivity, field_pairs, if_not_exists, + if_tag_exists, source_keys, table_name, additional_properties, diff --git a/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items.rs b/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items.rs index 5b31d0597..ebb4cb0d2 100644 --- a/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items.rs +++ b/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items.rs @@ -14,15 +14,13 @@ pub struct UpdateRulesetRequestDataAttributesRulesItems { /// The `items` `enabled`. #[serde(rename = "enabled")] pub enabled: bool, - /// The definition of `UpdateRulesetRequestDataAttributesRulesItemsMapping` object. + /// The definition of `DataAttributesRulesItemsMapping` object. #[serde( rename = "mapping", default, with = "::serde_with::rust::double_option" )] - pub mapping: Option< - Option, - >, + pub mapping: Option>, /// The `items` `metadata`. #[serde( rename = "metadata", @@ -69,7 +67,7 @@ impl UpdateRulesetRequestDataAttributesRulesItems { pub fn mapping( mut self, - value: Option, + value: Option, ) -> Self { self.mapping = Some(value); self @@ -125,7 +123,9 @@ impl<'de> Deserialize<'de> for UpdateRulesetRequestDataAttributesRulesItems { M: MapAccess<'a>, { let mut enabled: Option = None; - let mut mapping: Option> = None; + let mut mapping: Option< + Option, + > = None; let mut metadata: Option>> = None; let mut name: Option = None; let mut query: Option< diff --git a/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items_mapping.rs b/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items_mapping.rs deleted file mode 100644 index 8b68a6fdf..000000000 --- a/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items_mapping.rs +++ /dev/null @@ -1,122 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2019-Present Datadog, Inc. -use serde::de::{Error, MapAccess, Visitor}; -use serde::{Deserialize, Deserializer, Serialize}; -use serde_with::skip_serializing_none; -use std::fmt::{self, Formatter}; - -/// The definition of `UpdateRulesetRequestDataAttributesRulesItemsMapping` object. -#[non_exhaustive] -#[skip_serializing_none] -#[derive(Clone, Debug, PartialEq, Serialize)] -pub struct UpdateRulesetRequestDataAttributesRulesItemsMapping { - /// The `mapping` `destination_key`. - #[serde(rename = "destination_key")] - pub destination_key: String, - /// The `mapping` `if_not_exists`. - #[serde(rename = "if_not_exists")] - pub if_not_exists: bool, - /// The `mapping` `source_keys`. - #[serde(rename = "source_keys")] - pub source_keys: Vec, - #[serde(flatten)] - pub additional_properties: std::collections::BTreeMap, - #[serde(skip)] - #[serde(default)] - pub(crate) _unparsed: bool, -} - -impl UpdateRulesetRequestDataAttributesRulesItemsMapping { - pub fn new( - destination_key: String, - if_not_exists: bool, - source_keys: Vec, - ) -> UpdateRulesetRequestDataAttributesRulesItemsMapping { - UpdateRulesetRequestDataAttributesRulesItemsMapping { - destination_key, - if_not_exists, - source_keys, - additional_properties: std::collections::BTreeMap::new(), - _unparsed: false, - } - } - - pub fn additional_properties( - mut self, - value: std::collections::BTreeMap, - ) -> Self { - self.additional_properties = value; - self - } -} - -impl<'de> Deserialize<'de> for UpdateRulesetRequestDataAttributesRulesItemsMapping { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - struct UpdateRulesetRequestDataAttributesRulesItemsMappingVisitor; - impl<'a> Visitor<'a> for UpdateRulesetRequestDataAttributesRulesItemsMappingVisitor { - type Value = UpdateRulesetRequestDataAttributesRulesItemsMapping; - - fn expecting(&self, f: &mut Formatter<'_>) -> fmt::Result { - f.write_str("a mapping") - } - - fn visit_map(self, mut map: M) -> Result - where - M: MapAccess<'a>, - { - let mut destination_key: Option = None; - let mut if_not_exists: Option = None; - let mut source_keys: Option> = None; - let mut additional_properties: std::collections::BTreeMap< - String, - serde_json::Value, - > = std::collections::BTreeMap::new(); - let mut _unparsed = false; - - while let Some((k, v)) = map.next_entry::()? { - match k.as_str() { - "destination_key" => { - destination_key = - Some(serde_json::from_value(v).map_err(M::Error::custom)?); - } - "if_not_exists" => { - if_not_exists = - Some(serde_json::from_value(v).map_err(M::Error::custom)?); - } - "source_keys" => { - source_keys = - Some(serde_json::from_value(v).map_err(M::Error::custom)?); - } - &_ => { - if let Ok(value) = serde_json::from_value(v.clone()) { - additional_properties.insert(k, value); - } - } - } - } - let destination_key = - destination_key.ok_or_else(|| M::Error::missing_field("destination_key"))?; - let if_not_exists = - if_not_exists.ok_or_else(|| M::Error::missing_field("if_not_exists"))?; - let source_keys = - source_keys.ok_or_else(|| M::Error::missing_field("source_keys"))?; - - let content = UpdateRulesetRequestDataAttributesRulesItemsMapping { - destination_key, - if_not_exists, - source_keys, - additional_properties, - _unparsed, - }; - - Ok(content) - } - } - - deserializer.deserialize_any(UpdateRulesetRequestDataAttributesRulesItemsMappingVisitor) - } -} diff --git a/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items_query.rs b/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items_query.rs index 0aec7ca08..f3fe00420 100644 --- a/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items_query.rs +++ b/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items_query.rs @@ -19,9 +19,13 @@ pub struct UpdateRulesetRequestDataAttributesRulesItemsQuery { /// The `query` `case_insensitivity`. #[serde(rename = "case_insensitivity")] pub case_insensitivity: Option, - /// The `query` `if_not_exists`. + /// Deprecated. Use `if_tag_exists` instead. The `query` `if_not_exists`. + #[deprecated] #[serde(rename = "if_not_exists")] - pub if_not_exists: bool, + pub if_not_exists: Option, + /// The behavior when the tag already exists. + #[serde(rename = "if_tag_exists")] + pub if_tag_exists: Option, /// The `query` `query`. #[serde(rename = "query")] pub query: String, @@ -37,24 +41,41 @@ impl UpdateRulesetRequestDataAttributesRulesItemsQuery { addition: Option< crate::datadogV2::model::UpdateRulesetRequestDataAttributesRulesItemsQueryAddition, >, - if_not_exists: bool, query: String, ) -> UpdateRulesetRequestDataAttributesRulesItemsQuery { + #[allow(deprecated)] UpdateRulesetRequestDataAttributesRulesItemsQuery { addition, case_insensitivity: None, - if_not_exists, + if_not_exists: None, + if_tag_exists: None, query, additional_properties: std::collections::BTreeMap::new(), _unparsed: false, } } + #[allow(deprecated)] pub fn case_insensitivity(mut self, value: bool) -> Self { self.case_insensitivity = Some(value); self } + #[allow(deprecated)] + pub fn if_not_exists(mut self, value: bool) -> Self { + self.if_not_exists = Some(value); + self + } + + #[allow(deprecated)] + pub fn if_tag_exists( + mut self, + value: crate::datadogV2::model::DataAttributesRulesItemsIfTagExists, + ) -> Self { + self.if_tag_exists = Some(value); + self + } + pub fn additional_properties( mut self, value: std::collections::BTreeMap, @@ -84,6 +105,9 @@ impl<'de> Deserialize<'de> for UpdateRulesetRequestDataAttributesRulesItemsQuery let mut addition: Option> = None; let mut case_insensitivity: Option = None; let mut if_not_exists: Option = None; + let mut if_tag_exists: Option< + crate::datadogV2::model::DataAttributesRulesItemsIfTagExists, + > = None; let mut query: Option = None; let mut additional_properties: std::collections::BTreeMap< String, @@ -104,9 +128,27 @@ impl<'de> Deserialize<'de> for UpdateRulesetRequestDataAttributesRulesItemsQuery Some(serde_json::from_value(v).map_err(M::Error::custom)?); } "if_not_exists" => { + if v.is_null() { + continue; + } if_not_exists = Some(serde_json::from_value(v).map_err(M::Error::custom)?); } + "if_tag_exists" => { + if v.is_null() { + continue; + } + if_tag_exists = + Some(serde_json::from_value(v).map_err(M::Error::custom)?); + if let Some(ref _if_tag_exists) = if_tag_exists { + match _if_tag_exists { + crate::datadogV2::model::DataAttributesRulesItemsIfTagExists::UnparsedObject(_if_tag_exists) => { + _unparsed = true; + }, + _ => {} + } + } + } "query" => { query = Some(serde_json::from_value(v).map_err(M::Error::custom)?); } @@ -118,14 +160,14 @@ impl<'de> Deserialize<'de> for UpdateRulesetRequestDataAttributesRulesItemsQuery } } let addition = addition.ok_or_else(|| M::Error::missing_field("addition"))?; - let if_not_exists = - if_not_exists.ok_or_else(|| M::Error::missing_field("if_not_exists"))?; let query = query.ok_or_else(|| M::Error::missing_field("query"))?; + #[allow(deprecated)] let content = UpdateRulesetRequestDataAttributesRulesItemsQuery { addition, case_insensitivity, if_not_exists, + if_tag_exists, query, additional_properties, _unparsed, diff --git a/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items_reference_table.rs b/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items_reference_table.rs index b34305f03..254452578 100644 --- a/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items_reference_table.rs +++ b/src/datadogV2/model/model_update_ruleset_request_data_attributes_rules_items_reference_table.rs @@ -17,9 +17,13 @@ pub struct UpdateRulesetRequestDataAttributesRulesItemsReferenceTable { /// The `reference_table` `field_pairs`. #[serde(rename = "field_pairs")] pub field_pairs: Vec, - /// The `reference_table` `if_not_exists`. + /// Deprecated. Use `if_tag_exists` instead. The `reference_table` `if_not_exists`. + #[deprecated] #[serde(rename = "if_not_exists")] pub if_not_exists: Option, + /// The behavior when the tag already exists. + #[serde(rename = "if_tag_exists")] + pub if_tag_exists: Option, /// The `reference_table` `source_keys`. #[serde(rename = "source_keys")] pub source_keys: Vec, @@ -39,10 +43,12 @@ impl UpdateRulesetRequestDataAttributesRulesItemsReferenceTable { source_keys: Vec, table_name: String, ) -> UpdateRulesetRequestDataAttributesRulesItemsReferenceTable { + #[allow(deprecated)] UpdateRulesetRequestDataAttributesRulesItemsReferenceTable { case_insensitivity: None, field_pairs, if_not_exists: None, + if_tag_exists: None, source_keys, table_name, additional_properties: std::collections::BTreeMap::new(), @@ -50,16 +56,27 @@ impl UpdateRulesetRequestDataAttributesRulesItemsReferenceTable { } } + #[allow(deprecated)] pub fn case_insensitivity(mut self, value: bool) -> Self { self.case_insensitivity = Some(value); self } + #[allow(deprecated)] pub fn if_not_exists(mut self, value: bool) -> Self { self.if_not_exists = Some(value); self } + #[allow(deprecated)] + pub fn if_tag_exists( + mut self, + value: crate::datadogV2::model::DataAttributesRulesItemsIfTagExists, + ) -> Self { + self.if_tag_exists = Some(value); + self + } + pub fn additional_properties( mut self, value: std::collections::BTreeMap, @@ -89,6 +106,9 @@ impl<'de> Deserialize<'de> for UpdateRulesetRequestDataAttributesRulesItemsRefer let mut case_insensitivity: Option = None; let mut field_pairs: Option> = None; let mut if_not_exists: Option = None; + let mut if_tag_exists: Option< + crate::datadogV2::model::DataAttributesRulesItemsIfTagExists, + > = None; let mut source_keys: Option> = None; let mut table_name: Option = None; let mut additional_properties: std::collections::BTreeMap< @@ -117,6 +137,21 @@ impl<'de> Deserialize<'de> for UpdateRulesetRequestDataAttributesRulesItemsRefer if_not_exists = Some(serde_json::from_value(v).map_err(M::Error::custom)?); } + "if_tag_exists" => { + if v.is_null() { + continue; + } + if_tag_exists = + Some(serde_json::from_value(v).map_err(M::Error::custom)?); + if let Some(ref _if_tag_exists) = if_tag_exists { + match _if_tag_exists { + crate::datadogV2::model::DataAttributesRulesItemsIfTagExists::UnparsedObject(_if_tag_exists) => { + _unparsed = true; + }, + _ => {} + } + } + } "source_keys" => { source_keys = Some(serde_json::from_value(v).map_err(M::Error::custom)?); @@ -137,10 +172,12 @@ impl<'de> Deserialize<'de> for UpdateRulesetRequestDataAttributesRulesItemsRefer source_keys.ok_or_else(|| M::Error::missing_field("source_keys"))?; let table_name = table_name.ok_or_else(|| M::Error::missing_field("table_name"))?; + #[allow(deprecated)] let content = UpdateRulesetRequestDataAttributesRulesItemsReferenceTable { case_insensitivity, field_pairs, if_not_exists, + if_tag_exists, source_keys, table_name, additional_properties, diff --git a/tests/scenarios/cassettes/v1/service_level_objectives/Create-a-new-metric-SLO-object-using-sli-specification-returns-OK-response.frozen b/tests/scenarios/cassettes/v1/service_level_objectives/Create-a-new-metric-SLO-object-using-sli-specification-returns-OK-response.frozen new file mode 100644 index 000000000..6f05e9c1d --- /dev/null +++ b/tests/scenarios/cassettes/v1/service_level_objectives/Create-a-new-metric-SLO-object-using-sli-specification-returns-OK-response.frozen @@ -0,0 +1 @@ +2026-02-05T20:07:38.100Z \ No newline at end of file diff --git a/tests/scenarios/cassettes/v1/service_level_objectives/Create-a-new-metric-SLO-object-using-sli-specification-returns-OK-response.json b/tests/scenarios/cassettes/v1/service_level_objectives/Create-a-new-metric-SLO-object-using-sli-specification-returns-OK-response.json new file mode 100644 index 000000000..a96d91dc9 --- /dev/null +++ b/tests/scenarios/cassettes/v1/service_level_objectives/Create-a-new-metric-SLO-object-using-sli-specification-returns-OK-response.json @@ -0,0 +1,67 @@ +{ + "http_interactions": [ + { + "request": { + "body": { + "string": "{\"description\":\"Metric SLO using sli_specification\",\"name\":\"Test-Create_a_new_metric_SLO_object_using_sli_specification_returns_OK_response-1770322058\",\"sli_specification\":{\"count\":{\"good_events_formula\":{\"formula\":\"query1 - query2\"},\"queries\":[{\"data_source\":\"metrics\",\"name\":\"query1\",\"query\":\"sum:httpservice.hits{*}.as_count()\"},{\"data_source\":\"metrics\",\"name\":\"query2\",\"query\":\"sum:httpservice.errors{*}.as_count()\"}],\"total_events_formula\":{\"formula\":\"query1\"}}},\"tags\":[\"env:prod\",\"type:count\"],\"target_threshold\":99,\"thresholds\":[{\"target\":99,\"target_display\":\"99.0\",\"timeframe\":\"7d\",\"warning\":99.5,\"warning_display\":\"99.5\"}],\"timeframe\":\"7d\",\"type\":\"metric\",\"warning_threshold\":99.5}", + "encoding": null + }, + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json" + ] + }, + "method": "post", + "uri": "https://api.datadoghq.com/api/v1/slo" + }, + "response": { + "body": { + "string": "{\"data\":[{\"id\":\"6e49f8aa9883507dbc719f00eede5a5d\",\"name\":\"Test-Create_a_new_metric_SLO_object_using_sli_specification_returns_OK_response-1770322058\",\"tags\":[\"env:prod\",\"type:count\"],\"monitor_tags\":[],\"thresholds\":[{\"timeframe\":\"7d\",\"target\":99.0,\"target_display\":\"99.\",\"warning\":99.5,\"warning_display\":\"99.5\"}],\"type\":\"metric\",\"type_id\":1,\"description\":\"Metric SLO using sli_specification\",\"timeframe\":\"7d\",\"warning_threshold\":99.5,\"target_threshold\":99,\"query\":{\"numerator\":\"sum:httpservice.hits{*}.as_count() - sum:httpservice.errors{*}.as_count()\",\"denominator\":\"sum:httpservice.hits{*}.as_count()\"},\"creator\":{\"name\":\"CI Account\",\"handle\":\"9919ec9b-ebc7-49ee-8dc8-03626e717cca\",\"email\":\"team-intg-tools-libs-spam@datadoghq.com\"},\"created_at\":1770322058,\"modified_at\":1770322058,\"sli_specification\":{\"count\":{\"good_events_formula\":{\"formula\":\"query1 - query2\"},\"queries\":[{\"data_source\":\"metrics\",\"name\":\"query1\",\"query\":\"sum:httpservice.hits{*}.as_count()\"},{\"data_source\":\"metrics\",\"name\":\"query2\",\"query\":\"sum:httpservice.errors{*}.as_count()\"}],\"total_events_formula\":{\"formula\":\"query1\"}}}}],\"error\":null}\n", + "encoding": null + }, + "headers": { + "Content-Type": [ + "application/json" + ] + }, + "status": { + "code": 200, + "message": "OK" + } + }, + "recorded_at": "Thu, 05 Feb 2026 20:07:38 GMT" + }, + { + "request": { + "body": "", + "headers": { + "Accept": [ + "application/json" + ] + }, + "method": "delete", + "uri": "https://api.datadoghq.com/api/v1/slo/6e49f8aa9883507dbc719f00eede5a5d" + }, + "response": { + "body": { + "string": "{\"data\":[\"6e49f8aa9883507dbc719f00eede5a5d\"],\"error\":null}\n", + "encoding": null + }, + "headers": { + "Content-Type": [ + "application/json" + ] + }, + "status": { + "code": 200, + "message": "OK" + } + }, + "recorded_at": "Thu, 05 Feb 2026 20:07:38 GMT" + } + ], + "recorded_with": "VCR 6.0.0" +} \ No newline at end of file diff --git a/tests/scenarios/cassettes/v2/cloud_cost_management/Create-tag-pipeline-ruleset-with-if-tag-exists-returns-OK-response.frozen b/tests/scenarios/cassettes/v2/cloud_cost_management/Create-tag-pipeline-ruleset-with-if-tag-exists-returns-OK-response.frozen new file mode 100644 index 000000000..ed9c47c8e --- /dev/null +++ b/tests/scenarios/cassettes/v2/cloud_cost_management/Create-tag-pipeline-ruleset-with-if-tag-exists-returns-OK-response.frozen @@ -0,0 +1 @@ +2026-02-04T16:26:04.110Z \ No newline at end of file diff --git a/tests/scenarios/cassettes/v2/cloud_cost_management/Create-tag-pipeline-ruleset-with-if-tag-exists-returns-OK-response.json b/tests/scenarios/cassettes/v2/cloud_cost_management/Create-tag-pipeline-ruleset-with-if-tag-exists-returns-OK-response.json new file mode 100644 index 000000000..5946a17bb --- /dev/null +++ b/tests/scenarios/cassettes/v2/cloud_cost_management/Create-tag-pipeline-ruleset-with-if-tag-exists-returns-OK-response.json @@ -0,0 +1,39 @@ +{ + "http_interactions": [ + { + "request": { + "body": { + "string": "{\"data\":{\"attributes\":{\"enabled\":true,\"rules\":[{\"enabled\":true,\"mapping\":null,\"name\":\"Add Cost Center Tag\",\"query\":{\"addition\":{\"key\":\"cost_center\",\"value\":\"engineering\"},\"case_insensitivity\":false,\"if_tag_exists\":\"replace\",\"query\":\"account_id:\\\"123456789\\\" AND service:\\\"web-api\\\"\"},\"reference_table\":null}]},\"id\":\"New Ruleset\",\"type\":\"create_ruleset\"}}", + "encoding": null + }, + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json" + ] + }, + "method": "post", + "uri": "https://api.datadoghq.com/api/v2/tags/enrichment" + }, + "response": { + "body": { + "string": "{\"data\":{\"id\":\"ee10c3ff-312f-464c-b4f6-46adaa6d00a1\",\"type\":\"ruleset\",\"attributes\":{\"created\":{\"seconds\":1759947966,\"nanos\":679638000},\"enabled\":true,\"last_modified_user_uuid\":\"3ad549bf-eba0-11e9-a77a-0705486660d0\",\"modified\":{\"seconds\":1759947966,\"nanos\":679638000},\"name\":\"New Ruleset\",\"position\":1,\"rules\":[{\"name\":\"Add Cost Center Tag\",\"enabled\":true,\"query\":{\"query\":\"account_id:\\\"123456789\\\" AND service:\\\"web-api\\\"\",\"addition\":{\"key\":\"cost_center\",\"value\":\"engineering\"},\"if_tag_exists\":\"replace\",\"case_insensitivity\":false},\"mapping\":null,\"reference_table\":null,\"metadata\":null}],\"version\":3611102}}}", + "encoding": null + }, + "headers": { + "Content-Type": [ + "application/vnd.api+json" + ] + }, + "status": { + "code": 200, + "message": "OK" + } + }, + "recorded_at": "Wed, 04 Feb 2026 16:26:04 GMT" + } + ], + "recorded_with": "VCR 6.0.0" +} \ No newline at end of file diff --git a/tests/scenarios/cassettes/v2/cloud_cost_management/Update-tag-pipeline-ruleset-with-if-tag-exists-returns-OK-response.frozen b/tests/scenarios/cassettes/v2/cloud_cost_management/Update-tag-pipeline-ruleset-with-if-tag-exists-returns-OK-response.frozen new file mode 100644 index 000000000..3de83d426 --- /dev/null +++ b/tests/scenarios/cassettes/v2/cloud_cost_management/Update-tag-pipeline-ruleset-with-if-tag-exists-returns-OK-response.frozen @@ -0,0 +1 @@ +2025-10-08T19:15:10.916Z \ No newline at end of file diff --git a/tests/scenarios/cassettes/v2/cloud_cost_management/Update-tag-pipeline-ruleset-with-if-tag-exists-returns-OK-response.json b/tests/scenarios/cassettes/v2/cloud_cost_management/Update-tag-pipeline-ruleset-with-if-tag-exists-returns-OK-response.json new file mode 100644 index 000000000..a008e5193 --- /dev/null +++ b/tests/scenarios/cassettes/v2/cloud_cost_management/Update-tag-pipeline-ruleset-with-if-tag-exists-returns-OK-response.json @@ -0,0 +1,39 @@ +{ + "http_interactions": [ + { + "request": { + "body": { + "string": "{\"data\":{\"attributes\":{\"enabled\":true,\"last_version\":3611102,\"rules\":[{\"enabled\":true,\"mapping\":{\"destination_key\":\"team_owner\",\"if_tag_exists\":\"replace\",\"source_keys\":[\"account_name\",\"account_id\"]},\"name\":\"Account Name Mapping\",\"query\":null,\"reference_table\":null}]},\"id\":\"New Ruleset\",\"type\":\"update_ruleset\"}}", + "encoding": null + }, + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json" + ] + }, + "method": "patch", + "uri": "https://api.datadoghq.com/api/v2/tags/enrichment/ee10c3ff-312f-464c-b4f6-46adaa6d00a1" + }, + "response": { + "body": { + "string": "{\"data\":{\"id\":\"ee10c3ff-312f-464c-b4f6-46adaa6d00a1\",\"type\":\"ruleset\",\"attributes\":{\"created\":{\"seconds\":1759950911,\"nanos\":31873000},\"enabled\":true,\"last_modified_user_uuid\":\"3ad549bf-eba0-11e9-a77a-0705486660d0\",\"modified\":{\"seconds\":1759950911,\"nanos\":31873000},\"name\":\"New Ruleset\",\"position\":1,\"rules\":[{\"name\":\"Account Name Mapping\",\"enabled\":true,\"query\":null,\"mapping\":{\"source_keys\":[\"account_name\",\"account_id\"],\"destination_key\":\"team_owner\",\"if_tag_exists\":\"replace\"},\"reference_table\":null,\"metadata\":null}],\"version\":3611113}}}", + "encoding": null + }, + "headers": { + "Content-Type": [ + "application/vnd.api+json" + ] + }, + "status": { + "code": 200, + "message": "OK" + } + }, + "recorded_at": "Wed, 08 Oct 2025 19:15:10 GMT" + } + ], + "recorded_with": "VCR 6.0.0" +} \ No newline at end of file diff --git a/tests/scenarios/features/v1/service_level_objectives.feature b/tests/scenarios/features/v1/service_level_objectives.feature index c5534618a..22c9d6cd3 100644 --- a/tests/scenarios/features/v1/service_level_objectives.feature +++ b/tests/scenarios/features/v1/service_level_objectives.feature @@ -48,6 +48,23 @@ Feature: Service Level Objectives When the request is sent Then the response status is 200 OK + @team:DataDog/slo-app + Scenario: Create a new metric SLO object using sli_specification returns "OK" response + Given new "CreateSLO" request + And body with value {"type":"metric","description":"Metric SLO using sli_specification","name":"{{ unique }}","sli_specification":{"count":{"good_events_formula":{"formula":"query1 - query2"},"total_events_formula":{"formula":"query1"},"queries":[{"data_source":"metrics","name":"query1","query":"sum:httpservice.hits{*}.as_count()"},{"data_source":"metrics","name":"query2","query":"sum:httpservice.errors{*}.as_count()"}]}},"tags":["env:prod","type:count"],"thresholds":[{"target":99.0,"target_display":"99.0","timeframe":"7d","warning":99.5,"warning_display":"99.5"}],"timeframe":"7d","target_threshold":99.0,"warning_threshold":99.5} + When the request is sent + Then the response status is 200 OK + And the response "data[0].timeframe" is equal to "7d" + And the response "data[0].target_threshold" is equal to 99.0 + And the response "data[0].warning_threshold" is equal to 99.5 + And the response "data[0]" has field "sli_specification" + And the response "data[0].sli_specification" has field "count" + And the response "data[0].sli_specification.count" has field "good_events_formula" + And the response "data[0].sli_specification.count" has field "total_events_formula" + And the response "data[0].sli_specification.count" has field "queries" + And the response "data[0].sli_specification.count.queries" has length 2 + And the response "data[0]" has field "query" + @team:DataDog/slo-app Scenario: Create a time-slice SLO object returns "OK" response Given new "CreateSLO" request diff --git a/tests/scenarios/features/v2/cloud_cost_management.feature b/tests/scenarios/features/v2/cloud_cost_management.feature index 66ccd680c..312e05fb3 100644 --- a/tests/scenarios/features/v2/cloud_cost_management.feature +++ b/tests/scenarios/features/v2/cloud_cost_management.feature @@ -97,6 +97,15 @@ Feature: Cloud Cost Management And the response "data.type" is equal to "ruleset" And the response "data.attributes.name" is equal to "New Ruleset" + @replay-only @team:DataDog/cloud-cost-management + Scenario: Create tag pipeline ruleset with if_tag_exists returns "OK" response + Given new "CreateTagPipelinesRuleset" request + And body with value {"data": {"attributes": {"enabled": true, "rules": [{"enabled": true, "mapping": null, "name": "Add Cost Center Tag", "query": {"addition": {"key": "cost_center", "value": "engineering"}, "case_insensitivity": false, "if_tag_exists": "replace", "query": "account_id:\"123456789\" AND service:\"web-api\""}, "reference_table": null}]}, "id": "New Ruleset", "type": "create_ruleset"}} + When the request is sent + Then the response status is 200 OK + And the response "data.type" is equal to "ruleset" + And the response "data.attributes.name" is equal to "New Ruleset" + @generated @skip @team:DataDog/cloud-cost-management Scenario: Delete Cloud Cost Management AWS CUR config returns "Bad Request" response Given new "DeleteCostAWSCURConfig" request @@ -447,6 +456,14 @@ Feature: Cloud Cost Management When the request is sent Then the response status is 200 OK + @replay-only @team:DataDog/cloud-cost-management + Scenario: Update tag pipeline ruleset with if_tag_exists returns "OK" response + Given new "UpdateTagPipelinesRuleset" request + And request contains "ruleset_id" parameter with value "ee10c3ff-312f-464c-b4f6-46adaa6d00a1" + And body with value {"data": {"attributes": {"enabled": true, "last_version": 3611102, "rules": [{"enabled": true, "mapping": {"destination_key": "team_owner", "if_tag_exists": "replace", "source_keys": ["account_name", "account_id"]}, "name": "Account Name Mapping", "query": null, "reference_table": null}]}, "id": "New Ruleset", "type": "update_ruleset"}} + When the request is sent + Then the response status is 200 OK + @replay-only @team:DataDog/cloud-cost-management Scenario: Upload Custom Costs File returns "Accepted" response Given new "UploadCustomCostsFile" request