Skip to main content
Glama
test_edge_cases.cpython-313-pytest-8.3.5.pyc43.9 kB
� �yh9��0�SSKrSSKJs Jr SSKrSSKJrJ r J r SSK r SSK J r JrJrJrJrJrJrJrJr SSKrSSKrSSKr\R2R4S5r\R2R4S5r\R2R4S5r\R2R4S5r\R2R4S5r\R2R4S 5r S r!S r"\R2R4S 5r#\R2R4S 5r$\R2R4S5r%Sr&Sr'Sr(\R2R4S5r)\R2R4S5r*\R2R4S5r+\R2R4S5r,\R2R4S5r-\R2R4S5r.\R2R4S5r/Sr0Sr1g)�N)�patch� MagicMock� mock_open) � create_vm�start_vm�stop_vm� reboot_vm�generate_ignition_config� get_vnc_ports�_apply_env_overrides�handle_request� load_configc ���^ # �[S5n[S5n[5nX l[R"S5UR l[SS9Ul[SSSSSSS .5IS hv�N m T S nS oCU:HoU(do[R"S U4SX445[R"U5[R"U5S.-nSSU0-n[[R"U55eS =n=pTU 4SjS5n[U5oD(d�SS[R"5;d[R "[5(a[R"[5OS[R"U5[R"U5S.-n[[R"U55eS =p�S S S 5 S S S 5 g GN]!,(df  N=f!,(df  g =f7f)z-Test creating a VM with zero memory and vcpus� libvirt.open�subprocess.run�Domain not foundr�� returncoder�test-vm�/some/image.qcow2��name�memory�vcpus� disk_size� master_imageN�status�error��==�z%(py1)s == %(py4)s��py1�py4�assert %(py6)s�py6c3�N># �UHoTSR5;v� M g7f��messageN��lower��.0�x�results ��5/home/steve/projects/kvm-mcp/tests/test_edge_cases.py� <genexpr>�0test_create_vm_zero_resources.<locals>.<genexpr>s$����f�;e�a��y�)�/�/�1�1�;e���"%)�invalidr�vcpu� resources�,assert %(py4)s {%(py4)s = %(py0)s(%(py2)s) }�any��py0�py2r$�rr� return_value�libvirt� libvirtError� lookupByName� side_effectr� @pytest_ar�_call_reprcompare� _saferepr�AssertionError�_format_explanationr8� @py_builtins�locals�_should_repr_global_name� r�mock_run� mock_conn� @py_assert0� @py_assert3� @py_assert2� @py_format5� @py_format7� @py_assert1r/s @r0�test_create_vm_zero_resourcesrS sQ���� �~� �)� �� �H��K� �!*��-4�-A�-A�BT�-U� ���*� )�Q� 7��� ������/� / � � ���h��*�7�*�7�*�*�*�*�*��*�*�*��*�*�*�7�*�*�*�*�*�*�*�f�;e�f�f�s�f�f�f�f�f�f�f�f�f�f�s�f�f�f�f�s�f�f�f�f�f�f�f�f�f�f�f�f�f�f� !� � � � !� �� � ��G� G6� G%�AG�4G�5E G�G%� G6�G� G" �G%�% G3�/G6c ���^ # �[S5n[S5n[5nX l[R"S5UR l[SS9Ul[SSSS S S .5IS hv�N m T S nSoCU:HoU(do[R"SU4SX445[R"U5[R"U5S.-nSSU0-n[[R"U55eS =n=pTU 4SjS5n[U5oD(d�SS[R"5;d[R "[5(a[R"[5OS[R"U5[R"U5S.-n[[R"U55eS =p�S S S 5 S S S 5 g GN]!,(df  N=f!,(df  g =f7f)z2Test creating a VM with special characters in namerrrrrrztest!@#$%^&*()��r�rrrrNrrrr!r"r%r&c3�N># �UHoTSR5;v� M g7fr(r*r,s �r0r1�/test_create_vm_special_chars.<locals>.<genexpr>0s$����\�;[�a��y�)�/�/�1�1�;[�r3)r4r� characterr7r8r9r<rJs @r0�test_create_vm_special_charsr\sN���� �~� �)� �� �H��K� �!*��-4�-A�-A�BT�-U� ���*� )�Q� 7��� ��$���/� / � � ���h��*�7�*�7�*�*�*�*�*��*�*�*��*�*�*�7�*�*�*�*�*�*�*�\�;[�\�\�s�\�\�\�\�\�\�\�\�\�\�s�\�\�\�\�s�\�\�\�\�\�\�\�\�\�\�\�\�\�\� !� � � � !� �� � �sG� G5� G$�AG�3G�4E G�?G$� G5�G� G! �G$�$ G2�.G5c ���^ # �[S5n[S5n[5nX l[R"S5UR l[SS9Ul[SSSS S S S .5IS hv�N m T SnSoCU:HoU(do[R"SU4SX445[R"U5[R"U5S.-nSSU0-n[[R"U55eS =n=pTU 4SjS5n[U5oD(d�SS[R"5;d[R "[5(a[R"[5OS[R"U5[R"U5S.-n[[R"U55eS =p�S S S 5 S S S 5 g GN]!,(df  N=f!,(df  g =f7f)z7Test creating a VM with extremely large resource valuesrrrrrrri@i�i@BrrNrrrr!r"r%r&c3�N># �UHoTSR5;v� M g7fr(r*r,s �r0r1�;test_create_vm_extremely_large_resources.<locals>.<genexpr>Es$����l�;k�a��y�)�/�/�1�1�;k�r3)rr5�diskr6�larger7r8r9r<rJs @r0�(test_create_vm_extremely_large_resourcesrb2sQ���� �~� �)� �� �H��K� �!*��-4�-A�-A�BT�-U� ���*� )�Q� 7��� ���(�� �/� / � � ���h��*�7�*�7�*�*�*�*�*��*�*�*��*�*�*�7�*�*�*�*�*�*�*�l�;k�l�l�s�l�l�l�l�l�l�l�l�l�l�s�l�l�l�l�s�l�l�l�l�l�l�l�l�l�l�l�l�l�l� !� � � � !� �� � �rTc ��# �[S5n[R"S5URlXl[ [[4GH_nU"SSS05IShv�N nUSnSoTU:Hof(do[R"S U4S XE45[R"U5[R"U5S .-nS S U0-n[[R"U55eS=n=peSoCSoURo�"5o�U ;of(d�[R"SU4SXJ45[R"U5[R"U5[R"U 5[R"U 5S.-n SSU 0-n [[R"U 55eS=n=n=n=p�GMb SSS5 gGN[!,(df  g=f7f)z-Test VM operations when domain object is Nonerr� operationrrNrrrr!r"r%r&z not foundr)��in�zD%(py1)s in %(py8)s {%(py8)s = %(py6)s {%(py6)s = %(py4)s.lower }() }�r#r$r&�py8�assert %(py10)s�py10)rr>r?r@rAr=rrr rBrCrDrErFr+� �mock_libvirt_connrrdr/rMrNrOrPrQ� @py_assert5� @py_assert7� @py_format9� @py_format11s r0�test_vm_operations_null_domainrrGs8��� �~� �)�5<�5I�5I�J\�5]��&�&�2�!2��"�G�Y�7�I�$�[�6�9�2E�F�F�F��(�#� .�w� .�w�.� .� .� .� .�#� .� .� .�#� .� .� .�w� .� .� .� .� .� .� .�� ;��"3� ;�"9�"9� ;�"9�";� ;�";�;� ;� ;� ;� ;�;� ;� ;� ;�;� ;� ;� ;�"3� ;� ;� ;�"9� ;� ;� ;�";� ;� ;� ;� ;� ;� ;� ;� ;�8� � � G� � �s0� G �AF;�F8�EF;�/ G �8F;�; G �G c ��|# �[S5n[R"S5Ul[[ [ 4GH_nU"SSS05IShv�N nUSnSoTU:Hof(do[R"S U4S XE45[R"U5[R"U5S .-nS S U0-n[[R"U55eS=n=peSoCSoURo�"5o�U ;of(d�[R"SU4SXJ45[R"U5[R"U5[R"U 5[R"U 5S.-n SSU 0-n [[R"U 55eS=n=n=n=p�GMb SSS5 gGN[!,(df  g=f7f)z,Test VM operations when connection times outrzConnection timed outrdrrNrrrr!r"r%r&z timed outr)rergrhrjrk) rr>r?rArrr rBrCrDrErFr+rls r0�%test_vm_operations_connection_timeoutrtTs+��� �~� �)� '� 4� 4�5K� L� ��"�G�Y�7�I�$�[�6�9�2E�F�F�F��(�#� .�w� .�w�.� .� .� .� .�#� .� .� .�#� .� .� .�w� .� .� .� .� .� .� .�� ;��"3� ;�"9�"9� ;�"9�";� ;�";�;� ;� ;� ;� ;�;� ;� ;� ;�;� ;� ;� ;�"3� ;� ;� ;�"9� ;� ;� ;�";� ;� ;� ;� ;� ;� ;� ;� ;�8� � �G� � �s/� F<�?F+� F(�EF+� F<�(F+�+ F9�5F<c ���^ # �[S5n[S5nXl[R"S5URl[ R"SSS5Ul[SSS S S S .5IS hv�N m T SnSoCU:HoU(do[R"SU4SX445[R"U5[R"U5S.-nSSU0-n[[R"U55eS =n=pTU 4SjS5n[U5oD(d�SS[R "5;d[R""[5(a[R"[5OS[R"U5[R"U5S.-n[[R"U55eS =p�S S S 5 S S S 5 g GN]!,(df  N=f!,(df  g =f7f)z1Test creating a VM with non-existent master imagerrr��qemu-imgzFailed to open master imagerrrVrWz/nonexistent/image.qcow2rXNrrrr!r"r%r&c3�N># �UHoTSR5;v� M g7fr(r*r,s �r0r1�;test_create_vm_with_invalid_master_image.<locals>.<genexpr>qs$����b�;a�a��y�)�/�/�1�1�;a�r3)z master image�failedrwr7r8r9)rr=r>r?r@rA� subprocess�CalledProcessErrorrrBrCrDrErFr8rGrHrI) rmrrKrMrNrOrPrQrRr/s @r0�(test_create_vm_with_invalid_master_imager}_sW���� �~� �)� �� �H�!2��5<�5I�5I�J\�5]��&�&�2�)�<�<�Q� � )� +���!�����6� / � � ���h��*�7�*�7�*�*�*�*�*��*�*�*��*�*�*�7�*�*�*�*�*�*�*�b�;a�b�b�s�b�b�b�b�b�b�b�b�b�b�s�b�b�b�b�s�b�b�b�b�b�b�b�b�b�b�b�b�b�b� !� � � � !� �� � �sG� G:� G)�AG�8G�9E G�G)� G:�G� G& �"G)�) G7�3G:c �.�[SSS9 [S[SS95 [R"[SS9 [ S S S S S S .5 S S S 5 S S S 5 S S S 5 g !,(df  N=f!,(df  N(=f!,(df  g =f) z8Test generating Ignition config with empty string values�os.path.existsT�r=� builtins.open�ssh-key�� read_datazDEmpty values are not allowed for hostname, user, timezone, or locale)�matchr���hostname�user�timezone�localeN)rr�pytest�raises� ValueErrorr ��r0�*test_generate_ignition_config_empty_valuesr�sst�� ��d� 3� �� �I� >� ?� �]�]�:�-t� u� $�Y����� 1� �v� @� 4� 3� u� u�� @� ?�� 4� 3�s9�B�A5�A$� A5�B�$ A2 �.A5�5 B �?B� Bc ��Sn[SSS9 [S[SS95 [SUUUUS .5n[R"U5nUS S nS oCU:HoU(do[ R "S U4SX445[ R"U5[ R"U5S.-nSSU0-n[[ R"U55eS=n=pTSo2SSn[U5o�U ;oU(d�[ R "SU4SX945[ R"U5S[R"5;d[ R"[5(a[ R"[5OS[ R"U5[ R"U 5S.-n SSU 0-n [[ R"U 55eS=n=n=p�SSS5 SSS5 g!,(df  N=f!,(df  g=f)z;Test generating Ignition config with very long input values��aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarTr�r�r�r�rr��ignition�versionz3.3.0rr!r"r%r&Nr��storage�filesre)z0%(py1)s in %(py7)s {%(py7)s = %(py3)s(%(py5)s) }�str)r#�py3�py5�py7�assert %(py9)s�py9)rrr �json�loadsrBrCrDrErFr�rGrHrI) � long_string�config� config_dictrMrNrOrPrQ� @py_assert4� @py_assert6� @py_format8� @py_format10s r0�.test_generate_ignition_config_very_long_valuesr�sM���K� ��d� 3� �� �I� >� ?�)�)�#��#�!� 6 � ���j�j��(� ��:�&�y�1�<�W�<�W�<�<�<�<�<�1�<�<�<�1�<�<�<�W�<�<�<�<�<�<�<��A�Y�!7��!@�A�S�!@�A�A�A�A�A�A�A�A�z�A�A�A�z�A�A�A�A�A�A�S�A�A�A�A�S�A�A�A�!@�A�A�A�A�A�A�A�A�A�A�A� @� 4� 3� ?� ?�� 4� 3�s#�G/�F,G� G/� G, �(G/�/ G=c��# �[S5n[SSSS9Ul[S05IShv�N nUSnSo2U:HoD(do[R "S U4S X#45[R "U5[R "U5S .-nS S U0-n[[R"U55eS=n=pCUSn[U5nSo�U:Ho�(d�[R "S U 4SX845S[R"5;d[R"[5(a[R "[5OS[R "U5[R "U5[R "U5S.-n SSU 0-n [[R"U 55eS=n=n=p�SSS5 gGN�!,(df  g=f7f)z.Test getting VNC ports when no VMs are runningrrr��r�stdout�stderrr Nr�successrr!r"r%r&� vnc_ports)z0%(py4)s {%(py4)s = %(py0)s(%(py2)s) } == %(py7)s�len)r:r;r$r�r�r�) rrr=r rBrCrDrErFr�rGrHrI) rKr/rMrNrOrPrQrRr�rnr�r�s r0�!test_get_vnc_ports_no_running_vmsr��s'��� �� �H� )����! ��� %�_�b�9�9���h��,�9�,�9�,�,�,�,�,��,�,�,��,�,�,�9�,�,�,�,�,�,�,��+�&�,�s�&�'�,�1�,�1�,�,�,�,�,�'�,�,�,�,�,�,�s�,�,�,�,�s�,�,�,�&�,�,�,�'�,�,�,�1�,�,�,�,�,�,�,� !� �:� !� �s-� G� F>�F;�FF>�2 G�;F>�> G �Gc��# �[S5n[SSSS9Ul[S05IShv�N nUSnS o2U:HoD(do[R "S U4S X#45[R "U5[R "U5S .-nS SU0-n[[R"U55eS=n=pCSo!So2U;oD(do[R "SU4SX#45[R "U5[R "U5S .-nS SU0-n[[R"U55eS=n=pCSSS5 gGN!,(df  g=f7f)z/Test getting VNC ports when virsh command failsrrvr�zvirsh command failedr�r Nrrrr!r"r%r&zFailed to get VM listr)re�z%(py1)s in %(py4)s) rrr=r rBrCrDrErF)rKr/rMrNrOrPrQs r0�test_get_vnc_ports_virsh_errorr��s���� �� �H� )���)�! ��� %�_�b�9�9���h��*�7�*�7�*�*�*�*�*��*�*�*��*�*�*�7�*�*�*�*�*�*�*�&�;��*;�;�*;�;�;�;�;�;�&�;�;�;�&�;�;�;�*;�;�;�;�;�;�;�;� !� �:� !� �s-� E� E�E�D E�< E�E� E�Ec��# �[S5nSnXl[S05IShv�N nUSnSoCU:HoU(do[R"SU4SX445[R "U5[R "U5S .-nS S U0-n[ [R"U55eS=n=pTS o2S oCU;oU(do[R"SU4SX445[R "U5[R "U5S .-nS S U0-n[ [R"U55eS=n=pTSSS5 gGN!,(df  g=f7f)z3Test getting VNC ports with invalid display numbersrc�P�USS:Xa [SSS9$USS:Xa [SSS9$g)Nrv�listrztest-vm )rr�� vncdisplayzinvalid:display )r)�cmd�kwargss r0�mock_run_command�<test_get_vnc_ports_invalid_display.<locals>.mock_run_command�s:���1�v��� �A�k�B�B��Q��<�'� �A�6I�J�J�(r�r Nrr�rr!r"r%r&rr�)�not in)z%(py1)s not in %(py4)s)rrAr rBrCrDrErF)rKr�r/rMrNrOrPrQs r0�"test_get_vnc_ports_invalid_displayr��s���� �� �H� K� 0��$�_�b�9�9���h��,�9�,�9�,�,�,�,�,��,�,�,��,�,�,�9�,�,�,�,�,�,�,��3�{� 3�3� 3�3�3�3�3�3�y�3�3�3�y�3�3�3� 3�3�3�3�3�3�3�3� !� �:� !� �s-� E�E�D>�D E�5 E�>E� E� Ec���SSSS.n[R"[RSSSS.5 [ U5 US nSo!U:Ho3(do[ R "S U4S X45[ R"U5[ R"U5S .-nS SU0-n[[ R"U55eS=n=p2USnSo!U:Ho3(do[ R "S U4S X45[ R"U5[ R"U5S .-nS SU0-n[[ R"U55eS=n=p2USnSo!U:Ho3(do[ R "S U4S X45[ R"U5[ R"U5S .-nS SU0-n[[ R"U55eS=n=p2SSS5 g!,(df  g=f)zATest environment variable overrides with invalid type conversions�*g��Q� @T)� int_value� float_value� bool_value� not_an_int� not_a_float� not_a_bool)� INT_VALUE� FLOAT_VALUE� BOOL_VALUEr�rr!r"r%r&Nr�r�� r�dict�os�environr rBrCrDrErF�r�rMrNrOrPrQs r0�test_env_override_invalid_typesr��s@������F� ���B�J�J�!�$�"�!� � �V�$��k�"�(�b�(�b�(�(�(�(�(�"�(�(�(�"�(�(�(�b�(�(�(�(�(�(�(��m�$�,��,��,�,�,�,�,�$�,�,�,�$�,�,�,��,�,�,�,�,�,�,��l�#�+�t�+�t�+�+�+�+�+�#�+�+�+�#�+�+�+�t�+�+�+�+�+�+�+� � � �� �FG� G"c���SSSS000n[R"[RSS05 [ U5 USSSnSo!U:Ho3(do[ R "SU4SX45[ R"U5[ R"U5S .-nS S U0-n[[ R"U55eS =n=p2S S S 5 g !,(df  g =f) zKTest environment variable overrides with special characters in nested paths�level1zlevel!2zlevel@3�valuezLEVEL1_LEVEL!2_LEVEL@3� new_valuerr!r"r%r&Nr�r�s r0�&test_env_override_nested_special_charsr��s��� � ��7�� ��F� ���B�J�J� �+�!� � �V�$��h�� �*�9�5�D��D��D�D�D�D�D�5�D�D�D�5�D�D�D��D�D�D�D�D�D�D�  � � �s �BC� Cc���SSSS.n[R"[RSSSS.5 [ U5 USnSo!U:Ho3(do[ R "SU4S X45[ R"U5[ R"U5S .-nS S U0-n[[ R"U55eS =n=p2USnSo!U:Ho3(do[ R "SU4S X45[ R"U5[ R"U5S .-nS S U0-n[[ R"U55eS =n=p2USnSo!U:Ho3(do[ R "SU4S X45[ R"U5[ R"U5S .-nS S U0-n[[ R"U55eS =n=p2S S S 5 g !,(df  g =f)z5Test environment variable overrides with empty values�originalr�T)� string_valuer�r�r�)� STRING_VALUEr�r�r�rr!r"r%r&Nr�r�r�r�s r0�test_env_override_empty_valuesr��s@��#����F� ���B�J�J����!� � �V�$��n�%�+��+��+�+�+�+�+�%�+�+�+�%�+�+�+��+�+�+�+�+�+�+��k�"�(�b�(�b�(�(�(�(�(�"�(�(�(�"�(�(�(�b�(�(�(�(�(�(�(��l�#�+�t�+�t�+�+�+�+�+�#�+�+�+�#�+�+�+�t�+�+�+�+�+�+�+� � � �r�c��h# �[S5IShv�N nUSnSo!U:Ho3(do[R"SU4SX45[R"U5[R"U5S.-nSS U0-n[ [R "U55eS=n=p2US S nS o"*oaU:Ho3(do[R"SU4S X45[R"U5[R"U5S.-nSSU0-n[ [R "U55eS=n=n=p&SoS So!U;o3(do[R"SU4SX45[R"U5[R"U5S.-nSS U0-n[ [R "U55eS=n=p2gGN�7f)z#Test handling of invalid JSON inputz invalid jsonN�jsonrpc�2.0rr!r"r%r&r�codei��z%(py1)s == -%(py4)s�assert %(py7)sr�z Parse errorr)rer�)r rBrCrDrErF) �responserMrNrOrPrQrn� @py_format6r�s r0�test_invalid_json_inputr��s���$�N�3�3�H� �I� �'�%�'�%� '�'�'�'�'� �'�'�'� �'�'�'�%�'�'�'�'�'�'�'� �G� �V� $�.��.��.�� .�.�.�.�.� $�.�.�.� $�.�.�.��.�.�.�.�.�.�.� �8�W�-�i�8�8�8� 8�8�8�8�8�=�8�8�8�=�8�8�8�8�8�8�8�8�8�8�8�4�s�F2�F/�FF2c��# �SSS.n[[R"U55IShv�N nUSnSo2U:HoD(do[R"SU4SX#45[R "U5[R "U5S.-nS S U0-n[ [R"U55eS=n=pCUS S nS o3*orU:HoD(do[R"SU4SX'45[R "U5[R "U5S.-nSSU0-n [ [R"U 55eS=n=n=p7So!S So2U;oD(do[R"SU4SX#45[R "U5[R "U5S.-nS S U0-n[ [R"U55eS=n=pCgGN�7f)z,Test handling of request with missing methodr�rv)r��idNr�rr!r"r%r&rr�iXr�r�r�zInvalid Requestr)rer��r r��dumpsrBrCrDrErF� �requestr�rMrNrOrPrQrnr�r�s r0�test_missing_methodr��s0������G�$�D�J�J�w�$7�8�8�H� �I� �'�%�'�%� '�'�'�'�'� �'�'�'� �'�'�'�%�'�'�'�'�'�'�'� �G� �V� $�.��.��.�� .�.�.�.�.� $�.�.�.� $�.�.�.��.�.�.�.�.�.�.� �<�� 1�)� <�<� <� <�<�<�<�<� �<�<�<� �<�<�<� <�<�<�<�<�<�<�<�9�s�(G �G�FG c��# �SSSS.n[[R"U55IShv�N nUSnSo2U:HoD(do[R"SU4SX#45[R "U5[R "U5S .-nS S U0-n[ [R"U55eS=n=pCUS S nSo3*orU:HoD(do[R"SU4SX'45[R "U5[R "U5S .-nSSU0-n [ [R"U 55eS=n=n=p7So!S So2U;oD(do[R"SU4SX#45[R "U5[R "U5S .-nS S U0-n[ [R"U55eS=n=pCgGN�7f)zTest handling of unknown methodr��unknown_methodrv)r��methodr�Nr�rr!r"r%r&rr��Yr�r�r��Method not foundr)rer�r�r�s r0�test_unknown_methodr�s3����"���G� $�D�J�J�w�$7�8�8�H� �I� �'�%�'�%� '�'�'�'�'� �'�'�'� �'�'�'�%�'�'�'�'�'�'�'� �G� �V� $�.��.��.�� .�.�.�.�.� $�.�.�.� $�.�.�.��.�.�.�.�.�.�.� �=�'�!2�9�!=�=�!=� =�=�=�=�=� �=�=�=� �=�=�=�!=�=�=�=�=�=�=�=�9�s�)G �G �FG c��# �SSS0S.SS.n[[R"U55IShv�N nUSnSo2U:HoD(do[R"S U4S X#45[R "U5[R "U5S .-nS S U0-n[ [R"U55eS=n=pCUSSnSo3*orU:HoD(do[R"S U4SX'45[R "U5[R "U5S .-nSSU0-n [ [R"U 55eS=n=n=p7So!SSo2U;oD(do[R"SU4SX#45[R "U5[R "U5S .-nS S U0-n[ [R"U55eS=n=pCgGN�7f)z0Test handling of invalid tool name in tools/callr�� tools/call� invalid_tool�r� argumentsrv�r�r��paramsr�Nr�rr!r"r%r&rr�r�r�r�r�r�r)rer�r�r�s r0�test_invalid_tool_namer�s@�����"�� ���G�$�D�J�J�w�$7�8�8�H� �I� �'�%�'�%� '�'�'�'�'� �'�'�'� �'�'�'�%�'�'�'�'�'�'�'� �G� �V� $�.��.��.�� .�.�.�.�.� $�.�.�.� $�.�.�.��.�.�.�.�.�.�.� �=�'�!2�9�!=�=�!=� =�=�=�=�=� �=�=�=� �=�=�=�!=�=�=�=�=�=�=�=�9�s�-G�G �FGc��# �SSSSSSS.S.S S .n[[R"U55IS hv�N nUS nSo2U:HoD(do[R"S U4SX#45[R "U5[R "U5S.-nSSU0-n[ [R"U55eS =n=pCSo"U;oD(d�[R"SU4SX!45[R "U5S[R"5;d[R"U5(a[R "U5OSS.-nSSU0-n[ [R"U55eS =p$USSnSo3*o�U :HoD(do[R"S U4SX)45[R "U5[R "U5S.-nSSU0-n [ [R"U 55eS =n=n=p9So!SSo2U;oD(do[R"SU4S X#45[R "U5[R "U5S.-nSSU0-n[ [R"U55eS =n=pCg GNR7f)!z"Test VM creation with invalid namer�r�rz invalid@namerVrW)rrrr�rvr�Nr�rr!r"r%r&rre�z%(py1)s in %(py3)sr��r#r��assert %(py5)sr�r��[r�r�r�z#VM name contains invalid charactersr)r�) r r�r�rBrCrDrErFrGrHrI) r�r�rMrNrOrPrQ� @py_format4r�rnr�s r0�test_create_vm_invalid_namer�$s�������&���� �� �G�$�D�J�J�w�$7�8�8�H� �I� �'�%�'�%� '�'�'�'�'� �'�'�'� �'�'�'�%�'�'�'�'�'�'�'� ��h� �����7����7�������h�����h�������� �G� �V� $�.��.��.�� .�.�.�.�.� $�.�.�.� $�.�.�.��.�.�.�.�.�.�.� 0�P�W�4E�i�4P�P�4P� P�P�P�P�P� 0�P�P�P� 0�P�P�P�4P�P�P�P�P�P�P�P� 9�s�1J�J�IJc��^ # �SSSSSSSS.S .S S .n[[R"U55IS hv�N m T S nSo!U:Ho3(do[R"SU4SX45[R "U5[R "U5S.-nSSU0-n[ [R"U55eS =n=p2SoT ;o3(d�[R"SU4SUT 45[R "U5S[R"5;d[R"T 5(a[R "T 5OSS.-nSSU0-n[ [R"U55eS =pT SSnSo"*o�U:Ho3(do[R"SU4SX45[R "U5[R "U5S.-nSSU0-n [ [R"U 55eS =n=n=p(U 4SjS 5n [U 5o"(d�S!S"[R"5;d[R"[5(a[R "[5OS"[R "U 5[R "U5S#.-n[ [R"U55eS =p�g GN�7f)$z%Test VM creation with resource limitsr�r�rri�i')rrrrr�rvr�Nr�rr!r"r%r&rrer�r�r�r�r�r�r�r�r�r�c3�T># �UHoTSSR5;v� M g7f)rr)Nr*)r-r.r�s �r0r1�1test_create_vm_resource_limits.<locals>.<genexpr>Os)����z�By�Q�H�W�%�i�0�6�6�8�8�By�s�%()zmemory exceedsz vcpus exceedzdisk size exceedsr7r8r9) r r�r�rBrCrDrErFrGrHrIr8) r�rMrNrOrPrQr�r�rnr�rRr�s @r0�test_create_vm_resource_limitsr:s��������!�)��"� � �� �G�$�D�J�J�w�$7�8�8�H� �I� �'�%�'�%� '�'�'�'�'� �'�'�'� �'�'�'�%�'�'�'�'�'�'�'� ��h� �����7�h����7�������h�����h�������� �G� �V� $�.��.��.�� .�.�.�.�.� $�.�.�.� $�.�.�.��.�.�.�.�.�.�.�z�By�z�z�3�z� z�z� z�z�z�z�z�z�z�3�z�z�z�z�3�z�z�z�z�z�z�z� z�z�z�z�z�z�z� 9�s�2K�K�JKc���# �[S5nSUlSSS0S.SS.n[[R"U55IShv�N nUS nSoTU:Hof(do[ R "S U4S XE45[ R"U5[ R"U5S .-nS SU0-n[[ R"U55eS=n=peUSSSnSoTU:Hof(do[ R "S U4S XE45[ R"U5[ R"U5S .-nS SU0-n[[ R"U55eS=n=peSSS5 gGN!,(df  g=f7f)z+Test handling of libvirt connection failurerNr�r��list_vmsr�rvr�r�rr!r"r%r&r/rrz#Failed to connect to libvirt daemon) rr=r r�r�rBrCrDrErF) rmrr�r�rMrNrOrPrQs r0�test_libvirt_connection_failurerQs��� �~� �)�!%� ���"�"���� ��(�� � �7�(;�<�<��� �"�+�e�+�e�+�+�+�+�+�"�+�+�+�"�+�+�+�e�+�+�+�+�+�+�+���!�!�$�W�-�V�1V�V�1V�V�V�V�V�V�-�V�V�V�-�V�V�V�1V�V�V�V�V�V�V�V� � �=� � �s/� E4�4E#�E �DE#� E4� E#�# E1�-E4c��SSSSS.0nS[RS'[U5 USSnS o!U:Ho3(do[R"S U4S X45[R "U5[R "U5S .-nS SU0-n[ [R"U55eS=n=p2S[RS'[U5 USSnSo!U:Ho3(do[R"S U4S X45[R "U5[R "U5S .-nS SU0-n[ [R"U55eS=n=p2S[RS'SUSS'[U5 USSnSo!ULo3(do[R"SU4SX45[R "U5[R "U5S .-nS SU0-n[ [R"U55eS=n=p2SS'SUSS'[U5 USSnSo!U:Ho3(do[R"S U4S X45[R "U5[R "U5S .-nS SU0-n[ [R"U55eS=n=p2S[RS'[U5 USSnS o!U:Ho3(do[R"S U4S X45[R "U5[R "U5S .-nS SU0-n[ [R"U55eS=n=p2g) z#Test environment variable overrides�vmrVrWg4@)rrr�4096� VM_MEMORYrirr!r"r%r&Nz30.5� VM_DISK_SIZErg�>@�true� VM_ENABLEDF�enabledT)�is)z%(py1)s is %(py4)sr�VM_NAME�defaultrr4)r�r�r rBrCrDrErFr�s r0�test_env_overridesrdsT�� ���� ��F�%�B�J�J�{���� � �$�<�� !�)�T�)�T� )�)�)�)�)� !�)�)�)� !�)�)�)�T�)�)�)�)�)�)�)�"(�B�J�J�~���� � �$�<� � $�,��,�� ,�,�,�,�,� $�,�,�,� $�,�,�,��,�,�,�,�,�,�,� &�B�J�J�|��#�F�4�L����� � �$�<� � "�*�d�*�d� *�*�*�*�*� "�*�*�*� "�*�*�*�d�*�*�*�*�*�*�*�&�B�J�J�y��$�F�4�L����� � �$�<�� �,�9�,�9� ,�,�,�,�,� �,�,�,� �,�,�,�9�,�,�,�,�,�,�,�(�B�J�J�{���� � �$�<�� !�)�T�)�T� )�)�)�)�)� !�)�)�)� !�)�)�)�T�)�)�)�)�)�)�)r�c���[S0S9 [5n[U[5o(Gd+SS[R "5;d[ R"[5(a[ R"[5OSS[R "5;d[ R"U5(a[ R"U5OSS[R "5;d[ R"[5(a[ R"[5OS[ R"U5S.-n[[ R"U55eSnU(+o3(dpS S S[R "5;d[ R"U5(a[ R"U5OS0-n[[ R"U55eSnSSS5 g!,(df  g=f) z-Test handling of missing configuration valuesz json.loadr�z5assert %(py4)s {%(py4)s = %(py0)s(%(py1)s, %(py2)s) }� isinstancer�r�)r:r#r;r$Nzassert not %(py0)sr:) rrrr�rGrHrBrIrDrErF)r�rNrPrR� @py_format2s r0�test_missing_config_valuesr�s��� �{�� ,�����&�$�'�'�'�'�'�'�'�'�'�z�'�'�'�'�z�'�'�'�'�'�'�&�'�'�'�'�&�'�'�'�'�'�'�$�'�'�'�'�$�'�'�'�'�'�'�'�'�'�'��z��z�������6�����6������� -� ,� ,�s �GG"�" G0)2�builtinsrG�_pytest.assertion.rewrite� assertion�rewriterBr�� unittest.mockrrrr>�kvm_mcp_serverrrrr r r r r rr�r{r��mark�asynciorSr\rbrrrtr}r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr�r�r0�<module>rsB���� �5�5��_�_�_� �� ������g��g�(�����]��]�&�����m��m�(����� <�� <������<��<������c��c�& �B�"����� -�� -������ <�� <������ 4�� 4�,�&E� ,�&�����9��9������ =�� =������ >�� >������>��>� �����Q��Q�*�����{��{�,�����W��W�$#*�Jr�

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/steveydevey/kvm-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server