]>
git.proxmox.com Git - ceph.git/blob - ceph/src/ceph-volume/ceph_volume/tests/devices/lvm/test_prepare.py
2 from ceph_volume
.devices
import lvm
3 from mock
.mock
import patch
, Mock
8 def test_main_spits_help_with_no_arguments(self
, capsys
):
9 lvm
.main
.LVM([]).main()
10 stdout
, stderr
= capsys
.readouterr()
11 assert 'Use LVM and LVM-based technologies like dmcache to deploy' in stdout
13 def test_main_shows_activate_subcommands(self
, capsys
):
14 lvm
.main
.LVM([]).main()
15 stdout
, stderr
= capsys
.readouterr()
16 assert 'activate ' in stdout
17 assert 'Discover and mount' in stdout
19 def test_main_shows_prepare_subcommands(self
, capsys
):
20 lvm
.main
.LVM([]).main()
21 stdout
, stderr
= capsys
.readouterr()
22 assert 'prepare ' in stdout
23 assert 'Format an LVM device' in stdout
26 class TestPrepareDevice(object):
28 def test_cannot_use_device(self
, factory
):
29 args
= factory(data
='/dev/var/foo')
30 with pytest
.raises(RuntimeError) as error
:
31 p
= lvm
.prepare
.Prepare([])
33 p
.prepare_data_device( 'data', '0')
34 assert 'Cannot use device (/dev/var/foo)' in str(error
.value
)
35 assert 'A vg/lv path or an existing device is needed' in str(error
.value
)
38 class TestGetClusterFsid(object):
40 def test_fsid_is_passed_in(self
, factory
):
41 args
= factory(cluster_fsid
='aaaa-1111')
42 prepare_obj
= lvm
.prepare
.Prepare([])
43 prepare_obj
.args
= args
44 assert prepare_obj
.get_cluster_fsid() == 'aaaa-1111'
46 def test_fsid_is_read_from_ceph_conf(self
, factory
, conf_ceph_stub
):
47 conf_ceph_stub('[global]\nfsid = bbbb-2222')
48 prepare_obj
= lvm
.prepare
.Prepare([])
49 prepare_obj
.args
= factory(cluster_fsid
=None)
50 assert prepare_obj
.get_cluster_fsid() == 'bbbb-2222'
53 class TestPrepare(object):
55 def test_main_spits_help_with_no_arguments(self
, capsys
):
56 lvm
.prepare
.Prepare([]).main()
57 stdout
, stderr
= capsys
.readouterr()
58 assert 'Prepare an OSD by assigning an ID and FSID' in stdout
60 def test_main_shows_full_help(self
, capsys
):
61 with pytest
.raises(SystemExit):
62 lvm
.prepare
.Prepare(argv
=['--help']).main()
63 stdout
, stderr
= capsys
.readouterr()
64 assert 'Use the filestore objectstore' in stdout
65 assert 'Use the bluestore objectstore' in stdout
66 assert 'A physical device or logical' in stdout
68 def test_excludes_filestore_bluestore_flags(self
, capsys
, device_info
):
70 with pytest
.raises(SystemExit):
71 lvm
.prepare
.Prepare(argv
=['--data', '/dev/sdfoo', '--filestore', '--bluestore']).main()
72 stdout
, stderr
= capsys
.readouterr()
73 expected
= 'Cannot use --filestore (filestore) with --bluestore (bluestore)'
74 assert expected
in stderr
76 def test_excludes_other_filestore_bluestore_flags(self
, capsys
, device_info
):
78 with pytest
.raises(SystemExit):
79 lvm
.prepare
.Prepare(argv
=[
80 '--bluestore', '--data', '/dev/sdfoo',
81 '--journal', '/dev/sf14',
83 stdout
, stderr
= capsys
.readouterr()
84 expected
= 'Cannot use --bluestore (bluestore) with --journal (filestore)'
85 assert expected
in stderr
87 def test_excludes_block_and_journal_flags(self
, capsys
, device_info
):
89 with pytest
.raises(SystemExit):
90 lvm
.prepare
.Prepare(argv
=[
91 '--bluestore', '--data', '/dev/sdfoo', '--block.db', 'vg/ceph1',
92 '--journal', '/dev/sf14',
94 stdout
, stderr
= capsys
.readouterr()
95 expected
= 'Cannot use --block.db (bluestore) with --journal (filestore)'
96 assert expected
in stderr
98 def test_journal_is_required_with_filestore(self
, is_root
, monkeypatch
, device_info
):
99 monkeypatch
.setattr("os.path.exists", lambda path
: True)
101 with pytest
.raises(SystemExit) as error
:
102 lvm
.prepare
.Prepare(argv
=['--filestore', '--data', '/dev/sdfoo']).main()
103 expected
= '--journal is required when using --filestore'
104 assert expected
in str(error
.value
)
106 @patch('ceph_volume.devices.lvm.prepare.api.is_ceph_device')
107 def test_safe_prepare_osd_already_created(self
, m_is_ceph_device
):
108 m_is_ceph_device
.return_value
= True
109 with pytest
.raises(RuntimeError) as error
:
110 prepare
= lvm
.prepare
.Prepare(argv
=[])
111 prepare
.args
= Mock()
112 prepare
.args
.data
= '/dev/sdfoo'
113 prepare
.get_lv
= Mock()
114 prepare
.safe_prepare()
115 expected
= 'skipping {}, it is already prepared'.format('/dev/sdfoo')
116 assert expected
in str(error
.value
)
118 class TestGetJournalLV(object):
120 @pytest.mark
.parametrize('arg', ['', '///', None, '/dev/sda1'])
121 def test_no_journal_on_invalid_path(self
, monkeypatch
, arg
):
122 monkeypatch
.setattr(lvm
.prepare
.api
, 'get_lv', lambda **kw
: False)
123 prepare
= lvm
.prepare
.Prepare([])
124 assert prepare
.get_lv(arg
) is None
126 def test_no_journal_lv_found(self
, monkeypatch
):
127 # patch it with 0 so we know we are getting to get_lv
128 monkeypatch
.setattr(lvm
.prepare
.api
, 'get_lv', lambda **kw
: 0)
129 prepare
= lvm
.prepare
.Prepare([])
130 assert prepare
.get_lv('vg/lv') == 0
133 class TestActivate(object):
135 def test_main_spits_help_with_no_arguments(self
, capsys
):
136 lvm
.activate
.Activate([]).main()
137 stdout
, stderr
= capsys
.readouterr()
138 assert 'Activate OSDs by discovering them with' in stdout
140 def test_main_shows_full_help(self
, capsys
):
141 with pytest
.raises(SystemExit):
142 lvm
.activate
.Activate(argv
=['--help']).main()
143 stdout
, stderr
= capsys
.readouterr()
144 assert 'optional arguments' in stdout
145 assert 'positional arguments' in stdout