Skip to content

Commit

Permalink
Code Cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
rossedman committed Sep 28, 2021
1 parent 0202f26 commit 4b86ba6
Show file tree
Hide file tree
Showing 7 changed files with 208 additions and 9,666 deletions.
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

build:
go build -o kubectl-tks
go build -o bin/kubectl-tks

install:
mv kubectl-tks /usr/local/bin/kubectl-tks
install: build
mv bin/kubectl-tks /usr/local/bin/kubectl-tks
207 changes: 55 additions & 152 deletions cmd/check_endoflife.go
Original file line number Diff line number Diff line change
@@ -1,25 +1,30 @@
package cmd

import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"math"
"net/http"
"os"
"strconv"
"strings"
"time"

"code.hq.twilio.com/redman/kubectl-tks/pkg/client"
"code.hq.twilio.com/redman/kubectl-tks/pkg/endoflife"
"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/cli-runtime/pkg/printers"
)

var (
getEKS bool
getKubernetes bool

// getVersionNext bool
)

func init() {
checkCmd.AddCommand(endOfLifeCmd)
endOfLifeCmd.PersistentFlags().BoolVarP(&getEKS, "eks", "e", false, "retrieve EKS endoflife data")
endOfLifeCmd.PersistentFlags().BoolVarP(&getKubernetes, "kubernetes", "k", true, "retrieve Kubernetes endoflife data")
// getVersionsCmd.PersistentFlags().BoolVarP(&getVersionNext, "next", "n", false, "get next version information")
}

// AmazonEKSRelease represents the data found at
Expand Down Expand Up @@ -52,59 +57,47 @@ var endOfLifeCmd = &cobra.Command{
},
}

// get cluster version
clientset := client.InitClient()
ver, err := clientset.ServerVersion()
current, _, err := GetClusterVersion()
if err != nil {
return err
}

// determine cluster version for endoflife.date
minor, err := strconv.Atoi(strings.ReplaceAll(ver.Minor, "+", ""))
if err != nil {
return err
}

version := fmt.Sprintf("%s.%s", ver.Major, strconv.Itoa(minor))
versionNext := fmt.Sprintf("%s.%s", ver.Major, strconv.Itoa(minor+1))

log.Println(version, versionNext)

// get current version data for EKS
eksDaysLeft, eksEOL, err := GetEKSFormatted(version)
if err != nil {
return err
}
t.Rows = append(t.Rows, metav1.TableRow{
Cells: []interface{}{"EKS", version, eksEOL, eksDaysLeft},
})

// get next version data for EKS
eksNextDaysLeft, eksNextEOL, err := GetEKSFormatted(versionNext)
if err != nil {
return err
}
t.Rows = append(t.Rows, metav1.TableRow{
Cells: []interface{}{"EKS", versionNext, eksNextEOL, eksNextDaysLeft},
})

// get current version data for kubernetes
k8sDaysLeft, k8sEOL, err := GetKubernetesFormatted(version)
if err != nil {
return err
client := endoflife.NewClient()

// get EKS versions
if getEKS {
eks, err := client.GetAmazonEKS(current)
if err != nil {
return err
}

days, err := eks.GetDaysUntilEnd()
if err != nil {
return err
}

t.Rows = append(t.Rows, metav1.TableRow{
Cells: []interface{}{"EKS", current, eks.EOL, days},
})
}
t.Rows = append(t.Rows, metav1.TableRow{
Cells: []interface{}{"Kubernetes", version, k8sEOL, k8sDaysLeft},
})

// get next version data for Kubernetes
k8sNextDaysLeft, k8sNextEOL, err := GetKubernetesFormatted(versionNext)
if err != nil {
return err
// get upstream kubernetes versions
if getKubernetes {
k8s, err := client.GetKubernetes(current)
if err != nil {
return err
}

days, err := k8s.GetDaysUntilEnd()
if err != nil {
return err
}

t.Rows = append(t.Rows, metav1.TableRow{
Cells: []interface{}{"Kubernetes", current, k8s.EOL, days},
})
}
t.Rows = append(t.Rows, metav1.TableRow{
Cells: []interface{}{"Kubernetes", versionNext, k8sNextEOL, k8sNextDaysLeft},
})

// print
p := printers.NewTablePrinter(printers.PrintOptions{})
Expand All @@ -113,112 +106,22 @@ var endOfLifeCmd = &cobra.Command{
},
}

// GetEKSFormatted returns the days left and the eol date formatted
// for print output
func GetEKSFormatted(version string) (float64, string, error) {
eks, err := GetEKSVersion(version)
if err != nil {
return 0, "", err
}

// calculate date difference
today := time.Now()
endDate, err := time.Parse("2006-01-02", eks.EOL)
if err != nil {
return 0, "", err
}

return math.Round(endDate.Sub(today).Hours() / 24), eks.EOL, nil
}

// GetEKSVersion retrieves the EOL data for a single release
func GetEKSVersion(version string) (AmazonEKSRelease, error) {
eks := AmazonEKSRelease{}

client := http.Client{
Timeout: time.Second * 2,
}

url := fmt.Sprintf("https://endoflife.date/api/amazon-eks/%s.json", version)

req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return eks, err
}

res, err := client.Do(req)
if err != nil {
return eks, err
}

if res.Body != nil {
defer res.Body.Close()
}

body, err := ioutil.ReadAll(res.Body)
if err != nil {
return eks, err
}

err = json.Unmarshal(body, &eks)
if err != nil {
return eks, err
}

return eks, nil
}

