|
|
@@ -16,17 +16,14 @@ func TestComputeDevices(t *testing.T) {
|
|
|
end := start.Add(time.Hour)
|
|
|
|
|
|
tests := []struct {
|
|
|
- name string
|
|
|
- overrides map[string]any
|
|
|
- containers map[string]*kubemodel.Container
|
|
|
- wantDevices map[string]*kubemodel.Device
|
|
|
- wantUsageKey string
|
|
|
- wantUsage *kubemodel.DeviceUsage
|
|
|
+ name string
|
|
|
+ overrides map[string]any
|
|
|
+ want map[string]*kubemodel.Device
|
|
|
}{
|
|
|
{
|
|
|
- name: "no data returns empty device map",
|
|
|
- overrides: map[string]any{},
|
|
|
- wantDevices: map[string]*kubemodel.Device{},
|
|
|
+ name: "no data returns empty device map",
|
|
|
+ overrides: map[string]any{},
|
|
|
+ want: map[string]*kubemodel.Device{},
|
|
|
},
|
|
|
{
|
|
|
name: "basic device info and uptime",
|
|
|
@@ -38,7 +35,7 @@ func TestComputeDevices(t *testing.T) {
|
|
|
{UUID: "GPU-abc123", First: start, Last: end},
|
|
|
},
|
|
|
},
|
|
|
- wantDevices: map[string]*kubemodel.Device{
|
|
|
+ want: map[string]*kubemodel.Device{
|
|
|
"GPU-abc123": {
|
|
|
UUID: "GPU-abc123",
|
|
|
Device: "nvidia0",
|
|
|
@@ -55,7 +52,7 @@ func TestComputeDevices(t *testing.T) {
|
|
|
{UUID: "GPU-abc123", Device: "nvidia0", ModelName: "A100"},
|
|
|
},
|
|
|
},
|
|
|
- wantDevices: map[string]*kubemodel.Device{},
|
|
|
+ want: map[string]*kubemodel.Device{},
|
|
|
},
|
|
|
{
|
|
|
name: "device with empty uuid is skipped",
|
|
|
@@ -67,7 +64,7 @@ func TestComputeDevices(t *testing.T) {
|
|
|
{UUID: "GPU-abc123", First: start, Last: end},
|
|
|
},
|
|
|
},
|
|
|
- wantDevices: map[string]*kubemodel.Device{},
|
|
|
+ want: map[string]*kubemodel.Device{},
|
|
|
},
|
|
|
{
|
|
|
name: "duplicate device info entries use first occurrence",
|
|
|
@@ -80,90 +77,7 @@ func TestComputeDevices(t *testing.T) {
|
|
|
{UUID: "GPU-abc123", First: start, Last: end},
|
|
|
},
|
|
|
},
|
|
|
- wantDevices: map[string]*kubemodel.Device{
|
|
|
- "GPU-abc123": {
|
|
|
- UUID: "GPU-abc123",
|
|
|
- Device: "nvidia0",
|
|
|
- ModelName: "A100",
|
|
|
- Start: start,
|
|
|
- End: end,
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
- {
|
|
|
- name: "container usage avg and max are applied to a registered container",
|
|
|
- overrides: map[string]any{
|
|
|
- source.QueryDCGMDeviceInfo: []*source.DCGMDeviceInfoResult{
|
|
|
- {UUID: "GPU-abc123", Device: "nvidia0", ModelName: "A100"},
|
|
|
- },
|
|
|
- source.QueryDCGMDeviceUptime: []*source.DCGMDeviceUptimeResult{
|
|
|
- {UUID: "GPU-abc123", First: start, Last: end},
|
|
|
- },
|
|
|
- source.QueryDCGMContainerUsageAvg: []*source.DCGMDeviceContainerUsageResult{
|
|
|
- {UUID: "GPU-abc123", PodUID: "pod-1", Container: "training", Value: 0.75},
|
|
|
- },
|
|
|
- source.QueryDCGMContainerUsageMax: []*source.DCGMDeviceContainerUsageResult{
|
|
|
- {UUID: "GPU-abc123", PodUID: "pod-1", Container: "training", Value: 0.95},
|
|
|
- },
|
|
|
- },
|
|
|
- containers: map[string]*kubemodel.Container{
|
|
|
- "pod-1/training": {PodUID: "pod-1", Name: "training"},
|
|
|
- },
|
|
|
- wantDevices: map[string]*kubemodel.Device{
|
|
|
- "GPU-abc123": {
|
|
|
- UUID: "GPU-abc123",
|
|
|
- Device: "nvidia0",
|
|
|
- ModelName: "A100",
|
|
|
- Start: start,
|
|
|
- End: end,
|
|
|
- },
|
|
|
- },
|
|
|
- wantUsageKey: "pod-1/training",
|
|
|
- wantUsage: &kubemodel.DeviceUsage{UsageAvg: 0.75, UsageMax: 0.95},
|
|
|
- },
|
|
|
- {
|
|
|
- name: "usage with empty pod uid or container is ignored",
|
|
|
- overrides: map[string]any{
|
|
|
- source.QueryDCGMDeviceInfo: []*source.DCGMDeviceInfoResult{
|
|
|
- {UUID: "GPU-abc123", Device: "nvidia0", ModelName: "A100"},
|
|
|
- },
|
|
|
- source.QueryDCGMDeviceUptime: []*source.DCGMDeviceUptimeResult{
|
|
|
- {UUID: "GPU-abc123", First: start, Last: end},
|
|
|
- },
|
|
|
- source.QueryDCGMContainerUsageAvg: []*source.DCGMDeviceContainerUsageResult{
|
|
|
- {UUID: "GPU-abc123", PodUID: "", Container: "training", Value: 0.5},
|
|
|
- {UUID: "GPU-abc123", PodUID: "pod-1", Container: "", Value: 0.5},
|
|
|
- },
|
|
|
- },
|
|
|
- containers: map[string]*kubemodel.Container{
|
|
|
- "pod-1/training": {PodUID: "pod-1", Name: "training"},
|
|
|
- },
|
|
|
- wantDevices: map[string]*kubemodel.Device{
|
|
|
- "GPU-abc123": {
|
|
|
- UUID: "GPU-abc123",
|
|
|
- Device: "nvidia0",
|
|
|
- ModelName: "A100",
|
|
|
- Start: start,
|
|
|
- End: end,
|
|
|
- },
|
|
|
- },
|
|
|
- wantUsageKey: "pod-1/training",
|
|
|
- wantUsage: nil,
|
|
|
- },
|
|
|
- {
|
|
|
- name: "usage for an unregistered container is ignored",
|
|
|
- overrides: map[string]any{
|
|
|
- source.QueryDCGMDeviceInfo: []*source.DCGMDeviceInfoResult{
|
|
|
- {UUID: "GPU-abc123", Device: "nvidia0", ModelName: "A100"},
|
|
|
- },
|
|
|
- source.QueryDCGMDeviceUptime: []*source.DCGMDeviceUptimeResult{
|
|
|
- {UUID: "GPU-abc123", First: start, Last: end},
|
|
|
- },
|
|
|
- source.QueryDCGMContainerUsageAvg: []*source.DCGMDeviceContainerUsageResult{
|
|
|
- {UUID: "GPU-abc123", PodUID: "pod-1", Container: "training", Value: 0.75},
|
|
|
- },
|
|
|
- },
|
|
|
- wantDevices: map[string]*kubemodel.Device{
|
|
|
+ want: map[string]*kubemodel.Device{
|
|
|
"GPU-abc123": {
|
|
|
UUID: "GPU-abc123",
|
|
|
Device: "nvidia0",
|
|
|
@@ -188,25 +102,11 @@ func TestComputeDevices(t *testing.T) {
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
kms := kubemodel.NewKubeModelSet(start, end)
|
|
|
- if tt.containers != nil {
|
|
|
- kms.Containers = tt.containers
|
|
|
- }
|
|
|
|
|
|
err = km.computeDevices(kms, start, end)
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
- assert.Equal(t, tt.wantDevices, kms.Devices)
|
|
|
-
|
|
|
- if tt.wantUsageKey != "" {
|
|
|
- c, ok := kms.Containers[tt.wantUsageKey]
|
|
|
- require.True(t, ok)
|
|
|
- if tt.wantUsage == nil {
|
|
|
- assert.Empty(t, c.DeviceUsages)
|
|
|
- } else {
|
|
|
- require.NotNil(t, c.DeviceUsages)
|
|
|
- assert.Equal(t, *tt.wantUsage, c.DeviceUsages["GPU-abc123"])
|
|
|
- }
|
|
|
- }
|
|
|
+ assert.Equal(t, tt.want, kms.Devices)
|
|
|
})
|
|
|
}
|
|
|
}
|