@ -1,6 +1,7 @@
package cmd
package cmd
import (
import (
"encoding/json"
"fmt"
"fmt"
"os"
"os"
"os/exec"
"os/exec"
@ -279,7 +280,7 @@ Alternatively, you can specify the version with --version
kube - bench -- version < VERSION > ...
kube - bench -- version < VERSION > ...
`
`
func getKubeVersion ( ) ( string , error ) {
func getKubeVersion ( ) ( * KubeVersion , error ) {
if k8sVer , err := getKubeVersionFromRESTAPI ( ) ; err == nil {
if k8sVer , err := getKubeVersionFromRESTAPI ( ) ; err == nil {
glog . V ( 2 ) . Info ( fmt . Sprintf ( "Kubernetes REST API Reported version: %s" , k8sVer ) )
glog . V ( 2 ) . Info ( fmt . Sprintf ( "Kubernetes REST API Reported version: %s" , k8sVer ) )
@ -300,7 +301,7 @@ func getKubeVersion() (string, error) {
}
}
glog . Warning ( missingKubectlKubeletMessage )
glog . Warning ( missingKubectlKubeletMessage )
return "" , fmt . Errorf ( "unable to find the programs kubectl or kubelet in the PATH" )
return nil , fmt . Errorf ( "unable to find the programs kubectl or kubelet in the PATH" )
}
}
return getKubeVersionFromKubelet ( ) , nil
return getKubeVersionFromKubelet ( ) , nil
}
}
@ -308,8 +309,8 @@ func getKubeVersion() (string, error) {
return getKubeVersionFromKubectl ( ) , nil
return getKubeVersionFromKubectl ( ) , nil
}
}
func getKubeVersionFromKubectl ( ) string {
func getKubeVersionFromKubectl ( ) * KubeVersion {
cmd := exec . Command ( "kubectl" , "version" , "- -short ")
cmd := exec . Command ( "kubectl" , "version" , "- o", "json ")
out , err := cmd . CombinedOutput ( )
out , err := cmd . CombinedOutput ( )
if err != nil {
if err != nil {
glog . V ( 2 ) . Info ( err )
glog . V ( 2 ) . Info ( err )
@ -318,7 +319,7 @@ func getKubeVersionFromKubectl() string {
return getVersionFromKubectlOutput ( string ( out ) )
return getVersionFromKubectlOutput ( string ( out ) )
}
}
func getKubeVersionFromKubelet ( ) string {
func getKubeVersionFromKubelet ( ) * KubeVersion {
cmd := exec . Command ( "kubelet" , "--version" )
cmd := exec . Command ( "kubelet" , "--version" )
out , err := cmd . CombinedOutput ( )
out , err := cmd . CombinedOutput ( )
@ -329,28 +330,38 @@ func getKubeVersionFromKubelet() string {
return getVersionFromKubeletOutput ( string ( out ) )
return getVersionFromKubeletOutput ( string ( out ) )
}
}
func getVersionFromKubectlOutput ( s string ) string {
func getVersionFromKubectlOutput ( s string ) * KubeVersion {
serverVersionRe := regexp . MustCompile ( ` Server Version: v(\d+.\d+) ` )
glog . V ( 2 ) . Info ( s )
subs := serverVersionRe . FindStringSubmatch ( s )
type versionResult struct {
if len ( subs ) < 2 {
ServerVersion VersionResponse
}
vrObj := & versionResult { }
if err := json . Unmarshal ( [ ] byte ( s ) , vrObj ) ; err != nil {
glog . V ( 2 ) . Info ( err )
if strings . Contains ( s , "The connection to the server" ) {
if strings . Contains ( s , "The connection to the server" ) {
msg := fmt . Sprintf ( ` Warning: Kubernetes version was not auto-detected because kubectl could not connect to the Kubernetes server. This may be because the kubeconfig information is missing or has credentials that do not match the server. Assuming default version %s ` , defaultKubeVersion )
msg := fmt . Sprintf ( ` Warning: Kubernetes version was not auto-detected because kubectl could not connect to the Kubernetes server. This may be because the kubeconfig information is missing or has credentials that do not match the server. Assuming default version %s ` , defaultKubeVersion )
fmt . Fprintln ( os . Stderr , msg )
fmt . Fprintln ( os . Stderr , msg )
}
}
glog . V ( 1 ) . Info ( fmt . Sprintf ( "Unable to get Kubernetes version from kubectl, using default version: %s" , defaultKubeVersion ) )
glog . V ( 1 ) . Info ( fmt . Sprintf ( "Unable to get Kubernetes version from kubectl, using default version: %s" , defaultKubeVersion ) )
return defaultKubeVersion
return & KubeVersion { baseVersion : defaultKubeVersion }
}
sv := vrObj . ServerVersion
return & KubeVersion {
Major : sv . Major ,
Minor : sv . Minor ,
GitVersion : sv . GitVersion ,
}
}
return subs [ 1 ]
}
}
func getVersionFromKubeletOutput ( s string ) string {
func getVersionFromKubeletOutput ( s string ) * KubeVersion {
glog . V ( 2 ) . Info ( s )
serverVersionRe := regexp . MustCompile ( ` Kubernetes v(\d+.\d+) ` )
serverVersionRe := regexp . MustCompile ( ` Kubernetes v(\d+.\d+) ` )
subs := serverVersionRe . FindStringSubmatch ( s )
subs := serverVersionRe . FindStringSubmatch ( s )
if len ( subs ) < 2 {
if len ( subs ) < 2 {
glog . V ( 1 ) . Info ( fmt . Sprintf ( "Unable to get Kubernetes version from kubelet, using default version: %s" , defaultKubeVersion ) )
glog . V ( 1 ) . Info ( fmt . Sprintf ( "Unable to get Kubernetes version from kubelet, using default version: %s" , defaultKubeVersion ) )
return defaultKubeVersion
return & KubeVersion { baseVersion : defaultKubeVersion }
}
}
return subs [ 1 ]
return & KubeVersion { baseVersion : subs [ 1 ] }
}
}
func makeSubstitutions ( s string , ext string , m map [ string ] string ) ( string , [ ] string ) {
func makeSubstitutions ( s string , ext string , m map [ string ] string ) ( string , [ ] string ) {
@ -408,3 +419,31 @@ These program names are provided in the config.yaml, section '%s.%s.bins'
return fmt . Sprintf ( errMessageTemplate , component , componentRoleName , binList , componentType , component )
return fmt . Sprintf ( errMessageTemplate , component , componentRoleName , binList , componentType , component )
}
}
func getPlatformName ( ) string {
kv , err := getKubeVersion ( )
if err != nil {
glog . V ( 2 ) . Info ( err )
return ""
}
return getPlatformNameFromVersion ( kv . GitVersion )
}
func getPlatformNameFromVersion ( s string ) string {
versionRe := regexp . MustCompile ( ` v\d+\.\d+\.\d+-(\w+)(?:[.\-])\w+ ` )
subs := versionRe . FindStringSubmatch ( s )
if len ( subs ) < 2 {
return ""
}
return subs [ 1 ]
}
func getPlatformBenchmarkVersion ( platform string ) string {
switch platform {
case "eks" :
return "eks-1.0"
case "gke" :
return "gke-1.0"
}
return ""
}