blob: aa1ac5839f6f8f82cb6215c614b81d121b2257c5 [file] [log] [blame]
package testing
import (
"testing"
"gerrit.mcp.mirantis.net/debian/gophercloud.git"
"gerrit.mcp.mirantis.net/debian/gophercloud.git/openstack/baremetal/v1/nodes"
"gerrit.mcp.mirantis.net/debian/gophercloud.git/pagination"
th "gerrit.mcp.mirantis.net/debian/gophercloud.git/testhelper"
"gerrit.mcp.mirantis.net/debian/gophercloud.git/testhelper/client"
)
func TestListDetailNodes(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleNodeListDetailSuccessfully(t)
pages := 0
err := nodes.ListDetail(client.ServiceClient(), nodes.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
pages++
actual, err := nodes.ExtractNodes(page)
if err != nil {
return false, err
}
if len(actual) != 3 {
t.Fatalf("Expected 3 nodes, got %d", len(actual))
}
th.CheckDeepEquals(t, NodeFoo, actual[0])
th.CheckDeepEquals(t, NodeBar, actual[1])
th.CheckDeepEquals(t, NodeBaz, actual[2])
return true, nil
})
th.AssertNoErr(t, err)
if pages != 1 {
t.Errorf("Expected 1 page, saw %d", pages)
}
}
func TestListNodes(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleNodeListSuccessfully(t)
pages := 0
err := nodes.List(client.ServiceClient(), nodes.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) {
pages++
actual, err := nodes.ExtractNodes(page)
if err != nil {
return false, err
}
if len(actual) != 3 {
t.Fatalf("Expected 3 nodes, got %d", len(actual))
}
th.AssertEquals(t, "foo", actual[0].Name)
th.AssertEquals(t, "bar", actual[1].Name)
th.AssertEquals(t, "baz", actual[2].Name)
return true, nil
})
th.AssertNoErr(t, err)
if pages != 1 {
t.Errorf("Expected 1 page, saw %d", pages)
}
}
func TestListOpts(t *testing.T) {
// Detail cannot take Fields
opts := nodes.ListOpts{
Fields: []string{"name", "uuid"},
}
_, err := opts.ToNodeListDetailQuery()
th.AssertEquals(t, err.Error(), "fields is not a valid option when getting a detailed listing of nodes")
// Regular ListOpts can
query, err := opts.ToNodeListQuery()
th.AssertEquals(t, query, "?fields=name&fields=uuid")
th.AssertNoErr(t, err)
}
func TestCreateNode(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleNodeCreationSuccessfully(t, SingleNodeBody)
actual, err := nodes.Create(client.ServiceClient(), nodes.CreateOpts{
Name: "foo",
Driver: "ipmi",
BootInterface: "pxe",
DriverInfo: map[string]interface{}{
"ipmi_port": "6230",
"ipmi_username": "admin",
"deploy_kernel": "http://172.22.0.1/images/tinyipa-stable-rocky.vmlinuz",
"ipmi_address": "192.168.122.1",
"deploy_ramdisk": "http://172.22.0.1/images/tinyipa-stable-rocky.gz",
"ipmi_password": "admin",
},
}).Extract()
th.AssertNoErr(t, err)
th.CheckDeepEquals(t, NodeFoo, *actual)
}
func TestDeleteNode(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleNodeDeletionSuccessfully(t)
res := nodes.Delete(client.ServiceClient(), "asdfasdfasdf")
th.AssertNoErr(t, res.Err)
}
func TestGetNode(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleNodeGetSuccessfully(t)
c := client.ServiceClient()
actual, err := nodes.Get(c, "1234asdf").Extract()
if err != nil {
t.Fatalf("Unexpected Get error: %v", err)
}
th.CheckDeepEquals(t, NodeFoo, *actual)
}
func TestUpdateNode(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleNodeUpdateSuccessfully(t, SingleNodeBody)
c := client.ServiceClient()
actual, err := nodes.Update(c, "1234asdf", nodes.UpdateOpts{
nodes.UpdateOperation{
Op: nodes.ReplaceOp,
Path: "/properties",
Value: map[string]interface{}{
"root_gb": 25,
},
},
}).Extract()
if err != nil {
t.Fatalf("Unexpected Update error: %v", err)
}
th.CheckDeepEquals(t, NodeFoo, *actual)
}
func TestUpdateRequiredOp(t *testing.T) {
c := client.ServiceClient()
_, err := nodes.Update(c, "1234asdf", nodes.UpdateOpts{
nodes.UpdateOperation{
Path: "/driver",
Value: "new-driver",
},
}).Extract()
if _, ok := err.(gophercloud.ErrMissingInput); !ok {
t.Fatal("ErrMissingInput was expected to occur")
}
}
func TestUpdateRequiredPath(t *testing.T) {
c := client.ServiceClient()
_, err := nodes.Update(c, "1234asdf", nodes.UpdateOpts{
nodes.UpdateOperation{
Op: nodes.ReplaceOp,
Value: "new-driver",
},
}).Extract()
if _, ok := err.(gophercloud.ErrMissingInput); !ok {
t.Fatal("ErrMissingInput was expected to occur")
}
}
func TestValidateNode(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleNodeValidateSuccessfully(t)
c := client.ServiceClient()
actual, err := nodes.Validate(c, "1234asdf").Extract()
th.AssertNoErr(t, err)
th.CheckDeepEquals(t, NodeFooValidation, *actual)
}
func TestInjectNMI(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleInjectNMISuccessfully(t)
c := client.ServiceClient()
err := nodes.InjectNMI(c, "1234asdf").ExtractErr()
th.AssertNoErr(t, err)
}
func TestSetBootDevice(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleSetBootDeviceSuccessfully(t)
c := client.ServiceClient()
err := nodes.SetBootDevice(c, "1234asdf", nodes.BootDeviceOpts{
BootDevice: "pxe",
Persistent: false,
}).ExtractErr()
th.AssertNoErr(t, err)
}
func TestGetBootDevice(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleGetBootDeviceSuccessfully(t)
c := client.ServiceClient()
bootDevice, err := nodes.GetBootDevice(c, "1234asdf").Extract()
th.AssertNoErr(t, err)
th.CheckDeepEquals(t, NodeBootDevice, *bootDevice)
}
func TestGetSupportedBootDevices(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleGetSupportedBootDeviceSuccessfully(t)
c := client.ServiceClient()
bootDevices, err := nodes.GetSupportedBootDevices(c, "1234asdf").Extract()
th.AssertNoErr(t, err)
th.CheckDeepEquals(t, NodeSupportedBootDevice, bootDevices)
}
func TestNodeChangeProvisionStateActive(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleNodeChangeProvisionStateActive(t)
c := client.ServiceClient()
err := nodes.ChangeProvisionState(c, "1234asdf", nodes.ProvisionStateOpts{
Target: nodes.TargetActive,
ConfigDrive: "http://127.0.0.1/images/test-node-config-drive.iso.gz",
}).ExtractErr()
th.AssertNoErr(t, err)
}
func TestHandleNodeChangeProvisionStateConfigDrive(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleNodeChangeProvisionStateConfigDrive(t)
c := client.ServiceClient()
err := nodes.ChangeProvisionState(c, "1234asdf", nodes.ProvisionStateOpts{
Target: nodes.TargetActive,
ConfigDrive: ConfigDriveMap,
}).ExtractErr()
th.AssertNoErr(t, err)
}
func TestNodeChangeProvisionStateClean(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleNodeChangeProvisionStateClean(t)
c := client.ServiceClient()
err := nodes.ChangeProvisionState(c, "1234asdf", nodes.ProvisionStateOpts{
Target: nodes.TargetClean,
CleanSteps: []nodes.CleanStep{
{
Interface: "deploy",
Step: "upgrade_firmware",
Args: map[string]interface{}{
"force": "True",
},
},
},
}).ExtractErr()
th.AssertNoErr(t, err)
}
func TestNodeChangeProvisionStateCleanWithConflict(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleNodeChangeProvisionStateCleanWithConflict(t)
c := client.ServiceClient()
err := nodes.ChangeProvisionState(c, "1234asdf", nodes.ProvisionStateOpts{
Target: nodes.TargetClean,
CleanSteps: []nodes.CleanStep{
{
Interface: "deploy",
Step: "upgrade_firmware",
Args: map[string]interface{}{
"force": "True",
},
},
},
}).ExtractErr()
if _, ok := err.(gophercloud.ErrDefault409); !ok {
t.Fatal("ErrDefault409 was expected to occur")
}
}
func TestCleanStepRequiresInterface(t *testing.T) {
c := client.ServiceClient()
err := nodes.ChangeProvisionState(c, "1234asdf", nodes.ProvisionStateOpts{
Target: nodes.TargetClean,
CleanSteps: []nodes.CleanStep{
{
Step: "upgrade_firmware",
Args: map[string]interface{}{
"force": "True",
},
},
},
}).ExtractErr()
if _, ok := err.(gophercloud.ErrMissingInput); !ok {
t.Fatal("ErrMissingInput was expected to occur")
}
}
func TestCleanStepRequiresStep(t *testing.T) {
c := client.ServiceClient()
err := nodes.ChangeProvisionState(c, "1234asdf", nodes.ProvisionStateOpts{
Target: nodes.TargetClean,
CleanSteps: []nodes.CleanStep{
{
Interface: "deploy",
Args: map[string]interface{}{
"force": "True",
},
},
},
}).ExtractErr()
if _, ok := err.(gophercloud.ErrMissingInput); !ok {
t.Fatal("ErrMissingInput was expected to occur")
}
}
func TestChangePowerState(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleChangePowerStateSuccessfully(t)
opts := nodes.PowerStateOpts{
Target: nodes.PowerOn,
Timeout: 100,
}
c := client.ServiceClient()
err := nodes.ChangePowerState(c, "1234asdf", opts).ExtractErr()
th.AssertNoErr(t, err)
}
func TestChangePowerStateWithConflict(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleChangePowerStateWithConflict(t)
opts := nodes.PowerStateOpts{
Target: nodes.PowerOn,
Timeout: 100,
}
c := client.ServiceClient()
err := nodes.ChangePowerState(c, "1234asdf", opts).ExtractErr()
if _, ok := err.(gophercloud.ErrDefault409); !ok {
t.Fatal("ErrDefault409 was expected to occur")
}
}
func TestSetRAIDConfig(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleSetRAIDConfig(t)
sizeGB := 100
isRootVolume := true
config := nodes.RAIDConfigOpts{
LogicalDisks: []nodes.LogicalDisk{
{
SizeGB: &sizeGB,
IsRootVolume: &isRootVolume,
RAIDLevel: nodes.RAID1,
},
},
}
c := client.ServiceClient()
err := nodes.SetRAIDConfig(c, "1234asdf", config).ExtractErr()
th.AssertNoErr(t, err)
}
// Without specifying a size, we need to send a string: "MAX"
func TestSetRAIDConfigMaxSize(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()
HandleSetRAIDConfigMaxSize(t)
isRootVolume := true
config := nodes.RAIDConfigOpts{
LogicalDisks: []nodes.LogicalDisk{
{
IsRootVolume: &isRootVolume,
RAIDLevel: nodes.RAID1,
},
},
}
c := client.ServiceClient()
err := nodes.SetRAIDConfig(c, "1234asdf", config).ExtractErr()
th.AssertNoErr(t, err)
}