vast-ai / vast-python

Vast.ai python and cli api client
MIT License
117 stars 44 forks source link

TypeError when using ssh-url #80

Closed samizdis closed 7 months ago

samizdis commented 8 months ago

I'm getting the following traceback when running vastai ssh-url:

sam@Sams-MacBook-Pro ~> vastai ssh-url 9086391
Traceback (most recent call last):
  File "/usr/local/bin/vastai", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.9/site-packages/vastai/vast.py", line 3070, in main
    sys.exit(args.func(args) or 0)
  File "/usr/local/lib/python3.9/site-packages/vastai/vast.py", line 1857, in ssh_url
    return _ssh_url(args, "ssh://")
  File "/usr/local/lib/python3.9/site-packages/vastai/vast.py", line 1918, in _ssh_url
    if (port > 0):
TypeError: '>' not supported between instances of 'str' and 'int'

where 9086391 is an instance ID. Any ideas?

samizdis commented 8 months ago

When using --explain:

sam@Sams-MacBook-Pro ~ [2]> vastai ssh-url --explain 9086391
query args:
{'owner': 'me', 'api_key': '<snip>'}

base: https://console.vast.ai/api/v0/instances? + query: 
https://console.vast.ai/api/v0/instances?owner=me&api_key=<snip>

Traceback (most recent call last):
  File "/usr/local/bin/vastai", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.9/site-packages/vastai/vast.py", line 3070, in main
    sys.exit(args.func(args) or 0)
  File "/usr/local/lib/python3.9/site-packages/vastai/vast.py", line 1857, in ssh_url
    return _ssh_url(args, "ssh://")
  File "/usr/local/lib/python3.9/site-packages/vastai/vast.py", line 1918, in _ssh_url
    if (port > 0):
TypeError: '>' not supported between instances of 'str' and 'int'

and curling that URL gives a JSON dict with:

"ports": {
    "22/tcp": [{"HostIp": "0.0.0.0", "HostPort": "58923"}, {"HostIp": "::", "HostPort": "58923"}],
    "8080/tcp": [{"HostIp": "0.0.0.0", "HostPort": "61301"}, {"HostIp": "::", "HostPort": "61301"}]
    }
samizdis commented 8 months ago

So it does indeed look like a bug in the code, since HostPort is being returned as a string, and

        ports     = instance.get("ports",{})
        port_22d  = ports.get("22/tcp",None)
        port      = -1
        try:
            if (port_22d is not None):
                ipaddr = instance["public_ipaddr"]
                port   = port_22d[0]["HostPort"]
            else:        
                ipaddr = instance["ssh_host"]
                port   = int(instance["ssh_port"])+1
        except:
            port = -1

    if (port > 0):
        print(f'{protocol}root@{ipaddr}:{port}')
samizdis commented 8 months ago

PR: https://github.com/vast-ai/vast-python/pull/81