Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions cmd/metal-api/internal/datastore/machine_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -611,18 +611,18 @@ func TestRethinkStore_SearchMachines(t *testing.T) {
wantErr: nil,
},
{
name: "search by state value reserved",
name: "search by state value tainted",
q: &MachineSearchQuery{
StateValue: new(string(metal.ReservedState)),
StateValue: new(string(metal.TaintedState)),
},
mock: []*metal.Machine{
{Base: metal.Base{ID: "1"}, State: metal.MachineState{Value: metal.AvailableState}},
{Base: metal.Base{ID: "2"}, State: metal.MachineState{Value: metal.ReservedState}},
{Base: metal.Base{ID: "2"}, State: metal.MachineState{Value: metal.TaintedState}},
{Base: metal.Base{ID: "3"}, State: metal.MachineState{Value: metal.AvailableState}},
{Base: metal.Base{ID: "4"}, State: metal.MachineState{Value: metal.LockedState}},
},
want: []*metal.Machine{
tt.defaultBody(&metal.Machine{Base: metal.Base{ID: "2"}, State: metal.MachineState{Value: metal.ReservedState}}),
tt.defaultBody(&metal.Machine{Base: metal.Base{ID: "2"}, State: metal.MachineState{Value: metal.TaintedState}}),
},
wantErr: nil,
},
Expand All @@ -633,7 +633,7 @@ func TestRethinkStore_SearchMachines(t *testing.T) {
},
mock: []*metal.Machine{
{Base: metal.Base{ID: "1"}, State: metal.MachineState{Value: metal.AvailableState}},
{Base: metal.Base{ID: "2"}, State: metal.MachineState{Value: metal.ReservedState}},
{Base: metal.Base{ID: "2"}, State: metal.MachineState{Value: metal.TaintedState}},
{Base: metal.Base{ID: "3"}, State: metal.MachineState{Value: metal.AvailableState}},
{Base: metal.Base{ID: "4"}, State: metal.MachineState{Value: metal.LockedState}},
},
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package migrations

import (
r "gopkg.in/rethinkdb/rethinkdb-go.v6"

"github.com/metal-stack/metal-api/cmd/metal-api/internal/datastore"
"github.com/metal-stack/metal-api/cmd/metal-api/internal/metal"
)

func init() {
datastore.MustRegisterMigration(datastore.Migration{
Name: "convert reserved machine to tainted machines",
Version: 10,
Up: func(db *r.Term, session r.QueryExecutor, rs *datastore.RethinkStore) error {
ms, err := rs.ListMachines()
if err != nil {
return err
}

for i := range ms {
old := ms[i]

n := old

if n.State.Value == metal.ReservedState {
n.State.Value = metal.TaintedState
}

err = rs.UpdateMachine(&old, &n)
if err != nil {
return err
}
}
return nil
},
})
}
Original file line number Diff line number Diff line change
Expand Up @@ -421,3 +421,47 @@ func Test_MigrationNetworkType(t *testing.T) {
require.Equal(t, metal.NoneNATType, *partitionStorage.NATType)
require.Equal(t, metal.ChildSharedNetworkType, *partitionStorage.NetworkType)
}

func Test_MigrationReserverToTainted(t *testing.T) {
container, c, err := test.StartRethink(t)
require.NoError(t, err)
defer func() {
_ = container.Terminate(context.Background())
}()

log := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}))

rs := datastore.New(log, c.IP+":"+c.Port, c.DB, c.User, c.Password)
rs.VRFPoolRangeMin = 10000
rs.VRFPoolRangeMax = 10010
rs.ASNPoolRangeMin = 10000
rs.ASNPoolRangeMax = 10010

err = rs.Connect()
require.NoError(t, err)
err = rs.Initialize()
require.NoError(t, err)

mss := []*metal.Machine{
{Base: metal.Base{ID: "machine-1"}, State: metal.MachineState{Value: metal.ReservedState}},
{Base: metal.Base{ID: "machine-2"}, State: metal.MachineState{Value: metal.AvailableState}},
}
for _, ms := range mss {
err := rs.CreateMachine(ms)
require.NoError(t, err)
}

err = rs.Migrate(nil, false)
require.NoError(t, err)

ms1, err := rs.FindMachineByID("machine-1")
require.NoError(t, err)
require.NotNil(t, ms1)
require.Equal(t, metal.TaintedState, ms1.State.Value)

ms2, err := rs.FindMachineByID("machine-2")
require.NoError(t, err)
require.NotNil(t, ms2)
require.Equal(t, metal.AvailableState, ms2.State.Value)

}
9 changes: 7 additions & 2 deletions cmd/metal-api/internal/metal/machine.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@ const (
// AvailableState describes a machine state where a machine is available for an allocation
AvailableState MState = ""
// ReservedState describes a machine state where a machine is not being considered for random allocation
// Deprecated: use TaintedState instead
ReservedState MState = "RESERVED"
// TaintedState describes a machine state where a machine is not being considered for random allocation
TaintedState MState = "TAINTED"
// LockedState describes a machine state where a machine cannot be deleted or allocated anymore
LockedState MState = "LOCKED"
)
Expand All @@ -43,7 +46,7 @@ var (

var (
// AllStates contains all possible values of a machine state
AllStates = []MState{AvailableState, ReservedState, LockedState}
AllStates = []MState{AvailableState, ReservedState, TaintedState, LockedState}
// AllRoles contains all possible values of a role
AllRoles = map[Role]bool{
RoleMachine: true,
Expand All @@ -67,7 +70,9 @@ func MachineStateFrom(name string) (MState, error) {
case string(AvailableState):
return AvailableState, nil
case string(ReservedState):
return ReservedState, nil
return TaintedState, nil
case string(TaintedState):
return TaintedState, nil
case string(LockedState):
return LockedState, nil
default:
Expand Down
4 changes: 2 additions & 2 deletions cmd/metal-api/internal/service/machine-service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ func TestSetMachineState(t *testing.T) {
container := restful.NewContainer().Add(machineservice)

stateRequest := v1.MachineState{
Value: string(metal.ReservedState),
Value: string(metal.TaintedState),
Description: "blubber",
}
js, err := json.Marshal(stateRequest)
Expand All @@ -253,7 +253,7 @@ func TestSetMachineState(t *testing.T) {

require.NoError(t, err)
require.Equal(t, "1", result.ID)
require.Equal(t, string(metal.ReservedState), result.State.Value)
require.Equal(t, string(metal.TaintedState), result.State.Value)
require.Equal(t, "blubber", result.State.Description)
require.Equal(t, "anonymous@metal-stack.io", result.State.Issuer)
}
Expand Down
Loading