with pytest.raises(ArgumentError):
arg_validators.ValidBatchDevice()('foo')
- @pytest.mark.parametrize('format_', ['pretty', 'json', 'json-pretty'])
- def test_report(self, format_, factory, conf_ceph_stub, mock_device_generator):
- # just ensure reporting works
+ def test_exit_on_unavailable_fast_allocation(self, factory, conf_ceph_stub, mock_device_generator):
conf_ceph_stub('[global]\nfsid=asdf-lkjh')
devs = [mock_device_generator() for _ in range(5)]
+ fast_devs = [mock_device_generator()]
+ fast_devs[0].available_lvm = False
args = factory(data_slots=1,
osds_per_device=1,
osd_ids=[],
- report=True,
- format=format_,
devices=devs,
- db_devices=[],
+ db_devices=fast_devs,
wal_devices=[],
objectstore='bluestore',
- block_db_size=disk.Size(gb=1),
- block_db_slots=1,
+ block_db_size="1G",
+ block_db_slots=1.0,
dmcrypt=True,
data_allocate_fraction=1.0,
has_block_db_size_without_db_devices=None
)
b = batch.Batch([])
b.args = args
- plan = b.get_deployment_layout()
- b.report(plan)
+ with pytest.raises(SystemExit) as err:
+ b.get_deployment_layout()
+ assert err.value.code == 1
- @pytest.mark.parametrize('format_', ['json', 'json-pretty'])
- def test_json_report_valid_empty(self, format_, factory, conf_ceph_stub, mock_device_generator):
+ def test_exit_on_unavailable_very_fast_allocation(self, factory, conf_ceph_stub, mock_device_generator):
# ensure json reports are valid when empty
conf_ceph_stub('[global]\nfsid=asdf-lkjh')
- devs = []
+ devs = [mock_device_generator() for _ in range(5)]
+ fast_devs = [mock_device_generator()]
+ fast_devs[0].available_lvm = False
+ very_fast_devs = [mock_device_generator()]
+ very_fast_devs[0].available_lvm = False
args = factory(data_slots=1,
osds_per_device=1,
osd_ids=[],
- report=True,
- format=format_,
devices=devs,
- db_devices=[],
- wal_devices=[],
+ db_devices=fast_devs,
+ wal_devices=very_fast_devs,
objectstore='bluestore',
block_db_size="1G",
+ block_db_slots=5,
dmcrypt=True,
data_allocate_fraction=1.0,
+ has_block_db_size_without_db_devices=None
)
b = batch.Batch([])
b.args = args
- plan = b.get_deployment_layout()
- report = b._create_report(plan)
- json.loads(report)
+ with pytest.raises(SystemExit) as err:
+ b.get_deployment_layout()
+ assert err.value.code == 1
- @pytest.mark.parametrize('format_', ['json', 'json-pretty'])
- def test_json_report_valid_empty_unavailable_fast(self, format_, factory, conf_ceph_stub, mock_device_generator):
- # ensure json reports are valid when empty
+ @pytest.mark.parametrize('format_', ['pretty', 'json', 'json-pretty'])
+ def test_report(self, format_, factory, conf_ceph_stub, mock_device_generator):
+ # just ensure reporting works
conf_ceph_stub('[global]\nfsid=asdf-lkjh')
devs = [mock_device_generator() for _ in range(5)]
- fast_devs = [mock_device_generator()]
- fast_devs[0].available_lvm = False
args = factory(data_slots=1,
osds_per_device=1,
osd_ids=[],
report=True,
format=format_,
devices=devs,
- db_devices=fast_devs,
+ db_devices=[],
wal_devices=[],
objectstore='bluestore',
- block_db_size="1G",
- block_db_slots=1.0,
+ block_db_size=disk.Size(gb=1),
+ block_db_slots=1,
dmcrypt=True,
data_allocate_fraction=1.0,
has_block_db_size_without_db_devices=None
b = batch.Batch([])
b.args = args
plan = b.get_deployment_layout()
- report = b._create_report(plan)
- json.loads(report)
-
+ b.report(plan)
@pytest.mark.parametrize('format_', ['json', 'json-pretty'])
- def test_json_report_valid_empty_unavailable_very_fast(self, format_, factory, conf_ceph_stub, mock_device_generator):
+ def test_json_report_valid_empty(self, format_, factory, conf_ceph_stub, mock_device_generator):
# ensure json reports are valid when empty
conf_ceph_stub('[global]\nfsid=asdf-lkjh')
- devs = [mock_device_generator() for _ in range(5)]
- fast_devs = [mock_device_generator()]
- fast_devs[0].available_lvm = False
- very_fast_devs = [mock_device_generator()]
- very_fast_devs[0].available_lvm = False
+ devs = []
args = factory(data_slots=1,
osds_per_device=1,
osd_ids=[],
report=True,
format=format_,
devices=devs,
- db_devices=fast_devs,
- wal_devices=very_fast_devs,
+ db_devices=[],
+ wal_devices=[],
objectstore='bluestore',
block_db_size="1G",
- block_db_slots=5,
dmcrypt=True,
data_allocate_fraction=1.0,
- has_block_db_size_without_db_devices=None
)
b = batch.Batch([])
b.args = args
self.mgr.cache.save_host(host)
return ret_msg
- async def all_hosts() -> List[Optional[str]]:
+ async def all_hosts() -> List[str]:
futures = [create_from_spec_one(h, ds)
for h, ds in self.prepare_drivegroup(drive_group)]
- return await gather(*futures)
+ results = await gather(*futures, return_exceptions=True)
+ for result in results:
+ if isinstance(result, Exception):
+ self.mgr.log.error(f'Failed to create OSD: {result}')
+ return [result for result in results if isinstance(result, str)]
with self.mgr.async_timeout_handler('cephadm deploy (osd daemon)'):
ret = self.mgr.wait_async(all_hosts())
- return ", ".join(filter(None, ret))
+ return ", ".join(ret)
async def create_single_host(self,
drive_group: DriveGroupSpec,