diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml
index 6ae3aae26d..2717ed939e 100644
--- a/.generator/schemas/v2/openapi.yaml
+++ b/.generator/schemas/v2/openapi.yaml
@@ -9713,6 +9713,110 @@ components:
- name
- expression
type: object
+ CampaignResponse:
+ description: Response containing campaign data.
+ properties:
+ data:
+ $ref: '#/components/schemas/CampaignResponseData'
+ required:
+ - data
+ type: object
+ CampaignResponseAttributes:
+ description: Campaign attributes.
+ properties:
+ created_at:
+ description: Creation time of the campaign.
+ example: '2023-12-15T10:30:00Z'
+ format: date-time
+ type: string
+ description:
+ description: The description of the campaign.
+ example: Campaign to improve security posture for Q1 2024.
+ type: string
+ due_date:
+ description: The due date of the campaign.
+ example: '2024-03-31T23:59:59Z'
+ format: date-time
+ type: string
+ entity_scope:
+ description: Entity scope query to filter entities for this campaign.
+ example: kind:service AND team:platform
+ type: string
+ guidance:
+ description: Guidance for the campaign.
+ example: Please ensure all services pass the security requirements.
+ type: string
+ key:
+ description: The unique key for the campaign.
+ example: q1-security-2024
+ type: string
+ modified_at:
+ description: Time of last campaign modification.
+ example: '2024-01-05T14:20:00Z'
+ format: date-time
+ type: string
+ name:
+ description: The name of the campaign.
+ example: Q1 Security Campaign
+ type: string
+ owner:
+ description: The UUID of the campaign owner.
+ example: 550e8400-e29b-41d4-a716-446655440000
+ type: string
+ start_date:
+ description: The start date of the campaign.
+ example: '2024-01-01T00:00:00Z'
+ format: date-time
+ type: string
+ status:
+ description: The status of the campaign.
+ example: in_progress
+ type: string
+ required:
+ - key
+ - name
+ - owner
+ - status
+ - start_date
+ - created_at
+ - modified_at
+ type: object
+ CampaignResponseData:
+ description: Campaign data.
+ properties:
+ attributes:
+ $ref: '#/components/schemas/CampaignResponseAttributes'
+ id:
+ description: The unique ID of the campaign.
+ example: c10ODp0VCrrIpXmz
+ type: string
+ type:
+ $ref: '#/components/schemas/CampaignType'
+ required:
+ - id
+ - type
+ - attributes
+ type: object
+ CampaignStatus:
+ description: The status of the campaign.
+ enum:
+ - in_progress
+ - not_started
+ - completed
+ example: in_progress
+ type: string
+ x-enum-varnames:
+ - IN_PROGRESS
+ - NOT_STARTED
+ - COMPLETED
+ CampaignType:
+ description: The JSON:API type for campaigns.
+ enum:
+ - campaign
+ example: campaign
+ type: string
+ x-enum-varnames:
+ - CAMPAIGN
CancelDataDeletionResponseBody:
description: The response from the cancel data deletion request endpoint.
properties:
@@ -14780,6 +14884,80 @@ components:
example: Postmortem-IR-123
type: string
type: object
+ CreateCampaignRequest:
+ description: Request to create a new campaign.
+ properties:
+ data:
+ $ref: '#/components/schemas/CreateCampaignRequestData'
+ required:
+ - data
+ type: object
+ CreateCampaignRequestAttributes:
+ description: Attributes for creating a new campaign.
+ properties:
+ description:
+ description: The description of the campaign.
+ example: Campaign to improve security posture for Q1 2024.
+ type: string
+ due_date:
+ description: The due date of the campaign.
+ example: '2024-03-31T23:59:59Z'
+ format: date-time
+ type: string
+ entity_scope:
+ description: Entity scope query to filter entities for this campaign.
+ example: kind:service AND team:platform
+ type: string
+ guidance:
+ description: Guidance for the campaign.
+ example: Please ensure all services pass the security requirements.
+ type: string
+ key:
+ description: The unique key for the campaign.
+ example: q1-security-2024
+ type: string
+ name:
+ description: The name of the campaign.
+ example: Q1 Security Campaign
+ type: string
+ owner_id:
+ description: The UUID of the campaign owner.
+ example: 550e8400-e29b-41d4-a716-446655440000
+ type: string
+ rule_ids:
+ description: Array of rule IDs associated with this campaign.
+ example:
+ - q8MQxk8TCqrHnWkx
+ - r9NRyl9UDrsIoXly
+ items:
+ description: The unique ID of a scorecard rule.
+ type: string
+ type: array
+ start_date:
+ description: The start date of the campaign.
+ example: '2024-01-01T00:00:00Z'
+ format: date-time
+ type: string
+ status:
+ $ref: '#/components/schemas/CampaignStatus'
+ required:
+ - name
+ - key
+ - owner_id
+ - start_date
+ - rule_ids
+ type: object
+ CreateCampaignRequestData:
+ description: Data for creating a new campaign.
+ properties:
+ attributes:
+ $ref: '#/components/schemas/CreateCampaignRequestAttributes'
+ type:
+ $ref: '#/components/schemas/CampaignType'
+ required:
+ - type
+ - attributes
+ type: object
CreateCaseRequestArray:
description: List of requests to create cases for security findings.
properties:
@@ -15727,9 +15905,12 @@ components:
description: Scorecard create rule request data.
properties:
attributes:
- $ref: '#/components/schemas/RuleAttributes'
+ $ref: '#/components/schemas/RuleAttributesRequest'
type:
$ref: '#/components/schemas/RuleType'
+ required:
+ - type
+ - attributes
type: object
CreateRuleResponse:
description: Created rule in response.
@@ -36573,6 +36754,22 @@ components:
required:
- data
type: object
+ ListCampaignsResponse:
+ description: Response containing a list of campaigns.
+ properties:
+ data:
+ $ref: '#/components/schemas/ListCampaignsResponseData'
+ meta:
+ $ref: '#/components/schemas/PaginatedResponseMeta'
+ required:
+ - data
+ - meta
+ type: object
+ ListCampaignsResponseData:
+ description: Array of campaigns.
+ items:
+ $ref: '#/components/schemas/CampaignResponseData'
+ type: array
ListConnectionsResponse:
example:
data:
@@ -36989,6 +37186,19 @@ components:
example: /api/v2/scorecard/rules?page%5Blimit%5D=2&page%5Boffset%5D=2&page%5Bsize%5D=2
type: string
type: object
+ ListScorecardsResponse:
+ description: Response containing a list of scorecards.
+ properties:
+ data:
+ $ref: '#/components/schemas/ListScorecardsResponseData'
+ required:
+ - data
+ type: object
+ ListScorecardsResponseData:
+ description: Array of scorecards.
+ items:
+ $ref: '#/components/schemas/ScorecardListResponseData'
+ type: array
ListSecurityFindingsResponse:
description: The expected response schema when listing security findings.
properties:
@@ -42913,11 +43123,6 @@ components:
**Supported pipeline types:** logs, metrics'
properties:
- address_key:
- description: Name of the environment variable or secret that holds the listen
- address for the Datadog Agent source.
- example: DATADOG_AGENT_ADDRESS
- type: string
id:
description: The unique identifier for this component. Used in other parts
of the pipeline to reference this component (for example, as the `input`
@@ -48546,6 +48751,35 @@ components:
x-enum-varnames:
- LOW
- HIGH
+ PaginatedResponseMeta:
+ description: Metadata for scores response.
+ properties:
+ count:
+ description: Number of entities in this response.
+ example: 10
+ format: int64
+ type: integer
+ limit:
+ description: Pagination limit.
+ example: 10
+ format: int64
+ type: integer
+ offset:
+ description: Pagination offset.
+ example: 0
+ format: int64
+ type: integer
+ total:
+ description: Total number of entities available.
+ example: 150
+ format: int64
+ type: integer
+ required:
+ - count
+ - total
+ - limit
+ - offset
+ type: object
Pagination:
description: Pagination object.
properties:
@@ -54451,6 +54685,39 @@ components:
owner:
description: Owner of the rule.
type: string
+ scope_query:
+ description: A query to filter which entities this rule applies to.
+ example: kind:service
+ type: string
+ scorecard_name:
+ description: The scorecard name to which this rule must belong.
+ example: Deployments automated via Deployment Trains
+ type: string
+ type: object
+ RuleAttributesRequest:
+ description: Attributes for creating or updating a rule. Server-managed fields
+ (created_at, modified_at, custom) are excluded.
+ properties:
+ description:
+ description: Explanation of the rule.
+ type: string
+ enabled:
+ description: If enabled, the rule is calculated as part of the score.
+ example: true
+ type: boolean
+ level:
+ $ref: '#/components/schemas/RuleLevel'
+ name:
+ description: Name of the rule.
+ example: Team Defined
+ type: string
+ owner:
+ description: Owner of the rule.
+ type: string
+ scope_query:
+ description: A query to filter which entities this rule applies to.
+ example: kind:service
+ type: string
scorecard_name:
description: The scorecard name to which this rule must belong.
example: Deployments automated via Deployment Trains
@@ -57011,6 +57278,56 @@ components:
type: string
x-enum-varnames:
- USERS
+ ScorecardListResponseAttributes:
+ description: Scorecard attributes.
+ properties:
+ created_at:
+ description: Creation time of the scorecard.
+ example: '2023-01-15T10:30:00Z'
+ format: date-time
+ type: string
+ description:
+ description: The description of the scorecard.
+ example: Best practices for observability.
+ type: string
+ modified_at:
+ description: Time of last scorecard modification.
+ example: '2024-01-05T14:20:00Z'
+ format: date-time
+ type: string
+ name:
+ description: The name of the scorecard.
+ example: Observability Best Practices
+ type: string
+ required:
+ - name
+ - created_at
+ - modified_at
+ type: object
+ ScorecardListResponseData:
+ description: Scorecard data.
+ properties:
+ attributes:
+ $ref: '#/components/schemas/ScorecardListResponseAttributes'
+ id:
+ description: The unique ID of the scorecard.
+ example: q8MQxk8TCqrHnWkx
+ type: string
+ type:
+ $ref: '#/components/schemas/ScorecardListType'
+ required:
+ - id
+ - type
+ - attributes
+ type: object
+ ScorecardListType:
+ description: The JSON:API type for scorecard list.
+ enum:
+ - scorecard
+ example: scorecard
+ type: string
+ x-enum-varnames:
+ - SCORECARD
ScorecardType:
default: scorecard
description: The JSON:API type for scorecard.
@@ -70103,6 +70420,82 @@ components:
description: The display name of the datastore.
type: string
type: object
+ UpdateCampaignRequest:
+ description: Request to update a campaign.
+ properties:
+ data:
+ $ref: '#/components/schemas/UpdateCampaignRequestData'
+ required:
+ - data
+ type: object
+ UpdateCampaignRequestAttributes:
+ description: Attributes for updating a campaign.
+ properties:
+ description:
+ description: The description of the campaign.
+ example: Campaign to improve security posture for Q1 2024.
+ type: string
+ due_date:
+ description: The due date of the campaign.
+ example: '2024-03-31T23:59:59Z'
+ format: date-time
+ type: string
+ entity_scope:
+ description: Entity scope query to filter entities for this campaign.
+ example: kind:service AND team:platform
+ type: string
+ guidance:
+ description: Guidance for the campaign.
+ example: Please ensure all services pass the security requirements.
+ type: string
+ key:
+ description: The unique key for the campaign.
+ example: q1-security-2024
+ type: string
+ name:
+ description: The name of the campaign.
+ example: Q1 Security Campaign
+ type: string
+ owner_id:
+ description: The UUID of the campaign owner.
+ example: 550e8400-e29b-41d4-a716-446655440000
+ type: string
+ rule_ids:
+ description: Array of rule IDs associated with this campaign.
+ example:
+ - q8MQxk8TCqrHnWkx
+ - r9NRyl9UDrsIoXly
+ items:
+ description: The unique ID of a scorecard rule.
+ type: string
+ type: array
+ start_date:
+ description: The start date of the campaign.
+ example: '2024-01-01T00:00:00Z'
+ format: date-time
+ type: string
+ status:
+ description: The status of the campaign.
+ example: in_progress
+ type: string
+ required:
+ - name
+ - owner_id
+ - status
+ - start_date
+ - rule_ids
+ type: object
+ UpdateCampaignRequestData:
+ description: Data for updating a campaign.
+ properties:
+ attributes:
+ $ref: '#/components/schemas/UpdateCampaignRequestAttributes'
+ type:
+ $ref: '#/components/schemas/CampaignType'
+ required:
+ - type
+ - attributes
+ type: object
UpdateConnectionRequest:
example:
data:
@@ -70585,9 +70978,12 @@ components:
description: Data for the request to update a scorecard rule.
properties:
attributes:
- $ref: '#/components/schemas/RuleAttributes'
+ $ref: '#/components/schemas/RuleAttributesRequest'
type:
$ref: '#/components/schemas/RuleType'
+ required:
+ - type
+ - attributes
type: object
UpdateRuleResponse:
description: The response from a rule update request.
@@ -99820,6 +100216,389 @@ paths:
operator: OR
permissions:
- org_management
+ /api/v2/scorecard/campaigns:
+ get:
+ description: Fetches all scorecard campaigns.
+ operationId: ListScorecardCampaigns
+ parameters:
+ - description: Maximum number of campaigns to return.
+ in: query
+ name: page[limit]
+ required: false
+ schema:
+ default: 10
+ example: 10
+ format: int64
+ type: integer
+ - description: Offset for pagination.
+ in: query
+ name: page[offset]
+ required: false
+ schema:
+ default: 0
+ example: 0
+ format: int64
+ type: integer
+ - description: Filter campaigns by name (full-text search).
+ in: query
+ name: filter[campaign][name]
+ required: false
+ schema:
+ example: security
+ type: string
+ - description: Filter campaigns by status.
+ in: query
+ name: filter[campaign][status]
+ required: false
+ schema:
+ example: in_progress
+ type: string
+ - description: Filter campaigns by owner UUID.
+ in: query
+ name: filter[campaign][owner]
+ required: false
+ schema:
+ example: 550e8400-e29b-41d4-a716-446655440000
+ type: string
+ responses:
+ '200':
+ content:
+ application/json:
+ examples:
+ default:
+ value:
+ data:
+ - attributes:
+ created_at: '2026-01-01T00:00:00Z'
+ entity_scope: kind:service
+ key: test-campaign-1
+ modified_at: '2026-01-01T00:00:00Z'
+ name: Test Campaign 1
+ owner: ''
+ start_date: '2026-01-01T00:00:00Z'
+ status: in_progress
+ id: campaign-1
+ meta:
+ entity_count: 25
+ rule_count: 2
+ relationships:
+ rules:
+ data:
+ - id: rule-1
+ type: rule
+ - id: rule-2
+ type: rule
+ type: campaign
+ meta:
+ count: 1
+ limit: 10
+ offset: 0
+ total: 1
+ schema:
+ $ref: '#/components/schemas/ListCampaignsResponse'
+ description: OK
+ '400':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JSONAPIErrorResponse'
+ description: Bad Request
+ '403':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JSONAPIErrorResponse'
+ description: Forbidden
+ '429':
+ $ref: '#/components/responses/TooManyRequestsResponse'
+ security:
+ - apiKeyAuth: []
+ appKeyAuth: []
+ - AuthZ:
+ - apm_service_catalog_read
+ - cases_read
+ summary: List all campaigns
+ tags:
+ - Scorecards
+ post:
+ description: Creates a new scorecard campaign.
+ operationId: CreateScorecardCampaign
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CreateCampaignRequest'
+ description: Campaign data.
+ required: true
+ responses:
+ '201':
+ content:
+ application/json:
+ examples:
+ default:
+ value:
+ data:
+ attributes:
+ created_at: '2026-01-01T00:00:00Z'
+ key: minimal-campaign
+ modified_at: '2026-01-01T00:00:00Z'
+ name: Minimal Campaign
+ owner: 21f98ae1-4ae2-11eb-958f-07e105a6e810
+ start_date: '2026-01-01T00:00:00Z'
+ status: in_progress
+ id: campaign-2
+ relationships:
+ rules:
+ data:
+ - id: rule-1
+ type: rule
+ type: campaign
+ schema:
+ $ref: '#/components/schemas/CampaignResponse'
+ description: Created
+ '400':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JSONAPIErrorResponse'
+ description: Bad Request
+ '403':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JSONAPIErrorResponse'
+ description: Forbidden
+ '429':
+ $ref: '#/components/responses/TooManyRequestsResponse'
+ security:
+ - apiKeyAuth: []
+ appKeyAuth: []
+ - AuthZ:
+ - apm_service_catalog_write
+ - cases_write
+ summary: Create a new campaign
+ tags:
+ - Scorecards
+ /api/v2/scorecard/campaigns/{campaign_id}:
+ delete:
+ description: Deletes a single campaign by ID or key.
+ operationId: DeleteScorecardCampaign
+ parameters:
+ - description: Campaign ID or key.
+ in: path
+ name: campaign_id
+ required: true
+ schema:
+ example: c10ODp0VCrrIpXmz
+ type: string
+ responses:
+ '204':
+ description: No Content
+ '400':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JSONAPIErrorResponse'
+ description: Bad Request
+ '403':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JSONAPIErrorResponse'
+ description: Forbidden
+ '404':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JSONAPIErrorResponse'
+ description: Not Found
+ '429':
+ $ref: '#/components/responses/TooManyRequestsResponse'
+ security:
+ - apiKeyAuth: []
+ appKeyAuth: []
+ - AuthZ:
+ - apm_service_catalog_write
+ - cases_write
+ summary: Delete a campaign
+ tags:
+ - Scorecards
+ get:
+ description: Fetches a single campaign by ID or key.
+ operationId: GetScorecardCampaign
+ parameters:
+ - description: Campaign ID or key.
+ in: path
+ name: campaign_id
+ required: true
+ schema:
+ example: c10ODp0VCrrIpXmz
+ type: string
+ - description: Include related data (for example, scores).
+ in: query
+ name: include
+ required: false
+ schema:
+ example: scores
+ type: string
+ - description: Include metadata (entity and rule counts).
+ in: query
+ name: include_meta
+ required: false
+ schema:
+ example: true
+ type: boolean
+ responses:
+ '200':
+ content:
+ application/json:
+ examples:
+ default:
+ value:
+ data:
+ attributes:
+ created_at: '2026-01-01T00:00:00Z'
+ key: test-campaign
+ modified_at: '2026-01-01T00:00:00Z'
+ name: Test Campaign
+ owner: ''
+ start_date: '2026-01-01T00:00:00Z'
+ status: in_progress
+ id: c2b79b87-327c-40fa-b726-228f1a60bbb4
+ relationships:
+ campaign_score:
+ data:
+ id: c2b79b87-327c-40fa-b726-228f1a60bbb4
+ type: score
+ rule_scores:
+ data:
+ - id: rule-1
+ type: score
+ rules:
+ data:
+ - id: rule-1
+ type: rule
+ type: campaign
+ included:
+ - attributes:
+ aggregation: campaign
+ denominator: 13
+ numerator: 10
+ score: 76.92
+ total_fail: 2
+ total_no_data: 0
+ total_pass: 10
+ total_skip: 1
+ id: c2b79b87-327c-40fa-b726-228f1a60bbb4
+ type: score
+ schema:
+ $ref: '#/components/schemas/CampaignResponse'
+ description: OK
+ '400':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JSONAPIErrorResponse'
+ description: Bad Request
+ '403':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JSONAPIErrorResponse'
+ description: Forbidden
+ '404':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JSONAPIErrorResponse'
+ description: Not Found
+ '429':
+ $ref: '#/components/responses/TooManyRequestsResponse'
+ security:
+ - apiKeyAuth: []
+ appKeyAuth: []
+ - AuthZ:
+ - apm_service_catalog_read
+ - cases_read
+ summary: Get a campaign
+ tags:
+ - Scorecards
+ put:
+ description: Updates an existing campaign.
+ operationId: UpdateScorecardCampaign
+ parameters:
+ - description: Campaign ID or key.
+ in: path
+ name: campaign_id
+ required: true
+ schema:
+ example: c10ODp0VCrrIpXmz
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UpdateCampaignRequest'
+ description: Campaign data.
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ examples:
+ default:
+ value:
+ data:
+ attributes:
+ created_at: '2026-01-01T00:00:00Z'
+ description: Updated Description
+ key: updated-campaign
+ modified_at: '2026-01-02T00:00:00Z'
+ name: Updated Campaign
+ owner: 21f98ae1-4ae2-11eb-958f-07e105a6e810
+ start_date: '2026-01-01T00:00:00Z'
+ status: completed
+ id: 9c15b9ca-5abd-4875-84c2-02e166a45959
+ relationships:
+ rules:
+ data:
+ - id: rule-1
+ type: rule
+ - id: rule-2
+ type: rule
+ type: campaign
+ schema:
+ $ref: '#/components/schemas/CampaignResponse'
+ description: OK
+ '400':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JSONAPIErrorResponse'
+ description: Bad Request
+ '403':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JSONAPIErrorResponse'
+ description: Forbidden
+ '404':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JSONAPIErrorResponse'
+ description: Not Found
+ '429':
+ $ref: '#/components/responses/TooManyRequestsResponse'
+ security:
+ - apiKeyAuth: []
+ appKeyAuth: []
+ - AuthZ:
+ - apm_service_catalog_write
+ - cases_write
+ summary: Update a campaign
+ tags:
+ - Scorecards
/api/v2/scorecard/outcomes:
get:
description: Fetches all rule outcomes.
@@ -99848,21 +100627,21 @@ paths:
schema:
example: name
type: string
- - description: Filter the outcomes on a specific service name.
+ - description: Filter outcomes on a specific service name.
in: query
name: filter[outcome][service_name]
required: false
schema:
example: web-store
type: string
- - description: Filter the outcomes by a specific state.
+ - description: Filter outcomes by a specific state.
in: query
name: filter[outcome][state]
required: false
schema:
example: fail
type: string
- - description: Filter outcomes on whether a rule is enabled/disabled.
+ - description: Filter outcomes based on whether a rule is enabled or disabled.
in: query
name: filter[rule][enabled]
required: false
@@ -99887,6 +100666,25 @@ paths:
'200':
content:
application/json:
+ examples:
+ default:
+ value:
+ data:
+ - attributes:
+ created_at: '2026-01-06T12:51:32.000546001Z'
+ modified_at: '2026-01-06T12:51:32.000546001Z'
+ remarks: test
+ service_name: my-service
+ state: pass
+ id: a75tJIv_kNQ
+ relationships:
+ rule:
+ data:
+ id: rule-1
+ type: rule
+ type: outcome
+ links:
+ next: /api/v2/scorecard/outcomes?page%5Blimit%5D=100&page%5Boffset%5D=100
schema:
$ref: '#/components/schemas/OutcomesResponse'
description: OK
@@ -99903,17 +100701,14 @@ paths:
- apm_service_catalog_read
summary: List all rule outcomes
tags:
- - Service Scorecards
+ - Scorecards
x-pagination:
limitParam: page[size]
pageOffsetParam: page[offset]
resultsPath: data
- x-unstable: '**Note**: This endpoint is in public beta.
-
- If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/).'
post:
description: Updates multiple scorecard rule outcomes in a single batched request.
- operationId: UpdateScorecardOutcomesAsync
+ operationId: UpdateScorecardOutcomes
requestBody:
content:
application/json:
@@ -99937,15 +100732,13 @@ paths:
appKeyAuth: []
- AuthZ:
- apm_service_catalog_write
- summary: Update Scorecard outcomes asynchronously
+ summary: Update Scorecard outcomes
tags:
- - Service Scorecards
+ - Scorecards
x-codegen-request-body-name: body
- x-unstable: '**Note**: This endpoint is in public beta.
-
- If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/).'
/api/v2/scorecard/outcomes/batch:
post:
+ deprecated: true
description: Sets multiple service-rule outcomes in a single batched request.
operationId: CreateScorecardOutcomesBatch
requestBody:
@@ -99959,6 +100752,25 @@ paths:
'200':
content:
application/json:
+ examples:
+ default:
+ value:
+ data:
+ - attributes:
+ modified_at: '2026-03-11T07:37:20.758067Z'
+ remarks: test remarks
+ service_name: my-service
+ state: pass
+ id: nFs2_9E97Zo
+ relationships:
+ rule:
+ data:
+ id: rule-1
+ type: rule
+ type: outcome
+ meta:
+ total_received: 1
+ total_staged: 1
schema:
$ref: '#/components/schemas/OutcomesBatchResponse'
description: OK
@@ -99975,9 +100787,9 @@ paths:
- apm_service_catalog_write
summary: Create outcomes batch
tags:
- - Service Scorecards
+ - Scorecards
x-codegen-request-body-name: body
- x-unstable: '**Note**: This endpoint is in public beta.
+ x-unstable: '**Note**: This endpoint is in Preview.
If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/).'
/api/v2/scorecard/rules:
@@ -100048,6 +100860,34 @@ paths:
'200':
content:
application/json:
+ examples:
+ default:
+ value:
+ data:
+ - attributes:
+ category: Test Scorecard
+ created_at: '2026-01-06T12:51:32Z'
+ custom: true
+ enabled: true
+ level: 3
+ modified_at: '2026-01-06T12:51:32Z'
+ name: Test Rule 1
+ scorecard_name: Test Scorecard
+ id: rule-1
+ relationships:
+ scorecard:
+ data:
+ id: scorecard-1
+ type: scorecard
+ type: rule
+ included:
+ - attributes:
+ description: Scorecard Description
+ name: Test Scorecard
+ id: scorecard-1
+ type: scorecard
+ links:
+ next: /api/v2/scorecard/rules?include=scorecard&page%5Blimit%5D=100&page%5Boffset%5D=100
schema:
$ref: '#/components/schemas/ListRulesResponse'
description: OK
@@ -100064,20 +100904,27 @@ paths:
- apm_service_catalog_read
summary: List all rules
tags:
- - Service Scorecards
+ - Scorecards
x-pagination:
limitParam: page[size]
pageOffsetParam: page[offset]
resultsPath: data
- x-unstable: '**Note**: This endpoint is in public beta.
-
- If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/).'
post:
description: Creates a new rule.
operationId: CreateScorecardRule
requestBody:
content:
application/json:
+ examples:
+ default:
+ value:
+ data:
+ attributes:
+ enabled: true
+ name: My Rule
+ owner: Datadog
+ scorecard_name: My Scorecard
+ type: rule
schema:
$ref: '#/components/schemas/CreateRuleRequest'
description: Rule attributes.
@@ -100086,6 +100933,26 @@ paths:
'201':
content:
application/json:
+ examples:
+ default:
+ value:
+ data:
+ attributes:
+ category: Test Scorecard
+ created_at: '2026-01-06T12:51:32Z'
+ custom: true
+ enabled: true
+ level: 3
+ modified_at: '2026-01-06T12:51:32Z'
+ name: Test Rule
+ scorecard_name: Test Scorecard
+ id: rule-1
+ relationships:
+ scorecard:
+ data:
+ id: scorecard-1
+ type: scorecard
+ type: rule
schema:
$ref: '#/components/schemas/CreateRuleResponse'
description: Created
@@ -100102,11 +100969,8 @@ paths:
- apm_service_catalog_write
summary: Create a new rule
tags:
- - Service Scorecards
+ - Scorecards
x-codegen-request-body-name: body
- x-unstable: '**Note**: This endpoint is in public beta.
-
- If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/).'
/api/v2/scorecard/rules/{rule_id}:
delete:
description: Deletes a single rule.
@@ -100131,10 +100995,7 @@ paths:
- apm_service_catalog_write
summary: Delete a rule
tags:
- - Service Scorecards
- x-unstable: '**Note**: This endpoint is in public beta.
-
- If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/).'
+ - Scorecards
put:
description: Updates an existing rule.
operationId: UpdateScorecardRule
@@ -100143,6 +101004,18 @@ paths:
requestBody:
content:
application/json:
+ examples:
+ default:
+ value:
+ data:
+ attributes:
+ description: Updated Description
+ enabled: false
+ name: Updated Rule
+ owner: team:updated-team
+ scope_query: kind:service
+ scorecard_name: Updated Scorecard
+ type: rule
schema:
$ref: '#/components/schemas/UpdateRuleRequest'
description: Rule attributes.
@@ -100151,6 +101024,33 @@ paths:
'200':
content:
application/json:
+ examples:
+ default:
+ value:
+ data:
+ attributes:
+ category: Updated Scorecard
+ created_at: '2026-01-06T12:51:32Z'
+ custom: true
+ description: Updated Description
+ enabled: false
+ level: 1
+ modified_at: '2026-01-06T13:00:00Z'
+ name: Updated Rule
+ owner: team:updated-team
+ scope_query: kind:service
+ scorecard_name: Updated Scorecard
+ id: rule-1
+ relationships:
+ scope:
+ data:
+ id: ae07a16e-1319-5e61-bdba-b3026bc2bdcd
+ type: entity-scope
+ scorecard:
+ data:
+ id: scorecard-2
+ type: scorecard
+ type: rule
schema:
$ref: '#/components/schemas/UpdateRuleResponse'
description: Rule updated successfully
@@ -100165,13 +101065,88 @@ paths:
appKeyAuth: []
- AuthZ:
- apm_service_catalog_write
- summary: Update an existing rule
+ summary: Update an existing scorecard rule
tags:
- - Service Scorecards
+ - Scorecards
x-codegen-request-body-name: body
- x-unstable: '**Note**: This endpoint is in public beta.
-
- If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/).'
+ /api/v2/scorecard/scorecards:
+ get:
+ description: Fetches all scorecards.
+ operationId: ListScorecards
+ parameters:
+ - description: Offset for pagination.
+ in: query
+ name: page[offset]
+ required: false
+ schema:
+ default: 0
+ example: 0
+ format: int64
+ type: integer
+ - description: Maximum number of scorecards to return.
+ in: query
+ name: page[size]
+ required: false
+ schema:
+ default: 100
+ example: 10
+ format: int64
+ type: integer
+ - description: Filter by scorecard ID.
+ in: query
+ name: filter[scorecard][id]
+ required: false
+ schema:
+ example: q8MQxk8TCqrHnWkx
+ type: string
+ - description: Filter by scorecard name (partial match).
+ in: query
+ name: filter[scorecard][name]
+ required: false
+ schema:
+ example: Observability
+ type: string
+ - description: Filter by scorecard description (partial match).
+ in: query
+ name: filter[scorecard][description]
+ required: false
+ schema:
+ example: Best Practices
+ type: string
+ responses:
+ '200':
+ content:
+ application/json:
+ examples:
+ default:
+ value:
+ data:
+ - attributes:
+ created_at: '2026-01-01T00:00:00Z'
+ description: Best practices for observability.
+ modified_at: '2026-01-05T14:20:00Z'
+ name: Observability Best Practices
+ id: q8MQxk8TCqrHnWkx
+ type: scorecard
+ schema:
+ $ref: '#/components/schemas/ListScorecardsResponse'
+ description: OK
+ '403':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/JSONAPIErrorResponse'
+ description: Forbidden
+ '429':
+ $ref: '#/components/responses/TooManyRequestsResponse'
+ security:
+ - apiKeyAuth: []
+ appKeyAuth: []
+ - AuthZ:
+ - apm_service_catalog_read
+ summary: List all scorecards
+ tags:
+ - Scorecards
/api/v2/seats/users:
delete:
description: Unassign seats from users for a product code.
@@ -111888,6 +112863,9 @@ tags:
- description: Manage retention filters through [Manage Applications](https://app.datadoghq.com/rum/list)
of RUM for your organization.
name: Rum Retention Filters
+- description: API to create and update scorecard rules and outcomes. See [Scorecards](https://docs.datadoghq.com/service_catalog/scorecards)
+ for more information.
+ name: Scorecards
- description: The seats API allows you to view, assign, and unassign seats for your
organization.
name: Seats
@@ -111923,13 +112901,6 @@ tags:
and improve communication with internal and external users.'
name: Service Level Objectives
-- description: 'API to create and update scorecard rules and outcomes. See [Service
- Scorecards](https://docs.datadoghq.com/service_catalog/scorecards) for more information.
-
-
- This feature is currently in BETA. If you have any feedback, contact [Datadog
- support](https://docs.datadoghq.com/help/).'
- name: Service Scorecards
- description: Manage your ServiceNow Integration. ServiceNow is a cloud-based platform
that helps organizations manage digital workflows for enterprise operations.
name: ServiceNow Integration
diff --git a/docs/datadog_api_client.v2.api.rst b/docs/datadog_api_client.v2.api.rst
index e4a3f68080..574a841c3d 100644
--- a/docs/datadog_api_client.v2.api.rst
+++ b/docs/datadog_api_client.v2.api.rst
@@ -585,6 +585,13 @@ datadog\_api\_client.v2.api.rum\_retention\_filters\_api module
:members:
:show-inheritance:
+datadog\_api\_client.v2.api.scorecards\_api module
+--------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.api.scorecards_api
+ :members:
+ :show-inheritance:
+
datadog\_api\_client.v2.api.seats\_api module
---------------------------------------------
@@ -634,13 +641,6 @@ datadog\_api\_client.v2.api.service\_now\_integration\_api module
:members:
:show-inheritance:
-datadog\_api\_client.v2.api.service\_scorecards\_api module
------------------------------------------------------------
-
-.. automodule:: datadog_api_client.v2.api.service_scorecards_api
- :members:
- :show-inheritance:
-
datadog\_api\_client.v2.api.software\_catalog\_api module
---------------------------------------------------------
diff --git a/docs/datadog_api_client.v2.model.rst b/docs/datadog_api_client.v2.model.rst
index 7a83d1c7c6..e109b079e3 100644
--- a/docs/datadog_api_client.v2.model.rst
+++ b/docs/datadog_api_client.v2.model.rst
@@ -3140,6 +3140,41 @@ datadog\_api\_client.v2.model.calculated\_field module
:members:
:show-inheritance:
+datadog\_api\_client.v2.model.campaign\_response module
+-------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.campaign_response
+ :members:
+ :show-inheritance:
+
+datadog\_api\_client.v2.model.campaign\_response\_attributes module
+-------------------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.campaign_response_attributes
+ :members:
+ :show-inheritance:
+
+datadog\_api\_client.v2.model.campaign\_response\_data module
+-------------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.campaign_response_data
+ :members:
+ :show-inheritance:
+
+datadog\_api\_client.v2.model.campaign\_status module
+-----------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.campaign_status
+ :members:
+ :show-inheritance:
+
+datadog\_api\_client.v2.model.campaign\_type module
+---------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.campaign_type
+ :members:
+ :show-inheritance:
+
datadog\_api\_client.v2.model.cancel\_data\_deletion\_response\_body module
---------------------------------------------------------------------------
@@ -5989,6 +6024,27 @@ datadog\_api\_client.v2.model.create\_attachment\_request\_data\_attributes\_att
:members:
:show-inheritance:
+datadog\_api\_client.v2.model.create\_campaign\_request module
+--------------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.create_campaign_request
+ :members:
+ :show-inheritance:
+
+datadog\_api\_client.v2.model.create\_campaign\_request\_attributes module
+--------------------------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.create_campaign_request_attributes
+ :members:
+ :show-inheritance:
+
+datadog\_api\_client.v2.model.create\_campaign\_request\_data module
+--------------------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.create_campaign_request_data
+ :members:
+ :show-inheritance:
+
datadog\_api\_client.v2.model.create\_case\_request\_array module
-----------------------------------------------------------------
@@ -15271,6 +15327,13 @@ datadog\_api\_client.v2.model.list\_assets\_sbo\_ms\_response module
:members:
:show-inheritance:
+datadog\_api\_client.v2.model.list\_campaigns\_response module
+--------------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.list_campaigns_response
+ :members:
+ :show-inheritance:
+
datadog\_api\_client.v2.model.list\_connections\_response module
----------------------------------------------------------------
@@ -15502,6 +15565,13 @@ datadog\_api\_client.v2.model.list\_rules\_response\_links module
:members:
:show-inheritance:
+datadog\_api\_client.v2.model.list\_scorecards\_response module
+---------------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.list_scorecards_response
+ :members:
+ :show-inheritance:
+
datadog\_api\_client.v2.model.list\_security\_findings\_response module
-----------------------------------------------------------------------
@@ -21067,6 +21137,13 @@ datadog\_api\_client.v2.model.page\_urgency module
:members:
:show-inheritance:
+datadog\_api\_client.v2.model.paginated\_response\_meta module
+--------------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.paginated_response_meta
+ :members:
+ :show-inheritance:
+
datadog\_api\_client.v2.model.pagination module
-----------------------------------------------
@@ -23636,6 +23713,13 @@ datadog\_api\_client.v2.model.rule\_attributes module
:members:
:show-inheritance:
+datadog\_api\_client.v2.model.rule\_attributes\_request module
+--------------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.rule_attributes_request
+ :members:
+ :show-inheritance:
+
datadog\_api\_client.v2.model.rule\_outcome\_relationships module
-----------------------------------------------------------------
@@ -25134,6 +25218,27 @@ datadog\_api\_client.v2.model.schedule\_user\_type module
:members:
:show-inheritance:
+datadog\_api\_client.v2.model.scorecard\_list\_response\_attributes module
+--------------------------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.scorecard_list_response_attributes
+ :members:
+ :show-inheritance:
+
+datadog\_api\_client.v2.model.scorecard\_list\_response\_data module
+--------------------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.scorecard_list_response_data
+ :members:
+ :show-inheritance:
+
+datadog\_api\_client.v2.model.scorecard\_list\_type module
+----------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.scorecard_list_type
+ :members:
+ :show-inheritance:
+
datadog\_api\_client.v2.model.scorecard\_type module
----------------------------------------------------
@@ -30825,6 +30930,27 @@ datadog\_api\_client.v2.model.update\_apps\_datastore\_request\_data\_attributes
:members:
:show-inheritance:
+datadog\_api\_client.v2.model.update\_campaign\_request module
+--------------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.update_campaign_request
+ :members:
+ :show-inheritance:
+
+datadog\_api\_client.v2.model.update\_campaign\_request\_attributes module
+--------------------------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.update_campaign_request_attributes
+ :members:
+ :show-inheritance:
+
+datadog\_api\_client.v2.model.update\_campaign\_request\_data module
+--------------------------------------------------------------------
+
+.. automodule:: datadog_api_client.v2.model.update_campaign_request_data
+ :members:
+ :show-inheritance:
+
datadog\_api\_client.v2.model.update\_connection\_request module
----------------------------------------------------------------
diff --git a/examples/v2/scorecards/CreateScorecardCampaign.py b/examples/v2/scorecards/CreateScorecardCampaign.py
new file mode 100644
index 0000000000..e44579c720
--- /dev/null
+++ b/examples/v2/scorecards/CreateScorecardCampaign.py
@@ -0,0 +1,41 @@
+"""
+Create a new campaign returns "Created" response
+"""
+
+from datadog_api_client import ApiClient, Configuration
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
+from datadog_api_client.v2.model.campaign_status import CampaignStatus
+from datadog_api_client.v2.model.campaign_type import CampaignType
+from datadog_api_client.v2.model.create_campaign_request import CreateCampaignRequest
+from datadog_api_client.v2.model.create_campaign_request_attributes import CreateCampaignRequestAttributes
+from datadog_api_client.v2.model.create_campaign_request_data import CreateCampaignRequestData
+from datetime import datetime
+from dateutil.tz import tzutc
+
+body = CreateCampaignRequest(
+ data=CreateCampaignRequestData(
+ attributes=CreateCampaignRequestAttributes(
+ description="Campaign to improve security posture for Q1 2024.",
+ due_date=datetime(2024, 3, 31, 23, 59, 59, tzinfo=tzutc()),
+ entity_scope="kind:service AND team:platform",
+ guidance="Please ensure all services pass the security requirements.",
+ key="q1-security-2024",
+ name="Q1 Security Campaign",
+ owner_id="550e8400-e29b-41d4-a716-446655440000",
+ rule_ids=[
+ "q8MQxk8TCqrHnWkx",
+ "r9NRyl9UDrsIoXly",
+ ],
+ start_date=datetime(2024, 1, 1, 0, 0, tzinfo=tzutc()),
+ status=CampaignStatus.IN_PROGRESS,
+ ),
+ type=CampaignType.CAMPAIGN,
+ ),
+)
+
+configuration = Configuration()
+with ApiClient(configuration) as api_client:
+ api_instance = ScorecardsApi(api_client)
+ response = api_instance.create_scorecard_campaign(body=body)
+
+ print(response)
diff --git a/examples/v2/service-scorecards/CreateScorecardOutcomesBatch.py b/examples/v2/scorecards/CreateScorecardOutcomesBatch.py
similarity index 78%
rename from examples/v2/service-scorecards/CreateScorecardOutcomesBatch.py
rename to examples/v2/scorecards/CreateScorecardOutcomesBatch.py
index 66be42ee9a..4c3b2cfe9c 100644
--- a/examples/v2/service-scorecards/CreateScorecardOutcomesBatch.py
+++ b/examples/v2/scorecards/CreateScorecardOutcomesBatch.py
@@ -2,9 +2,8 @@
Create outcomes batch returns "OK" response
"""
-from os import environ
from datadog_api_client import ApiClient, Configuration
-from datadog_api_client.v2.api.service_scorecards_api import ServiceScorecardsApi
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
from datadog_api_client.v2.model.outcomes_batch_attributes import OutcomesBatchAttributes
from datadog_api_client.v2.model.outcomes_batch_request import OutcomesBatchRequest
from datadog_api_client.v2.model.outcomes_batch_request_data import OutcomesBatchRequestData
@@ -12,16 +11,13 @@
from datadog_api_client.v2.model.outcomes_batch_type import OutcomesBatchType
from datadog_api_client.v2.model.state import State
-# there is a valid "create_scorecard_rule" in the system
-CREATE_SCORECARD_RULE_DATA_ID = environ["CREATE_SCORECARD_RULE_DATA_ID"]
-
body = OutcomesBatchRequest(
data=OutcomesBatchRequestData(
attributes=OutcomesBatchAttributes(
results=[
OutcomesBatchRequestItem(
remarks='See: Services',
- rule_id=CREATE_SCORECARD_RULE_DATA_ID,
+ rule_id="q8MQxk8TCqrHnWkx",
service_name="my-service",
state=State.PASS,
),
@@ -34,7 +30,7 @@
configuration = Configuration()
configuration.unstable_operations["create_scorecard_outcomes_batch"] = True
with ApiClient(configuration) as api_client:
- api_instance = ServiceScorecardsApi(api_client)
+ api_instance = ScorecardsApi(api_client)
response = api_instance.create_scorecard_outcomes_batch(body=body)
print(response)
diff --git a/examples/v2/service-scorecards/CreateScorecardRule.py b/examples/v2/scorecards/CreateScorecardRule.py
similarity index 60%
rename from examples/v2/service-scorecards/CreateScorecardRule.py
rename to examples/v2/scorecards/CreateScorecardRule.py
index 53b3e17e77..596ae3fdea 100644
--- a/examples/v2/service-scorecards/CreateScorecardRule.py
+++ b/examples/v2/scorecards/CreateScorecardRule.py
@@ -3,27 +3,28 @@
"""
from datadog_api_client import ApiClient, Configuration
-from datadog_api_client.v2.api.service_scorecards_api import ServiceScorecardsApi
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
from datadog_api_client.v2.model.create_rule_request import CreateRuleRequest
from datadog_api_client.v2.model.create_rule_request_data import CreateRuleRequestData
-from datadog_api_client.v2.model.rule_attributes import RuleAttributes
+from datadog_api_client.v2.model.rule_attributes_request import RuleAttributesRequest
from datadog_api_client.v2.model.rule_type import RuleType
body = CreateRuleRequest(
data=CreateRuleRequestData(
- attributes=RuleAttributes(
+ attributes=RuleAttributesRequest(
enabled=True,
- name="Example-Service-Scorecard",
- scorecard_name="Observability Best Practices",
+ level=2,
+ name="Team Defined",
+ scope_query="kind:service",
+ scorecard_name="Deployments automated via Deployment Trains",
),
type=RuleType.RULE,
),
)
configuration = Configuration()
-configuration.unstable_operations["create_scorecard_rule"] = True
with ApiClient(configuration) as api_client:
- api_instance = ServiceScorecardsApi(api_client)
+ api_instance = ScorecardsApi(api_client)
response = api_instance.create_scorecard_rule(body=body)
print(response)
diff --git a/examples/v2/scorecards/DeleteScorecardCampaign.py b/examples/v2/scorecards/DeleteScorecardCampaign.py
new file mode 100644
index 0000000000..e8a7ac7d76
--- /dev/null
+++ b/examples/v2/scorecards/DeleteScorecardCampaign.py
@@ -0,0 +1,13 @@
+"""
+Delete a campaign returns "No Content" response
+"""
+
+from datadog_api_client import ApiClient, Configuration
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
+
+configuration = Configuration()
+with ApiClient(configuration) as api_client:
+ api_instance = ScorecardsApi(api_client)
+ api_instance.delete_scorecard_campaign(
+ campaign_id="c10ODp0VCrrIpXmz",
+ )
diff --git a/examples/v2/scorecards/DeleteScorecardRule.py b/examples/v2/scorecards/DeleteScorecardRule.py
new file mode 100644
index 0000000000..690dacd9a0
--- /dev/null
+++ b/examples/v2/scorecards/DeleteScorecardRule.py
@@ -0,0 +1,13 @@
+"""
+Delete a rule returns "OK" response
+"""
+
+from datadog_api_client import ApiClient, Configuration
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
+
+configuration = Configuration()
+with ApiClient(configuration) as api_client:
+ api_instance = ScorecardsApi(api_client)
+ api_instance.delete_scorecard_rule(
+ rule_id="rule_id",
+ )
diff --git a/examples/v2/scorecards/GetScorecardCampaign.py b/examples/v2/scorecards/GetScorecardCampaign.py
new file mode 100644
index 0000000000..50d9fc1bdf
--- /dev/null
+++ b/examples/v2/scorecards/GetScorecardCampaign.py
@@ -0,0 +1,15 @@
+"""
+Get a campaign returns "OK" response
+"""
+
+from datadog_api_client import ApiClient, Configuration
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
+
+configuration = Configuration()
+with ApiClient(configuration) as api_client:
+ api_instance = ScorecardsApi(api_client)
+ response = api_instance.get_scorecard_campaign(
+ campaign_id="c10ODp0VCrrIpXmz",
+ )
+
+ print(response)
diff --git a/examples/v2/scorecards/ListScorecardCampaigns.py b/examples/v2/scorecards/ListScorecardCampaigns.py
new file mode 100644
index 0000000000..f3d876b907
--- /dev/null
+++ b/examples/v2/scorecards/ListScorecardCampaigns.py
@@ -0,0 +1,13 @@
+"""
+List all campaigns returns "OK" response
+"""
+
+from datadog_api_client import ApiClient, Configuration
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
+
+configuration = Configuration()
+with ApiClient(configuration) as api_client:
+ api_instance = ScorecardsApi(api_client)
+ response = api_instance.list_scorecard_campaigns()
+
+ print(response)
diff --git a/examples/v2/service-scorecards/ListScorecardOutcomes.py b/examples/v2/scorecards/ListScorecardOutcomes.py
similarity index 56%
rename from examples/v2/service-scorecards/ListScorecardOutcomes.py
rename to examples/v2/scorecards/ListScorecardOutcomes.py
index 88398a8b5b..113300f9de 100644
--- a/examples/v2/service-scorecards/ListScorecardOutcomes.py
+++ b/examples/v2/scorecards/ListScorecardOutcomes.py
@@ -3,12 +3,11 @@
"""
from datadog_api_client import ApiClient, Configuration
-from datadog_api_client.v2.api.service_scorecards_api import ServiceScorecardsApi
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
configuration = Configuration()
-configuration.unstable_operations["list_scorecard_outcomes"] = True
with ApiClient(configuration) as api_client:
- api_instance = ServiceScorecardsApi(api_client)
+ api_instance = ScorecardsApi(api_client)
response = api_instance.list_scorecard_outcomes()
print(response)
diff --git a/examples/v2/scorecards/ListScorecardOutcomes_2663454275.py b/examples/v2/scorecards/ListScorecardOutcomes_2663454275.py
new file mode 100644
index 0000000000..bda377ec42
--- /dev/null
+++ b/examples/v2/scorecards/ListScorecardOutcomes_2663454275.py
@@ -0,0 +1,13 @@
+"""
+List all rule outcomes returns "OK" response with pagination
+"""
+
+from datadog_api_client import ApiClient, Configuration
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
+
+configuration = Configuration()
+with ApiClient(configuration) as api_client:
+ api_instance = ScorecardsApi(api_client)
+ items = api_instance.list_scorecard_outcomes_with_pagination()
+ for item in items:
+ print(item)
diff --git a/examples/v2/service-scorecards/ListScorecardRules.py b/examples/v2/scorecards/ListScorecardRules.py
similarity index 55%
rename from examples/v2/service-scorecards/ListScorecardRules.py
rename to examples/v2/scorecards/ListScorecardRules.py
index 57debb7e28..4dbf65e1e1 100644
--- a/examples/v2/service-scorecards/ListScorecardRules.py
+++ b/examples/v2/scorecards/ListScorecardRules.py
@@ -3,12 +3,11 @@
"""
from datadog_api_client import ApiClient, Configuration
-from datadog_api_client.v2.api.service_scorecards_api import ServiceScorecardsApi
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
configuration = Configuration()
-configuration.unstable_operations["list_scorecard_rules"] = True
with ApiClient(configuration) as api_client:
- api_instance = ServiceScorecardsApi(api_client)
+ api_instance = ScorecardsApi(api_client)
response = api_instance.list_scorecard_rules()
print(response)
diff --git a/examples/v2/scorecards/ListScorecardRules_4057666343.py b/examples/v2/scorecards/ListScorecardRules_4057666343.py
new file mode 100644
index 0000000000..ea909cd5d4
--- /dev/null
+++ b/examples/v2/scorecards/ListScorecardRules_4057666343.py
@@ -0,0 +1,13 @@
+"""
+List all rules returns "OK" response with pagination
+"""
+
+from datadog_api_client import ApiClient, Configuration
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
+
+configuration = Configuration()
+with ApiClient(configuration) as api_client:
+ api_instance = ScorecardsApi(api_client)
+ items = api_instance.list_scorecard_rules_with_pagination()
+ for item in items:
+ print(item)
diff --git a/examples/v2/scorecards/ListScorecards.py b/examples/v2/scorecards/ListScorecards.py
new file mode 100644
index 0000000000..fde7464f98
--- /dev/null
+++ b/examples/v2/scorecards/ListScorecards.py
@@ -0,0 +1,13 @@
+"""
+List all scorecards returns "OK" response
+"""
+
+from datadog_api_client import ApiClient, Configuration
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
+
+configuration = Configuration()
+with ApiClient(configuration) as api_client:
+ api_instance = ScorecardsApi(api_client)
+ response = api_instance.list_scorecards()
+
+ print(response)
diff --git a/examples/v2/scorecards/UpdateScorecardCampaign.py b/examples/v2/scorecards/UpdateScorecardCampaign.py
new file mode 100644
index 0000000000..03ebfc4eec
--- /dev/null
+++ b/examples/v2/scorecards/UpdateScorecardCampaign.py
@@ -0,0 +1,40 @@
+"""
+Update a campaign returns "OK" response
+"""
+
+from datadog_api_client import ApiClient, Configuration
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
+from datadog_api_client.v2.model.campaign_type import CampaignType
+from datadog_api_client.v2.model.update_campaign_request import UpdateCampaignRequest
+from datadog_api_client.v2.model.update_campaign_request_attributes import UpdateCampaignRequestAttributes
+from datadog_api_client.v2.model.update_campaign_request_data import UpdateCampaignRequestData
+from datetime import datetime
+from dateutil.tz import tzutc
+
+body = UpdateCampaignRequest(
+ data=UpdateCampaignRequestData(
+ attributes=UpdateCampaignRequestAttributes(
+ description="Campaign to improve security posture for Q1 2024.",
+ due_date=datetime(2024, 3, 31, 23, 59, 59, tzinfo=tzutc()),
+ entity_scope="kind:service AND team:platform",
+ guidance="Please ensure all services pass the security requirements.",
+ key="q1-security-2024",
+ name="Q1 Security Campaign",
+ owner_id="550e8400-e29b-41d4-a716-446655440000",
+ rule_ids=[
+ "q8MQxk8TCqrHnWkx",
+ "r9NRyl9UDrsIoXly",
+ ],
+ start_date=datetime(2024, 1, 1, 0, 0, tzinfo=tzutc()),
+ status="in_progress",
+ ),
+ type=CampaignType.CAMPAIGN,
+ ),
+)
+
+configuration = Configuration()
+with ApiClient(configuration) as api_client:
+ api_instance = ScorecardsApi(api_client)
+ response = api_instance.update_scorecard_campaign(campaign_id="c10ODp0VCrrIpXmz", body=body)
+
+ print(response)
diff --git a/examples/v2/service-scorecards/UpdateScorecardOutcomesAsync.py b/examples/v2/scorecards/UpdateScorecardOutcomes.py
similarity index 68%
rename from examples/v2/service-scorecards/UpdateScorecardOutcomesAsync.py
rename to examples/v2/scorecards/UpdateScorecardOutcomes.py
index edee85101e..663bc29cef 100644
--- a/examples/v2/service-scorecards/UpdateScorecardOutcomesAsync.py
+++ b/examples/v2/scorecards/UpdateScorecardOutcomes.py
@@ -1,10 +1,9 @@
"""
-Update Scorecard outcomes asynchronously returns "Accepted" response
+Update Scorecard outcomes returns "Accepted" response
"""
-from os import environ
from datadog_api_client import ApiClient, Configuration
-from datadog_api_client.v2.api.service_scorecards_api import ServiceScorecardsApi
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
from datadog_api_client.v2.model.state import State
from datadog_api_client.v2.model.update_outcomes_async_attributes import UpdateOutcomesAsyncAttributes
from datadog_api_client.v2.model.update_outcomes_async_request import UpdateOutcomesAsyncRequest
@@ -12,17 +11,14 @@
from datadog_api_client.v2.model.update_outcomes_async_request_item import UpdateOutcomesAsyncRequestItem
from datadog_api_client.v2.model.update_outcomes_async_type import UpdateOutcomesAsyncType
-# there is a valid "create_scorecard_rule" in the system
-CREATE_SCORECARD_RULE_DATA_ID = environ["CREATE_SCORECARD_RULE_DATA_ID"]
-
body = UpdateOutcomesAsyncRequest(
data=UpdateOutcomesAsyncRequestData(
attributes=UpdateOutcomesAsyncAttributes(
results=[
UpdateOutcomesAsyncRequestItem(
- rule_id=CREATE_SCORECARD_RULE_DATA_ID,
entity_reference="service:my-service",
remarks='See: Services',
+ rule_id="q8MQxk8TCqrHnWkx",
state=State.PASS,
),
],
@@ -32,7 +28,6 @@
)
configuration = Configuration()
-configuration.unstable_operations["update_scorecard_outcomes_async"] = True
with ApiClient(configuration) as api_client:
- api_instance = ServiceScorecardsApi(api_client)
- api_instance.update_scorecard_outcomes_async(body=body)
+ api_instance = ScorecardsApi(api_client)
+ api_instance.update_scorecard_outcomes(body=body)
diff --git a/examples/v2/scorecards/UpdateScorecardRule.py b/examples/v2/scorecards/UpdateScorecardRule.py
new file mode 100644
index 0000000000..6e4dc26934
--- /dev/null
+++ b/examples/v2/scorecards/UpdateScorecardRule.py
@@ -0,0 +1,30 @@
+"""
+Update an existing scorecard rule returns "Rule updated successfully" response
+"""
+
+from datadog_api_client import ApiClient, Configuration
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
+from datadog_api_client.v2.model.rule_attributes_request import RuleAttributesRequest
+from datadog_api_client.v2.model.rule_type import RuleType
+from datadog_api_client.v2.model.update_rule_request import UpdateRuleRequest
+from datadog_api_client.v2.model.update_rule_request_data import UpdateRuleRequestData
+
+body = UpdateRuleRequest(
+ data=UpdateRuleRequestData(
+ attributes=RuleAttributesRequest(
+ enabled=True,
+ level=2,
+ name="Team Defined",
+ scope_query="kind:service",
+ scorecard_name="Deployments automated via Deployment Trains",
+ ),
+ type=RuleType.RULE,
+ ),
+)
+
+configuration = Configuration()
+with ApiClient(configuration) as api_client:
+ api_instance = ScorecardsApi(api_client)
+ response = api_instance.update_scorecard_rule(rule_id="rule_id", body=body)
+
+ print(response)
diff --git a/examples/v2/service-scorecards/DeleteScorecardRule.py b/examples/v2/service-scorecards/DeleteScorecardRule.py
deleted file mode 100644
index 98e49856a3..0000000000
--- a/examples/v2/service-scorecards/DeleteScorecardRule.py
+++ /dev/null
@@ -1,18 +0,0 @@
-"""
-Delete a rule returns "OK" response
-"""
-
-from os import environ
-from datadog_api_client import ApiClient, Configuration
-from datadog_api_client.v2.api.service_scorecards_api import ServiceScorecardsApi
-
-# there is a valid "create_scorecard_rule" in the system
-CREATE_SCORECARD_RULE_DATA_ID = environ["CREATE_SCORECARD_RULE_DATA_ID"]
-
-configuration = Configuration()
-configuration.unstable_operations["delete_scorecard_rule"] = True
-with ApiClient(configuration) as api_client:
- api_instance = ServiceScorecardsApi(api_client)
- api_instance.delete_scorecard_rule(
- rule_id=CREATE_SCORECARD_RULE_DATA_ID,
- )
diff --git a/examples/v2/service-scorecards/ListScorecardOutcomes_2663454275.py b/examples/v2/service-scorecards/ListScorecardOutcomes_2663454275.py
deleted file mode 100644
index a4e1497670..0000000000
--- a/examples/v2/service-scorecards/ListScorecardOutcomes_2663454275.py
+++ /dev/null
@@ -1,18 +0,0 @@
-"""
-List all rule outcomes returns "OK" response with pagination
-"""
-
-from datadog_api_client import ApiClient, Configuration
-from datadog_api_client.v2.api.service_scorecards_api import ServiceScorecardsApi
-
-configuration = Configuration()
-configuration.unstable_operations["list_scorecard_outcomes"] = True
-with ApiClient(configuration) as api_client:
- api_instance = ServiceScorecardsApi(api_client)
- items = api_instance.list_scorecard_outcomes_with_pagination(
- page_size=2,
- fields_outcome="state",
- filter_outcome_service_name="my-service",
- )
- for item in items:
- print(item)
diff --git a/examples/v2/service-scorecards/ListScorecardRules_4057666343.py b/examples/v2/service-scorecards/ListScorecardRules_4057666343.py
deleted file mode 100644
index cc4fdc6d9a..0000000000
--- a/examples/v2/service-scorecards/ListScorecardRules_4057666343.py
+++ /dev/null
@@ -1,18 +0,0 @@
-"""
-List all rules returns "OK" response with pagination
-"""
-
-from datadog_api_client import ApiClient, Configuration
-from datadog_api_client.v2.api.service_scorecards_api import ServiceScorecardsApi
-
-configuration = Configuration()
-configuration.unstable_operations["list_scorecard_rules"] = True
-with ApiClient(configuration) as api_client:
- api_instance = ServiceScorecardsApi(api_client)
- items = api_instance.list_scorecard_rules_with_pagination(
- page_size=2,
- filter_rule_custom=True,
- fields_rule="name",
- )
- for item in items:
- print(item)
diff --git a/examples/v2/service-scorecards/UpdateScorecardRule.py b/examples/v2/service-scorecards/UpdateScorecardRule.py
deleted file mode 100644
index cba74500fa..0000000000
--- a/examples/v2/service-scorecards/UpdateScorecardRule.py
+++ /dev/null
@@ -1,34 +0,0 @@
-"""
-Update an existing rule returns "Rule updated successfully" response
-"""
-
-from os import environ
-from datadog_api_client import ApiClient, Configuration
-from datadog_api_client.v2.api.service_scorecards_api import ServiceScorecardsApi
-from datadog_api_client.v2.model.rule_attributes import RuleAttributes
-from datadog_api_client.v2.model.update_rule_request import UpdateRuleRequest
-from datadog_api_client.v2.model.update_rule_request_data import UpdateRuleRequestData
-
-# there is a valid "create_scorecard_rule" in the system
-CREATE_SCORECARD_RULE_DATA_ATTRIBUTES_NAME = environ["CREATE_SCORECARD_RULE_DATA_ATTRIBUTES_NAME"]
-CREATE_SCORECARD_RULE_DATA_ATTRIBUTES_SCORECARD_NAME = environ["CREATE_SCORECARD_RULE_DATA_ATTRIBUTES_SCORECARD_NAME"]
-CREATE_SCORECARD_RULE_DATA_ID = environ["CREATE_SCORECARD_RULE_DATA_ID"]
-
-body = UpdateRuleRequest(
- data=UpdateRuleRequestData(
- attributes=RuleAttributes(
- enabled=True,
- name=CREATE_SCORECARD_RULE_DATA_ATTRIBUTES_NAME,
- scorecard_name=CREATE_SCORECARD_RULE_DATA_ATTRIBUTES_SCORECARD_NAME,
- description="Updated description via test",
- ),
- ),
-)
-
-configuration = Configuration()
-configuration.unstable_operations["update_scorecard_rule"] = True
-with ApiClient(configuration) as api_client:
- api_instance = ServiceScorecardsApi(api_client)
- response = api_instance.update_scorecard_rule(rule_id=CREATE_SCORECARD_RULE_DATA_ID, body=body)
-
- print(response)
diff --git a/src/datadog_api_client/configuration.py b/src/datadog_api_client/configuration.py
index 5cedd11cae..9e098c3af4 100644
--- a/src/datadog_api_client/configuration.py
+++ b/src/datadog_api_client/configuration.py
@@ -443,12 +443,6 @@ def __init__(
"v2.query_users": False,
"v2.update_connection": False,
"v2.create_scorecard_outcomes_batch": False,
- "v2.create_scorecard_rule": False,
- "v2.delete_scorecard_rule": False,
- "v2.list_scorecard_outcomes": False,
- "v2.list_scorecard_rules": False,
- "v2.update_scorecard_outcomes_async": False,
- "v2.update_scorecard_rule": False,
"v2.list_entity_risk_scores": False,
"v2.create_incident_service": False,
"v2.delete_incident_service": False,
diff --git a/src/datadog_api_client/v2/api/service_scorecards_api.py b/src/datadog_api_client/v2/api/scorecards_api.py
similarity index 64%
rename from src/datadog_api_client/v2/api/service_scorecards_api.py
rename to src/datadog_api_client/v2/api/scorecards_api.py
index 17f1b0de83..e0a71e0df4 100644
--- a/src/datadog_api_client/v2/api/service_scorecards_api.py
+++ b/src/datadog_api_client/v2/api/scorecards_api.py
@@ -5,6 +5,7 @@
import collections
from typing import Any, Dict, Union
+import warnings
from datadog_api_client.api_client import ApiClient, Endpoint as _Endpoint
from datadog_api_client.configuration import Configuration
@@ -14,6 +15,10 @@
UnsetType,
unset,
)
+from datadog_api_client.v2.model.list_campaigns_response import ListCampaignsResponse
+from datadog_api_client.v2.model.campaign_response import CampaignResponse
+from datadog_api_client.v2.model.create_campaign_request import CreateCampaignRequest
+from datadog_api_client.v2.model.update_campaign_request import UpdateCampaignRequest
from datadog_api_client.v2.model.outcomes_response import OutcomesResponse
from datadog_api_client.v2.model.outcomes_response_data_item import OutcomesResponseDataItem
from datadog_api_client.v2.model.update_outcomes_async_request import UpdateOutcomesAsyncRequest
@@ -25,13 +30,12 @@
from datadog_api_client.v2.model.create_rule_request import CreateRuleRequest
from datadog_api_client.v2.model.update_rule_response import UpdateRuleResponse
from datadog_api_client.v2.model.update_rule_request import UpdateRuleRequest
+from datadog_api_client.v2.model.list_scorecards_response import ListScorecardsResponse
-class ServiceScorecardsApi:
+class ScorecardsApi:
"""
- API to create and update scorecard rules and outcomes. See `Service Scorecards `_ for more information.
-
- This feature is currently in BETA. If you have any feedback, contact `Datadog support `_.
+ API to create and update scorecard rules and outcomes. See `Scorecards `_ for more information.
"""
def __init__(self, api_client=None):
@@ -39,6 +43,26 @@ def __init__(self, api_client=None):
api_client = ApiClient(Configuration())
self.api_client = api_client
+ self._create_scorecard_campaign_endpoint = _Endpoint(
+ settings={
+ "response_type": (CampaignResponse,),
+ "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"],
+ "endpoint_path": "/api/v2/scorecard/campaigns",
+ "operation_id": "create_scorecard_campaign",
+ "http_method": "POST",
+ "version": "v2",
+ },
+ params_map={
+ "body": {
+ "required": True,
+ "openapi_types": (CreateCampaignRequest,),
+ "location": "body",
+ },
+ },
+ headers_map={"accept": ["application/json"], "content_type": ["application/json"]},
+ api_client=api_client,
+ )
+
self._create_scorecard_outcomes_batch_endpoint = _Endpoint(
settings={
"response_type": (OutcomesBatchResponse,),
@@ -79,6 +103,29 @@ def __init__(self, api_client=None):
api_client=api_client,
)
+ self._delete_scorecard_campaign_endpoint = _Endpoint(
+ settings={
+ "response_type": None,
+ "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"],
+ "endpoint_path": "/api/v2/scorecard/campaigns/{campaign_id}",
+ "operation_id": "delete_scorecard_campaign",
+ "http_method": "DELETE",
+ "version": "v2",
+ },
+ params_map={
+ "campaign_id": {
+ "required": True,
+ "openapi_types": (str,),
+ "attribute": "campaign_id",
+ "location": "path",
+ },
+ },
+ headers_map={
+ "accept": ["*/*"],
+ },
+ api_client=api_client,
+ )
+
self._delete_scorecard_rule_endpoint = _Endpoint(
settings={
"response_type": None,
@@ -102,6 +149,81 @@ def __init__(self, api_client=None):
api_client=api_client,
)
+ self._get_scorecard_campaign_endpoint = _Endpoint(
+ settings={
+ "response_type": (CampaignResponse,),
+ "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"],
+ "endpoint_path": "/api/v2/scorecard/campaigns/{campaign_id}",
+ "operation_id": "get_scorecard_campaign",
+ "http_method": "GET",
+ "version": "v2",
+ },
+ params_map={
+ "campaign_id": {
+ "required": True,
+ "openapi_types": (str,),
+ "attribute": "campaign_id",
+ "location": "path",
+ },
+ "include": {
+ "openapi_types": (str,),
+ "attribute": "include",
+ "location": "query",
+ },
+ "include_meta": {
+ "openapi_types": (bool,),
+ "attribute": "include_meta",
+ "location": "query",
+ },
+ },
+ headers_map={
+ "accept": ["application/json"],
+ },
+ api_client=api_client,
+ )
+
+ self._list_scorecard_campaigns_endpoint = _Endpoint(
+ settings={
+ "response_type": (ListCampaignsResponse,),
+ "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"],
+ "endpoint_path": "/api/v2/scorecard/campaigns",
+ "operation_id": "list_scorecard_campaigns",
+ "http_method": "GET",
+ "version": "v2",
+ },
+ params_map={
+ "page_limit": {
+ "openapi_types": (int,),
+ "attribute": "page[limit]",
+ "location": "query",
+ },
+ "page_offset": {
+ "openapi_types": (int,),
+ "attribute": "page[offset]",
+ "location": "query",
+ },
+ "filter_campaign_name": {
+ "openapi_types": (str,),
+ "attribute": "filter[campaign][name]",
+ "location": "query",
+ },
+ "filter_campaign_status": {
+ "openapi_types": (str,),
+ "attribute": "filter[campaign][status]",
+ "location": "query",
+ },
+ "filter_campaign_owner": {
+ "openapi_types": (str,),
+ "attribute": "filter[campaign][owner]",
+ "location": "query",
+ },
+ },
+ headers_map={
+ "accept": ["application/json"],
+ },
+ api_client=api_client,
+ )
+
self._list_scorecard_outcomes_endpoint = _Endpoint(
settings={
"response_type": (OutcomesResponse,),
@@ -236,12 +358,80 @@ def __init__(self, api_client=None):
api_client=api_client,
)
- self._update_scorecard_outcomes_async_endpoint = _Endpoint(
+ self._list_scorecards_endpoint = _Endpoint(
+ settings={
+ "response_type": (ListScorecardsResponse,),
+ "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"],
+ "endpoint_path": "/api/v2/scorecard/scorecards",
+ "operation_id": "list_scorecards",
+ "http_method": "GET",
+ "version": "v2",
+ },
+ params_map={
+ "page_offset": {
+ "openapi_types": (int,),
+ "attribute": "page[offset]",
+ "location": "query",
+ },
+ "page_size": {
+ "openapi_types": (int,),
+ "attribute": "page[size]",
+ "location": "query",
+ },
+ "filter_scorecard_id": {
+ "openapi_types": (str,),
+ "attribute": "filter[scorecard][id]",
+ "location": "query",
+ },
+ "filter_scorecard_name": {
+ "openapi_types": (str,),
+ "attribute": "filter[scorecard][name]",
+ "location": "query",
+ },
+ "filter_scorecard_description": {
+ "openapi_types": (str,),
+ "attribute": "filter[scorecard][description]",
+ "location": "query",
+ },
+ },
+ headers_map={
+ "accept": ["application/json"],
+ },
+ api_client=api_client,
+ )
+
+ self._update_scorecard_campaign_endpoint = _Endpoint(
+ settings={
+ "response_type": (CampaignResponse,),
+ "auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"],
+ "endpoint_path": "/api/v2/scorecard/campaigns/{campaign_id}",
+ "operation_id": "update_scorecard_campaign",
+ "http_method": "PUT",
+ "version": "v2",
+ },
+ params_map={
+ "campaign_id": {
+ "required": True,
+ "openapi_types": (str,),
+ "attribute": "campaign_id",
+ "location": "path",
+ },
+ "body": {
+ "required": True,
+ "openapi_types": (UpdateCampaignRequest,),
+ "location": "body",
+ },
+ },
+ headers_map={"accept": ["application/json"], "content_type": ["application/json"]},
+ api_client=api_client,
+ )
+
+ self._update_scorecard_outcomes_endpoint = _Endpoint(
settings={
"response_type": None,
"auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"],
"endpoint_path": "/api/v2/scorecard/outcomes",
- "operation_id": "update_scorecard_outcomes_async",
+ "operation_id": "update_scorecard_outcomes",
"http_method": "POST",
"version": "v2",
},
@@ -282,11 +472,28 @@ def __init__(self, api_client=None):
api_client=api_client,
)
+ def create_scorecard_campaign(
+ self,
+ body: CreateCampaignRequest,
+ ) -> CampaignResponse:
+ """Create a new campaign.
+
+ Creates a new scorecard campaign.
+
+ :param body: Campaign data.
+ :type body: CreateCampaignRequest
+ :rtype: CampaignResponse
+ """
+ kwargs: Dict[str, Any] = {}
+ kwargs["body"] = body
+
+ return self._create_scorecard_campaign_endpoint.call_with_http_info(**kwargs)
+
def create_scorecard_outcomes_batch(
self,
body: OutcomesBatchRequest,
) -> OutcomesBatchResponse:
- """Create outcomes batch.
+ """Create outcomes batch. **Deprecated**.
Sets multiple service-rule outcomes in a single batched request.
@@ -297,6 +504,7 @@ def create_scorecard_outcomes_batch(
kwargs: Dict[str, Any] = {}
kwargs["body"] = body
+ warnings.warn("create_scorecard_outcomes_batch is deprecated", DeprecationWarning, stacklevel=2)
return self._create_scorecard_outcomes_batch_endpoint.call_with_http_info(**kwargs)
def create_scorecard_rule(
@@ -316,6 +524,23 @@ def create_scorecard_rule(
return self._create_scorecard_rule_endpoint.call_with_http_info(**kwargs)
+ def delete_scorecard_campaign(
+ self,
+ campaign_id: str,
+ ) -> None:
+ """Delete a campaign.
+
+ Deletes a single campaign by ID or key.
+
+ :param campaign_id: Campaign ID or key.
+ :type campaign_id: str
+ :rtype: None
+ """
+ kwargs: Dict[str, Any] = {}
+ kwargs["campaign_id"] = campaign_id
+
+ return self._delete_scorecard_campaign_endpoint.call_with_http_info(**kwargs)
+
def delete_scorecard_rule(
self,
rule_id: str,
@@ -333,6 +558,79 @@ def delete_scorecard_rule(
return self._delete_scorecard_rule_endpoint.call_with_http_info(**kwargs)
+ def get_scorecard_campaign(
+ self,
+ campaign_id: str,
+ *,
+ include: Union[str, UnsetType] = unset,
+ include_meta: Union[bool, UnsetType] = unset,
+ ) -> CampaignResponse:
+ """Get a campaign.
+
+ Fetches a single campaign by ID or key.
+
+ :param campaign_id: Campaign ID or key.
+ :type campaign_id: str
+ :param include: Include related data (for example, scores).
+ :type include: str, optional
+ :param include_meta: Include metadata (entity and rule counts).
+ :type include_meta: bool, optional
+ :rtype: CampaignResponse
+ """
+ kwargs: Dict[str, Any] = {}
+ kwargs["campaign_id"] = campaign_id
+
+ if include is not unset:
+ kwargs["include"] = include
+
+ if include_meta is not unset:
+ kwargs["include_meta"] = include_meta
+
+ return self._get_scorecard_campaign_endpoint.call_with_http_info(**kwargs)
+
+ def list_scorecard_campaigns(
+ self,
+ *,
+ page_limit: Union[int, UnsetType] = unset,
+ page_offset: Union[int, UnsetType] = unset,
+ filter_campaign_name: Union[str, UnsetType] = unset,
+ filter_campaign_status: Union[str, UnsetType] = unset,
+ filter_campaign_owner: Union[str, UnsetType] = unset,
+ ) -> ListCampaignsResponse:
+ """List all campaigns.
+
+ Fetches all scorecard campaigns.
+
+ :param page_limit: Maximum number of campaigns to return.
+ :type page_limit: int, optional
+ :param page_offset: Offset for pagination.
+ :type page_offset: int, optional
+ :param filter_campaign_name: Filter campaigns by name (full-text search).
+ :type filter_campaign_name: str, optional
+ :param filter_campaign_status: Filter campaigns by status.
+ :type filter_campaign_status: str, optional
+ :param filter_campaign_owner: Filter campaigns by owner UUID.
+ :type filter_campaign_owner: str, optional
+ :rtype: ListCampaignsResponse
+ """
+ kwargs: Dict[str, Any] = {}
+ if page_limit is not unset:
+ kwargs["page_limit"] = page_limit
+
+ if page_offset is not unset:
+ kwargs["page_offset"] = page_offset
+
+ if filter_campaign_name is not unset:
+ kwargs["filter_campaign_name"] = filter_campaign_name
+
+ if filter_campaign_status is not unset:
+ kwargs["filter_campaign_status"] = filter_campaign_status
+
+ if filter_campaign_owner is not unset:
+ kwargs["filter_campaign_owner"] = filter_campaign_owner
+
+ return self._list_scorecard_campaigns_endpoint.call_with_http_info(**kwargs)
+
def list_scorecard_outcomes(
self,
*,
@@ -361,11 +659,11 @@ def list_scorecard_outcomes(
:type fields_outcome: str, optional
:param fields_rule: Return only specified values in the included rule details.
:type fields_rule: str, optional
- :param filter_outcome_service_name: Filter the outcomes on a specific service name.
+ :param filter_outcome_service_name: Filter outcomes on a specific service name.
:type filter_outcome_service_name: str, optional
- :param filter_outcome_state: Filter the outcomes by a specific state.
+ :param filter_outcome_state: Filter outcomes by a specific state.
:type filter_outcome_state: str, optional
- :param filter_rule_enabled: Filter outcomes on whether a rule is enabled/disabled.
+ :param filter_rule_enabled: Filter outcomes based on whether a rule is enabled or disabled.
:type filter_rule_enabled: bool, optional
:param filter_rule_id: Filter outcomes based on rule ID.
:type filter_rule_id: str, optional
@@ -434,11 +732,11 @@ def list_scorecard_outcomes_with_pagination(
:type fields_outcome: str, optional
:param fields_rule: Return only specified values in the included rule details.
:type fields_rule: str, optional
- :param filter_outcome_service_name: Filter the outcomes on a specific service name.
+ :param filter_outcome_service_name: Filter outcomes on a specific service name.
:type filter_outcome_service_name: str, optional
- :param filter_outcome_state: Filter the outcomes by a specific state.
+ :param filter_outcome_state: Filter outcomes by a specific state.
:type filter_outcome_state: str, optional
- :param filter_rule_enabled: Filter outcomes on whether a rule is enabled/disabled.
+ :param filter_rule_enabled: Filter outcomes based on whether a rule is enabled or disabled.
:type filter_rule_enabled: bool, optional
:param filter_rule_id: Filter outcomes based on rule ID.
:type filter_rule_id: str, optional
@@ -649,11 +947,76 @@ def list_scorecard_rules_with_pagination(
}
return endpoint.call_with_http_info_paginated(pagination)
- def update_scorecard_outcomes_async(
+ def list_scorecards(
+ self,
+ *,
+ page_offset: Union[int, UnsetType] = unset,
+ page_size: Union[int, UnsetType] = unset,
+ filter_scorecard_id: Union[str, UnsetType] = unset,
+ filter_scorecard_name: Union[str, UnsetType] = unset,
+ filter_scorecard_description: Union[str, UnsetType] = unset,
+ ) -> ListScorecardsResponse:
+ """List all scorecards.
+
+ Fetches all scorecards.
+
+ :param page_offset: Offset for pagination.
+ :type page_offset: int, optional
+ :param page_size: Maximum number of scorecards to return.
+ :type page_size: int, optional
+ :param filter_scorecard_id: Filter by scorecard ID.
+ :type filter_scorecard_id: str, optional
+ :param filter_scorecard_name: Filter by scorecard name (partial match).
+ :type filter_scorecard_name: str, optional
+ :param filter_scorecard_description: Filter by scorecard description (partial match).
+ :type filter_scorecard_description: str, optional
+ :rtype: ListScorecardsResponse
+ """
+ kwargs: Dict[str, Any] = {}
+ if page_offset is not unset:
+ kwargs["page_offset"] = page_offset
+
+ if page_size is not unset:
+ kwargs["page_size"] = page_size
+
+ if filter_scorecard_id is not unset:
+ kwargs["filter_scorecard_id"] = filter_scorecard_id
+
+ if filter_scorecard_name is not unset:
+ kwargs["filter_scorecard_name"] = filter_scorecard_name
+
+ if filter_scorecard_description is not unset:
+ kwargs["filter_scorecard_description"] = filter_scorecard_description
+
+ return self._list_scorecards_endpoint.call_with_http_info(**kwargs)
+
+ def update_scorecard_campaign(
+ self,
+ campaign_id: str,
+ body: UpdateCampaignRequest,
+ ) -> CampaignResponse:
+ """Update a campaign.
+
+ Updates an existing campaign.
+
+ :param campaign_id: Campaign ID or key.
+ :type campaign_id: str
+ :param body: Campaign data.
+ :type body: UpdateCampaignRequest
+ :rtype: CampaignResponse
+ """
+ kwargs: Dict[str, Any] = {}
+ kwargs["campaign_id"] = campaign_id
+
+ kwargs["body"] = body
+
+ return self._update_scorecard_campaign_endpoint.call_with_http_info(**kwargs)
+
+ def update_scorecard_outcomes(
self,
body: UpdateOutcomesAsyncRequest,
) -> None:
- """Update Scorecard outcomes asynchronously.
+ """Update Scorecard outcomes.
Updates multiple scorecard rule outcomes in a single batched request.
@@ -664,14 +1027,14 @@ def update_scorecard_outcomes_async(
kwargs: Dict[str, Any] = {}
kwargs["body"] = body
- return self._update_scorecard_outcomes_async_endpoint.call_with_http_info(**kwargs)
+ return self._update_scorecard_outcomes_endpoint.call_with_http_info(**kwargs)
def update_scorecard_rule(
self,
rule_id: str,
body: UpdateRuleRequest,
) -> UpdateRuleResponse:
- """Update an existing rule.
+ """Update an existing scorecard rule.
Updates an existing rule.
diff --git a/src/datadog_api_client/v2/apis/__init__.py b/src/datadog_api_client/v2/apis/__init__.py
index ef672a68e2..9a04f8cdd5 100644
--- a/src/datadog_api_client/v2/apis/__init__.py
+++ b/src/datadog_api_client/v2/apis/__init__.py
@@ -81,13 +81,13 @@
from datadog_api_client.v2.api.rum_replay_sessions_api import RumReplaySessionsApi
from datadog_api_client.v2.api.rum_replay_viewership_api import RumReplayViewershipApi
from datadog_api_client.v2.api.rum_retention_filters_api import RumRetentionFiltersApi
+from datadog_api_client.v2.api.scorecards_api import ScorecardsApi
from datadog_api_client.v2.api.seats_api import SeatsApi
from datadog_api_client.v2.api.security_monitoring_api import SecurityMonitoringApi
from datadog_api_client.v2.api.sensitive_data_scanner_api import SensitiveDataScannerApi
from datadog_api_client.v2.api.service_accounts_api import ServiceAccountsApi
from datadog_api_client.v2.api.service_definition_api import ServiceDefinitionApi
from datadog_api_client.v2.api.service_level_objectives_api import ServiceLevelObjectivesApi
-from datadog_api_client.v2.api.service_scorecards_api import ServiceScorecardsApi
from datadog_api_client.v2.api.service_now_integration_api import ServiceNowIntegrationApi
from datadog_api_client.v2.api.software_catalog_api import SoftwareCatalogApi
from datadog_api_client.v2.api.spa_api import SpaApi
@@ -187,13 +187,13 @@
"RumReplaySessionsApi",
"RumReplayViewershipApi",
"RumRetentionFiltersApi",
+ "ScorecardsApi",
"SeatsApi",
"SecurityMonitoringApi",
"SensitiveDataScannerApi",
"ServiceAccountsApi",
"ServiceDefinitionApi",
"ServiceLevelObjectivesApi",
- "ServiceScorecardsApi",
"ServiceNowIntegrationApi",
"SoftwareCatalogApi",
"SpaApi",
diff --git a/src/datadog_api_client/v2/model/campaign_response.py b/src/datadog_api_client/v2/model/campaign_response.py
new file mode 100644
index 0000000000..a2c3a99d28
--- /dev/null
+++ b/src/datadog_api_client/v2/model/campaign_response.py
@@ -0,0 +1,40 @@
+# 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.
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+)
+
+
+if TYPE_CHECKING:
+ from datadog_api_client.v2.model.campaign_response_data import CampaignResponseData
+
+
+class CampaignResponse(ModelNormal):
+ @cached_property
+ def openapi_types(_):
+ from datadog_api_client.v2.model.campaign_response_data import CampaignResponseData
+
+ return {
+ "data": (CampaignResponseData,),
+ }
+
+ attribute_map = {
+ "data": "data",
+ }
+
+ def __init__(self_, data: CampaignResponseData, **kwargs):
+ """
+ Response containing campaign data.
+
+ :param data: Campaign data.
+ :type data: CampaignResponseData
+ """
+ super().__init__(kwargs)
+
+ self_.data = data
diff --git a/src/datadog_api_client/v2/model/campaign_response_attributes.py b/src/datadog_api_client/v2/model/campaign_response_attributes.py
new file mode 100644
index 0000000000..e1579f8016
--- /dev/null
+++ b/src/datadog_api_client/v2/model/campaign_response_attributes.py
@@ -0,0 +1,115 @@
+# 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.
+from __future__ import annotations
+
+from typing import Union
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+ datetime,
+ unset,
+ UnsetType,
+)
+
+
+class CampaignResponseAttributes(ModelNormal):
+ @cached_property
+ def openapi_types(_):
+ return {
+ "created_at": (datetime,),
+ "description": (str,),
+ "due_date": (datetime,),
+ "entity_scope": (str,),
+ "guidance": (str,),
+ "key": (str,),
+ "modified_at": (datetime,),
+ "name": (str,),
+ "owner": (str,),
+ "start_date": (datetime,),
+ "status": (str,),
+ }
+
+ attribute_map = {
+ "created_at": "created_at",
+ "description": "description",
+ "due_date": "due_date",
+ "entity_scope": "entity_scope",
+ "guidance": "guidance",
+ "key": "key",
+ "modified_at": "modified_at",
+ "name": "name",
+ "owner": "owner",
+ "start_date": "start_date",
+ "status": "status",
+ }
+
+ def __init__(
+ self_,
+ created_at: datetime,
+ key: str,
+ modified_at: datetime,
+ name: str,
+ owner: str,
+ start_date: datetime,
+ status: str,
+ description: Union[str, UnsetType] = unset,
+ due_date: Union[datetime, UnsetType] = unset,
+ entity_scope: Union[str, UnsetType] = unset,
+ guidance: Union[str, UnsetType] = unset,
+ **kwargs,
+ ):
+ """
+ Campaign attributes.
+
+ :param created_at: Creation time of the campaign.
+ :type created_at: datetime
+
+ :param description: The description of the campaign.
+ :type description: str, optional
+
+ :param due_date: The due date of the campaign.
+ :type due_date: datetime, optional
+
+ :param entity_scope: Entity scope query to filter entities for this campaign.
+ :type entity_scope: str, optional
+
+ :param guidance: Guidance for the campaign.
+ :type guidance: str, optional
+
+ :param key: The unique key for the campaign.
+ :type key: str
+
+ :param modified_at: Time of last campaign modification.
+ :type modified_at: datetime
+
+ :param name: The name of the campaign.
+ :type name: str
+
+ :param owner: The UUID of the campaign owner.
+ :type owner: str
+
+ :param start_date: The start date of the campaign.
+ :type start_date: datetime
+
+ :param status: The status of the campaign.
+ :type status: str
+ """
+ if description is not unset:
+ kwargs["description"] = description
+ if due_date is not unset:
+ kwargs["due_date"] = due_date
+ if entity_scope is not unset:
+ kwargs["entity_scope"] = entity_scope
+ if guidance is not unset:
+ kwargs["guidance"] = guidance
+ super().__init__(kwargs)
+
+ self_.created_at = created_at
+ self_.key = key
+ self_.modified_at = modified_at
+ self_.name = name
+ self_.owner = owner
+ self_.start_date = start_date
+ self_.status = status
diff --git a/src/datadog_api_client/v2/model/campaign_response_data.py b/src/datadog_api_client/v2/model/campaign_response_data.py
new file mode 100644
index 0000000000..e933789262
--- /dev/null
+++ b/src/datadog_api_client/v2/model/campaign_response_data.py
@@ -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.
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+)
+
+
+if TYPE_CHECKING:
+ from datadog_api_client.v2.model.campaign_response_attributes import CampaignResponseAttributes
+ from datadog_api_client.v2.model.campaign_type import CampaignType
+
+
+class CampaignResponseData(ModelNormal):
+ @cached_property
+ def openapi_types(_):
+ from datadog_api_client.v2.model.campaign_response_attributes import CampaignResponseAttributes
+ from datadog_api_client.v2.model.campaign_type import CampaignType
+
+ return {
+ "attributes": (CampaignResponseAttributes,),
+ "id": (str,),
+ "type": (CampaignType,),
+ }
+
+ attribute_map = {
+ "attributes": "attributes",
+ "id": "id",
+ "type": "type",
+ }
+
+ def __init__(self_, attributes: CampaignResponseAttributes, id: str, type: CampaignType, **kwargs):
+ """
+ Campaign data.
+
+ :param attributes: Campaign attributes.
+ :type attributes: CampaignResponseAttributes
+
+ :param id: The unique ID of the campaign.
+ :type id: str
+
+ :param type: The JSON:API type for campaigns.
+ :type type: CampaignType
+ """
+ super().__init__(kwargs)
+
+ self_.attributes = attributes
+ self_.id = id
+ self_.type = type
diff --git a/src/datadog_api_client/v2/model/campaign_status.py b/src/datadog_api_client/v2/model/campaign_status.py
new file mode 100644
index 0000000000..0f95364353
--- /dev/null
+++ b/src/datadog_api_client/v2/model/campaign_status.py
@@ -0,0 +1,41 @@
+# 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.
+from __future__ import annotations
+
+
+from datadog_api_client.model_utils import (
+ ModelSimple,
+ cached_property,
+)
+
+from typing import ClassVar
+
+
+class CampaignStatus(ModelSimple):
+ """
+ The status of the campaign.
+
+ :param value: Must be one of ["in_progress", "not_started", "completed"].
+ :type value: str
+ """
+
+ allowed_values = {
+ "in_progress",
+ "not_started",
+ "completed",
+ }
+ IN_PROGRESS: ClassVar["CampaignStatus"]
+ NOT_STARTED: ClassVar["CampaignStatus"]
+ COMPLETED: ClassVar["CampaignStatus"]
+
+ @cached_property
+ def openapi_types(_):
+ return {
+ "value": (str,),
+ }
+
+
+CampaignStatus.IN_PROGRESS = CampaignStatus("in_progress")
+CampaignStatus.NOT_STARTED = CampaignStatus("not_started")
+CampaignStatus.COMPLETED = CampaignStatus("completed")
diff --git a/src/datadog_api_client/v2/model/campaign_type.py b/src/datadog_api_client/v2/model/campaign_type.py
new file mode 100644
index 0000000000..ad488b91d0
--- /dev/null
+++ b/src/datadog_api_client/v2/model/campaign_type.py
@@ -0,0 +1,35 @@
+# 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.
+from __future__ import annotations
+
+
+from datadog_api_client.model_utils import (
+ ModelSimple,
+ cached_property,
+)
+
+from typing import ClassVar
+
+
+class CampaignType(ModelSimple):
+ """
+ The JSON:API type for campaigns.
+
+ :param value: If omitted defaults to "campaign". Must be one of ["campaign"].
+ :type value: str
+ """
+
+ allowed_values = {
+ "campaign",
+ }
+ CAMPAIGN: ClassVar["CampaignType"]
+
+ @cached_property
+ def openapi_types(_):
+ return {
+ "value": (str,),
+ }
+
+
+CampaignType.CAMPAIGN = CampaignType("campaign")
diff --git a/src/datadog_api_client/v2/model/create_campaign_request.py b/src/datadog_api_client/v2/model/create_campaign_request.py
new file mode 100644
index 0000000000..658bb1cedc
--- /dev/null
+++ b/src/datadog_api_client/v2/model/create_campaign_request.py
@@ -0,0 +1,40 @@
+# 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.
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+)
+
+
+if TYPE_CHECKING:
+ from datadog_api_client.v2.model.create_campaign_request_data import CreateCampaignRequestData
+
+
+class CreateCampaignRequest(ModelNormal):
+ @cached_property
+ def openapi_types(_):
+ from datadog_api_client.v2.model.create_campaign_request_data import CreateCampaignRequestData
+
+ return {
+ "data": (CreateCampaignRequestData,),
+ }
+
+ attribute_map = {
+ "data": "data",
+ }
+
+ def __init__(self_, data: CreateCampaignRequestData, **kwargs):
+ """
+ Request to create a new campaign.
+
+ :param data: Data for creating a new campaign.
+ :type data: CreateCampaignRequestData
+ """
+ super().__init__(kwargs)
+
+ self_.data = data
diff --git a/src/datadog_api_client/v2/model/create_campaign_request_attributes.py b/src/datadog_api_client/v2/model/create_campaign_request_attributes.py
new file mode 100644
index 0000000000..8eade9761c
--- /dev/null
+++ b/src/datadog_api_client/v2/model/create_campaign_request_attributes.py
@@ -0,0 +1,115 @@
+# 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.
+from __future__ import annotations
+
+from typing import List, Union, TYPE_CHECKING
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+ datetime,
+ unset,
+ UnsetType,
+)
+
+
+if TYPE_CHECKING:
+ from datadog_api_client.v2.model.campaign_status import CampaignStatus
+
+
+class CreateCampaignRequestAttributes(ModelNormal):
+ @cached_property
+ def openapi_types(_):
+ from datadog_api_client.v2.model.campaign_status import CampaignStatus
+
+ return {
+ "description": (str,),
+ "due_date": (datetime,),
+ "entity_scope": (str,),
+ "guidance": (str,),
+ "key": (str,),
+ "name": (str,),
+ "owner_id": (str,),
+ "rule_ids": ([str],),
+ "start_date": (datetime,),
+ "status": (CampaignStatus,),
+ }
+
+ attribute_map = {
+ "description": "description",
+ "due_date": "due_date",
+ "entity_scope": "entity_scope",
+ "guidance": "guidance",
+ "key": "key",
+ "name": "name",
+ "owner_id": "owner_id",
+ "rule_ids": "rule_ids",
+ "start_date": "start_date",
+ "status": "status",
+ }
+
+ def __init__(
+ self_,
+ key: str,
+ name: str,
+ owner_id: str,
+ rule_ids: List[str],
+ start_date: datetime,
+ description: Union[str, UnsetType] = unset,
+ due_date: Union[datetime, UnsetType] = unset,
+ entity_scope: Union[str, UnsetType] = unset,
+ guidance: Union[str, UnsetType] = unset,
+ status: Union[CampaignStatus, UnsetType] = unset,
+ **kwargs,
+ ):
+ """
+ Attributes for creating a new campaign.
+
+ :param description: The description of the campaign.
+ :type description: str, optional
+
+ :param due_date: The due date of the campaign.
+ :type due_date: datetime, optional
+
+ :param entity_scope: Entity scope query to filter entities for this campaign.
+ :type entity_scope: str, optional
+
+ :param guidance: Guidance for the campaign.
+ :type guidance: str, optional
+
+ :param key: The unique key for the campaign.
+ :type key: str
+
+ :param name: The name of the campaign.
+ :type name: str
+
+ :param owner_id: The UUID of the campaign owner.
+ :type owner_id: str
+
+ :param rule_ids: Array of rule IDs associated with this campaign.
+ :type rule_ids: [str]
+
+ :param start_date: The start date of the campaign.
+ :type start_date: datetime
+
+ :param status: The status of the campaign.
+ :type status: CampaignStatus, optional
+ """
+ if description is not unset:
+ kwargs["description"] = description
+ if due_date is not unset:
+ kwargs["due_date"] = due_date
+ if entity_scope is not unset:
+ kwargs["entity_scope"] = entity_scope
+ if guidance is not unset:
+ kwargs["guidance"] = guidance
+ if status is not unset:
+ kwargs["status"] = status
+ super().__init__(kwargs)
+
+ self_.key = key
+ self_.name = name
+ self_.owner_id = owner_id
+ self_.rule_ids = rule_ids
+ self_.start_date = start_date
diff --git a/src/datadog_api_client/v2/model/create_campaign_request_data.py b/src/datadog_api_client/v2/model/create_campaign_request_data.py
new file mode 100644
index 0000000000..c9e307e1f4
--- /dev/null
+++ b/src/datadog_api_client/v2/model/create_campaign_request_data.py
@@ -0,0 +1,48 @@
+# 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.
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+)
+
+
+if TYPE_CHECKING:
+ from datadog_api_client.v2.model.create_campaign_request_attributes import CreateCampaignRequestAttributes
+ from datadog_api_client.v2.model.campaign_type import CampaignType
+
+
+class CreateCampaignRequestData(ModelNormal):
+ @cached_property
+ def openapi_types(_):
+ from datadog_api_client.v2.model.create_campaign_request_attributes import CreateCampaignRequestAttributes
+ from datadog_api_client.v2.model.campaign_type import CampaignType
+
+ return {
+ "attributes": (CreateCampaignRequestAttributes,),
+ "type": (CampaignType,),
+ }
+
+ attribute_map = {
+ "attributes": "attributes",
+ "type": "type",
+ }
+
+ def __init__(self_, attributes: CreateCampaignRequestAttributes, type: CampaignType, **kwargs):
+ """
+ Data for creating a new campaign.
+
+ :param attributes: Attributes for creating a new campaign.
+ :type attributes: CreateCampaignRequestAttributes
+
+ :param type: The JSON:API type for campaigns.
+ :type type: CampaignType
+ """
+ super().__init__(kwargs)
+
+ self_.attributes = attributes
+ self_.type = type
diff --git a/src/datadog_api_client/v2/model/create_rule_request_data.py b/src/datadog_api_client/v2/model/create_rule_request_data.py
index ff44f6c2a8..449e239178 100644
--- a/src/datadog_api_client/v2/model/create_rule_request_data.py
+++ b/src/datadog_api_client/v2/model/create_rule_request_data.py
@@ -3,29 +3,27 @@
# Copyright 2019-Present Datadog, Inc.
from __future__ import annotations
-from typing import Union, TYPE_CHECKING
+from typing import TYPE_CHECKING
from datadog_api_client.model_utils import (
ModelNormal,
cached_property,
- unset,
- UnsetType,
)
if TYPE_CHECKING:
- from datadog_api_client.v2.model.rule_attributes import RuleAttributes
+ from datadog_api_client.v2.model.rule_attributes_request import RuleAttributesRequest
from datadog_api_client.v2.model.rule_type import RuleType
class CreateRuleRequestData(ModelNormal):
@cached_property
def openapi_types(_):
- from datadog_api_client.v2.model.rule_attributes import RuleAttributes
+ from datadog_api_client.v2.model.rule_attributes_request import RuleAttributesRequest
from datadog_api_client.v2.model.rule_type import RuleType
return {
- "attributes": (RuleAttributes,),
+ "attributes": (RuleAttributesRequest,),
"type": (RuleType,),
}
@@ -34,20 +32,17 @@ def openapi_types(_):
"type": "type",
}
- def __init__(
- self_, attributes: Union[RuleAttributes, UnsetType] = unset, type: Union[RuleType, UnsetType] = unset, **kwargs
- ):
+ def __init__(self_, attributes: RuleAttributesRequest, type: RuleType, **kwargs):
"""
Scorecard create rule request data.
- :param attributes: Details of a rule.
- :type attributes: RuleAttributes, optional
+ :param attributes: Attributes for creating or updating a rule. Server-managed fields (created_at, modified_at, custom) are excluded.
+ :type attributes: RuleAttributesRequest
:param type: The JSON:API type for scorecard rules.
- :type type: RuleType, optional
+ :type type: RuleType
"""
- if attributes is not unset:
- kwargs["attributes"] = attributes
- if type is not unset:
- kwargs["type"] = type
super().__init__(kwargs)
+
+ self_.attributes = attributes
+ self_.type = type
diff --git a/src/datadog_api_client/v2/model/list_campaigns_response.py b/src/datadog_api_client/v2/model/list_campaigns_response.py
new file mode 100644
index 0000000000..062a11da07
--- /dev/null
+++ b/src/datadog_api_client/v2/model/list_campaigns_response.py
@@ -0,0 +1,48 @@
+# 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.
+from __future__ import annotations
+
+from typing import List, TYPE_CHECKING
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+)
+
+
+if TYPE_CHECKING:
+ from datadog_api_client.v2.model.campaign_response_data import CampaignResponseData
+ from datadog_api_client.v2.model.paginated_response_meta import PaginatedResponseMeta
+
+
+class ListCampaignsResponse(ModelNormal):
+ @cached_property
+ def openapi_types(_):
+ from datadog_api_client.v2.model.campaign_response_data import CampaignResponseData
+ from datadog_api_client.v2.model.paginated_response_meta import PaginatedResponseMeta
+
+ return {
+ "data": ([CampaignResponseData],),
+ "meta": (PaginatedResponseMeta,),
+ }
+
+ attribute_map = {
+ "data": "data",
+ "meta": "meta",
+ }
+
+ def __init__(self_, data: List[CampaignResponseData], meta: PaginatedResponseMeta, **kwargs):
+ """
+ Response containing a list of campaigns.
+
+ :param data: Array of campaigns.
+ :type data: [CampaignResponseData]
+
+ :param meta: Metadata for scores response.
+ :type meta: PaginatedResponseMeta
+ """
+ super().__init__(kwargs)
+
+ self_.data = data
+ self_.meta = meta
diff --git a/src/datadog_api_client/v2/model/list_scorecards_response.py b/src/datadog_api_client/v2/model/list_scorecards_response.py
new file mode 100644
index 0000000000..4685773b40
--- /dev/null
+++ b/src/datadog_api_client/v2/model/list_scorecards_response.py
@@ -0,0 +1,40 @@
+# 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.
+from __future__ import annotations
+
+from typing import List, TYPE_CHECKING
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+)
+
+
+if TYPE_CHECKING:
+ from datadog_api_client.v2.model.scorecard_list_response_data import ScorecardListResponseData
+
+
+class ListScorecardsResponse(ModelNormal):
+ @cached_property
+ def openapi_types(_):
+ from datadog_api_client.v2.model.scorecard_list_response_data import ScorecardListResponseData
+
+ return {
+ "data": ([ScorecardListResponseData],),
+ }
+
+ attribute_map = {
+ "data": "data",
+ }
+
+ def __init__(self_, data: List[ScorecardListResponseData], **kwargs):
+ """
+ Response containing a list of scorecards.
+
+ :param data: Array of scorecards.
+ :type data: [ScorecardListResponseData]
+ """
+ super().__init__(kwargs)
+
+ self_.data = data
diff --git a/src/datadog_api_client/v2/model/observability_pipeline_config_source_item.py b/src/datadog_api_client/v2/model/observability_pipeline_config_source_item.py
index 46a3d03c8d..1b57e164c2 100644
--- a/src/datadog_api_client/v2/model/observability_pipeline_config_source_item.py
+++ b/src/datadog_api_client/v2/model/observability_pipeline_config_source_item.py
@@ -15,9 +15,6 @@ def __init__(self, **kwargs):
"""
A data source for the pipeline.
- :param address_key: Name of the environment variable or secret that holds the listen address for the Datadog Agent source.
- :type address_key: str, optional
-
:param id: The unique identifier for this component. Used in other parts of the pipeline to reference this component (for example, as the `input` to downstream components).
:type id: str
@@ -27,6 +24,9 @@ def __init__(self, **kwargs):
:param type: The source type. The value should always be `datadog_agent`.
:type type: ObservabilityPipelineDatadogAgentSourceType
+ :param address_key: Name of the environment variable or secret that holds the Firehose delivery stream address.
+ :type address_key: str, optional
+
:param auth: AWS authentication credentials used for accessing AWS services such as S3.
If omitted, the system’s default credentials are used (for example, the IAM role and environment variables).
:type auth: ObservabilityPipelineAwsAuth, optional
diff --git a/src/datadog_api_client/v2/model/observability_pipeline_datadog_agent_source.py b/src/datadog_api_client/v2/model/observability_pipeline_datadog_agent_source.py
index 061438a5ee..ddce71ea67 100644
--- a/src/datadog_api_client/v2/model/observability_pipeline_datadog_agent_source.py
+++ b/src/datadog_api_client/v2/model/observability_pipeline_datadog_agent_source.py
@@ -29,14 +29,12 @@ def openapi_types(_):
)
return {
- "address_key": (str,),
"id": (str,),
"tls": (ObservabilityPipelineTls,),
"type": (ObservabilityPipelineDatadogAgentSourceType,),
}
attribute_map = {
- "address_key": "address_key",
"id": "id",
"tls": "tls",
"type": "type",
@@ -46,7 +44,6 @@ def __init__(
self_,
id: str,
type: ObservabilityPipelineDatadogAgentSourceType,
- address_key: Union[str, UnsetType] = unset,
tls: Union[ObservabilityPipelineTls, UnsetType] = unset,
**kwargs,
):
@@ -55,9 +52,6 @@ def __init__(
**Supported pipeline types:** logs, metrics
- :param address_key: Name of the environment variable or secret that holds the listen address for the Datadog Agent source.
- :type address_key: str, optional
-
:param id: The unique identifier for this component. Used in other parts of the pipeline to reference this component (for example, as the ``input`` to downstream components).
:type id: str
@@ -67,8 +61,6 @@ def __init__(
:param type: The source type. The value should always be ``datadog_agent``.
:type type: ObservabilityPipelineDatadogAgentSourceType
"""
- if address_key is not unset:
- kwargs["address_key"] = address_key
if tls is not unset:
kwargs["tls"] = tls
super().__init__(kwargs)
diff --git a/src/datadog_api_client/v2/model/paginated_response_meta.py b/src/datadog_api_client/v2/model/paginated_response_meta.py
new file mode 100644
index 0000000000..56939d857c
--- /dev/null
+++ b/src/datadog_api_client/v2/model/paginated_response_meta.py
@@ -0,0 +1,51 @@
+# 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.
+from __future__ import annotations
+
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+)
+
+
+class PaginatedResponseMeta(ModelNormal):
+ @cached_property
+ def openapi_types(_):
+ return {
+ "count": (int,),
+ "limit": (int,),
+ "offset": (int,),
+ "total": (int,),
+ }
+
+ attribute_map = {
+ "count": "count",
+ "limit": "limit",
+ "offset": "offset",
+ "total": "total",
+ }
+
+ def __init__(self_, count: int, limit: int, offset: int, total: int, **kwargs):
+ """
+ Metadata for scores response.
+
+ :param count: Number of entities in this response.
+ :type count: int
+
+ :param limit: Pagination limit.
+ :type limit: int
+
+ :param offset: Pagination offset.
+ :type offset: int
+
+ :param total: Total number of entities available.
+ :type total: int
+ """
+ super().__init__(kwargs)
+
+ self_.count = count
+ self_.limit = limit
+ self_.offset = offset
+ self_.total = total
diff --git a/src/datadog_api_client/v2/model/rule_attributes.py b/src/datadog_api_client/v2/model/rule_attributes.py
index 25ad024b5e..54718394b8 100644
--- a/src/datadog_api_client/v2/model/rule_attributes.py
+++ b/src/datadog_api_client/v2/model/rule_attributes.py
@@ -34,6 +34,7 @@ def openapi_types(_):
"modified_at": (datetime,),
"name": (str,),
"owner": (str,),
+ "scope_query": (str,),
"scorecard_name": (str,),
}
@@ -47,6 +48,7 @@ def openapi_types(_):
"modified_at": "modified_at",
"name": "name",
"owner": "owner",
+ "scope_query": "scope_query",
"scorecard_name": "scorecard_name",
}
@@ -61,6 +63,7 @@ def __init__(
modified_at: Union[datetime, UnsetType] = unset,
name: Union[str, UnsetType] = unset,
owner: Union[str, UnsetType] = unset,
+ scope_query: Union[str, UnsetType] = unset,
scorecard_name: Union[str, UnsetType] = unset,
**kwargs,
):
@@ -94,6 +97,9 @@ def __init__(
:param owner: Owner of the rule.
:type owner: str, optional
+ :param scope_query: A query to filter which entities this rule applies to.
+ :type scope_query: str, optional
+
:param scorecard_name: The scorecard name to which this rule must belong.
:type scorecard_name: str, optional
"""
@@ -115,6 +121,8 @@ def __init__(
kwargs["name"] = name
if owner is not unset:
kwargs["owner"] = owner
+ if scope_query is not unset:
+ kwargs["scope_query"] = scope_query
if scorecard_name is not unset:
kwargs["scorecard_name"] = scorecard_name
super().__init__(kwargs)
diff --git a/src/datadog_api_client/v2/model/rule_attributes_request.py b/src/datadog_api_client/v2/model/rule_attributes_request.py
new file mode 100644
index 0000000000..1f6f100904
--- /dev/null
+++ b/src/datadog_api_client/v2/model/rule_attributes_request.py
@@ -0,0 +1,95 @@
+# 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.
+from __future__ import annotations
+
+from typing import Union
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+ unset,
+ UnsetType,
+)
+
+
+class RuleAttributesRequest(ModelNormal):
+ validations = {
+ "level": {
+ "inclusive_maximum": 3,
+ "inclusive_minimum": 1,
+ },
+ }
+
+ @cached_property
+ def openapi_types(_):
+ return {
+ "description": (str,),
+ "enabled": (bool,),
+ "level": (int,),
+ "name": (str,),
+ "owner": (str,),
+ "scope_query": (str,),
+ "scorecard_name": (str,),
+ }
+
+ attribute_map = {
+ "description": "description",
+ "enabled": "enabled",
+ "level": "level",
+ "name": "name",
+ "owner": "owner",
+ "scope_query": "scope_query",
+ "scorecard_name": "scorecard_name",
+ }
+
+ def __init__(
+ self_,
+ description: Union[str, UnsetType] = unset,
+ enabled: Union[bool, UnsetType] = unset,
+ level: Union[int, UnsetType] = unset,
+ name: Union[str, UnsetType] = unset,
+ owner: Union[str, UnsetType] = unset,
+ scope_query: Union[str, UnsetType] = unset,
+ scorecard_name: Union[str, UnsetType] = unset,
+ **kwargs,
+ ):
+ """
+ Attributes for creating or updating a rule. Server-managed fields (created_at, modified_at, custom) are excluded.
+
+ :param description: Explanation of the rule.
+ :type description: str, optional
+
+ :param enabled: If enabled, the rule is calculated as part of the score.
+ :type enabled: bool, optional
+
+ :param level: The maturity level of the rule (1, 2, or 3).
+ :type level: int, optional
+
+ :param name: Name of the rule.
+ :type name: str, optional
+
+ :param owner: Owner of the rule.
+ :type owner: str, optional
+
+ :param scope_query: A query to filter which entities this rule applies to.
+ :type scope_query: str, optional
+
+ :param scorecard_name: The scorecard name to which this rule must belong.
+ :type scorecard_name: str, optional
+ """
+ if description is not unset:
+ kwargs["description"] = description
+ if enabled is not unset:
+ kwargs["enabled"] = enabled
+ if level is not unset:
+ kwargs["level"] = level
+ if name is not unset:
+ kwargs["name"] = name
+ if owner is not unset:
+ kwargs["owner"] = owner
+ if scope_query is not unset:
+ kwargs["scope_query"] = scope_query
+ if scorecard_name is not unset:
+ kwargs["scorecard_name"] = scorecard_name
+ super().__init__(kwargs)
diff --git a/src/datadog_api_client/v2/model/scorecard_list_response_attributes.py b/src/datadog_api_client/v2/model/scorecard_list_response_attributes.py
new file mode 100644
index 0000000000..db0ea8b618
--- /dev/null
+++ b/src/datadog_api_client/v2/model/scorecard_list_response_attributes.py
@@ -0,0 +1,63 @@
+# 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.
+from __future__ import annotations
+
+from typing import Union
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+ datetime,
+ unset,
+ UnsetType,
+)
+
+
+class ScorecardListResponseAttributes(ModelNormal):
+ @cached_property
+ def openapi_types(_):
+ return {
+ "created_at": (datetime,),
+ "description": (str,),
+ "modified_at": (datetime,),
+ "name": (str,),
+ }
+
+ attribute_map = {
+ "created_at": "created_at",
+ "description": "description",
+ "modified_at": "modified_at",
+ "name": "name",
+ }
+
+ def __init__(
+ self_,
+ created_at: datetime,
+ modified_at: datetime,
+ name: str,
+ description: Union[str, UnsetType] = unset,
+ **kwargs,
+ ):
+ """
+ Scorecard attributes.
+
+ :param created_at: Creation time of the scorecard.
+ :type created_at: datetime
+
+ :param description: The description of the scorecard.
+ :type description: str, optional
+
+ :param modified_at: Time of last scorecard modification.
+ :type modified_at: datetime
+
+ :param name: The name of the scorecard.
+ :type name: str
+ """
+ if description is not unset:
+ kwargs["description"] = description
+ super().__init__(kwargs)
+
+ self_.created_at = created_at
+ self_.modified_at = modified_at
+ self_.name = name
diff --git a/src/datadog_api_client/v2/model/scorecard_list_response_data.py b/src/datadog_api_client/v2/model/scorecard_list_response_data.py
new file mode 100644
index 0000000000..f0cf6821dd
--- /dev/null
+++ b/src/datadog_api_client/v2/model/scorecard_list_response_data.py
@@ -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.
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+)
+
+
+if TYPE_CHECKING:
+ from datadog_api_client.v2.model.scorecard_list_response_attributes import ScorecardListResponseAttributes
+ from datadog_api_client.v2.model.scorecard_list_type import ScorecardListType
+
+
+class ScorecardListResponseData(ModelNormal):
+ @cached_property
+ def openapi_types(_):
+ from datadog_api_client.v2.model.scorecard_list_response_attributes import ScorecardListResponseAttributes
+ from datadog_api_client.v2.model.scorecard_list_type import ScorecardListType
+
+ return {
+ "attributes": (ScorecardListResponseAttributes,),
+ "id": (str,),
+ "type": (ScorecardListType,),
+ }
+
+ attribute_map = {
+ "attributes": "attributes",
+ "id": "id",
+ "type": "type",
+ }
+
+ def __init__(self_, attributes: ScorecardListResponseAttributes, id: str, type: ScorecardListType, **kwargs):
+ """
+ Scorecard data.
+
+ :param attributes: Scorecard attributes.
+ :type attributes: ScorecardListResponseAttributes
+
+ :param id: The unique ID of the scorecard.
+ :type id: str
+
+ :param type: The JSON:API type for scorecard list.
+ :type type: ScorecardListType
+ """
+ super().__init__(kwargs)
+
+ self_.attributes = attributes
+ self_.id = id
+ self_.type = type
diff --git a/src/datadog_api_client/v2/model/scorecard_list_type.py b/src/datadog_api_client/v2/model/scorecard_list_type.py
new file mode 100644
index 0000000000..264cf27f80
--- /dev/null
+++ b/src/datadog_api_client/v2/model/scorecard_list_type.py
@@ -0,0 +1,35 @@
+# 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.
+from __future__ import annotations
+
+
+from datadog_api_client.model_utils import (
+ ModelSimple,
+ cached_property,
+)
+
+from typing import ClassVar
+
+
+class ScorecardListType(ModelSimple):
+ """
+ The JSON:API type for scorecard list.
+
+ :param value: If omitted defaults to "scorecard". Must be one of ["scorecard"].
+ :type value: str
+ """
+
+ allowed_values = {
+ "scorecard",
+ }
+ SCORECARD: ClassVar["ScorecardListType"]
+
+ @cached_property
+ def openapi_types(_):
+ return {
+ "value": (str,),
+ }
+
+
+ScorecardListType.SCORECARD = ScorecardListType("scorecard")
diff --git a/src/datadog_api_client/v2/model/update_campaign_request.py b/src/datadog_api_client/v2/model/update_campaign_request.py
new file mode 100644
index 0000000000..4ef257e37a
--- /dev/null
+++ b/src/datadog_api_client/v2/model/update_campaign_request.py
@@ -0,0 +1,40 @@
+# 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.
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+)
+
+
+if TYPE_CHECKING:
+ from datadog_api_client.v2.model.update_campaign_request_data import UpdateCampaignRequestData
+
+
+class UpdateCampaignRequest(ModelNormal):
+ @cached_property
+ def openapi_types(_):
+ from datadog_api_client.v2.model.update_campaign_request_data import UpdateCampaignRequestData
+
+ return {
+ "data": (UpdateCampaignRequestData,),
+ }
+
+ attribute_map = {
+ "data": "data",
+ }
+
+ def __init__(self_, data: UpdateCampaignRequestData, **kwargs):
+ """
+ Request to update a campaign.
+
+ :param data: Data for updating a campaign.
+ :type data: UpdateCampaignRequestData
+ """
+ super().__init__(kwargs)
+
+ self_.data = data
diff --git a/src/datadog_api_client/v2/model/update_campaign_request_attributes.py b/src/datadog_api_client/v2/model/update_campaign_request_attributes.py
new file mode 100644
index 0000000000..e60f938ab2
--- /dev/null
+++ b/src/datadog_api_client/v2/model/update_campaign_request_attributes.py
@@ -0,0 +1,109 @@
+# 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.
+from __future__ import annotations
+
+from typing import List, Union
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+ datetime,
+ unset,
+ UnsetType,
+)
+
+
+class UpdateCampaignRequestAttributes(ModelNormal):
+ @cached_property
+ def openapi_types(_):
+ return {
+ "description": (str,),
+ "due_date": (datetime,),
+ "entity_scope": (str,),
+ "guidance": (str,),
+ "key": (str,),
+ "name": (str,),
+ "owner_id": (str,),
+ "rule_ids": ([str],),
+ "start_date": (datetime,),
+ "status": (str,),
+ }
+
+ attribute_map = {
+ "description": "description",
+ "due_date": "due_date",
+ "entity_scope": "entity_scope",
+ "guidance": "guidance",
+ "key": "key",
+ "name": "name",
+ "owner_id": "owner_id",
+ "rule_ids": "rule_ids",
+ "start_date": "start_date",
+ "status": "status",
+ }
+
+ def __init__(
+ self_,
+ name: str,
+ owner_id: str,
+ rule_ids: List[str],
+ start_date: datetime,
+ status: str,
+ description: Union[str, UnsetType] = unset,
+ due_date: Union[datetime, UnsetType] = unset,
+ entity_scope: Union[str, UnsetType] = unset,
+ guidance: Union[str, UnsetType] = unset,
+ key: Union[str, UnsetType] = unset,
+ **kwargs,
+ ):
+ """
+ Attributes for updating a campaign.
+
+ :param description: The description of the campaign.
+ :type description: str, optional
+
+ :param due_date: The due date of the campaign.
+ :type due_date: datetime, optional
+
+ :param entity_scope: Entity scope query to filter entities for this campaign.
+ :type entity_scope: str, optional
+
+ :param guidance: Guidance for the campaign.
+ :type guidance: str, optional
+
+ :param key: The unique key for the campaign.
+ :type key: str, optional
+
+ :param name: The name of the campaign.
+ :type name: str
+
+ :param owner_id: The UUID of the campaign owner.
+ :type owner_id: str
+
+ :param rule_ids: Array of rule IDs associated with this campaign.
+ :type rule_ids: [str]
+
+ :param start_date: The start date of the campaign.
+ :type start_date: datetime
+
+ :param status: The status of the campaign.
+ :type status: str
+ """
+ if description is not unset:
+ kwargs["description"] = description
+ if due_date is not unset:
+ kwargs["due_date"] = due_date
+ if entity_scope is not unset:
+ kwargs["entity_scope"] = entity_scope
+ if guidance is not unset:
+ kwargs["guidance"] = guidance
+ if key is not unset:
+ kwargs["key"] = key
+ super().__init__(kwargs)
+
+ self_.name = name
+ self_.owner_id = owner_id
+ self_.rule_ids = rule_ids
+ self_.start_date = start_date
+ self_.status = status
diff --git a/src/datadog_api_client/v2/model/update_campaign_request_data.py b/src/datadog_api_client/v2/model/update_campaign_request_data.py
new file mode 100644
index 0000000000..3e0178451d
--- /dev/null
+++ b/src/datadog_api_client/v2/model/update_campaign_request_data.py
@@ -0,0 +1,48 @@
+# 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.
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+from datadog_api_client.model_utils import (
+ ModelNormal,
+ cached_property,
+)
+
+
+if TYPE_CHECKING:
+ from datadog_api_client.v2.model.update_campaign_request_attributes import UpdateCampaignRequestAttributes
+ from datadog_api_client.v2.model.campaign_type import CampaignType
+
+
+class UpdateCampaignRequestData(ModelNormal):
+ @cached_property
+ def openapi_types(_):
+ from datadog_api_client.v2.model.update_campaign_request_attributes import UpdateCampaignRequestAttributes
+ from datadog_api_client.v2.model.campaign_type import CampaignType
+
+ return {
+ "attributes": (UpdateCampaignRequestAttributes,),
+ "type": (CampaignType,),
+ }
+
+ attribute_map = {
+ "attributes": "attributes",
+ "type": "type",
+ }
+
+ def __init__(self_, attributes: UpdateCampaignRequestAttributes, type: CampaignType, **kwargs):
+ """
+ Data for updating a campaign.
+
+ :param attributes: Attributes for updating a campaign.
+ :type attributes: UpdateCampaignRequestAttributes
+
+ :param type: The JSON:API type for campaigns.
+ :type type: CampaignType
+ """
+ super().__init__(kwargs)
+
+ self_.attributes = attributes
+ self_.type = type
diff --git a/src/datadog_api_client/v2/model/update_rule_request_data.py b/src/datadog_api_client/v2/model/update_rule_request_data.py
index e9e86576b0..3f6cb93ad8 100644
--- a/src/datadog_api_client/v2/model/update_rule_request_data.py
+++ b/src/datadog_api_client/v2/model/update_rule_request_data.py
@@ -3,29 +3,27 @@
# Copyright 2019-Present Datadog, Inc.
from __future__ import annotations
-from typing import Union, TYPE_CHECKING
+from typing import TYPE_CHECKING
from datadog_api_client.model_utils import (
ModelNormal,
cached_property,
- unset,
- UnsetType,
)
if TYPE_CHECKING:
- from datadog_api_client.v2.model.rule_attributes import RuleAttributes
+ from datadog_api_client.v2.model.rule_attributes_request import RuleAttributesRequest
from datadog_api_client.v2.model.rule_type import RuleType
class UpdateRuleRequestData(ModelNormal):
@cached_property
def openapi_types(_):
- from datadog_api_client.v2.model.rule_attributes import RuleAttributes
+ from datadog_api_client.v2.model.rule_attributes_request import RuleAttributesRequest
from datadog_api_client.v2.model.rule_type import RuleType
return {
- "attributes": (RuleAttributes,),
+ "attributes": (RuleAttributesRequest,),
"type": (RuleType,),
}
@@ -34,20 +32,17 @@ def openapi_types(_):
"type": "type",
}
- def __init__(
- self_, attributes: Union[RuleAttributes, UnsetType] = unset, type: Union[RuleType, UnsetType] = unset, **kwargs
- ):
+ def __init__(self_, attributes: RuleAttributesRequest, type: RuleType, **kwargs):
"""
Data for the request to update a scorecard rule.
- :param attributes: Details of a rule.
- :type attributes: RuleAttributes, optional
+ :param attributes: Attributes for creating or updating a rule. Server-managed fields (created_at, modified_at, custom) are excluded.
+ :type attributes: RuleAttributesRequest
:param type: The JSON:API type for scorecard rules.
- :type type: RuleType, optional
+ :type type: RuleType
"""
- if attributes is not unset:
- kwargs["attributes"] = attributes
- if type is not unset:
- kwargs["type"] = type
super().__init__(kwargs)
+
+ self_.attributes = attributes
+ self_.type = type
diff --git a/src/datadog_api_client/v2/models/__init__.py b/src/datadog_api_client/v2/models/__init__.py
index 93bc532cfa..66fc4d0dfe 100644
--- a/src/datadog_api_client/v2/models/__init__.py
+++ b/src/datadog_api_client/v2/models/__init__.py
@@ -700,6 +700,11 @@
from datadog_api_client.v2.model.csm_agents_type import CSMAgentsType
from datadog_api_client.v2.model.cvss import CVSS
from datadog_api_client.v2.model.calculated_field import CalculatedField
+from datadog_api_client.v2.model.campaign_response import CampaignResponse
+from datadog_api_client.v2.model.campaign_response_attributes import CampaignResponseAttributes
+from datadog_api_client.v2.model.campaign_response_data import CampaignResponseData
+from datadog_api_client.v2.model.campaign_status import CampaignStatus
+from datadog_api_client.v2.model.campaign_type import CampaignType
from datadog_api_client.v2.model.cancel_data_deletion_response_body import CancelDataDeletionResponseBody
from datadog_api_client.v2.model.case import Case
from datadog_api_client.v2.model.case3rd_party_ticket_status import Case3rdPartyTicketStatus
@@ -1132,6 +1137,9 @@
from datadog_api_client.v2.model.create_attachment_request_data_attributes_attachment import (
CreateAttachmentRequestDataAttributesAttachment,
)
+from datadog_api_client.v2.model.create_campaign_request import CreateCampaignRequest
+from datadog_api_client.v2.model.create_campaign_request_attributes import CreateCampaignRequestAttributes
+from datadog_api_client.v2.model.create_campaign_request_data import CreateCampaignRequestData
from datadog_api_client.v2.model.create_case_request_array import CreateCaseRequestArray
from datadog_api_client.v2.model.create_case_request_data import CreateCaseRequestData
from datadog_api_client.v2.model.create_case_request_data_attributes import CreateCaseRequestDataAttributes
@@ -2981,6 +2989,7 @@
from datadog_api_client.v2.model.list_apps_response_meta import ListAppsResponseMeta
from datadog_api_client.v2.model.list_apps_response_meta_page import ListAppsResponseMetaPage
from datadog_api_client.v2.model.list_assets_sbo_ms_response import ListAssetsSBOMsResponse
+from datadog_api_client.v2.model.list_campaigns_response import ListCampaignsResponse
from datadog_api_client.v2.model.list_connections_response import ListConnectionsResponse
from datadog_api_client.v2.model.list_connections_response_data import ListConnectionsResponseData
from datadog_api_client.v2.model.list_connections_response_data_attributes import ListConnectionsResponseDataAttributes
@@ -3020,6 +3029,7 @@
from datadog_api_client.v2.model.list_rules_response import ListRulesResponse
from datadog_api_client.v2.model.list_rules_response_data_item import ListRulesResponseDataItem
from datadog_api_client.v2.model.list_rules_response_links import ListRulesResponseLinks
+from datadog_api_client.v2.model.list_scorecards_response import ListScorecardsResponse
from datadog_api_client.v2.model.list_security_findings_response import ListSecurityFindingsResponse
from datadog_api_client.v2.model.list_tags_response import ListTagsResponse
from datadog_api_client.v2.model.list_tags_response_data import ListTagsResponseData
@@ -4343,6 +4353,7 @@
from datadog_api_client.v2.model.output_schema_parameters import OutputSchemaParameters
from datadog_api_client.v2.model.output_schema_parameters_type import OutputSchemaParametersType
from datadog_api_client.v2.model.page_urgency import PageUrgency
+from datadog_api_client.v2.model.paginated_response_meta import PaginatedResponseMeta
from datadog_api_client.v2.model.pagination import Pagination
from datadog_api_client.v2.model.pagination_meta import PaginationMeta
from datadog_api_client.v2.model.pagination_meta_page import PaginationMetaPage
@@ -4866,6 +4877,7 @@
)
from datadog_api_client.v2.model.routing_rule_type import RoutingRuleType
from datadog_api_client.v2.model.rule_attributes import RuleAttributes
+from datadog_api_client.v2.model.rule_attributes_request import RuleAttributesRequest
from datadog_api_client.v2.model.rule_outcome_relationships import RuleOutcomeRelationships
from datadog_api_client.v2.model.rule_severity import RuleSeverity
from datadog_api_client.v2.model.rule_type import RuleType
@@ -5081,6 +5093,9 @@
from datadog_api_client.v2.model.schedule_user import ScheduleUser
from datadog_api_client.v2.model.schedule_user_attributes import ScheduleUserAttributes
from datadog_api_client.v2.model.schedule_user_type import ScheduleUserType
+from datadog_api_client.v2.model.scorecard_list_response_attributes import ScorecardListResponseAttributes
+from datadog_api_client.v2.model.scorecard_list_response_data import ScorecardListResponseData
+from datadog_api_client.v2.model.scorecard_list_type import ScorecardListType
from datadog_api_client.v2.model.scorecard_type import ScorecardType
from datadog_api_client.v2.model.search_issues_include_query_parameter_item import SearchIssuesIncludeQueryParameterItem
from datadog_api_client.v2.model.seat_assignments_data_type import SeatAssignmentsDataType
@@ -6260,6 +6275,9 @@
from datadog_api_client.v2.model.update_apps_datastore_request_data_attributes import (
UpdateAppsDatastoreRequestDataAttributes,
)
+from datadog_api_client.v2.model.update_campaign_request import UpdateCampaignRequest
+from datadog_api_client.v2.model.update_campaign_request_attributes import UpdateCampaignRequestAttributes
+from datadog_api_client.v2.model.update_campaign_request_data import UpdateCampaignRequestData
from datadog_api_client.v2.model.update_connection_request import UpdateConnectionRequest
from datadog_api_client.v2.model.update_connection_request_data import UpdateConnectionRequestData
from datadog_api_client.v2.model.update_connection_request_data_attributes import UpdateConnectionRequestDataAttributes
@@ -7032,6 +7050,11 @@
"CSMAgentsType",
"CVSS",
"CalculatedField",
+ "CampaignResponse",
+ "CampaignResponseAttributes",
+ "CampaignResponseData",
+ "CampaignStatus",
+ "CampaignType",
"CancelDataDeletionResponseBody",
"Case",
"Case3rdPartyTicketStatus",
@@ -7366,6 +7389,9 @@
"CreateAttachmentRequestData",
"CreateAttachmentRequestDataAttributes",
"CreateAttachmentRequestDataAttributesAttachment",
+ "CreateCampaignRequest",
+ "CreateCampaignRequestAttributes",
+ "CreateCampaignRequestData",
"CreateCaseRequestArray",
"CreateCaseRequestData",
"CreateCaseRequestDataAttributes",
@@ -8763,6 +8789,7 @@
"ListAppsResponseMeta",
"ListAppsResponseMetaPage",
"ListAssetsSBOMsResponse",
+ "ListCampaignsResponse",
"ListConnectionsResponse",
"ListConnectionsResponseData",
"ListConnectionsResponseDataAttributes",
@@ -8796,6 +8823,7 @@
"ListRulesResponse",
"ListRulesResponseDataItem",
"ListRulesResponseLinks",
+ "ListScorecardsResponse",
"ListSecurityFindingsResponse",
"ListTagsResponse",
"ListTagsResponseData",
@@ -9521,6 +9549,7 @@
"OutputSchemaParameters",
"OutputSchemaParametersType",
"PageUrgency",
+ "PaginatedResponseMeta",
"Pagination",
"PaginationMeta",
"PaginationMetaPage",
@@ -9940,6 +9969,7 @@
"RoutingRuleRelationshipsPolicyDataType",
"RoutingRuleType",
"RuleAttributes",
+ "RuleAttributesRequest",
"RuleOutcomeRelationships",
"RuleSeverity",
"RuleType",
@@ -10109,6 +10139,9 @@
"ScheduleUser",
"ScheduleUserAttributes",
"ScheduleUserType",
+ "ScorecardListResponseAttributes",
+ "ScorecardListResponseData",
+ "ScorecardListType",
"ScorecardType",
"SearchIssuesIncludeQueryParameterItem",
"SeatAssignmentsDataType",
@@ -10920,6 +10953,9 @@
"UpdateAppsDatastoreRequest",
"UpdateAppsDatastoreRequestData",
"UpdateAppsDatastoreRequestDataAttributes",
+ "UpdateCampaignRequest",
+ "UpdateCampaignRequestAttributes",
+ "UpdateCampaignRequestData",
"UpdateConnectionRequest",
"UpdateConnectionRequestData",
"UpdateConnectionRequestDataAttributes",
diff --git a/tests/v2/cassettes/test_scenarios/test_patch_a_signalbased_notification_rule_returns_bad_request_response.frozen b/tests/v2/cassettes/test_scenarios/test_patch_a_signalbased_notification_rule_returns_bad_request_response.frozen
index 3ba9d1b93a..a6c6d5ef9b 100644
--- a/tests/v2/cassettes/test_scenarios/test_patch_a_signalbased_notification_rule_returns_bad_request_response.frozen
+++ b/tests/v2/cassettes/test_scenarios/test_patch_a_signalbased_notification_rule_returns_bad_request_response.frozen
@@ -1 +1 @@
-2025-02-05T13:46:11.165Z
\ No newline at end of file
+2026-03-13T09:35:04.822Z
\ No newline at end of file
diff --git a/tests/v2/cassettes/test_scenarios/test_patch_a_signalbased_notification_rule_returns_bad_request_response.yaml b/tests/v2/cassettes/test_scenarios/test_patch_a_signalbased_notification_rule_returns_bad_request_response.yaml
index 1dc91880c6..9699ccc95c 100644
--- a/tests/v2/cassettes/test_scenarios/test_patch_a_signalbased_notification_rule_returns_bad_request_response.yaml
+++ b/tests/v2/cassettes/test_scenarios/test_patch_a_signalbased_notification_rule_returns_bad_request_response.yaml
@@ -1,6 +1,6 @@
interactions:
- request:
- body: '{"data":{"attributes":{"enabled":true,"name":"Test-Patch_a_signal_based_notification_rule_returns_Bad_Request_response-1738763171","selectors":{"query":"env:test","rule_types":["signal_correlation"],"severities":["critical"],"trigger_source":"security_signals"},"targets":["@email@email.com"]},"type":"notification_rules"}}'
+ body: '{"data":{"attributes":{"enabled":true,"name":"Test-Patch_a_signal_based_notification_rule_returns_Bad_Request_response-1773394504","selectors":{"query":"env:test","rule_types":["signal_correlation"],"severities":["critical"],"trigger_source":"security_signals"},"targets":["@email@email.com"]},"type":"notification_rules"}}'
headers:
accept:
- application/json
@@ -10,7 +10,9 @@ interactions:
uri: https://api.datadoghq.com/api/v2/security/signals/notification_rules
response:
body:
- string: '{"data":{"id":"uwx-6n1-x2z","type":"notification_rules","attributes":{"created_at":1738763171531,"created_by":{"name":"","handle":""},"enabled":true,"modified_at":1738763171531,"modified_by":{"name":"","handle":""},"name":"Test-Patch_a_signal_based_notification_rule_returns_Bad_Request_response-1738763171","selectors":{"severities":["critical"],"rule_types":["signal_correlation"],"query":"env:test","trigger_source":"security_signals"},"targets":["@email@email.com"],"time_aggregation":0,"version":1}}}'
+ string: '{"data":{"id":"sa8-rjy-zkl","type":"notification_rules","attributes":{"created_at":1773394506389,"created_by":{"name":"CI
+ Account","handle":"9919ec9b-ebc7-49ee-8dc8-03626e717cca"},"enabled":true,"modified_at":1773394506389,"modified_by":{"name":"CI
+ Account","handle":"9919ec9b-ebc7-49ee-8dc8-03626e717cca"},"name":"Test-Patch_a_signal_based_notification_rule_returns_Bad_Request_response-1773394504","selectors":{"severities":["critical"],"rule_types":["signal_correlation"],"query":"env:test","trigger_source":"security_signals"},"targets":["@email@email.com"],"time_aggregation":0,"version":1}}}'
headers:
content-type:
- application/vnd.api+json
@@ -26,7 +28,7 @@ interactions:
content-type:
- application/json
method: PATCH
- uri: https://api.datadoghq.com/api/v2/security/signals/notification_rules/uwx-6n1-x2z
+ uri: https://api.datadoghq.com/api/v2/security/signals/notification_rules/sa8-rjy-zkl
response:
body:
string: '{"errors":["input_validation_error(Field ''data.attributes.version''
@@ -44,7 +46,7 @@ interactions:
accept:
- '*/*'
method: DELETE
- uri: https://api.datadoghq.com/api/v2/security/signals/notification_rules/uwx-6n1-x2z
+ uri: https://api.datadoghq.com/api/v2/security/signals/notification_rules/sa8-rjy-zkl
response:
body:
string: ''
diff --git a/tests/v2/features/given.json b/tests/v2/features/given.json
index 76980d4ce3..81345b8e4b 100644
--- a/tests/v2/features/given.json
+++ b/tests/v2/features/given.json
@@ -1030,7 +1030,7 @@
],
"step": "there is a valid \"create_scorecard_rule\" in the system",
"key": "create_scorecard_rule",
- "tag": "Service Scorecards",
+ "tag": "Scorecards",
"operationId": "CreateScorecardRule"
},
{
diff --git a/tests/v2/features/scorecards.feature b/tests/v2/features/scorecards.feature
new file mode 100644
index 0000000000..48c99e9b22
--- /dev/null
+++ b/tests/v2/features/scorecards.feature
@@ -0,0 +1,232 @@
+@endpoint(scorecards) @endpoint(scorecards-v2)
+Feature: Scorecards
+ API to create and update scorecard rules and outcomes. See
+ [Scorecards](https://docs.datadoghq.com/service_catalog/scorecards) for
+ more information.
+
+ Background:
+ Given a valid "apiKeyAuth" key in the system
+ And a valid "appKeyAuth" key in the system
+ And an instance of "Scorecards" API
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Create a new campaign returns "Bad Request" response
+ Given new "CreateScorecardCampaign" request
+ And body with value {"data": {"attributes": {"description": "Campaign to improve security posture for Q1 2024.", "due_date": "2024-03-31T23:59:59Z", "entity_scope": "kind:service AND team:platform", "guidance": "Please ensure all services pass the security requirements.", "key": "q1-security-2024", "name": "Q1 Security Campaign", "owner_id": "550e8400-e29b-41d4-a716-446655440000", "rule_ids": ["q8MQxk8TCqrHnWkx", "r9NRyl9UDrsIoXly"], "start_date": "2024-01-01T00:00:00Z", "status": "in_progress"}, "type": "campaign"}}
+ When the request is sent
+ Then the response status is 400 Bad Request
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Create a new campaign returns "Created" response
+ Given new "CreateScorecardCampaign" request
+ And body with value {"data": {"attributes": {"description": "Campaign to improve security posture for Q1 2024.", "due_date": "2024-03-31T23:59:59Z", "entity_scope": "kind:service AND team:platform", "guidance": "Please ensure all services pass the security requirements.", "key": "q1-security-2024", "name": "Q1 Security Campaign", "owner_id": "550e8400-e29b-41d4-a716-446655440000", "rule_ids": ["q8MQxk8TCqrHnWkx", "r9NRyl9UDrsIoXly"], "start_date": "2024-01-01T00:00:00Z", "status": "in_progress"}, "type": "campaign"}}
+ When the request is sent
+ Then the response status is 201 Created
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Create a new rule returns "Bad Request" response
+ Given new "CreateScorecardRule" request
+ And body with value {"data": {"attributes": {"enabled": true, "level": 2, "name": "Team Defined", "scope_query": "kind:service", "scorecard_name": "Deployments automated via Deployment Trains"}, "type": "rule"}}
+ When the request is sent
+ Then the response status is 400 Bad Request
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Create a new rule returns "Created" response
+ Given new "CreateScorecardRule" request
+ And body with value {"data": {"attributes": {"enabled": true, "level": 2, "name": "Team Defined", "scope_query": "kind:service", "scorecard_name": "Deployments automated via Deployment Trains"}, "type": "rule"}}
+ When the request is sent
+ Then the response status is 201 Created
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Create outcomes batch returns "Bad Request" response
+ Given operation "CreateScorecardOutcomesBatch" enabled
+ And new "CreateScorecardOutcomesBatch" request
+ And body with value {"data": {"attributes": {"results": [{"remarks": "See: Services", "rule_id": "q8MQxk8TCqrHnWkx", "service_name": "my-service", "state": "pass"}]}, "type": "batched-outcome"}}
+ When the request is sent
+ Then the response status is 400 Bad Request
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Create outcomes batch returns "OK" response
+ Given operation "CreateScorecardOutcomesBatch" enabled
+ And new "CreateScorecardOutcomesBatch" request
+ And body with value {"data": {"attributes": {"results": [{"remarks": "See: Services", "rule_id": "q8MQxk8TCqrHnWkx", "service_name": "my-service", "state": "pass"}]}, "type": "batched-outcome"}}
+ When the request is sent
+ Then the response status is 200 OK
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Delete a campaign returns "Bad Request" response
+ Given new "DeleteScorecardCampaign" request
+ And request contains "campaign_id" parameter from "REPLACE.ME"
+ When the request is sent
+ Then the response status is 400 Bad Request
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Delete a campaign returns "No Content" response
+ Given new "DeleteScorecardCampaign" request
+ And request contains "campaign_id" parameter from "REPLACE.ME"
+ When the request is sent
+ Then the response status is 204 No Content
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Delete a campaign returns "Not Found" response
+ Given new "DeleteScorecardCampaign" request
+ And request contains "campaign_id" parameter from "REPLACE.ME"
+ When the request is sent
+ Then the response status is 404 Not Found
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Delete a rule returns "Bad Request" response
+ Given new "DeleteScorecardRule" request
+ And request contains "rule_id" parameter from "REPLACE.ME"
+ When the request is sent
+ Then the response status is 400 Bad Request
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Delete a rule returns "Not Found" response
+ Given new "DeleteScorecardRule" request
+ And request contains "rule_id" parameter from "REPLACE.ME"
+ When the request is sent
+ Then the response status is 404 Not Found
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Delete a rule returns "OK" response
+ Given new "DeleteScorecardRule" request
+ And request contains "rule_id" parameter from "REPLACE.ME"
+ When the request is sent
+ Then the response status is 204 OK
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Get a campaign returns "Bad Request" response
+ Given new "GetScorecardCampaign" request
+ And request contains "campaign_id" parameter from "REPLACE.ME"
+ When the request is sent
+ Then the response status is 400 Bad Request
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Get a campaign returns "Not Found" response
+ Given new "GetScorecardCampaign" request
+ And request contains "campaign_id" parameter from "REPLACE.ME"
+ When the request is sent
+ Then the response status is 404 Not Found
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Get a campaign returns "OK" response
+ Given new "GetScorecardCampaign" request
+ And request contains "campaign_id" parameter from "REPLACE.ME"
+ When the request is sent
+ Then the response status is 200 OK
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: List all campaigns returns "Bad Request" response
+ Given new "ListScorecardCampaigns" request
+ When the request is sent
+ Then the response status is 400 Bad Request
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: List all campaigns returns "OK" response
+ Given new "ListScorecardCampaigns" request
+ When the request is sent
+ Then the response status is 200 OK
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: List all rule outcomes returns "Bad Request" response
+ Given new "ListScorecardOutcomes" request
+ When the request is sent
+ Then the response status is 400 Bad Request
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: List all rule outcomes returns "OK" response
+ Given new "ListScorecardOutcomes" request
+ When the request is sent
+ Then the response status is 200 OK
+
+ @generated @skip @team:DataDog/service-catalog @with-pagination
+ Scenario: List all rule outcomes returns "OK" response with pagination
+ Given new "ListScorecardOutcomes" request
+ When the request with pagination is sent
+ Then the response status is 200 OK
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: List all rules returns "Bad Request" response
+ Given new "ListScorecardRules" request
+ When the request is sent
+ Then the response status is 400 Bad Request
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: List all rules returns "OK" response
+ Given new "ListScorecardRules" request
+ When the request is sent
+ Then the response status is 200 OK
+
+ @generated @skip @team:DataDog/service-catalog @with-pagination
+ Scenario: List all rules returns "OK" response with pagination
+ Given new "ListScorecardRules" request
+ When the request with pagination is sent
+ Then the response status is 200 OK
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: List all scorecards returns "OK" response
+ Given new "ListScorecards" request
+ When the request is sent
+ Then the response status is 200 OK
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Update Scorecard outcomes returns "Accepted" response
+ Given new "UpdateScorecardOutcomes" request
+ And body with value {"data": {"attributes": {"results": [{"entity_reference": "service:my-service", "remarks": "See: Services", "rule_id": "q8MQxk8TCqrHnWkx", "state": "pass"}]}, "type": "batched-outcome"}}
+ When the request is sent
+ Then the response status is 202 Accepted
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Update Scorecard outcomes returns "Bad Request" response
+ Given new "UpdateScorecardOutcomes" request
+ And body with value {"data": {"attributes": {"results": [{"entity_reference": "service:my-service", "remarks": "See: Services", "rule_id": "q8MQxk8TCqrHnWkx", "state": "pass"}]}, "type": "batched-outcome"}}
+ When the request is sent
+ Then the response status is 400 Bad Request
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Update Scorecard outcomes returns "Conflict" response
+ Given new "UpdateScorecardOutcomes" request
+ And body with value {"data": {"attributes": {"results": [{"entity_reference": "service:my-service", "remarks": "See: Services", "rule_id": "q8MQxk8TCqrHnWkx", "state": "pass"}]}, "type": "batched-outcome"}}
+ When the request is sent
+ Then the response status is 409 Conflict
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Update a campaign returns "Bad Request" response
+ Given new "UpdateScorecardCampaign" request
+ And request contains "campaign_id" parameter from "REPLACE.ME"
+ And body with value {"data": {"attributes": {"description": "Campaign to improve security posture for Q1 2024.", "due_date": "2024-03-31T23:59:59Z", "entity_scope": "kind:service AND team:platform", "guidance": "Please ensure all services pass the security requirements.", "key": "q1-security-2024", "name": "Q1 Security Campaign", "owner_id": "550e8400-e29b-41d4-a716-446655440000", "rule_ids": ["q8MQxk8TCqrHnWkx", "r9NRyl9UDrsIoXly"], "start_date": "2024-01-01T00:00:00Z", "status": "in_progress"}, "type": "campaign"}}
+ When the request is sent
+ Then the response status is 400 Bad Request
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Update a campaign returns "Not Found" response
+ Given new "UpdateScorecardCampaign" request
+ And request contains "campaign_id" parameter from "REPLACE.ME"
+ And body with value {"data": {"attributes": {"description": "Campaign to improve security posture for Q1 2024.", "due_date": "2024-03-31T23:59:59Z", "entity_scope": "kind:service AND team:platform", "guidance": "Please ensure all services pass the security requirements.", "key": "q1-security-2024", "name": "Q1 Security Campaign", "owner_id": "550e8400-e29b-41d4-a716-446655440000", "rule_ids": ["q8MQxk8TCqrHnWkx", "r9NRyl9UDrsIoXly"], "start_date": "2024-01-01T00:00:00Z", "status": "in_progress"}, "type": "campaign"}}
+ When the request is sent
+ Then the response status is 404 Not Found
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Update a campaign returns "OK" response
+ Given new "UpdateScorecardCampaign" request
+ And request contains "campaign_id" parameter from "REPLACE.ME"
+ And body with value {"data": {"attributes": {"description": "Campaign to improve security posture for Q1 2024.", "due_date": "2024-03-31T23:59:59Z", "entity_scope": "kind:service AND team:platform", "guidance": "Please ensure all services pass the security requirements.", "key": "q1-security-2024", "name": "Q1 Security Campaign", "owner_id": "550e8400-e29b-41d4-a716-446655440000", "rule_ids": ["q8MQxk8TCqrHnWkx", "r9NRyl9UDrsIoXly"], "start_date": "2024-01-01T00:00:00Z", "status": "in_progress"}, "type": "campaign"}}
+ When the request is sent
+ Then the response status is 200 OK
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Update an existing scorecard rule returns "Bad Request" response
+ Given new "UpdateScorecardRule" request
+ And request contains "rule_id" parameter from "REPLACE.ME"
+ And body with value {"data": {"attributes": {"enabled": true, "level": 2, "name": "Team Defined", "scope_query": "kind:service", "scorecard_name": "Deployments automated via Deployment Trains"}, "type": "rule"}}
+ When the request is sent
+ Then the response status is 400 Bad Request
+
+ @generated @skip @team:DataDog/service-catalog
+ Scenario: Update an existing scorecard rule returns "Rule updated successfully" response
+ Given new "UpdateScorecardRule" request
+ And request contains "rule_id" parameter from "REPLACE.ME"
+ And body with value {"data": {"attributes": {"enabled": true, "level": 2, "name": "Team Defined", "scope_query": "kind:service", "scorecard_name": "Deployments automated via Deployment Trains"}, "type": "rule"}}
+ When the request is sent
+ Then the response status is 200 Rule updated successfully
diff --git a/tests/v2/features/service_scorecards.feature b/tests/v2/features/service_scorecards.feature
deleted file mode 100644
index 387f04cf71..0000000000
--- a/tests/v2/features/service_scorecards.feature
+++ /dev/null
@@ -1,189 +0,0 @@
-@endpoint(service-scorecards) @endpoint(service-scorecards-v2)
-Feature: Service Scorecards
- API to create and update scorecard rules and outcomes. See [Service
- Scorecards](https://docs.datadoghq.com/service_catalog/scorecards) for
- more information. This feature is currently in BETA. If you have any
- feedback, contact [Datadog support](https://docs.datadoghq.com/help/).
-
- Background:
- Given a valid "apiKeyAuth" key in the system
- And a valid "appKeyAuth" key in the system
- And an instance of "ServiceScorecards" API
-
- @team:DataDog/service-catalog
- Scenario: Create a new rule returns "Bad Request" response
- Given operation "CreateScorecardRule" enabled
- And new "CreateScorecardRule" request
- And body with value {"data": {"attributes": {"enabled": true, "level": 2, "name": "Team Defined", "scorecard_id": "NOT.FOUND"}, "type": "rule"}}
- When the request is sent
- Then the response status is 400 Bad Request
-
- @team:DataDog/service-catalog
- Scenario: Create a new rule returns "Created" response
- Given operation "CreateScorecardRule" enabled
- And new "CreateScorecardRule" request
- And body with value {"data": {"attributes": {"enabled": true, "name": "{{unique}}", "scorecard_name": "Observability Best Practices"}, "type": "rule"}}
- When the request is sent
- Then the response status is 201 Created
- And the response "data.attributes.scorecard_name" is equal to "Observability Best Practices"
- And the response "data.relationships.scorecard.data" has field "id"
-
- @team:DataDog/service-catalog
- Scenario: Create outcomes batch returns "Bad Request" response
- Given there is a valid "create_scorecard_rule" in the system
- And operation "CreateScorecardOutcomesBatch" enabled
- And new "CreateScorecardOutcomesBatch" request
- And body with value {"data": {"attributes": {"results": [{"remarks": "See: Services", "rule_id": "{{ create_scorecard_rule.data.id }}", "state": "pass", "service_name": ""}]}, "type": "batched-outcome"}}
- When the request is sent
- Then the response status is 400 Bad Request
-
- @team:DataDog/service-catalog
- Scenario: Create outcomes batch returns "OK" response
- Given there is a valid "create_scorecard_rule" in the system
- And operation "CreateScorecardOutcomesBatch" enabled
- And new "CreateScorecardOutcomesBatch" request
- And body with value {"data": {"attributes": {"results": [{"remarks": "See: Services", "rule_id": "{{ create_scorecard_rule.data.id }}", "service_name": "my-service", "state": "pass"}]}, "type": "batched-outcome"}}
- When the request is sent
- Then the response status is 200 OK
-
- @generated @skip @team:DataDog/service-catalog
- Scenario: Delete a rule returns "Bad Request" response
- Given operation "DeleteScorecardRule" enabled
- And new "DeleteScorecardRule" request
- And request contains "rule_id" parameter from "REPLACE.ME"
- When the request is sent
- Then the response status is 400 Bad Request
-
- @team:DataDog/service-catalog
- Scenario: Delete a rule returns "Not Found" response
- Given operation "DeleteScorecardRule" enabled
- And new "DeleteScorecardRule" request
- And request contains "rule_id" parameter with value "2a4f524e-168a-429d-bb75-7b1ffeab0cbb"
- When the request is sent
- Then the response status is 404 Not Found
-
- @team:DataDog/service-catalog
- Scenario: Delete a rule returns "OK" response
- Given operation "DeleteScorecardRule" enabled
- And there is a valid "create_scorecard_rule" in the system
- And new "DeleteScorecardRule" request
- And request contains "rule_id" parameter from "create_scorecard_rule.data.id"
- When the request is sent
- Then the response status is 204 OK
-
- @generated @skip @team:DataDog/service-catalog
- Scenario: List all rule outcomes returns "Bad Request" response
- Given operation "ListScorecardOutcomes" enabled
- And new "ListScorecardOutcomes" request
- When the request is sent
- Then the response status is 400 Bad Request
-
- @team:DataDog/service-catalog
- Scenario: List all rule outcomes returns "OK" response
- Given operation "ListScorecardOutcomes" enabled
- And new "ListScorecardOutcomes" request
- When the request is sent
- Then the response status is 200 OK
-
- @replay-only @skip-validation @team:DataDog/service-catalog @with-pagination
- Scenario: List all rule outcomes returns "OK" response with pagination
- Given operation "ListScorecardOutcomes" enabled
- And new "ListScorecardOutcomes" request
- And request contains "page[size]" parameter with value 2
- And request contains "fields[outcome]" parameter with value "state"
- And request contains "filter[outcome][service_name]" parameter with value "my-service"
- When the request with pagination is sent
- Then the response status is 200 OK
- And the response has 2 items
-
- @generated @skip @team:DataDog/service-catalog
- Scenario: List all rules returns "Bad Request" response
- Given operation "ListScorecardRules" enabled
- And new "ListScorecardRules" request
- When the request is sent
- Then the response status is 400 Bad Request
-
- @team:DataDog/service-catalog
- Scenario: List all rules returns "OK" response
- Given operation "ListScorecardRules" enabled
- And new "ListScorecardRules" request
- When the request is sent
- Then the response status is 200 OK
-
- @replay-only @skip-validation @team:DataDog/service-catalog @with-pagination
- Scenario: List all rules returns "OK" response with pagination
- Given operation "ListScorecardRules" enabled
- And new "ListScorecardRules" request
- And request contains "page[size]" parameter with value 2
- And request contains "fields[rule]" parameter with value "name"
- And request contains "filter[rule][custom]" parameter with value true
- When the request with pagination is sent
- Then the response status is 200 OK
- And the response has 4 items
-
- @team:DataDog/service-catalog
- Scenario: Update Scorecard outcomes asynchronously returns "Accepted" response
- Given operation "UpdateScorecardOutcomesAsync" enabled
- And there is a valid "create_scorecard_rule" in the system
- And new "UpdateScorecardOutcomesAsync" request
- And body with value {"data": {"attributes": {"results": [{"rule_id": "{{create_scorecard_rule.data.id}}", "entity_reference": "service:my-service", "remarks": "See: Services", "state": "pass"}]}, "type": "batched-outcome"}}
- When the request is sent
- Then the response status is 202 Accepted
-
- @team:DataDog/service-catalog
- Scenario: Update Scorecard outcomes asynchronously returns "Bad Request" response
- Given operation "UpdateScorecardOutcomesAsync" enabled
- And there is a valid "create_scorecard_rule" in the system
- And new "UpdateScorecardOutcomesAsync" request
- And body with value {"data": {"attributes": {"results": [{"rule_id": "{{create_scorecard_rule.data.id}}", "entity_reference": "service:my-service", "state": "INVALID"}]}, "type": "batched-outcome"}}
- When the request is sent
- Then the response status is 400 Bad Request
- And the response "errors" has length 1
- And the response "errors[0]" has field "detail"
-
- @team:DataDog/service-catalog
- Scenario: Update Scorecard outcomes asynchronously returns "Conflict" response
- Given operation "UpdateScorecardOutcomesAsync" enabled
- And new "UpdateScorecardOutcomesAsync" request
- And body with value {"data": {"attributes": {"results": [{"rule_id": "INVALID.RULE_ID", "entity_reference": "service:my-service", "remarks": "See: Services", "state": "pass"}]}, "type": "batched-outcome"}}
- When the request is sent
- Then the response status is 409 Conflict
- And the response "errors" has length 1
-
- @generated @skip @team:DataDog/service-catalog
- Scenario: Update an existing rule returns "Bad Request" response
- Given operation "UpdateScorecardRule" enabled
- And new "UpdateScorecardRule" request
- And request contains "rule_id" parameter from "REPLACE.ME"
- And body with value {"data": {"attributes": {"enabled": true, "level": 2, "name": "Team Defined", "scorecard_name": "Deployments automated via Deployment Trains"}, "type": "rule"}}
- When the request is sent
- Then the response status is 400 Bad Request
-
- @team:DataDog/service-catalog
- Scenario: Update an existing rule returns "Rule updated successfully" response
- Given operation "UpdateScorecardRule" enabled
- And there is a valid "create_scorecard_rule" in the system
- And new "UpdateScorecardRule" request
- And request contains "rule_id" parameter from "create_scorecard_rule.data.id"
- And body with value {"data": { "attributes" : {"enabled": true, "name": "{{create_scorecard_rule.data.attributes.name}}", "scorecard_name": "{{create_scorecard_rule.data.attributes.scorecard_name}}", "description": "Updated description via test"}}}
- When the request is sent
- Then the response status is 200 Rule updated successfully
-
- @team:DataDog/service-catalog
- Scenario: Update an existing scorecard rule returns "Bad Request" response
- Given operation "UpdateScorecardRule" enabled
- And there is a valid "create_scorecard_rule" in the system
- And new "UpdateScorecardRule" request
- And request contains "rule_id" parameter from "create_scorecard_rule.data.id"
- And body with value {"data": {"attributes": {"enabled": true, "level": 2, "name": "Team Defined", "scorecard_id": "NOT.FOUND"}, "type": "rule"}}
- When the request is sent
- Then the response status is 400 Bad Request
-
- @team:DataDog/service-catalog
- Scenario: Update an existing scorecard rule returns "Not Found" response
- Given operation "UpdateScorecardRule" enabled
- And new "UpdateScorecardRule" request
- And request contains "rule_id" parameter with value "REPLACE.ME"
- And body with value {"data": {"attributes": {"enabled": true, "level": 2, "name": "Team Defined", "scorecard_name": "Deployments automated via Deployment Trains"}, "type": "rule"}}
- When the request is sent
- Then the response status is 404 Not Found
diff --git a/tests/v2/features/undo.json b/tests/v2/features/undo.json
index a04c9b283b..adbd5d9d76 100644
--- a/tests/v2/features/undo.json
+++ b/tests/v2/features/undo.json
@@ -4560,32 +4560,62 @@
"type": "idempotent"
}
},
+ "ListScorecardCampaigns": {
+ "tag": "Scorecards",
+ "undo": {
+ "type": "safe"
+ }
+ },
+ "CreateScorecardCampaign": {
+ "tag": "Scorecards",
+ "undo": {
+ "type": "unsafe"
+ }
+ },
+ "DeleteScorecardCampaign": {
+ "tag": "Scorecards",
+ "undo": {
+ "type": "idempotent"
+ }
+ },
+ "GetScorecardCampaign": {
+ "tag": "Scorecards",
+ "undo": {
+ "type": "safe"
+ }
+ },
+ "UpdateScorecardCampaign": {
+ "tag": "Scorecards",
+ "undo": {
+ "type": "idempotent"
+ }
+ },
"ListScorecardOutcomes": {
- "tag": "Service Scorecards",
+ "tag": "Scorecards",
"undo": {
"type": "safe"
}
},
- "UpdateScorecardOutcomesAsync": {
- "tag": "Service Scorecards",
+ "UpdateScorecardOutcomes": {
+ "tag": "Scorecards",
"undo": {
"type": "idempotent"
}
},
"CreateScorecardOutcomesBatch": {
- "tag": "Service Scorecards",
+ "tag": "Scorecards",
"undo": {
"type": "idempotent"
}
},
"ListScorecardRules": {
- "tag": "Service Scorecards",
+ "tag": "Scorecards",
"undo": {
"type": "safe"
}
},
"CreateScorecardRule": {
- "tag": "Service Scorecards",
+ "tag": "Scorecards",
"undo": {
"operationId": "DeleteScorecardRule",
"parameters": [
@@ -4598,17 +4628,23 @@
}
},
"DeleteScorecardRule": {
- "tag": "Service Scorecards",
+ "tag": "Scorecards",
"undo": {
"type": "idempotent"
}
},
"UpdateScorecardRule": {
- "tag": "Service Scorecards",
+ "tag": "Scorecards",
"undo": {
"type": "idempotent"
}
},
+ "ListScorecards": {
+ "tag": "Scorecards",
+ "undo": {
+ "type": "safe"
+ }
+ },
"UnassignSeatsUser": {
"tag": "Seats",
"undo": {