2017-05-15 43 views
1

我們在我們的OpenStack中有名爲<OS> <version>:<build no>的圖像(例如,CentOS 7.2.0:160708.0)。與the Python novaclient,我可以使用client.glance.find_image與三鷹之前的版本。爲什麼冒號打破novaclient的glance.find_image?

$ cat test.py 
#! /usr/bin/env python3 
import os 
import sys 
from novaclient import client 
nova = client.Client("2", 
        os.environ["OS_USERNAME"], 
        os.environ["OS_PASSWORD"], 
        os.environ["OS_TENANT_ID"], 
        os.environ["OS_AUTH_URL"], 
        cacert=os.environ["OS_CACERT"]) 
print(nova.glance.find_image(sys.argv[1])) 

隨着自由:

$ python3 test.py "CentOS 7.2.0:170210.0" 
<Image: CentOS 7.2.0:170210.0> 

隨着三鷹:

$ python3 test.py "CentOS 7.2.0:170210.0" 
Traceback (most recent call last): 
    File "test.py", line 11, in <module> 
    print(nova.glance.find_image(sys.argv[1])) 
    File "/usr/local/lib/python3.6/site-packages/novaclient/v2/images.py", line 53, in find_image 
    "images") 
    File "/usr/local/lib/python3.6/site-packages/novaclient/base.py", line 254, in _list 
    resp, body = self.api.client.get(url) 
    File "/usr/local/lib/python3.6/site-packages/keystoneauth1/adapter.py", line 223, in get 
    return self.request(url, 'GET', **kwargs) 
    File "/usr/local/lib/python3.6/site-packages/novaclient/client.py", line 80, in request 
    raise exceptions.from_response(resp, body, url, method) 
novaclient.exceptions.BadRequest: Unable to filter by unknown operator 'CentOS 7.2.0'.<br /><br /> 


(HTTP 400) 

注意,當這個名字的圖像不存在的錯誤是不同的:

$ python3 test.py "CentOS 7.2.0" 
Traceback (most recent call last): 
    File "test.py", line 11, in <module> 
    print(nova.glance.find_image(sys.argv[1])) 
    File "/usr/local/lib/python3.6/site-packages/novaclient/v2/images.py", line 58, in find_image 
    raise exceptions.NotFound(404, msg) 
novaclient.exceptions.NotFound: No Image matching CentOS 7.2.0. (HTTP 404) 

這就好像find_image一樣期望的形式operator: value的字符串,但the documentation has only this to say about find_image

find_imagename_or_id
通過名稱或ID(用戶提供的輸入)找到的圖像。

如何在使用三鷹時找到名稱中包含冒號的圖像?


$ nova --version 
8.0.0 

回答

1

該錯誤是從圖像服務(概覽)到來。在新版本的Glance中,GET API語法發生了變化,其中有人可以指定「in:」運算符進行過濾。您可以在

https://developer.openstack.org/api-ref/image/v2/index.html?expanded=show-images-detail#show-images

閱讀更多關於這對於你的代碼工作,則可以「:」用引號將圖像名稱和使用前綴字符串:

print(nova.glance.find_image('in:"' + sys.argv[1] + '"')) 

注意一覽對報價相當嚴格;您的圖片名稱只能用雙引號包裹 - 單引號不起作用。因此,我在上面的命令中使用了單引號。

另一種非常低效,但功能選項是使用list()函數在nova.images,然後明確地查找圖像與名稱sys.argv中[1]:

ilist = nova.images.list() 
for image in ilist: 
    if image.name == sys.argv[1]: 
     print image 
     break 
+0

過濾列表可能是低效的,但它比'find_image'更靈活,它需要一個精確的圖像名稱。並且'in:「...」'方式在舊版本中不起作用,所以它不是很有用。感謝您的信息! – muru