Merge "Format aggregate command fields and de-race functional tests"

This commit is contained in:
Zuul 2019-08-27 18:04:57 +00:00 committed by Gerrit Code Review
commit c9cc8b0ae2
3 changed files with 117 additions and 29 deletions

View File

@ -18,6 +18,7 @@
import logging
from osc_lib.cli import format_columns
from osc_lib.cli import parseractions
from osc_lib.command import command
from osc_lib import exceptions
@ -58,6 +59,15 @@ class AddAggregateHost(command.ShowOne):
info = {}
info.update(data._info)
# Special mapping for columns to make the output easier to read:
# 'metadata' --> 'properties'
info.update(
{
'hosts': format_columns.ListColumn(info.pop('hosts')),
'properties': format_columns.DictColumn(info.pop('metadata')),
},
)
return zip(*sorted(six.iteritems(info)))
@ -101,8 +111,20 @@ class CreateAggregate(command.ShowOne):
parsed_args.property,
)._info)
# TODO(dtroyer): re-format metadata field to properites as
# in the set command
# Special mapping for columns to make the output easier to read:
# 'metadata' --> 'properties'
hosts = None
properties = None
if 'hosts' in info.keys():
hosts = format_columns.ListColumn(info.pop('hosts'))
if 'metadata' in info.keys():
properties = format_columns.DictColumn(info.pop('metadata'))
info.update(
{
'hosts': hosts,
'properties': properties,
},
)
return zip(*sorted(six.iteritems(info)))
@ -186,6 +208,10 @@ class ListAggregate(command.Lister):
return (column_headers,
(utils.get_item_properties(
s, columns,
formatters={
'Hosts': format_columns.ListColumn,
'Metadata': format_columns.DictColumn,
},
) for s in data))
@ -220,6 +246,15 @@ class RemoveAggregateHost(command.ShowOne):
info = {}
info.update(data._info)
# Special mapping for columns to make the output easier to read:
# 'metadata' --> 'properties'
info.update(
{
'hosts': format_columns.ListColumn(info.pop('hosts')),
'properties': format_columns.DictColumn(info.pop('metadata')),
},
)
return zip(*sorted(six.iteritems(info)))
@ -326,7 +361,12 @@ class ShowAggregate(command.ShowOne):
# 'metadata' --> 'properties'
data._info.update(
{
'properties': utils.format_dict(data._info.pop('metadata')),
'hosts': format_columns.ListColumn(
data._info.pop('hosts')
),
'properties': format_columns.DictColumn(
data._info.pop('metadata')
),
},
)

View File

