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 }