Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: save history of notification sends #557

Merged
merged 6 commits into from
Sep 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmd/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ var Serve = &cobra.Command{
}
}

go jobs.Start()
go jobs.Start(api.NewContext(db.Gorm, nil))

events.StartConsumers(db.Gorm, db.Pool, events.Config{
UpstreamPush: api.UpstreamConf,
Expand Down
2 changes: 1 addition & 1 deletion events/event_queue.go
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ func (t *AsyncEventConsumer) Handle(ctx *api.Context) error {
if len(failedEvents) > 0 {
if err := tx.Create(failedEvents).Error; err != nil {
// TODO: More robust way to handle failed event insertion failures
logger.Errorf("Error inserting into table:event_queue with error:%v. %v", err)
logger.Errorf("Error inserting into table:event_queue with error: %v", err)
}
}

Expand Down
91 changes: 60 additions & 31 deletions events/notifications.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@ import (
"time"

"github.com/flanksource/commons/template"
"github.com/flanksource/commons/utils"
cUtils "github.com/flanksource/commons/utils"
"github.com/flanksource/duty"
"github.com/flanksource/duty/models"
"github.com/flanksource/incident-commander/api"
"github.com/flanksource/incident-commander/logs"
pkgNotification "github.com/flanksource/incident-commander/notification"
pkgResponder "github.com/flanksource/incident-commander/responder"
"github.com/flanksource/incident-commander/teams"
"github.com/google/uuid"
)

func NewNotificationUpdatesConsumerSync() SyncEventConsumer {
Expand Down Expand Up @@ -60,23 +62,34 @@ func NewNotificationSendConsumerAsync() AsyncEventConsumer {
func sendNotifications(ctx *api.Context, events []api.Event) []api.Event {
var failedEvents []api.Event
for _, e := range events {
if err := sendNotification(ctx, e); err != nil {
var props NotificationEventPayload
props.FromMap(e.Properties)

notificationContext := pkgNotification.NewContext(ctx, props.NotificationID)
notificationContext.WithSource(props.EventName, props.ID)
logs.IfError(notificationContext.StartLog(), "error persisting start of notification send history")

if err := sendNotification(notificationContext, e); err != nil {
e.Error = err.Error()
failedEvents = append(failedEvents, e)
notificationContext.WithError(err.Error())
}

logs.IfError(notificationContext.EndLog(), "error persisting end of notification send history")
}

return failedEvents
}

type NotificationEventProperties struct {
ID string `json:"id"` // Resource id. depends what it is based on the original event.
EventName string `json:"event_name"` // The name of the original event this notification is for.
PersonID string `json:"person_id,omitempty"` // The person recipient.
TeamID string `json:"team_id,omitempty"` // The team recipient.
NotificationName string `json:"notification_name,omitempty"` // Name of the notification of a team or a custom service of the notification.
NotificationID string `json:"notification_id,omitempty"` // ID of the notification.
EventCreatedAt time.Time `json:"event_created_at"` // Timestamp at which the original event was created
// NotificationEventPayload holds data to create a notification
type NotificationEventPayload struct {
ID uuid.UUID `json:"id"` // Resource id. depends what it is based on the original event.
EventName string `json:"event_name"` // The name of the original event this notification is for.
PersonID *uuid.UUID `json:"person_id,omitempty"` // The person recipient.
TeamID string `json:"team_id,omitempty"` // The team recipient.
NotificationName string `json:"notification_name,omitempty"` // Name of the notification of a team or a custom service of the notification.
NotificationID uuid.UUID `json:"notification_id,omitempty"` // ID of the notification.
EventCreatedAt time.Time `json:"event_created_at"` // Timestamp at which the original event was created
}

// NotificationTemplate holds in data for notification
Expand All @@ -87,14 +100,14 @@ type NotificationTemplate struct {
Properties map[string]string `template:"true"`
}

func (t *NotificationEventProperties) AsMap() map[string]string {
func (t *NotificationEventPayload) AsMap() map[string]string {
m := make(map[string]string)
b, _ := json.Marshal(&t)
_ = json.Unmarshal(b, &m)
return m
}

func (t *NotificationEventProperties) FromMap(m map[string]string) {
func (t *NotificationEventPayload) FromMap(m map[string]string) {
b, _ := json.Marshal(m)
_ = json.Unmarshal(b, &t)
}
Expand Down Expand Up @@ -168,12 +181,12 @@ Hypothesis: {{.hypothesis.title}}
return title, body
}

func sendNotification(ctx *api.Context, event api.Event) error {
var props NotificationEventProperties
func sendNotification(ctx *pkgNotification.Context, event api.Event) error {
var props NotificationEventPayload
props.FromMap(event.Properties)

originalEvent := api.Event{Name: props.EventName, CreatedAt: props.EventCreatedAt}
celEnv, err := getEnvForEvent(ctx, originalEvent, event.Properties)
celEnv, err := getEnvForEvent(ctx.Context, originalEvent, event.Properties)
if err != nil {
return err
}
Expand All @@ -187,24 +200,25 @@ func sendNotification(ctx *api.Context, event api.Event) error {
},
}

notification, err := pkgNotification.GetNotification(ctx, props.NotificationID)
notification, err := pkgNotification.GetNotification(ctx.Context, props.NotificationID.String())
if err != nil {
return err
}

defaultTitle, defaultBody := defaultTitleAndBody(props.EventName)

data := NotificationTemplate{
Title: utils.Coalesce(notification.Title, defaultTitle),
Message: utils.Coalesce(notification.Template, defaultBody),
Title: cUtils.Coalesce(notification.Title, defaultTitle),
Message: cUtils.Coalesce(notification.Template, defaultBody),
Properties: notification.Properties,
}

if err := templater.Walk(&data); err != nil {
return fmt.Errorf("error templating notification: %w", err)
}

if props.PersonID != "" {
if props.PersonID != nil {
ctx.WithPersonID(props.PersonID)
var emailAddress string
if err := ctx.DB().Model(&models.Person{}).Select("email").Where("id = ?", props.PersonID).Find(&emailAddress).Error; err != nil {
return fmt.Errorf("failed to get email of person(id=%s); %v", props.PersonID, err)
Expand All @@ -215,7 +229,7 @@ func sendNotification(ctx *api.Context, event api.Event) error {
}

if props.TeamID != "" {
teamSpec, err := teams.GetTeamSpec(ctx, props.TeamID)
teamSpec, err := teams.GetTeamSpec(ctx.Context, props.TeamID)
if err != nil {
return fmt.Errorf("failed to get team(id=%s); %v", props.TeamID, err)
}
Expand Down Expand Up @@ -291,11 +305,16 @@ func addNotificationEvent(ctx *api.Context, event api.Event) error {
}

if n.PersonID != nil {
prop := NotificationEventProperties{
resourceID, err := uuid.Parse(event.Properties["id"])
if err != nil {
return fmt.Errorf("failed to parse resource id: %v", err)
}

prop := NotificationEventPayload{
EventName: event.Name,
NotificationID: n.ID.String(),
ID: event.Properties["id"],
PersonID: n.PersonID.String(),
NotificationID: n.ID,
ID: resourceID,
PersonID: n.PersonID,
EventCreatedAt: event.CreatedAt,
}

Expand Down Expand Up @@ -325,10 +344,15 @@ func addNotificationEvent(ctx *api.Context, event api.Event) error {
continue
}

prop := NotificationEventProperties{
resourceID, err := uuid.Parse(event.Properties["id"])
if err != nil {
return fmt.Errorf("failed to parse resource id: %v", err)
}

prop := NotificationEventPayload{
EventName: event.Name,
NotificationID: n.ID.String(),
ID: event.Properties["id"],
NotificationID: n.ID,
ID: resourceID,
TeamID: n.TeamID.String(),
NotificationName: cn.Name,
}
Expand All @@ -349,10 +373,15 @@ func addNotificationEvent(ctx *api.Context, event api.Event) error {
continue
}

prop := NotificationEventProperties{
resourceID, err := uuid.Parse(event.Properties["id"])
if err != nil {
return fmt.Errorf("failed to parse resource id: %v", err)
}

prop := NotificationEventPayload{
EventName: event.Name,
NotificationID: n.ID.String(),
ID: event.Properties["id"],
NotificationID: n.ID,
ID: resourceID,
NotificationName: cn.Name,
}

Expand All @@ -362,7 +391,7 @@ func addNotificationEvent(ctx *api.Context, event api.Event) error {
}

if err := ctx.DB().Create(newEvent).Error; err != nil {
return fmt.Errorf("failed to create notification event for custom service (id=%s): %v", n.PersonID, err)
return fmt.Errorf("failed to create notification event for custom service (name:%s): %v", cn.Name, err)
}
}
}
Expand Down
12 changes: 6 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ require (
github.com/containrrr/shoutrrr v0.8.0
github.com/fergusstrange/embedded-postgres v1.23.0
github.com/flanksource/commons v1.12.0
github.com/flanksource/duty v1.0.180
github.com/flanksource/duty v1.0.181
github.com/flanksource/gomplate/v3 v3.20.12
github.com/flanksource/kopper v1.0.6
github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12
Expand Down Expand Up @@ -81,7 +81,7 @@ require (
github.com/itchyny/timefmt-go v0.1.5 // indirect
github.com/jackc/puddle/v2 v2.2.1 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/klauspost/compress v1.16.7 // indirect
github.com/klauspost/compress v1.17.0 // indirect
github.com/liamylian/jsontime/v2 v2.0.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
Expand Down Expand Up @@ -144,7 +144,7 @@ require (
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/TomOnTime/utfutil v0.0.0-20230223141146-125e65197b36
github.com/antonmedv/expr v1.15.2 // indirect
github.com/aws/aws-sdk-go v1.45.9 // indirect
github.com/aws/aws-sdk-go v1.45.11 // indirect
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect
github.com/cjlapao/common-go v0.0.39 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
Expand Down Expand Up @@ -204,18 +204,18 @@ require (
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
go.opencensus.io v0.24.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.25.0 // indirect
go.uber.org/zap v1.26.0 // indirect
golang.org/x/crypto v0.13.0
golang.org/x/net v0.15.0 // indirect
golang.org/x/oauth2 v0.12.0 // indirect
golang.org/x/sys v0.12.0 // indirect
golang.org/x/text v0.13.0 // indirect
golang.org/x/time v0.3.0 // indirect
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
google.golang.org/api v0.140.0 // indirect
google.golang.org/api v0.141.0 // indirect
google.golang.org/appengine v1.6.8 // indirect
google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb // indirect
google.golang.org/grpc v1.58.0 // indirect
google.golang.org/grpc v1.58.1 // indirect
google.golang.org/protobuf v1.31.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
Expand Down
21 changes: 21 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -644,6 +644,7 @@ github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHG
github.com/andygrunwald/go-jira v1.16.0 h1:PU7C7Fkk5L96JvPc6vDVIrd99vdPnYudHu4ju2c2ikQ=
github.com/andygrunwald/go-jira v1.16.0/go.mod h1:UQH4IBVxIYWbgagc0LF/k9FRs9xjIiQ8hIcC6HfLwFU=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves=
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18=
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM=
github.com/antonmedv/expr v1.15.2 h1:afFXpDWIC2n3bF+kTZE1JvFo+c34uaM3sTqh8z0xfdU=
Expand All @@ -658,6 +659,8 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:l
github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
github.com/aws/aws-sdk-go v1.45.9 h1:ks4nMaagM/0jeOFUxWxx9C009vkrdgm3lgcnciet1YU=
github.com/aws/aws-sdk-go v1.45.9/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
github.com/aws/aws-sdk-go v1.45.11 h1:8qiSrA12+NRr+2MVpMApi3JxtiFFjDVU1NeWe+80bYg=
github.com/aws/aws-sdk-go v1.45.11/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
Expand Down Expand Up @@ -745,6 +748,8 @@ github.com/flanksource/commons v1.12.0 h1:8B7+AbRbWH3KVFwbmXYkG3gS42pF+uVaF4lAgD
github.com/flanksource/commons v1.12.0/go.mod h1:zYEhi6E2+diQ+loVcROUHo/Bgv+Tn61W2NYmrb5MgVI=
github.com/flanksource/duty v1.0.180 h1:0s7o6t9dLNpeukdy/DN4AkOKK8+PUKKSoVhiyoRntno=
github.com/flanksource/duty v1.0.180/go.mod h1:C3eT1PfdqTdefpGRDfUzLDVjSKuYjqZbgbIqX757FbA=
github.com/flanksource/duty v1.0.181 h1:1c3Vrz9CtyjACqjTq4FQzLfN1JKXfHcVceDVMS23Wvg=
github.com/flanksource/duty v1.0.181/go.mod h1:Qc/8c6GsoJIU3K41J7J/0Ia5syM+n0yjLyNRwzGgmk4=
github.com/flanksource/gomplate/v3 v3.20.4/go.mod h1:27BNWhzzSjDed1z8YShO6W+z6G9oZXuxfNFGd/iGSdc=
github.com/flanksource/gomplate/v3 v3.20.12 h1:SLo8eLaYkUTizHIuntZ4LxxLzbRfV0NvC6DTpu9fj94=
github.com/flanksource/gomplate/v3 v3.20.12/go.mod h1:1N1aptaAo0XUaGsyU5CWiwn9GMRpbIKX1AdsypfmZYo=
Expand Down Expand Up @@ -980,6 +985,8 @@ github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mO
github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hashicorp/hcl/v2 v2.18.0 h1:wYnG7Lt31t2zYkcquwgKo6MWXzRUDIeIVU5naZwHLl8=
github.com/hashicorp/hcl/v2 v2.18.0/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
Expand Down Expand Up @@ -1037,6 +1044,8 @@ github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHU
github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM=
github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
Expand Down Expand Up @@ -1291,6 +1300,8 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c=
go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk=
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
Expand Down Expand Up @@ -1763,6 +1774,8 @@ google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0
google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg=
google.golang.org/api v0.140.0 h1:CaXNdYOH5oQQI7l6iKTHHiMTdxZca4/02hRg2U8c2hM=
google.golang.org/api v0.140.0/go.mod h1:aGbCiFgtwb2P6badchFbSBUurV6oR5d50Af4iNJtDdI=
google.golang.org/api v0.141.0 h1:Df6vfMgDoIM6ss0m7H4MPwFwY87WNXHfBIda/Bmfl4E=
google.golang.org/api v0.141.0/go.mod h1:iZqLkdPlXKyG0b90eu6KxVSE4D/ccRF2e/doKD2CnQQ=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
Expand Down Expand Up @@ -1957,6 +1970,8 @@ google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwS
google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g=
google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o=
google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0=
google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58=
google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
Expand Down Expand Up @@ -2040,14 +2055,20 @@ k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg=
k8s.io/api v0.26.4/go.mod h1:WwKEXU3R1rgCZ77AYa7DFksd9/BAIKyOmRlbVxgvjCk=
k8s.io/api v0.28.0 h1:3j3VPWmN9tTDI68NETBWlDiA9qOiGJ7sdKeufehBYsM=
k8s.io/api v0.28.0/go.mod h1:0l8NZJzB0i/etuWnIXcwfIv+xnDOhL3lLW919AWYDuY=
k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw=
k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg=
k8s.io/apiextensions-apiserver v0.27.4 h1:ie1yZG4nY/wvFMIR2hXBeSVq+HfNzib60FjnBYtPGSs=
k8s.io/apiextensions-apiserver v0.27.4/go.mod h1:KHZaDr5H9IbGEnSskEUp/DsdXe1hMQ7uzpQcYUFt2bM=
k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
k8s.io/apimachinery v0.26.4/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I=
k8s.io/apimachinery v0.28.0 h1:ScHS2AG16UlYWk63r46oU3D5y54T53cVI5mMJwwqFNA=
k8s.io/apimachinery v0.28.0/go.mod h1:X0xh/chESs2hP9koe+SdIAcXWcQ+RM5hy0ZynB+yEvw=
k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ=
k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU=
k8s.io/client-go v0.28.0 h1:ebcPRDZsCjpj62+cMk1eGNX1QkMdRmQ6lmz5BLoFWeM=
k8s.io/client-go v0.28.0/go.mod h1:0Asy9Xt3U98RypWJmU1ZrRAGKhP6NqDPmptlAzK2kMc=
k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY=
k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY=
k8s.io/component-base v0.27.4 h1:Wqc0jMKEDGjKXdae8hBXeskRP//vu1m6ypC+gwErj4c=
k8s.io/component-base v0.27.4/go.mod h1:hoiEETnLc0ioLv6WPeDt8vD34DDeB35MfQnxCARq3kY=
k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
Expand Down
Loading
Loading