@ -11,6 +11,7 @@
# under the License.
import json
import time
import uuid
from openstackclient.tests.functional import base
@ -19,6 +20,32 @@ from openstackclient.tests.functional import base
class AggregateTests(base.TestCase):
"""Functional tests for aggregate"""
@classmethod
def wait_for_status(cls, check_type, check_name, desired_status,
wait=120, interval=5, failures=None):
current_status = "notset"
if failures is None:
failures = ['error']
total_sleep = 0
while total_sleep < wait:
output = json.loads(cls.openstack(
check_type + ' show -f json ' + check_name))
current_status = output['name']
if (current_status == desired_status):
print('{} {} now has status {}'
.format(check_type, check_name, current_status))
return
print('Checking {} {} Waiting for {} current status: {}'
.format(check_type, check_name,
desired_status, current_status))
if current_status in failures:
raise Exception(
'Current status {} of {} {} is one of failures {}'
.format(current_status, check_type, check_name, failures))
time.sleep(interval)
total_sleep += interval
cls.assertOutput(desired_status, current_status)
def test_aggregate_crud(self):
"""Test create, delete multiple"""
name1 = uuid.uuid4().hex
@ -36,12 +63,16 @@ class AggregateTests(base.TestCase):
'nova',
cmd_output['availability_zone']
)
# TODO(dtroyer): enable the following once the properties field
# is correctly formatted in the create output
# self.assertIn(
# "a='b'",
# cmd_output['properties']
# )
self.assertIn(
'a',
cmd_output['properties']
)
self.wait_for_status('aggregate', name1, name1)
self.addCleanup(
self.openstack,
'aggregate delete ' + name1,
fail_ok=True,
)
name2 = uuid.uuid4().hex
cmd_output = json.loads(self.openstack(
@ -57,6 +88,12 @@ class AggregateTests(base.TestCase):
'external',
cmd_output['availability_zone']
)
self.wait_for_status('aggregate', name2, name2)
self.addCleanup(
self.openstack,
'aggregate delete ' + name2,
fail_ok=True,
)
# Test aggregate set
name3 = uuid.uuid4().hex
@ -69,6 +106,12 @@ class AggregateTests(base.TestCase):
name1
)
self.assertOutput('', raw_output)
self.wait_for_status('aggregate', name3, name3)
self.addCleanup(
self.openstack,
'aggregate delete ' + name3,
fail_ok=True,
)
cmd_output = json.loads(self.openstack(
'aggregate show -f json ' +
@ -83,11 +126,11 @@ class AggregateTests(base.TestCase):
cmd_output['availability_zone']
)
self.assertIn(
"c='d'",
'c',
cmd_output['properties']
)
self.assertNotIn(
"a='b'",
'a',
cmd_output['properties']
)

View File

@ -16,6 +16,7 @@
import mock
from mock import call
from osc_lib.cli import format_columns
from osc_lib import exceptions
from osc_lib import utils
@ -31,16 +32,16 @@ class TestAggregate(compute_fakes.TestComputev2):
'availability_zone',
'hosts',
'id',
'metadata',
'name',
'properties',
)
data = (
fake_ag.availability_zone,
fake_ag.hosts,
format_columns.ListColumn(fake_ag.hosts),
fake_ag.id,
fake_ag.metadata,
fake_ag.name,
format_columns.DictColumn(fake_ag.metadata),
)
def setUp(self):
@ -75,7 +76,7 @@ class TestAggregateAddHost(TestAggregate):
self.aggregate_mock.add_host.assert_called_once_with(self.fake_ag,
parsed_args.host)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
self.assertItemEqual(self.data, data)
class TestAggregateCreate(TestAggregate):
@ -99,7 +100,7 @@ class TestAggregateCreate(TestAggregate):
self.aggregate_mock.create.assert_called_once_with(parsed_args.name,
None)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
self.assertItemEqual(self.data, data)
def test_aggregate_create_with_zone(self):
arglist = [
@ -116,7 +117,7 @@ class TestAggregateCreate(TestAggregate):
self.aggregate_mock.create.assert_called_once_with(parsed_args.name,
parsed_args.zone)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
self.assertItemEqual(self.data, data)
def test_aggregate_create_with_property(self):
arglist = [
@ -135,7 +136,7 @@ class TestAggregateCreate(TestAggregate):
self.aggregate_mock.set_metadata.assert_called_once_with(
self.fake_ag, parsed_args.property)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
self.assertItemEqual(self.data, data)
class TestAggregateDelete(TestAggregate):
@ -234,8 +235,11 @@ class TestAggregateList(TestAggregate):
TestAggregate.fake_ag.id,
TestAggregate.fake_ag.name,
TestAggregate.fake_ag.availability_zone,
{key: value for key, value in TestAggregate.fake_ag.metadata.items()
if key != 'availability_zone'},
format_columns.DictColumn({
key: value
for key, value in TestAggregate.fake_ag.metadata.items()
if key != 'availability_zone'
}),
), )
def setUp(self):
@ -250,7 +254,7 @@ class TestAggregateList(TestAggregate):
columns, data = self.cmd.take_action(parsed_args)
self.assertEqual(self.list_columns, columns)
self.assertEqual(self.list_data, tuple(data))
self.assertItemEqual(self.list_data, tuple(data))
def test_aggregate_list_with_long(self):
arglist = [
@ -263,7 +267,7 @@ class TestAggregateList(TestAggregate):
columns, data = self.cmd.take_action(parsed_args)
self.assertEqual(self.list_columns_long, columns)
self.assertEqual(self.list_data_long, tuple(data))
self.assertListItemEqual(self.list_data_long, tuple(data))
class TestAggregateRemoveHost(TestAggregate):
@ -290,7 +294,7 @@ class TestAggregateRemoveHost(TestAggregate):
self.aggregate_mock.remove_host.assert_called_once_with(
self.fake_ag, parsed_args.host)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
self.assertItemEqual(self.data, data)
class TestAggregateSet(TestAggregate):
@ -440,13 +444,14 @@ class TestAggregateShow(TestAggregate):
data = (
TestAggregate.fake_ag.availability_zone,
TestAggregate.fake_ag.hosts,
format_columns.ListColumn(TestAggregate.fake_ag.hosts),
TestAggregate.fake_ag.id,
TestAggregate.fake_ag.name,
utils.format_dict(
{key: value
for key, value in TestAggregate.fake_ag.metadata.items()
if key != 'availability_zone'}),
format_columns.DictColumn({
key: value
for key, value in TestAggregate.fake_ag.metadata.items()
if key != 'availability_zone'
}),
)
def setUp(self):
@ -467,7 +472,7 @@ class TestAggregateShow(TestAggregate):
self.aggregate_mock.get.assert_called_once_with(parsed_args.aggregate)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
self.assertItemEqual(self.data, tuple(data))
class TestAggregateUnset(TestAggregate):