2

openstackkeystoneユーザーでCRUD操作を実行したい。keystone api docsによると、x-auth-token情報とともにGETリクエストを使用する必要があります。そのためのコードを記述しましたが、ユーザーリストを取得できませんでしたが、代わりに「404 Not 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)

ユーザー名とパスワードだけでは、アクセスが非常に制限され (「範囲指定されていないアクセス認証トークン」と呼ばれるもの)、有用なことを行うにはさらに要求を行う必要があることに注意してください。

API の V2 を使用する Keystone では、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()

トークンは、「admin_token」の下の [DEFAULT] セクションで Keystone で既に構成したものです。エンドポイント URL は、承認 URL とは異なるポート (35350) であることに注意してください。良くも悪くも、V2 API ではそれらが明示的に分離されており、Keystone 内の要素に対して CRUD 操作を行うには、API エンドポイントにその管理 URL を使用する必要があります。

上で Everett が提供した例で認証する場合、その管理 URL は keystoneclient によって自動的に読み込まれるため、通常、ライブラリを使用する場合は気にする必要はありません。

完全を期すために、Python の keystoneclient ライブラリを使用してエベレットが上記で提案していることを実行するには、次のようにします。

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 に答える