Merge "volume: Migrate 'service *' to SDK"
This commit is contained in:
openstackclient
@ -12,108 +12,83 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
|
from openstack.block_storage.v2 import service as _service
|
||||||
|
from openstack.test import fakes as sdk_fakes
|
||||||
from osc_lib import exceptions
|
from osc_lib import exceptions
|
||||||
|
|
||||||
from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes
|
from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes
|
||||||
from openstackclient.volume.v2 import service
|
from openstackclient.volume.v2 import service
|
||||||
|
|
||||||
|
|
||||||
class TestService(volume_fakes.TestVolume):
|
class TestServiceList(volume_fakes.TestVolume):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super().setUp()
|
super().setUp()
|
||||||
|
|
||||||
# Get a shortcut to the ServiceManager Mock
|
self.service = sdk_fakes.generate_fake_resource(_service.Service)
|
||||||
self.service_mock = self.volume_client.services
|
self.volume_sdk_client.services.return_value = [self.service]
|
||||||
self.service_mock.reset_mock()
|
|
||||||
|
|
||||||
|
|
||||||
class TestServiceList(TestService):
|
|
||||||
# The service to be listed
|
|
||||||
services = volume_fakes.create_one_service()
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super().setUp()
|
|
||||||
|
|
||||||
self.service_mock.list.return_value = [self.services]
|
|
||||||
|
|
||||||
# Get the command object to test
|
|
||||||
self.cmd = service.ListService(self.app, None)
|
self.cmd = service.ListService(self.app, None)
|
||||||
|
|
||||||
def test_service_list(self):
|
def test_service_list(self):
|
||||||
arglist = [
|
arglist = [
|
||||||
'--host',
|
'--host',
|
||||||
self.services.host,
|
self.service.host,
|
||||||
'--service',
|
'--service',
|
||||||
self.services.binary,
|
self.service.binary,
|
||||||
]
|
]
|
||||||
verifylist = [
|
verifylist = [
|
||||||
('host', self.services.host),
|
('host', self.service.host),
|
||||||
('service', self.services.binary),
|
('service', self.service.binary),
|
||||||
]
|
]
|
||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
# In base command class Lister in cliff, abstract method take_action()
|
|
||||||
# returns a tuple containing the column names and an iterable
|
|
||||||
# containing the data to be listed.
|
|
||||||
columns, data = self.cmd.take_action(parsed_args)
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
expected_columns = [
|
expected_columns = (
|
||||||
'Binary',
|
'Binary',
|
||||||
'Host',
|
'Host',
|
||||||
'Zone',
|
'Zone',
|
||||||
'Status',
|
'Status',
|
||||||
'State',
|
'State',
|
||||||
'Updated At',
|
'Updated At',
|
||||||
]
|
)
|
||||||
|
|
||||||
# confirming if all expected columns are present in the result.
|
|
||||||
self.assertEqual(expected_columns, columns)
|
|
||||||
|
|
||||||
datalist = (
|
datalist = (
|
||||||
(
|
(
|
||||||
self.services.binary,
|
self.service.binary,
|
||||||
self.services.host,
|
self.service.host,
|
||||||
self.services.zone,
|
self.service.availability_zone,
|
||||||
self.services.status,
|
self.service.status,
|
||||||
self.services.state,
|
self.service.state,
|
||||||
self.services.updated_at,
|
self.service.updated_at,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
self.assertEqual(expected_columns, columns)
|
||||||
# confirming if all expected values are present in the result.
|
|
||||||
self.assertEqual(datalist, tuple(data))
|
self.assertEqual(datalist, tuple(data))
|
||||||
|
self.volume_sdk_client.services.assert_called_with(
|
||||||
# checking if proper call was made to list services
|
host=self.service.host,
|
||||||
self.service_mock.list.assert_called_with(
|
binary=self.service.binary,
|
||||||
self.services.host,
|
|
||||||
self.services.binary,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# checking if prohibited columns are present in output
|
|
||||||
self.assertNotIn("Disabled Reason", columns)
|
|
||||||
self.assertNotIn(self.services.disabled_reason, tuple(data))
|
|
||||||
|
|
||||||
def test_service_list_with_long_option(self):
|
def test_service_list_with_long_option(self):
|
||||||
arglist = [
|
arglist = [
|
||||||
'--host',
|
'--host',
|
||||||
self.services.host,
|
self.service.host,
|
||||||
'--service',
|
'--service',
|
||||||
self.services.binary,
|
self.service.binary,
|
||||||
'--long',
|
'--long',
|
||||||
]
|
]
|
||||||
verifylist = [
|
verifylist = [
|
||||||
('host', self.services.host),
|
('host', self.service.host),
|
||||||
('service', self.services.binary),
|
('service', self.service.binary),
|
||||||
('long', True),
|
('long', True),
|
||||||
]
|
]
|
||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
# In base command class Lister in cliff, abstract method take_action()
|
|
||||||
# returns a tuple containing the column names and an iterable
|
|
||||||
# containing the data to be listed.
|
|
||||||
columns, data = self.cmd.take_action(parsed_args)
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
expected_columns = [
|
expected_columns = (
|
||||||
'Binary',
|
'Binary',
|
||||||
'Host',
|
'Host',
|
||||||
'Zone',
|
'Zone',
|
||||||
@ -121,41 +96,34 @@ class TestServiceList(TestService):
|
|||||||
'State',
|
'State',
|
||||||
'Updated At',
|
'Updated At',
|
||||||
'Disabled Reason',
|
'Disabled Reason',
|
||||||
]
|
)
|
||||||
|
|
||||||
# confirming if all expected columns are present in the result.
|
|
||||||
self.assertEqual(expected_columns, columns)
|
|
||||||
|
|
||||||
datalist = (
|
datalist = (
|
||||||
(
|
(
|
||||||
self.services.binary,
|
self.service.binary,
|
||||||
self.services.host,
|
self.service.host,
|
||||||
self.services.zone,
|
self.service.availability_zone,
|
||||||
self.services.status,
|
self.service.status,
|
||||||
self.services.state,
|
self.service.state,
|
||||||
self.services.updated_at,
|
self.service.updated_at,
|
||||||
self.services.disabled_reason,
|
self.service.disabled_reason,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
self.assertEqual(expected_columns, columns)
|
||||||
# confirming if all expected values are present in the result.
|
|
||||||
self.assertEqual(datalist, tuple(data))
|
self.assertEqual(datalist, tuple(data))
|
||||||
|
self.volume_sdk_client.services.assert_called_with(
|
||||||
self.service_mock.list.assert_called_with(
|
host=self.service.host,
|
||||||
self.services.host,
|
binary=self.service.binary,
|
||||||
self.services.binary,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestServiceSet(TestService):
|
class TestServiceSet(volume_fakes.TestVolume):
|
||||||
service = volume_fakes.create_one_service()
|
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super().setUp()
|
super().setUp()
|
||||||
|
|
||||||
self.service_mock.enable.return_value = self.service
|
self.service = sdk_fakes.generate_fake_resource(_service.Service)
|
||||||
self.service_mock.disable.return_value = self.service
|
self.service.enable = mock.Mock(autospec=True)
|
||||||
self.service_mock.disable_log_reason.return_value = self.service
|
self.service.disable = mock.Mock(autospec=True)
|
||||||
|
self.volume_sdk_client.find_service.return_value = self.service
|
||||||
|
|
||||||
self.cmd = service.SetService(self.app, None)
|
self.cmd = service.SetService(self.app, None)
|
||||||
|
|
||||||
@ -171,9 +139,8 @@ class TestServiceSet(TestService):
|
|||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
result = self.cmd.take_action(parsed_args)
|
result = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
self.service_mock.enable.assert_not_called()
|
self.service.enable.assert_not_called()
|
||||||
self.service_mock.disable.assert_not_called()
|
self.service.disable.assert_not_called()
|
||||||
self.service_mock.disable_log_reason.assert_not_called()
|
|
||||||
self.assertIsNone(result)
|
self.assertIsNone(result)
|
||||||
|
|
||||||
def test_service_set_enable(self):
|
def test_service_set_enable(self):
|
||||||
@ -191,11 +158,8 @@ class TestServiceSet(TestService):
|
|||||||
|
|
||||||
result = self.cmd.take_action(parsed_args)
|
result = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
self.service_mock.enable.assert_called_with(
|
self.service.enable.assert_called_with(self.volume_sdk_client)
|
||||||
self.service.host, self.service.binary
|
self.service.disable.assert_not_called()
|
||||||
)
|
|
||||||
self.service_mock.disable.assert_not_called()
|
|
||||||
self.service_mock.disable_log_reason.assert_not_called()
|
|
||||||
self.assertIsNone(result)
|
self.assertIsNone(result)
|
||||||
|
|
||||||
def test_service_set_disable(self):
|
def test_service_set_disable(self):
|
||||||
@ -213,11 +177,10 @@ class TestServiceSet(TestService):
|
|||||||
|
|
||||||
result = self.cmd.take_action(parsed_args)
|
result = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
self.service_mock.disable.assert_called_with(
|
self.service.enable.assert_not_called()
|
||||||
self.service.host, self.service.binary
|
self.service.disable.assert_called_with(
|
||||||
|
self.volume_sdk_client, reason=None
|
||||||
)
|
)
|
||||||
self.service_mock.enable.assert_not_called()
|
|
||||||
self.service_mock.disable_log_reason.assert_not_called()
|
|
||||||
self.assertIsNone(result)
|
self.assertIsNone(result)
|
||||||
|
|
||||||
def test_service_set_disable_with_reason(self):
|
def test_service_set_disable_with_reason(self):
|
||||||
@ -239,8 +202,9 @@ class TestServiceSet(TestService):
|
|||||||
|
|
||||||
result = self.cmd.take_action(parsed_args)
|
result = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
self.service_mock.disable_log_reason.assert_called_with(
|
self.service.enable.assert_not_called()
|
||||||
self.service.host, self.service.binary, reason
|
self.service.disable.assert_called_with(
|
||||||
|
self.volume_sdk_client, reason=reason
|
||||||
)
|
)
|
||||||
self.assertIsNone(result)
|
self.assertIsNone(result)
|
||||||
|
|
||||||
@ -258,6 +222,7 @@ class TestServiceSet(TestService):
|
|||||||
('service', self.service.binary),
|
('service', self.service.binary),
|
||||||
]
|
]
|
||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.cmd.take_action(parsed_args)
|
self.cmd.take_action(parsed_args)
|
||||||
self.fail("CommandError should be raised.")
|
self.fail("CommandError should be raised.")
|
||||||
@ -284,6 +249,7 @@ class TestServiceSet(TestService):
|
|||||||
('service', self.service.binary),
|
('service', self.service.binary),
|
||||||
]
|
]
|
||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.cmd.take_action(parsed_args)
|
self.cmd.take_action(parsed_args)
|
||||||
self.fail("CommandError should be raised.")
|
self.fail("CommandError should be raised.")
|
||||||
|
@ -12,109 +12,83 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
|
|
||||||
from cinderclient import api_versions
|
from unittest import mock
|
||||||
|
|
||||||
|
from openstack.block_storage.v3 import service as _service
|
||||||
|
from openstack.test import fakes as sdk_fakes
|
||||||
from osc_lib import exceptions
|
from osc_lib import exceptions
|
||||||
|
|
||||||
from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
|
from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
|
||||||
from openstackclient.volume.v3 import service
|
from openstackclient.volume.v3 import service
|
||||||
|
|
||||||
|
|
||||||
class TestService(volume_fakes.TestVolume):
|
class TestServiceList(volume_fakes.TestVolume):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super().setUp()
|
super().setUp()
|
||||||
|
|
||||||
# Get a shortcut to the ServiceManager Mock
|
self.service = sdk_fakes.generate_fake_resource(_service.Service)
|
||||||
self.service_mock = self.volume_client.services
|
self.volume_sdk_client.services.return_value = [self.service]
|
||||||
self.service_mock.reset_mock()
|
|
||||||
|
|
||||||
|
|
||||||
class TestServiceList(TestService):
|
|
||||||
# The service to be listed
|
|
||||||
services = volume_fakes.create_one_service()
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super().setUp()
|
|
||||||
|
|
||||||
self.service_mock.list.return_value = [self.services]
|
|
||||||
|
|
||||||
# Get the command object to test
|
|
||||||
self.cmd = service.ListService(self.app, None)
|
self.cmd = service.ListService(self.app, None)
|
||||||
|
|
||||||
def test_service_list(self):
|
def test_service_list(self):
|
||||||
arglist = [
|
arglist = [
|
||||||
'--host',
|
'--host',
|
||||||
self.services.host,
|
self.service.host,
|
||||||
'--service',
|
'--service',
|
||||||
self.services.binary,
|
self.service.binary,
|
||||||
]
|
]
|
||||||
verifylist = [
|
verifylist = [
|
||||||
('host', self.services.host),
|
('host', self.service.host),
|
||||||
('service', self.services.binary),
|
('service', self.service.binary),
|
||||||
]
|
]
|
||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
# In base command class Lister in cliff, abstract method take_action()
|
|
||||||
# returns a tuple containing the column names and an iterable
|
|
||||||
# containing the data to be listed.
|
|
||||||
columns, data = self.cmd.take_action(parsed_args)
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
expected_columns = [
|
expected_columns = (
|
||||||
'Binary',
|
'Binary',
|
||||||
'Host',
|
'Host',
|
||||||
'Zone',
|
'Zone',
|
||||||
'Status',
|
'Status',
|
||||||
'State',
|
'State',
|
||||||
'Updated At',
|
'Updated At',
|
||||||
]
|
)
|
||||||
|
|
||||||
# confirming if all expected columns are present in the result.
|
|
||||||
self.assertEqual(expected_columns, columns)
|
|
||||||
|
|
||||||
datalist = (
|
datalist = (
|
||||||
(
|
(
|
||||||
self.services.binary,
|
self.service.binary,
|
||||||
self.services.host,
|
self.service.host,
|
||||||
self.services.zone,
|
self.service.availability_zone,
|
||||||
self.services.status,
|
self.service.status,
|
||||||
self.services.state,
|
self.service.state,
|
||||||
self.services.updated_at,
|
self.service.updated_at,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
self.assertEqual(expected_columns, columns)
|
||||||
# confirming if all expected values are present in the result.
|
|
||||||
self.assertEqual(datalist, tuple(data))
|
self.assertEqual(datalist, tuple(data))
|
||||||
|
self.volume_sdk_client.services.assert_called_with(
|
||||||
# checking if proper call was made to list services
|
host=self.service.host,
|
||||||
self.service_mock.list.assert_called_with(
|
binary=self.service.binary,
|
||||||
self.services.host,
|
|
||||||
self.services.binary,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# checking if prohibited columns are present in output
|
|
||||||
self.assertNotIn("Disabled Reason", columns)
|
|
||||||
self.assertNotIn(self.services.disabled_reason, tuple(data))
|
|
||||||
|
|
||||||
def test_service_list_with_long_option(self):
|
def test_service_list_with_long_option(self):
|
||||||
arglist = [
|
arglist = [
|
||||||
'--host',
|
'--host',
|
||||||
self.services.host,
|
self.service.host,
|
||||||
'--service',
|
'--service',
|
||||||
self.services.binary,
|
self.service.binary,
|
||||||
'--long',
|
'--long',
|
||||||
]
|
]
|
||||||
verifylist = [
|
verifylist = [
|
||||||
('host', self.services.host),
|
('host', self.service.host),
|
||||||
('service', self.services.binary),
|
('service', self.service.binary),
|
||||||
('long', True),
|
('long', True),
|
||||||
]
|
]
|
||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
# In base command class Lister in cliff, abstract method take_action()
|
|
||||||
# returns a tuple containing the column names and an iterable
|
|
||||||
# containing the data to be listed.
|
|
||||||
columns, data = self.cmd.take_action(parsed_args)
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
expected_columns = [
|
expected_columns = (
|
||||||
'Binary',
|
'Binary',
|
||||||
'Host',
|
'Host',
|
||||||
'Zone',
|
'Zone',
|
||||||
@ -122,55 +96,43 @@ class TestServiceList(TestService):
|
|||||||
'State',
|
'State',
|
||||||
'Updated At',
|
'Updated At',
|
||||||
'Disabled Reason',
|
'Disabled Reason',
|
||||||
]
|
)
|
||||||
|
|
||||||
# confirming if all expected columns are present in the result.
|
|
||||||
self.assertEqual(expected_columns, columns)
|
|
||||||
|
|
||||||
datalist = (
|
datalist = (
|
||||||
(
|
(
|
||||||
self.services.binary,
|
self.service.binary,
|
||||||
self.services.host,
|
self.service.host,
|
||||||
self.services.zone,
|
self.service.availability_zone,
|
||||||
self.services.status,
|
self.service.status,
|
||||||
self.services.state,
|
self.service.state,
|
||||||
self.services.updated_at,
|
self.service.updated_at,
|
||||||
self.services.disabled_reason,
|
self.service.disabled_reason,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
self.assertEqual(expected_columns, columns)
|
||||||
# confirming if all expected values are present in the result.
|
|
||||||
self.assertEqual(datalist, tuple(data))
|
self.assertEqual(datalist, tuple(data))
|
||||||
|
self.volume_sdk_client.services.assert_called_with(
|
||||||
self.service_mock.list.assert_called_with(
|
host=self.service.host,
|
||||||
self.services.host,
|
binary=self.service.binary,
|
||||||
self.services.binary,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_service_list_with_cluster(self):
|
def test_service_list_with_cluster(self):
|
||||||
self.volume_client.api_version = api_versions.APIVersion('3.7')
|
self.set_volume_api_version('3.7')
|
||||||
cluster = {'cluster': 'fake-cluster'}
|
|
||||||
cluster_service = volume_fakes.create_one_service(attrs=cluster)
|
|
||||||
self.service_mock.list.return_value = [cluster_service]
|
|
||||||
|
|
||||||
arglist = [
|
arglist = [
|
||||||
'--host',
|
'--host',
|
||||||
cluster_service.host,
|
self.service.host,
|
||||||
'--service',
|
'--service',
|
||||||
cluster_service.binary,
|
self.service.binary,
|
||||||
]
|
]
|
||||||
verifylist = [
|
verifylist = [
|
||||||
('host', cluster_service.host),
|
('host', self.service.host),
|
||||||
('service', cluster_service.binary),
|
('service', self.service.binary),
|
||||||
]
|
]
|
||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
# In base command class Lister in cliff, abstract method take_action()
|
|
||||||
# returns a tuple containing the column names and an iterable
|
|
||||||
# containing the data to be listed.
|
|
||||||
columns, data = self.cmd.take_action(parsed_args)
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
expected_columns = [
|
expected_columns = (
|
||||||
'Binary',
|
'Binary',
|
||||||
'Host',
|
'Host',
|
||||||
'Zone',
|
'Zone',
|
||||||
@ -178,60 +140,43 @@ class TestServiceList(TestService):
|
|||||||
'State',
|
'State',
|
||||||
'Updated At',
|
'Updated At',
|
||||||
'Cluster',
|
'Cluster',
|
||||||
]
|
)
|
||||||
|
|
||||||
# confirming if all expected columns are present in the result.
|
|
||||||
self.assertEqual(expected_columns, columns)
|
|
||||||
|
|
||||||
datalist = (
|
datalist = (
|
||||||
(
|
(
|
||||||
cluster_service.binary,
|
self.service.binary,
|
||||||
cluster_service.host,
|
self.service.host,
|
||||||
cluster_service.zone,
|
self.service.availability_zone,
|
||||||
cluster_service.status,
|
self.service.status,
|
||||||
cluster_service.state,
|
self.service.state,
|
||||||
cluster_service.updated_at,
|
self.service.updated_at,
|
||||||
cluster_service.cluster,
|
self.service.cluster,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
self.assertEqual(expected_columns, columns)
|
||||||
# confirming if all expected values are present in the result.
|
|
||||||
self.assertEqual(datalist, tuple(data))
|
self.assertEqual(datalist, tuple(data))
|
||||||
|
self.volume_sdk_client.services.assert_called_with(
|
||||||
# checking if proper call was made to list services
|
host=self.service.host,
|
||||||
self.service_mock.list.assert_called_with(
|
binary=self.service.binary,
|
||||||
cluster_service.host,
|
|
||||||
cluster_service.binary,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# checking if prohibited columns are present in output
|
|
||||||
self.assertNotIn("Disabled Reason", columns)
|
|
||||||
self.assertNotIn(cluster_service.disabled_reason, tuple(data))
|
|
||||||
|
|
||||||
def test_service_list_with_backend_state(self):
|
def test_service_list_with_backend_state(self):
|
||||||
self.volume_client.api_version = api_versions.APIVersion('3.49')
|
self.set_volume_api_version('3.49')
|
||||||
backend_state = {'cluster': 'fake-cluster', 'backend_state': 'up'}
|
|
||||||
backend_service = volume_fakes.create_one_service(attrs=backend_state)
|
|
||||||
self.service_mock.list.return_value = [backend_service]
|
|
||||||
|
|
||||||
arglist = [
|
arglist = [
|
||||||
'--host',
|
'--host',
|
||||||
backend_service.host,
|
self.service.host,
|
||||||
'--service',
|
'--service',
|
||||||
backend_service.binary,
|
self.service.binary,
|
||||||
]
|
]
|
||||||
verifylist = [
|
verifylist = [
|
||||||
('host', backend_service.host),
|
('host', self.service.host),
|
||||||
('service', backend_service.binary),
|
('service', self.service.binary),
|
||||||
]
|
]
|
||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
# In base command class Lister in cliff, abstract method take_action()
|
|
||||||
# returns a tuple containing the column names and an iterable
|
|
||||||
# containing the data to be listed.
|
|
||||||
columns, data = self.cmd.take_action(parsed_args)
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
expected_columns = [
|
expected_columns = (
|
||||||
'Binary',
|
'Binary',
|
||||||
'Host',
|
'Host',
|
||||||
'Zone',
|
'Zone',
|
||||||
@ -240,47 +185,35 @@ class TestServiceList(TestService):
|
|||||||
'Updated At',
|
'Updated At',
|
||||||
'Cluster',
|
'Cluster',
|
||||||
'Backend State',
|
'Backend State',
|
||||||
]
|
)
|
||||||
|
|
||||||
# confirming if all expected columns are present in the result.
|
|
||||||
self.assertEqual(expected_columns, columns)
|
|
||||||
|
|
||||||
datalist = (
|
datalist = (
|
||||||
(
|
(
|
||||||
backend_service.binary,
|
self.service.binary,
|
||||||
backend_service.host,
|
self.service.host,
|
||||||
backend_service.zone,
|
self.service.availability_zone,
|
||||||
backend_service.status,
|
self.service.status,
|
||||||
backend_service.state,
|
self.service.state,
|
||||||
backend_service.updated_at,
|
self.service.updated_at,
|
||||||
backend_service.cluster,
|
self.service.cluster,
|
||||||
backend_service.backend_state,
|
self.service.backend_state,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
self.assertEqual(expected_columns, columns)
|
||||||
# confirming if all expected values are present in the result.
|
|
||||||
self.assertEqual(datalist, tuple(data))
|
self.assertEqual(datalist, tuple(data))
|
||||||
|
self.volume_sdk_client.services.assert_called_with(
|
||||||
# checking if proper call was made to list services
|
host=self.service.host,
|
||||||
self.service_mock.list.assert_called_with(
|
binary=self.service.binary,
|
||||||
backend_service.host,
|
|
||||||
backend_service.binary,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# checking if prohibited columns are present in output
|
|
||||||
self.assertNotIn("Disabled Reason", columns)
|
|
||||||
self.assertNotIn(backend_service.disabled_reason, tuple(data))
|
|
||||||
|
|
||||||
|
|
||||||
class TestServiceSet(TestService):
|
|
||||||
service = volume_fakes.create_one_service()
|
|
||||||
|
|
||||||
|
class TestServiceSet(volume_fakes.TestVolume):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super().setUp()
|
super().setUp()
|
||||||
|
|
||||||
self.service_mock.enable.return_value = self.service
|
self.service = sdk_fakes.generate_fake_resource(_service.Service)
|
||||||
self.service_mock.disable.return_value = self.service
|
self.service.enable = mock.Mock(autospec=True)
|
||||||
self.service_mock.disable_log_reason.return_value = self.service
|
self.service.disable = mock.Mock(autospec=True)
|
||||||
|
self.volume_sdk_client.find_service.return_value = self.service
|
||||||
|
|
||||||
self.cmd = service.SetService(self.app, None)
|
self.cmd = service.SetService(self.app, None)
|
||||||
|
|
||||||
@ -296,9 +229,8 @@ class TestServiceSet(TestService):
|
|||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
result = self.cmd.take_action(parsed_args)
|
result = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
self.service_mock.enable.assert_not_called()
|
self.service.enable.assert_not_called()
|
||||||
self.service_mock.disable.assert_not_called()
|
self.service.disable.assert_not_called()
|
||||||
self.service_mock.disable_log_reason.assert_not_called()
|
|
||||||
self.assertIsNone(result)
|
self.assertIsNone(result)
|
||||||
|
|
||||||
def test_service_set_enable(self):
|
def test_service_set_enable(self):
|
||||||
@ -316,11 +248,8 @@ class TestServiceSet(TestService):
|
|||||||
|
|
||||||
result = self.cmd.take_action(parsed_args)
|
result = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
self.service_mock.enable.assert_called_with(
|
self.service.enable.assert_called_with(self.volume_sdk_client)
|
||||||
self.service.host, self.service.binary
|
self.service.disable.assert_not_called()
|
||||||
)
|
|
||||||
self.service_mock.disable.assert_not_called()
|
|
||||||
self.service_mock.disable_log_reason.assert_not_called()
|
|
||||||
self.assertIsNone(result)
|
self.assertIsNone(result)
|
||||||
|
|
||||||
def test_service_set_disable(self):
|
def test_service_set_disable(self):
|
||||||
@ -338,11 +267,10 @@ class TestServiceSet(TestService):
|
|||||||
|
|
||||||
result = self.cmd.take_action(parsed_args)
|
result = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
self.service_mock.disable.assert_called_with(
|
self.service.enable.assert_not_called()
|
||||||
self.service.host, self.service.binary
|
self.service.disable.assert_called_with(
|
||||||
|
self.volume_sdk_client, reason=None
|
||||||
)
|
)
|
||||||
self.service_mock.enable.assert_not_called()
|
|
||||||
self.service_mock.disable_log_reason.assert_not_called()
|
|
||||||
self.assertIsNone(result)
|
self.assertIsNone(result)
|
||||||
|
|
||||||
def test_service_set_disable_with_reason(self):
|
def test_service_set_disable_with_reason(self):
|
||||||
@ -364,8 +292,9 @@ class TestServiceSet(TestService):
|
|||||||
|
|
||||||
result = self.cmd.take_action(parsed_args)
|
result = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
self.service_mock.disable_log_reason.assert_called_with(
|
self.service.enable.assert_not_called()
|
||||||
self.service.host, self.service.binary, reason
|
self.service.disable.assert_called_with(
|
||||||
|
self.volume_sdk_client, reason=reason
|
||||||
)
|
)
|
||||||
self.assertIsNone(result)
|
self.assertIsNone(result)
|
||||||
|
|
||||||
@ -383,6 +312,7 @@ class TestServiceSet(TestService):
|
|||||||
('service', self.service.binary),
|
('service', self.service.binary),
|
||||||
]
|
]
|
||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.cmd.take_action(parsed_args)
|
self.cmd.take_action(parsed_args)
|
||||||
self.fail("CommandError should be raised.")
|
self.fail("CommandError should be raised.")
|
||||||
@ -409,6 +339,7 @@ class TestServiceSet(TestService):
|
|||||||
('service', self.service.binary),
|
('service', self.service.binary),
|
||||||
]
|
]
|
||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.cmd.take_action(parsed_args)
|
self.cmd.take_action(parsed_args)
|
||||||
self.fail("CommandError should be raised.")
|
self.fail("CommandError should be raised.")
|
||||||
|
@ -45,33 +45,34 @@ class ListService(command.Lister):
|
|||||||
return parser
|
return parser
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
service_client = self.app.client_manager.volume
|
volume_client = self.app.client_manager.sdk_connection.volume
|
||||||
|
|
||||||
|
columns: tuple[str, ...] = (
|
||||||
|
"binary",
|
||||||
|
"host",
|
||||||
|
"availability_zone",
|
||||||
|
"status",
|
||||||
|
"state",
|
||||||
|
"updated_at",
|
||||||
|
)
|
||||||
|
column_names: tuple[str, ...] = (
|
||||||
|
"Binary",
|
||||||
|
"Host",
|
||||||
|
"Zone",
|
||||||
|
"Status",
|
||||||
|
"State",
|
||||||
|
"Updated At",
|
||||||
|
)
|
||||||
|
|
||||||
if parsed_args.long:
|
if parsed_args.long:
|
||||||
columns = [
|
columns += ("disabled_reason",)
|
||||||
"Binary",
|
column_names += ("Disabled Reason",)
|
||||||
"Host",
|
|
||||||
"Zone",
|
|
||||||
"Status",
|
|
||||||
"State",
|
|
||||||
"Updated At",
|
|
||||||
"Disabled Reason",
|
|
||||||
]
|
|
||||||
else:
|
|
||||||
columns = [
|
|
||||||
"Binary",
|
|
||||||
"Host",
|
|
||||||
"Zone",
|
|
||||||
"Status",
|
|
||||||
"State",
|
|
||||||
"Updated At",
|
|
||||||
]
|
|
||||||
|
|
||||||
data = service_client.services.list(
|
data = volume_client.services(
|
||||||
parsed_args.host, parsed_args.service
|
host=parsed_args.host, binary=parsed_args.service
|
||||||
)
|
)
|
||||||
return (
|
return (
|
||||||
columns,
|
column_names,
|
||||||
(
|
(
|
||||||
utils.get_item_properties(
|
utils.get_item_properties(
|
||||||
s,
|
s,
|
||||||
@ -87,7 +88,11 @@ class SetService(command.Command):
|
|||||||
|
|
||||||
def get_parser(self, prog_name):
|
def get_parser(self, prog_name):
|
||||||
parser = super().get_parser(prog_name)
|
parser = super().get_parser(prog_name)
|
||||||
parser.add_argument("host", metavar="<host>", help=_("Name of host"))
|
parser.add_argument(
|
||||||
|
"host",
|
||||||
|
metavar="<host>",
|
||||||
|
help=_("Name of host"),
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"service",
|
"service",
|
||||||
metavar="<service>",
|
metavar="<service>",
|
||||||
@ -118,19 +123,17 @@ class SetService(command.Command):
|
|||||||
)
|
)
|
||||||
raise exceptions.CommandError(msg)
|
raise exceptions.CommandError(msg)
|
||||||
|
|
||||||
service_client = self.app.client_manager.volume
|
volume_client = self.app.client_manager.sdk_connection.volume
|
||||||
|
|
||||||
|
service = volume_client.find_service(
|
||||||
|
host=parsed_args.host, service=parsed_args.service
|
||||||
|
)
|
||||||
|
|
||||||
if parsed_args.enable:
|
if parsed_args.enable:
|
||||||
service_client.services.enable(
|
service.enable(volume_client)
|
||||||
parsed_args.host, parsed_args.service
|
|
||||||
)
|
|
||||||
if parsed_args.disable:
|
if parsed_args.disable:
|
||||||
if parsed_args.disable_reason:
|
service.disable(
|
||||||
service_client.services.disable_log_reason(
|
volume_client,
|
||||||
parsed_args.host,
|
reason=parsed_args.disable_reason,
|
||||||
parsed_args.service,
|
)
|
||||||
parsed_args.disable_reason,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
service_client.services.disable(
|
|
||||||
parsed_args.host, parsed_args.service
|
|
||||||
)
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
"""Service action implementations"""
|
"""Service action implementations"""
|
||||||
|
|
||||||
from cinderclient import api_versions
|
from openstack import utils as sdk_utils
|
||||||
from osc_lib.command import command
|
from osc_lib.command import command
|
||||||
from osc_lib import exceptions
|
from osc_lib import exceptions
|
||||||
from osc_lib import utils
|
from osc_lib import utils
|
||||||
@ -46,29 +46,40 @@ class ListService(command.Lister):
|
|||||||
return parser
|
return parser
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
service_client = self.app.client_manager.volume
|
volume_client = self.app.client_manager.sdk_connection.volume
|
||||||
|
|
||||||
columns = [
|
columns: tuple[str, ...] = (
|
||||||
|
"binary",
|
||||||
|
"host",
|
||||||
|
"availability_zone",
|
||||||
|
"status",
|
||||||
|
"state",
|
||||||
|
"updated_at",
|
||||||
|
)
|
||||||
|
column_names: tuple[str, ...] = (
|
||||||
"Binary",
|
"Binary",
|
||||||
"Host",
|
"Host",
|
||||||
"Zone",
|
"Zone",
|
||||||
"Status",
|
"Status",
|
||||||
"State",
|
"State",
|
||||||
"Updated At",
|
"Updated At",
|
||||||
]
|
)
|
||||||
|
|
||||||
if service_client.api_version >= api_versions.APIVersion('3.7'):
|
if sdk_utils.supports_microversion(volume_client, '3.7'):
|
||||||
columns.append("Cluster")
|
columns += ("cluster",)
|
||||||
if service_client.api_version >= api_versions.APIVersion('3.49'):
|
column_names += ("Cluster",)
|
||||||
columns.append("Backend State")
|
if sdk_utils.supports_microversion(volume_client, '3.49'):
|
||||||
|
columns += ("backend_state",)
|
||||||
|
column_names += ("Backend State",)
|
||||||
if parsed_args.long:
|
if parsed_args.long:
|
||||||
columns.append("Disabled Reason")
|
columns += ("disabled_reason",)
|
||||||
|
column_names += ("Disabled Reason",)
|
||||||
|
|
||||||
data = service_client.services.list(
|
data = volume_client.services(
|
||||||
parsed_args.host, parsed_args.service
|
host=parsed_args.host, binary=parsed_args.service
|
||||||
)
|
)
|
||||||
return (
|
return (
|
||||||
columns,
|
column_names,
|
||||||
(
|
(
|
||||||
utils.get_item_properties(
|
utils.get_item_properties(
|
||||||
s,
|
s,
|
||||||
@ -84,7 +95,11 @@ class SetService(command.Command):
|
|||||||
|
|
||||||
def get_parser(self, prog_name):
|
def get_parser(self, prog_name):
|
||||||
parser = super().get_parser(prog_name)
|
parser = super().get_parser(prog_name)
|
||||||
parser.add_argument("host", metavar="<host>", help=_("Name of host"))
|
parser.add_argument(
|
||||||
|
"host",
|
||||||
|
metavar="<host>",
|
||||||
|
help=_("Name of host"),
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"service",
|
"service",
|
||||||
metavar="<service>",
|
metavar="<service>",
|
||||||
@ -115,19 +130,17 @@ class SetService(command.Command):
|
|||||||
)
|
)
|
||||||
raise exceptions.CommandError(msg)
|
raise exceptions.CommandError(msg)
|
||||||
|
|
||||||
service_client = self.app.client_manager.volume
|
volume_client = self.app.client_manager.sdk_connection.volume
|
||||||
|
|
||||||
|
service = volume_client.find_service(
|
||||||
|
host=parsed_args.host, service=parsed_args.service
|
||||||
|
)
|
||||||
|
|
||||||
if parsed_args.enable:
|
if parsed_args.enable:
|
||||||
service_client.services.enable(
|
service.enable(volume_client)
|
||||||
parsed_args.host, parsed_args.service
|
|
||||||
)
|
|
||||||
if parsed_args.disable:
|
if parsed_args.disable:
|
||||||
if parsed_args.disable_reason:
|
service.disable(
|
||||||
service_client.services.disable_log_reason(
|
volume_client,
|
||||||
parsed_args.host,
|
reason=parsed_args.disable_reason,
|
||||||
parsed_args.service,
|
)
|
||||||
parsed_args.disable_reason,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
service_client.services.disable(
|
|
||||||
parsed_args.host, parsed_args.service
|
|
||||||
)
|
|
||||||
|
Reference in New Issue
Block a user