github.com/grafana/tanka@v0.26.1-0.20240506093700-c22cfc35c21a/pkg/kubernetes/client/info.go (about) 1 package client 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "os" 7 8 "github.com/Masterminds/semver" 9 "github.com/pkg/errors" 10 ) 11 12 // Info contains metadata about the client and its environment 13 type Info struct { 14 // versions 15 ClientVersion *semver.Version 16 ServerVersion *semver.Version 17 18 // kubeconfig (chosen context + cluster) 19 Kubeconfig Config 20 } 21 22 // Config represents a single KUBECONFIG entry (single context + cluster) 23 // Omits the arrays of the original schema, to ease using. 24 type Config struct { 25 Cluster Cluster `json:"cluster"` 26 Context Context `json:"context"` 27 } 28 29 // Context is a kubectl context 30 type Context struct { 31 Context struct { 32 Cluster string `json:"cluster"` 33 User string `json:"user"` 34 Namespace string `json:"namespace"` 35 } `json:"context"` 36 Name string `json:"name"` 37 } 38 39 // Cluster is a kubectl cluster 40 type Cluster struct { 41 Cluster struct { 42 Server string `json:"server"` 43 } `json:"cluster"` 44 Name string `json:"name"` 45 } 46 47 // Version returns the version of kubectl and the Kubernetes api server 48 func (k Kubectl) version() (client, server *semver.Version, err error) { 49 cmd := k.ctl("version", "-o", "json") 50 51 var buf bytes.Buffer 52 cmd.Stdout = &buf 53 cmd.Stderr = os.Stderr 54 55 if err := cmd.Run(); err != nil { 56 return nil, nil, err 57 } 58 59 // parse the result 60 type ver struct { 61 GitVersion string `json:"gitVersion"` 62 } 63 var got struct { 64 ClientVersion ver `json:"clientVersion"` 65 ServerVersion ver `json:"serverVersion"` 66 } 67 68 if err := json.Unmarshal(buf.Bytes(), &got); err != nil { 69 return nil, nil, err 70 } 71 72 // parse the versions 73 client, err = semver.NewVersion(got.ClientVersion.GitVersion) 74 if err != nil { 75 return nil, nil, errors.Wrap(err, "client version") 76 } 77 78 server, err = semver.NewVersion(got.ServerVersion.GitVersion) 79 if err != nil { 80 return nil, nil, errors.Wrap(err, "server version") 81 } 82 83 return client, server, nil 84 }