2016-12-09 16:23:03 +00:00
/ *
Copyright 2016 The Kubernetes Authors .
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
package framework
import (
"bufio"
"fmt"
"strings"
2019-05-01 16:53:13 +00:00
2019-05-24 07:59:55 +00:00
e2elog "k8s.io/kubernetes/test/e2e/framework/log"
2019-05-01 16:53:13 +00:00
e2essh "k8s.io/kubernetes/test/e2e/framework/ssh"
2016-12-09 16:23:03 +00:00
)
2019-03-23 00:27:21 +00:00
// KubemarkResourceUsage is a struct for tracking the resource usage of kubemark.
2016-12-09 16:23:03 +00:00
type KubemarkResourceUsage struct {
Name string
MemoryWorkingSetInBytes uint64
CPUUsageInCores float64
}
2017-04-13 12:39:43 +00:00
func getMasterUsageByPrefix ( prefix string ) ( string , error ) {
2019-05-01 16:53:13 +00:00
sshResult , err := e2essh . SSH ( fmt . Sprintf ( "ps ax -o %%cpu,rss,command | tail -n +2 | grep %v | sed 's/\\s+/ /g'" , prefix ) , GetMasterHost ( ) + ":22" , TestContext . Provider )
2017-04-13 12:39:43 +00:00
if err != nil {
return "" , err
}
return sshResult . Stdout , nil
}
2019-03-23 00:27:21 +00:00
// GetKubemarkMasterComponentsResourceUsage returns the resource usage of kubemark which contains multiple combinations of cpu and memory usage for each pod name.
2016-12-09 16:23:03 +00:00
// TODO: figure out how to move this to kubemark directory (need to factor test SSH out of e2e framework)
func GetKubemarkMasterComponentsResourceUsage ( ) map [ string ] * KubemarkResourceUsage {
result := make ( map [ string ] * KubemarkResourceUsage )
2018-03-14 10:03:42 +00:00
// Get kubernetes component resource usage
2017-04-13 12:39:43 +00:00
sshResult , err := getMasterUsageByPrefix ( "kube" )
2016-12-09 16:23:03 +00:00
if err != nil {
2019-05-24 07:59:55 +00:00
e2elog . Logf ( "Error when trying to SSH to master machine. Skipping probe. %v" , err )
2016-12-09 16:23:03 +00:00
return nil
}
2017-04-13 12:39:43 +00:00
scanner := bufio . NewScanner ( strings . NewReader ( sshResult ) )
2016-12-09 16:23:03 +00:00
for scanner . Scan ( ) {
var cpu float64
var mem uint64
var name string
fmt . Sscanf ( strings . TrimSpace ( scanner . Text ( ) ) , "%f %d /usr/local/bin/kube-%s" , & cpu , & mem , & name )
if name != "" {
// Gatherer expects pod_name/container_name format
fullName := name + "/" + name
result [ fullName ] = & KubemarkResourceUsage { Name : fullName , MemoryWorkingSetInBytes : mem * 1024 , CPUUsageInCores : cpu / 100 }
}
}
2017-04-13 12:39:43 +00:00
// Get etcd resource usage
sshResult , err = getMasterUsageByPrefix ( "bin/etcd" )
if err != nil {
2019-05-24 07:59:55 +00:00
e2elog . Logf ( "Error when trying to SSH to master machine. Skipping probe" )
2017-04-13 12:39:43 +00:00
return nil
}
scanner = bufio . NewScanner ( strings . NewReader ( sshResult ) )
for scanner . Scan ( ) {
var cpu float64
var mem uint64
var etcdKind string
fmt . Sscanf ( strings . TrimSpace ( scanner . Text ( ) ) , "%f %d /bin/sh -c /usr/local/bin/etcd" , & cpu , & mem )
dataDirStart := strings . Index ( scanner . Text ( ) , "--data-dir" )
if dataDirStart < 0 {
continue
}
fmt . Sscanf ( scanner . Text ( ) [ dataDirStart : ] , "--data-dir=/var/%s" , & etcdKind )
if etcdKind != "" {
// Gatherer expects pod_name/container_name format
fullName := "etcd/" + etcdKind
result [ fullName ] = & KubemarkResourceUsage { Name : fullName , MemoryWorkingSetInBytes : mem * 1024 , CPUUsageInCores : cpu / 100 }
}
}
2016-12-09 16:23:03 +00:00
return result
}