import pytest
from unittest.mock import patch
from ceph_volume.api import lvm
from ceph_volume.devices.lvm import deactivate

class TestDeactivate(object):

    @patch("ceph_volume.devices.lvm.deactivate.get_lvs_by_tag")
    def test_no_osd(self, p_get_lvs):
        p_get_lvs.return_value = []
        with pytest.raises(StopIteration):
            deactivate.deactivate_osd(0)

    @patch("ceph_volume.devices.lvm.deactivate.get_lvs_by_tag")
    @patch("ceph_volume.util.system.unmount_tmpfs")
    def test_unmount_tmpfs_called_osd_id(self, p_u_tmpfs, p_get_lvs):
        FooVolume = lvm.Volume(
            lv_name='foo', lv_path='/dev/vg/foo',
            lv_tags="ceph.osd_id=0,ceph.cluster_name=foo,ceph.type=data")
        p_get_lvs.return_value = [FooVolume]

        deactivate.deactivate_osd(0)
        p_u_tmpfs.assert_called_with(
            '/var/lib/ceph/osd/{}-{}'.format('foo', 0))

    @patch("ceph_volume.devices.lvm.deactivate.get_lvs_by_tag")
    @patch("ceph_volume.util.system.unmount_tmpfs")
    def test_unmount_tmpfs_called_osd_uuid(self, p_u_tmpfs, p_get_lvs):
        FooVolume = lvm.Volume(
            lv_name='foo', lv_path='/dev/vg/foo',
            lv_tags="ceph.osd_fsid=0,ceph.osd_id=1,ceph.cluster_name=foo,ceph.type=data")
        p_get_lvs.return_value = [FooVolume]

        deactivate.deactivate_osd(None, 0)
        p_u_tmpfs.assert_called_with(
            '/var/lib/ceph/osd/{}-{}'.format('foo', 1))

    @patch("ceph_volume.devices.lvm.deactivate.get_lvs_by_tag")
    @patch("ceph_volume.util.system.unmount_tmpfs")
    @patch("ceph_volume.util.encryption.dmcrypt_close")
    def test_no_crypt_no_dmclose(self, p_dm_close, p_u_tmpfs, p_get_lvs):
        FooVolume = lvm.Volume(
            lv_name='foo', lv_path='/dev/vg/foo',
            lv_tags="ceph.osd_id=0,ceph.cluster_name=foo,ceph.type=data")
        p_get_lvs.return_value = [FooVolume]

        deactivate.deactivate_osd(0)

    @patch("ceph_volume.devices.lvm.deactivate.get_lvs_by_tag")
    @patch("ceph_volume.util.system.unmount_tmpfs")
    @patch("ceph_volume.util.encryption.dmcrypt_close")
    def test_crypt_dmclose(self, p_dm_close, p_u_tmpfs, p_get_lvs):
        FooVolume = lvm.Volume(
            lv_name='foo', lv_path='/dev/vg/foo', lv_uuid='123',
            lv_tags="ceph.osd_id=0,ceph.encrypted=1,ceph.cluster_name=foo,ceph.type=data")
        p_get_lvs.return_value = [FooVolume]

        deactivate.deactivate_osd(0)
        p_dm_close.assert_called_with(mapping='123', skip_path_check=True)
