2017-05-15 4 views
1

Wir haben Bilder in unserem OpenStack namens <OS> <version>:<build no> (z. B. CentOS 7.2.0:160708.0). Mit the Python novaclient kann ich client.glance.find_image mit Releases vor Mitaka verwenden.Warum bricht ein Doppelpunkt novaclients 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])) 

Mit Freiheit:

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

Mit Mitaka:

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

Beachten Sie, dass der Fehler, wenn ein Bild dieses Namens existiert nicht anders:

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

Es ist, als ob find_image ist erwartet einen String der Form operator: value, aber the documentation has only this to say about find_image:

find_image (name_or_id)
ein Bild (Benutzereingabe zur Verfügung gestellt) nach Name oder ID finden.

Wie finde ich ein Bild, dessen Name einen Doppelpunkt enthält, wenn Sie Mitaka verwenden?


$ nova --version 
8.0.0 

Antwort

1

Der Fehler kommt aus dem Bilddienst (Überblick). In den neueren Versionen von Glance gibt es eine Änderung in der GET-API-Syntax, bei der jemand einen "in:" -Operator zum Filtern angeben kann. Sie können https://developer.openstack.org/api-ref/image/v2/index.html?expanded=show-images-detail#show-images

Für Ihren Code zu arbeiten, bei

mehr darüber lesen können Sie den Bildnamen mit Anführungszeichen und Präfix mit „in:“ string:

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

Beachten Sie, dass Glance ist ziemlich streng über Zitate; Ihr Bildname muss nur in doppelte Anführungszeichen gesetzt werden - einfache Anführungszeichen funktionieren nicht. Daher habe ich das einfache Anführungszeichen für die Zeichenfolge im obigen Befehl verwendet.

Eine weitere ziemlich ineffizient, aber funktionale Option ist Liste() Funktion in nova.images zu verwenden und dann schaut explizit für das Bild mit dem Namen sys.argv [1]:

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

die Liste filtern könnte sein, ineffizient, aber es ist viel flexibler als 'find_image', das einen genauen Bildnamen erwartet. Und der 'in:" ... "Weg wird nicht mit älteren Versionen funktionieren, also ist es nicht so nützlich. Danke für die Information! – muru

Verwandte Themen