diff --git a/integration/container_stats_test.go b/integration/container_stats_test.go index 11991aad9..cc1aee0ce 100644 --- a/integration/container_stats_test.go +++ b/integration/container_stats_test.go @@ -296,6 +296,29 @@ func TestContainerListStatsWithIdSandboxIdFilter(t *testing.T) { testStats(t, s, config) } } + + t.Logf("Fetch container stats for sandbox truncID and container truncID filter ") + for id, config := range containerConfigMap { + require.NoError(t, Eventually(func() (bool, error) { + stats, err = runtimeService.ListContainerStats( + &runtime.ContainerStatsFilter{Id: id[:3], PodSandboxId: sb[:3]}) + if err != nil { + return false, err + } + if len(stats) != 1 { + return false, fmt.Errorf("Unexpected stats length") + } + if stats[0].GetWritableLayer().GetUsedBytes().GetValue() != 0 && + stats[0].GetWritableLayer().GetInodesUsed().GetValue() != 0 { + return true, nil + } + return false, nil + }, time.Second, 30*time.Second)) + t.Logf("Verify container stats for sandbox %q and container %q filter", sb, id) + for _, s := range stats { + testStats(t, s, config) + } + } } // TODO make this as options to use for dead container tests diff --git a/pkg/server/container_list.go b/pkg/server/container_list.go index 215602a35..6fb8ef1a3 100644 --- a/pkg/server/container_list.go +++ b/pkg/server/container_list.go @@ -54,12 +54,22 @@ func toCRIContainer(container containerstore.Container) *runtime.Container { } } +func (c *criContainerdService) normalizeContainerFilter(filter *runtime.ContainerFilter) { + if cntr, err := c.containerStore.Get(filter.GetId()); err == nil { + filter.Id = cntr.ID + } + if sb, err := c.sandboxStore.Get(filter.GetPodSandboxId()); err == nil { + filter.PodSandboxId = sb.ID + } +} + // filterCRIContainers filters CRIContainers. func (c *criContainerdService) filterCRIContainers(containers []*runtime.Container, filter *runtime.ContainerFilter) []*runtime.Container { if filter == nil { return containers } + c.normalizeContainerFilter(filter) filtered := []*runtime.Container{} for _, cntr := range containers { if filter.GetId() != "" && filter.GetId() != cntr.Id { diff --git a/pkg/server/container_stats_list.go b/pkg/server/container_stats_list.go index e4fa86f7c..10a5ece90 100644 --- a/pkg/server/container_stats_list.go +++ b/pkg/server/container_stats_list.go @@ -119,6 +119,15 @@ func (c *criContainerdService) getContainerMetrics( return &cs, nil } +func (c *criContainerdService) normalizeContainerStatsFilter(filter *runtime.ContainerStatsFilter) { + if cntr, err := c.containerStore.Get(filter.GetId()); err == nil { + filter.Id = cntr.ID + } + if sb, err := c.sandboxStore.Get(filter.GetPodSandboxId()); err == nil { + filter.PodSandboxId = sb.ID + } +} + // buildTaskMetricsRequest constructs a tasks.MetricsRequest based on // the information in the stats request and the containerStore func (c *criContainerdService) buildTaskMetricsRequest( @@ -128,6 +137,7 @@ func (c *criContainerdService) buildTaskMetricsRequest( if r.GetFilter() == nil { return req, nil, nil } + c.normalizeContainerStatsFilter(r.GetFilter()) var containers []containerstore.Container for _, cntr := range c.containerStore.List() { if r.GetFilter().GetId() != "" && cntr.ID != r.GetFilter().GetId() { diff --git a/pkg/server/sandbox_list.go b/pkg/server/sandbox_list.go index aca59e2de..c83a40086 100644 --- a/pkg/server/sandbox_list.go +++ b/pkg/server/sandbox_list.go @@ -84,12 +84,19 @@ func toCRISandbox(meta sandboxstore.Metadata, state runtime.PodSandboxState, cre } } +func (c *criContainerdService) normalizePodSandboxFilter(filter *runtime.PodSandboxFilter) { + if sb, err := c.sandboxStore.Get(filter.GetId()); err == nil { + filter.Id = sb.ID + } +} + // filterCRISandboxes filters CRISandboxes. func (c *criContainerdService) filterCRISandboxes(sandboxes []*runtime.PodSandbox, filter *runtime.PodSandboxFilter) []*runtime.PodSandbox { if filter == nil { return sandboxes } + c.normalizePodSandboxFilter(filter) filtered := []*runtime.PodSandbox{} for _, s := range sandboxes { // Filter by id