Skip to content

Commit 663bddb

Browse files
authored
Consider all machines of partition for evaluating faulty machines (#632)
1 parent 3947ae9 commit 663bddb

File tree

2 files changed

+120
-4
lines changed

2 files changed

+120
-4
lines changed

cmd/metal-api/internal/service/partition-service.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -380,12 +380,14 @@ func (r *partitionResource) partitionCapacity(request *restful.Request, response
380380

381381
func (r *partitionResource) calcPartitionCapacity(pcr *v1.PartitionCapacityRequest) ([]v1.PartitionCapacity, error) {
382382
var (
383-
ps metal.Partitions
384-
ms metal.Machines
383+
ps metal.Partitions
384+
ms metal.Machines
385+
allMs metal.Machines
385386

386387
pcs = map[string]*v1.PartitionCapacity{}
387388

388-
machineQuery = datastore.MachineSearchQuery{}
389+
machineQuery = datastore.MachineSearchQuery{}
390+
allMachineQuery = datastore.MachineSearchQuery{}
389391
)
390392

391393
if pcr != nil && pcr.ID != nil {
@@ -396,6 +398,7 @@ func (r *partitionResource) calcPartitionCapacity(pcr *v1.PartitionCapacityReque
396398
ps = metal.Partitions{*p}
397399

398400
machineQuery.PartitionID = pcr.ID
401+
allMachineQuery.PartitionID = pcr.ID
399402
} else {
400403
var err error
401404
ps, err = r.ds.ListPartitions()
@@ -413,6 +416,12 @@ func (r *partitionResource) calcPartitionCapacity(pcr *v1.PartitionCapacityReque
413416
return nil, err
414417
}
415418

419+
// if filtered on partition get all without more filters for issues evaluation
420+
err = r.ds.SearchMachines(&allMachineQuery, &allMs)
421+
if err != nil {
422+
return nil, err
423+
}
424+
416425
ecs, err := r.ds.ListProvisioningEventContainers()
417426
if err != nil {
418427
return nil, fmt.Errorf("unable to fetch provisioning event containers: %w", err)
@@ -429,7 +438,7 @@ func (r *partitionResource) calcPartitionCapacity(pcr *v1.PartitionCapacityReque
429438
}
430439

431440
machinesWithIssues, err := issues.Find(&issues.Config{
432-
Machines: ms,
441+
Machines: allMs,
433442
EventContainers: ecs,
434443
Omit: []issues.Type{issues.TypeLastEventError},
435444
})

cmd/metal-api/internal/service/partition-service_test.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,27 @@ func TestPartitionCapacity(t *testing.T) {
310310
mock.On(r.DB("mockdb").Table("event")).Return(events, nil)
311311
mock.On(r.DB("mockdb").Table("partition")).Return(partitions, nil)
312312
mock.On(r.DB("mockdb").Table("size")).Return(sizes, nil)
313+
314+
//Filtered mocks
315+
var filteredPartition []metal.Partition
316+
for _, partition := range partitions {
317+
if partition.ID == "partition-a" {
318+
filteredPartition = append(filteredPartition, partition)
319+
}
320+
}
321+
var filteredMachinesByPartition []metal.Machine
322+
var filteredMachinesByPartitionBySize []metal.Machine
323+
for _, machine := range ms {
324+
if machine.PartitionID == "partition-a" {
325+
filteredMachinesByPartition = append(filteredMachinesByPartition, machine)
326+
if machine.SizeID == "size-a" {
327+
filteredMachinesByPartitionBySize = append(filteredMachinesByPartitionBySize, machine)
328+
}
329+
}
330+
}
331+
mock.On(r.DB("mockdb").Table("partition").Get("partition-a")).Return(filteredPartition, nil)
332+
mock.On(r.DB("mockdb").Table("machine").Filter(func(var_1 r.Term) r.Term { return var_1.Field("partitionid").Eq("partition-a") })).Return(filteredMachinesByPartition, nil)
333+
mock.On(r.DB("mockdb").Table("machine").Filter(func(var_1 r.Term) r.Term { return var_1.Field("partitionid").Eq("partition-a") }).Filter(func(var_1 r.Term) r.Term { return var_1.Field("sizeid").Eq("size-a") })).Return(filteredMachinesByPartitionBySize, nil)
313334
}
314335

315336
machineTpl = func(id, partition, size, project string) metal.Machine {
@@ -411,6 +432,92 @@ func TestPartitionCapacity(t *testing.T) {
411432
},
412433
},
413434
},
435+
{
436+
name: "filter considers all machines",
437+
pcr: &v1.PartitionCapacityRequest{
438+
ID: pointer.Pointer("partition-a"),
439+
Size: pointer.Pointer("size-a"),
440+
},
441+
mockFn: func(mock *r.Mock) {
442+
m1 := machineTpl("1", "partition-a", "size-a", "project-123")
443+
m2 := machineTpl("2", "partition-a", "size-a", "project-123")
444+
m3 := machineTpl("3", "partition-a", "size-a", "project-123")
445+
m4 := machineTpl("4", "partition-a", "size-b", "project-123")
446+
m4.IPMI.Address = "1.2.3.1"
447+
m5 := machineTpl("5", "partition-b", "size-a", "project-123")
448+
mockMachines(mock, metal.MachineLivelinessAlive, nil, m1, m2, m3, m4, m5)
449+
},
450+
451+
want: []*v1.PartitionCapacity{
452+
{
453+
Common: v1.Common{
454+
Identifiable: v1.Identifiable{ID: "partition-a"}, Describable: v1.Describable{Name: pointer.Pointer(""), Description: pointer.Pointer("")},
455+
},
456+
ServerCapacities: v1.ServerCapacities{
457+
{
458+
Size: "size-a",
459+
Total: 3,
460+
PhonedHome: 3,
461+
Faulty: 1,
462+
Allocated: 3,
463+
FaultyMachines: []string{"1"},
464+
},
465+
},
466+
},
467+
},
468+
},
469+
{
470+
name: "non filter considers all machines",
471+
pcr: &v1.PartitionCapacityRequest{},
472+
mockFn: func(mock *r.Mock) {
473+
m1 := machineTpl("1", "partition-a", "size-a", "project-123")
474+
m2 := machineTpl("2", "partition-a", "size-a", "project-123")
475+
m3 := machineTpl("3", "partition-a", "size-a", "project-123")
476+
m4 := machineTpl("4", "partition-a", "size-b", "project-123")
477+
m4.IPMI.Address = "1.2.3.1"
478+
m5 := machineTpl("5", "partition-b", "size-a", "project-123")
479+
mockMachines(mock, metal.MachineLivelinessAlive, nil, m1, m2, m3, m4, m5)
480+
},
481+
want: []*v1.PartitionCapacity{
482+
{
483+
Common: v1.Common{
484+
Identifiable: v1.Identifiable{ID: "partition-a"}, Describable: v1.Describable{Name: pointer.Pointer(""), Description: pointer.Pointer("")},
485+
},
486+
ServerCapacities: v1.ServerCapacities{
487+
{
488+
Size: "size-a",
489+
Total: 3,
490+
PhonedHome: 3,
491+
Faulty: 1,
492+
Allocated: 3,
493+
FaultyMachines: []string{"1"},
494+
},
495+
{
496+
Size: "size-b",
497+
Total: 1,
498+
PhonedHome: 1,
499+
Faulty: 1,
500+
Allocated: 1,
501+
FaultyMachines: []string{"4"},
502+
},
503+
},
504+
},
505+
{
506+
Common: v1.Common{
507+
Identifiable: v1.Identifiable{ID: "partition-b"}, Describable: v1.Describable{Name: pointer.Pointer(""), Description: pointer.Pointer("")},
508+
},
509+
ServerCapacities: v1.ServerCapacities{
510+
{
511+
Size: "size-a",
512+
Total: 1,
513+
PhonedHome: 1,
514+
Faulty: 0,
515+
Allocated: 1,
516+
},
517+
},
518+
},
519+
},
520+
},
414521
{
415522
name: "one waiting machine",
416523
mockFn: func(mock *r.Mock) {

0 commit comments

Comments
 (0)