【问题标题】:Getting a list of block storage volumes at Rackspace using novaclient Python API使用 novaclient Python API 在 Rackspace 获取块存储卷列表
【发布时间】:2014-05-16 16:10:45
【问题描述】:

我正在尝试使用 novaclient Python API 获取我在 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 调用有效,所以我很确定我的身份验证正确。 CLI 命令nova volume-list 工作正常,因此我的代码中似乎缺少某些内容。

【问题讨论】:

    标签: python openstack rackspace novaclient


    【解决方案1】:

    由于云块存储 API 在不同的端点下,您必须指定 service_type

    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()
    

    【讨论】:

    • 这为我提供了我正在寻找的信息。但是,有没有办法使用单个 Client 对象来做到这一点,或者这是因为 Rackspace 构建了他们的服务的方式?
    • 客户端对象在内部保存一个端点。理论上,您可以使用单个客户端执行此操作,但这将涉及手动更新端点或每次重新进行身份验证。 Nova-client 最初的想法是它只能用于 Nova,但是一旦我们添加了对与 Nova 交互的服务的支持,该结构就无法适应。
    【解决方案2】:

    我已经对此进行了测试并确认 novaclient 在使用其 CLI 和使用其 Python 模块时的行为不同。我已将此问题转发给在 novaclient 上工作的 Rackspace 团队;我希望他们中的一位能够对此有所了解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 2017-04-25
      相关资源
      最近更新 更多