Openstack의 API를 사용할 때는 공식문서에 잘 정리되어 있어서, 나름 접근성이 높았다. 반면에, Cloudstack에서 API를 사용하기 위한 공식문서가 Openstack에 비해 관련 문서가 주관적으로 잘 안되어 있어 관련해서 실습한 내용을 적어보았다.
Cloudstack API 사용을 시작하려면 다음과 같은 항목이 필요하다.
1. http://192.168.0.3:8080/client/api
2. ?command=deployVirtualMachine
3. &serviceOfferingId=1
4. &diskOfferingId=1
5. &templateId=2
6. &zoneId=4
7. &apiKey=miVr6X7u6bN_sdahOBpjNejPgEsT35eXqjB8CG20YI3yaxXcgpyuaIRmFI_EJTVwZ0nUkkJbPmY3y2bciKwFQ
8. &signature=Lxx1DM40AjcXU%2FcaiK8RAP0O1hU%3D
API 요청을 인증받고 수행하기 위해서는 앞서 봤던 사용자의 SecretKey를 HMAC SHA-1 해싱 알고리즘을 이용하여 만든 서명해시 signature 를 생성하여야 한다.
Python으로 signature 생성하고 listusers 요청
import urllib.parse
import hmac
import hashlib
import base64
import requests as re
import json
baseurl = "http://192.168.0.3:8080/client/api?"
def make_request(requests, secretKey):
# (a, b) 형식으로 a 기준 정렬
request = sorted(zip(requests.keys(), requests.values()),key=lambda x: str.lower(x[0]))
# URL에 사용 가능한 문자열로 반환
requestUrl = "&".join(["=".join([r[0], urllib.parse.quote(str(r[1]))]) for r in request])
hashStr = "&".join(["=".join([str.lower(r[0]), str.lower(urllib.parse.quote(str(r[1]))).replace("+","%20")]) for r in request])
secretKey = bytes(secretKey, 'utf-8')
sig = urllib.parse.quote(base64.encodebytes(hmac.new(secretKey, hashStr.encode('utf-8'), hashlib.sha1).digest()).strip())
requestUrl = baseurl + requestUrl + "&signature=" + sig
response = re.get(requestUrl)
if __name__ == '__main__':
requests = {
"apiKey": "yevaOA_CNLzd8hJvTsPrkevX7opkpk6pdX0DtoKgqidyXopSC5P5ib4iti0vVZSL1JajzKTmOnOawMuy3uz85w",
"response" : "json",
"command" : "listUsers"
}
secretKey = "0Ie2os9WuVAFXtjmNvTV_ugX8OEeyGVW1aLK18Smp-FVIr65c-i21Ssb4ZTB9tYRTnVnJBmhLNemU5Ox9jgeaQ"
make_request(requests, secretKey)
만들어진 url
1. http://192.168.0.3:8080/client/api
2. ?apiKey=yevaOA_CNLzd8hJvTsPrkevX7opkpk6pdX0DtoKgqidyXopSC5P5ib4iti0vVZSL1JajzKTmOnOawMuy3uz85w
3. &command=listUsers
4. &response=json
5. &signature=XrBUx0z/librIW79fiPGlUbG/9k%3D`
결과
{
"listusersresponse": {
"count": 1,
"user": [
{
"id": "2dff1745-b26b-11ed-839b-080027be30c0",
"username": "admin",
"firstname": "admin",
"lastname": "cloud",
"created": "2023-02-21T18:41:32-0500",
"state": "enabled",
"account": "admin",
"accounttype": 1,
"usersource": "native",
"roleid": "27e6b70a-b26b-11ed-839b-080027be30c0",
"roletype": "Admin",
"rolename": "Root Admin",
"domainid": "15c13fc3-b26b-11ed-839b-080027be30c0",
"domain": "ROOT",
"apikey": "yevaOA_CNLzd8hJvTsPrkevX7opkpk6pdX0DtoKgqidyXopSC5P5ib4iti0vVZSL1JajzKTmOnOawMuy3uz85w",
"accountid": "2dfe2ab5-b26b-11ed-839b-080027be30c0",
"iscallerchilddomain": false,
"isdefault": true
}
]
}
}