mirror of
https://github.com/kemko/nomad.git
synced 2026-01-01 16:05:42 +03:00
quotas: corrections to Resources.Add and quota apply parsing logic (#23894)
This commit is contained in:
committed by
GitHub
parent
cbc27e2db6
commit
2e6ccf825a
3
.changelog/23894.txt
Normal file
3
.changelog/23894.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
```release-note:improvement
|
||||
quotas (Enterprise): Added the possibility to set device count limits
|
||||
```
|
||||
@@ -300,7 +300,15 @@ func parseQuotaResource(result *api.Resources, list *ast.ObjectList) error {
|
||||
}
|
||||
|
||||
func parseDeviceResource(result *[]*api.RequestedDevice, list *ast.ObjectList) error {
|
||||
for _, o := range list.Elem().Items {
|
||||
for idx, o := range list.Items {
|
||||
if l := len(o.Keys); l == 0 {
|
||||
return multierror.Prefix(fmt.Errorf("missing device name"), fmt.Sprintf("resources, device[%d]->", idx))
|
||||
} else if l > 1 {
|
||||
return multierror.Prefix(fmt.Errorf("only one name may be specified"), fmt.Sprintf("resources, device[%d]->", idx))
|
||||
}
|
||||
|
||||
name := o.Keys[0].Token.Value().(string)
|
||||
|
||||
// Check for invalid keys
|
||||
valid := []string{
|
||||
"name",
|
||||
@@ -310,12 +318,15 @@ func parseDeviceResource(result *[]*api.RequestedDevice, list *ast.ObjectList) e
|
||||
return err
|
||||
}
|
||||
|
||||
// Set the name
|
||||
var device api.RequestedDevice
|
||||
device.Name = name
|
||||
|
||||
var m map[string]interface{}
|
||||
if err := hcl.DecodeObject(&m, o.Val); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var device api.RequestedDevice
|
||||
if err := mapstructure.WeakDecode(m, &device); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ limit {
|
||||
memory = 1000
|
||||
memory_max = 1000
|
||||
device "nvidia/gpu/1080ti" {
|
||||
count = 1,
|
||||
count = 1
|
||||
}
|
||||
}
|
||||
variables_limit = 1000
|
||||
|
||||
@@ -2713,6 +2713,21 @@ func (r *Resources) Add(delta *Resources) {
|
||||
r.Networks[idx].Add(n)
|
||||
}
|
||||
}
|
||||
|
||||
if r.Devices == nil && delta.Devices != nil {
|
||||
r.Devices = make(ResourceDevices, 0)
|
||||
}
|
||||
for _, dd := range delta.Devices {
|
||||
idx := slices.IndexFunc(r.Devices, func(d *RequestedDevice) bool { return d.Name == dd.Name })
|
||||
|
||||
// means it's not found
|
||||
if idx < 0 {
|
||||
r.Devices = append(r.Devices, dd)
|
||||
continue
|
||||
}
|
||||
|
||||
r.Devices[idx].Count += dd.Count
|
||||
}
|
||||
}
|
||||
|
||||
// GoString returns the string representation of the Resources struct.
|
||||
|
||||
@@ -3821,6 +3821,12 @@ func TestResource_Add(t *testing.T) {
|
||||
ReservedPorts: []Port{{"web", 80, 0, ""}},
|
||||
},
|
||||
},
|
||||
Devices: []*RequestedDevice{
|
||||
{
|
||||
Name: "nvidia/gpu/Tesla M60",
|
||||
Count: 1,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
r1.Add(r2)
|
||||
@@ -3838,6 +3844,12 @@ func TestResource_Add(t *testing.T) {
|
||||
ReservedPorts: []Port{{"ssh", 22, 0, ""}, {"web", 80, 0, ""}},
|
||||
},
|
||||
},
|
||||
Devices: []*RequestedDevice{
|
||||
{
|
||||
Name: "nvidia/gpu/Tesla M60",
|
||||
Count: 1,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
must.Eq(t, expect, r1)
|
||||
|
||||
Reference in New Issue
Block a user