XCP-ng
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Python help

    Scheduled Pinned Locked Moved REST API
    28 Posts 5 Posters 1.0k Views 4 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • S Offline
      Studmuffn1134 @TheNorthernLight
      last edited by

      @TheNorthernLight Well could you do it in a language you know and maybe i would be able to convert it>?

      1 Reply Last reply Reply Quote 0
      • G Offline
        Gurve
        last edited by

        Did some "kicking" around in python, I don't python that much so "readers beware"

        How did i figure it out, the french blog from here was useful, but only showed listing methods. I was still very confused as to how to call the vm.stop and which parameters it took.

        Enter xo-cli ❤

        xo-cli uses jsonrpc but is CLi only, but you can get very nice info from it just have to register and call "list-methods". should be available on your xo VM

        xo-cli register http://[yourXO].example.com [yourusername]
        #after registering/authenticating
        xo-cli list-commands | egrep 'vm\.' --color=always
        

        here you will get a nice list of all "methods" in jsonrpc related to vm and a line about vm.stop:

        vm.stop id=<string> [force=<boolean>] [forceShutdownDelay=<number>] [bypassBlockedOperation=<boolean>]

        which was enough information to alter the french guy's (Baron) example into this:

        import aiohttp
        import asyncio
        
        from jsonrpc_websocket import Server
        
        async def routine():
            async with aiohttp.ClientSession() as client:
                server = Server('ws://[yourXO]/api/', client)
        
                await server.ws_connect()
        
                # signIn required
                result = await server.session.signIn(username='[xoAdmin]', password='[xoAdmin]') # email attribute is working in place of username
                
                #hard shutdown
                #result = await server.vm.stop(id='3f32beeb-ab3f-a8ac-087d-fdc7ed061b58', force=(bool(1)))
                
                #clean Shutdown
                result = await server.vm.stop(id='3f32beeb-ab3f-a8ac-087d-fdc7ed061b58', force=(bool(0)))
                
                print (result)
        
        asyncio.get_event_loop().run_until_complete(routine())
        
        
        
        S 1 Reply Last reply Reply Quote 0
        • S Offline
          Studmuffn1134 @Gurve
          last edited by

          @Gurve Is this for the vm's on the server or the host itself i need the host itself

          G 1 Reply Last reply Reply Quote 0
          • G Offline
            Gurve @Studmuffn1134
            last edited by

            @Studmuffn1134 Sorry, must have somehow read another reply about vm and mixed them. But pretty sure you should be able to utilise the steps I did for host shutdown

            xo-cli to get relevant api endpoints, xo-cli to get parameters for said endpoint and then press play

            S 1 Reply Last reply Reply Quote 0
            • S Offline
              Studmuffn1134 @Gurve
              last edited by

              @Gurve Do i have to enable the xo-cli?

              G 1 Reply Last reply Reply Quote 0
              • G Offline
                Gurve @Studmuffn1134
                last edited by Gurve

                @Studmuffn1134 should be available in XO vm, it was atleast for me, I just used the XO installer script from github.

                I did a quick search with xo cli now

                xo-cli list-commands | egrep 'host.'

                in case it looks weird "\." is just to escape the "." which just tells regex I am looking for an actual "."

                import aiohttp
                import asyncio
                
                from jsonrpc_websocket import Server
                
                async def routine():
                    async with aiohttp.ClientSession() as client:
                        server = Server('ws://[yourXO]/api/', client)
                
                        await server.ws_connect()
                
                        # signIn required
                        result = await server.session.signIn(username='[yourXOusername]', password='[yourXOPassword]') # email attribute is working in place of username
                        
                        #hard shutdown VM
                        #result = await server.vm.stop(id='3f32beeb-ab3f-a8ac-087d-fdc7ed061b58', force=(bool(1)))
                        
                        #clean Shutdown VM
                        #result = await server.vm.stop(id='3f32beeb-ab3f-a8ac-087d-fdc7ed061b58', force=(bool(0)))
                
                        #bypassbackup and bypassevacuate set off by default but include for wholeness of parameters
                        result = await server.host.stop(id=[hostUUID],bypassBackupCheck=(bool(0)),bypassEvacuate=bool(0))
                        
                        print (result)
                
                asyncio.get_event_loop().run_until_complete(routine())
                

                I just built all examples into one, here in the end is the host.stop example also

                S 1 Reply Last reply Reply Quote 0
                • S Offline
                  Studmuffn1134 @Gurve
                  last edited by

                  @Gurve '''def shutdown_vm_hosts(host_id,xo_url,auth_token,use_force):

                  async def routine():
                      async with aiohttp.ClientSession() as client:
                          server = Server('ws://192.168.100.30:2223/api/', client)
                          await server.ws_connect()
                          # signIn required
                          result = await server.session.signIn(username='ThePlague', password='No') # email attribute is working in place of username
                          hostUUID ="d2f1374c-728d-4905-85cc-e0d7166a3fbf"
                          #hard shutdown VM
                          #result = await server.vm.stop(id='3f32beeb-ab3f-a8ac-087d-fdc7ed061b58', force=(bool(1)))
                          #clean Shutdown VM
                          #result = await server.vm.stop(id='3f32beeb-ab3f-a8ac-087d-fdc7ed061b58', force=(bool(0)))
                          #bypassbackup and bypassevacuate set off by default but include for wholeness of parameters
                          result = await server.host.stop(id=[hostUUID],bypassBackupCheck=(bool(0)),bypassEvacuate=bool(0))
                          print (result)''' Traceback (most recent call last):
                          
                            File "z:\Valera\School\Lakeland University\Finished\Programming 2\Python Programs\StudsPrograms\Shutdowntest.py", line 72, in <module>
                          
                              main() # second part of calling the main function
                          
                              ~~~~^^
                          
                            File "z:\Valera\School\Lakeland University\Finished\Programming 2\Python Programs\StudsPrograms\Shutdowntest.py", line 70, in main
                          
                              shutdown_vm_hosts(l,XO_URL,AUTH_TOKEN,use_force=False)
                          
                              ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          
                            File "z:\Valera\School\Lakeland University\Finished\Programming 2\Python Programs\StudsPrograms\Shutdowntest.py", line 29, in shutdown_vm_hosts
                          
                              asyncio.get_event_loop().run_until_complete(routine())
                          
                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
                          
                            File "C:\Users\ThePlague\AppData\Local\Programs\Python\Python313\Lib\asyncio\base_events.py", line 725, in run_until_complete
                          
                              return future.result()
                          
                                     ~~~~~~~~~~~~~^^
                          
                            File "z:\Valera\School\Lakeland University\Finished\Programming 2\Python Programs\StudsPrograms\Shutdowntest.py", line 13, in routine
                          
                              await server.ws_connect()
                          
                            File "Z:\Valera\School\Lakeland University\Finished\Programming 2\Python Programs\StudsPrograms\.venv\Lib\site-packages\jsonrpc_websocket\jsonrpc.py", line 68, in ws_connect
                          
                              raise TransportError('Error connecting to server', None, exc)
                          
                          jsonrpc_base.jsonrpc.TransportError: ('Error connecting to server', ServerDisconnectedError('Server disconnected'))
                  

                  I tried that and that is the error code I get

                  S 1 Reply Last reply Reply Quote 0
                  • S Offline
                    Studmuffn1134 @Studmuffn1134
                    last edited by

                    @Studmuffn1134 I changed my link from ws:// to https:// and it now gives me this error File "Z:\Valera\School\Lakeland University\Finished\Programming 2\Python Programs\StudsPrograms.venv\Lib\site-packages\jsonrpc_base\jsonrpc.py", line 213, in parse_response
                    raise ProtocolError(code, message, data)
                    jsonrpc_base.jsonrpc.ProtocolError: (10, 'invalid parameters', {'error': {'message': 'invalid parameters', 'code': 10, 'data': {'errors': [{'instancePath': '/id', 'schemaPath': '#/properties/id/type', 'keyword': 'type', 'params': {'type': 'string'}, 'message': 'must be string'}]}}, 'id': '0a11ec72-9300-4030-a5d2-a5c0286f3811', 'jsonrpc': '2.0'})

                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post