TODO:
- InventoryNode probably needs to be able to report labels
"""
- return [orchestrator.InventoryNode(host_name) for host_name in self.inventory_cache]
+ r = []
+ for hostname, info in self.inventory.items():
+ self.log.debug('host %s info %s' % (hostname, info))
+ r.append(orchestrator.InventoryNode(
+ hostname,
+ addr=info.get('addr', hostname),
+ labels=info.get('labels', []),
+ ))
+ return r
@async_completion
def add_host_label(self, host, label):
inventory = [
{
'name': 'host-0',
+ 'addr': '1.2.3.4',
'devices': [
{'path': 'nvme0n1'},
{'path': '/dev/sdb'},
},
{
'name': 'host-1',
+ 'addr': '1.2.3.5',
'devices': [
{'path': '/dev/sda'},
{'path': 'sdb'},
self.assertEqual(len(resp), 2)
host0 = resp[0]
self.assertEqual(host0['name'], 'host-0')
+ self.assertEqual(host0['addr'], '1.2.3.4')
self.assertEqual(host0['devices'][0]['osd_ids'], [1, 2])
self.assertEqual(host0['devices'][1]['osd_ids'], [1])
self.assertEqual(host0['devices'][2]['osd_ids'], [2])
host1 = resp[1]
self.assertEqual(host1['name'], 'host-1')
+ self.assertEqual(host1['addr'], '1.2.3.5')
self.assertEqual(host1['devices'][0]['osd_ids'], [])
self.assertEqual(host1['devices'][1]['osd_ids'], [3])
When fetching inventory, all Devices are groups inside of an
InventoryNode.
"""
- def __init__(self, name, devices=None, labels=None):
- # type: (str, Optional[inventory.Devices], Optional[List[str]]) -> None
+ def __init__(self, name, devices=None, labels=None, addr=None):
+ # type: (str, Optional[inventory.Devices], Optional[List[str]], Optional[str]) -> None
if devices is None:
devices = inventory.Devices([])
if labels is None:
assert isinstance(devices, inventory.Devices)
self.name = name # unique within cluster. For example a hostname.
+ self.addr = addr or name
self.devices = devices
self.labels = labels
def to_json(self):
return {
'name': self.name,
+ 'addr': self.addr,
'devices': self.devices.to_json(),
'labels': self.labels,
}
try:
_data = copy.deepcopy(data)
name = _data.pop('name')
+ addr = _data.pop('addr') or name
devices = inventory.Devices.from_json(_data.pop('devices'))
if _data:
error_msg = 'Unknown key(s) in Inventory: {}'.format(','.join(_data.keys()))
raise OrchestratorValidationError(error_msg)
labels = _data.get('labels', list())
- return cls(name, devices, labels)
+ return cls(name, devices, labels, addr)
except KeyError as e:
error_msg = '{} is required for {}'.format(e, cls.__name__)
raise OrchestratorValidationError(error_msg)
output = json.dumps(hosts, sort_keys=True)
else:
table = PrettyTable(
- ['HOST', 'LABELS'],
+ ['HOST', 'ADDR', 'LABELS'],
border=False)
table.align = 'l'
table.left_padding_width = 0
table.right_padding_width = 1
for node in completion.result:
- table.add_row((node.name, ' '.join(node.labels)))
+ table.add_row((node.name, node.addr, ' '.join(node.labels)))
output = table.get_string()
return HandleCommandResult(stdout=output)
def test_inventory():
json_data = {
'name': 'host0',
+ 'addr': '1.2.3.4',
'devices': [
{
'sys_api': {
for devices in json_data['devices']:
_test_resource(devices, inventory.Device)
- json_data = [{}, {'name': 'host0'}, {'devices': []}]
+ json_data = [{}, {'name': 'host0', 'addr': '1.2.3.4'}, {'devices': []}]
for data in json_data:
with pytest.raises(OrchestratorValidationError):
InventoryNode.from_json(data)