@@ -574,7 +574,90 @@ def test_server_boot_from_volume(self):
574574 cmd_output ['status' ],
575575 )
576576
577- def test_server_boot_with_bdm_snapshot (self ):
577+ def _test_server_boot_with_bdm_volume (self , use_legacy ):
578+ """Test server create from volume, server delete"""
579+ # get volume status wait function
580+ volume_wait_for = volume_common .BaseVolumeTests .wait_for_status
581+
582+ # create source empty volume
583+ volume_name = uuid .uuid4 ().hex
584+ cmd_output = json .loads (self .openstack (
585+ 'volume create -f json ' +
586+ '--size 1 ' +
587+ volume_name
588+ ))
589+ volume_id = cmd_output ["id" ]
590+ self .assertIsNotNone (volume_id )
591+ self .addCleanup (self .openstack , 'volume delete ' + volume_name )
592+ self .assertEqual (volume_name , cmd_output ['name' ])
593+ volume_wait_for ("volume" , volume_name , "available" )
594+
595+ if use_legacy :
596+ bdm_arg = f'--block-device-mapping vdb={ volume_name } '
597+ else :
598+ bdm_arg = (
599+ f'--block-device '
600+ f'device_name=vdb,source_type=volume,boot_index=1,'
601+ f'uuid={ volume_id } '
602+ )
603+
604+ # create server
605+ server_name = uuid .uuid4 ().hex
606+ server = json .loads (self .openstack (
607+ 'server create -f json ' +
608+ '--flavor ' + self .flavor_name + ' ' +
609+ '--image ' + self .image_name + ' ' +
610+ bdm_arg + ' ' +
611+ self .network_arg + ' ' +
612+ '--wait ' +
613+ server_name
614+ ))
615+ self .assertIsNotNone (server ["id" ])
616+ self .addCleanup (self .openstack , 'server delete --wait ' + server_name )
617+ self .assertEqual (
618+ server_name ,
619+ server ['name' ],
620+ )
621+
622+ # check server volumes_attached, format is
623+ # {"volumes_attached": "id='2518bc76-bf0b-476e-ad6b-571973745bb5'",}
624+ cmd_output = json .loads (self .openstack (
625+ 'server show -f json ' +
626+ server_name
627+ ))
628+ volumes_attached = cmd_output ['volumes_attached' ]
629+ self .assertIsNotNone (volumes_attached )
630+
631+ # check volumes
632+ cmd_output = json .loads (self .openstack (
633+ 'volume show -f json ' +
634+ volume_name
635+ ))
636+ attachments = cmd_output ['attachments' ]
637+ self .assertEqual (
638+ 1 ,
639+ len (attachments ),
640+ )
641+ self .assertEqual (
642+ server ['id' ],
643+ attachments [0 ]['server_id' ],
644+ )
645+ self .assertEqual (
646+ "in-use" ,
647+ cmd_output ['status' ],
648+ )
649+
650+ def test_server_boot_with_bdm_volume (self ):
651+ """Test server create from image with bdm volume, server delete"""
652+ self ._test_server_boot_with_bdm_volume (use_legacy = False )
653+
654+ # TODO(stephenfin): Remove when we drop support for the
655+ # '--block-device-mapping' option
656+ def test_server_boot_with_bdm_volume_legacy (self ):
657+ """Test server create from image with bdm volume, server delete"""
658+ self ._test_server_boot_with_bdm_volume (use_legacy = True )
659+
660+ def _test_server_boot_with_bdm_snapshot (self , use_legacy ):
578661 """Test server create from image with bdm snapshot, server delete"""
579662 # get volume status wait function
580663 volume_wait_for = volume_common .BaseVolumeTests .wait_for_status
@@ -588,12 +671,8 @@ def test_server_boot_with_bdm_snapshot(self):
588671 empty_volume_name
589672 ))
590673 self .assertIsNotNone (cmd_output ["id" ])
591- self .addCleanup (self .openstack ,
592- 'volume delete ' + empty_volume_name )
593- self .assertEqual (
594- empty_volume_name ,
595- cmd_output ['name' ],
596- )
674+ self .addCleanup (self .openstack , 'volume delete ' + empty_volume_name )
675+ self .assertEqual (empty_volume_name , cmd_output ['name' ])
597676 volume_wait_for ("volume" , empty_volume_name , "available" )
598677
599678 # create snapshot of source empty volume
@@ -603,7 +682,8 @@ def test_server_boot_with_bdm_snapshot(self):
603682 '--volume ' + empty_volume_name + ' ' +
604683 empty_snapshot_name
605684 ))
606- self .assertIsNotNone (cmd_output ["id" ])
685+ empty_snapshot_id = cmd_output ["id" ]
686+ self .assertIsNotNone (empty_snapshot_id )
607687 # Deleting volume snapshot take time, so we need to wait until the
608688 # snapshot goes. Entries registered by self.addCleanup will be called
609689 # in the reverse order, so we need to register wait_for_delete first.
@@ -617,14 +697,26 @@ def test_server_boot_with_bdm_snapshot(self):
617697 )
618698 volume_wait_for ("volume snapshot" , empty_snapshot_name , "available" )
619699
700+ if use_legacy :
701+ bdm_arg = (
702+ f'--block-device-mapping '
703+ f'vdb={ empty_snapshot_name } :snapshot:1:true'
704+ )
705+ else :
706+ bdm_arg = (
707+ f'--block-device '
708+ f'device_name=vdb,uuid={ empty_snapshot_id } ,'
709+ f'source_type=snapshot,volume_size=1,'
710+ f'delete_on_termination=true,boot_index=1'
711+ )
712+
620713 # create server with bdm snapshot
621714 server_name = uuid .uuid4 ().hex
622715 server = json .loads (self .openstack (
623716 'server create -f json ' +
624717 '--flavor ' + self .flavor_name + ' ' +
625718 '--image ' + self .image_name + ' ' +
626- '--block-device-mapping '
627- 'vdb=' + empty_snapshot_name + ':snapshot:1:true ' +
719+ bdm_arg + ' ' +
628720 self .network_arg + ' ' +
629721 '--wait ' +
630722 server_name
@@ -681,14 +773,50 @@ def test_server_boot_with_bdm_snapshot(self):
681773 # the attached volume had been deleted
682774 pass
683775
684- def test_server_boot_with_bdm_image (self ):
776+ def test_server_boot_with_bdm_snapshot (self ):
777+ """Test server create from image with bdm snapshot, server delete"""
778+ self ._test_server_boot_with_bdm_snapshot (use_legacy = False )
779+
780+ # TODO(stephenfin): Remove when we drop support for the
781+ # '--block-device-mapping' option
782+ def test_server_boot_with_bdm_snapshot_legacy (self ):
783+ """Test server create from image with bdm snapshot, server delete"""
784+ self ._test_server_boot_with_bdm_snapshot (use_legacy = True )
785+
786+ def _test_server_boot_with_bdm_image (self , use_legacy ):
685787 # Tests creating a server where the root disk is backed by the given
686788 # --image but a --block-device-mapping with type=image is provided so
687789 # that the compute service creates a volume from that image and
688790 # attaches it as a non-root volume on the server. The block device is
689791 # marked as delete_on_termination=True so it will be automatically
690792 # deleted when the server is deleted.
691793
794+ if use_legacy :
795+ # This means create a 1GB volume from the specified image, attach
796+ # it to the server at /dev/vdb and delete the volume when the
797+ # server is deleted.
798+ bdm_arg = (
799+ f'--block-device-mapping '
800+ f'vdb={ self .image_name } :image:1:true '
801+ )
802+ else :
803+ # get image ID
804+ cmd_output = json .loads (self .openstack (
805+ 'image show -f json ' +
806+ self .image_name
807+ ))
808+ image_id = cmd_output ['id' ]
809+
810+ # This means create a 1GB volume from the specified image, attach
811+ # it to the server at /dev/vdb and delete the volume when the
812+ # server is deleted.
813+ bdm_arg = (
814+ f'--block-device '
815+ f'device_name=vdb,uuid={ image_id } ,'
816+ f'source_type=image,volume_size=1,'
817+ f'delete_on_termination=true,boot_index=1'
818+ )
819+
692820 # create server with bdm type=image
693821 # NOTE(mriedem): This test is a bit unrealistic in that specifying the
694822 # same image in the block device as the --image option does not really
@@ -700,11 +828,7 @@ def test_server_boot_with_bdm_image(self):
700828 'server create -f json ' +
701829 '--flavor ' + self .flavor_name + ' ' +
702830 '--image ' + self .image_name + ' ' +
703- '--block-device-mapping '
704- # This means create a 1GB volume from the specified image, attach
705- # it to the server at /dev/vdb and delete the volume when the
706- # server is deleted.
707- 'vdb=' + self .image_name + ':image:1:true ' +
831+ bdm_arg + ' ' +
708832 self .network_arg + ' ' +
709833 '--wait ' +
710834 server_name
@@ -768,6 +892,14 @@ def test_server_boot_with_bdm_image(self):
768892 # the attached volume had been deleted
769893 pass
770894
895+ def test_server_boot_with_bdm_image (self ):
896+ self ._test_server_boot_with_bdm_image (use_legacy = False )
897+
898+ # TODO(stephenfin): Remove when we drop support for the
899+ # '--block-device-mapping' option
900+ def test_server_boot_with_bdm_image_legacy (self ):
901+ self ._test_server_boot_with_bdm_image (use_legacy = True )
902+
771903 def test_boot_from_volume (self ):
772904 # Tests creating a server using --image and --boot-from-volume where
773905 # the compute service will create a root volume of the specified size
0 commit comments