From ee3640c07a8954cf25a89fc737d780c4c1709c57 Mon Sep 17 00:00:00 2001 From: YaoZengzeng Date: Tue, 25 Sep 2018 13:58:43 +0800 Subject: [PATCH] bugfix: only list container stats which are created by cri Signed-off-by: YaoZengzeng --- cri/utils/utils.go | 18 +++++++++++ cri/utils/utils_test.go | 66 +++++++++++++++++++++++++++++++++++++++++ cri/v1alpha1/cri.go | 15 ++++++++++ cri/v1alpha2/cri.go | 15 ++++++++++ 4 files changed, 114 insertions(+) create mode 100644 cri/utils/utils.go create mode 100644 cri/utils/utils_test.go diff --git a/cri/utils/utils.go b/cri/utils/utils.go new file mode 100644 index 000000000..d6bcf28e4 --- /dev/null +++ b/cri/utils/utils.go @@ -0,0 +1,18 @@ +package utils + +// Move the public utility methods which are used by both v1alpha1 +// and v1alpha2 here to reduce the code duplication. + +// MatchLabelSelector returns true if labels cover selector. +func MatchLabelSelector(selector, labels map[string]string) bool { + for k, v := range selector { + if val, ok := labels[k]; ok { + if v != val { + return false + } + } else { + return false + } + } + return true +} diff --git a/cri/utils/utils_test.go b/cri/utils/utils_test.go new file mode 100644 index 000000000..74adc7e40 --- /dev/null +++ b/cri/utils/utils_test.go @@ -0,0 +1,66 @@ +package utils + +import ( + "testing" +) + +func Test_MatchLabelSelector(t *testing.T) { + type args struct { + selector map[string]string + labels map[string]string + } + tests := []struct { + name string + args args + want bool + }{ + { + name: "Normal Test", + args: args{ + selector: map[string]string{ + "a1": "b1", + "a2": "b2", + }, + labels: map[string]string{ + "a1": "b1", + "a2": "b2", + }, + }, + want: true, + }, + { + name: "Uncovered Test", + args: args{ + selector: map[string]string{ + "a1": "b1", + "a2": "b2", + }, + labels: map[string]string{ + "a2": "b2", + }, + }, + want: false, + }, + { + name: "Unmatched Test", + args: args{ + selector: map[string]string{ + "a1": "b0", + "a2": "b2", + }, + labels: map[string]string{ + "a1": "b1", + "a2": "b2", + }, + }, + want: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := MatchLabelSelector(tt.args.selector, tt.args.labels); got != tt.want { + t.Errorf("matchLabelSelector() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/cri/v1alpha1/cri.go b/cri/v1alpha1/cri.go index 5dda38b2b..dec402984 100644 --- a/cri/v1alpha1/cri.go +++ b/cri/v1alpha1/cri.go @@ -17,6 +17,7 @@ import ( anno "github.com/alibaba/pouch/cri/annotations" cni "github.com/alibaba/pouch/cri/ocicni" "github.com/alibaba/pouch/cri/stream" + criutils "github.com/alibaba/pouch/cri/utils" "github.com/alibaba/pouch/daemon/config" "github.com/alibaba/pouch/daemon/mgr" "github.com/alibaba/pouch/pkg/errtypes" @@ -822,6 +823,20 @@ func (c *CriManager) ContainerStats(ctx context.Context, r *runtime.ContainerSta func (c *CriManager) ListContainerStats(ctx context.Context, r *runtime.ListContainerStatsRequest) (*runtime.ListContainerStatsResponse, error) { opts := &mgr.ContainerListOption{All: true} filter := func(c *mgr.Container) bool { + if c.Config.Labels[containerTypeLabelKey] != containerTypeLabelContainer { + return false + } + + if r.GetFilter().GetId() != "" && c.ID != r.GetFilter().GetId() { + return false + } + if r.GetFilter().GetPodSandboxId() != "" && c.Config.Labels[sandboxIDLabelKey] != r.GetFilter().GetPodSandboxId() { + return false + } + if r.GetFilter().GetLabelSelector() != nil && + !criutils.MatchLabelSelector(r.GetFilter().GetLabelSelector(), c.Config.Labels) { + return false + } return true } opts.FilterFunc = filter diff --git a/cri/v1alpha2/cri.go b/cri/v1alpha2/cri.go index 9d67f3ce3..cf64e2335 100644 --- a/cri/v1alpha2/cri.go +++ b/cri/v1alpha2/cri.go @@ -19,6 +19,7 @@ import ( runtime "github.com/alibaba/pouch/cri/apis/v1alpha2" cni "github.com/alibaba/pouch/cri/ocicni" "github.com/alibaba/pouch/cri/stream" + criutils "github.com/alibaba/pouch/cri/utils" "github.com/alibaba/pouch/daemon/config" "github.com/alibaba/pouch/daemon/mgr" "github.com/alibaba/pouch/pkg/errtypes" @@ -918,6 +919,20 @@ func (c *CriManager) ContainerStats(ctx context.Context, r *runtime.ContainerSta func (c *CriManager) ListContainerStats(ctx context.Context, r *runtime.ListContainerStatsRequest) (*runtime.ListContainerStatsResponse, error) { opts := &mgr.ContainerListOption{All: true} filter := func(c *mgr.Container) bool { + if c.Config.Labels[containerTypeLabelKey] != containerTypeLabelContainer { + return false + } + + if r.GetFilter().GetId() != "" && c.ID != r.GetFilter().GetId() { + return false + } + if r.GetFilter().GetPodSandboxId() != "" && c.Config.Labels[sandboxIDLabelKey] != r.GetFilter().GetPodSandboxId() { + return false + } + if r.GetFilter().GetLabelSelector() != nil && + !criutils.MatchLabelSelector(r.GetFilter().GetLabelSelector(), c.Config.Labels) { + return false + } return true } opts.FilterFunc = filter