summaryrefslogtreecommitdiff
path: root/openstackclient/tests/functional/volume
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/tests/functional/volume')
-rw-r--r--openstackclient/tests/functional/volume/__init__.py0
-rw-r--r--openstackclient/tests/functional/volume/v1/__init__.py0
-rw-r--r--openstackclient/tests/functional/volume/v1/common.py23
-rw-r--r--openstackclient/tests/functional/volume/v1/test_qos.py55
-rw-r--r--openstackclient/tests/functional/volume/v1/test_volume.py77
-rw-r--r--openstackclient/tests/functional/volume/v1/test_volume_type.py74
-rw-r--r--openstackclient/tests/functional/volume/v2/__init__.py0
-rw-r--r--openstackclient/tests/functional/volume/v2/common.py23
-rw-r--r--openstackclient/tests/functional/volume/v2/test_qos.py62
-rw-r--r--openstackclient/tests/functional/volume/v2/test_snapshot.py83
-rw-r--r--openstackclient/tests/functional/volume/v2/test_volume.py137
-rw-r--r--openstackclient/tests/functional/volume/v2/test_volume_type.py84
12 files changed, 618 insertions, 0 deletions
diff --git a/openstackclient/tests/functional/volume/__init__.py b/openstackclient/tests/functional/volume/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/openstackclient/tests/functional/volume/__init__.py
diff --git a/openstackclient/tests/functional/volume/v1/__init__.py b/openstackclient/tests/functional/volume/v1/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/openstackclient/tests/functional/volume/v1/__init__.py
diff --git a/openstackclient/tests/functional/volume/v1/common.py b/openstackclient/tests/functional/volume/v1/common.py
new file mode 100644
index 00000000..a442850d
--- /dev/null
+++ b/openstackclient/tests/functional/volume/v1/common.py
@@ -0,0 +1,23 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import os
+
+from openstackclient.tests.functional import base
+
+
+class BaseVolumeTests(base.TestCase):
+ """Base class for Volume functional tests. """
+
+ @classmethod
+ def setUpClass(cls):
+ os.environ['OS_VOLUME_API_VERSION'] = '1'
diff --git a/openstackclient/tests/functional/volume/v1/test_qos.py b/openstackclient/tests/functional/volume/v1/test_qos.py
new file mode 100644
index 00000000..770d5acb
--- /dev/null
+++ b/openstackclient/tests/functional/volume/v1/test_qos.py
@@ -0,0 +1,55 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import uuid
+
+from openstackclient.tests.functional.volume.v1 import common
+
+
+class QosTests(common.BaseVolumeTests):
+ """Functional tests for volume qos. """
+
+ NAME = uuid.uuid4().hex
+ HEADERS = ['Name']
+ FIELDS = ['id', 'name']
+ ID = None
+
+ @classmethod
+ def setUpClass(cls):
+ super(QosTests, cls).setUpClass()
+ opts = cls.get_opts(cls.FIELDS)
+ raw_output = cls.openstack('volume qos create ' + cls.NAME + opts)
+ cls.ID, name, rol = raw_output.split('\n')
+ cls.assertOutput(cls.NAME, name)
+
+ @classmethod
+ def tearDownClass(cls):
+ raw_output = cls.openstack('volume qos delete ' + cls.ID)
+ cls.assertOutput('', raw_output)
+
+ def test_volume_qos_list(self):
+ opts = self.get_opts(self.HEADERS)
+ raw_output = self.openstack('volume qos list' + opts)
+ self.assertIn(self.NAME, raw_output)
+
+ def test_volume_qos_show(self):
+ opts = self.get_opts(self.FIELDS)
+ raw_output = self.openstack('volume qos show ' + self.ID + opts)
+ self.assertEqual(self.ID + "\n" + self.NAME + "\n", raw_output)
+
+ def test_volume_qos_metadata(self):
+ raw_output = self.openstack(
+ 'volume qos set --property a=b --property c=d ' + self.ID)
+ self.assertEqual("", raw_output)
+ opts = self.get_opts(['name', 'specs'])
+ raw_output = self.openstack('volume qos show ' + self.ID + opts)
+ self.assertEqual(self.NAME + "\na='b', c='d'\n", raw_output)
diff --git a/openstackclient/tests/functional/volume/v1/test_volume.py b/openstackclient/tests/functional/volume/v1/test_volume.py
new file mode 100644
index 00000000..6ac7f2bf
--- /dev/null
+++ b/openstackclient/tests/functional/volume/v1/test_volume.py
@@ -0,0 +1,77 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import uuid
+
+from openstackclient.tests.functional.volume.v1 import common
+
+
+class VolumeTests(common.BaseVolumeTests):
+ """Functional tests for volume. """
+
+ NAME = uuid.uuid4().hex
+ OTHER_NAME = uuid.uuid4().hex
+ HEADERS = ['"Display Name"']
+ FIELDS = ['display_name']
+
+ @classmethod
+ def setUpClass(cls):
+ super(VolumeTests, cls).setUpClass()
+ opts = cls.get_opts(cls.FIELDS)
+ raw_output = cls.openstack('volume create --size 1 ' + cls.NAME + opts)
+ expected = cls.NAME + '\n'
+ cls.assertOutput(expected, raw_output)
+
+ @classmethod
+ def tearDownClass(cls):
+ # Rename test
+ raw_output = cls.openstack(
+ 'volume set --name ' + cls.OTHER_NAME + ' ' + cls.NAME)
+ cls.assertOutput('', raw_output)
+ # Delete test
+ raw_output = cls.openstack('volume delete ' + cls.OTHER_NAME)
+ cls.assertOutput('', raw_output)
+
+ def test_volume_list(self):
+ opts = self.get_opts(self.HEADERS)
+ raw_output = self.openstack('volume list' + opts)
+ self.assertIn(self.NAME, raw_output)
+
+ def test_volume_show(self):
+ opts = self.get_opts(self.FIELDS)
+ raw_output = self.openstack('volume show ' + self.NAME + opts)
+ self.assertEqual(self.NAME + "\n", raw_output)
+
+ def test_volume_properties(self):
+ raw_output = self.openstack(
+ 'volume set --property a=b --property c=d ' + self.NAME)
+ self.assertEqual("", raw_output)
+ opts = self.get_opts(["properties"])
+ raw_output = self.openstack('volume show ' + self.NAME + opts)
+ self.assertEqual("a='b', c='d'\n", raw_output)
+
+ raw_output = self.openstack('volume unset --property a ' + self.NAME)
+ self.assertEqual("", raw_output)
+ raw_output = self.openstack('volume show ' + self.NAME + opts)
+ self.assertEqual("c='d'\n", raw_output)
+
+ def test_volume_set(self):
+ self.openstack('volume set --description RAMAC ' + self.NAME)
+ opts = self.get_opts(["display_description", "display_name"])
+ raw_output = self.openstack('volume show ' + self.NAME + opts)
+ self.assertEqual("RAMAC\n" + self.NAME + "\n", raw_output)
+
+ def test_volume_set_size(self):
+ self.openstack('volume set --size 2 ' + self.NAME)
+ opts = self.get_opts(["display_name", "size"])
+ raw_output = self.openstack('volume show ' + self.NAME + opts)
+ self.assertEqual(self.NAME + "\n2\n", raw_output)
diff --git a/openstackclient/tests/functional/volume/v1/test_volume_type.py b/openstackclient/tests/functional/volume/v1/test_volume_type.py
new file mode 100644
index 00000000..538545ab
--- /dev/null
+++ b/openstackclient/tests/functional/volume/v1/test_volume_type.py
@@ -0,0 +1,74 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import time
+import uuid
+
+from openstackclient.tests.functional.volume.v1 import common
+
+
+class VolumeTypeTests(common.BaseVolumeTests):
+ """Functional tests for volume type. """
+
+ NAME = uuid.uuid4().hex
+ HEADERS = ['"Name"']
+ FIELDS = ['name']
+
+ @classmethod
+ def setUpClass(cls):
+ super(VolumeTypeTests, cls).setUpClass()
+ opts = cls.get_opts(cls.FIELDS)
+ raw_output = cls.openstack('volume type create ' + cls.NAME + opts)
+ expected = cls.NAME + '\n'
+ cls.assertOutput(expected, raw_output)
+
+ @classmethod
+ def tearDownClass(cls):
+ raw_output = cls.openstack('volume type delete ' + cls.NAME)
+ cls.assertOutput('', raw_output)
+
+ def test_volume_type_list(self):
+ opts = self.get_opts(self.HEADERS)
+ raw_output = self.openstack('volume type list' + opts)
+ self.assertIn(self.NAME, raw_output)
+
+ def test_volume_type_show(self):
+ opts = self.get_opts(self.FIELDS)
+ raw_output = self.openstack('volume type show ' + self.NAME + opts)
+ self.assertEqual(self.NAME + "\n", raw_output)
+
+ def test_volume_type_set_unset_properties(self):
+ raw_output = self.openstack(
+ 'volume type set --property a=b --property c=d ' + self.NAME)
+ self.assertEqual("", raw_output)
+
+ opts = self.get_opts(["properties"])
+ raw_output = self.openstack('volume type show ' + self.NAME + opts)
+ self.assertEqual("a='b', c='d'\n", raw_output)
+
+ raw_output = self.openstack('volume type unset --property a '
+ + self.NAME)
+ self.assertEqual("", raw_output)
+ raw_output = self.openstack('volume type show ' + self.NAME + opts)
+ self.assertEqual("c='d'\n", raw_output)
+
+ def test_multi_delete(self):
+ vol_type1 = uuid.uuid4().hex
+ vol_type2 = uuid.uuid4().hex
+ self.openstack('volume type create ' + vol_type1)
+ time.sleep(5)
+ self.openstack('volume type create ' + vol_type2)
+ time.sleep(5)
+ cmd = 'volume type delete %s %s' % (vol_type1, vol_type2)
+ time.sleep(5)
+ raw_output = self.openstack(cmd)
+ self.assertOutput('', raw_output)
diff --git a/openstackclient/tests/functional/volume/v2/__init__.py b/openstackclient/tests/functional/volume/v2/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/openstackclient/tests/functional/volume/v2/__init__.py
diff --git a/openstackclient/tests/functional/volume/v2/common.py b/openstackclient/tests/functional/volume/v2/common.py
new file mode 100644
index 00000000..e279a6f6
--- /dev/null
+++ b/openstackclient/tests/functional/volume/v2/common.py
@@ -0,0 +1,23 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import os
+
+from openstackclient.tests.functional import base
+
+
+class BaseVolumeTests(base.TestCase):
+ """Base class for Volume functional tests. """
+
+ @classmethod
+ def setUpClass(cls):
+ os.environ['OS_VOLUME_API_VERSION'] = '2'
diff --git a/openstackclient/tests/functional/volume/v2/test_qos.py b/openstackclient/tests/functional/volume/v2/test_qos.py
new file mode 100644
index 00000000..a54acbfd
--- /dev/null
+++ b/openstackclient/tests/functional/volume/v2/test_qos.py
@@ -0,0 +1,62 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import uuid
+
+from openstackclient.tests.functional.volume.v2 import common
+
+
+class QosTests(common.BaseVolumeTests):
+ """Functional tests for volume qos. """
+
+ NAME = uuid.uuid4().hex
+ HEADERS = ['Name']
+ FIELDS = ['id', 'name']
+ ID = None
+
+ @classmethod
+ def setUpClass(cls):
+ super(QosTests, cls).setUpClass()
+ opts = cls.get_opts(cls.FIELDS)
+ raw_output = cls.openstack('volume qos create ' + cls.NAME + opts)
+ cls.ID, name, rol = raw_output.split('\n')
+ cls.assertOutput(cls.NAME, name)
+
+ @classmethod
+ def tearDownClass(cls):
+ raw_output = cls.openstack('volume qos delete ' + cls.ID)
+ cls.assertOutput('', raw_output)
+
+ def test_volume_qos_list(self):
+ opts = self.get_opts(self.HEADERS)
+ raw_output = self.openstack('volume qos list' + opts)
+ self.assertIn(self.NAME, raw_output)
+
+ def test_volume_qos_show(self):
+ opts = self.get_opts(self.FIELDS)
+ raw_output = self.openstack('volume qos show ' + self.ID + opts)
+ self.assertEqual(self.ID + "\n" + self.NAME + "\n", raw_output)
+
+ def test_volume_qos_metadata(self):
+ raw_output = self.openstack(
+ 'volume qos set --property a=b --property c=d ' + self.ID)
+ self.assertEqual("", raw_output)
+ opts = self.get_opts(['name', 'specs'])
+ raw_output = self.openstack('volume qos show ' + self.ID + opts)
+ self.assertEqual(self.NAME + "\na='b', c='d'\n", raw_output)
+
+ raw_output = self.openstack(
+ 'volume qos unset --property a ' + self.ID)
+ self.assertEqual("", raw_output)
+ opts = self.get_opts(['name', 'specs'])
+ raw_output = self.openstack('volume qos show ' + self.ID + opts)
+ self.assertEqual(self.NAME + "\nc='d'\n", raw_output)
diff --git a/openstackclient/tests/functional/volume/v2/test_snapshot.py b/openstackclient/tests/functional/volume/v2/test_snapshot.py
new file mode 100644
index 00000000..4582b67d
--- /dev/null
+++ b/openstackclient/tests/functional/volume/v2/test_snapshot.py
@@ -0,0 +1,83 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import time
+import uuid
+
+from openstackclient.tests.functional.volume.v2 import common
+
+
+class SnapshotTests(common.BaseVolumeTests):
+ """Functional tests for snapshot. """
+
+ VOLLY = uuid.uuid4().hex
+ NAME = uuid.uuid4().hex
+ OTHER_NAME = uuid.uuid4().hex
+ HEADERS = ['"Name"']
+
+ @classmethod
+ def wait_for_status(cls, command, status, tries):
+ opts = cls.get_opts(['status'])
+ for attempt in range(tries):
+ time.sleep(1)
+ raw_output = cls.openstack(command + opts)
+ if (raw_output == status):
+ return
+ cls.assertOutput(status, raw_output)
+
+ @classmethod
+ def setUpClass(cls):
+ super(SnapshotTests, cls).setUpClass()
+ cls.openstack('volume create --size 1 ' + cls.VOLLY)
+ cls.wait_for_status('volume show ' + cls.VOLLY, 'available\n', 3)
+ opts = cls.get_opts(['status'])
+ raw_output = cls.openstack('snapshot create --name ' + cls.NAME +
+ ' ' + cls.VOLLY + opts)
+ cls.assertOutput('creating\n', raw_output)
+ cls.wait_for_status('snapshot show ' + cls.NAME, 'available\n', 3)
+
+ @classmethod
+ def tearDownClass(cls):
+ # Rename test
+ raw_output = cls.openstack(
+ 'snapshot set --name ' + cls.OTHER_NAME + ' ' + cls.NAME)
+ cls.assertOutput('', raw_output)
+ # Delete test
+ raw_output = cls.openstack('snapshot delete ' + cls.OTHER_NAME)
+ cls.assertOutput('', raw_output)
+ cls.openstack('volume delete --force ' + cls.VOLLY, fail_ok=True)
+
+ def test_snapshot_list(self):
+ opts = self.get_opts(self.HEADERS)
+ raw_output = self.openstack('snapshot list' + opts)
+ self.assertIn(self.NAME, raw_output)
+
+ def test_snapshot_properties(self):
+ raw_output = self.openstack(
+ 'snapshot set --property a=b --property c=d ' + self.NAME)
+ self.assertEqual("", raw_output)
+ opts = self.get_opts(["properties"])
+ raw_output = self.openstack('snapshot show ' + self.NAME + opts)
+ self.assertEqual("a='b', c='d'\n", raw_output)
+
+ raw_output = self.openstack('snapshot unset --property a ' + self.NAME)
+ self.assertEqual("", raw_output)
+ raw_output = self.openstack('snapshot show ' + self.NAME + opts)
+ self.assertEqual("c='d'\n", raw_output)
+
+ def test_snapshot_set(self):
+ raw_output = self.openstack(
+ 'snapshot set --description backup ' + self.NAME)
+ self.assertEqual("", raw_output)
+ opts = self.get_opts(["description", "name"])
+ raw_output = self.openstack('snapshot show ' + self.NAME + opts)
+ self.assertEqual("backup\n" + self.NAME + "\n", raw_output)
diff --git a/openstackclient/tests/functional/volume/v2/test_volume.py b/openstackclient/tests/functional/volume/v2/test_volume.py
new file mode 100644
index 00000000..73273573
--- /dev/null
+++ b/openstackclient/tests/functional/volume/v2/test_volume.py
@@ -0,0 +1,137 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import time
+import uuid
+
+from openstackclient.tests.functional.volume.v2 import common
+
+
+class VolumeTests(common.BaseVolumeTests):
+ """Functional tests for volume. """
+
+ NAME = uuid.uuid4().hex
+ SNAPSHOT_NAME = uuid.uuid4().hex
+ VOLUME_FROM_SNAPSHOT_NAME = uuid.uuid4().hex
+ OTHER_NAME = uuid.uuid4().hex
+ HEADERS = ['"Display Name"']
+ FIELDS = ['name']
+
+ @classmethod
+ def setUpClass(cls):
+ super(VolumeTests, cls).setUpClass()
+ opts = cls.get_opts(cls.FIELDS)
+
+ # Create test volume
+ raw_output = cls.openstack('volume create --size 1 ' + cls.NAME + opts)
+ expected = cls.NAME + '\n'
+ cls.assertOutput(expected, raw_output)
+
+ @classmethod
+ def tearDownClass(cls):
+ # Rename test volume
+ raw_output = cls.openstack(
+ 'volume set --name ' + cls.OTHER_NAME + ' ' + cls.NAME)
+ cls.assertOutput('', raw_output)
+
+ # Set volume state
+ cls.openstack('volume set --state error ' + cls.OTHER_NAME)
+ opts = cls.get_opts(["status"])
+ raw_output_status = cls.openstack(
+ 'volume show ' + cls.OTHER_NAME + opts)
+
+ # Delete test volume
+ raw_output = cls.openstack('volume delete ' + cls.OTHER_NAME)
+ cls.assertOutput('', raw_output)
+ cls.assertOutput('error\n', raw_output_status)
+
+ def test_volume_list(self):
+ opts = self.get_opts(self.HEADERS)
+ raw_output = self.openstack('volume list' + opts)
+ self.assertIn(self.NAME, raw_output)
+
+ def test_volume_show(self):
+ opts = self.get_opts(self.FIELDS)
+ raw_output = self.openstack('volume show ' + self.NAME + opts)
+ self.assertEqual(self.NAME + "\n", raw_output)
+
+ def test_volume_properties(self):
+ raw_output = self.openstack(
+ 'volume set --property a=b --property c=d ' + self.NAME)
+ self.assertEqual("", raw_output)
+ opts = self.get_opts(["properties"])
+ raw_output = self.openstack('volume show ' + self.NAME + opts)
+ self.assertEqual("a='b', c='d'\n", raw_output)
+
+ raw_output = self.openstack('volume unset --property a ' + self.NAME)
+ self.assertEqual("", raw_output)
+ raw_output = self.openstack('volume show ' + self.NAME + opts)
+ self.assertEqual("c='d'\n", raw_output)
+
+ def test_volume_set(self):
+ discription = uuid.uuid4().hex
+ self.openstack('volume set --description ' + discription + ' ' +
+ self.NAME)
+ opts = self.get_opts(["description", "name"])
+ raw_output = self.openstack('volume show ' + self.NAME + opts)
+ self.assertEqual(discription + "\n" + self.NAME + "\n", raw_output)
+
+ def test_volume_set_size(self):
+ self.openstack('volume set --size 2 ' + self.NAME)
+ opts = self.get_opts(["name", "size"])
+ raw_output = self.openstack('volume show ' + self.NAME + opts)
+ self.assertEqual(self.NAME + "\n2\n", raw_output)
+
+ def test_volume_snapshot(self):
+ opts = self.get_opts(self.FIELDS)
+
+ # Create snapshot from test volume
+ raw_output = self.openstack('snapshot create ' + self.NAME +
+ ' --name ' + self.SNAPSHOT_NAME + opts)
+ expected = self.SNAPSHOT_NAME + '\n'
+ self.assertOutput(expected, raw_output)
+ self.wait_for("snapshot", self.SNAPSHOT_NAME, "available")
+
+ # Create volume from snapshot
+ raw_output = self.openstack('volume create --size 2 --snapshot ' +
+ self.SNAPSHOT_NAME + ' ' +
+ self.VOLUME_FROM_SNAPSHOT_NAME + opts)
+ expected = self.VOLUME_FROM_SNAPSHOT_NAME + '\n'
+ self.assertOutput(expected, raw_output)
+ self.wait_for("volume", self.VOLUME_FROM_SNAPSHOT_NAME, "available")
+
+ # Delete volume that create from snapshot
+ raw_output = self.openstack('volume delete ' +
+ self.VOLUME_FROM_SNAPSHOT_NAME)
+ self.assertOutput('', raw_output)
+
+ # Delete test snapshot
+ raw_output = self.openstack('snapshot delete ' + self.SNAPSHOT_NAME)
+ self.assertOutput('', raw_output)
+ self.wait_for("volume", self.NAME, "available")
+
+ def wait_for(self, check_type, check_name, desired_status, wait=120,
+ interval=5, failures=['ERROR']):
+ status = "notset"
+ total_sleep = 0
+ opts = self.get_opts(['status'])
+ while total_sleep < wait:
+ status = self.openstack(check_type + ' show ' + check_name + opts)
+ status = status.rstrip()
+ print('Checking {} {} Waiting for {} current status: {}'
+ .format(check_type, check_name, desired_status, status))
+ if status == desired_status:
+ break
+ self.assertNotIn(status, failures)
+ time.sleep(interval)
+ total_sleep += interval
+ self.assertEqual(desired_status, status)
diff --git a/openstackclient/tests/functional/volume/v2/test_volume_type.py b/openstackclient/tests/functional/volume/v2/test_volume_type.py
new file mode 100644
index 00000000..b62cbb39
--- /dev/null
+++ b/openstackclient/tests/functional/volume/v2/test_volume_type.py
@@ -0,0 +1,84 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import time
+import uuid
+
+from openstackclient.tests.functional.volume.v2 import common
+
+
+class VolumeTypeTests(common.BaseVolumeTests):
+ """Functional tests for volume type. """
+
+ NAME = uuid.uuid4().hex
+ HEADERS = ['"Name"']
+ FIELDS = ['name']
+
+ @classmethod
+ def setUpClass(cls):
+ super(VolumeTypeTests, cls).setUpClass()
+ opts = cls.get_opts(cls.FIELDS)
+ raw_output = cls.openstack(
+ 'volume type create --private ' + cls.NAME + opts)
+ expected = cls.NAME + '\n'
+ cls.assertOutput(expected, raw_output)
+
+ @classmethod
+ def tearDownClass(cls):
+ raw_output = cls.openstack('volume type delete ' + cls.NAME)
+ cls.assertOutput('', raw_output)
+
+ def test_volume_type_list(self):
+ opts = self.get_opts(self.HEADERS)
+ raw_output = self.openstack('volume type list' + opts)
+ self.assertIn(self.NAME, raw_output)
+
+ def test_volume_type_show(self):
+ opts = self.get_opts(self.FIELDS)
+ raw_output = self.openstack('volume type show ' + self.NAME + opts)
+ self.assertEqual(self.NAME + "\n", raw_output)
+
+ def test_volume_type_set_unset_properties(self):
+ raw_output = self.openstack(
+ 'volume type set --property a=b --property c=d ' + self.NAME)
+ self.assertEqual("", raw_output)
+
+ opts = self.get_opts(["properties"])
+ raw_output = self.openstack('volume type show ' + self.NAME + opts)
+ self.assertEqual("a='b', c='d'\n", raw_output)
+
+ raw_output = self.openstack('volume type unset --property a '
+ + self.NAME)
+ self.assertEqual("", raw_output)
+ raw_output = self.openstack('volume type show ' + self.NAME + opts)
+ self.assertEqual("c='d'\n", raw_output)
+
+ def test_volume_type_set_unset_project(self):
+ raw_output = self.openstack(
+ 'volume type set --project admin ' + self.NAME)
+ self.assertEqual("", raw_output)
+
+ raw_output = self.openstack(
+ 'volume type unset --project admin ' + self.NAME)
+ self.assertEqual("", raw_output)
+
+ def test_multi_delete(self):
+ vol_type1 = uuid.uuid4().hex
+ vol_type2 = uuid.uuid4().hex
+ self.openstack('volume type create ' + vol_type1)
+ time.sleep(5)
+ self.openstack('volume type create ' + vol_type2)
+ time.sleep(5)
+ cmd = 'volume type delete %s %s' % (vol_type1, vol_type2)
+ time.sleep(5)
+ raw_output = self.openstack(cmd)
+ self.assertOutput('', raw_output)