diff --git a/.gitignore b/.gitignore index 960e1787..01dbe427 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .idea kubewatch +.vscode diff --git a/README.md b/README.md index c6732686..8793e35b 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ supported webhooks: - webhook - cloudevent - smtp + - webex Usage: kubewatch [flags] @@ -473,6 +474,10 @@ handler: token: "" room: "" url: "" + webex: + token: "" + room: "" + url: "" mattermost: channel: "" url: "" diff --git a/cmd/root.go b/cmd/root.go index 0295d1eb..8d21979a 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -49,6 +49,7 @@ supported webhooks: - flock - webhook - lark + - webex `, Run: func(cmd *cobra.Command, args []string) { diff --git a/config/config.go b/config/config.go index 47d3ad20..7751e076 100755 --- a/config/config.go +++ b/config/config.go @@ -47,6 +47,7 @@ type Handler struct { MSTeams MSTeams `json:"msteams"` SMTP SMTP `json:"smtp"` Lark Lark `json:"lark"` + Webex Webex `json:"webex"` } // Resource contains resource configuration @@ -128,6 +129,15 @@ type Hipchat struct { Url string `json:"url"` } +type Webex struct { + // Webex token. + Token string `json:"token"` + // Room name. + Room string `json:"room"` + // URL of the webex server. + Url string `json:"url"` +} + // Mattermost contains mattermost configuration type Mattermost struct { Channel string `json:"room"` diff --git a/config/config_test.go b/config/config_test.go index f18bae3c..f80147bb 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -17,9 +17,9 @@ limitations under the License. package config import ( -//"io/ioutil" -//"os" -//"testing" +// "io/ioutil" +// "os" +// "testing" ) var configStr = ` diff --git a/config/sample.go b/config/sample.go index 5543b4a3..dda84863 100644 --- a/config/sample.go +++ b/config/sample.go @@ -16,6 +16,13 @@ handler: room: "" # URL of the hipchat server. url: "" + webex: + # Webex token. + token: "" + # Room name. + room: "" + # URL of the webex server. + url: "" mattermost: room: "" url: "" diff --git a/docs/design.md b/docs/design.md index a66de0bd..2149ea18 100644 --- a/docs/design.md +++ b/docs/design.md @@ -38,6 +38,7 @@ With each event get from k8s and matched filtering from configuration, it is pas - `Slack`: which send notification to Slack channel based on information from config - `Smtp`: which sends notifications to email recipients using a SMTP server obtained from config - `Lark`: which sends notifications to Lark incoming webhook based on information from config + - `Webex`: which send notification to Webex room based on information from config More handlers will be added in future. diff --git a/examples/conf/kubewatch.conf.webex.yaml b/examples/conf/kubewatch.conf.webex.yaml new file mode 100644 index 00000000..aaceee5f --- /dev/null +++ b/examples/conf/kubewatch.conf.webex.yaml @@ -0,0 +1,18 @@ +handler: + webex: + enabled: true + token: token + room: room_id + url: https://webexapis.com/v1/messages +resource: + deployment: true + replicationcontroller: false + replicaset: false + daemonset: false + services: false + pod: false + job: false + persistentvolume: false + ingress: false + event: false + coreevent: false diff --git a/go.mod b/go.mod index f0d0739e..6db9e4ac 100755 --- a/go.mod +++ b/go.mod @@ -4,9 +4,9 @@ go 1.14 require ( github.com/fatih/structtag v1.2.0 - github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135 // indirect github.com/hashicorp/hcl v0.0.0-20171017181929-23c074d0eceb // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/jbogarin/go-cisco-webex-teams v0.4.3 // indirect github.com/magiconair/properties v1.7.4 // indirect github.com/mkmik/multierror v0.3.0 github.com/pelletier/go-toml v1.0.1 // indirect diff --git a/go.sum b/go.sum index 5fccc8be..d82305c4 100755 --- a/go.sum +++ b/go.sum @@ -734,6 +734,8 @@ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= +github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= @@ -802,6 +804,8 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135 h1:zLTLjkaOFEFIOxY5BWLFLwh+cL8vOBW4XJ2aqLE/Tf0= github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -875,6 +879,8 @@ github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jbogarin/go-cisco-webex-teams v0.4.3 h1:gXRwLi5qNmqNS3EXj9ikVhXWNXGzbc4RFFzOtTA1WYE= +github.com/jbogarin/go-cisco-webex-teams v0.4.3/go.mod h1:UVLsP1NjEO9QfRcZsuO6R4AD/xMJLarkLuhcehSZlAA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -953,6 +959,8 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/pelletier/go-toml v1.0.1 h1:0nx4vKBl23+hEaCOV1mFhKS9vhhBtFYWC7rQY0vJAyE= github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/peterhellberg/link v1.1.0 h1:s2+RH8EGuI/mI4QwrWGSYQCRz7uNgip9BaM04HKu5kc= +github.com/peterhellberg/link v1.1.0/go.mod h1:gtSlOT4jmkY8P47hbTc8PTgiDDWpdPbFYl75keYyBB8= github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= @@ -1213,7 +1221,9 @@ golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= diff --git a/helm/kubewatch/Chart.yaml b/helm/kubewatch/Chart.yaml index fd71aaa4..da08c2ee 100644 --- a/helm/kubewatch/Chart.yaml +++ b/helm/kubewatch/Chart.yaml @@ -19,6 +19,7 @@ keywords: - mattermost - flock - msteams + - webex maintainers: [] name: kubewatch sources: diff --git a/helm/kubewatch/README.md b/helm/kubewatch/README.md index 1ed73b71..e5811abd 100644 --- a/helm/kubewatch/README.md +++ b/helm/kubewatch/README.md @@ -84,6 +84,10 @@ The command removes all the Kubernetes components associated with the chart and | `hipchat.room` | HipChat room to notify | `""` | | `hipchat.token` | HipChat token | `""` | | `hipchat.url` | HipChat URL | `""` | +| `webex.enabled` | Enable Webex notifications | `false` | +| `webex.room` | Webex room to notify | `""` | +| `webex.token` | Webex token | `""` | +| `webex.url` | Webex URL | `""` | | `mattermost.enabled` | Enable Mattermost notifications | `false` | | `mattermost.channel` | Mattermost channel to notify | `""` | | `mattermost.url` | Mattermost URL | `""` | diff --git a/helm/kubewatch/templates/configmap.yaml b/helm/kubewatch/templates/configmap.yaml index 31836f5f..5219467e 100644 --- a/helm/kubewatch/templates/configmap.yaml +++ b/helm/kubewatch/templates/configmap.yaml @@ -31,6 +31,9 @@ data: {{- if .Values.webhook.enabled }} webhook: {{- toYaml .Values.webhook | nindent 8 }} {{- end }} + {{- if .Values.webex.enabled }} + webex: {{- toYaml .Values.webex | nindent 8 }} + {{- end }} {{- if .Values.cloudevent.enabled }} cloudevent: {{- toYaml .Values.cloudevent | nindent 8 }} {{- end }} diff --git a/helm/kubewatch/templates/deployment.yaml b/helm/kubewatch/templates/deployment.yaml index f1b6adb8..b59775d2 100644 --- a/helm/kubewatch/templates/deployment.yaml +++ b/helm/kubewatch/templates/deployment.yaml @@ -121,6 +121,9 @@ spec: - name: configuration mountPath: /opt/bitnami/kubewatch/.kubewatch.yaml subPath: .kubewatch.yaml + - name: configuration + mountPath: /root/.kubewatch.yaml + subPath: .kubewatch.yaml {{- if .Values.extraVolumeMounts }} {{- include "common.tplvalues.render" (dict "value" .Values.extraVolumeMounts "context" $) | nindent 12 }} {{- end }} diff --git a/helm/kubewatch/values.yaml b/helm/kubewatch/values.yaml index 0a9eca23..a0525976 100644 --- a/helm/kubewatch/values.yaml +++ b/helm/kubewatch/values.yaml @@ -112,6 +112,16 @@ hipchat: room: "" token: "" url: "" +## @param webex.enabled Enable Webex notifications +## @param webex.room Webex room to notify +## @param webex.token Webex token +## @param webex.url Webex URL +## +webex: + enabled: false + room: "" + token: "" + url: "" ## @param mattermost.enabled Enable Mattermost notifications ## @param mattermost.channel Mattermost channel to notify ## @param mattermost.url Mattermost URL @@ -238,7 +248,9 @@ lifecycleHooks: {} ## - name: FOO ## value: "bar" ## -extraEnvVars: [] +extraEnvVars: + - name: KUBEWATCH_NAME + value: "" ## @param extraEnvVarsCM Name of existing ConfigMap containing extra env vars ## extraEnvVarsCM: "" diff --git a/pkg/client/run.go b/pkg/client/run.go index 34a248d8..42b98db0 100755 --- a/pkg/client/run.go +++ b/pkg/client/run.go @@ -17,9 +17,9 @@ limitations under the License. package client import ( + "github.com/prometheus/client_golang/prometheus/promhttp" "net/http" "os" - "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/bitnami-labs/kubewatch/config" "github.com/bitnami-labs/kubewatch/pkg/controller" @@ -33,6 +33,7 @@ import ( "github.com/bitnami-labs/kubewatch/pkg/handlers/slack" "github.com/bitnami-labs/kubewatch/pkg/handlers/slackwebhook" "github.com/bitnami-labs/kubewatch/pkg/handlers/smtp" + "github.com/bitnami-labs/kubewatch/pkg/handlers/webex" "github.com/bitnami-labs/kubewatch/pkg/handlers/webhook" "github.com/sirupsen/logrus" ) @@ -67,6 +68,8 @@ func ParseEventHandler(conf *config.Config) handlers.Handler { eventHandler = new(slackwebhook.SlackWebhook) case len(conf.Handler.Hipchat.Room) > 0 || len(conf.Handler.Hipchat.Token) > 0: eventHandler = new(hipchat.Hipchat) + case len(conf.Handler.Webex.Room) > 0 || len(conf.Handler.Webex.Token) > 0: + eventHandler = new(webex.Webex) case len(conf.Handler.Mattermost.Channel) > 0 || len(conf.Handler.Mattermost.Url) > 0: eventHandler = new(mattermost.Mattermost) case len(conf.Handler.Flock.Url) > 0: diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 5bb907a3..cfeba1ed 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -53,7 +53,7 @@ import ( "k8s.io/client-go/util/workqueue" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" + "github.com/prometheus/client_golang/prometheus/promauto" ) const maxRetries = 5 @@ -96,7 +96,7 @@ func objName(obj interface{}) string { func Start(conf *config.Config, eventHandler handlers.Handler) { var kubeClient kubernetes.Interface var dynamicClient dynamic.Interface - + kubewatchEventsMetrics := promauto.NewCounterVec( prometheus.CounterOpts{ Name: "kubewatch_events_total", diff --git a/pkg/event/event.go b/pkg/event/event.go index 7113dd2f..9c2ac94e 100644 --- a/pkg/event/event.go +++ b/pkg/event/event.go @@ -15,6 +15,7 @@ package event import ( "fmt" + "os" "k8s.io/apimachinery/pkg/runtime" ) @@ -44,50 +45,59 @@ var m = map[string]string{ // included as a part of event packege to enhance code resuablity across handlers. func (e *Event) Message() (msg string) { // using switch over if..else, since the format could vary based on the kind of the object in future. + kubewatchName := os.Getenv("KUBEWATCH_NAME") switch e.Kind { case "namespace": msg = fmt.Sprintf( - "A namespace `%s` has been `%s`", + "`%s` - A namespace `%s` has been `%s`", + kubewatchName, e.Name, e.Reason, ) case "node": msg = fmt.Sprintf( - "A node `%s` has been `%s`", + "`%s` - A node `%s` has been `%s`", + kubewatchName, e.Name, e.Reason, ) case "cluster role": msg = fmt.Sprintf( - "A cluster role `%s` has been `%s`", + "`%s` - A cluster role `%s` has been `%s`", + kubewatchName, e.Name, e.Reason, ) case "NodeReady": msg = fmt.Sprintf( - "Node `%s` is Ready : \nNodeReady", + "`%s` - Node `%s` is Ready : \nNodeReady", + kubewatchName, e.Name, ) case "NodeNotReady": msg = fmt.Sprintf( - "Node `%s` is Not Ready : \nNodeNotReady", + "`%s` - Node `%s` is Not Ready : \nNodeNotReady", + kubewatchName, e.Name, ) case "NodeRebooted": msg = fmt.Sprintf( - "Node `%s` Rebooted : \nNodeRebooted", + "`%s` - Node `%s` Rebooted : \nNodeRebooted", + kubewatchName, e.Name, ) case "Backoff": msg = fmt.Sprintf( - "Pod `%s` in `%s` Crashed : \nCrashLoopBackOff %s", + "`%s` - Pod `%s` in `%s` Crashed : \nCrashLoopBackOff %s", + kubewatchName, e.Name, e.Namespace, e.Reason, ) default: msg = fmt.Sprintf( - "A `%s` in namespace `%s` has been `%s`:\n`%s`", + "`%s` - A `%s` in namespace `%s` has been `%s`:\n`%s`", + kubewatchName, e.Kind, e.Namespace, e.Reason, diff --git a/pkg/handlers/handler.go b/pkg/handlers/handler.go index df142b8a..2edcee51 100755 --- a/pkg/handlers/handler.go +++ b/pkg/handlers/handler.go @@ -27,6 +27,7 @@ import ( "github.com/bitnami-labs/kubewatch/pkg/handlers/slack" "github.com/bitnami-labs/kubewatch/pkg/handlers/slackwebhook" "github.com/bitnami-labs/kubewatch/pkg/handlers/smtp" + "github.com/bitnami-labs/kubewatch/pkg/handlers/webex" "github.com/bitnami-labs/kubewatch/pkg/handlers/webhook" ) @@ -49,6 +50,7 @@ var Map = map[string]interface{}{ "ms-teams": &msteam.MSTeams{}, "smtp": &smtp.SMTP{}, "lark": &lark.Webhook{}, + "webex": &webex.Webex{}, } // Default handler implements Handler interface, diff --git a/pkg/handlers/webex/webex.go b/pkg/handlers/webex/webex.go new file mode 100644 index 00000000..aa44b765 --- /dev/null +++ b/pkg/handlers/webex/webex.go @@ -0,0 +1,85 @@ +package webex + +import ( + "fmt" + "github.com/sirupsen/logrus" + "os" + + webex "github.com/jbogarin/go-cisco-webex-teams/sdk" + + "github.com/bitnami-labs/kubewatch/config" + "github.com/bitnami-labs/kubewatch/pkg/event" +) + +var webexErrMsg = ` +%s + +You need to set both webex token and room for webex notify, +using "--token/-t", "--room/-r", and "--url/-u" or using environment variables: + +export WEBEX_ACCESS_TOKEN=webex_token +export WEBEX_ACCESS_ROOM=webex_room +export WEBEX_ACCESS_URL=webex_url (defaults to https://webexapis.com/v1/messages) + +Command line flags will override environment variables + +` + +// Webex handler implements handler.Handler interface, +// Notify event to Webex room +type Webex struct { + Token string + Room string + Url string +} + +// Init prepares Webex configuration +func (s *Webex) Init(c *config.Config) error { + url := c.Handler.Webex.Url + room := c.Handler.Webex.Room + token := c.Handler.Webex.Token + + if token == "" { + token = os.Getenv("WEBEX_ACCESS_TOKEN") + } + + if room == "" { + room = os.Getenv("WEBEX_ROOM") + } + + if url == "" { + url = os.Getenv("WEBEX_URL") + } + + s.Token = token + s.Room = room + s.Url = url + + return checkMissingWebexVars(s) +} + +// Handle handles the notification. +func (s *Webex) Handle(e event.Event) { + client := webex.NewClient() + client.SetAuthToken(s.Token) + message := &webex.MessageCreateRequest{ + RoomID: s.Room, + Text: e.Message(), + } + + _, response, err := client.Messages.CreateMessage(message) + if err != nil { + fmt.Println("Error sending message:", err) + return + } + logrus.Printf("Message sent: Return Code %d", response.StatusCode()) + logrus.Printf("Message successfully sent to room %s", s.Room) +} + +func checkMissingWebexVars(s *Webex) error { + if s.Token == "" || s.Room == "" { + return fmt.Errorf(webexErrMsg, "Missing webex token or room") + } + + return nil +} diff --git a/pkg/handlers/webex/webex_test.go b/pkg/handlers/webex/webex_test.go new file mode 100644 index 00000000..5fd6cccb --- /dev/null +++ b/pkg/handlers/webex/webex_test.go @@ -0,0 +1,32 @@ +package webex + +import ( + "fmt" + "reflect" + "testing" + + "github.com/bitnami-labs/kubewatch/config" +) + +func TestHipchatInit(t *testing.T) { + s := &Webex{} + expectedError := fmt.Errorf(webexErrMsg, "Missing webex token or room") + + var Tests = []struct { + webex config.Webex + err error + }{ + {config.Webex{Token: "foo", Room: "bar"}, nil}, + {config.Webex{Token: "foo"}, expectedError}, + {config.Webex{Room: "bar"}, expectedError}, + {config.Webex{}, expectedError}, + } + + for _, tt := range Tests { + c := &config.Config{} + c.Handler.Webex = tt.webex + if err := s.Init(c); !reflect.DeepEqual(err, tt.err) { + t.Fatalf("Init(): %v", err) + } + } +} diff --git a/pkg/utils/k8sutil.go b/pkg/utils/k8sutil.go index faffba94..f4e095aa 100644 --- a/pkg/utils/k8sutil.go +++ b/pkg/utils/k8sutil.go @@ -7,10 +7,10 @@ import ( apps_v1 "k8s.io/api/apps/v1" batch_v1 "k8s.io/api/batch/v1" api_v1 "k8s.io/api/core/v1" + events_v1 "k8s.io/api/events/v1" ext_v1beta1 "k8s.io/api/extensions/v1beta1" networking_v1 "k8s.io/api/networking/v1" rbac_v1 "k8s.io/api/rbac/v1" - events_v1 "k8s.io/api/events/v1" rbac_v1beta1 "k8s.io/api/rbac/v1beta1" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/dynamic"