Skip to main content
Glama
topology.cpython-313.pyc24.5 kB
� ��?h�]��b�SrSSKrSSKJrJrJrJrJr SSKJ r SSK J r SSK J r Jr S\ 4S jrg) z_ Topology Handler Handles node creation, interface management, and link creation in CML labs. �N)�Dict�Any�Union�Optional�List)�FastMCP�)� get_client)� check_auth�handle_api_error�mcpc�&^^ ^ ^ ^ ^ �UR5S[S[[[[4[44Sj5m UR5S S[S[S[S[ S[ S [ S [[ S [[ S [[[[4S[[[44S jj5mUR5S!S[S[S[ S[ S[[[44 U4Sjjj5nUR5S!S[S[S[ S[ S[[[44 U4Sjjj5nUR5S[S[S[[[[4[[[44Sj5m UR5S[S[S[[[[4[[[[4[44U 4Sjj5nUR5S"S[S[S[ S[[[44Sjj5nUR5S[S[[[[4[44Sj5m UR5S[S[S[S[[[44Sj5m S[S[S[[[[[444Sjm UR5S[S[S[S[[[44U U 4Sjj5nUR5S[S[S[4Sj5nUR5S[S[4U U 4Sjj5ng)#z6Register topology management tools with the MCP server�lab_id�returnc��# �[5nU(aUS$[5RSSUS35IShv�N nUR5n[ U[ 5(aC[ S[RS9 0nUH!nURS5nU(dMXTU'M# U$U$Nn![anS [U53sSnA$SnAff=f7f) z� Get all nodes in a specific lab Args: lab_id: ID of the lab Returns: Dictionary of nodes in the lab or error message �error�GET� /api/v0/labs/�/nodesNz#Converting nodes list to dictionary��file�idzError getting lab nodes: � r r �request�json� isinstance�list�print�sys�stderr�get� Exception�str)r� auth_check�response�nodes�result�node�node_id�es �VC:\Users\jscon\Documents\Python_Projects\Claude-Modeling-Labs\src\handlers\topology.py� get_lab_nodes�.register_topology_tools.<locals>.get_lab_nodes����� �\� � ��g�&� &� 8�'�\�1�1�%�=���PV�9W�X�X�H��M�M�O�E��%��&�&��;�3�:�:�N���!�D�"�h�h�t�n�G��w�*.�w��"�� ��L�Y��� 8�.�s�1�v�h�7� 7�� 8��W�C�!B,�B*�AB,� B,�'C�(B,�)C�*B,�, C�6 C �C�C� C�CN�label�node_definition�x�y�populate_interfaces�ram� cpu_limit� parametersc ��# �[5n U (aU $UUUUU=(d 0/SS.n UbXjS'UbXzS'SUS3n U(aU S- n S S 0n [5RS U U U S 9IShv�N n U R5nUR S 5nU(dSUS.$USUSU3SUS.$N>![ an[ SU5sSnA$SnAff=f7f)a Add a node to the specified lab Args: lab_id: ID of the lab label: Label for the new node node_definition: Type of node (e.g., 'iosv', 'csr1000v') x: X coordinate for node placement y: Y coordinate for node placement populate_interfaces: Whether to automatically create interfaces ram: RAM allocation for the node (optional) cpu_limit: CPU limit for the node (optional) parameters: Node-specific parameters (optional) Returns: Dictionary with node ID and confirmation message F)r0r1r2r3r7�tags� hide_linksNr5r6rrz?populate_interfaces=true� Content-Type�application/json�POST�r�headersrz*Failed to create node, no node ID returned�rr%z Added node 'z ' with ID: �success)r)�message�status�details�add_node)r r rrr!r"r )rr0r1r2r3r4r5r6r7r$� node_data�endpointr?r%r'r)r*s r+rE�)register_topology_tools.<locals>.add_node3s!���: �\� � �� �/ 3��#2���(�.�B��#��I���#&�%� ��$�)2�+�&�'�v�h�f�5�H�"��7�7��&�'9�:�G�'�\�1�1����� 2���H��]�]�_�F��j�j��&�G��!M�[a�b�b�#�)�%�� �G�9�E�#�!� � ���(� 3�#�J��2� 2�� 3�sS�C�AB,�+B*�,0B,�C� B,�)C�*B,�, C �6 C�C �C�C � Cc��\># �[5nU(aU$T"XSX#S5IShv�N $N7f)a Create a router with the 'iosv' node definition Args: lab_id: ID of the lab label: Label for the new router x: X coordinate for node placement y: Y coordinate for node placement Returns: Dictionary with node ID and confirmation message �iosvTN�r �rr0r2r3r$rEs �r+� create_router�.register_topology_tools.<locals>.create_router�s1����& �\� � �� ��f�V�Q�4�@�@�@�@�� �",�*�,c��\># �[5nU(aU$T"XSX#S5IShv�N $N7f)a Create a switch with the 'iosvl2' node definition Args: lab_id: ID of the lab label: Label for the new switch x: X coordinate for node placement y: Y coordinate for node placement Returns: Dictionary with node ID and confirmation message �iosvl2TNrKrLs �r+� create_switch�.register_topology_tools.<locals>.create_switch�s1����& �\� � �� ��f�X�q�T�B�B�B�B�rOr)c��# �[5nU(aUS$[5RSSUSUS35IShv�N nUR5n[ U[ 5(a[ SU3[RS9 U$[ U[5(aZ[ S U3[RS9 [U5S -S :Xa+[S [U5S 5Vs/sH oTXUS -PM sn$U$U$N�s snf![a<n[ S [U53[RS9 S [U53sSnA$SnAff=f7f) z� Get interfaces for a specific node Args: lab_id: ID of the lab node_id: ID of the node Returns: Dictionary of node interfaces or error message or list of interface IDs rrr�/nodes/� /interfacesNzGot list of interface IDs: rzGot string of interface IDs: �$rzError getting node interfaces: ) r r rrrrrrr r#�len�ranger")rr)r$r%� interfaces�ir*s r+�get_node_interfaces�4register_topology_tools.<locals>.get_node_interfaces�s7��� �\� � ��g�&� &� >�'�\�1�1�%�=���PW�X_�W`�`k�9l�m�m�H�!����J��*�d�+�+��3�J�<�@�s�z�z�R�!�!��J��,�,��5�j�\�B����T��z�?�R�'�1�,�8=�a��Z��RT�8U�V�8U�1�q�2��.�8U�V�V�%�%�"�!�#n��W�� � >� �3�C��F�8�<�3�:�:� N�4�S��V�H�=� =�� >�s|�E�$C=�C6�AC=�E�AC=�C8�/C=�1E�2C=�3E�4C=�5E�6C=�8C=�= E�1D>�8E�9E�>E�Ec��d># �[5nU(aUS$T "X5IShv�N n/n[U[5(aSU;aU$[U[5(aUnO�[U[5(aB[ U5S-S:Xa+[ S[ U5S5Vs/sH oSXUS-PM nnOBSU3$[U[ 5(a[UR55nOS[U53$/nUHwn[5RSS US U35IShv�N nUR5n U RS 5S :Hn S U ;aS U ;aSn U (dMfURU 5 My U(dSU3$U$GN]s snfNj![an [SU 5sSn A $Sn A ff=f7f)z� Get all physical interfaces for a specific node Args: lab_id: ID of the lab node_id: ID of the node Returns: List of physical interfaces or error message rN�ErrorrWrz&Unexpected interface response format: z$Unexpected interface response type: rr� /interfaces/�type�physical�slotTz&No physical interfaces found for node �get_physical_interfaces)r rr#rrXrY�dict�keysrar rrr!�appendr"r ) rr)r$�interfaces_response� interface_idsr[�physical_interfaces� interface_id�interface_details�interface_data� is_physicalr*r\s �r+rd�8register_topology_tools.<locals>.get_physical_interfaces�s����� �\� � ��g�&� &�, B�(;�F�(L�"L� ��M��-�s�3�3��CV�8V�*�*��/��6�6� 3� ��/��5�5��*�+�b�0�A�5�JO�PQ�SV�Wj�Sk�mo�Jp�$q�Jp�Q��R�4�%@�Jp�M�$q�M�C�DW�CX�Y�Y��/��6�6� $�%8�%=�%=�%?� @� �=�d�CV�>W�=X�Y�Y�#%� � -� �*4�,�*>�*>�u� �V\�U]�]i�jv�iw�Fx�*y�$y�!�!2�!7�!7�!9��-�0�0��8�J�F� ���/���/�&*� ��;�'�.�.�~�>�!.� '�?��y�I�I�&� &�Q#M��%r�%z��&� B�#�$=�q�A� A�� B�s��F0� F �F�"F � F0� AF �!F�1F �8F0�9<F �5F0�6*F � F �!;F � F �F0�F �F0�F �F � F-� F(�"F-�#F0�(F-�-F0rcc��# �[5nU(aU$SSKJn U"U5IShv�N n[U[5(aUR S5S:XaSS0$[ SUS U3[RS 9 UUS .n[ S U3[RS 9 [5RS SUS3US9IShv�N nUR5n[ SU3[RS 9 [U[5(aG[U5S:�a8USR S5n USR S5n U SU SUS U3SUS.$[U[5(a9UR S5n UR S5n U (aU SU SUS U3SUS.$SUS.$GNpN�![an [SU 5sSn A $Sn A ff=f7f)z� Create an interface on a node Args: lab_id: ID of the lab node_id: ID of the node slot: Slot number for the interface (default: 4) Returns: Dictionary with interface ID and confirmation message ���get_lab_detailsN�state�STARTEDrzMCannot create interfaces while the lab is running. Please stop the lab first.zCreating interface on node z, slot r)r(rczInterface creation payload: r=rrV)rzInterface creation response: rrr0zCreated interface z on node rA)rkrBrCrDz6Failed to create interface, unexpected response formatr@�create_interface)r �lab_managementrsrrer!rrr r rrrrXr"r ) rr)rcr$rs� lab_detailsrmr%r'rk�interface_labelr*s r+rv�1register_topology_tools.<locals>.create_interfaces���� �\� � �� �7 ;� 7�!0�� 7�7�K��+�t�,�,�����1I�Y�1V��!p�q�q� �/��y���v�F�S�Z�Z� X� ���N� �0��0@�A�� � � S�(�\�1�1����x�{�3�#�2���H��]�]�_�F� �1�&��:���� L��&�$�'�'�C��K�!�O�%�a�y�}�}�T�2� �"(��)�-�-��"8��$0�!3�O�3D�I�g�Y�V]�^b�]c�d�'�%� �� �F�D�)�)�%�z�z�$�/� �"(�*�*�W�"5���(4�%7��7H� �RY�QZ�Za�bf�ag�#h�"+�#)� ��V�ci�j� j�a8���D� ;�#�$6��:� :�� ;�s}�G�F�F�1F�G�AF�9F�:B F�G�A F�G�F�G�F�F� F=�' F8�2F=�3G�8F=�=Gc��# �[5nU(aUS$[5RSSUS35IShv�N nUR5n[ U[ 5(aC[ S[RS9 0nUH!nURS5nU(dMXTU'M# U$U$Nn![anS [U53sSnA$SnAff=f7f) z� Get all links in a specific lab Args: lab_id: ID of the lab Returns: Dictionary of links in the lab or error message rrr�/linksNz#Converting links list to dictionaryrrzError getting lab links: r)rr$r%�linksr'�link�link_idr*s r+� get_lab_links�.register_topology_tools.<locals>.get_lab_linkshr.r/�interface_id_a�interface_id_bc��~# �[5nU(aU$[SUSU3[RS9 UUS.nSS0n[ 5R SSUS 3UUS 9IS hv�N nUR 5n[S U3[RS9 URS 5nU(dSUS.$USUSU3SUS.$NY![a�n [S[RS9 UUS.n [ 5R SSUS 3U WS 9IS hv�N n U R 5n [SU 3[RS9 U RS 5n U (aU SUSUS3SU S.sS n A $SS0sS n A $![a?n[S[U53[RS9 [SU 5sS nAsS n A $S nAff=fS n A ff=f7f)a Create a link between two interfaces in a lab (alternative format) Args: lab_id: ID of the lab interface_id_a: ID of the first interface interface_id_b: ID of the second interface Returns: Dictionary with link ID and confirmation message z!Creating link between interfaces z and r)�src_int�dst_intr;r<r=rr|r>NzLink creation response: rz*Failed to create link, no link ID returnedr@z Created link between interfaces rA)rrBrCrDz1First format failed, trying alternative format...)�i1�i2z%Link creation response (alt format): z using alternative formatrz'Failed to create link with both formatsz Alternative format also failed: � create_link) r rrr r rrr!r"r#r )rr�r�r$� link_datar?r%r'rr*� link_data_alt� response_alt� result_alt� link_id_alt�alt_errs r+�create_link_v3�/register_topology_tools.<locals>.create_link_v3�s��� �\� � �� �> :� �5�n�5E�U�>�JZ�[�be�bl�bl� m�*�)��I� &�'9�:�G�'�\�1�1����x�v�.��� 2���H��]�]�_�F� �,�V�H�5�C�J�J� G��j�j��&�G��!M�[a�b�b�#�=�n�=M�U�Sa�Rb�c�#�!� � ���*� :� :��I�PS�PZ�PZ�[�(�(�!� � &0�\�%9�%9��#�F�8�6�2�&�#� &:�&� � � �*�.�.�0� ��=�j�\�J�QT�Q[�Q[�\�(�n�n�T�2� ��#.�%E�n�EU�UZ�[i�Zj�kD�$E�"+�#-� �� �!J�K�K��� :��8��W���G�c�j�j�Y�'� �q�9�9�9�� :��; :�s��F=�AB;�B9� A B;�+F=�, B;�8F=�9B;�; F:�>E)�D�AE)�F:�F=� E)�#F:�$F=�) F2�3/F-�"F2�#F5�'F:�(F=�-F2�2F5�5F:�:F=c ��# �[5nU(aU$[5RSSUSUS35IShv�N nUR5n[ U[ 5(aUR 5nO.[ U[5(a[UR55nU(dSSU30$UHln[5RSSUSUS 35IShv�N nUR5nURS 5S :XdMSURS 5S :XdMjUs $ SSU30$N�NQ![an[SU5sSnA$SnAff=f7f)z� Find an available physical interface on a node Args: lab_id: ID of the lab node_id: ID of the node Returns: Interface ID or error dictionary rrrUz/interfaces?operational=trueNrzNo interfaces found for node r`z?operational=truerarb� is_connectedFz/No available physical interface found for node �find_available_interface) r r rrrr#�splitrerrfr!r"r ) rr)r$rhrZrk�interface_detailrmr*s r+r��9register_topology_tools.<locals>.find_available_interface�sf��� �\� � �� �" C�(2� �(<�(<����x�w�w�i�7S�T�)�#� �-�1�1�3�J��*�c�*�*�'�-�-�/� ��J��-�-�!�*�/�/�"3�4� ���#@�� �!J�K�K�!+� �)3��)=�)=��#�F�8�<� �~�EV�W�*�$� �"2�!6�!6�!8��#�&�&�v�.�*�<�"�&�&�~�6�%�?�'�'�!+��N�w�i�X�Y� Y�=#�&$��� C�#�$>��B� B�� C�s{�E�$D/�D+�A5D/�1E�2)D/�D-�'D/�D/�D/�!E�"D/�*E�+D/�-D/�/ E�9 E �E�E� E�E� node_id_a� node_id_bc��\># �[5nU(aU$T"X5IShv�N n[U[5(aSU;aU$T"X5IShv�N n[U[5(aSU;aU$T"XU5IShv�N $N_N4N![an[ SU5sSnA$SnAff=f7f)z� Create a link between two nodes by automatically selecting appropriate interfaces Args: lab_id: ID of the lab node_id_a: ID of the first node node_id_b: ID of the second node Returns: Dictionary with link ID and confirmation message Nr� link_nodes)r rrer"r ) rr�r�r$� interface_a� interface_br*r�r�s ��r+r��+register_topology_tools.<locals>.link_nodes s����� �\� � �� � 5� 8�� K�K�K��+�t�,�,��K�1G�"�"� 8�� K�K�K��+�t�,�,��K�1G�"�"�(��[�I�I� I�L�L� J��� 5�#�L�!�4� 4�� 5�s��B,� B �B� B �B,� B �B� B �1B,�2 B �>B�?B �B,�B �B �B � B)� B$�B)�B,�$B)�)B,rc���# �[5nU(aUS$[5RSSUSU35IShv�N nSUS3$N ![anS[ U53sSnA$SnAff=f7f) z� Delete a link from a lab Args: lab_id: ID of the lab link_id: ID of the link to delete Returns: Confirmation message r�DELETErz/links/NzLink z deleted successfullyzError deleting link: )r r rr"r#)rrr$r%r*s r+� delete_link�,register_topology_tools.<locals>.delete_link-s~��� �\� � ��g�&� &� 4�'�\�1�1�(�m�F�8�SZ�[b�Zc�<d�e�e�H��7�)�#8�9� 9�f��� 4�*�3�q�6�(�3� 3�� 4�sD�A/�#A �A� A �A/�A � A,� A'�!A,�"A/�'A,�,A/c���># �[5nU(aUS$SSKJn U"U5IShv�N n[U[5(a SU;aUS$T"U5IShv�N n[U[ 5(aSU;aU$T"U5IShv�N n[U[ 5(aSU;aU$SUR SS5S 3nUS UR S S 5S 3- nUS UR SS5S3- nUS- nUR5HSupxUSUR SS5SUS3- nUSUR SS 5S 3- nUSUR S S 5S 3- nMU US- nUR5H�up�U R S5n U R S5n X�;adX�;a_XKR SU 5n XLR SU 5nUSU SU SU R S S 5S!USU R S"S 5S3 - nM�USU SU S#U R S 5S$U S#U R S"5S 3 - nM� U$GNGN�GN�![anS%[ U53sSnA$SnAff=f7f)&z� Get a detailed summary of the lab topology Args: lab_id: ID of the lab Returns: Formatted summary of the lab topology rrqrrNr_zLab Topology: �title�Untitled� zState: rt�unknownz Description: � description�Nonez zNodes: z- r0�Unnamedz (ID: z) z Type: r1z State: z Links: �src_node�dst_nodez- Link z: z (r�u) → r��:u → zError getting lab topology: ) r rwrsrrer#r!�itemsr")rr$rsrxr&r}r'r)r(rr~� src_node_id� dst_node_idr�r�r*r�r,s ��r+�get_lab_topology�1register_topology_tools.<locals>.get_lab_topologyCs����� �\� � ��g�&� &�/ ;� 7�!0�� 7�7�K��+�t�,�,��K�1G�"�7�+�+�(��/�/�E��%��%�%�'�U�*:�� �(��/�/�E��%��%�%�'�U�*:�� �&�k�o�o�g�z�&J�%K�2�N�F� �� ����� C�D�B�G� G�F� � �k�o�o�m�V�&L�%M�T�R� R�F� �j� �F�!&���� ���B�t�x�x���;�<�F�7�)�3�O�O���H�T�X�X�.?��%K�$L�B�O�O���I�d�h�h�w� �&B�%C�2�F�F��"/� �l� "�F�!&���� ��"�h�h�z�2� �"�h�h�z�2� ��'�K�,@�$�1�5�5�g�{�K�H�$�1�5�5�g�{�K�H���� ��H�:�R�����T]�@^�?_�_e�"*��2�d�h�h�y�)�.L�-M�S� R�S�F����y��;�-�q����)�AT�@U�UZ�[f�Zg�gh�im�iq�iq�r{�i|�h}�}�A�A�F�"/��M�Q8� 0� 0��>� ;�1�#�a�&��:� :�� ;�s��I+�I�H=�#I�I+� I�I� I�=I+�> I� I� I�*I+�+FI�<I+�=I�I�I� I(� I#�I(�I+�#I(�(I+)rrTNNN)rr)�) �toolr#rrr�int�boolrr)r rMrRrdrvr�r�r�rEr�r�r�r,r\s @@@@@@r+�register_topology_toolsr�s���� �X�X�Z�8�C�8�E�$�s�C�x�.�#�2E�,F�8��8�@ �X�X�Z� ��$(�!�#'�/3�O3��O3��O3��O3� � O3� � O3� "� O3��c�]�O3��C�=�O3��T�#�s�(�^�,�O3� �c�3�h��O3��O3�b �X�X�Z��� A��A��A� �A� � A� �c�3�h�� A��A�2 �X�X�Z��� C��C��C� �C� � C� �c�3�h�� C��C�2 �X�X�Z�$>�#�$>��$>��d�3�PS�8�n�VY�[_�`c�[d�Fd�@e�$>��$>�L �X�X�Z�;B�c�;B�C�;B�E�$�s�TW�x�.�Z^�_c�dg�il�dl�_m�Zn�ps�Js�Dt�;B��;B�z �X�X�Z�G;�s�G;�S�G;��G;�D�QT�VY�QY�N�G;��G;�R �X�X�Z�8�C�8�E�$�s�C�x�.�#�2E�,F�8��8�@ �X�X�Z�N:�S�N:�#�N:�s�N:�W[�\_�ad�\d�We�N:��N:�`1C�s�1C�S�1C�U�3�PT�UX�Z]�U]�P^�K^�E_�1C�f �X�X�Z�5��5��5��5��c�SV�h��5��5�> �X�X�Z�4�#�4��4��4��4�* �X�X�Z�=;�s�=;�s�=;��=;�)�__doc__r�typingrrrrr�fastmcpr�clientr �utilsr r r��r�r+�<module>r�s,���  �3�3���0�r ;��r ;r�

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/MediocreTriumph/claude-cml-toolkit'

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