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

    XOA json-rpc call basic exemple

    Scheduled Pinned Locked Moved Xen Orchestra
    12 Posts 4 Posters 2.0k Views 2 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.
    • olivierlambertO Offline
      olivierlambert Vates 🪐 Co-Founder CEO
      last edited by

      Pinging @julien-f

      1 Reply Last reply Reply Quote 0
      • julien-fJ Offline
        julien-f Vates 🪐 Co-Founder XO Team @mco-system
        last edited by

        @mco-system I don't know how to do a WebSocket call with cURL, it's probably not a simple HTTP request.

        1 Reply Last reply Reply Quote 0
        • julien-fJ Offline
          julien-f Vates 🪐 Co-Founder XO Team
          last edited by

          Maybe try something like https://github.com/websockets/wscat, though I have no experience with it.

          mco-systemM 1 Reply Last reply Reply Quote 0
          • mco-systemM Offline
            mco-system @julien-f
            last edited by

            @julien-f Thank you for your reply.

            I tried wscat and I can see I'm successfully connected at TCP level as I would with a basic telnet client but then I have no response from the server at all. until timeout occurs.

            Though, the xo terraform provider is working without problem, so I guess I'm doing something wrong or miss a very basic step at protocol level (i'm very new at using json-rpc).

            I also don't get how does the authentication mechanism work.
            Where and when send credentials to the API ?

            /me is currently reading json-rpc specification

            mco-systemM 1 Reply Last reply Reply Quote 0
            • mco-systemM Offline
              mco-system @mco-system
              last edited by

              I successfully sniffed traffic between the XOA Terraform provider and I have now a better understanding of what a JSON-RPC requests looks like.

              However, I'm still unable to connect to the XO host with wscat which systematically timeouts .
              I can't get the Connected (press CTRL+C to quit) prompt from wscat as I would if the connection was successful.

              However, on XO host, I can see traffic using tcpdump, the problem does not seem network, nor SSL related.

              xoa:/opt/xo/xo-server# tcpdump -nni eth0 host 192.168.2.1 and not port 22
              tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
              listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
              
              
              00:28:35.456615 IP 192.168.2.1.49074 > 192.168.2.251.443: Flags [S], seq 3784699052, win 64240, options [mss 1460,sackOK,TS val 3147372683 ecr 0,nop,wscale 7], length 0
              00:28:35.456660 IP 192.168.2.251.443 > 192.168.2.1.49074: Flags [S.], seq 962165778, ack 3784699053, win 65160, options [mss 1460,sackOK,TS val 4217115831 ecr 3147372683,nop,wscale 7], length 0
              00:28:35.456904 IP 192.168.2.1.49074 > 192.168.2.251.443: Flags [.], ack 1, win 502, options [nop,nop,TS val 3147372684 ecr 4217115831], length 0
              00:28:35.457104 IP 192.168.2.1.49074 > 192.168.2.251.443: Flags [P.], seq 1:372, ack 1, win 502, options [nop,nop,TS val 3147372684 ecr 4217115831], length 371
              00:28:35.457120 IP 192.168.2.251.443 > 192.168.2.1.49074: Flags [.], ack 372, win 507, options [nop,nop,TS val 4217115831 ecr 3147372684], length 0
              00:28:35.460902 IP 192.168.2.251.443 > 192.168.2.1.49074: Flags [P.], seq 1:1672, ack 372, win 507, options [nop,nop,TS val 4217115835 ecr 3147372684], length 1671
              00:28:35.461216 IP 192.168.2.1.49074 > 192.168.2.251.443: Flags [.], ack 1672, win 495, options [nop,nop,TS val 3147372688 ecr 4217115835], length 0
              00:28:35.462613 IP 192.168.2.1.49074 > 192.168.2.251.443: Flags [P.], seq 372:700, ack 1672, win 501, options [nop,nop,TS val 3147372690 ecr 4217115835], length 328
              00:28:35.463727 IP 192.168.2.251.443 > 192.168.2.1.49074: Flags [P.], seq 1672:2214, ack 700, win 505, options [nop,nop,TS val 4217115838 ecr 3147372690], length 542
              00:28:35.464040 IP 192.168.2.1.49074 > 192.168.2.251.443: Flags [.], ack 2214, win 501, options [nop,nop,TS val 3147372691 ecr 4217115838], length 0
              

              In xo-server config.toml, I turned verboseApiLogsOnErrors to true and restarted the xo-server service but the log does not show any connection attempt.

              It's just like the connection is lost by the xo-server... I'm very confused...

              1 Reply Last reply Reply Quote 0
              • mco-systemM Offline
                mco-system
                last edited by

                Using opensll s_client I can connect and upgrade to WebSocket without any difficulties:

                openssl s_client -crlf -connect xoa.local.example.com:443 -servername xoa.local.exampe.com
                CONNECTED(00000003)
                depth=1 C = NC, ST = Somewhere, L = Shell-city, O = Example Co, OU = Lab, CN = Root CA example.com
                verify return:1
                depth=0 C = NC, ST = Somewhere, O = Example Co, CN = xoa.example.com
                verify return:1
                [...]
                
                GET /api/ HTTP/1.1
                Host: xoa.local.example.com:443
                User-Agent: Go-http-client/1.1
                Connection: Upgrade
                Sec-WebSocket-Key: 7lcEMScTa7sTRzwW8jebLQ==
                Sec-WebSocket-Version: 13
                Upgrade: websocket
                
                HTTP/1.1 101 Switching Protocols
                Upgrade: websocket
                Connection: Upgrade
                Sec-WebSocket-Accept: 5pKEtEmZTJbNiFx/gZ9VIMVy2B8=
                

                And the corresponding line in syslog

                Apr 30 02:22:04 xoa xo-server[31752]: 2021-04-30T02:22:04.785Z xo:main INFO + WebSocket connection (192.168.2.1)
                

                So everything should work but I'm still missing something that I'm pretty sure is very simple. Some basic stuff that I can not see by myself....
                Very frustrating...

                julien-fJ 1 Reply Last reply Reply Quote 0
                • olivierlambertO Offline
                  olivierlambert Vates 🪐 Co-Founder CEO
                  last edited by

                  Don't worry @mco-system @julien-f will answer when he's around šŸ™‚

                  1 Reply Last reply Reply Quote 0
                  • julien-fJ Offline
                    julien-f Vates 🪐 Co-Founder XO Team @mco-system
                    last edited by

                    @mco-system I don't know wcat, I just mentioned it because it looked interesting.

                    I cannot explain how the WebSocket protocol works, all I can tell you is that XO API is JSON-RPC inside a WebSocket connection, and that before being able to use methods, you need to sign in via the session.signIn method:

                    # Open WebSocket connection to http://xoa/api/
                    → {"id":0,"jsonrpc":"2.0","method":"session.signIn","params":{"username":"jsmith","password":"passw0rd"}}
                    ← {"id":0,"jsonrpc":"2.0","result":{"id":"ad2593b0-97c7-446f-bc0e-f5558c013d52","email":"jsmith","groups":[],"permission":"admin","preferences":{}}}
                    

                    If all you need is a CLI, you can use xo-cli.

                    mco-systemM 1 Reply Last reply Reply Quote 1
                    • mco-systemM Offline
                      mco-system @julien-f
                      last edited by

                      @julien-f Thank you for your help.

                      I finally figured out that I missed the API endpoint trailing / which seems mandatory.

                      My test with openssl s_client worked fine because the trailing / was in place:

                      GET /api/ HTTP/1.1
                      

                      To answer your advice about xo-cli, I don't need a CLI tool and xo-cli is fine when I need one.

                      My goal is to determine what would be the needed efforts to code something like an xo-api Python connector that would allow requesting xo-server from Python apps and scripts.

                      Such a connector would be useful to me but also to all Python coders.
                      I'm seriously considering it.

                      Thank you again for your time, it could have take me days to figure out this missing trailing /.

                      M 1 Reply Last reply Reply Quote 0
                      • M Offline
                        mbaron @mco-system
                        last edited by

                        Hi @mco-system,

                        I propose to you a solution to communicate from a Python program to xo-server api.

                        import json
                        import aiohttp
                        import asyncio
                        
                        from jsonrpc_websocket import Server
                        
                        async def routine():
                            async with aiohttp.ClientSession() as client:
                                server = Server('ws://XO_SERVER_IP/api/', client)
                        
                                await server.ws_connect()
                        
                                # No signIn required
                                methodsInfoResult = await server.system.getMethodsInfo()
                                print('\n'.join([str(e) for e in methodsInfoResult.keys()]))
                        
                                # signIn required
                                result = await server.session.signIn(username='YOUR_LOGIN', password='YOUR_PASSWORD') # email attribute is working in place of username
                                result = await server.xo.getAllObjects(filter={"type": "VIF"}, limit=10)
                        
                                print('[')
                                print(', \n'.join([str(json.dumps(e, indent=4)) for e in result.values()]))
                                print(']')
                        
                        asyncio.get_event_loop().run_until_complete(routine())
                        

                        This code is using the jsonrpc_websocket library.

                        A full description is available on my blog => https://mickael-baron.fr/blog/2021/05/28/xo-server-websocket-jsonrcp (in french). A Java version is also available.

                        1 Reply Last reply Reply Quote 1
                        • mco-systemM Offline
                          mco-system
                          last edited by

                          Hello @mbaron,

                          Your blog helped me to get a better understanding of the different steps involved in jsonrpc.

                          Thank you for sharing your code samples.

                          1 Reply Last reply Reply Quote 1
                          • B Butcat referenced this topic on
                          • G Gurve referenced this topic on
                          • First post
                            Last post