1111# under the License.
1212
1313import os
14+ import time
1415import uuid
1516
1617from functional .common import test
@@ -20,6 +21,8 @@ class VolumeTests(test.TestCase):
2021 """Functional tests for volume. """
2122
2223 NAME = uuid .uuid4 ().hex
24+ SNAPSHOT_NAME = uuid .uuid4 ().hex
25+ VOLUME_FROM_SNAPSHOT_NAME = uuid .uuid4 ().hex
2326 OTHER_NAME = uuid .uuid4 ().hex
2427 HEADERS = ['"Display Name"' ]
2528 FIELDS = ['name' ]
@@ -28,17 +31,20 @@ class VolumeTests(test.TestCase):
2831 def setUpClass (cls ):
2932 os .environ ['OS_VOLUME_API_VERSION' ] = '2'
3033 opts = cls .get_show_opts (cls .FIELDS )
34+
35+ # Create test volume
3136 raw_output = cls .openstack ('volume create --size 1 ' + cls .NAME + opts )
3237 expected = cls .NAME + '\n '
3338 cls .assertOutput (expected , raw_output )
3439
3540 @classmethod
3641 def tearDownClass (cls ):
37- # Rename test
42+ # Rename test volume
3843 raw_output = cls .openstack (
3944 'volume set --name ' + cls .OTHER_NAME + ' ' + cls .NAME )
4045 cls .assertOutput ('' , raw_output )
41- # Delete test
46+
47+ # Delete test volume
4248 raw_output = cls .openstack ('volume delete ' + cls .OTHER_NAME )
4349 cls .assertOutput ('' , raw_output )
4450
@@ -78,3 +84,47 @@ def test_volume_set_size(self):
7884 opts = self .get_show_opts (["name" , "size" ])
7985 raw_output = self .openstack ('volume show ' + self .NAME + opts )
8086 self .assertEqual (self .NAME + "\n 2\n " , raw_output )
87+
88+ def test_volume_snapshot (self ):
89+ opts = self .get_show_opts (self .FIELDS )
90+
91+ # Create snapshot from test volume
92+ raw_output = self .openstack ('snapshot create ' + self .NAME +
93+ ' --name ' + self .SNAPSHOT_NAME + opts )
94+ expected = self .SNAPSHOT_NAME + '\n '
95+ self .assertOutput (expected , raw_output )
96+ self .wait_for ("snapshot" , self .SNAPSHOT_NAME , "available" )
97+
98+ # Create volume from snapshot
99+ raw_output = self .openstack ('volume create --size 2 --snapshot ' +
100+ self .SNAPSHOT_NAME + ' ' +
101+ self .VOLUME_FROM_SNAPSHOT_NAME + opts )
102+ expected = self .VOLUME_FROM_SNAPSHOT_NAME + '\n '
103+ self .assertOutput (expected , raw_output )
104+ self .wait_for ("volume" , self .VOLUME_FROM_SNAPSHOT_NAME , "available" )
105+
106+ # Delete volume that create from snapshot
107+ raw_output = self .openstack ('volume delete ' +
108+ self .VOLUME_FROM_SNAPSHOT_NAME )
109+ self .assertOutput ('' , raw_output )
110+
111+ # Delete test snapshot
112+ raw_output = self .openstack ('snapshot delete ' + self .SNAPSHOT_NAME )
113+ self .assertOutput ('' , raw_output )
114+
115+ def wait_for (self , check_type , check_name , desired_status , wait = 120 ,
116+ interval = 5 , failures = ['ERROR' ]):
117+ status = "notset"
118+ total_sleep = 0
119+ opts = self .get_show_opts (['status' ])
120+ while total_sleep < wait :
121+ status = self .openstack (check_type + ' show ' + check_name + opts )
122+ status = status .rstrip ()
123+ print ('Checking {} {} Waiting for {} current status: {}'
124+ .format (check_type , check_name , desired_status , status ))
125+ if status == desired_status :
126+ break
127+ self .assertNotIn (status , failures )
128+ time .sleep (interval )
129+ total_sleep += interval
130+ self .assertEqual (desired_status , status )
0 commit comments