diff --git a/apps/alerting/notifications/kinds/receiver.cue b/apps/alerting/notifications/kinds/receiver.cue index 9342f60298b..43a818e0e59 100644 --- a/apps/alerting/notifications/kinds/receiver.cue +++ b/apps/alerting/notifications/kinds/receiver.cue @@ -2,6 +2,7 @@ package kinds import ( "github.com/grafana/grafana/apps/alerting/notifications/kinds/v0alpha1" + "github.com/grafana/grafana/apps/alerting/notifications/kinds/v0alpha2" ) receiver: { @@ -24,5 +25,13 @@ receiver: { "spec.title", ] } + "v0alpha2": { + schema: { + spec: v0alpha2.ReceiverSpec + } + selectableFields: [ + "spec.title", + ] + } } } diff --git a/apps/alerting/notifications/kinds/v0alpha2/receiver_spec.cue b/apps/alerting/notifications/kinds/v0alpha2/receiver_spec.cue new file mode 100644 index 00000000000..534039248f5 --- /dev/null +++ b/apps/alerting/notifications/kinds/v0alpha2/receiver_spec.cue @@ -0,0 +1,324 @@ +package v0alpha2 + +BaseIntegration: { + uid?: string + disable_resolve_message?: bool +} + +// A string that contain sensitive information. +#Secret: string + +AlertmanagerIntegration: BaseIntegration & { + url: string + basicAuthUser?: string + basicAuthPassword?: #Secret +} + +DingdingIntegration: BaseIntegration & { + url?: string + msgType?: string + title?: string + message?: string +} + +DiscordIntegration: BaseIntegration & { + url: #Secret + title?: string + message?: string + avatar_url?: string + use_discord_username?: bool +} + +EmailIntegration: BaseIntegration & { + addresses: [...string] + singleEmail?: bool + message?: string + subject?: string +} + +GooglechatIntegration: BaseIntegration & { + url: #Secret + title?: string + message?: string +} + +JiraIntegration: BaseIntegration & { + api_url: string + project: string + issue_type: string + + summary?: string + description?: string + labels?: [...string] + priority?: string + reopen_transition?: string + resolve_transition?: string + wont_fix_resolution?: string + reopen_duration?: string + dedup_key_field?: string + fields?: {} + + user?: #Secret + password?: #Secret + api_token?: #Secret +} + +KafkaIntegration: BaseIntegration & { + kafkaRestProxy: #Secret + kafkaTopic: string + + description?: string + details?: string + username?: string + password?: #Secret + apiVersion?: string + kafkaClusterId?: string +} + +LineIntegration: BaseIntegration & { + token: #Secret + + title?: string + description?: string +} + +#TLSConfig: { + insecureSkipVerify?: bool + caCertificate?: #Secret + clientCertificate?: #Secret + clientKey?: #Secret +} + +MqttIntegration: BaseIntegration & { + brokerUrl?: string + clientId?: string + topic?: string + message?: string + messageFormat?: string + username?: string + password?: #Secret + qos?: int64 + retain?: bool + tlsConfig?: #TLSConfig +} + +OnCallIntegration: BaseIntegration & { + url: string + + httpMethod?: string + maxAlerts?: int64 + authorization_scheme?: string + authorization_credentials?: #Secret + username?: string + password?: #Secret + title?: string + message?: string +} + +OpsgenieIntegrationResponder: { + id?: string + name?: string + username?: string + type: string +} + +OpsgenieIntegration: BaseIntegration & { + apiKey: #Secret + + apiUrl?: string + message?: string + description?: string + autoClose?: bool + overridePriority?: bool + sendTagsAs?: string + responders?: [...OpsgenieIntegrationResponder] +} + +PagerdutyIntegration: BaseIntegration & { + integrationKey: #Secret + + severity?: string + class?: string + component?: string + group?: string + summary?: string + source?: string + client?: string + client_url?: string + details?: {[string]: string} + url?: string +} + +PushoverIntegration: BaseIntegration & { + userKey: #Secret + apiToken: #Secret + + priority?: int64 + okPriority?: int64 + retry?: int64 + expire?: int64 + device?: string + sound?: string + okSound?: string + title?: string + message?: string + uploadImage?: bool +} + +SensugoIntegration: BaseIntegration & { + url: string + apikey: #Secret + + entity?: string + check?: string + namespace?: string + handler?: string + message?: string +} + +#SigV4Config: { + region?: string + access_key?: #Secret + secret_key?: #Secret + profile?: string + role_arn?: string +} + +SnsIntegration: BaseIntegration & { + api_url?: string + sigv4: #SigV4Config + topic_arn?: string + phone_number?: string + target_arn?: string + subject?: string + message?: string + attributes?: {[string]: string} +} + +SlackIntegration: BaseIntegration & { + endpointUrl?: string + url?: #Secret + token?: #Secret + recipient?: string + text?: string + title?: string + username?: string + icon_emoji?: string + icon_url?: string + mentionChannel?: string + mentionUsers?: string + mentionGroups?: string + color?: string +} + +TelegramIntegration: BaseIntegration & { + bottoken: #Secret + chatid: string + message_thread_id: string + + message?: string + parse_mode?: string + disable_web_page_preview?: bool + protect_content?: bool + disable_notifications?: bool +} + +TeamsIntegration: BaseIntegration & { + url: #Secret + + message?: string + title?: string + sectiontitle?: string +} + +ThreemaIntegration: BaseIntegration & { + gateway_id: string + recipient_id: string + api_secret: #Secret + + title?: string + description?: string +} + +VictoropsIntegration: BaseIntegration & { + url: #Secret + + messageType?: string + title?: string + description?: string +} + +WebexIntegration: BaseIntegration & { + bot_token: #Secret + + api_url?: string + message?: string + room_id?: string +} + +#CustomPayload: { + template?: string + vars?: {[string]: string} +} + +#HMACConfig: { + secret?: #Secret + header: string + timestampHeader: string +} + +WebhookIntegration: BaseIntegration & { + url: string + + httpMethod?: string + maxAlerts?: int64 + authorization_scheme?: string + authorization_credentials?: #Secret + username?: string + password?: #Secret + headers?: {[string]: string} + title?: string + message?: string + tlsConfig?: #TLSConfig + hmacConfig?: #HMACConfig + payload?: #CustomPayload +} + +WecomIntegration: BaseIntegration & { + endpointUrl?: string + url?: #Secret + secret?: #Secret + agent_id?: string + corp_id?: string + message?: string + title?: string + msgtype?: string + touser?: string +} + +ReceiverSpec: { + title: string + alertmanager?: [...AlertmanagerIntegration] + dingding?: [...DingdingIntegration] + discord?: [...DiscordIntegration] + email?: [...EmailIntegration] + googlechat?: [...GooglechatIntegration] + jira?: [...JiraIntegration] + kafka?: [...KafkaIntegration] + line?: [...LineIntegration] + mqtt?: [...MqttIntegration] + opsgenie?: [...OpsgenieIntegration] + pagerduty?: [...PagerdutyIntegration] + oncall?: [...OnCallIntegration] + pushover?: [...PushoverIntegration] + sensugo?: [...SensugoIntegration] + slack?: [...SlackIntegration] + sns?: [...SnsIntegration] + teams?: [...TeamsIntegration] + telegram?: [...TelegramIntegration] + threema?: [...ThreemaIntegration] + victorops?: [...VictoropsIntegration] + webhook?: [...WebhookIntegration] + wecom?: [...WecomIntegration] + webex?: [...WebexIntegration] +} \ No newline at end of file diff --git a/apps/alerting/notifications/pkg/apis/alerting_manifest.go b/apps/alerting/notifications/pkg/apis/alerting_manifest.go index 9e40415b859..38ad0981c9e 100644 --- a/apps/alerting/notifications/pkg/apis/alerting_manifest.go +++ b/apps/alerting/notifications/pkg/apis/alerting_manifest.go @@ -28,6 +28,13 @@ var appManifestData = app.ManifestData{ "spec.title", }, }, + + { + Name: "v0alpha2", + SelectableFields: []string{ + "spec.title", + }, + }, }, }, diff --git a/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/constants.go b/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/constants.go new file mode 100644 index 00000000000..021d0d45578 --- /dev/null +++ b/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/constants.go @@ -0,0 +1,18 @@ +package v0alpha2 + +import "k8s.io/apimachinery/pkg/runtime/schema" + +const ( + // Group is the API group used by all kinds in this package + Group = "notifications.alerting.grafana.app" + // Version is the API version used by all kinds in this package + Version = "v0alpha2" +) + +var ( + // GroupVersion is a schema.GroupVersion consisting of the Group and Version constants for this package + GroupVersion = schema.GroupVersion{ + Group: Group, + Version: Version, + } +) diff --git a/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_codec_gen.go b/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_codec_gen.go new file mode 100644 index 00000000000..0a5380e5b98 --- /dev/null +++ b/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_codec_gen.go @@ -0,0 +1,28 @@ +// +// Code generated by grafana-app-sdk. DO NOT EDIT. +// + +package v0alpha2 + +import ( + "encoding/json" + "io" + + "github.com/grafana/grafana-app-sdk/resource" +) + +// JSONCodec is an implementation of resource.Codec for kubernetes JSON encoding +type JSONCodec struct{} + +// Read reads JSON-encoded bytes from `reader` and unmarshals them into `into` +func (*JSONCodec) Read(reader io.Reader, into resource.Object) error { + return json.NewDecoder(reader).Decode(into) +} + +// Write writes JSON-encoded bytes into `writer` marshaled from `from` +func (*JSONCodec) Write(writer io.Writer, from resource.Object) error { + return json.NewEncoder(writer).Encode(from) +} + +// Interface compliance checks +var _ resource.Codec = &JSONCodec{} diff --git a/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_metadata_gen.go b/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_metadata_gen.go new file mode 100644 index 00000000000..50792872785 --- /dev/null +++ b/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_metadata_gen.go @@ -0,0 +1,28 @@ +// Code generated - EDITING IS FUTILE. DO NOT EDIT. + +package v0alpha2 + +import ( + time "time" +) + +// metadata contains embedded CommonMetadata and can be extended with custom string fields +// TODO: use CommonMetadata instead of redefining here; currently needs to be defined here +// without external reference as using the CommonMetadata reference breaks thema codegen. +type Metadata struct { + UpdateTimestamp time.Time `json:"updateTimestamp"` + CreatedBy string `json:"createdBy"` + Uid string `json:"uid"` + CreationTimestamp time.Time `json:"creationTimestamp"` + DeletionTimestamp *time.Time `json:"deletionTimestamp,omitempty"` + Finalizers []string `json:"finalizers"` + ResourceVersion string `json:"resourceVersion"` + Generation int64 `json:"generation"` + UpdatedBy string `json:"updatedBy"` + Labels map[string]string `json:"labels"` +} + +// NewMetadata creates a new Metadata object. +func NewMetadata() *Metadata { + return &Metadata{} +} diff --git a/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_object_gen.go b/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_object_gen.go new file mode 100644 index 00000000000..449c7b4a8ba --- /dev/null +++ b/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_object_gen.go @@ -0,0 +1,319 @@ +// +// Code generated by grafana-app-sdk. DO NOT EDIT. +// + +package v0alpha2 + +import ( + "fmt" + "github.com/grafana/grafana-app-sdk/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "time" +) + +// +k8s:openapi-gen=true +type Receiver struct { + metav1.TypeMeta `json:",inline" yaml:",inline"` + metav1.ObjectMeta `json:"metadata" yaml:"metadata"` + + // Spec is the spec of the Receiver + Spec Spec `json:"spec" yaml:"spec"` + + Status Status `json:"status" yaml:"status"` +} + +func (o *Receiver) GetSpec() any { + return o.Spec +} + +func (o *Receiver) SetSpec(spec any) error { + cast, ok := spec.(Spec) + if !ok { + return fmt.Errorf("cannot set spec type %#v, not of type Spec", spec) + } + o.Spec = cast + return nil +} + +func (o *Receiver) GetSubresources() map[string]any { + return map[string]any{ + "status": o.Status, + } +} + +func (o *Receiver) GetSubresource(name string) (any, bool) { + switch name { + case "status": + return o.Status, true + default: + return nil, false + } +} + +func (o *Receiver) SetSubresource(name string, value any) error { + switch name { + case "status": + cast, ok := value.(Status) + if !ok { + return fmt.Errorf("cannot set status type %#v, not of type Status", value) + } + o.Status = cast + return nil + default: + return fmt.Errorf("subresource '%s' does not exist", name) + } +} + +func (o *Receiver) GetStaticMetadata() resource.StaticMetadata { + gvk := o.GroupVersionKind() + return resource.StaticMetadata{ + Name: o.ObjectMeta.Name, + Namespace: o.ObjectMeta.Namespace, + Group: gvk.Group, + Version: gvk.Version, + Kind: gvk.Kind, + } +} + +func (o *Receiver) SetStaticMetadata(metadata resource.StaticMetadata) { + o.Name = metadata.Name + o.Namespace = metadata.Namespace + o.SetGroupVersionKind(schema.GroupVersionKind{ + Group: metadata.Group, + Version: metadata.Version, + Kind: metadata.Kind, + }) +} + +func (o *Receiver) GetCommonMetadata() resource.CommonMetadata { + dt := o.DeletionTimestamp + var deletionTimestamp *time.Time + if dt != nil { + deletionTimestamp = &dt.Time + } + // Legacy ExtraFields support + extraFields := make(map[string]any) + if o.Annotations != nil { + extraFields["annotations"] = o.Annotations + } + if o.ManagedFields != nil { + extraFields["managedFields"] = o.ManagedFields + } + if o.OwnerReferences != nil { + extraFields["ownerReferences"] = o.OwnerReferences + } + return resource.CommonMetadata{ + UID: string(o.UID), + ResourceVersion: o.ResourceVersion, + Generation: o.Generation, + Labels: o.Labels, + CreationTimestamp: o.CreationTimestamp.Time, + DeletionTimestamp: deletionTimestamp, + Finalizers: o.Finalizers, + UpdateTimestamp: o.GetUpdateTimestamp(), + CreatedBy: o.GetCreatedBy(), + UpdatedBy: o.GetUpdatedBy(), + ExtraFields: extraFields, + } +} + +func (o *Receiver) SetCommonMetadata(metadata resource.CommonMetadata) { + o.UID = types.UID(metadata.UID) + o.ResourceVersion = metadata.ResourceVersion + o.Generation = metadata.Generation + o.Labels = metadata.Labels + o.CreationTimestamp = metav1.NewTime(metadata.CreationTimestamp) + if metadata.DeletionTimestamp != nil { + dt := metav1.NewTime(*metadata.DeletionTimestamp) + o.DeletionTimestamp = &dt + } else { + o.DeletionTimestamp = nil + } + o.Finalizers = metadata.Finalizers + if o.Annotations == nil { + o.Annotations = make(map[string]string) + } + if !metadata.UpdateTimestamp.IsZero() { + o.SetUpdateTimestamp(metadata.UpdateTimestamp) + } + if metadata.CreatedBy != "" { + o.SetCreatedBy(metadata.CreatedBy) + } + if metadata.UpdatedBy != "" { + o.SetUpdatedBy(metadata.UpdatedBy) + } + // Legacy support for setting Annotations, ManagedFields, and OwnerReferences via ExtraFields + if metadata.ExtraFields != nil { + if annotations, ok := metadata.ExtraFields["annotations"]; ok { + if cast, ok := annotations.(map[string]string); ok { + o.Annotations = cast + } + } + if managedFields, ok := metadata.ExtraFields["managedFields"]; ok { + if cast, ok := managedFields.([]metav1.ManagedFieldsEntry); ok { + o.ManagedFields = cast + } + } + if ownerReferences, ok := metadata.ExtraFields["ownerReferences"]; ok { + if cast, ok := ownerReferences.([]metav1.OwnerReference); ok { + o.OwnerReferences = cast + } + } + } +} + +func (o *Receiver) GetCreatedBy() string { + if o.ObjectMeta.Annotations == nil { + o.ObjectMeta.Annotations = make(map[string]string) + } + + return o.ObjectMeta.Annotations["grafana.com/createdBy"] +} + +func (o *Receiver) SetCreatedBy(createdBy string) { + if o.ObjectMeta.Annotations == nil { + o.ObjectMeta.Annotations = make(map[string]string) + } + + o.ObjectMeta.Annotations["grafana.com/createdBy"] = createdBy +} + +func (o *Receiver) GetUpdateTimestamp() time.Time { + if o.ObjectMeta.Annotations == nil { + o.ObjectMeta.Annotations = make(map[string]string) + } + + parsed, _ := time.Parse(time.RFC3339, o.ObjectMeta.Annotations["grafana.com/updateTimestamp"]) + return parsed +} + +func (o *Receiver) SetUpdateTimestamp(updateTimestamp time.Time) { + if o.ObjectMeta.Annotations == nil { + o.ObjectMeta.Annotations = make(map[string]string) + } + + o.ObjectMeta.Annotations["grafana.com/updateTimestamp"] = updateTimestamp.Format(time.RFC3339) +} + +func (o *Receiver) GetUpdatedBy() string { + if o.ObjectMeta.Annotations == nil { + o.ObjectMeta.Annotations = make(map[string]string) + } + + return o.ObjectMeta.Annotations["grafana.com/updatedBy"] +} + +func (o *Receiver) SetUpdatedBy(updatedBy string) { + if o.ObjectMeta.Annotations == nil { + o.ObjectMeta.Annotations = make(map[string]string) + } + + o.ObjectMeta.Annotations["grafana.com/updatedBy"] = updatedBy +} + +func (o *Receiver) Copy() resource.Object { + return resource.CopyObject(o) +} + +func (o *Receiver) DeepCopyObject() runtime.Object { + return o.Copy() +} + +func (o *Receiver) DeepCopy() *Receiver { + cpy := &Receiver{} + o.DeepCopyInto(cpy) + return cpy +} + +func (o *Receiver) DeepCopyInto(dst *Receiver) { + dst.TypeMeta.APIVersion = o.TypeMeta.APIVersion + dst.TypeMeta.Kind = o.TypeMeta.Kind + o.ObjectMeta.DeepCopyInto(&dst.ObjectMeta) + o.Spec.DeepCopyInto(&dst.Spec) + o.Status.DeepCopyInto(&dst.Status) +} + +// Interface compliance compile-time check +var _ resource.Object = &Receiver{} + +// +k8s:openapi-gen=true +type ReceiverList struct { + metav1.TypeMeta `json:",inline" yaml:",inline"` + metav1.ListMeta `json:"metadata" yaml:"metadata"` + Items []Receiver `json:"items" yaml:"items"` +} + +func (o *ReceiverList) DeepCopyObject() runtime.Object { + return o.Copy() +} + +func (o *ReceiverList) Copy() resource.ListObject { + cpy := &ReceiverList{ + TypeMeta: o.TypeMeta, + Items: make([]Receiver, len(o.Items)), + } + o.ListMeta.DeepCopyInto(&cpy.ListMeta) + for i := 0; i < len(o.Items); i++ { + if item, ok := o.Items[i].Copy().(*Receiver); ok { + cpy.Items[i] = *item + } + } + return cpy +} + +func (o *ReceiverList) GetItems() []resource.Object { + items := make([]resource.Object, len(o.Items)) + for i := 0; i < len(o.Items); i++ { + items[i] = &o.Items[i] + } + return items +} + +func (o *ReceiverList) SetItems(items []resource.Object) { + o.Items = make([]Receiver, len(items)) + for i := 0; i < len(items); i++ { + o.Items[i] = *items[i].(*Receiver) + } +} + +func (o *ReceiverList) DeepCopy() *ReceiverList { + cpy := &ReceiverList{} + o.DeepCopyInto(cpy) + return cpy +} + +func (o *ReceiverList) DeepCopyInto(dst *ReceiverList) { + resource.CopyObjectInto(dst, o) +} + +// Interface compliance compile-time check +var _ resource.ListObject = &ReceiverList{} + +// Copy methods for all subresource types + +// DeepCopy creates a full deep copy of Spec +func (s *Spec) DeepCopy() *Spec { + cpy := &Spec{} + s.DeepCopyInto(cpy) + return cpy +} + +// DeepCopyInto deep copies Spec into another Spec object +func (s *Spec) DeepCopyInto(dst *Spec) { + resource.CopyObjectInto(dst, s) +} + +// DeepCopy creates a full deep copy of Status +func (s *Status) DeepCopy() *Status { + cpy := &Status{} + s.DeepCopyInto(cpy) + return cpy +} + +// DeepCopyInto deep copies Status into another Status object +func (s *Status) DeepCopyInto(dst *Status) { + resource.CopyObjectInto(dst, s) +} diff --git a/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_schema_gen.go b/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_schema_gen.go new file mode 100644 index 00000000000..d0e9a2214e3 --- /dev/null +++ b/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_schema_gen.go @@ -0,0 +1,46 @@ +// +// Code generated by grafana-app-sdk. DO NOT EDIT. +// + +package v0alpha2 + +import ( + "fmt" + + "github.com/grafana/grafana-app-sdk/resource" +) + +// schema is unexported to prevent accidental overwrites +var ( + schemaReceiver = resource.NewSimpleSchema("notifications.alerting.grafana.app", "v0alpha2", &Receiver{}, &ReceiverList{}, resource.WithKind("Receiver"), + resource.WithPlural("receivers"), resource.WithScope(resource.NamespacedScope), resource.WithSelectableFields([]resource.SelectableField{resource.SelectableField{ + FieldSelector: "spec.title", + FieldValueFunc: func(o resource.Object) (string, error) { + cast, ok := o.(*Receiver) + if !ok { + return "", fmt.Errorf("provided object must be of type *Receiver") + } + return cast.Spec.Title, nil + }, + }, + })) + kindReceiver = resource.Kind{ + Schema: schemaReceiver, + Codecs: map[resource.KindEncoding]resource.Codec{ + resource.KindEncodingJSON: &JSONCodec{}, + }, + } +) + +// Kind returns a resource.Kind for this Schema with a JSON codec +func Kind() resource.Kind { + return kindReceiver +} + +// Schema returns a resource.SimpleSchema representation of Receiver +func Schema() *resource.SimpleSchema { + return schemaReceiver +} + +// Interface compliance checks +var _ resource.Schema = kindReceiver diff --git a/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_spec_gen.go b/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_spec_gen.go new file mode 100644 index 00000000000..ac810987741 --- /dev/null +++ b/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_spec_gen.go @@ -0,0 +1,529 @@ +// Code generated - EDITING IS FUTILE. DO NOT EDIT. + +package v0alpha2 + +// +k8s:openapi-gen=true +type AlertmanagerIntegration struct { + Uid *string `json:"uid,omitempty"` + Url string `json:"url"` + BasicAuthUser *string `json:"basicAuthUser,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + BasicAuthPassword *Secret `json:"basicAuthPassword,omitempty"` +} + +// NewAlertmanagerIntegration creates a new AlertmanagerIntegration object. +func NewAlertmanagerIntegration() *AlertmanagerIntegration { + return &AlertmanagerIntegration{} +} + +// A string that contain sensitive information. +// +k8s:openapi-gen=true +type Secret string + +// +k8s:openapi-gen=true +type DingdingIntegration struct { + Uid *string `json:"uid,omitempty"` + Url *string `json:"url,omitempty"` + MsgType *string `json:"msgType,omitempty"` + Title *string `json:"title,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Message *string `json:"message,omitempty"` +} + +// NewDingdingIntegration creates a new DingdingIntegration object. +func NewDingdingIntegration() *DingdingIntegration { + return &DingdingIntegration{} +} + +// +k8s:openapi-gen=true +type DiscordIntegration struct { + Uid *string `json:"uid,omitempty"` + Url Secret `json:"url"` + Title *string `json:"title,omitempty"` + Message *string `json:"message,omitempty"` + AvatarUrl *string `json:"avatar_url,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + UseDiscordUsername *bool `json:"use_discord_username,omitempty"` +} + +// NewDiscordIntegration creates a new DiscordIntegration object. +func NewDiscordIntegration() *DiscordIntegration { + return &DiscordIntegration{} +} + +// +k8s:openapi-gen=true +type EmailIntegration struct { + Uid *string `json:"uid,omitempty"` + Addresses []string `json:"addresses"` + SingleEmail *bool `json:"singleEmail,omitempty"` + Message *string `json:"message,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Subject *string `json:"subject,omitempty"` +} + +// NewEmailIntegration creates a new EmailIntegration object. +func NewEmailIntegration() *EmailIntegration { + return &EmailIntegration{} +} + +// +k8s:openapi-gen=true +type GooglechatIntegration struct { + Uid *string `json:"uid,omitempty"` + Url Secret `json:"url"` + Title *string `json:"title,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Message *string `json:"message,omitempty"` +} + +// NewGooglechatIntegration creates a new GooglechatIntegration object. +func NewGooglechatIntegration() *GooglechatIntegration { + return &GooglechatIntegration{} +} + +// +k8s:openapi-gen=true +type JiraIntegration struct { + Uid *string `json:"uid,omitempty"` + ApiUrl string `json:"api_url"` + Project string `json:"project"` + IssueType string `json:"issue_type"` + Summary *string `json:"summary,omitempty"` + Description *string `json:"description,omitempty"` + Labels []string `json:"labels,omitempty"` + Priority *string `json:"priority,omitempty"` + ReopenTransition *string `json:"reopen_transition,omitempty"` + ResolveTransition *string `json:"resolve_transition,omitempty"` + WontFixResolution *string `json:"wont_fix_resolution,omitempty"` + ReopenDuration *string `json:"reopen_duration,omitempty"` + DedupKeyField *string `json:"dedup_key_field,omitempty"` + Fields interface{} `json:"fields,omitempty"` + User *Secret `json:"user,omitempty"` + Password *Secret `json:"password,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + ApiToken *Secret `json:"api_token,omitempty"` +} + +// NewJiraIntegration creates a new JiraIntegration object. +func NewJiraIntegration() *JiraIntegration { + return &JiraIntegration{} +} + +// +k8s:openapi-gen=true +type KafkaIntegration struct { + Uid *string `json:"uid,omitempty"` + KafkaRestProxy Secret `json:"kafkaRestProxy"` + KafkaTopic string `json:"kafkaTopic"` + Description *string `json:"description,omitempty"` + Details *string `json:"details,omitempty"` + Username *string `json:"username,omitempty"` + Password *Secret `json:"password,omitempty"` + ApiVersion *string `json:"apiVersion,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + KafkaClusterId *string `json:"kafkaClusterId,omitempty"` +} + +// NewKafkaIntegration creates a new KafkaIntegration object. +func NewKafkaIntegration() *KafkaIntegration { + return &KafkaIntegration{} +} + +// +k8s:openapi-gen=true +type LineIntegration struct { + Uid *string `json:"uid,omitempty"` + Token Secret `json:"token"` + Title *string `json:"title,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Description *string `json:"description,omitempty"` +} + +// NewLineIntegration creates a new LineIntegration object. +func NewLineIntegration() *LineIntegration { + return &LineIntegration{} +} + +// +k8s:openapi-gen=true +type MqttIntegration struct { + Uid *string `json:"uid,omitempty"` + BrokerUrl *string `json:"brokerUrl,omitempty"` + ClientId *string `json:"clientId,omitempty"` + Topic *string `json:"topic,omitempty"` + Message *string `json:"message,omitempty"` + MessageFormat *string `json:"messageFormat,omitempty"` + Username *string `json:"username,omitempty"` + Password *Secret `json:"password,omitempty"` + Qos *int64 `json:"qos,omitempty"` + Retain *bool `json:"retain,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + TlsConfig *TLSConfig `json:"tlsConfig,omitempty"` +} + +// NewMqttIntegration creates a new MqttIntegration object. +func NewMqttIntegration() *MqttIntegration { + return &MqttIntegration{} +} + +// +k8s:openapi-gen=true +type TLSConfig struct { + InsecureSkipVerify *bool `json:"insecureSkipVerify,omitempty"` + CaCertificate *Secret `json:"caCertificate,omitempty"` + ClientCertificate *Secret `json:"clientCertificate,omitempty"` + ClientKey *Secret `json:"clientKey,omitempty"` +} + +// NewTLSConfig creates a new TLSConfig object. +func NewTLSConfig() *TLSConfig { + return &TLSConfig{} +} + +// +k8s:openapi-gen=true +type OpsgenieIntegration struct { + Uid *string `json:"uid,omitempty"` + ApiKey Secret `json:"apiKey"` + ApiUrl *string `json:"apiUrl,omitempty"` + Message *string `json:"message,omitempty"` + Description *string `json:"description,omitempty"` + AutoClose *bool `json:"autoClose,omitempty"` + OverridePriority *bool `json:"overridePriority,omitempty"` + SendTagsAs *string `json:"sendTagsAs,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Responders []OpsgenieIntegrationResponder `json:"responders,omitempty"` +} + +// NewOpsgenieIntegration creates a new OpsgenieIntegration object. +func NewOpsgenieIntegration() *OpsgenieIntegration { + return &OpsgenieIntegration{} +} + +// +k8s:openapi-gen=true +type OpsgenieIntegrationResponder struct { + Id *string `json:"id,omitempty"` + Name *string `json:"name,omitempty"` + Username *string `json:"username,omitempty"` + Type string `json:"type"` +} + +// NewOpsgenieIntegrationResponder creates a new OpsgenieIntegrationResponder object. +func NewOpsgenieIntegrationResponder() *OpsgenieIntegrationResponder { + return &OpsgenieIntegrationResponder{} +} + +// +k8s:openapi-gen=true +type PagerdutyIntegration struct { + Uid *string `json:"uid,omitempty"` + IntegrationKey Secret `json:"integrationKey"` + Severity *string `json:"severity,omitempty"` + Class *string `json:"class,omitempty"` + Component *string `json:"component,omitempty"` + Group *string `json:"group,omitempty"` + Summary *string `json:"summary,omitempty"` + Source *string `json:"source,omitempty"` + Client *string `json:"client,omitempty"` + ClientUrl *string `json:"client_url,omitempty"` + Details map[string]string `json:"details,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Url *string `json:"url,omitempty"` +} + +// NewPagerdutyIntegration creates a new PagerdutyIntegration object. +func NewPagerdutyIntegration() *PagerdutyIntegration { + return &PagerdutyIntegration{} +} + +// +k8s:openapi-gen=true +type OnCallIntegration struct { + Uid *string `json:"uid,omitempty"` + Url string `json:"url"` + HttpMethod *string `json:"httpMethod,omitempty"` + MaxAlerts *int64 `json:"maxAlerts,omitempty"` + AuthorizationScheme *string `json:"authorization_scheme,omitempty"` + AuthorizationCredentials *Secret `json:"authorization_credentials,omitempty"` + Username *string `json:"username,omitempty"` + Password *Secret `json:"password,omitempty"` + Title *string `json:"title,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Message *string `json:"message,omitempty"` +} + +// NewOnCallIntegration creates a new OnCallIntegration object. +func NewOnCallIntegration() *OnCallIntegration { + return &OnCallIntegration{} +} + +// +k8s:openapi-gen=true +type PushoverIntegration struct { + Uid *string `json:"uid,omitempty"` + UserKey Secret `json:"userKey"` + ApiToken Secret `json:"apiToken"` + Priority *int64 `json:"priority,omitempty"` + OkPriority *int64 `json:"okPriority,omitempty"` + Retry *int64 `json:"retry,omitempty"` + Expire *int64 `json:"expire,omitempty"` + Device *string `json:"device,omitempty"` + Sound *string `json:"sound,omitempty"` + OkSound *string `json:"okSound,omitempty"` + Title *string `json:"title,omitempty"` + Message *string `json:"message,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + UploadImage *bool `json:"uploadImage,omitempty"` +} + +// NewPushoverIntegration creates a new PushoverIntegration object. +func NewPushoverIntegration() *PushoverIntegration { + return &PushoverIntegration{} +} + +// +k8s:openapi-gen=true +type SensugoIntegration struct { + Uid *string `json:"uid,omitempty"` + Url string `json:"url"` + Apikey Secret `json:"apikey"` + Entity *string `json:"entity,omitempty"` + Check *string `json:"check,omitempty"` + Namespace *string `json:"namespace,omitempty"` + Handler *string `json:"handler,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Message *string `json:"message,omitempty"` +} + +// NewSensugoIntegration creates a new SensugoIntegration object. +func NewSensugoIntegration() *SensugoIntegration { + return &SensugoIntegration{} +} + +// +k8s:openapi-gen=true +type SlackIntegration struct { + Uid *string `json:"uid,omitempty"` + EndpointUrl *string `json:"endpointUrl,omitempty"` + Url *Secret `json:"url,omitempty"` + Token *Secret `json:"token,omitempty"` + Recipient *string `json:"recipient,omitempty"` + Text *string `json:"text,omitempty"` + Title *string `json:"title,omitempty"` + Username *string `json:"username,omitempty"` + IconEmoji *string `json:"icon_emoji,omitempty"` + IconUrl *string `json:"icon_url,omitempty"` + MentionChannel *string `json:"mentionChannel,omitempty"` + MentionUsers *string `json:"mentionUsers,omitempty"` + MentionGroups *string `json:"mentionGroups,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Color *string `json:"color,omitempty"` +} + +// NewSlackIntegration creates a new SlackIntegration object. +func NewSlackIntegration() *SlackIntegration { + return &SlackIntegration{} +} + +// +k8s:openapi-gen=true +type SnsIntegration struct { + Uid *string `json:"uid,omitempty"` + ApiUrl *string `json:"api_url,omitempty"` + Sigv4 SigV4Config `json:"sigv4"` + TopicArn *string `json:"topic_arn,omitempty"` + PhoneNumber *string `json:"phone_number,omitempty"` + TargetArn *string `json:"target_arn,omitempty"` + Subject *string `json:"subject,omitempty"` + Message *string `json:"message,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Attributes map[string]string `json:"attributes,omitempty"` +} + +// NewSnsIntegration creates a new SnsIntegration object. +func NewSnsIntegration() *SnsIntegration { + return &SnsIntegration{ + Sigv4: *NewSigV4Config(), + } +} + +// +k8s:openapi-gen=true +type SigV4Config struct { + Region *string `json:"region,omitempty"` + AccessKey *Secret `json:"access_key,omitempty"` + SecretKey *Secret `json:"secret_key,omitempty"` + Profile *string `json:"profile,omitempty"` + RoleArn *string `json:"role_arn,omitempty"` +} + +// NewSigV4Config creates a new SigV4Config object. +func NewSigV4Config() *SigV4Config { + return &SigV4Config{} +} + +// +k8s:openapi-gen=true +type TeamsIntegration struct { + Uid *string `json:"uid,omitempty"` + Url Secret `json:"url"` + Message *string `json:"message,omitempty"` + Title *string `json:"title,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Sectiontitle *string `json:"sectiontitle,omitempty"` +} + +// NewTeamsIntegration creates a new TeamsIntegration object. +func NewTeamsIntegration() *TeamsIntegration { + return &TeamsIntegration{} +} + +// +k8s:openapi-gen=true +type TelegramIntegration struct { + Uid *string `json:"uid,omitempty"` + Bottoken Secret `json:"bottoken"` + Chatid string `json:"chatid"` + MessageThreadId string `json:"message_thread_id"` + Message *string `json:"message,omitempty"` + ParseMode *string `json:"parse_mode,omitempty"` + DisableWebPagePreview *bool `json:"disable_web_page_preview,omitempty"` + ProtectContent *bool `json:"protect_content,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + DisableNotifications *bool `json:"disable_notifications,omitempty"` +} + +// NewTelegramIntegration creates a new TelegramIntegration object. +func NewTelegramIntegration() *TelegramIntegration { + return &TelegramIntegration{} +} + +// +k8s:openapi-gen=true +type ThreemaIntegration struct { + Uid *string `json:"uid,omitempty"` + GatewayId string `json:"gateway_id"` + RecipientId string `json:"recipient_id"` + ApiSecret Secret `json:"api_secret"` + Title *string `json:"title,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Description *string `json:"description,omitempty"` +} + +// NewThreemaIntegration creates a new ThreemaIntegration object. +func NewThreemaIntegration() *ThreemaIntegration { + return &ThreemaIntegration{} +} + +// +k8s:openapi-gen=true +type VictoropsIntegration struct { + Uid *string `json:"uid,omitempty"` + Url Secret `json:"url"` + MessageType *string `json:"messageType,omitempty"` + Title *string `json:"title,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Description *string `json:"description,omitempty"` +} + +// NewVictoropsIntegration creates a new VictoropsIntegration object. +func NewVictoropsIntegration() *VictoropsIntegration { + return &VictoropsIntegration{} +} + +// +k8s:openapi-gen=true +type WebhookIntegration struct { + Uid *string `json:"uid,omitempty"` + Url string `json:"url"` + HttpMethod *string `json:"httpMethod,omitempty"` + MaxAlerts *int64 `json:"maxAlerts,omitempty"` + AuthorizationScheme *string `json:"authorization_scheme,omitempty"` + AuthorizationCredentials *Secret `json:"authorization_credentials,omitempty"` + Username *string `json:"username,omitempty"` + Password *Secret `json:"password,omitempty"` + Headers map[string]string `json:"headers,omitempty"` + Title *string `json:"title,omitempty"` + Message *string `json:"message,omitempty"` + TlsConfig *TLSConfig `json:"tlsConfig,omitempty"` + HmacConfig *HMACConfig `json:"hmacConfig,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Payload *CustomPayload `json:"payload,omitempty"` +} + +// NewWebhookIntegration creates a new WebhookIntegration object. +func NewWebhookIntegration() *WebhookIntegration { + return &WebhookIntegration{} +} + +// +k8s:openapi-gen=true +type HMACConfig struct { + Secret *Secret `json:"secret,omitempty"` + Header string `json:"header"` + TimestampHeader string `json:"timestampHeader"` +} + +// NewHMACConfig creates a new HMACConfig object. +func NewHMACConfig() *HMACConfig { + return &HMACConfig{} +} + +// +k8s:openapi-gen=true +type CustomPayload struct { + Template *string `json:"template,omitempty"` + Vars map[string]string `json:"vars,omitempty"` +} + +// NewCustomPayload creates a new CustomPayload object. +func NewCustomPayload() *CustomPayload { + return &CustomPayload{} +} + +// +k8s:openapi-gen=true +type WecomIntegration struct { + Uid *string `json:"uid,omitempty"` + EndpointUrl *string `json:"endpointUrl,omitempty"` + Url *Secret `json:"url,omitempty"` + Secret *Secret `json:"secret,omitempty"` + AgentId *string `json:"agent_id,omitempty"` + CorpId *string `json:"corp_id,omitempty"` + Message *string `json:"message,omitempty"` + Title *string `json:"title,omitempty"` + Msgtype *string `json:"msgtype,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + Touser *string `json:"touser,omitempty"` +} + +// NewWecomIntegration creates a new WecomIntegration object. +func NewWecomIntegration() *WecomIntegration { + return &WecomIntegration{} +} + +// +k8s:openapi-gen=true +type WebexIntegration struct { + Uid *string `json:"uid,omitempty"` + BotToken Secret `json:"bot_token"` + ApiUrl *string `json:"api_url,omitempty"` + Message *string `json:"message,omitempty"` + DisableResolveMessage *bool `json:"disable_resolve_message,omitempty"` + RoomId *string `json:"room_id,omitempty"` +} + +// NewWebexIntegration creates a new WebexIntegration object. +func NewWebexIntegration() *WebexIntegration { + return &WebexIntegration{} +} + +// +k8s:openapi-gen=true +type Spec struct { + Title string `json:"title"` + Alertmanager []AlertmanagerIntegration `json:"alertmanager,omitempty"` + Dingding []DingdingIntegration `json:"dingding,omitempty"` + Discord []DiscordIntegration `json:"discord,omitempty"` + Email []EmailIntegration `json:"email,omitempty"` + Googlechat []GooglechatIntegration `json:"googlechat,omitempty"` + Jira []JiraIntegration `json:"jira,omitempty"` + Kafka []KafkaIntegration `json:"kafka,omitempty"` + Line []LineIntegration `json:"line,omitempty"` + Mqtt []MqttIntegration `json:"mqtt,omitempty"` + Opsgenie []OpsgenieIntegration `json:"opsgenie,omitempty"` + Pagerduty []PagerdutyIntegration `json:"pagerduty,omitempty"` + Oncall []OnCallIntegration `json:"oncall,omitempty"` + Pushover []PushoverIntegration `json:"pushover,omitempty"` + Sensugo []SensugoIntegration `json:"sensugo,omitempty"` + Slack []SlackIntegration `json:"slack,omitempty"` + Sns []SnsIntegration `json:"sns,omitempty"` + Teams []TeamsIntegration `json:"teams,omitempty"` + Telegram []TelegramIntegration `json:"telegram,omitempty"` + Threema []ThreemaIntegration `json:"threema,omitempty"` + Victorops []VictoropsIntegration `json:"victorops,omitempty"` + Webhook []WebhookIntegration `json:"webhook,omitempty"` + Wecom []WecomIntegration `json:"wecom,omitempty"` + Webex []WebexIntegration `json:"webex,omitempty"` +} + +// NewSpec creates a new Spec object. +func NewSpec() *Spec { + return &Spec{} +} diff --git a/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_status_gen.go b/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_status_gen.go new file mode 100644 index 00000000000..13bede518cc --- /dev/null +++ b/apps/alerting/notifications/pkg/apis/receiver/v0alpha2/receiver_status_gen.go @@ -0,0 +1,44 @@ +// Code generated - EDITING IS FUTILE. DO NOT EDIT. + +package v0alpha2 + +// +k8s:openapi-gen=true +type StatusOperatorState struct { + // lastEvaluation is the ResourceVersion last evaluated + LastEvaluation string `json:"lastEvaluation"` + // state describes the state of the lastEvaluation. + // It is limited to three possible states for machine evaluation. + State StatusOperatorStateState `json:"state"` + // descriptiveState is an optional more descriptive state field which has no requirements on format + DescriptiveState *string `json:"descriptiveState,omitempty"` + // details contains any extra information that is operator-specific + Details map[string]interface{} `json:"details,omitempty"` +} + +// NewStatusOperatorState creates a new StatusOperatorState object. +func NewStatusOperatorState() *StatusOperatorState { + return &StatusOperatorState{} +} + +// +k8s:openapi-gen=true +type Status struct { + // operatorStates is a map of operator ID to operator state evaluations. + // Any operator which consumes this kind SHOULD add its state evaluation information to this field. + OperatorStates map[string]StatusOperatorState `json:"operatorStates,omitempty"` + // additionalFields is reserved for future use + AdditionalFields map[string]interface{} `json:"additionalFields,omitempty"` +} + +// NewStatus creates a new Status object. +func NewStatus() *Status { + return &Status{} +} + +// +k8s:openapi-gen=true +type StatusOperatorStateState string + +const ( + StatusOperatorStateStateSuccess StatusOperatorStateState = "success" + StatusOperatorStateStateInProgress StatusOperatorStateState = "in_progress" + StatusOperatorStateStateFailed StatusOperatorStateState = "failed" +) diff --git a/apps/alerting/notifications/pkg/apis/type.go b/apps/alerting/notifications/pkg/apis/type.go index a6ef85658d5..c0bb8769eef 100644 --- a/apps/alerting/notifications/pkg/apis/type.go +++ b/apps/alerting/notifications/pkg/apis/type.go @@ -9,6 +9,7 @@ import ( "github.com/grafana/grafana/apps/alerting/notifications/pkg/apis/alerting/v0alpha1" receiverv0alpha1 "github.com/grafana/grafana/apps/alerting/notifications/pkg/apis/receiver/v0alpha1" + receiverv0alpha2 "github.com/grafana/grafana/apps/alerting/notifications/pkg/apis/receiver/v0alpha2" routingtreev0alpha1 "github.com/grafana/grafana/apps/alerting/notifications/pkg/apis/routingtree/v0alpha1" templategroupv0alpha1 "github.com/grafana/grafana/apps/alerting/notifications/pkg/apis/templategroup/v0alpha1" timeintervalv0alpha1 "github.com/grafana/grafana/apps/alerting/notifications/pkg/apis/timeinterval/v0alpha1" @@ -17,12 +18,14 @@ import ( func GetOpenAPIDefinitions(c common.ReferenceCallback) map[string]common.OpenAPIDefinition { tmpl := templategroupv0alpha1.GetOpenAPIDefinitions(c) tin := timeintervalv0alpha1.GetOpenAPIDefinitions(c) - recv := receiverv0alpha1.GetOpenAPIDefinitions(c) + recv1 := receiverv0alpha1.GetOpenAPIDefinitions(c) + recv2 := receiverv0alpha2.GetOpenAPIDefinitions(c) rest := routingtreev0alpha1.GetOpenAPIDefinitions(c) - result := make(map[string]common.OpenAPIDefinition, len(tmpl)+len(tin)+len(recv)+len(rest)) + result := make(map[string]common.OpenAPIDefinition, len(tmpl)+len(tin)+len(recv1)+len(rest)+len(recv2)) maps.Copy(result, tmpl) maps.Copy(result, tin) - maps.Copy(result, recv) + maps.Copy(result, recv1) + maps.Copy(result, recv2) maps.Copy(result, rest) return result } @@ -35,6 +38,9 @@ func GetKinds() map[schema.GroupVersion][]sdkResource.Kind { templategroupv0alpha1.Kind(), timeintervalv0alpha1.Kind(), }, + receiverv0alpha2.GroupVersion: { + receiverv0alpha2.Kind(), + }, } return result }