2

我想对 openstack keystone 用户执行 CRUD 操作。根据 keystone api docs,我们必须使用 GET 请求以及 x-auth-token 信息。我为此编写了一个代码,但我无法获得任何用户列表,而是得到“404 Not Found,The resource could not be found”。我的代码如下

#!/usr/bin/python
import httplib
import urllib
import os
import json
from urlparse import urlparse
#Define openstack url
url = "x.x.x.x:5000"
osuser = "osuser"
ospassword = "whatever"

params ='{"auth":{"tenantName":"openstackDemo", "passwordCredentials":{"username":"osuser", "password": "ospassword"}}}'
headers = {"Content-Type": "application/json"}
#make http request
conn = httplib.HTTPConnection(url)
conn.request("POST", "/v2.0/tokens", params,headers)
#get http response
response = conn.getresponse()
data = response.read()
verify_services = json.loads(data)
conn.close()
#print "The service verificetion is:%s\n\t" % verify_services
#Get keystone token
keystone_token = verify_services ['access']['token']['id']
print "Printing api token :\n" 
print keystone_token
user_id = verify_services['access']['user']['id']
print "Printing user id : \n"
print user_id
# Get keystone URL

keystone_url = verify_services ['access']['serviceCatalog'][5]
print "Printing keystone end points url: \n"
print keystone_url

#Now take the keystone public url and uid

for publicurl in keystone_url['endpoints']:
key_admin_url = publicurl['adminURL']
key_pub_url = publicurl['publicURL']
keystone_user_id = publicurl['id']      

print "printing keystone public url:\n"
print key_pub_url

print "Printing keystone user id:\n"
print keystone_user_id


##################
# Get the user list
#################
apiurlt = urlparse(key_pub_url)
print apiurlt
url2 = apiurlt[1]
print url2
#params1 = '{"username":"samit", "email":"sanjaya@kth.se","enabled":true,"password":"secret", "roles":"member"}'
p = urllib.urlencode({})
headers1 = {"X-Auth-Token":"keystone_token", "Content-type":"application/json"}
conn2 = httplib.HTTPConnection(url2)
conn2.request("GET", "%s/users" %apiurlt[2]  , p,headers1)
response2 = conn2.getresponse()
data2 = response2.read()
user_list = json.dumps(data2)
conn.close()
print "getting users:\n"
print response.status
print response.reason
print user_list
4

2 回答 2

4

@sanjaya,如果您正在寻找一种通过 Python 快速与 Keystone 交互的方法,我建议您直接使用 keystoneclient 库,该库内置了所有这些相关工作。您可以从https://github.com/openstack/python-keystoneclient/获取源代码,或者从 PyPi ( http://pypi.python.org/pypi/ python-keystoneclient/0.1.3 )。

使用该客户端,您可以超级轻松地与 Keystone 交互:

from keystoneclient.v2_0 import client
kc = client.Client(username=osuser, password=ospassword, auth_url=url)

请注意,仅使用用户名和密码,您将拥有非常有限的访问权限(所谓的“无范围访问授权令牌”),您需要进一步请求才能做任何有用的事情。

Keystone 更是如此,它在 API V2 中需要“管理员”角色才能与 keystone 上的任何 CRUD 操作进行交互。在您只想与 Keystone 交互的情况下(例如在设置许多其他部分之前启动帐户),从“管理令牌”开始并直接从客户端使用管理 URL 界面会更容易. 要做到这一点:

from keystoneclient.v2_0 import client
kc = client.Client(token='123secret456', endpoint='http://x.x.x.x:35350/v2.0')
kc.users.list()

该令牌是您在 Keystone 中“admin_token”下的 [DEFAULT] 部分中已经配置的。请注意,端点 URL 是与授权 URL 不同的端口 (35350)。无论好坏,V2 API 都将它们明确分开,并且要对 Keystone 中的元素执行 CRUD 操作,您需要使用 API 端点的管理 URL。

如果您使用 Everett 上面提供的示例进行身份验证,则该管理 URL 将由 keystoneclient 自动加载,因此对于该库,您通常不必担心。

为了完整起见,使用 Python 中的 keystoneclient 库执行 Everett 上面的建议:

from keystoneclient.v2_0 import client
kc = client.Client(username='admin', password='devstack', tenant_name='admin', auth_url='http://172.16.0.1:5000/v2.0')
kc = client.users.list()
于 2012-11-01T01:18:35.300 回答
1

使用 bash 这就是我所做的

TOKEN=`curl -s -X POST http://172.16.0.1:35357/v2.0/tokens -d '{"auth": {"passwordCredentials": {"username":"admin", "password":"devstack"}, "tenantName":"admin"}}' -H "Content-type: application/json" | python -c 'import json,sys; response=json.loads(sys.stdin.read()); print response["access"]["token"]["id"]'`;

curl -s http://172.16.0.1:35357/v2.0/users -H "X-Auth-Token: "$TOKEN""

请注意,我正在以管理员身份进行身份验证。也许里面的东西会对你有所帮助。

于 2012-10-30T21:52:53.177 回答