Files
prefect-go/pkg/models/automations.go

248 lines
8.5 KiB
Go

package models
import (
"encoding/json"
"time"
"github.com/google/uuid"
)
// AutomationSort represents sort options for automations.
type AutomationSort string
const (
AutomationSortCreatedDesc AutomationSort = "CREATED_DESC"
AutomationSortUpdatedDesc AutomationSort = "UPDATED_DESC"
AutomationSortNameAsc AutomationSort = "NAME_ASC"
AutomationSortNameDesc AutomationSort = "NAME_DESC"
)
// TriggerPosture represents the posture of an event trigger.
type TriggerPosture string
const (
TriggerPostureReactive TriggerPosture = "Reactive"
TriggerPostureProactive TriggerPosture = "Proactive"
)
// ActionSource represents the source type for automation actions.
type ActionSource string
const (
ActionSourceSelected ActionSource = "selected"
ActionSourceInferred ActionSource = "inferred"
)
// ResourceSpecification represents resource labels to match.
type ResourceSpecification map[string]string
// Automation represents a Prefect automation.
type Automation struct {
ID uuid.UUID `json:"id"`
Created *time.Time `json:"created"`
Updated *time.Time `json:"updated"`
Name string `json:"name"`
Description string `json:"description"`
Enabled bool `json:"enabled"`
Tags []string `json:"tags,omitempty"`
Trigger json.RawMessage `json:"trigger"`
Actions []json.RawMessage `json:"actions"`
ActionsOnTrigger []json.RawMessage `json:"actions_on_trigger,omitempty"`
ActionsOnResolve []json.RawMessage `json:"actions_on_resolve,omitempty"`
}
// AutomationCreate represents the request to create an automation.
type AutomationCreate struct {
Name string `json:"name"`
Description string `json:"description,omitempty"`
Enabled *bool `json:"enabled,omitempty"`
Tags []string `json:"tags,omitempty"`
Trigger json.RawMessage `json:"trigger"`
Actions []json.RawMessage `json:"actions"`
ActionsOnTrigger []json.RawMessage `json:"actions_on_trigger,omitempty"`
ActionsOnResolve []json.RawMessage `json:"actions_on_resolve,omitempty"`
}
// AutomationUpdate represents the request to fully update an automation.
type AutomationUpdate struct {
Name string `json:"name"`
Description string `json:"description,omitempty"`
Enabled *bool `json:"enabled,omitempty"`
Tags []string `json:"tags,omitempty"`
Trigger json.RawMessage `json:"trigger"`
Actions []json.RawMessage `json:"actions"`
ActionsOnTrigger []json.RawMessage `json:"actions_on_trigger,omitempty"`
ActionsOnResolve []json.RawMessage `json:"actions_on_resolve,omitempty"`
}
// AutomationPartialUpdate represents the request to partially update an automation.
type AutomationPartialUpdate struct {
Enabled *bool `json:"enabled,omitempty"`
}
// AutomationFilter represents filter criteria for querying automations.
type AutomationFilter struct {
Name *string `json:"name,omitempty"`
Tags []string `json:"tags,omitempty"`
Offset int `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
}
// EventTrigger represents an event-based automation trigger.
type EventTrigger struct {
Type string `json:"type"`
ID uuid.UUID `json:"id"`
Match ResourceSpecification `json:"match,omitempty"`
MatchRelated json.RawMessage `json:"match_related,omitempty"`
After []string `json:"after,omitempty"`
Expect []string `json:"expect,omitempty"`
ForEach []string `json:"for_each,omitempty"`
Posture TriggerPosture `json:"posture"`
Threshold int `json:"threshold,omitempty"`
Within float64 `json:"within,omitempty"`
}
// CompoundTrigger represents a compound automation trigger.
type CompoundTrigger struct {
Type string `json:"type"`
ID uuid.UUID `json:"id"`
Triggers json.RawMessage `json:"triggers"`
Within *float64 `json:"within"`
Require json.RawMessage `json:"require"`
}
// SequenceTrigger represents a sequence automation trigger.
type SequenceTrigger struct {
Type string `json:"type"`
ID uuid.UUID `json:"id"`
Triggers json.RawMessage `json:"triggers"`
Within *float64 `json:"within"`
}
// DoNothing represents a no-op automation action.
type DoNothing struct {
Type string `json:"type"`
}
// RunDeployment represents an action to run a deployment.
type RunDeployment struct {
Type string `json:"type"`
Source ActionSource `json:"source,omitempty"`
DeploymentID *uuid.UUID `json:"deployment_id,omitempty"`
Parameters map[string]interface{} `json:"parameters,omitempty"`
JobVariables map[string]interface{} `json:"job_variables,omitempty"`
}
// PauseDeploymentAction represents an action to pause a deployment.
type PauseDeploymentAction struct {
Type string `json:"type"`
Source ActionSource `json:"source,omitempty"`
DeploymentID *uuid.UUID `json:"deployment_id,omitempty"`
}
// ResumeDeploymentAction represents an action to resume a deployment.
type ResumeDeploymentAction struct {
Type string `json:"type"`
Source ActionSource `json:"source,omitempty"`
DeploymentID *uuid.UUID `json:"deployment_id,omitempty"`
}
// CancelFlowRun represents an action to cancel a flow run.
type CancelFlowRun struct {
Type string `json:"type"`
}
// SuspendFlowRun represents an action to suspend a flow run.
type SuspendFlowRun struct {
Type string `json:"type"`
}
// ResumeFlowRunAction represents an action to resume a flow run.
type ResumeFlowRunAction struct {
Type string `json:"type"`
}
// ChangeFlowRunState represents an action to change a flow run's state.
type ChangeFlowRunState struct {
Type string `json:"type"`
Name *string `json:"name,omitempty"`
State StateType `json:"state"`
Message *string `json:"message,omitempty"`
Force bool `json:"force,omitempty"`
}
// PauseWorkQueueAction represents an action to pause a work queue.
type PauseWorkQueueAction struct {
Type string `json:"type"`
Source ActionSource `json:"source,omitempty"`
WorkQueueID *uuid.UUID `json:"work_queue_id,omitempty"`
}
// ResumeWorkQueueAction represents an action to resume a work queue.
type ResumeWorkQueueAction struct {
Type string `json:"type"`
Source ActionSource `json:"source,omitempty"`
WorkQueueID *uuid.UUID `json:"work_queue_id,omitempty"`
}
// PauseWorkPoolAction represents an action to pause a work pool.
type PauseWorkPoolAction struct {
Type string `json:"type"`
Source ActionSource `json:"source,omitempty"`
WorkPoolID *uuid.UUID `json:"work_pool_id,omitempty"`
}
// ResumeWorkPoolAction represents an action to resume a work pool.
type ResumeWorkPoolAction struct {
Type string `json:"type"`
Source ActionSource `json:"source,omitempty"`
WorkPoolID *uuid.UUID `json:"work_pool_id,omitempty"`
}
// PauseAutomationAction represents an action to pause an automation.
type PauseAutomationAction struct {
Type string `json:"type"`
Source ActionSource `json:"source,omitempty"`
AutomationID *uuid.UUID `json:"automation_id,omitempty"`
}
// ResumeAutomationAction represents an action to resume an automation.
type ResumeAutomationAction struct {
Type string `json:"type"`
Source ActionSource `json:"source,omitempty"`
AutomationID *uuid.UUID `json:"automation_id,omitempty"`
}
// SendNotification represents an action to send a notification.
type SendNotification struct {
Type string `json:"type"`
BlockDocumentID uuid.UUID `json:"block_document_id"`
Subject string `json:"subject,omitempty"`
Body string `json:"body"`
}
// CallWebhook represents an action to call a webhook.
type CallWebhook struct {
Type string `json:"type"`
BlockDocumentID uuid.UUID `json:"block_document_id"`
Payload string `json:"payload,omitempty"`
}
// UnmarshalJSON implements custom JSON unmarshaling for time fields.
func (a *Automation) UnmarshalJSON(data []byte) error {
type Alias Automation
aux := &struct {
Created optTime `json:"created"`
Updated optTime `json:"updated"`
*Alias
}{
Alias: (*Alias)(a),
}
if err := json.Unmarshal(data, aux); err != nil {
return err
}
a.Created = aux.Created.V
a.Updated = aux.Updated.V
return nil
}