/ 前言 /
在ZStack的API中, 大多数的API返回的是一个任务结果查询地址, 此时我们就需要根据这个地址轮训去查询任务状态及结果
{
"location": "http://localhost:8080/v1/api-jobs/967a26b7431c49c0b1d50d709ef1aef3"
}
我们知道ZStack中有管理节点
和计算节点
的概念, 创建物理机其实就是将已有的计算节点添加到管理节点中, 方便后续操作
/ API /
创建物理机
-
API名称
添加KVM主机(AddKVMHost)
-
请求方式
POST
zstack/v1/hosts/kvm
-
curl示例
curl -H "Content-Type: application/json" \ -H "Authorization: OAuth b86c9016b4f24953a9edefb53ca0678c" \ -X POST -d '{"params":{"username":"userName","password":"password","sshPort":"22","name ":"newHost","managementIp":"127.0.0.1","clusterUuid":"9adf394ca46432afb1218d220bf2925e "}}' \ http://localhost:8080/zstack/v1/hosts/kvm
-
返回示例
{"inventory": { "zoneUuid": "d4160c59319c4642832e666514364a79", "name": "example", "uuid": "479e88bab7a647e3b066a724c8bb3b82", "clusterUuid": "42ade59801804602b9986b42fd103d1c", "description": "example", "managementIp": "192.168.0.1", "hypervisorType": "KVM", "state": "Enabled", "status": "Connected", "totalCpuCapacity": 4.0, "availableCpuCapacity": 2.0, "totalMemoryCapacity": 4.0, "availableMemoryCapacity": 4.0 }}
/ 代码 /
ZStack中, 大多数的API在调用后返回的是
user_name = 'admin'
user_password='password'
host = 'http://localhost:8080/'
# 创建物理机
def create_host(cluster_uuid, session_uuid):
# 需要注意的是managementIp这个参数必须是当前已有结算节点的ip地址, 且管理节点可以ping通该ip
content = {
"params": {
"username": "root",
"password": "password",
"name": "Host",
"sshPort": 22,
"managementIp": "192.168.0.100",
"clusterUuid": cluster_uuid,
"hostType": "kvm",
"description": "host_des"
}
}
data = json.dumps(content)
url = host + 'zstack/v1/hosts/kvm'
headers = {"Content-Type": "application/json", "Authorization": "OAuth " + session_uuid}
response = requests.post(url, data, headers=headers)
host_uuid = deal_response(response, True)
if host_uuid:
return host_uuid
# 处理返回数据
def deal_response(response, is_return):
if response:
rsp = json.loads(response.text)
if rsp:
print('rsp : {%s}' % rsp)
json_str = query_until_done(rsp)
if json_str:
if not json_str.has_key('error'):
if is_return:
return json_str['inventory']['uuid']
else:
return True
return False
# 轮询查询API结果
def query_until_done(rsp):
# 截取任务id, 替换请求地址
if rsp.has_key('location'):
location = rsp['location']
job_uuid = location.split('/')[-1]
if job_uuid:
while True:
url = host + "zstack/v1/api-jobs/" + location.split('/')[-1]
response = requests.get(url)
text = response.text
print(text)
if text != '{}':
print('url : {%s}' % url)
return json.loads(text)
if __name__ == '__main__':
session_uuid = login()
if session_uuid:
# 创建区域
zone_uuid = create_zone(session_uuid)
if zone_uuid:
# 创建集群
cluster_uuid = create_clusters(session_uuid, zone_uuid)
if cluster_uuid:
# 创建物理机
host_uuid = create_host(cluster_uuid, session_uuid)