Skip to content

Commit

Permalink
feat: save history of notification sends (#557)
Browse files Browse the repository at this point in the history
* feat: save history of notification sends

[skip ci]

* feat: add more details to the send log

[skip ci]

* feat: add new job to clean notification send history older than 30days

[skip ci]

* chore: bump duty

* chore: address review comments

* chore: pass context to job starter
  • Loading branch information
adityathebe authored Sep 19, 2023
1 parent 7db359b commit 3ee6c42
Show file tree
Hide file tree
Showing 11 changed files with 192 additions and 67 deletions.
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

0 comments on commit 3ee6c42

Please sign in to comment.