Skip to content

Commit

Permalink
Merge pull request #8 from Asuforce/feature/refacotor-code
Browse files Browse the repository at this point in the history
Refactor code
  • Loading branch information
sukeesh authored Jun 4, 2020
2 parents 8552f05 + d0f4ab4 commit 0365d37
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 41 deletions.
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ go 1.12

require (
cloud.google.com/go v0.38.0 // indirect
github.com/davecgh/go-spew v1.1.1
github.com/gophercloud/gophercloud v0.1.0 // indirect
github.com/imdario/mergo v0.3.8 // indirect
go.uber.org/zap v1.13.0
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 // indirect
golang.org/x/net v0.0.0-20191125084936-ffdde1057850 // indirect
golang.org/x/oauth2 v0.0.0-20191122200657-5d9234df094c // indirect
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect
k8s.io/api v0.0.0-20191121015604-11707872ac1c // indirect
k8s.io/api v0.0.0-20191121015604-11707872ac1c
k8s.io/apimachinery v0.0.0-20191123233150-4c4803ed55e3
k8s.io/client-go v0.0.0-20190620085101-78d2af792bab
k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6 // indirect
Expand Down
72 changes: 72 additions & 0 deletions kubernetes/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package kubernetes

import (
"flag"
"log"
"os/user"

"github.com/sukeesh/k8s-job-notify/env"

batchv1 "k8s.io/api/batch/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)

// Client represents the wrapper of kubernetes API client
type Client struct {
clientset kubernetes.Interface
}

// NewClient returns Client struct
func NewClient() (*Client, error) {
config, err := getConfig()
if err != nil {
return nil, err
}

clientSet, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, err
}

return &Client{
clientset: clientSet,
}, nil
}

func getConfig() (config *rest.Config, err error) {
if env.IsInCluster() {
config, err = rest.InClusterConfig()
if err != nil {
return nil, err
}
log.Printf("using inClusterConfig")
} else {
usr, err := user.Current()
if err != nil {
return nil, err
}

filePath := usr.HomeDir + "/.kube/config"
kubeconfig := flag.String("kubeconfig", filePath, "absolute path to file")
flag.Parse()
config, err = clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
return nil, err
}
}

return config, nil
}

// ListJobs returns the list of Jobs
func (c *Client) ListJobs(namespace string) (*batchv1.JobList, error) {
jobs, err := c.clientset.BatchV1().Jobs(namespace).List(metav1.ListOptions{})
if err != nil {
return nil, err
}
return jobs, nil
}

44 changes: 8 additions & 36 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,79 +1,52 @@
package main

import (
"flag"
"log"
"os"
"os/user"
"time"

"go.uber.org/zap"

"github.com/sukeesh/k8s-job-notify/env"
k8s "github.com/sukeesh/k8s-job-notify/kubernetes"
"github.com/sukeesh/k8s-job-notify/message"
"github.com/sukeesh/k8s-job-notify/slack"

"k8s.io/client-go/rest"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
_ "k8s.io/client-go/plugin/pkg/client/auth"
"k8s.io/client-go/tools/clientcmd"
)

func main() {
var kubeconfig *string
var config *rest.Config
var err error

pastJobs := make(map[string]bool)
if env.IsInCluster() {
config, err = rest.InClusterConfig()
if err != nil {
panic(err.Error())
}
log.Printf("using inClusterConfig")
} else {
usr, err := user.Current()
if err != nil {
panic(err.Error())
}
filePath := usr.HomeDir + "/.kube/config"
kubeconfig = flag.String("kubeconfig", filePath, "absolute path to file")
flag.Parse()
config, err = clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err.Error())
}
}

clientSet, err := kubernetes.NewForConfig(config)
client, err := k8s.NewClient()
if err != nil {
panic(err.Error())
log.Fatalf("failed to create client %v", zap.Error(err))
os.Exit(1)
}

namespace := env.GetNamespace()
log.Printf("fetching jobs from %s namespace", namespace)
for {
jobs, err := clientSet.BatchV1().Jobs(namespace).List(metav1.ListOptions{})
jobs, err := client.ListJobs(namespace)
if err != nil {
log.Fatalf("failed to list all jobs in the namespace %v", zap.Error(err))
os.Exit(1)
}

for _, job := range jobs.Items {
// job.Name can be same for different jobs, so using job.Name+CreationTimeStamp for checking
// uniqueness of the job. so that duplicated messages to slack can be avoided
jobUniqueHash := job.Name + job.CreationTimestamp.String()
if pastJobs[jobUniqueHash] == false && job.Status.StartTime.Time.Add(time.Minute*20).After(time.Now()) {
if job.Status.Succeeded > 0 {
timeSinceCompletion := time.Now().Sub(job.Status.CompletionTime.Time).Minutes()
err = slack.SendSlackMessage(message.JobSuccess(job.GetClusterName(), job.Name, timeSinceCompletion))
err = slack.SendSlackMessage(message.JobSuccess(job.Name, timeSinceCompletion))
if err != nil {
log.Fatalf("sending a message to slack failed %v", zap.Error(err))
}
pastJobs[jobUniqueHash] = true
} else if job.Status.Failed > 0 {
err = slack.SendSlackMessage(message.JobFailure(job.GetClusterName(), job.Name))
err = slack.SendSlackMessage(message.JobFailure(job.Name))
if err != nil {
log.Fatalf("sending a message to slack failed %v", zap.Error(err))
}
Expand All @@ -84,5 +57,4 @@ func main() {
time.Sleep(time.Minute * 1)
log.Printf("end of 1 minute wait.. fetching new jobs")
}
os.Exit(0)
}
8 changes: 4 additions & 4 deletions message/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import (
"fmt"
)

func JobSuccess(clusterName, jobName string, timeSinceCompletion float64) string {
return "*" + clusterName + ": " + jobName + "* succeeded " + fmt.Sprintf("%f", timeSinceCompletion) + " minutes ago :tada:"
func JobSuccess(jobName string, timeSinceCompletion float64) string {
return "*" + jobName + "* succeeded " + fmt.Sprintf("%.1f", timeSinceCompletion) + " minutes ago :tada:"
}

func JobFailure(clusterName, jobName string) string {
return "*" + clusterName + ": " + jobName + "* failed :alert:"
func JobFailure(jobName string) string {
return "*" + jobName + "* failed :alert:"
}

0 comments on commit 0365d37

Please sign in to comment.