|
| 1 | +import unittest |
| 2 | +import unittest.mock as mock |
| 3 | + |
| 4 | +import XenAPI |
| 5 | + |
| 6 | +from sm import resetvdis |
| 7 | + |
| 8 | +HOST_UUID = "3fa1e58f-2545-4b3b-8e07-c53a6bab0a41" |
| 9 | +HOST_REF = "OpaqueRef:host1" |
| 10 | +OTHER_HOST_REF = "OpaqueRef:host2" |
| 11 | +SR_UUID = "3dd7d05e-8b7f-4d64-8801-ee2ee0b3ff81" |
| 12 | +SR_REF = "OpaqueRef:sr1" |
| 13 | +VDI_UUID = "b0dc7f19-4ee6-4d05-acd9-4a1b0f0e6be7" |
| 14 | +VDI_REF = "OpaqueRef:vdi1" |
| 15 | + |
| 16 | + |
| 17 | +@mock.patch('sm.resetvdis.util.SMlog', autospec=True) |
| 18 | +class TestResetSr(unittest.TestCase): |
| 19 | + def setUp(self): |
| 20 | + cleanup_patcher = mock.patch('sm.resetvdis.cleanup', autospec=True) |
| 21 | + cleanup_patcher.start() |
| 22 | + lock_patcher = mock.patch('sm.resetvdis.lock.Lock', autospec=True) |
| 23 | + lock_patcher.start() |
| 24 | + |
| 25 | + self.addCleanup(mock.patch.stopall) |
| 26 | + |
| 27 | + self.session = mock.MagicMock() |
| 28 | + self.session.xenapi.host.get_by_uuid.return_value = HOST_REF |
| 29 | + self.session.xenapi.SR.get_by_uuid.return_value = SR_REF |
| 30 | + |
| 31 | + def set_vdis(self, sm_config): |
| 32 | + self.session.xenapi.VDI.get_all_records_where.return_value = { |
| 33 | + VDI_REF: {"uuid": VDI_UUID, "sm_config": sm_config}} |
| 34 | + |
| 35 | + def test_reset_sr_clears_host_key(self, mock_log): |
| 36 | + self.set_vdis({"host_%s" % HOST_REF: "RW"}) |
| 37 | + |
| 38 | + resetvdis.reset_sr(self.session, HOST_UUID, SR_UUID, False) |
| 39 | + |
| 40 | + self.session.xenapi.VDI.remove_from_sm_config.assert_called_once_with( |
| 41 | + VDI_REF, "host_%s" % HOST_REF) |
| 42 | + |
| 43 | + def test_reset_sr_clears_activating_owned_by_host(self, mock_log): |
| 44 | + self.set_vdis({"activating": HOST_REF}) |
| 45 | + |
| 46 | + resetvdis.reset_sr(self.session, HOST_UUID, SR_UUID, False) |
| 47 | + |
| 48 | + self.session.xenapi.VDI.remove_from_sm_config.assert_called_once_with( |
| 49 | + VDI_REF, "activating") |
| 50 | + |
| 51 | + def test_reset_sr_keeps_activating_owned_by_other_host(self, mock_log): |
| 52 | + self.set_vdis({"activating": OTHER_HOST_REF}) |
| 53 | + |
| 54 | + resetvdis.reset_sr(self.session, HOST_UUID, SR_UUID, False) |
| 55 | + |
| 56 | + self.session.xenapi.VDI.remove_from_sm_config.assert_not_called() |
| 57 | + |
| 58 | + def test_reset_sr_keeps_legacy_activating(self, mock_log): |
| 59 | + # written by a host running a version predating owner encoding |
| 60 | + self.set_vdis({"activating": "True"}) |
| 61 | + |
| 62 | + resetvdis.reset_sr(self.session, HOST_UUID, SR_UUID, False) |
| 63 | + |
| 64 | + self.session.xenapi.VDI.remove_from_sm_config.assert_not_called() |
| 65 | + |
| 66 | + def test_reset_sr_clears_paused_on_master(self, mock_log): |
| 67 | + self.set_vdis({"paused": "true"}) |
| 68 | + |
| 69 | + resetvdis.reset_sr(self.session, HOST_UUID, SR_UUID, True) |
| 70 | + |
| 71 | + self.session.xenapi.VDI.remove_from_sm_config.assert_called_once_with( |
| 72 | + VDI_REF, "paused") |
| 73 | + |
| 74 | + |
| 75 | +@mock.patch('sm.resetvdis.util.SMlog', autospec=True) |
| 76 | +class TestResetVdi(unittest.TestCase): |
| 77 | + def setUp(self): |
| 78 | + self.session = mock.MagicMock() |
| 79 | + self.session.xenapi.VDI.get_by_uuid.return_value = VDI_REF |
| 80 | + |
| 81 | + def set_vdi(self, sm_config): |
| 82 | + self.session.xenapi.VDI.get_record.return_value = { |
| 83 | + "uuid": VDI_UUID, "SR": SR_REF, "sm_config": sm_config} |
| 84 | + |
| 85 | + def test_reset_vdi_force_clears_activating(self, mock_log): |
| 86 | + self.set_vdi({"activating": HOST_REF}) |
| 87 | + |
| 88 | + clean = resetvdis.reset_vdi(self.session, VDI_UUID, force=True, |
| 89 | + term_output=False) |
| 90 | + |
| 91 | + self.assertTrue(clean) |
| 92 | + self.session.xenapi.VDI.remove_from_sm_config.assert_called_once_with( |
| 93 | + VDI_REF, "activating") |
| 94 | + |
| 95 | + def test_reset_vdi_force_clears_legacy_activating(self, mock_log): |
| 96 | + self.set_vdi({"activating": "True"}) |
| 97 | + |
| 98 | + clean = resetvdis.reset_vdi(self.session, VDI_UUID, force=True, |
| 99 | + term_output=False) |
| 100 | + |
| 101 | + self.assertTrue(clean) |
| 102 | + self.session.xenapi.VDI.remove_from_sm_config.assert_called_once_with( |
| 103 | + VDI_REF, "activating") |
| 104 | + |
| 105 | + def test_reset_vdi_keeps_activating_of_valid_host(self, mock_log): |
| 106 | + self.set_vdi({"activating": HOST_REF}) |
| 107 | + self.session.xenapi.host.get_record.return_value = { |
| 108 | + "uuid": HOST_UUID, "name_label": "host1"} |
| 109 | + |
| 110 | + resetvdis.reset_vdi(self.session, VDI_UUID, force=False, |
| 111 | + term_output=False) |
| 112 | + |
| 113 | + self.session.xenapi.VDI.remove_from_sm_config.assert_not_called() |
| 114 | + |
| 115 | + def test_reset_vdi_clears_activating_of_invalid_host(self, mock_log): |
| 116 | + self.set_vdi({"activating": HOST_REF}) |
| 117 | + self.session.xenapi.host.get_record.side_effect = XenAPI.Failure( |
| 118 | + ["HANDLE_INVALID", "host", HOST_REF]) |
| 119 | + |
| 120 | + resetvdis.reset_vdi(self.session, VDI_UUID, force=False, |
| 121 | + term_output=False) |
| 122 | + |
| 123 | + self.session.xenapi.VDI.remove_from_sm_config.assert_called_once_with( |
| 124 | + VDI_REF, "activating") |
| 125 | + |
| 126 | + def test_reset_vdi_keeps_legacy_activating_without_force(self, mock_log): |
| 127 | + # a legacy 'True' value cannot be attributed to a host, so only |
| 128 | + # --force may clear it |
| 129 | + self.set_vdi({"activating": "True"}) |
| 130 | + |
| 131 | + resetvdis.reset_vdi(self.session, VDI_UUID, force=False, |
| 132 | + term_output=False) |
| 133 | + |
| 134 | + self.session.xenapi.VDI.remove_from_sm_config.assert_not_called() |
| 135 | + |
| 136 | + def test_reset_vdi_term_output_prints_activating(self, mock_log): |
| 137 | + self.set_vdi({"activating": HOST_REF}) |
| 138 | + |
| 139 | + with mock.patch('builtins.print') as mock_print: |
| 140 | + resetvdis.reset_vdi(self.session, VDI_UUID, force=True) |
| 141 | + |
| 142 | + self.session.xenapi.VDI.remove_from_sm_config.assert_called_once_with( |
| 143 | + VDI_REF, "activating") |
| 144 | + printed = "".join(str(c) for c in mock_print.call_args_list) |
| 145 | + self.assertIn("activating", printed) |
0 commit comments