diff --git a/pkg/db/metal/machine.go b/pkg/db/metal/machine.go index eb193d39..b3dffb7c 100644 --- a/pkg/db/metal/machine.go +++ b/pkg/db/metal/machine.go @@ -19,6 +19,7 @@ type Machine struct { PartitionID string `rethinkdb:"partitionid"` SizeID string `rethinkdb:"sizeid"` RackID string `rethinkdb:"rackid"` + RoomID string `rethinkdb:"roomid"` Waiting bool `rethinkdb:"waiting"` PreAllocated bool `rethinkdb:"preallocated"` Hardware MachineHardware `rethinkdb:"hardware"` diff --git a/pkg/db/metal/switch.go b/pkg/db/metal/switch.go index 695d8433..d32d39a7 100644 --- a/pkg/db/metal/switch.go +++ b/pkg/db/metal/switch.go @@ -16,6 +16,7 @@ type ( Switch struct { Base Rack string `rethinkdb:"rackid"` + Room string `rethinkdb:"roomid"` Partition string `rethinkdb:"partitionid"` ReplaceMode SwitchReplaceMode `rethinkdb:"mode"` ManagementIP string `rethinkdb:"management_ip"` diff --git a/pkg/db/queries/machine.go b/pkg/db/queries/machine.go index 5190b623..c8e653d2 100644 --- a/pkg/db/queries/machine.go +++ b/pkg/db/queries/machine.go @@ -53,6 +53,12 @@ func MachineFilter(rq *apiv2.MachineQuery) func(q r.Term) r.Term { }) } + if rq.Room != nil { + q = q.Filter(func(row r.Term) r.Term { + return row.Field("roomid").Eq(*rq.Room) + }) + } + if rq.Labels != nil { for key, value := range rq.Labels.Labels { tag := fmt.Sprintf("%s=%s", key, value) diff --git a/pkg/db/queries/machine_test.go b/pkg/db/queries/machine_test.go index 77253183..7e47089d 100644 --- a/pkg/db/queries/machine_test.go +++ b/pkg/db/queries/machine_test.go @@ -62,6 +62,7 @@ var ( PartitionID: "p1", SizeID: "c1-medium", RackID: "rack-1", + RoomID: "room-1", Waiting: false, PreAllocated: false, Hardware: metal.MachineHardware{ @@ -362,6 +363,11 @@ func TestMachineFilter(t *testing.T) { rq: &apiv2.MachineQuery{Rack: new("rack-2")}, want: []*metal.Machine{m2}, }, + { + name: "by room", + rq: &apiv2.MachineQuery{Room: new("room-1")}, + want: []*metal.Machine{m1}, + }, { name: "by state", rq: &apiv2.MachineQuery{State: apiv2.MachineState_MACHINE_STATE_LOCKED.Enum()}, diff --git a/pkg/db/queries/switch.go b/pkg/db/queries/switch.go index e9ab84ae..58ee90b9 100644 --- a/pkg/db/queries/switch.go +++ b/pkg/db/queries/switch.go @@ -29,6 +29,12 @@ func SwitchFilter(query *apiv2.SwitchQuery) func(q r.Term) r.Term { }) } + if query.Room != nil { + q = q.Filter(func(row r.Term) r.Term { + return row.Field("roomid").Eq(*query.Room) + }) + } + if query.Os != nil { if query.Os.Vendor != nil { stringValue, err := enum.GetStringValue(query.Os.Vendor) diff --git a/pkg/db/queries/switch_test.go b/pkg/db/queries/switch_test.go index 078e6771..1743cb0f 100644 --- a/pkg/db/queries/switch_test.go +++ b/pkg/db/queries/switch_test.go @@ -20,6 +20,7 @@ var ( sw1 = &metal.Switch{ Base: metal.Base{ID: "sw1"}, Rack: "rack01", + Room: "room01", Partition: "partition-a", OS: &metal.SwitchOS{ Vendor: metal.SwitchOSVendorCumulus, @@ -117,6 +118,13 @@ func TestSwitchFilter(t *testing.T) { }, want: []*metal.Switch{sw1, sw2}, }, + { + name: "query by room", + rq: &apiv2.SwitchQuery{ + Room: new("room01"), + }, + want: []*metal.Switch{sw1}, + }, { name: "query by os vendor", rq: &apiv2.SwitchQuery{ diff --git a/pkg/repository/machine.go b/pkg/repository/machine.go index ea43decd..5c931ee3 100644 --- a/pkg/repository/machine.go +++ b/pkg/repository/machine.go @@ -607,6 +607,7 @@ func (r *machineRepository) convertToProto(ctx context.Context, m *metal.Machine }, Partition: partition, Rack: m.RackID, + Room: m.RoomID, Size: size, Hardware: hardware, Allocation: allocation, @@ -904,6 +905,7 @@ func (r *machineRepository) Register(ctx context.Context, req *infrav2.BootServi return err } m.RackID = machine.Rack + m.RoomID = machine.Room return r.s.ds.Machine().Update(ctx, m) }, retry.Attempts(10), diff --git a/pkg/repository/switch.go b/pkg/repository/switch.go index e32c6395..9cc5812c 100644 --- a/pkg/repository/switch.go +++ b/pkg/repository/switch.go @@ -367,6 +367,7 @@ func (r *switchRepository) ConnectMachineWithSwitches(ctx context.Context, m *ap return errorutil.FailedPrecondition("connected switches of a machine must reside in the same rack, rack of switch %s: %s, rack of switch %s: %s, machine: %s", s1.Name, s1.Rack, s2.Name, s2.Rack, m.Uuid) } m.Rack = s1.Rack + m.Room = s1.Room sws, err := r.s.ds.Switch().List(ctx, queries.SwitchFilter(&apiv2.SwitchQuery{ ConnectedMachineId: &m.Uuid, @@ -743,6 +744,7 @@ func (r *switchRepository) convertToInternal(ctx context.Context, sw *apiv2.Swit Description: sw.Description, }, Rack: pointer.SafeDeref(sw.Rack), + Room: pointer.SafeDeref(sw.Room), Partition: sw.Partition, ReplaceMode: replaceMode, ManagementIP: sw.ManagementIp, @@ -815,6 +817,7 @@ func (r *switchRepository) convertToProto(ctx context.Context, sw *metal.Switch) }, Description: sw.Description, Rack: pointer.PointerOrNil(sw.Rack), + Room: pointer.PointerOrNil(sw.Room), Partition: sw.Partition, ReplaceMode: replaceMode, ManagementIp: sw.ManagementIP, diff --git a/pkg/service/infra/switch/switch-service_test.go b/pkg/service/infra/switch/switch-service_test.go index 5fca9a69..41ef540e 100644 --- a/pkg/service/infra/switch/switch-service_test.go +++ b/pkg/service/infra/switch/switch-service_test.go @@ -38,6 +38,7 @@ func Test_switchServiceServer_Register(t *testing.T) { Switch: &apiv2.Switch{ Id: "p01-r01leaf01-1", Rack: new(sc.P01Rack01), + Room: new(sc.P01Rack01Room01), Partition: sc.Partition1, ManagementIp: "1.1.1.1", ReplaceMode: apiv2.SwitchReplaceMode_SWITCH_REPLACE_MODE_OPERATIONAL, @@ -54,6 +55,7 @@ func Test_switchServiceServer_Register(t *testing.T) { Id: "p01-r01leaf01-1", Meta: &apiv2.Meta{}, Rack: new(sc.P01Rack01), + Room: new(sc.P01Rack01Room01), Partition: sc.Partition1, ManagementIp: "1.1.1.1", ReplaceMode: apiv2.SwitchReplaceMode_SWITCH_REPLACE_MODE_OPERATIONAL, @@ -72,6 +74,7 @@ func Test_switchServiceServer_Register(t *testing.T) { Id: "p01-r01leaf01-1", Meta: &apiv2.Meta{}, Rack: new(sc.P01Rack01), + Room: new(sc.P01Rack01Room01), Partition: sc.Partition1, ManagementIp: "1.1.1.1", ReplaceMode: apiv2.SwitchReplaceMode_SWITCH_REPLACE_MODE_OPERATIONAL, diff --git a/pkg/test/scenarios/spec.go b/pkg/test/scenarios/spec.go index 566e817a..0a0add00 100644 --- a/pkg/test/scenarios/spec.go +++ b/pkg/test/scenarios/spec.go @@ -44,6 +44,9 @@ const ( P02Rack02 = "p02-rack02" P02Rack03 = "p02-rack03" + P01Rack01Room01 = "p01-rack01-room01" + P01Rack02Room01 = "p01-rack02-room01" + Machine1 = "00000000-0000-0000-0000-000000000001" Machine2 = "00000000-0000-0000-0000-000000000002" Machine3 = "00000000-0000-0000-0000-000000000003"