Stephen Finucane 7252a7a781 compute: Migrate 'host set' to SDK
This was the sole outstanding command to be migrated to SDK. We also
clean up the old in-tree wrappers we have in the process and add missing
error checks for the 'host list' and 'host show' commands.

Change-Id: I5635469b63ab3370fb5118e4f8a1758002381aa5
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
2024-07-02 17:52:02 +01:00

235 lines
6.7 KiB
Python

# Copyright 2016 IBM Corporation
#
# 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.compute.v2 import host
from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
from openstackclient.tests.unit import fakes
from openstackclient.tests.unit import utils as tests_utils
def _generate_fake_host():
return {
'service_id': 1,
'host': 'host1',
'uuid': 'host-id-' + uuid.uuid4().hex,
'vcpus': 10,
'memory_mb': 100,
'local_gb': 100,
'vcpus_used': 5,
'memory_mb_used': 50,
'local_gb_used': 10,
'hypervisor_type': 'xen',
'hypervisor_version': 1,
'hypervisor_hostname': 'devstack1',
'free_ram_mb': 50,
'free_disk_gb': 50,
'current_workload': 10,
'running_vms': 1,
'cpu_info': '',
'disk_available_least': 1,
'host_ip': '10.10.10.10',
'supported_instances': '',
'metrics': '',
'pci_stats': '',
'extra_resources': '',
'stats': '',
'numa_topology': '',
'ram_allocation_ratio': 1.0,
'cpu_allocation_ratio': 1.0,
'zone': 'zone-' + uuid.uuid4().hex,
'host_name': 'name-' + uuid.uuid4().hex,
'service': 'service-' + uuid.uuid4().hex,
'cpu': 4,
'disk_gb': 100,
'project': 'project-' + uuid.uuid4().hex,
}
class TestHostList(compute_fakes.TestComputev2):
def setUp(self):
super().setUp()
self._host = _generate_fake_host()
self.columns = ('Host Name', 'Service', 'Zone')
self.data = [
(
self._host['host_name'],
self._host['service'],
self._host['zone'],
)
]
self.compute_sdk_client.get.return_value = fakes.FakeResponse(
data={'hosts': [self._host]}
)
self.cmd = host.ListHost(self.app, None)
def test_host_list_no_option(self):
arglist = []
verifylist = []
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.compute_sdk_client.get.assert_called_with(
'/os-hosts', microversion='2.1'
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
def test_host_list_with_option(self):
arglist = [
'--zone',
self._host['zone'],
]
verifylist = [
('zone', self._host['zone']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.compute_sdk_client.get.assert_called_with(
'/os-hosts', microversion='2.1'
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
class TestHostSet(compute_fakes.TestComputev2):
def setUp(self):
super().setUp()
self._host = _generate_fake_host()
self.compute_sdk_client.put.return_value = fakes.FakeResponse()
self.cmd = host.SetHost(self.app, None)
def test_host_set_no_option(self):
arglist = [
self._host['host'],
]
verifylist = [
('host', self._host['host']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.assertIsNone(result)
self.compute_sdk_client.put.assert_not_called()
def test_host_set(self):
arglist = [
'--enable',
'--disable-maintenance',
self._host['host'],
]
verifylist = [
('enable', True),
('enable_maintenance', False),
('host', self._host['host']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.assertIsNone(result)
self.compute_sdk_client.put.assert_called_with(
f'/os-hosts/{self._host["host"]}',
json={
'maintenance_mode': 'disable',
'status': 'enable',
},
microversion='2.1',
)
class TestHostShow(compute_fakes.TestComputev2):
def setUp(self):
super().setUp()
self._host = _generate_fake_host()
self.columns = (
'Host',
'Project',
'CPU',
'Memory MB',
'Disk GB',
)
self.data = [
(
self._host['host'],
self._host['project'],
self._host['cpu'],
self._host['memory_mb'],
self._host['disk_gb'],
)
]
self.compute_sdk_client.get.return_value = fakes.FakeResponse(
data={
'host': [
{
'resource': {
'host': self._host['host'],
'project': self._host['project'],
'cpu': self._host['cpu'],
'memory_mb': self._host['memory_mb'],
'disk_gb': self._host['disk_gb'],
}
}
],
}
)
self.cmd = host.ShowHost(self.app, None)
def test_host_show_no_option(self):
arglist = []
verifylist = []
# Missing required args should bail here
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_host_show_with_option(self):
arglist = [
self._host['host_name'],
]
verifylist = [
('host', self._host['host_name']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.compute_sdk_client.get.assert_called_with(
'/os-hosts/' + self._host['host_name'], microversion='2.1'
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))