qvm_features.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. # -*- encoding: utf8 -*-
  2. #
  3. # The Qubes OS Project, http://www.qubes-os.org
  4. #
  5. # Copyright (C) 2017 Marek Marczykowski-Górecki
  6. # <marmarek@invisiblethingslab.com>
  7. #
  8. # This program is free software; you can redistribute it and/or modify
  9. # it under the terms of the GNU Lesser General Public License as published by
  10. # the Free Software Foundation; either version 2.1 of the License, or
  11. # (at your option) any later version.
  12. #
  13. # This program is distributed in the hope that it will be useful,
  14. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. # GNU Lesser General Public License for more details.
  17. #
  18. # You should have received a copy of the GNU Lesser General Public License along
  19. # with this program; if not, see <http://www.gnu.org/licenses/>.
  20. import qubesadmin.tests
  21. import qubesadmin.tools.qvm_features
  22. class TC_00_qvm_features(qubesadmin.tests.QubesTestCase):
  23. def test_000_list(self):
  24. self.app.expected_calls[
  25. ('dom0', 'mgmt.vm.List', None, None)] = \
  26. b'0\x00some-vm class=AppVM state=Running\n'
  27. self.app.expected_calls[
  28. ('some-vm', 'mgmt.vm.feature.List', None, None)] = \
  29. b'0\x00feature1\nfeature2\n'
  30. self.app.expected_calls[
  31. ('some-vm', 'mgmt.vm.feature.Get', 'feature1', None)] = \
  32. b'0\x00value1'
  33. self.app.expected_calls[
  34. ('some-vm', 'mgmt.vm.feature.Get', 'feature2', None)] = \
  35. b'0\x00value2 with spaces'
  36. with qubesadmin.tests.tools.StdoutBuffer() as stdout:
  37. self.assertEqual(
  38. qubesadmin.tools.qvm_features.main(['some-vm'], app=self.app),
  39. 0)
  40. self.assertEqual(stdout.getvalue(),
  41. 'feature1 value1\n'
  42. 'feature2 value2 with spaces\n')
  43. self.assertAllCalled()
  44. def test_001_set(self):
  45. self.app.expected_calls[
  46. ('dom0', 'mgmt.vm.List', None, None)] = \
  47. b'0\x00some-vm class=AppVM state=Running\n'
  48. self.app.expected_calls[
  49. ('some-vm', 'mgmt.vm.feature.Set',
  50. 'feature3', 'value of feature')] = b'0\x00'
  51. self.assertEqual(
  52. qubesadmin.tools.qvm_features.main(['some-vm', 'feature3',
  53. 'value of feature'],
  54. app=self.app),
  55. 0)
  56. self.assertAllCalled()
  57. def test_002_get(self):
  58. self.app.expected_calls[
  59. ('dom0', 'mgmt.vm.List', None, None)] = \
  60. b'0\x00some-vm class=AppVM state=Running\n'
  61. self.app.expected_calls[
  62. ('some-vm', 'mgmt.vm.feature.Get', 'feature3', None)] = \
  63. b'0\x00value2 with spaces'
  64. with qubesadmin.tests.tools.StdoutBuffer() as stdout:
  65. self.assertEqual(
  66. qubesadmin.tools.qvm_features.main(['some-vm', 'feature3'],
  67. app=self.app),
  68. 0)
  69. self.assertEqual(stdout.getvalue(),
  70. 'value2 with spaces\n')
  71. self.assertAllCalled()
  72. def test_003_del(self):
  73. self.app.expected_calls[
  74. ('dom0', 'mgmt.vm.List', None, None)] = \
  75. b'0\x00some-vm class=AppVM state=Running\n'
  76. self.app.expected_calls[
  77. ('some-vm', 'mgmt.vm.feature.Remove', 'feature4', None)] = \
  78. b'0\x00'
  79. with qubesadmin.tests.tools.StdoutBuffer() as stdout:
  80. self.assertEqual(
  81. qubesadmin.tools.qvm_features.main(['--unset', 'some-vm',
  82. 'feature4'],
  83. app=self.app),
  84. 0)
  85. self.assertEqual(stdout.getvalue(),
  86. '')
  87. self.assertAllCalled()
  88. def test_004_running_verbose(self):
  89. self.app.expected_calls[
  90. ('dom0', 'mgmt.vm.List', None, None)] = \
  91. b'0\x00some-vm class=AppVM state=Running\n' \
  92. b'some-vm2 class=AppVM state=Running\n' \
  93. b'some-vm3 class=AppVM state=Halted\n'
  94. self.app.expected_calls[
  95. ('some-vm', 'mgmt.vm.List', None, None)] = \
  96. b'0\x00some-vm class=AppVM state=Running\n'
  97. with qubesadmin.tests.tools.StdoutBuffer() as stdout:
  98. self.assertEqual(
  99. qubesadmin.tools.qvm_check.main(['--running',
  100. 'some-vm'], app=self.app),
  101. 0)
  102. self.assertEqual(stdout.getvalue(),
  103. 'VM some-vm is running\n')
  104. self.assertAllCalled()
  105. def test_005_running_multi_verbose(self):
  106. self.app.expected_calls[
  107. ('dom0', 'mgmt.vm.List', None, None)] = \
  108. b'0\x00some-vm class=AppVM state=Running\n' \
  109. b'some-vm2 class=AppVM state=Running\n' \
  110. b'some-vm3 class=AppVM state=Halted\n'
  111. self.app.expected_calls[
  112. ('some-vm', 'mgmt.vm.List', None, None)] = \
  113. b'0\x00some-vm class=AppVM state=Running\n'
  114. self.app.expected_calls[
  115. ('some-vm2', 'mgmt.vm.List', None, None)] = \
  116. b'0\x00some-vm2 class=AppVM state=Running\n'
  117. with qubesadmin.tests.tools.StdoutBuffer() as stdout:
  118. self.assertEqual(
  119. qubesadmin.tools.qvm_check.main(['--running',
  120. 'some-vm', 'some-vm2'],
  121. app=self.app),
  122. 0)
  123. self.assertEqual(stdout.getvalue(),
  124. 'VMs some-vm, some-vm2 are running\n')
  125. self.assertAllCalled()
  126. def test_006_running_multi_verbose2(self):
  127. self.app.expected_calls[
  128. ('dom0', 'mgmt.vm.List', None, None)] = \
  129. b'0\x00some-vm class=AppVM state=Running\n' \
  130. b'some-vm2 class=AppVM state=Running\n' \
  131. b'some-vm3 class=AppVM state=Halted\n'
  132. self.app.expected_calls[
  133. ('some-vm', 'mgmt.vm.List', None, None)] = \
  134. b'0\x00some-vm class=AppVM state=Running\n'
  135. self.app.expected_calls[
  136. ('some-vm2', 'mgmt.vm.List', None, None)] = \
  137. b'0\x00some-vm2 class=AppVM state=Running\n'
  138. self.app.expected_calls[
  139. ('some-vm3', 'mgmt.vm.List', None, None)] = \
  140. b'0\x00some-vm3 class=AppVM state=Halted\n'
  141. with qubesadmin.tests.tools.StdoutBuffer() as stdout:
  142. self.assertEqual(
  143. qubesadmin.tools.qvm_check.main(['--running',
  144. '--all'],
  145. app=self.app),
  146. 0)
  147. self.assertEqual(stdout.getvalue(),
  148. 'VMs some-vm, some-vm2 are running\n')
  149. self.assertAllCalled()
  150. def test_007_not_running_verbose(self):
  151. self.app.expected_calls[
  152. ('dom0', 'mgmt.vm.List', None, None)] = \
  153. b'0\x00some-vm class=AppVM state=Running\n' \
  154. b'some-vm2 class=AppVM state=Running\n' \
  155. b'some-vm3 class=AppVM state=Halted\n'
  156. self.app.expected_calls[
  157. ('some-vm3', 'mgmt.vm.List', None, None)] = \
  158. b'0\x00some-vm3 class=AppVM state=Halted\n'
  159. with qubesadmin.tests.tools.StdoutBuffer() as stdout:
  160. self.assertEqual(
  161. qubesadmin.tools.qvm_check.main(['--running',
  162. 'some-vm3'],
  163. app=self.app),
  164. 1)
  165. self.assertEqual(stdout.getvalue(),
  166. 'None of given VM is running\n')
  167. self.assertAllCalled()
  168. def test_008_paused(self):
  169. self.app.expected_calls[
  170. ('dom0', 'mgmt.vm.List', None, None)] = \
  171. b'0\x00some-vm class=AppVM state=Running\n' \
  172. b'some-vm2 class=AppVM state=Paused\n' \
  173. b'some-vm3 class=AppVM state=Halted\n'
  174. self.app.expected_calls[
  175. ('some-vm2', 'mgmt.vm.List', None, None)] = \
  176. b'0\x00some-vm2 class=AppVM state=Paused\n'
  177. with qubesadmin.tests.tools.StdoutBuffer() as stdout:
  178. self.assertEqual(
  179. qubesadmin.tools.qvm_check.main(['--paused',
  180. 'some-vm2'],
  181. app=self.app),
  182. 0)
  183. self.assertEqual(stdout.getvalue(),
  184. 'VM some-vm2 is paused\n')
  185. self.assertAllCalled()
  186. def test_009_paused_multi(self):
  187. self.app.expected_calls[
  188. ('dom0', 'mgmt.vm.List', None, None)] = \
  189. b'0\x00some-vm class=AppVM state=Running\n' \
  190. b'some-vm2 class=AppVM state=Paused\n' \
  191. b'some-vm3 class=AppVM state=Halted\n'
  192. self.app.expected_calls[
  193. ('some-vm2', 'mgmt.vm.List', None, None)] = \
  194. b'0\x00some-vm2 class=AppVM state=Paused\n'
  195. self.app.expected_calls[
  196. ('some-vm', 'mgmt.vm.List', None, None)] = \
  197. b'0\x00some-vm class=AppVM state=Running\n'
  198. with qubesadmin.tests.tools.StdoutBuffer() as stdout:
  199. self.assertEqual(
  200. qubesadmin.tools.qvm_check.main(['--paused',
  201. 'some-vm2', 'some-vm'],
  202. app=self.app),
  203. 0)
  204. self.assertEqual(stdout.getvalue(),
  205. 'VM some-vm2 is paused\n')
  206. self.assertAllCalled()
  207. def test_010_template(self):
  208. self.app.expected_calls[
  209. ('dom0', 'mgmt.vm.List', None, None)] = \
  210. b'0\x00some-vm class=AppVM state=Running\n' \
  211. b'some-vm2 class=AppVM state=Paused\n' \
  212. b'some-vm3 class=TemplateVM state=Halted\n'
  213. with qubesadmin.tests.tools.StdoutBuffer() as stdout:
  214. self.assertEqual(
  215. qubesadmin.tools.qvm_check.main(['--template',
  216. 'some-vm3'],
  217. app=self.app),
  218. 0)
  219. self.assertEqual(stdout.getvalue(),
  220. 'VM some-vm3 is a template\n')
  221. self.assertAllCalled()
  222. def test_011_template_multi(self):
  223. self.app.expected_calls[
  224. ('dom0', 'mgmt.vm.List', None, None)] = \
  225. b'0\x00some-vm class=AppVM state=Running\n' \
  226. b'some-vm2 class=AppVM state=Paused\n' \
  227. b'some-vm3 class=TemplateVM state=Halted\n'
  228. with qubesadmin.tests.tools.StdoutBuffer() as stdout:
  229. self.assertEqual(
  230. qubesadmin.tools.qvm_check.main(['--template',
  231. 'some-vm2', 'some-vm3'],
  232. app=self.app),
  233. 0)
  234. self.assertEqual(stdout.getvalue(),
  235. 'VM some-vm3 is a template\n')
  236. self.assertAllCalled()