Skip to content
Merged
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
480 changes: 480 additions & 0 deletions cmd/cluster/changevolumetype.go

Large diffs are not rendered by default.

120 changes: 120 additions & 0 deletions cmd/cluster/changevolumetype_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package cluster

import (
"testing"

"github.com/stretchr/testify/assert"
corev1 "k8s.io/api/core/v1"
)

func TestChangeVolumeType_ValidateTargetType(t *testing.T) {
tests := []struct {
name string
targetType string
wantErr bool
}{
{"valid gp3", "gp3", false},
{"invalid io1", "io1", true},
{"invalid gp2", "gp2", true},
{"invalid io2", "io2", true},
{"invalid st1", "st1", true},
{"invalid sc1", "sc1", true},
{"invalid type", "invalid", true},
{"empty type", "", true},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ops := &changeVolumeTypeOptions{
clusterID: "test-cluster",
targetType: tt.targetType,
reason: "test",
}
err := ops.validate()
if tt.wantErr {
assert.Error(t, err)
} else {
// validate also checks clusterID which will fail for non-real IDs,
// so just verify the type validation logic
valid := false
for _, v := range validVolumeTypes {
if tt.targetType == v {
valid = true
break
}
}
assert.True(t, valid)
}
})
}
}

func TestChangeVolumeType_ValidateRole(t *testing.T) {
tests := []struct {
name string
role string
wantErr bool
}{
{"empty role (both)", "", false},
{"control-plane", "control-plane", false},
{"infra", "infra", false},
{"invalid worker", "worker", true},
{"invalid master", "master", true},
{"invalid random", "random", true},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ops := &changeVolumeTypeOptions{
clusterID: "test-cluster",
targetType: "gp3",
reason: "test",
role: tt.role,
}
err := ops.validate()
if tt.wantErr {
assert.Error(t, err)
assert.Contains(t, err.Error(), "invalid role")
}
// For valid roles, validate would still fail on clusterID check,
// but the role validation should pass
if !tt.wantErr {
validRole := tt.role == "" || tt.role == "control-plane" || tt.role == "infra"
assert.True(t, validRole)
}
})
}
}

func TestChangeVolumeType_CommandCreation(t *testing.T) {
cmd := newCmdChangeVolumeType()

assert.NotNil(t, cmd)
assert.Equal(t, "change-ebs-volume-type", cmd.Use)
assert.NotEmpty(t, cmd.Short)
assert.NotEmpty(t, cmd.Long)
assert.NotEmpty(t, cmd.Example)

// Required flags
requiredFlags := []string{"cluster-id", "type", "reason"}
for _, flagName := range requiredFlags {
flag := cmd.Flag(flagName)
assert.NotNilf(t, flag, "required flag %q should exist", flagName)
}

// Optional flags
flag := cmd.Flag("role")
assert.NotNil(t, flag, "optional flag 'role' should exist")
}

func TestChangeVolumeType_RoleDisplay(t *testing.T) {
assert.Equal(t, "control-plane + infra", roleDisplay(""))
assert.Equal(t, "control-plane", roleDisplay("control-plane"))
assert.Equal(t, "infra", roleDisplay("infra"))
}

func TestChangeVolumeType_CountReadyNodes(t *testing.T) {
// Empty list
nodes := &corev1.NodeList{}
assert.Equal(t, 0, countReadyNodes(nodes))
}
1 change: 1 addition & 0 deletions cmd/cluster/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ func NewCmdCluster(streams genericclioptions.IOStreams, client *k8s.LazyClient,
clusterCmd.AddCommand(NewCmdHypershiftInfo(streams))
clusterCmd.AddCommand(newCmdOrgId())
clusterCmd.AddCommand(newCmdDetachStuckVolume())
clusterCmd.AddCommand(newCmdChangeVolumeType())
clusterCmd.AddCommand(NewCmdVerifyDNS(streams))
clusterCmd.AddCommand(ssh.NewCmdSSH())
clusterCmd.AddCommand(sre_operators.NewCmdSREOperators(streams, client))
Expand Down
Loading