// GetKubernetesFormatted returns the days left and the eol date formatted
// for print output
func GetKubernetesFormatted(version string) (float64, string, error) {
eks, err := GetKubernetesVersion(version)
if err != nil {
return 0, "", err
}

// calculate date difference
today := time.Now()
endDate, err := time.Parse("2006-01-02", eks.EOL)
if err != nil {
return 0, "", err
}

return math.Round(endDate.Sub(today).Hours() / 24), eks.EOL, nil
}

// GetKubernetesVersion retrieves the EOL data for a single release
func GetKubernetesVersion(version string) (AmazonEKSRelease, error) {
eks := AmazonEKSRelease{}

client := http.Client{
Timeout: time.Second * 2,
}

url := fmt.Sprintf("https://endoflife.date/api/kubernetes/%s.json", version)

req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return eks, err
}

res, err := client.Do(req)
func GetClusterVersion() (string, string, error) {
// get cluster version
clientset := client.InitClient()
ver, err := clientset.ServerVersion()
if err != nil {
return eks, err
return "", "", err
}

if res.Body != nil {
defer res.Body.Close()
}

body, err := ioutil.ReadAll(res.Body)
// determine cluster version for endoflife.date
minor, err := strconv.Atoi(strings.ReplaceAll(ver.Minor, "+", ""))
if err != nil {
return eks, err
return "", "", err
}

err = json.Unmarshal(body, &eks)
if err != nil {
return eks, err
}
current := fmt.Sprintf("%s.%s", ver.Major, strconv.Itoa(minor))
next := fmt.Sprintf("%s.%s", ver.Major, strconv.Itoa(minor+1))

return eks, nil
return current, next, nil
}
1 change: 1 addition & 0 deletions cmd/check_endoflife_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package cmd
2 changes: 1 addition & 1 deletion cmd/config/components.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
},
{
"Name": "cluster-autoscaler",
"Version": "1.19"
"Version": "1.19.0"
}
]
}
112 changes: 112 additions & 0 deletions pkg/endoflife/endoflife.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package endoflife

import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
)

const (
BaseURL = "https://endoflife.date/api"
)

type Client struct {
BaseURL string
HTTPClient *http.Client
}

func NewClient() *Client {
return &Client{
BaseURL: BaseURL,
HTTPClient: &http.Client{
Timeout: time.Second * 2,
},
}
}

func (c *Client) send(req *http.Request, v interface{}) error {
// req.Header.Set("Content-Type", "application/json; charset=utf-8")
// req.Header.Set("Accept", "application/json; charset=utf-8")

res, err := c.HTTPClient.Do(req)
if err != nil {
return err
}
defer res.Body.Close()

if res.StatusCode < http.StatusOK || res.StatusCode >= http.StatusBadRequest {
return fmt.Errorf("unknown error sending request")
}

body, err := ioutil.ReadAll(res.Body)
if err != nil {
return err
}

err = json.Unmarshal(body, &v)
if err != nil {
return err
}

return nil
}

func (c *Client) ListAmazonEKS() ([]AmazonEKS, error) {
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/amazon-eks.json", c.BaseURL), nil)
if err != nil {
return nil, err
}

res := []AmazonEKS{}
if err := c.send(req, &res); err != nil {
return nil, err
}

return res, nil
}

func (c *Client) GetAmazonEKS(version string) (AmazonEKS, error) {
res := AmazonEKS{}

req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/amazon-eks/%s.json", c.BaseURL, version), nil)
if err != nil {
return res, err
}

if err := c.send(req, &res); err != nil {
return res, err
}

return res, nil
}

func (c *Client) ListKubernetes() ([]Kubernetes, error) {
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/kubernetes.json", c.BaseURL), nil)
if err != nil {
return nil, err
}

res := []Kubernetes{}
if err := c.send(req, &res); err != nil {
return nil, err
}

return res, nil
}

func (c *Client) GetKubernetes(version string) (Kubernetes, error) {
res := Kubernetes{}

req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/kubernetes/%s.json", c.BaseURL, version), nil)
if err != nil {
return res, err
}

if err := c.send(req, &res); err != nil {
return res, err
}

return res, nil
}
Loading

0 comments on commit 4b86ba6

Please sign in to comment.