mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 20:53:33 +00:00
Merge pull request #72705 from WanLinghao/cadvisor_test_improve
Improve pkg/kubelet/cadvisor package
This commit is contained in:
commit
591ef236e0
@ -35,7 +35,6 @@ go_library(
|
|||||||
"//vendor/github.com/google/cadvisor/container:go_default_library",
|
"//vendor/github.com/google/cadvisor/container:go_default_library",
|
||||||
"//vendor/github.com/google/cadvisor/fs:go_default_library",
|
"//vendor/github.com/google/cadvisor/fs:go_default_library",
|
||||||
"//vendor/github.com/google/cadvisor/manager:go_default_library",
|
"//vendor/github.com/google/cadvisor/manager:go_default_library",
|
||||||
"//vendor/github.com/google/cadvisor/metrics:go_default_library",
|
|
||||||
"//vendor/github.com/google/cadvisor/utils/sysfs:go_default_library",
|
"//vendor/github.com/google/cadvisor/utils/sysfs:go_default_library",
|
||||||
"//vendor/k8s.io/klog:go_default_library",
|
"//vendor/k8s.io/klog:go_default_library",
|
||||||
],
|
],
|
||||||
@ -48,21 +47,17 @@ go_library(
|
|||||||
|
|
||||||
go_test(
|
go_test(
|
||||||
name = "go_default_test",
|
name = "go_default_test",
|
||||||
srcs = [
|
srcs = ["util_test.go"],
|
||||||
"cadvisor_linux_test.go",
|
|
||||||
"util_test.go",
|
|
||||||
],
|
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = select({
|
deps = select({
|
||||||
"@io_bazel_rules_go//go/platform:linux": [
|
"@io_bazel_rules_go//go/platform:linux": [
|
||||||
"//pkg/apis/core/v1/helper:go_default_library",
|
|
||||||
"//pkg/features:go_default_library",
|
"//pkg/features:go_default_library",
|
||||||
"//pkg/kubelet/types:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature/testing:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature/testing:go_default_library",
|
||||||
|
"//vendor/github.com/google/cadvisor/container/crio:go_default_library",
|
||||||
"//vendor/github.com/google/cadvisor/info/v1:go_default_library",
|
"//vendor/github.com/google/cadvisor/info/v1:go_default_library",
|
||||||
"//vendor/github.com/google/cadvisor/metrics:go_default_library",
|
|
||||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||||
],
|
],
|
||||||
"//conditions:default": [],
|
"//conditions:default": [],
|
||||||
|
@ -32,10 +32,8 @@ import (
|
|||||||
cadvisorapi "github.com/google/cadvisor/info/v1"
|
cadvisorapi "github.com/google/cadvisor/info/v1"
|
||||||
cadvisorapiv2 "github.com/google/cadvisor/info/v2"
|
cadvisorapiv2 "github.com/google/cadvisor/info/v2"
|
||||||
"github.com/google/cadvisor/manager"
|
"github.com/google/cadvisor/manager"
|
||||||
"github.com/google/cadvisor/metrics"
|
|
||||||
"github.com/google/cadvisor/utils/sysfs"
|
"github.com/google/cadvisor/utils/sysfs"
|
||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type cadvisorClient struct {
|
type cadvisorClient struct {
|
||||||
@ -72,34 +70,6 @@ func init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func containerLabels(c *cadvisorapi.ContainerInfo) map[string]string {
|
|
||||||
// Prometheus requires that all metrics in the same family have the same labels,
|
|
||||||
// so we arrange to supply blank strings for missing labels
|
|
||||||
var name, image, podName, namespace, containerName string
|
|
||||||
if len(c.Aliases) > 0 {
|
|
||||||
name = c.Aliases[0]
|
|
||||||
}
|
|
||||||
image = c.Spec.Image
|
|
||||||
if v, ok := c.Spec.Labels[types.KubernetesPodNameLabel]; ok {
|
|
||||||
podName = v
|
|
||||||
}
|
|
||||||
if v, ok := c.Spec.Labels[types.KubernetesPodNamespaceLabel]; ok {
|
|
||||||
namespace = v
|
|
||||||
}
|
|
||||||
if v, ok := c.Spec.Labels[types.KubernetesContainerNameLabel]; ok {
|
|
||||||
containerName = v
|
|
||||||
}
|
|
||||||
set := map[string]string{
|
|
||||||
metrics.LabelID: c.Name,
|
|
||||||
metrics.LabelName: name,
|
|
||||||
metrics.LabelImage: image,
|
|
||||||
"pod_name": podName,
|
|
||||||
"namespace": namespace,
|
|
||||||
"container_name": containerName,
|
|
||||||
}
|
|
||||||
return set
|
|
||||||
}
|
|
||||||
|
|
||||||
func New(imageFsInfoProvider ImageFsInfoProvider, rootPath string, usingLegacyStats bool) (Interface, error) {
|
func New(imageFsInfoProvider ImageFsInfoProvider, rootPath string, usingLegacyStats bool) (Interface, error) {
|
||||||
sysFs := sysfs.NewRealSysFs()
|
sysFs := sysfs.NewRealSysFs()
|
||||||
|
|
||||||
|
@ -1,65 +0,0 @@
|
|||||||
// +build cgo,linux
|
|
||||||
|
|
||||||
/*
|
|
||||||
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 cadvisor
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
info "github.com/google/cadvisor/info/v1"
|
|
||||||
"github.com/google/cadvisor/metrics"
|
|
||||||
"k8s.io/kubernetes/pkg/kubelet/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestContainerLabels(t *testing.T) {
|
|
||||||
container := &info.ContainerInfo{
|
|
||||||
ContainerReference: info.ContainerReference{
|
|
||||||
Name: "/docker/f81ad5335d390944e454ea19ab0924037d57337c19731524ad96eb26e74b6c6d",
|
|
||||||
Aliases: []string{"k8s_POD.639b2af2_foo-web-315473031-e40e2_foobar_a369ace2-5fa9-11e6-b10f-c81f66e5e84d_851a97fd"},
|
|
||||||
},
|
|
||||||
Spec: info.ContainerSpec{
|
|
||||||
Image: "qux/foo:latest",
|
|
||||||
Labels: map[string]string{
|
|
||||||
"io.kubernetes.container.hash": "639b2af2",
|
|
||||||
types.KubernetesContainerNameLabel: "POD",
|
|
||||||
"io.kubernetes.container.restartCount": "0",
|
|
||||||
"io.kubernetes.container.terminationMessagePath": "",
|
|
||||||
types.KubernetesPodNameLabel: "foo-web-315473031-e40e2",
|
|
||||||
types.KubernetesPodNamespaceLabel: "foobar",
|
|
||||||
"io.kubernetes.pod.terminationGracePeriod": "30",
|
|
||||||
types.KubernetesPodUIDLabel: "a369ace2-5fa9-11e6-b10f-c81f66e5e84d",
|
|
||||||
},
|
|
||||||
Envs: map[string]string{
|
|
||||||
"foo+env": "prod",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
want := map[string]string{
|
|
||||||
metrics.LabelID: "/docker/f81ad5335d390944e454ea19ab0924037d57337c19731524ad96eb26e74b6c6d",
|
|
||||||
metrics.LabelName: "k8s_POD.639b2af2_foo-web-315473031-e40e2_foobar_a369ace2-5fa9-11e6-b10f-c81f66e5e84d_851a97fd",
|
|
||||||
metrics.LabelImage: "qux/foo:latest",
|
|
||||||
"namespace": "foobar",
|
|
||||||
"container_name": "POD",
|
|
||||||
"pod_name": "foo-web-315473031-e40e2",
|
|
||||||
}
|
|
||||||
|
|
||||||
if have := containerLabels(container); !reflect.DeepEqual(want, have) {
|
|
||||||
t.Errorf("want %v, have %v", want, have)
|
|
||||||
}
|
|
||||||
}
|
|
@ -19,18 +19,20 @@ limitations under the License.
|
|||||||
package cadvisor
|
package cadvisor
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/google/cadvisor/container/crio"
|
||||||
info "github.com/google/cadvisor/info/v1"
|
info "github.com/google/cadvisor/info/v1"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing"
|
utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing"
|
||||||
v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
|
|
||||||
"k8s.io/kubernetes/pkg/features"
|
"k8s.io/kubernetes/pkg/features"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCapacityFromMachineInfo(t *testing.T) {
|
func TestCapacityFromMachineInfoWithHugePagesEnable(t *testing.T) {
|
||||||
machineInfo := &info.MachineInfo{
|
machineInfo := &info.MachineInfo{
|
||||||
NumCores: 2,
|
NumCores: 2,
|
||||||
MemoryCapacity: 2048,
|
MemoryCapacity: 2048,
|
||||||
@ -42,18 +44,41 @@ func TestCapacityFromMachineInfo(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// enable the features.HugePages
|
expected := v1.ResourceList{
|
||||||
|
v1.ResourceCPU: *resource.NewMilliQuantity(int64(2000), resource.DecimalSI),
|
||||||
|
v1.ResourceMemory: *resource.NewQuantity(int64(2048), resource.BinarySI),
|
||||||
|
"hugepages-5Ki": *resource.NewQuantity(int64(51200), resource.BinarySI),
|
||||||
|
}
|
||||||
defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.HugePages, true)()
|
defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.HugePages, true)()
|
||||||
|
actual := CapacityFromMachineInfo(machineInfo)
|
||||||
resourceList := CapacityFromMachineInfo(machineInfo)
|
if !reflect.DeepEqual(actual, expected) {
|
||||||
|
t.Errorf("when set hugepages true, got resource list %v, want %v", actual, expected)
|
||||||
// assert the cpu and memory
|
}
|
||||||
assert.EqualValues(t, machineInfo.NumCores*1000, resourceList.Cpu().MilliValue(), "unexpected CPU value")
|
}
|
||||||
assert.EqualValues(t, machineInfo.MemoryCapacity, resourceList.Memory().Value(), "unexpected memory value")
|
|
||||||
|
func TestCapacityFromMachineInfoWithHugePagesDisable(t *testing.T) {
|
||||||
// assert the hugepage
|
machineInfo := &info.MachineInfo{
|
||||||
hugePageKey := int64(5 * 1024)
|
NumCores: 2,
|
||||||
value, found := resourceList[v1helper.HugePageResourceName(*resource.NewQuantity(hugePageKey, resource.BinarySI))]
|
MemoryCapacity: 2048,
|
||||||
assert.True(t, found, "hugepage not found")
|
HugePages: []info.HugePagesInfo{
|
||||||
assert.EqualValues(t, hugePageKey*10, value.Value(), "unexpected hugepage value")
|
{
|
||||||
|
PageSize: 5,
|
||||||
|
NumPages: 10,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := v1.ResourceList{
|
||||||
|
v1.ResourceCPU: *resource.NewMilliQuantity(int64(2000), resource.DecimalSI),
|
||||||
|
v1.ResourceMemory: *resource.NewQuantity(int64(2048), resource.BinarySI),
|
||||||
|
}
|
||||||
|
defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.HugePages, false)()
|
||||||
|
actual := CapacityFromMachineInfo(machineInfo)
|
||||||
|
if !reflect.DeepEqual(actual, expected) {
|
||||||
|
t.Errorf("when set hugepages false, got resource list %v, want %v", actual, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCrioSocket(t *testing.T) {
|
||||||
|
assert.EqualValues(t, CrioSocket, crio.CrioSocket, "CrioSocket in this package must equal the one in github.com/google/cadvisor/container/crio/client.go")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user