|
16 | 16 | from tempest.lib.common.utils import data_utils |
17 | 17 |
|
18 | 18 | from openstackclient.tests.functional import base |
| 19 | +from openstackclient.tests.functional.volume.v2 import test_volume |
19 | 20 | from tempest.lib import exceptions |
20 | 21 |
|
21 | 22 |
|
@@ -318,6 +319,120 @@ def test_server_reboot(self): |
318 | 319 | self.assertEqual("", raw_output) |
319 | 320 | self.wait_for_status("ACTIVE") |
320 | 321 |
|
| 322 | + def test_server_boot_from_volume(self): |
| 323 | + """Test server create from volume, server delete |
| 324 | +
|
| 325 | + Test steps: |
| 326 | + 1) Create volume from image |
| 327 | + 2) Create empty volume |
| 328 | + 3) Create server from new volumes |
| 329 | + 4) Check for ACTIVE new server status |
| 330 | + 5) Check volumes attached to server |
| 331 | + """ |
| 332 | + # server_image = self.get_image() |
| 333 | + # get volume status wait function |
| 334 | + volume_wait_for = test_volume.VolumeTests( |
| 335 | + methodName='wait_for', |
| 336 | + ).wait_for |
| 337 | + |
| 338 | + # get image size |
| 339 | + cmd_output = json.loads(self.openstack( |
| 340 | + 'image show -f json ' + |
| 341 | + self.image_name |
| 342 | + )) |
| 343 | + try: |
| 344 | + image_size = cmd_output['min_disk'] |
| 345 | + if image_size < 1: |
| 346 | + image_size = 1 |
| 347 | + except ValueError: |
| 348 | + image_size = 1 |
| 349 | + |
| 350 | + # create volume from image |
| 351 | + volume_name = data_utils.rand_name('volume', self.image_name) |
| 352 | + cmd_output = json.loads(self.openstack( |
| 353 | + 'volume create -f json ' + |
| 354 | + '--image ' + self.image_name + ' ' + |
| 355 | + '--size ' + str(image_size) + ' ' + |
| 356 | + volume_name |
| 357 | + )) |
| 358 | + self.assertIsNotNone(cmd_output["id"]) |
| 359 | + self.addCleanup(self.openstack, 'volume delete ' + volume_name) |
| 360 | + self.assertEqual( |
| 361 | + volume_name, |
| 362 | + cmd_output['name'], |
| 363 | + ) |
| 364 | + volume_wait_for("volume", volume_name, "available") |
| 365 | + |
| 366 | + # create empty volume |
| 367 | + empty_volume_name = data_utils.rand_name('TestVolume') |
| 368 | + cmd_output = json.loads(self.openstack( |
| 369 | + 'volume create -f json ' + |
| 370 | + '--size ' + str(image_size) + ' ' + |
| 371 | + empty_volume_name |
| 372 | + )) |
| 373 | + self.assertIsNotNone(cmd_output["id"]) |
| 374 | + self.addCleanup(self.openstack, 'volume delete ' + empty_volume_name) |
| 375 | + self.assertEqual( |
| 376 | + empty_volume_name, |
| 377 | + cmd_output['name'], |
| 378 | + ) |
| 379 | + volume_wait_for("volume", empty_volume_name, "available") |
| 380 | + |
| 381 | + # create server |
| 382 | + server_name = data_utils.rand_name('TestServer') |
| 383 | + server = json.loads(self.openstack( |
| 384 | + 'server create -f json ' + |
| 385 | + '--flavor ' + self.flavor_name + ' ' + |
| 386 | + '--volume ' + volume_name + ' ' + |
| 387 | + '--block-device-mapping vdb=' + empty_volume_name + ' ' + |
| 388 | + self.network_arg + ' ' + |
| 389 | + server_name |
| 390 | + )) |
| 391 | + self.assertIsNotNone(server["id"]) |
| 392 | + self.addCleanup(self.openstack, 'server delete --wait ' + server_name) |
| 393 | + self.assertEqual( |
| 394 | + server_name, |
| 395 | + server['name'], |
| 396 | + ) |
| 397 | + volume_wait_for("server", server_name, "ACTIVE") |
| 398 | + |
| 399 | + # check volumes |
| 400 | + cmd_output = json.loads(self.openstack( |
| 401 | + 'volume show -f json ' + |
| 402 | + volume_name |
| 403 | + )) |
| 404 | + attachments = cmd_output['attachments'] |
| 405 | + self.assertEqual( |
| 406 | + 1, |
| 407 | + len(attachments), |
| 408 | + ) |
| 409 | + self.assertEqual( |
| 410 | + server['id'], |
| 411 | + attachments[0]['server_id'], |
| 412 | + ) |
| 413 | + self.assertEqual( |
| 414 | + "in-use", |
| 415 | + cmd_output['status'], |
| 416 | + ) |
| 417 | + |
| 418 | + # NOTE(dtroyer): Prior to https://review.openstack.org/#/c/407111 |
| 419 | + # --block-device-mapping was ignored if --volume |
| 420 | + # present on the command line, so this volume should |
| 421 | + # not be attached. |
| 422 | + cmd_output = json.loads(self.openstack( |
| 423 | + 'volume show -f json ' + |
| 424 | + empty_volume_name |
| 425 | + )) |
| 426 | + attachments = cmd_output['attachments'] |
| 427 | + self.assertEqual( |
| 428 | + 0, |
| 429 | + len(attachments), |
| 430 | + ) |
| 431 | + self.assertEqual( |
| 432 | + "available", |
| 433 | + cmd_output['status'], |
| 434 | + ) |
| 435 | + |
321 | 436 | def wait_for_status(self, expected_status='ACTIVE', wait=900, interval=30): |
322 | 437 | """Wait until server reaches expected status.""" |
323 | 438 | # TODO(thowe): Add a server wait command to osc |
|
0 commit comments