github.com/vnpaycloud-console/gophercloud/v2@v2.0.5/internal/acceptance/openstack/baremetal/v1/nodes_test.go (about)

     1  //go:build acceptance || baremetal || nodes
     2  
     3  package v1
     4  
     5  import (
     6  	"context"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/vnpaycloud-console/gophercloud/v2/internal/acceptance/clients"
    11  	"github.com/vnpaycloud-console/gophercloud/v2/openstack/baremetal/v1/nodes"
    12  	"github.com/vnpaycloud-console/gophercloud/v2/pagination"
    13  
    14  	th "github.com/vnpaycloud-console/gophercloud/v2/testhelper"
    15  )
    16  
    17  func TestNodesCreateDestroy(t *testing.T) {
    18  	clients.RequireLong(t)
    19  
    20  	client, err := clients.NewBareMetalV1Client()
    21  	th.AssertNoErr(t, err)
    22  	client.Microversion = "1.38"
    23  
    24  	node, err := CreateFakeNode(t, client)
    25  	th.AssertNoErr(t, err)
    26  	defer DeleteNode(t, client, node)
    27  
    28  	found := false
    29  	err = nodes.List(client, nodes.ListOpts{}).EachPage(context.TODO(), func(_ context.Context, page pagination.Page) (bool, error) {
    30  		nodeList, err := nodes.ExtractNodes(page)
    31  		if err != nil {
    32  			return false, err
    33  		}
    34  
    35  		for _, n := range nodeList {
    36  			if n.UUID == node.UUID {
    37  				found = true
    38  				return true, nil
    39  			}
    40  		}
    41  
    42  		return false, nil
    43  	})
    44  	th.AssertNoErr(t, err)
    45  	th.AssertEquals(t, found, true)
    46  
    47  	th.AssertEquals(t, node.ProvisionState, string(nodes.Enroll))
    48  
    49  	err = nodes.ChangeProvisionState(context.TODO(), client, node.UUID, nodes.ProvisionStateOpts{
    50  		Target: nodes.TargetManage,
    51  	}).ExtractErr()
    52  	th.AssertNoErr(t, err)
    53  
    54  	ctx, cancel := context.WithTimeout(context.TODO(), 5*time.Second)
    55  	defer cancel()
    56  
    57  	err = nodes.WaitForProvisionState(ctx, client, node.UUID, nodes.Manageable)
    58  	th.AssertNoErr(t, err)
    59  }
    60  
    61  func TestNodesFields(t *testing.T) {
    62  	clients.RequireLong(t)
    63  
    64  	client, err := clients.NewBareMetalV1Client()
    65  	th.AssertNoErr(t, err)
    66  	client.Microversion = "1.38"
    67  
    68  	node, err := CreateNode(t, client)
    69  	th.AssertNoErr(t, err)
    70  	defer DeleteNode(t, client, node)
    71  	err = nodes.List(client, nodes.ListOpts{
    72  		Fields: []string{"uuid", "deploy_interface"},
    73  	}).EachPage(context.TODO(), func(_ context.Context, page pagination.Page) (bool, error) {
    74  		nodeList, err := nodes.ExtractNodes(page)
    75  		if err != nil {
    76  			return false, err
    77  		}
    78  
    79  		for _, n := range nodeList {
    80  			if n.UUID == "" || n.DeployInterface == "" {
    81  				t.Errorf("UUID or DeployInterface empty on %+v", n)
    82  			}
    83  			if n.BootInterface != "" {
    84  				t.Errorf("BootInterface was not fetched but is not empty on %+v", n)
    85  			}
    86  		}
    87  
    88  		return true, nil
    89  	})
    90  	th.AssertNoErr(t, err)
    91  }
    92  
    93  func TestNodesUpdate(t *testing.T) {
    94  	clients.RequireLong(t)
    95  
    96  	client, err := clients.NewBareMetalV1Client()
    97  	th.AssertNoErr(t, err)
    98  	client.Microversion = "1.38"
    99  
   100  	node, err := CreateNode(t, client)
   101  	th.AssertNoErr(t, err)
   102  	defer DeleteNode(t, client, node)
   103  
   104  	updated, err := nodes.Update(context.TODO(), client, node.UUID, nodes.UpdateOpts{
   105  		nodes.UpdateOperation{
   106  			Op:    nodes.ReplaceOp,
   107  			Path:  "/maintenance",
   108  			Value: "true",
   109  		},
   110  	}).Extract()
   111  	th.AssertNoErr(t, err)
   112  
   113  	th.AssertEquals(t, updated.Maintenance, true)
   114  }
   115  
   116  func TestNodesMaintenance(t *testing.T) {
   117  	clients.RequireLong(t)
   118  
   119  	client, err := clients.NewBareMetalV1Client()
   120  	th.AssertNoErr(t, err)
   121  	client.Microversion = "1.38"
   122  
   123  	node, err := CreateNode(t, client)
   124  	th.AssertNoErr(t, err)
   125  	defer DeleteNode(t, client, node)
   126  
   127  	err = nodes.SetMaintenance(context.TODO(), client, node.UUID, nodes.MaintenanceOpts{
   128  		Reason: "I'm tired",
   129  	}).ExtractErr()
   130  	th.AssertNoErr(t, err)
   131  
   132  	updated, err := nodes.Get(context.TODO(), client, node.UUID).Extract()
   133  	th.AssertNoErr(t, err)
   134  
   135  	th.AssertEquals(t, updated.Maintenance, true)
   136  	th.AssertEquals(t, updated.MaintenanceReason, "I'm tired")
   137  
   138  	err = nodes.UnsetMaintenance(context.TODO(), client, node.UUID).ExtractErr()
   139  	th.AssertNoErr(t, err)
   140  
   141  	updated, err = nodes.Get(context.TODO(), client, node.UUID).Extract()
   142  	th.AssertNoErr(t, err)
   143  
   144  	th.AssertEquals(t, updated.Maintenance, false)
   145  	th.AssertEquals(t, updated.MaintenanceReason, "")
   146  }
   147  
   148  func TestNodesRAIDConfig(t *testing.T) {
   149  	clients.SkipReleasesBelow(t, "stable/ussuri")
   150  	clients.RequireLong(t)
   151  
   152  	client, err := clients.NewBareMetalV1Client()
   153  	th.AssertNoErr(t, err)
   154  	client.Microversion = "1.50"
   155  
   156  	node, err := CreateNode(t, client)
   157  	th.AssertNoErr(t, err)
   158  	defer DeleteNode(t, client, node)
   159  
   160  	sizeGB := 100
   161  	isTrue := true
   162  
   163  	err = nodes.SetRAIDConfig(context.TODO(), client, node.UUID, nodes.RAIDConfigOpts{
   164  		LogicalDisks: []nodes.LogicalDisk{
   165  			{
   166  				SizeGB:       &sizeGB,
   167  				IsRootVolume: &isTrue,
   168  				RAIDLevel:    nodes.RAID5,
   169  				Controller:   "software",
   170  				PhysicalDisks: []any{
   171  					map[string]string{
   172  						"size": "> 100",
   173  					},
   174  					map[string]string{
   175  						"size": "> 100",
   176  					},
   177  				},
   178  			},
   179  		},
   180  	}).ExtractErr()
   181  	th.AssertNoErr(t, err)
   182  
   183  	err = nodes.SetRAIDConfig(context.TODO(), client, node.UUID, nodes.RAIDConfigOpts{
   184  		LogicalDisks: []nodes.LogicalDisk{
   185  			{
   186  				SizeGB:                &sizeGB,
   187  				IsRootVolume:          &isTrue,
   188  				RAIDLevel:             nodes.RAID5,
   189  				DiskType:              nodes.HDD,
   190  				NumberOfPhysicalDisks: 5,
   191  			},
   192  		},
   193  	}).ExtractErr()
   194  	th.AssertNoErr(t, err)
   195  }
   196  
   197  func TestNodesFirmwareInterface(t *testing.T) {
   198  	clients.SkipReleasesBelow(t, "stable/2023.2")
   199  	clients.RequireLong(t)
   200  
   201  	client, err := clients.NewBareMetalV1Client()
   202  	th.AssertNoErr(t, err)
   203  	client.Microversion = "1.86"
   204  
   205  	node, err := CreateNode(t, client)
   206  	th.AssertNoErr(t, err)
   207  	defer DeleteNode(t, client, node)
   208  
   209  	th.AssertEquals(t, node.FirmwareInterface, "no-firmware")
   210  
   211  	nodeFirmwareCmps, err := nodes.ListFirmware(context.TODO(), client, node.UUID).Extract()
   212  	th.AssertNoErr(t, err)
   213  	th.AssertDeepEquals(t, nodeFirmwareCmps, []nodes.FirmwareComponent{})
   214  }
   215  
   216  func TestNodesVirtualMedia(t *testing.T) {
   217  	clients.SkipReleasesBelow(t, "master") // 2024.1
   218  	clients.RequireLong(t)
   219  
   220  	client, err := clients.NewBareMetalV1Client()
   221  	th.AssertNoErr(t, err)
   222  	client.Microversion = "1.89"
   223  
   224  	node, err := CreateNode(t, client)
   225  	th.AssertNoErr(t, err)
   226  	defer DeleteNode(t, client, node)
   227  
   228  	err = nodes.AttachVirtualMedia(context.TODO(), client, node.UUID, nodes.AttachVirtualMediaOpts{
   229  		DeviceType: nodes.VirtualMediaCD,
   230  		// It does not matter if QOTD server is actually present: the
   231  		// request is processes asynchronously, all we need is a valid URL
   232  		// that will not result in Ironic stuck for a long time.
   233  		ImageURL: "http://127.0.0.1:17",
   234  	}).ExtractErr()
   235  	th.AssertNoErr(t, err)
   236  
   237  	err = nodes.DetachVirtualMedia(context.TODO(), client, node.UUID, nodes.DetachVirtualMediaOpts{
   238  		DeviceTypes: []nodes.VirtualMediaDeviceType{nodes.VirtualMediaCD},
   239  	}).ExtractErr()
   240  	th.AssertNoErr(t, err)
   241  
   242  	err = nodes.DetachVirtualMedia(context.TODO(), client, node.UUID, nodes.DetachVirtualMediaOpts{}).ExtractErr()
   243  	th.AssertNoErr(t, err)
   244  }
   245  
   246  func TestNodesServicingHold(t *testing.T) {
   247  	clients.SkipReleasesBelow(t, "stable/2023.2")
   248  	clients.RequireLong(t)
   249  
   250  	client, err := clients.NewBareMetalV1Client()
   251  	th.AssertNoErr(t, err)
   252  	client.Microversion = "1.87"
   253  
   254  	node, err := CreateFakeNode(t, client)
   255  	th.AssertNoErr(t, err)
   256  	defer DeleteNode(t, client, node)
   257  
   258  	node, err = DeployFakeNode(t, client, node)
   259  	th.AssertNoErr(t, err)
   260  
   261  	ctx, cancel := context.WithTimeout(context.TODO(), 30*time.Second)
   262  	defer cancel()
   263  
   264  	_, err = ChangeProvisionStateAndWait(ctx, client, node, nodes.ProvisionStateOpts{
   265  		Target: nodes.TargetService,
   266  		ServiceSteps: []nodes.ServiceStep{
   267  			{
   268  				Interface: nodes.InterfaceDeploy,
   269  				Step:      nodes.StepReboot,
   270  			},
   271  		},
   272  	}, nodes.Active)
   273  	th.AssertNoErr(t, err)
   274  }