summaryrefslogtreecommitdiff
path: root/openstackclient/tests/functional
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/tests/functional')
-rw-r--r--openstackclient/tests/functional/common/test_configuration.py43
-rw-r--r--openstackclient/tests/functional/compute/v2/test_aggregate.py209
-rw-r--r--openstackclient/tests/functional/identity/v3/test_group.py25
-rw-r--r--openstackclient/tests/functional/identity/v3/test_project.py13
-rw-r--r--openstackclient/tests/functional/volume/v1/test_qos.py134
-rw-r--r--openstackclient/tests/functional/volume/v2/test_qos.py141
6 files changed, 394 insertions, 171 deletions
diff --git a/openstackclient/tests/functional/common/test_configuration.py b/openstackclient/tests/functional/common/test_configuration.py
index f47d3b00..63a17d0e 100644
--- a/openstackclient/tests/functional/common/test_configuration.py
+++ b/openstackclient/tests/functional/common/test_configuration.py
@@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import json
import os
from openstackclient.common import configuration
@@ -20,25 +21,47 @@ BASIC_CONFIG_HEADERS = ['Field', 'Value']
class ConfigurationTests(base.TestCase):
-
- opts = "-f value -c auth.password"
+ """Functional test for configuration."""
def test_configuration_show(self):
+
+ # Test show without option
raw_output = self.openstack('configuration show')
items = self.parse_listing(raw_output)
self.assert_table_structure(items, BASIC_CONFIG_HEADERS)
- def test_configuration_show_unmask(self):
- raw_output = self.openstack('configuration show --unmask ' + self.opts)
+ cmd_output = json.loads(self.openstack(
+ 'configuration show -f json'
+ ))
+ self.assertEqual(
+ configuration.REDACTED,
+ cmd_output['auth.password']
+ )
+
+ # Test show --mask
+ cmd_output = json.loads(self.openstack(
+ 'configuration show --mask -f json'
+ ))
+ self.assertEqual(
+ configuration.REDACTED,
+ cmd_output['auth.password']
+ )
+
+ # Test show --unmask
+ cmd_output = json.loads(self.openstack(
+ 'configuration show --unmask -f json'
+ ))
# If we are using os-client-config, this will not be set. Rather than
# parse clouds.yaml to get the right value, just make sure
# we are not getting redacted.
passwd = os.environ.get('OS_PASSWORD')
if passwd:
- self.assertEqual(passwd + '\n', raw_output)
+ self.assertEqual(
+ passwd,
+ cmd_output['auth.password']
+ )
else:
- self.assertNotEqual(configuration.REDACTED + '\n', raw_output)
-
- def test_configuration_show_mask(self):
- raw_output = self.openstack('configuration show --mask ' + self.opts)
- self.assertEqual(configuration.REDACTED + '\n', raw_output)
+ self.assertNotEqual(
+ configuration.REDACTED,
+ cmd_output['auth.password']
+ )
diff --git a/openstackclient/tests/functional/compute/v2/test_aggregate.py b/openstackclient/tests/functional/compute/v2/test_aggregate.py
index 38368103..95068fc2 100644
--- a/openstackclient/tests/functional/compute/v2/test_aggregate.py
+++ b/openstackclient/tests/functional/compute/v2/test_aggregate.py
@@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import json
import uuid
from openstackclient.tests.functional import base
@@ -18,90 +19,164 @@ from openstackclient.tests.functional import base
class AggregateTests(base.TestCase):
"""Functional tests for aggregate."""
- NAME = uuid.uuid4().hex
- HEADERS = ['Name']
- FIELDS = ['name']
+ def test_aggregate_create_and_delete(self):
+ """Test create, delete multiple"""
+ name1 = uuid.uuid4().hex
+ cmd_output = json.loads(self.openstack(
+ 'aggregate create -f json ' +
+ '--zone nova ' +
+ name1))
+ self.assertEqual(
+ name1,
+ cmd_output['name']
+ )
+ self.assertEqual(
+ 'nova',
+ cmd_output['availability_zone']
+ )
- @classmethod
- def setUpClass(cls):
- opts = cls.get_opts(cls.FIELDS)
- # Use the default 'nova' availability zone for the aggregate.
- raw_output = cls.openstack(
- 'aggregate create --zone nova ' + cls.NAME + opts
+ name2 = uuid.uuid4().hex
+ cmd_output = json.loads(self.openstack(
+ 'aggregate create -f json ' +
+ '--zone nova ' +
+ name2))
+ self.assertEqual(
+ name2,
+ cmd_output['name']
+ )
+ self.assertEqual(
+ 'nova',
+ cmd_output['availability_zone']
)
- expected = cls.NAME + '\n'
- cls.assertOutput(expected, raw_output)
- @classmethod
- def tearDownClass(cls):
- raw_output = cls.openstack('aggregate delete ' + cls.NAME)
- cls.assertOutput('', raw_output)
+ del_output = self.openstack(
+ 'aggregate delete ' + name1 + ' ' + name2)
+ self.assertOutput('', del_output)
def test_aggregate_list(self):
- opts = self.get_opts(self.HEADERS)
- raw_output = self.openstack('aggregate list' + opts)
- self.assertIn(self.NAME, raw_output)
-
- def test_aggregate_show(self):
- opts = self.get_opts(self.FIELDS)
- raw_output = self.openstack('aggregate show ' + self.NAME + opts)
- self.assertEqual(self.NAME + "\n", raw_output)
+ """Test aggregate list"""
+ name1 = uuid.uuid4().hex
+ self.openstack(
+ 'aggregate create ' +
+ '--zone nova ' +
+ '--property a=b ' +
+ name1)
+ self.addCleanup(self.openstack, 'aggregate delete ' + name1)
- def test_aggregate_properties(self):
- opts = self.get_opts(['name', 'properties'])
+ name2 = uuid.uuid4().hex
+ self.openstack(
+ 'aggregate create ' +
+ '--zone internal ' +
+ '--property c=d ' +
+ name2)
+ self.addCleanup(self.openstack, 'aggregate delete ' + name2)
+
+ cmd_output = json.loads(self.openstack(
+ 'aggregate list -f json'))
+ names = [x['Name'] for x in cmd_output]
+ self.assertIn(name1, names)
+ self.assertIn(name2, names)
+ zones = [x['Availability Zone'] for x in cmd_output]
+ self.assertIn('nova', zones)
+ self.assertIn('internal', zones)
+
+ # Test aggregate list --long
+ cmd_output = json.loads(self.openstack(
+ 'aggregate list --long -f json'))
+ names = [x['Name'] for x in cmd_output]
+ self.assertIn(name1, names)
+ self.assertIn(name2, names)
+ zones = [x['Availability Zone'] for x in cmd_output]
+ self.assertIn('nova', zones)
+ self.assertIn('internal', zones)
+ properties = [x['Properties'] for x in cmd_output]
+ self.assertIn({'a': 'b'}, properties)
+ self.assertIn({'c': 'd'}, properties)
+
+ def test_aggregate_set_and_unset(self):
+ """Test aggregate set, show and unset"""
+ name1 = uuid.uuid4().hex
+ name2 = uuid.uuid4().hex
+ self.openstack(
+ 'aggregate create ' +
+ '--zone nova ' +
+ '--property a=b ' +
+ name1)
+ self.addCleanup(self.openstack, 'aggregate delete ' + name2)
raw_output = self.openstack(
- 'aggregate set --property a=b --property c=d ' + self.NAME
+ 'aggregate set --name ' +
+ name2 +
+ ' --zone internal ' +
+ '--no-property ' +
+ '--property c=d ' +
+ name1
)
- self.assertEqual('', raw_output)
-
- raw_output = self.openstack('aggregate show ' + self.NAME + opts)
- self.assertIn(self.NAME + "\na='b', c='d'\n", raw_output)
+ self.assertOutput('', raw_output)
- raw_output = self.openstack(
- 'aggregate unset --property a ' + self.NAME
+ cmd_output = json.loads(self.openstack(
+ 'aggregate show -f json ' + name2))
+ self.assertEqual(
+ name2,
+ cmd_output['name']
)
- self.assertEqual('', raw_output)
-
- raw_output = self.openstack('aggregate show ' + self.NAME + opts)
- self.assertIn(self.NAME + "\nc='d'\n", raw_output)
-
- raw_output = self.openstack(
- 'aggregate set --property a=b --property c=d ' + self.NAME
+ self.assertEqual(
+ 'internal',
+ cmd_output['availability_zone']
)
- self.assertEqual('', raw_output)
-
- raw_output = self.openstack(
- 'aggregate set --no-property ' + self.NAME
+ self.assertIn(
+ "c='d'",
+ cmd_output['properties']
+ )
+ self.assertNotIn(
+ "a='b'",
+ cmd_output['properties']
)
- self.assertEqual('', raw_output)
-
- raw_output = self.openstack('aggregate show ' + self.NAME + opts)
- self.assertNotIn("a='b', c='d'", raw_output)
-
- def test_aggregate_set(self):
- opts = self.get_opts(["name", "availability_zone"])
+ # Test unset
raw_output = self.openstack(
- 'aggregate set --zone Zone_1 ' + self.NAME)
- self.assertEqual("", raw_output)
+ 'aggregate unset --property c ' +
+ name2
+ )
+ self.assertOutput('', raw_output)
- raw_output = self.openstack('aggregate show ' + self.NAME + opts)
- self.assertEqual("Zone_1\n" + self.NAME + "\n", raw_output)
+ cmd_output = json.loads(self.openstack(
+ 'aggregate show -f json ' + name2))
+ self.assertNotIn(
+ "c='d'",
+ cmd_output['properties']
+ )
def test_aggregate_add_and_remove_host(self):
- opts = self.get_opts(["hosts", "name"])
-
- raw_output = self.openstack('host list -f value -c "Host Name"')
- host_name = raw_output.split()[0]
-
+ """Test aggregate add and remove host"""
+ name = uuid.uuid4().hex
self.openstack(
- 'aggregate add host ' + self.NAME + ' ' + host_name)
- raw_output = self.openstack('aggregate show ' + self.NAME + opts)
- self.assertEqual("[u'" + host_name + "']" + "\n" + self.NAME + "\n",
- raw_output)
+ 'aggregate create ' + name)
+ self.addCleanup(self.openstack, 'aggregate delete ' + name)
+
+ # Get a host
+ cmd_output = json.loads(self.openstack(
+ 'host list -f json'))
+ host_name = cmd_output[0]['Host Name']
+
+ # Test add host
+ cmd_output = json.loads(self.openstack(
+ 'aggregate add host -f json ' +
+ name + ' ' +
+ host_name
+ ))
+ self.assertIn(
+ host_name,
+ cmd_output['hosts']
+ )
- self.openstack(
- 'aggregate remove host ' + self.NAME + ' ' + host_name)
- raw_output = self.openstack('aggregate show ' + self.NAME + opts)
- self.assertEqual("[]\n" + self.NAME + "\n", raw_output)
+ # Test remove host
+ cmd_output = json.loads(self.openstack(
+ 'aggregate remove host -f json ' +
+ name + ' ' +
+ host_name
+ ))
+ self.assertNotIn(
+ host_name,
+ cmd_output['hosts']
+ )
diff --git a/openstackclient/tests/functional/identity/v3/test_group.py b/openstackclient/tests/functional/identity/v3/test_group.py
index 70491183..917d5df0 100644
--- a/openstackclient/tests/functional/identity/v3/test_group.py
+++ b/openstackclient/tests/functional/identity/v3/test_group.py
@@ -102,11 +102,7 @@ class GroupTests(common.IdentityTests):
'user_domain': self.domain_name,
'group': group_name,
'user': username})
- self.assertEqual(
- '%(user)s added to group %(group)s\n' % {'user': username,
- 'group': group_name},
- raw_output
- )
+ self.assertOutput('', raw_output)
def test_group_contains_user(self):
group_name = self._create_dummy_group()
@@ -128,11 +124,7 @@ class GroupTests(common.IdentityTests):
'user_domain': self.domain_name,
'group': group_name,
'user': username})
- self.assertEqual(
- '%(user)s added to group %(group)s\n' % {'user': username,
- 'group': group_name},
- raw_output
- )
+ self.assertOutput('', raw_output)
raw_output = self.openstack(
'group contains user '
'--group-domain %(group_domain)s '
@@ -165,14 +157,5 @@ class GroupTests(common.IdentityTests):
'user_domain': self.domain_name,
'group': group_name,
'user': username})
- self.assertEqual(
- '%(user)s added to group %(group)s\n' % {'user': username,
- 'group': group_name},
- add_raw_output
- )
- self.assertEqual(
- '%(user)s removed from '
- 'group %(group)s\n' % {'user': username,
- 'group': group_name},
- remove_raw_output
- )
+ self.assertOutput('', add_raw_output)
+ self.assertOutput('', remove_raw_output)
diff --git a/openstackclient/tests/functional/identity/v3/test_project.py b/openstackclient/tests/functional/identity/v3/test_project.py
index 5639dc16..96d41c3a 100644
--- a/openstackclient/tests/functional/identity/v3/test_project.py
+++ b/openstackclient/tests/functional/identity/v3/test_project.py
@@ -10,6 +10,8 @@
# License for the specific language governing permissions and limitations
# under the License.
+import json
+
from tempest.lib.common.utils import data_utils
from openstackclient.tests.functional.identity.v3 import common
@@ -111,3 +113,14 @@ class ProjectTests(common.IdentityTests):
'name': self.project_name})
items = self.parse_show(raw_output)
self.assert_show_fields(items, self.PROJECT_FIELDS)
+
+ def test_project_show_with_parents_children(self):
+ json_output = json.loads(self.openstack(
+ 'project show '
+ '--parents --children -f json '
+ '--domain %(domain)s '
+ '%(name)s' % {'domain': self.domain_name,
+ 'name': self.project_name}))
+ for attr_name in (self.PROJECT_FIELDS + ['parents', 'subtree']):
+ self.assertIn(attr_name, json_output)
+ self.assertEqual(self.project_name, json_output.get('name'))
diff --git a/openstackclient/tests/functional/volume/v1/test_qos.py b/openstackclient/tests/functional/volume/v1/test_qos.py
index 770d5acb..9ca32b0a 100644
--- a/openstackclient/tests/functional/volume/v1/test_qos.py
+++ b/openstackclient/tests/functional/volume/v1/test_qos.py
@@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import json
import uuid
from openstackclient.tests.functional.volume.v1 import common
@@ -18,38 +19,103 @@ 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):
+ def test_volume_qos_create_list(self):
+ """Test create, list, delete multiple"""
+ name1 = uuid.uuid4().hex
+ cmd_output = json.loads(self.openstack(
+ 'volume qos create -f json ' +
+ name1
+ ))
+ self.assertEqual(
+ name1,
+ cmd_output['name']
+ )
+
+ name2 = uuid.uuid4().hex
+ cmd_output = json.loads(self.openstack(
+ 'volume qos create -f json ' +
+ name2
+ ))
+ self.assertEqual(
+ name2,
+ cmd_output['name']
+ )
+
+ # Test list
+ cmd_output = json.loads(self.openstack(
+ 'volume qos list -f json'
+ ))
+ names = [x["Name"] for x in cmd_output]
+ self.assertIn(name1, names)
+ self.assertIn(name2, names)
+
+ # Test delete multiple
+ del_output = self.openstack('volume qos delete ' + name1 + ' ' + name2)
+ self.assertOutput('', del_output)
+
+ def test_volume_qos_set_show_unset(self):
+ """Tests create volume qos, set, unset, show, delete"""
+
+ name = uuid.uuid4().hex
+ cmd_output = json.loads(self.openstack(
+ 'volume qos create -f json ' +
+ '--consumer front-end '
+ '--property Alpha=a ' +
+ name
+ ))
+ self.addCleanup(self.openstack, 'volume qos delete ' + name)
+ self.assertEqual(
+ name,
+ cmd_output['name']
+ )
+
+ self.assertEqual(
+ "front-end",
+ cmd_output['consumer']
+ )
+
+ # Test volume qos set
+ raw_output = self.openstack(
+ 'volume qos set ' +
+ '--property Alpha=c ' +
+ '--property Beta=b ' +
+ name,
+ )
+ self.assertOutput('', raw_output)
+
+ # Test volume qos show
+ cmd_output = json.loads(self.openstack(
+ 'volume qos show -f json ' +
+ name
+ ))
+ self.assertEqual(
+ name,
+ cmd_output['name']
+ )
+ self.assertEqual(
+ "Alpha='c', Beta='b'",
+ cmd_output['specs']
+ )
+
+ # Test volume qos unset
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)
+ 'volume qos unset ' +
+ '--property Alpha ' +
+ name,
+ )
+ self.assertOutput('', raw_output)
+
+ cmd_output = json.loads(self.openstack(
+ 'volume qos show -f json ' +
+ name
+ ))
+ self.assertEqual(
+ name,
+ cmd_output['name']
+ )
+ self.assertEqual(
+ "Beta='b'",
+ cmd_output['specs']
+ )
+
+ # TODO(qiangjiahui): Add tests for associate and disassociate volume type
diff --git a/openstackclient/tests/functional/volume/v2/test_qos.py b/openstackclient/tests/functional/volume/v2/test_qos.py
index 1558c216..aee10dca 100644
--- a/openstackclient/tests/functional/volume/v2/test_qos.py
+++ b/openstackclient/tests/functional/volume/v2/test_qos.py
@@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import json
import uuid
from openstackclient.tests.functional.volume.v2 import common
@@ -18,45 +19,107 @@ 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):
+ def test_volume_qos_create_delete_list(self):
+ """Test create, list, delete multiple"""
+ name1 = uuid.uuid4().hex
+ cmd_output = json.loads(self.openstack(
+ 'volume qos create -f json ' +
+ name1
+ ))
+ self.assertEqual(
+ name1,
+ cmd_output['name']
+ )
+
+ name2 = uuid.uuid4().hex
+ cmd_output = json.loads(self.openstack(
+ 'volume qos create -f json ' +
+ name2
+ ))
+ self.assertEqual(
+ name2,
+ cmd_output['name']
+ )
+
+ # Test list
+ cmd_output = json.loads(self.openstack(
+ 'volume qos list -f json'
+ ))
+ names = [x["Name"] for x in cmd_output]
+ self.assertIn(name1, names)
+ self.assertIn(name2, names)
+
+ # Test delete multiple
+ del_output = self.openstack('volume qos delete ' + name1 + ' ' + name2)
+ self.assertOutput('', del_output)
+
+ def test_volume_qos_set_show_unset(self):
+ """Tests create volume qos, set, unset, show, delete"""
+
+ name = uuid.uuid4().hex
+ cmd_output = json.loads(self.openstack(
+ 'volume qos create -f json ' +
+ '--consumer front-end '
+ '--property Alpha=a ' +
+ name
+ ))
+ self.addCleanup(self.openstack, 'volume qos delete ' + name)
+ self.assertEqual(
+ name,
+ cmd_output['name']
+ )
+
+ self.assertEqual(
+ "front-end",
+ cmd_output['consumer']
+ )
+ self.assertEqual(
+ "Alpha='a'",
+ cmd_output['properties']
+ )
+
+ # Test volume qos set
raw_output = self.openstack(
- 'volume qos set --property a=b --property c=d ' + self.ID)
- self.assertEqual("", raw_output)
- opts = self.get_opts(['name', 'properties'])
- raw_output = self.openstack('volume qos show ' + self.ID + opts)
- self.assertEqual(self.NAME + "\na='b', c='d'\n", raw_output)
+ 'volume qos set ' +
+ '--property Alpha=c ' +
+ '--property Beta=b ' +
+ name,
+ )
+ self.assertOutput('', raw_output)
+
+ # Test volume qos show
+ cmd_output = json.loads(self.openstack(
+ 'volume qos show -f json ' +
+ name
+ ))
+ self.assertEqual(
+ name,
+ cmd_output['name']
+ )
+ self.assertEqual(
+ "Alpha='c', Beta='b'",
+ cmd_output['properties']
+ )
+ # Test volume qos unset
raw_output = self.openstack(
- 'volume qos unset --property a ' + self.ID)
- self.assertEqual("", raw_output)
- opts = self.get_opts(['name', 'properties'])
- raw_output = self.openstack('volume qos show ' + self.ID + opts)
- self.assertEqual(self.NAME + "\nc='d'\n", raw_output)
+ 'volume qos unset ' +
+ '--property Alpha ' +
+ name,
+ )
+ self.assertOutput('', raw_output)
+
+ cmd_output = json.loads(self.openstack(
+ 'volume qos show -f json ' +
+ name
+ ))
+ self.assertEqual(
+ name,
+ cmd_output['name']
+ )
+ self.assertEqual(
+ "Beta='b'",
+ cmd_output['properties']
+ )
+
+ # TODO(qiangjiahui): Add tests for associate and disassociate volume type