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  }