使用novaclient Python API获取Rackspace的块存储卷列表

1 投票
2 回答
821 浏览
提问于 2025-04-18 06:46

我想通过novaclient这个Python库,获取我在Rackspace账户上的块存储卷列表。以下是我使用的代码:

from rackspace_auth_openstack.plugin import RackspaceAuthPlugin from rackspace_auth_openstack.plugin import auth_url_us

from novaclient.client import Client nova = Client(version = 2,
              username = '******',
              project_id = '******',
              api_key = '******************************',
              region_name = 'DFW',
              auth_system = 'rackspace',
              auth_plugin = RackspaceAuthPlugin(),
              auth_url = auth_url_us())

print nova.servers.list() print nova.volumes.list()

所有的库都是通过 pip install --upgrade rackspace-novaclient 安装的,所以我应该在用最新版本的库。运行上面的代码后,得到的结果是:

$ python test.py 
[<Server: svr01>, <Server: svr02>]
Traceback (most recent call last):
  File "test.py", line 16, in <module>
    print nova.volumes.list()
  File "/usr/lib/python2.7/site-packages/novaclient/v1_1/volumes.py", line 95, in list
    return self._list("/volumes/detail%s" % query_string, "volumes")
  File "/usr/lib/python2.7/site-packages/novaclient/base.py", line 64, in _list
    _resp, body = self.api.client.get(url)
  File "/usr/lib/python2.7/site-packages/novaclient/client.py", line 283, in get
    return self._cs_request(url, 'GET', **kwargs)
  File "/usr/lib/python2.7/site-packages/novaclient/client.py", line 260, in _cs_request
    **kwargs)
  File "/usr/lib/python2.7/site-packages/novaclient/client.py", line 242, in _time_request
    resp, body = self.request(url, method, **kwargs)
  File "/usr/lib/python2.7/site-packages/novaclient/client.py", line 236, in request
    raise exceptions.from_response(resp, body, url, method)
novaclient.exceptions.NotFound: Not found (HTTP 404)

服务器列表的API调用是有效的,所以我很确定我的身份验证是正确的。命令行指令 nova volume-list 也能正常工作,所以看起来我的代码里缺少了一些东西。

2 个回答

0

我测试过这个问题,发现novaclient在使用命令行工具和使用它的Python模块时表现得不一样。我已经把这个问题反馈给了Rackspace团队,专门负责novaclient的那部分,希望他们中的某个人能对此提供更多的解释。

2

因为云块存储的API在一个不同的入口点,所以你需要指定服务类型。

from rackspace_auth_openstack.plugin import RackspaceAuthPlugin, auth_url_us

from novaclient.client import Client
nova = Client(version = 2,
              username = '******',
              project_id = '******',
              api_key = '******************************',
              region_name = 'DFW',
              auth_system = 'rackspace',
              auth_plugin = RackspaceAuthPlugin(),
              auth_url = auth_url_us(),
              service_type = 'volume') # Right here

print nova.volumes.list()

撰写回答