github.com/rancher/types@v0.0.0-20220328215343-4370ff10ecd5/apis/management.cattle.io/v3/alerting_types.go (about)

     1  package v3
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/rancher/norman/types"
     7  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
     8  )
     9  
    10  type ClusterAlert struct {
    11  	types.Namespaced
    12  
    13  	metav1.TypeMeta `json:",inline"`
    14  	// Standard object’s metadata. More info:
    15  	// https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#metadata
    16  	metav1.ObjectMeta `json:"metadata,omitempty"`
    17  
    18  	Spec ClusterAlertSpec `json:"spec"`
    19  	// Most recent observed status of the alert. More info:
    20  	// https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status
    21  	Status AlertStatus `json:"status"`
    22  }
    23  
    24  func (c *ClusterAlert) ObjClusterName() string {
    25  	return c.Spec.ObjClusterName()
    26  }
    27  
    28  type ProjectAlert struct {
    29  	types.Namespaced
    30  
    31  	metav1.TypeMeta `json:",inline"`
    32  	// Standard object’s metadata. More info:
    33  	// https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#metadata
    34  	metav1.ObjectMeta `json:"metadata,omitempty"`
    35  
    36  	Spec ProjectAlertSpec `json:"spec"`
    37  	// Most recent observed status of the alert. More info:
    38  	// https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status
    39  	Status AlertStatus `json:"status"`
    40  }
    41  
    42  func (p *ProjectAlert) ObjClusterName() string {
    43  	return p.Spec.ObjClusterName()
    44  }
    45  
    46  type AlertCommonSpec struct {
    47  	DisplayName           string      `json:"displayName,omitempty" norman:"required"`
    48  	Description           string      `json:"description,omitempty"`
    49  	Severity              string      `json:"severity,omitempty" norman:"required,options=info|critical|warning,default=critical"`
    50  	Recipients            []Recipient `json:"recipients,omitempty" norman:"required"`
    51  	InitialWaitSeconds    int         `json:"initialWaitSeconds,omitempty" norman:"required,default=180,min=0"`
    52  	RepeatIntervalSeconds int         `json:"repeatIntervalSeconds,omitempty"  norman:"required,default=3600,min=0"`
    53  }
    54  
    55  type ClusterAlertSpec struct {
    56  	AlertCommonSpec
    57  
    58  	ClusterName         string               `json:"clusterName" norman:"type=reference[cluster]"`
    59  	TargetNode          *TargetNode          `json:"targetNode,omitempty"`
    60  	TargetSystemService *TargetSystemService `json:"targetSystemService,omitempty"`
    61  	TargetEvent         *TargetEvent         `json:"targetEvent,omitempty"`
    62  }
    63  
    64  func (c *ClusterAlertSpec) ObjClusterName() string {
    65  	return c.ClusterName
    66  }
    67  
    68  type ProjectAlertSpec struct {
    69  	AlertCommonSpec
    70  
    71  	ProjectName    string          `json:"projectName" norman:"type=reference[project]"`
    72  	TargetWorkload *TargetWorkload `json:"targetWorkload,omitempty"`
    73  	TargetPod      *TargetPod      `json:"targetPod,omitempty"`
    74  }
    75  
    76  func (p *ProjectAlertSpec) ObjClusterName() string {
    77  	if parts := strings.SplitN(p.ProjectName, ":", 2); len(parts) == 2 {
    78  		return parts[0]
    79  	}
    80  	return ""
    81  }
    82  
    83  type Recipient struct {
    84  	Recipient    string `json:"recipient,omitempty"`
    85  	NotifierName string `json:"notifierName,omitempty" norman:"required,type=reference[notifier]"`
    86  	NotifierType string `json:"notifierType,omitempty" norman:"required,options=slack|email|pagerduty|webhook|wechat|dingtalk|msteams"`
    87  }
    88  
    89  type TargetNode struct {
    90  	NodeName     string            `json:"nodeName,omitempty" norman:"type=reference[node]"`
    91  	Selector     map[string]string `json:"selector,omitempty"`
    92  	Condition    string            `json:"condition,omitempty" norman:"required,options=notready|mem|cpu,default=notready"`
    93  	MemThreshold int               `json:"memThreshold,omitempty" norman:"min=1,max=100,default=70"`
    94  	CPUThreshold int               `json:"cpuThreshold,omitempty" norman:"min=1,default=70"`
    95  }
    96  
    97  type TargetPod struct {
    98  	PodName                string `json:"podName,omitempty" norman:"required,type=reference[/v3/projects/schemas/pod]"`
    99  	Condition              string `json:"condition,omitempty" norman:"required,options=notrunning|notscheduled|restarts,default=notrunning"`
   100  	RestartTimes           int    `json:"restartTimes,omitempty" norman:"min=1,default=3"`
   101  	RestartIntervalSeconds int    `json:"restartIntervalSeconds,omitempty"  norman:"min=1,default=300"`
   102  }
   103  
   104  type TargetEvent struct {
   105  	EventType    string `json:"eventType,omitempty" norman:"required,options=Normal|Warning,default=Warning"`
   106  	ResourceKind string `json:"resourceKind,omitempty" norman:"required,options=Pod|Node|Deployment|StatefulSet|DaemonSet"`
   107  }
   108  
   109  type TargetWorkload struct {
   110  	WorkloadID          string            `json:"workloadId,omitempty"`
   111  	Selector            map[string]string `json:"selector,omitempty"`
   112  	AvailablePercentage int               `json:"availablePercentage,omitempty" norman:"required,min=1,max=100,default=70"`
   113  }
   114  
   115  type TargetSystemService struct {
   116  	Condition string `json:"condition,omitempty" norman:"required,options=etcd|controller-manager|scheduler,default=scheduler"`
   117  }
   118  
   119  type AlertStatus struct {
   120  	AlertState string `json:"alertState,omitempty" norman:"options=active|inactive|alerting|muted,default=active"`
   121  }
   122  
   123  type ClusterAlertGroup struct {
   124  	types.Namespaced
   125  
   126  	metav1.TypeMeta `json:",inline"`
   127  	// Standard object’s metadata. More info:
   128  	// https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#metadata
   129  	metav1.ObjectMeta `json:"metadata,omitempty"`
   130  
   131  	Spec ClusterGroupSpec `json:"spec"`
   132  	// Most recent observed status of the alert. More info:
   133  	// https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status
   134  	Status AlertStatus `json:"status"`
   135  }
   136  
   137  func (c *ClusterAlertGroup) ObjClusterName() string {
   138  	return c.Spec.ObjClusterName()
   139  }
   140  
   141  type ProjectAlertGroup struct {
   142  	types.Namespaced
   143  
   144  	metav1.TypeMeta `json:",inline"`
   145  	// Standard object’s metadata. More info:
   146  	// https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#metadata
   147  	metav1.ObjectMeta `json:"metadata,omitempty"`
   148  
   149  	Spec ProjectGroupSpec `json:"spec"`
   150  	// Most recent observed status of the alert. More info:
   151  	// https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status
   152  	Status AlertStatus `json:"status"`
   153  }
   154  
   155  func (p *ProjectAlertGroup) ObjClusterName() string {
   156  	return p.Spec.ObjClusterName()
   157  }
   158  
   159  type ClusterGroupSpec struct {
   160  	ClusterName string      `json:"clusterName" norman:"type=reference[cluster]"`
   161  	Recipients  []Recipient `json:"recipients,omitempty"`
   162  	CommonGroupField
   163  }
   164  
   165  func (c *ClusterGroupSpec) ObjClusterName() string {
   166  	return c.ClusterName
   167  }
   168  
   169  type ProjectGroupSpec struct {
   170  	ProjectName string      `json:"projectName" norman:"type=reference[project]"`
   171  	Recipients  []Recipient `json:"recipients,omitempty"`
   172  	CommonGroupField
   173  }
   174  
   175  func (p *ProjectGroupSpec) ObjClusterName() string {
   176  	if parts := strings.SplitN(p.ProjectName, ":", 2); len(parts) == 2 {
   177  		return parts[0]
   178  	}
   179  	return ""
   180  }
   181  
   182  type ClusterAlertRule struct {
   183  	types.Namespaced
   184  
   185  	metav1.TypeMeta `json:",inline"`
   186  	// Standard object’s metadata. More info:
   187  	// https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#metadata
   188  	metav1.ObjectMeta `json:"metadata,omitempty"`
   189  
   190  	Spec ClusterAlertRuleSpec `json:"spec"`
   191  	// Most recent observed status of the alert. More info:
   192  	// https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status
   193  	Status AlertStatus `json:"status"`
   194  }
   195  
   196  func (c *ClusterAlertRule) ObjClusterName() string {
   197  	return c.Spec.ObjClusterName()
   198  }
   199  
   200  type ClusterAlertRuleSpec struct {
   201  	CommonRuleField
   202  	ClusterName       string             `json:"clusterName" norman:"type=reference[cluster]"`
   203  	GroupName         string             `json:"groupName" norman:"type=reference[clusterAlertGroup]"`
   204  	NodeRule          *NodeRule          `json:"nodeRule,omitempty"`
   205  	EventRule         *EventRule         `json:"eventRule,omitempty"`
   206  	SystemServiceRule *SystemServiceRule `json:"systemServiceRule,omitempty"`
   207  	MetricRule        *MetricRule        `json:"metricRule,omitempty"`
   208  	ClusterScanRule   *ClusterScanRule   `json:"clusterScanRule,omitempty"`
   209  }
   210  
   211  func (c *ClusterAlertRuleSpec) ObjClusterName() string {
   212  	return c.ClusterName
   213  }
   214  
   215  type ProjectAlertRule struct {
   216  	types.Namespaced
   217  
   218  	metav1.TypeMeta `json:",inline"`
   219  	// Standard object’s metadata. More info:
   220  	// https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#metadata
   221  	metav1.ObjectMeta `json:"metadata,omitempty"`
   222  
   223  	Spec ProjectAlertRuleSpec `json:"spec"`
   224  	// Most recent observed status of the alert. More info:
   225  	// https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status
   226  	Status AlertStatus `json:"status"`
   227  }
   228  
   229  func (p *ProjectAlertRule) ObjClusterName() string {
   230  	return p.Spec.ObjClusterName()
   231  }
   232  
   233  type ProjectAlertRuleSpec struct {
   234  	CommonRuleField
   235  	ProjectName  string        `json:"projectName" norman:"type=reference[project]"`
   236  	GroupName    string        `json:"groupName" norman:"type=reference[projectAlertGroup]"`
   237  	PodRule      *PodRule      `json:"podRule,omitempty"`
   238  	WorkloadRule *WorkloadRule `json:"workloadRule,omitempty"`
   239  	MetricRule   *MetricRule   `json:"metricRule,omitempty"`
   240  }
   241  
   242  func (p *ProjectAlertRuleSpec) ObjClusterName() string {
   243  	if parts := strings.SplitN(p.ProjectName, ":", 2); len(parts) == 2 {
   244  		return parts[0]
   245  	}
   246  	return ""
   247  }
   248  
   249  type CommonGroupField struct {
   250  	DisplayName string `json:"displayName,omitempty" norman:"required"`
   251  	Description string `json:"description,omitempty"`
   252  	TimingField
   253  }
   254  
   255  type CommonRuleField struct {
   256  	DisplayName string `json:"displayName,omitempty"`
   257  	Severity    string `json:"severity,omitempty" norman:"required,options=info|critical|warning,default=critical"`
   258  	Inherited   *bool  `json:"inherited,omitempty" norman:"default=true"`
   259  	TimingField
   260  }
   261  
   262  type ClusterScanRule struct {
   263  	ScanRunType  ClusterScanRunType `json:"scanRunType,omitempty" norman:"required,options=manual|scheduled,default=scheduled"`
   264  	FailuresOnly bool               `json:"failuresOnly,omitempty"`
   265  }
   266  
   267  type MetricRule struct {
   268  	Expression     string  `json:"expression,omitempty" norman:"required"`
   269  	Description    string  `json:"description,omitempty"`
   270  	Duration       string  `json:"duration,omitempty" norman:"required"`
   271  	Comparison     string  `json:"comparison,omitempty" norman:"type=enum,options=equal|not-equal|greater-than|less-than|greater-or-equal|less-or-equal|has-value,default=equal"`
   272  	ThresholdValue float64 `json:"thresholdValue,omitempty" norman:"type=float"`
   273  }
   274  
   275  type TimingField struct {
   276  	GroupWaitSeconds      int `json:"groupWaitSeconds,omitempty" norman:"required,default=30,min=1"`
   277  	GroupIntervalSeconds  int `json:"groupIntervalSeconds,omitempty" norman:"required,default=180,min=1"`
   278  	RepeatIntervalSeconds int `json:"repeatIntervalSeconds,omitempty"  norman:"required,default=3600,min=1"`
   279  }
   280  
   281  type NodeRule struct {
   282  	NodeName     string            `json:"nodeName,omitempty" norman:"type=reference[node]"`
   283  	Selector     map[string]string `json:"selector,omitempty"`
   284  	Condition    string            `json:"condition,omitempty" norman:"required,options=notready|mem|cpu,default=notready"`
   285  	MemThreshold int               `json:"memThreshold,omitempty" norman:"min=1,max=100,default=70"`
   286  	CPUThreshold int               `json:"cpuThreshold,omitempty" norman:"min=1,default=70"`
   287  }
   288  
   289  type PodRule struct {
   290  	PodName                string `json:"podName,omitempty" norman:"required,type=reference[/v3/projects/schemas/pod]"`
   291  	Condition              string `json:"condition,omitempty" norman:"required,options=notrunning|notscheduled|restarts,default=notrunning"`
   292  	RestartTimes           int    `json:"restartTimes,omitempty" norman:"min=1,default=3"`
   293  	RestartIntervalSeconds int    `json:"restartIntervalSeconds,omitempty"  norman:"min=1,default=300"`
   294  }
   295  
   296  type EventRule struct {
   297  	EventType    string `json:"eventType,omitempty" norman:"required,options=Normal|Warning,default=Warning"`
   298  	ResourceKind string `json:"resourceKind,omitempty" norman:"required,options=Pod|Node|Deployment|StatefulSet|DaemonSet"`
   299  }
   300  
   301  type WorkloadRule struct {
   302  	WorkloadID          string            `json:"workloadId,omitempty"`
   303  	Selector            map[string]string `json:"selector,omitempty"`
   304  	AvailablePercentage int               `json:"availablePercentage,omitempty" norman:"required,min=1,max=100,default=70"`
   305  }
   306  
   307  type SystemServiceRule struct {
   308  	Condition string `json:"condition,omitempty" norman:"required,options=etcd|controller-manager|scheduler,default=scheduler"`
   309  }
   310  
   311  type Notifier struct {
   312  	types.Namespaced
   313  
   314  	metav1.TypeMeta `json:",inline"`
   315  	// Standard object’s metadata. More info:
   316  	// https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#metadata
   317  	metav1.ObjectMeta `json:"metadata,omitempty"`
   318  
   319  	Spec NotifierSpec `json:"spec"`
   320  	// Most recent observed status of the notifier. More info:
   321  	// https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status
   322  	Status NotifierStatus `json:"status"`
   323  }
   324  
   325  func (n *Notifier) ObjClusterName() string {
   326  	return n.Spec.ObjClusterName()
   327  }
   328  
   329  type NotifierSpec struct {
   330  	ClusterName string `json:"clusterName" norman:"type=reference[cluster]"`
   331  
   332  	DisplayName     string           `json:"displayName,omitempty" norman:"required"`
   333  	Description     string           `json:"description,omitempty"`
   334  	SendResolved    bool             `json:"sendResolved,omitempty"`
   335  	SMTPConfig      *SMTPConfig      `json:"smtpConfig,omitempty"`
   336  	SlackConfig     *SlackConfig     `json:"slackConfig,omitempty"`
   337  	PagerdutyConfig *PagerdutyConfig `json:"pagerdutyConfig,omitempty"`
   338  	WebhookConfig   *WebhookConfig   `json:"webhookConfig,omitempty"`
   339  	WechatConfig    *WechatConfig    `json:"wechatConfig,omitempty"`
   340  	DingtalkConfig  *DingtalkConfig  `json:"dingtalkConfig,omitempty"`
   341  	MSTeamsConfig   *MSTeamsConfig   `json:"msteamsConfig,omitempty"`
   342  }
   343  
   344  func (n *NotifierSpec) ObjClusterName() string {
   345  	return n.ClusterName
   346  }
   347  
   348  type Notification struct {
   349  	Message         string           `json:"message,omitempty"`
   350  	SMTPConfig      *SMTPConfig      `json:"smtpConfig,omitempty"`
   351  	SlackConfig     *SlackConfig     `json:"slackConfig,omitempty"`
   352  	PagerdutyConfig *PagerdutyConfig `json:"pagerdutyConfig,omitempty"`
   353  	WebhookConfig   *WebhookConfig   `json:"webhookConfig,omitempty"`
   354  	WechatConfig    *WechatConfig    `json:"wechatConfig,omitempty"`
   355  	DingtalkConfig  *DingtalkConfig  `json:"dingtalkConfig,omitempty"`
   356  	MSTeamsConfig   *MSTeamsConfig   `json:"msteamsConfig,omitempty"`
   357  }
   358  
   359  type SMTPConfig struct {
   360  	Host             string `json:"host,omitempty" norman:"required,type=hostname"`
   361  	Port             int    `json:"port,omitempty" norman:"required,min=1,max=65535,default=587"`
   362  	Username         string `json:"username,omitempty"`
   363  	Password         string `json:"password,omitempty" norman:"type=password"`
   364  	Sender           string `json:"sender,omitempty" norman:"required"`
   365  	DefaultRecipient string `json:"defaultRecipient,omitempty" norman:"required"`
   366  	TLS              *bool  `json:"tls,omitempty" norman:"required,default=true"`
   367  }
   368  
   369  type SlackConfig struct {
   370  	DefaultRecipient string `json:"defaultRecipient,omitempty"`
   371  	URL              string `json:"url,omitempty" norman:"required"`
   372  	*HTTPClientConfig
   373  }
   374  
   375  type PagerdutyConfig struct {
   376  	ServiceKey string `json:"serviceKey,omitempty" norman:"required"`
   377  	*HTTPClientConfig
   378  }
   379  
   380  type WebhookConfig struct {
   381  	URL string `json:"url,omitempty" norman:"required"`
   382  	*HTTPClientConfig
   383  }
   384  
   385  type DingtalkConfig struct {
   386  	URL    string `json:"url,omitempty" norman:"required"`
   387  	Secret string `json:"secret,omitempty" norman:"type=password"`
   388  	*HTTPClientConfig
   389  }
   390  
   391  type MSTeamsConfig struct {
   392  	URL string `json:"url,omitempty" norman:"required"`
   393  	*HTTPClientConfig
   394  }
   395  
   396  type WechatConfig struct {
   397  	DefaultRecipient string `json:"defaultRecipient,omitempty" norman:"required"`
   398  	Secret           string `json:"secret,omitempty" norman:"type=password,required"`
   399  	Agent            string `json:"agent,omitempty" norman:"required"`
   400  	Corp             string `json:"corp,omitempty" norman:"required"`
   401  	RecipientType    string `json:"recipientType,omitempty" norman:"required,options=tag|party|user,default=party"`
   402  	APIURL           string `json:"apiUrl,omitempty"`
   403  	*HTTPClientConfig
   404  }
   405  
   406  type NotifierStatus struct {
   407  	SMTPCredentialSecret     string `json:"smtpCredentialSecret,omitempty" norman:"nocreate,noupdate"`
   408  	WechatCredentialSecret   string `json:"wechatCredentialSecret,omitempty" norman:"nocreate,noupdate"`
   409  	DingtalkCredentialSecret string `json:"dingtalkCredentialSecret,omitempty" norman:"nocreate,noupdate"`
   410  }
   411  
   412  // HTTPClientConfig configures an HTTP client.
   413  type HTTPClientConfig struct {
   414  	// HTTP proxy server to use to connect to the targets.
   415  	ProxyURL string `json:"proxyUrl,omitempty"`
   416  }