/ 前言 /
在ZStack的API中, 大多数的API返回的是一个任务结果查询地址, 此时我们就需要根据这个地址轮训去查询任务状态及结果
{
"location": "http://localhost:8080/v1/api-jobs/967a26b7431c49c0b1d50d709ef1aef3"
}
ZStack中创建网络的过程比较复杂, 共计调用了7个API, 创建三层网络时我们需要为其添加DNS
、IP Range
、network service
, 三层网络也是创建云主机所必需的参数
/ API /
创建二层网络
-
API名称
创建普通二层网络(CreateL2NoVlanNetwork)
-
请求方式
POST
zstack/v1/l2-networks/no-vlan
-
curl示例
curl -H "Content-Type: application/json" \ -H "Authorization: OAuth b86c9016b4f24953a9edefb53ca0678c" \ -X POST -d '{"params":{"name":"Test-Net","description":"Test","zoneUuid":"c23ba5023f cb3b4b8c3e76c443005e3d","physicalInterface":"eth0"}}' \ http://localhost:8080/zstack/v1/l2-networks/no-vlan
-
返回示例
// 成功 {} // 失败 { "error": { "code": "SYS.1001", "description": "A message or a operation timeout" } }
挂载2层网络到集群
-
API名称
挂载2层网络到集群(AttachL2NetworkToCluster)
-
请求方式
POST
zstack/v1/l2-networks/{l2NetworkUuid}/clusters/{clusterUuid}
-
curl示例
curl -H "Content-Type: application/json" \ -H "Authorization: OAuth b86c9016b4f24953a9edefb53ca0678c" \ -X POST http://localhost:8080/zstack/v1/l2-networks/e852ba6eb4c03f2fafdb73ce838d8980/ clusters/112816423a1a3b50a58d54fd1f6a8665
-
返回示例
{"inventory": { "vlan": 10.0, "name": "Test-Net", "description": "Test", "zoneUuid": "5e0f88c760854e47b9cfdb8fcdcd89c1", "physicalInterface": "eth0", "type": "L2VlanNetwork" }}
创建三层网络
-
API名称
创建3层网络(CreateL3Network)
-
请求方式
POST
zstack/v1/l3-networks
-
curl示例
curl -H "Content-Type: application/json" \ -H "Authorization: OAuth b86c9016b4f24953a9edefb53ca0678c" \ -X POST -d '{"params":{"name":"Test-L3Network","type":"L3BasicNetwork","l2NetworkUuid":" bb059728e72f3ff1b3ae2fc9caba3dce","category":"Private","system":false}}' \ http://localhost:8080/zstack/v1/l3-networks
-
返回示例
{ "inventory": { "name": "Test-L3Network", "l2NetworkUuid": "1bfca1892b674df28d26d9a3c0f609f9", "category": "Private" } }
向三层网络添加DNS
-
API名称
向三层网络添加DNS(AddDnsToL3Network)
-
请求方式
POST
zstack/v1/l3-networks/{l3NetworkUuid}/dns
-
curl示例
curl -H "Content-Type: application/json" \ -H "Authorization: OAuth b86c9016b4f24953a9edefb53ca0678c" \ -X POST -d '{"params":{"dns":"8.8.8.8"}}' \ http://localhost:8080/zstack/v1/l3-networks/0b8da8c298ed3960925abbcc4f913da8/dns
-
返回示例
{"inventory": { "name": "Test-L3Network", "l2NetworkUuid": "08f7b0b577a84c28968ddce5a9377c5d", "dns": [ "8.8.8.8" ] } }
向三层网络添加IP地址范围
-
API名称
添加IP地址范围(AddIpRange)
-
请求方式
POST
zstack/v1/l3-networks/{l3NetworkUuid}/ip-ranges
-
curl示例
curl -H "Content-Type: application/json" \ -H "Authorization: OAuth b86c9016b4f24953a9edefb53ca0678c" \ -X POST -d '{"params":{"name":"Test-IP-Range","startIp":"192.168.100.10","endIp":"192.168. 100.250","netmask":"255.255.255.0","gateway":"192.168.100.1"}}' \ http://localhost:8080/zstack/v1/l3-networks/acc0573590db3297814610cab774b60b/ip-ranges
-
返回示例
{ "inventory": { "l3NetworkUuid": "4cbec970df744e258726f71de79e6497", "name": "Test-IP-Range", "startIp": "192.168.100.10", "endIp": "192.168.100.250", "netmask": "255.255.255.0", "gateway": "192.168.100.1" } }
查询网络服务模块
-
API名称
查询网络服务模块(QueryNetworkServiceProvider)
-
请求方式
POST
zstack/v1/l2-networks/no-vlan
-
curl示例
curl -H "Content-Type: application/json" \ -H "Authorization: OAuth 0305524eb18344ea95193f8283a7212f" \ -X GET http://localhost:8080/zstack/v1/network-services/providers
-
返回示例
{"inventories": [ { "uuid": "3cf04a2c5e1a4c4c8947545323e35d6a", "name": "SecurityGroup", "type": "SecurityGroup", "createDate": "Jun 7, 2017 9:21:03 PM", "lastOpDate": "Jun 7, 2017 9:21:03 PM", "networkServiceTypes": [ "SecurityGroup" ], "attachedL2NetworkUuids": [] }]}
挂载网络服务到三层网络
-
API名称
挂载网络服务到三层网络(AttachNetworkService ToL3Network)
-
请求方式
POST
zstack/v1/l3-networks/{l3NetworkUuid}/network-services
-
curl示例
curl -H "Content-Type: application/json" \ -H "Authorization: OAuth b86c9016b4f24953a9edefb53ca0678c" \ -X POST -d '{"params":{"networkServices":{"41083a0985973a62bf8e6086dff0a2df":[" PortForwarding"]}}}' \ http://localhost:8080/zstack/v1/l3-networks/ae8e1e4d66003a08b748363b8ebb0be8/network- services
-
返回示例
// 成功 {} // 失败 {"error": { "code": "SYS.1001", "description": "A message or a operation timeout", "details": "Create VM on KVM timeout after 300s" }}
/ 代码 /
ZStack中, 大多数的API在调用后返回的是
user_name = 'admin'
user_password='password'
host = 'http://localhost:8080/'
# 创建二层网络
def create_l2_networks(zone_uuid, session_uuid):
data = json.dumps({
"params": {
"name": "L2Network",
"description": "Test",
"zoneUuid": zone_uuid,
"physicalInterface": "ens33"}})
url = host + 'zstack/v1/l2-networks/no-vlan'
headers = {"Content-Type": "application/json", "Authorization": "OAuth " + session_uuid}
response = requests.post(url, data, headers=headers)
l2_uuid = deal_response(response, True)
if l2_uuid:
return l2_uuid
# 创建网络
def create_networks(zone_uuid, cluster_uuid, session_uuid):
# 创建2层网络
l2_uuid = create_l2_networks(zone_uuid, session_uuid)
if l2_uuid:
print('CreateL2Network successfully!')
headers = {"Content-Type": "application/json", "Authorization": "OAuth " + session_uuid}
# 挂载2层网络到集群AttachL2NetworkToCluster
url = host + 'zstack/v1/l2-networks/' + l2_uuid + '/clusters/' + cluster_uuid
response = requests.post(url, None, headers=headers)
rsp = json.loads(response.text)
if rsp:
if query_until_done(rsp):
print('AttachL2NetworkToCluster successfully!')
# 创建3层网络CreateL3Network
data = json.dumps({
"params": {
"name": "L3Network",
"type": "L3BasicNetwork",
"l2NetworkUuid": l2_uuid,
"category": 'Private',
"system": "false"}})
url = host + 'zstack/v1/l3-networks'
response = requests.post(url, data, headers=headers)
rsp = json.loads(response.text)
if rsp:
json_str = query_until_done(rsp)
l3_uuid = json_str['inventory']['uuid']
if l3_uuid:
print('CreateL3Network successfully!')
# 添加DNSAddDnsToL3Network
data = json.dumps({
"params": {
"dns": "8.8.8.8"}})
url = host + 'zstack/v1/l3-networks/' + l3_uuid + '/dns'
response = requests.post(url, data, headers=headers)
rsp = json.loads(response.text)
if rsp:
if query_until_done(rsp):
print('AddDnsToL3Network successfully!')
# 添加IP地址范围AddIpRange
data = json.dumps({
"params": {
"name": "ip-range",
"startIp": "192.168.100.10",
"endIp": "192.168.100.250",
"netmask": "255.255.255.0",
"gateway": "192.168.100.1"}})
url = host + 'zstack/v1/l3-networks/' + l3_uuid + '/ip-ranges'
response = requests.post(url, data, headers=headers)
rsp = json.loads(response.text)
if rsp:
if query_until_done(rsp):
print('AddIpRange successfully!')
# 查询网络服务模块QueryNetworkServiceProvider
url = host + 'zstack/v1/network-services/providers'
response = requests.get(url, data, headers=headers)
rsp = json.loads(response.text)
if rsp:
inventories_dict = {}
inventories_list = rsp['inventories']
for index in range(len(inventories_list)):
item = inventories_list[index]
inventories_dict[item['uuid']] = item['networkServiceTypes']
# 添加网络服务到3层网络AttachNetworkServiceToL3Network
if inventories_dict:
print('QueryNetworkServiceProvider successfully!')
data = json.dumps({
"params": {
"networkServices": inventories_dict}})
url = host + 'zstack/v1/l3-networks/' + l3_uuid + '/network-services'
response = requests.post(url, data, headers=headers)
if response:
print('Network created successfully!')
return l3_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:
# 创建网络
l3_uuid = create_networks(zone_uuid, cluster_uuid, session_uuid)