ZStack HTTP API使用
1.紹介
ZStackのAPI原語はJSON形式のメッセージで、各種のメッセージバスで呼び出すことができ、現在ZStackが使用しているデフォルトのメッセージバスはRabbitMQである.この特性のためにZStackのAPIを様々なフォーマットにカプセル化することができる.ZStackは皆さんの使用を便利にするために、HTTPサーバを持っています.ユーザーはHTTP POSTを通じてAPI JSONテキストを送信することができます.このHTTPサーバは自動的にAPIメッセージに変換して呼び出しを実現します.
今後ZStack APIをRestful形式にカプセル化しますが、現在のHTTP POSTがAPI JSON原語を送信する方法はずっと保持されています.
ZStackのコマンドラインツール(zstack-cli)は、HTTP POSTメソッドを完全に使用してAPIを呼び出すものであり、ユーザが読みやすいように、すべてのAPIに対するユーザマニュアルの解釈はzstack-cliを例に挙げており、各cliコマンドはAPIに対応している.ユーザーは、中国語のユーザーマニュアルで各APIの詳細な説明を得ることができます.
zstack-cliのlogによって、ユーザーはすべてのAPI呼び出しと返される特定のフォーマット(すなわちHTTP POSTのBODY)を表示することができる.
Logパス:/var/log/zstack/zstack-cli
ユーザーはtail-f/var/log/zstack/zstack-cliを使用してlogをリアルタイムで表示することをお勧めします.これにより、zstack-cliでAPIを実行するときに、特定の呼び出しと出力をリアルタイムで観測できます.例:
ZStackのAPI原語はJSON形式のメッセージで、各種のメッセージバスで呼び出すことができ、現在ZStackが使用しているデフォルトのメッセージバスはRabbitMQである.この特性のためにZStackのAPIを様々なフォーマットにカプセル化することができる.ZStackは皆さんの使用を便利にするために、HTTPサーバを持っています.ユーザーはHTTP POSTを通じてAPI JSONテキストを送信することができます.このHTTPサーバは自動的にAPIメッセージに変換して呼び出しを実現します.
今後ZStack APIをRestful形式にカプセル化しますが、現在のHTTP POSTがAPI JSON原語を送信する方法はずっと保持されています.
ZStackのコマンドラインツール(zstack-cli)は、HTTP POSTメソッドを完全に使用してAPIを呼び出すものであり、ユーザが読みやすいように、すべてのAPIに対するユーザマニュアルの解釈はzstack-cliを例に挙げており、各cliコマンドはAPIに対応している.ユーザーは、中国語のユーザーマニュアルで各APIの詳細な説明を得ることができます.
zstack-cliのlogによって、ユーザーはすべてのAPI呼び出しと返される特定のフォーマット(すなわちHTTP POSTのBODY)を表示することができる.
Logパス:/var/log/zstack/zstack-cli
ユーザーはtail-f/var/log/zstack/zstack-cliを使用してlogをリアルタイムで表示することをお勧めします.これにより、zstack-cliでAPIを実行するときに、特定の呼び出しと出力をリアルタイムで観測できます.例:
- >>LogInByAccount accountName=admin password=password
, LOG :
- 2016-02-16 16:29:48,664 DEBUG [apibinding.api] async call[url: http://localhost:8080/zstack/api/, request: {"org.zstack.header.identity.APILogInByAccountMsg": {"password": "b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86", "session": {}, "accountName": "admin"}}]
- 2016-02-16 16:29:48,741 DEBUG [apibinding.api] async call[url: http://localhost:8080/zstack/api/, response: {"org.zstack.header.identity.APILogInReply":{"inventory":{"uuid":"083f3518d1bd469fa0ff789fc1a25382","accountUuid":"36c27e8ff05c4780bf6d2fa65700f22e","userUuid":"36c27e8ff05c4780bf6d2fa65700f22e","expiredDate":"Feb 17, 2016 12:29:48 PM","createDate":"Feb 16, 2016 4:29:48 PM"},"success":true}}]
ここhttp://localhost:8080/zstack/api/HTTP び しのURLであり、request の はAPI び し のHTTP POSTのBODYであり、 えばここでLogInByAccountというAPIのHTTP POST BODYは、
- {
- "org.zstack.header.identity.APILogInByAccountMsg": {
- "password": "b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86",
- "session": {},
- "accountName": "admin"
- }
- }
response API HTTP response BODY, LogInByAccount :
- {
- "org.zstack.header.identity.APILogInReply": {
- "inventory": {
- "uuid": "083f3518d1bd469fa0ff789fc1a25382",
- "accountUuid": "36c27e8ff05c4780bf6d2fa65700f22e",
- "userUuid": "36c27e8ff05c4780bf6d2fa65700f22e",
- "expiredDate": "Feb 17, 2016 12:29:48 PM",
- "createDate": "Feb 16, 2016 4:29:48 PM"
- },
- "success": true
- }
- }
2.APIのフォーマット
ZStack APIの び しと りはいずれもJSON で され、フォーマットは1つのentryのJSON mapのみであり、このentryのkeyはAPI であり、valueは な を する1つのmapである.API は、API び しまたは を に すために され、ユーザはそれをAPIの と なすことができる. の では、API び しの はorg.zstack.header.identity.APILogInByAccountMsgであり、APIが す はorg.zstack.header.identity.APILogInReplyである.
3.HTTPリターンコード
リターンコード
200
HTTP び しに しました.しかし、APIの に したわけではなく、APIの はAPIが すsuccessフィールドによって され、trueは を す.falseは を す
その
は のHTTPリターンコードと じであり、 えば500はInternal Server Errorを す.404はNo such pageを す
4. HTTP Response Body
APIのHTTP responseは、クエリAPIが したかどうかを び し がポーリングする があるJob を す.API Jobのフォーマットは の りである.
フィールド
を します.
uuid
JOB UUIDは、ユーザがAPI JOBの の を い わせることができる.state==Doneの 、このフィールドはNULLになります.
state
JOB .2つの を む:Processing、このJOBはまだ されている;Done、JOBは しました
result
API 、JSON .state=Processingの 、このフィールドはNULLです.
createdDate
JOB
finishedDate
JOB
state==ProcessingのJob :
- {
- "uuid": "fee83ed8529340cd8528b3b408dc16b0",
- "state": "Processing",
- "createdDate": "Feb 16, 2016 5:01:11 PM"
- }
state==DoneのJob :
- {
- "uuid": "fee83ed8529340cd8528b3b408dc16b0",
- "state": "Done",
- "createdDate": "Feb 16, 2016 5:01:11 PM",
- "finishedDate": "Feb 16, 2016 5:01:12 PM",
- "result": "{"org.zstack.header.zone.APICreateZoneEvent":{"inventory":{"uuid":"f1ed8f95163c4b6c88a8c0673b7913b7","name":"xx","state":"Enabled","type":"zstack","createDate":"Feb 16, 2016 5:01:12 PM","lastOpDate":"Feb 16, 2016 5:01:12 PM"},"success":true}}"
- }
4.1 API JOBの を い わせる
APIが び されると、HTTP responseは、ユーザがuuidを してJobの を する があるJob を す. http://locahost:8080/api/result/{job uuid} HTTP Get , :
- curl http://localhost:8080/zstack/api/result/fee83ed8529340cd8528b3b408dc16b0
そのHTTP responseはJob を し,ユーザはJobのstateフィールドを することによってJobが したか かを し,Jobの をポーリングし ける があるか かを することができる.
5.APIの び しフロー
ZStack APIの び しの な れは: LogInByAccountを び し、 のAPI び しのtoken としてSession UUIDを する API 1 を び す API 2 を び す ... ... API N を び す LogOut を び す
5.1ログイン
のAPIを び す に、ユーザは、 のAPI び しのtokenとして、セッションUUIDを するために、まずLogInByAccountを び す がある.このAPIの は、org.zstack.header.identity.APILogInByAccountMsgであり、 のフィールドを む.
フィールド
accountName
ユーザー . えばadmin|
password
パスワード.zstackはパスワードを せず, にデータベースに されているパスワードデータと する.CreateAccountのようなAPIを び す 、パスワードはsha 512で することをお めします.
デフォルトのユーザー パスワード:ZStackのデフォルトのユーザー はadminで、そのパスワードの はpasswordで、sha 512ハッシュの の は
b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86 API JSON :
- {
- "org.zstack.header.identity.APILogInByAccountMsg": {
- "password": "b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86",
- "accountName": "admin"
- }
- }
このAPIはcurlで び されます.
- curl -H "Content-Type: application/json" -d '{"org.zstack.header.identity.APILogInByAccountMsg": {"password": "b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86", "accountName": "admin"}}' http://localhost:8080/zstack/api
されるJob は のとおりです.
- {
- "state": "Done",
- "createdDate": "Feb 16, 2016 7:15:01 PM",
- "finishedDate": "Feb 16, 2016 7:15:01 PM",
- "result": "{"org.zstack.header.identity.APILogInReply":{"inventory":{"uuid":"9eba9754f8c2470cbb377088e61c4da2","accountUuid":"36c27e8ff05c4780bf6d2fa65700f22e","userUuid":"36c27e8ff05c4780bf6d2fa65700f22e","expiredDate":"Feb 17, 2016 3:15:01 PM","createDate":"Feb 16, 2016 7:15:01 PM"},"success":true}}"
- }
result API ,JSON :
- {
- "org.zstack.header.identity.APILogInReply": {
- "inventory": {
- "uuid": "9eba9754f8c2470cbb377088e61c4da2",
- "accountUuid": "36c27e8ff05c4780bf6d2fa65700f22e",
- "userUuid": "36c27e8ff05c4780bf6d2fa65700f22e",
- "expiredDate": "Feb 17, 2016 3:15:01 PM",
- "createDate": "Feb 16, 2016 7:15:01 PM"
- },
- "success": true
- }
- }
ここでuuidフィールドは、 たちが とするSession UUIDです.
5.2 API び し
(LogInByAccount)、 (LogOut)などの のAPIを き、 りは のAPIであり、 び し にLogInが したSession UUIDに する があり、そのJSON は の りである.
- {
- "API ": {
- "session": {
- "uuid": "LogIn session UUID"
- },
- "API 1": ...,
- "API 2”: ...
- }
- }
:zstack-cliで する APIの 、request、responseは、/var/log/zstack/zstack-cliを することによって ることができます.
5.3
なAPIを したら、LogOut APIを び して のセッションを する があります.このAPIの はorg.zstack.header.identity.APILogOutMsgであり、そのJSON は:
- {
- "org.zstack.header.identity.APILogOutMsg": {
- "sessionUuid": " LogOut Session UUID"
- }
- }
curl :
- curl -H "Content-Type: application/json" -d '{"org.zstack.header.identity.APILogOutMsg": {"sessionUuid": "083f3518d1bd469fa0ff789fc1a25382"}}' http://localhost:8080/zstack/api
6.ZoneのCurlの を する
ここではZoneの という を いて,ZStackのAPIをCurlで で び す を す.
6.1ログイン
び し:
- curl -H "Content-Type: application/json" -d '{"org.zstack.header.identity.APILogInByAccountMsg": {"password": "b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86", "accountName": "admin"}}' http://localhost:8080/zstack/api
り :
- {"state":"Done","createdDate":"Feb 16, 2016 7:53:14 PM","finishedDate":"Feb 16, 2016 7:53:14 PM","result":"{"org.zstack.header.identity.APILogInReply":{"inventory":{"uuid":"2f68cf0a5783400694bd8efdd536a2a8","accountUuid":"36c27e8ff05c4780bf6d2fa65700f22e","userUuid":"36c27e8ff05c4780bf6d2fa65700f22e","expiredDate":"Feb 17, 2016 3:53:14 PM","createDate":"Feb 16, 2016 7:53:14 PM"},"success":true}}"}
6.2 Zoneを :
- curl -H "Content-Type: application/json" -d '{"org.zstack.header.zone.APICreateZoneMsg": {"session": {"uuid": "2f68cf0a5783400694bd8efdd536a2a8"}, "name": "zone1"}}' http://localhost:8080/zstack/api
は、
- {"uuid":"2252332b14fb42599558577cb24fa168","state":"Processing","createdDate":"Feb 16, 2016 7:55:34 PM"}
ここではJob UUIDを しました 2252332 b 14 fb 42599558577 cb 24 fa 168は、ZoneというAPIを した をポーリングすることができます.
ポーリング :
- curl http://localhost:8080/zstack/api/result/2252332b14fb42599558577cb24fa168
り :
- {"uuid":"2252332b14fb42599558577cb24fa168","state":"Done","createdDate":"Feb 16, 2016 7:55:34 PM","finishedDate":"Feb 16, 2016 7:55:34 PM","result":"{"org.zstack.header.zone.APICreateZoneEvent":{"inventory":{"uuid":"dd625f8fb2074f4fa1c0870ef76bb24a","name":"zone1","state":"Enabled","type":"zstack","createDate":"Feb 16, 2016 7:55:34 PM","lastOpDate":"Feb 16, 2016 7:55:34 PM"},"success":true}}"}
ここではAPIが しているのを て、state==Done.APIの は、resultフィールドにJSON として されます.successフィールドがtrueであるため、API び しが したことがわかります.
6.3
び し:
- curl -H "Content-Type: application/json" -d '{"org.zstack.header.identity.APILogOutMsg": {"sessionUuid": "2252332b14fb42599558577cb24fa168"}}' http://localhost:8080/zstack/api
り :
- {"state":"Done","createdDate":"Feb 16, 2016 8:04:36 PM","finishedDate":"Feb 16, 2016 8:04:37 PM","result":"{"org.zstack.header.identity.APILogOutReply":{"success":true}}"}
7.ZoneのPythonの を する
ここをクリックして なコードを ることができます.
- import httplib
- import json
- import time
-
- # return a dict containing API return value
- def api_call(session_uuid, api_id, api_content):
- conn = httplib.HTTPConnection("localhost", 8080)
- headers = {"Content-Type": "application/json"}
-
- if session_uuid:
- api_content["session"] = {"uuid": session_uuid}
-
- api_body = {api_id: api_content}
-
- conn.request("POST", "/zstack/api", json.dumps(api_body))
- response = conn.getresponse()
-
- if response.status != 200:
- raise Exception("failed to make an API call, %s, %s" % (response.status, response.reason))
-
- rsp_body = response.read()
-
- rsp = json.loads(rsp_body)
-
- if rsp["state"] == "Done":
- return json.loads(rsp["result"])
-
- job_uuid = rsp["uuid"]
- def query_until_done():
- conn.request("GET", "/zstack/api/result/%s" % job_uuid)
- response = conn.getresponse()
- if response.status != 200:
- raise Exception("failed to query API result, %s, %s" % (response.status, response.reason))
-
- rsp_body = response.read()
- rsp = json.loads(rsp_body)
- if rsp["state"] == "Done":
- return json.loads(rsp["result"])
-
- time.sleep(1)
- print "Job[uuid:%s] is still in processing" % job_uuid
- return query_until_done()
-
- return query_until_done()
-
-
-
- def error_if_fail(rsp):
- success = rsp.values()[0]["success"]
- if not success:
- error = rsp.values()[0]["error"]
- raise Exception("failed to login, %s" % json.dumps(error))
-
- def login():
- content = {
- "accountName": "admin",
- "password": "b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86"
- }
- rsp = api_call(None, "org.zstack.header.identity.APILogInByAccountMsg", content)
- error_if_fail(rsp)
-
- session_uuid = rsp.values()[0]["inventory"]["uuid"]
-
- print "successfully login, session uuid is: %s" % session_uuid
- return session_uuid
-
-
- def create_zone(session_uuid):
- content = {"name": "zone1"}
-
- rsp = api_call(session_uuid, "org.zstack.header.zone.APICreateZoneMsg", content)
- error_if_fail(rsp)
-
- print "successfully created zone1"
-
-
- def logout(session_uuid):
- content = {"sessionUuid": session_uuid}
- rsp = api_call(None, "org.zstack.header.identity.APILogOutMsg", content)
- error_if_fail(rsp)
-
- print "successfully logout"
- session_uuid = login()
- create_zone(session_uuid)
- logout(session_uuid)