Documentation ¶
Index ¶
- Constants
- Variables
- type AccessEntry
- type Activity
- type AdditionalAppeal
- type Appeal
- func (a *Appeal) AdvanceApproval(policy *Policy) error
- func (a *Appeal) ApplyPolicy(p *Policy) error
- func (a *Appeal) Approve() error
- func (a *Appeal) Cancel()
- func (a *Appeal) GetApproval(id string) *Approval
- func (a *Appeal) GetDuration() (time.Duration, error)
- func (a *Appeal) GetNextPendingApproval() *Approval
- func (a *Appeal) Init(policy *Policy)
- func (a *Appeal) IsDurationEmpty() bool
- func (a *Appeal) Reject()
- func (a *Appeal) SetDefaults()
- func (a Appeal) ToGrant() (*Grant, error)
- type AppealConfig
- type AppealDurationOption
- type AppealOptions
- type Approval
- type ApprovalAction
- type ApprovalActionType
- type ApprovalStepStrategy
- type Approver
- type Condition
- type Crypto
- type Decryptor
- type Encryptor
- type Grant
- type GrantSource
- type GrantStatus
- type IAMClient
- type IAMConfig
- type IAMManager
- type IAMProviderType
- type ImportActivitiesFilter
- type ListAppealsFilter
- type ListApprovalsFilter
- type ListGrantsFilter
- type ListProviderActivitiesFilter
- type ListResourcesFilter
- type MapResourceAccess
- type MatchCondition
- type Notification
- type NotificationMessage
- type NotificationMessages
- type Policy
- type PolicyAppealConfig
- type PolicyConfig
- type Provider
- type ProviderConfig
- type ProviderParameter
- type ProviderType
- type Question
- type Requirement
- type RequirementTrigger
- type Resource
- type ResourceConfig
- type ResourceIdentifier
- type Resources
- type RevokeGrantsFilter
- type Role
- type SensitiveConfig
- type SensitiveInformation
- type Step
Constants ¶
const ( AppealActionNameApprove = "approve" AppealActionNameReject = "reject" AppealStatusPending = "pending" AppealStatusCanceled = "canceled" AppealStatusApproved = "approved" AppealStatusRejected = "rejected" SystemActorName = "system" DefaultAppealAccountType = "user" PermanentDurationLabel = "Permanent" )
const ( ApprovalStatusPending = "pending" ApprovalStatusBlocked = "blocked" ApprovalStatusSkipped = "skipped" ApprovalStatusApproved = "approved" ApprovalStatusRejected = "rejected" )
const ( NotificationTypeExpirationReminder = "ExpirationReminder" NotificationTypeAppealApproved = "AppealApproved" NotificationTypeOnBehalfAppealApproved = "OnBehalfAppealApproved" NotificationTypeAppealRejected = "AppealRejected" NotificationTypeAccessRevoked = "AccessRevoked" NotificationTypeApproverNotification = "ApproverNotification" NotificationTypeGrantOwnerChanged = "GrantOwnerChanged" )
const ( // ProviderTypeBigQuery is the type name for BigQuery provider ProviderTypeBigQuery = "bigquery" // ProviderTypeMetabase is the type name for Metabase provider ProviderTypeMetabase = "metabase" // ProviderTypeGrafana is the type name for Grafana provider ProviderTypeGrafana = "grafana" // ProviderTypeTableau is the type name for Tableau provider ProviderTypeTableau = "tableau" // ProviderTypeGCloudIAM is the type name for Google Cloud IAM provider ProviderTypeGCloudIAM = "gcloud_iam" // ProviderTypeNoOp is the type name for No-Op provider ProviderTypeNoOp = "noop" // ProviderTypeGCS is the type name for Google Cloud Storage provider ProviderTypeGCS = "gcs" // ProviderTypePolicyTag is the type name for Dataplex ProviderTypePolicyTag = "dataplex" // ProviderTypeShield is the type name for Shield auth layer provider ProviderTypeShield = "shield" )
const (
ApproversKeyResource = "$resource"
)
Variables ¶
var (
ErrApproverInvalidType = errors.New("invalid approver type, expected an email string or array of email string")
)
var (
ErrInvalidConditionField = errors.New("unable to parse condition's field")
)
Functions ¶
This section is empty.
Types ¶
type AccessEntry ¶
func (AccessEntry) ToGrant ¶
func (ae AccessEntry) ToGrant(resource Resource) Grant
type Activity ¶
type Activity struct { ID string `json:"id" yaml:"id"` ProviderID string `json:"provider_id" yaml:"provider_id"` ResourceID string `json:"resource_id" yaml:"resource_id"` ProviderActivityID string `json:"provider_activity_id" yaml:"provider_activity_id"` AccountType string `json:"account_type" yaml:"account_type"` AccountID string `json:"account_id" yaml:"account_id"` Timestamp time.Time `json:"timestamp" yaml:"timestamp"` Authorizations []string `json:"authorizations" yaml:"authorizations"` RelatedPermissions []string `json:"related_permissions" yaml:"related_permissions"` Type string `json:"type" yaml:"type"` Metadata map[string]interface{} `json:"metadata" yaml:"metadata"` CreatedAt time.Time `json:"created_at" yaml:"created_at"` Provider *Provider `json:"provider,omitempty" yaml:"provider,omitempty"` Resource *Resource `json:"resource,omitempty" yaml:"resource,omitempty"` }
type AdditionalAppeal ¶
type AdditionalAppeal struct { Resource *ResourceIdentifier `json:"resource" yaml:"resource" validate:"required"` Role string `json:"role" yaml:"role" validate:"required"` Options *AppealOptions `json:"options" yaml:"options"` Policy *PolicyConfig `json:"policy" yaml:"policy"` }
type Appeal ¶
type Appeal struct { ID string `json:"id" yaml:"id"` ResourceID string `json:"resource_id" yaml:"resource_id"` PolicyID string `json:"policy_id" yaml:"policy_id"` PolicyVersion uint `json:"policy_version" yaml:"policy_version"` Status string `json:"status" yaml:"status"` AccountID string `json:"account_id" yaml:"account_id"` AccountType string `json:"account_type" yaml:"account_type" default:"user"` CreatedBy string `json:"created_by" yaml:"created_by"` Creator interface{} `json:"creator" yaml:"creator"` Role string `json:"role" yaml:"role"` Permissions []string `json:"permissions" yaml:"permissions"` Options *AppealOptions `json:"options" yaml:"options"` Details map[string]interface{} `json:"details" yaml:"details"` Labels map[string]string `json:"labels" yaml:"labels"` Description string `json:"description" yaml:"description"` Policy *Policy `json:"-" yaml:"-"` Resource *Resource `json:"resource,omitempty" yaml:"resource,omitempty"` Approvals []*Approval `json:"approvals,omitempty" yaml:"approvals,omitempty"` Grant *Grant `json:"grant,omitempty" yaml:"grant,omitempty"` CreatedAt time.Time `json:"created_at,omitempty" yaml:"created_at,omitempty"` UpdatedAt time.Time `json:"updated_at,omitempty" yaml:"updated_at,omitempty"` }
Appeal struct
func (*Appeal) AdvanceApproval ¶
func (*Appeal) ApplyPolicy ¶
func (*Appeal) GetApproval ¶
func (*Appeal) GetNextPendingApproval ¶
func (*Appeal) IsDurationEmpty ¶
func (*Appeal) SetDefaults ¶
func (a *Appeal) SetDefaults()
type AppealConfig ¶
type AppealConfig struct { AllowPermanentAccess bool `json:"allow_permanent_access" yaml:"allow_permanent_access"` AllowActiveAccessExtensionIn string `json:"allow_active_access_extension_in" yaml:"allow_active_access_extension_in" validate:"required"` }
AppealConfig is the policy configuration of the appeal
type AppealDurationOption ¶
type AppealDurationOption struct { // Name of the duration // Ex: 1 Day, 3 Days, Permanent Name string `json:"name" yaml:"name" validate:"required"` // Value of the actual duration // Ex: 24h, 72h, 0h // `0h` is reserved for permanent access Value string `json:"value" yaml:"value" validate:"required"` }
type AppealOptions ¶
type AppealOptions struct { ExpirationDate *time.Time `json:"expiration_date,omitempty" yaml:"expiration_date,omitempty"` Duration string `json:"duration" yaml:"duration"` }
AppealOptions
type Approval ¶
type Approval struct { ID string `json:"id" yaml:"id"` Name string `json:"name" yaml:"name"` Index int `json:"-" yaml:"-"` AppealID string `json:"appeal_id" yaml:"appeal_id"` Status string `json:"status" yaml:"status"` Actor *string `json:"actor" yaml:"actor"` Reason string `json:"reason,omitempty" yaml:"reason,omitempty"` PolicyID string `json:"policy_id" yaml:"policy_id"` PolicyVersion uint `json:"policy_version" yaml:"policy_version"` Approvers []string `json:"approvers,omitempty" yaml:"approvers,omitempty"` Appeal *Appeal `json:"appeal,omitempty" yaml:"appeal,omitempty"` CreatedAt time.Time `json:"created_at,omitempty" yaml:"created_at,omitempty"` UpdatedAt time.Time `json:"updated_at,omitempty" yaml:"updated_at,omitempty"` }
func (*Approval) IsManualApproval ¶
type ApprovalAction ¶
type ApprovalActionType ¶
type ApprovalActionType string
const ( ApprovalActionApprove ApprovalActionType = "approve" ApprovalActionReject ApprovalActionType = "reject" )
type ApprovalStepStrategy ¶
type ApprovalStepStrategy string
const ( ApprovalStepStrategyAuto ApprovalStepStrategy = "auto" ApprovalStepStrategyManual ApprovalStepStrategy = "manual" )
type Approver ¶
type Approver struct { ID string `json:"id" yaml:"id"` ApprovalID string `json:"approval_id" yaml:"approval_id"` AppealID string `json:"appeal_id" yaml:"appeal_id"` Email string `json:"email" yaml:"email"` CreatedAt time.Time `json:"created_at,omitempty" yaml:"created_at,omitempty"` UpdatedAt time.Time `json:"updated_at,omitempty" yaml:"updated_at,omitempty"` }
type Condition ¶
type Condition struct { Field string `json:"field" yaml:"field" validate:"required"` Match *MatchCondition `json:"match" yaml:"match" validate:"required"` }
Condition gets evaluated to determine the approval step resolution whether it is success or failed
type Grant ¶
type Grant struct { ID string `json:"id" yaml:"id"` Status GrantStatus `json:"status" yaml:"status"` StatusInProvider GrantStatus `json:"status_in_provider" yaml:"status_in_provider"` AccountID string `json:"account_id" yaml:"account_id"` AccountType string `json:"account_type" yaml:"account_type"` ResourceID string `json:"resource_id" yaml:"resource_id"` Role string `json:"role" yaml:"role"` Permissions []string `json:"permissions" yaml:"permissions"` IsPermanent bool `json:"is_permanent" yaml:"is_permanent"` ExpirationDate *time.Time `json:"expiration_date" yaml:"expiration_date"` AppealID string `json:"appeal_id" yaml:"appeal_id"` Source GrantSource `json:"source" yaml:"source"` RevokedBy string `json:"revoked_by,omitempty" yaml:"revoked_by,omitempty"` RevokedAt *time.Time `json:"revoked_at,omitempty" yaml:"revoked_at,omitempty"` RevokeReason string `json:"revoke_reason,omitempty" yaml:"revoke_reason,omitempty"` CreatedBy string `json:"created_by" yaml:"created_by"` // Deprecated: use Owner instead Owner string `json:"owner" yaml:"owner"` CreatedAt time.Time `json:"created_at" yaml:"created_at"` UpdatedAt time.Time `json:"updated_at" yaml:"updated_at"` Resource *Resource `json:"resource,omitempty" yaml:"resource,omitempty"` Appeal *Appeal `json:"appeal,omitempty" yaml:"appeal,omitempty"` }
func (*Grant) GetPermissions ¶
func (Grant) IsEligibleForExtension ¶
func (Grant) PermissionsKey ¶
type GrantSource ¶
type GrantSource string
const ( GrantSourceAppeal GrantSource = "appeal" GrantSourceImport GrantSource = "import" )
type GrantStatus ¶
type GrantStatus string
const ( GrantStatusActive GrantStatus = "active" GrantStatusInactive GrantStatus = "inactive" )
type IAMConfig ¶
type IAMConfig struct { Provider IAMProviderType `json:"provider" yaml:"provider" validate:"required,oneof=http shield"` Config interface{} `json:"config" yaml:"config" validate:"required"` Schema map[string]string `json:"schema" yaml:"schema"` }
type IAMManager ¶
type IAMManager interface { ParseConfig(*IAMConfig) (SensitiveConfig, error) GetClient(SensitiveConfig) (IAMClient, error) }
type IAMProviderType ¶
type IAMProviderType string
const ( IAMProviderTypeShield IAMProviderType = "shield" IAMProviderTypeHTTP IAMProviderType = "http" )
type ImportActivitiesFilter ¶
type ImportActivitiesFilter struct { ProviderID string ResourceIDs []string AccountIDs []string TimestampGte *time.Time TimestampLte *time.Time // contains filtered or unexported fields }
func (*ImportActivitiesFilter) GetResources ¶
func (f *ImportActivitiesFilter) GetResources() []*Resource
func (*ImportActivitiesFilter) PopulateResources ¶
func (f *ImportActivitiesFilter) PopulateResources(resources map[string]*Resource) error
type ListAppealsFilter ¶
type ListAppealsFilter struct { CreatedBy string `mapstructure:"created_by" validate:"omitempty,required"` AccountID string `mapstructure:"account_id" validate:"omitempty,required"` AccountIDs []string `mapstructure:"account_ids" validate:"omitempty,required"` ResourceID string `mapstructure:"resource_id" validate:"omitempty,required"` Role string `mapstructure:"role" validate:"omitempty,required"` Statuses []string `mapstructure:"statuses" validate:"omitempty,min=1"` ExpirationDateLessThan time.Time `mapstructure:"expiration_date_lt" validate:"omitempty,required"` ExpirationDateGreaterThan time.Time `mapstructure:"expiration_date_gt" validate:"omitempty,required"` ProviderTypes []string `mapstructure:"provider_types" validate:"omitempty,min=1"` ProviderURNs []string `mapstructure:"provider_urns" validate:"omitempty,min=1"` ResourceTypes []string `mapstructure:"resource_types" validate:"omitempty,min=1"` ResourceURNs []string `mapstructure:"resource_urns" validate:"omitempty,min=1"` OrderBy []string `mapstructure:"order_by" validate:"omitempty,min=1"` }
type ListApprovalsFilter ¶
type ListApprovalsFilter struct { AccountID string `mapstructure:"account_id" validate:"omitempty,required"` CreatedBy string `mapstructure:"created_by" validate:"omitempty,required"` Statuses []string `mapstructure:"statuses" validate:"omitempty,min=1"` OrderBy []string `mapstructure:"order_by" validate:"omitempty,min=1"` Size int `mapstructure:"size" validate:"omitempty"` Offset int `mapstructure:"offset" validate:"omitempty"` AppealStatuses []string `mapstructure:"appeal_statuses" validate:"omitempty,min=1"` }
type ListGrantsFilter ¶
type ListGrantsFilter struct { Statuses []string AccountIDs []string AccountTypes []string ResourceIDs []string Roles []string Permissions []string ProviderTypes []string ProviderURNs []string ResourceTypes []string ResourceURNs []string CreatedBy string Owner string OrderBy []string ExpirationDateLessThan time.Time ExpirationDateGreaterThan time.Time IsPermanent *bool }
type ListResourcesFilter ¶
type ListResourcesFilter struct { IDs []string `mapstructure:"ids" validate:"omitempty,min=1"` IsDeleted bool `mapstructure:"is_deleted" validate:"omitempty"` ProviderType string `mapstructure:"provider_type" validate:"omitempty"` ProviderURN string `mapstructure:"provider_urn" validate:"omitempty"` Name string `mapstructure:"name" validate:"omitempty"` ResourceURN string `mapstructure:"urn" validate:"omitempty"` ResourceType string `mapstructure:"type" validate:"omitempty"` ResourceURNs []string `mapstructure:"urns" validate:"omitempty"` ResourceTypes []string `mapstructure:"types" validate:"omitempty"` Details map[string]string `mapstructure:"details"` }
type MapResourceAccess ¶
type MapResourceAccess map[string][]AccessEntry
MapResourceAccess is list of UserAccess grouped by resource urn
type MatchCondition ¶
type MatchCondition struct {
Eq interface{} `json:"eq" yaml:"eq"`
}
MatchCondition is for determining the requirement of the condition
type Notification ¶
type Notification struct { User string Message NotificationMessage Labels map[string]string }
type NotificationMessage ¶
type NotificationMessages ¶
type NotificationMessages struct { ExpirationReminder string `mapstructure:"expiration_reminder"` AppealApproved string `mapstructure:"appeal_approved"` AppealRejected string `mapstructure:"appeal_rejected"` AccessRevoked string `mapstructure:"access_revoked"` ApproverNotification string `mapstructure:"approver_notification"` OthersAppealApproved string `mapstructure:"others_appeal_approved"` GrantOwnerChanged string `mapstructure:"grant_owner_changed"` }
type Policy ¶
type Policy struct { ID string `json:"id" yaml:"id" validate:"required"` Version uint `json:"version" yaml:"version" validate:"required"` Description string `json:"description" yaml:"description"` Steps []*Step `json:"steps" yaml:"steps" validate:"required,min=1,dive"` AppealConfig *PolicyAppealConfig `json:"appeal_config" yaml:"appeal_config" validate:"omitempty,dive"` Requirements []*Requirement `json:"requirements,omitempty" yaml:"requirements,omitempty" validate:"omitempty,min=1,dive"` Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"` IAM *IAMConfig `json:"iam,omitempty" yaml:"iam,omitempty" validate:"omitempty,dive"` CreatedAt time.Time `json:"created_at,omitempty" yaml:"created_at,omitempty"` UpdatedAt time.Time `json:"updated_at,omitempty" yaml:"updated_at,omitempty"` }
Policy is the approval policy configuration
func (*Policy) HasIAMConfig ¶
type PolicyAppealConfig ¶
type PolicyAppealConfig struct { DurationOptions []AppealDurationOption `json:"duration_options" yaml:"duration_options" validate:"omitempty,min=1,dive"` AllowOnBehalf bool `json:"allow_on_behalf" yaml:"allow_on_behalf"` AllowPermanentAccess bool `json:"allow_permanent_access" yaml:"allow_permanent_access"` AllowActiveAccessExtensionIn string `json:"allow_active_access_extension_in" yaml:"allow_active_access_extension_in"` Questions []Question `json:"questions" yaml:"questions"` }
type PolicyConfig ¶
type PolicyConfig struct { ID string `json:"id" yaml:"id" validate:"required"` Version int `json:"version" yaml:"version" validate:"required"` }
PolicyConfig is the configuration that defines which policy is being used in the provider
type Provider ¶
type Provider struct { ID string `json:"id" yaml:"id"` Type string `json:"type" yaml:"type"` URN string `json:"urn" yaml:"urn"` Config *ProviderConfig `json:"config" yaml:"config"` CreatedAt time.Time `json:"created_at,omitempty" yaml:"created_at,omitempty"` UpdatedAt time.Time `json:"updated_at,omitempty" yaml:"updated_at,omitempty"` }
Provider domain structure
type ProviderConfig ¶
type ProviderConfig struct { Type string `json:"type" yaml:"type" validate:"required,oneof=google_bigquery metabase grafana tableau gcloud_iam noop gcs"` URN string `json:"urn" yaml:"urn" validate:"required"` AllowedAccountTypes []string `json:"allowed_account_types" yaml:"allowed_account_types" validate:"omitempty,min=1"` Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"` Credentials interface{} `json:"credentials,omitempty" yaml:"credentials" validate:"required"` Appeal *AppealConfig `json:"appeal,omitempty" yaml:"appeal,omitempty" validate:"required"` Resources []*ResourceConfig `json:"resources" yaml:"resources" validate:"required"` Parameters []*ProviderParameter `json:"parameters,omitempty" yaml:"parameters,omitempty"` }
ProviderConfig is the configuration for a data provider
func (ProviderConfig) GetResourceTypes ¶
func (pc ProviderConfig) GetResourceTypes() (resourceTypes []string)
type ProviderParameter ¶
type ProviderType ¶
type Requirement ¶
type Requirement struct { On *RequirementTrigger `json:"on" yaml:"on" validate:"required"` Appeals []*AdditionalAppeal `json:"appeals" yaml:"appeals" validate:"required,min=1,dive"` }
type RequirementTrigger ¶
type RequirementTrigger struct { ProviderType string `` /* 137-byte string literal not displayed */ ProviderURN string `` /* 136-byte string literal not displayed */ ResourceType string `` /* 137-byte string literal not displayed */ ResourceURN string `` /* 136-byte string literal not displayed */ Role string `` /* 128-byte string literal not displayed */ // Deprecated: use Expression instead Conditions []*Condition `` /* 134-byte string literal not displayed */ Expression string `` /* 134-byte string literal not displayed */ }
type Resource ¶
type Resource struct { ID string `json:"id" yaml:"id"` ProviderType string `json:"provider_type" yaml:"provider_type"` ProviderURN string `json:"provider_urn" yaml:"provider_urn"` Type string `json:"type" yaml:"type"` URN string `json:"urn" yaml:"urn"` Name string `json:"name" yaml:"name"` Details map[string]interface{} `json:"details" yaml:"details"` Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"` CreatedAt time.Time `json:"created_at,omitempty" yaml:"created_at,omitempty"` UpdatedAt time.Time `json:"updated_at,omitempty" yaml:"updated_at,omitempty"` IsDeleted bool `json:"is_deleted,omitempty" yaml:"is_deleted,omitempty"` ParentID *string `json:"parent_id,omitempty" yaml:"parent_id,omitempty"` Children []*Resource `json:"children,omitempty" yaml:"children,omitempty"` }
Resource struct
func (*Resource) GetFlattened ¶
type ResourceConfig ¶
type ResourceConfig struct { Type string `json:"type" yaml:"type" validate:"required"` Filter string `json:"filter" yaml:"filter"` Policy *PolicyConfig `json:"policy" yaml:"policy"` Roles []*Role `json:"roles" yaml:"roles" validate:"required"` }
ResourceConfig is the configuration for a resource type within a provider
type ResourceIdentifier ¶
type ResourceIdentifier struct { ProviderType string `json:"provider_type" yaml:"provider_type" validate:"required_with=ProviderURN Type URN"` ProviderURN string `json:"provider_urn" yaml:"provider_urn" validate:"required_with=ProviderType Type URN"` Type string `json:"type" yaml:"type" validate:"required_with=ProviderType ProviderURN URN"` URN string `json:"urn" yaml:"urn" validate:"required_with=ProviderType ProviderURN Type"` ID string `json:"id" yaml:"id" validate:"required_without_all=ProviderType ProviderURN Type URN"` }
type RevokeGrantsFilter ¶
type Role ¶
type Role struct { ID string `json:"id" yaml:"id" validate:"required"` Name string `json:"name" yaml:"name" validate:"required"` Description string `json:"description,omitempty" yaml:"description"` Permissions []interface{} `json:"permissions" yaml:"permissions" validate:"required"` }
Role is the configuration to define a role and mapping the permissions in the provider
func (Role) GetOrderedPermissions ¶
GetOrderedPermissions returns the permissions as a string slice
type SensitiveConfig ¶
type SensitiveConfig interface { SensitiveInformation Validate() error }
type SensitiveInformation ¶
type Step ¶
type Step struct { // Name used as the step identifier Name string `json:"name" yaml:"name" validate:"required"` // Description tells more details about the step Description string `json:"description" yaml:"description"` // AllowFailed lets the approval flow continue to the next step even the current step is rejected. // If the last step has AllowFailed equal to true, and it's getting rejected, // the appeal status will resolve as approved or success. AllowFailed bool `json:"allow_failed" yaml:"allow_failed"` // When is an Expression that determines whether the step should be evaluated or it can be skipped at the beginning. // If it evaluates to be falsy, the step will automatically skipped. Otherwise, step become pending/blocked (normal). // // Accessible parameters: // $appeal = Appeal object When string `json:"when,omitempty" yaml:"when,omitempty"` // Strategy defines if the step requires manual approval or not Strategy ApprovalStepStrategy `json:"strategy" yaml:"strategy" validate:"required,oneof=auto manual"` // RejectionReason message fills `Approval.Reason` if the approval step gets rejected based on `ApproveIf` expression. RejectionReason string `json:"rejection_reason" yaml:"rejection_reason"` // Approvers is an Expression that if the evaluation returns string or []string that contains email address of the approvers. // If human approval (manual) is required, use this field. // // Accessible parameters: // $appeal = Appeal object Approvers []string `json:"approvers,omitempty" yaml:"approvers,omitempty" validate:"required_if=Strategy manual,omitempty,min=1"` // ApproveIf is an Expression to determines the resolution of the step. If automatic approval is needed for the step, // use this field. // // Accessible parameters: // $appeal = Appeal object ApproveIf string `json:"approve_if,omitempty" yaml:"approve_if,omitempty" validate:"required_if=Strategy auto"` }
Step is an individual process within an approval flow