ZStack - 创建2层3层网络

/ 前言 /

       在ZStack的API中, 大多数的API返回的是一个任务结果查询地址, 此时我们就需要根据这个地址轮训去查询任务状态及结果

{ 
	"location": "http://localhost:8080/v1/api-jobs/967a26b7431c49c0b1d50d709ef1aef3" 
}

       ZStack中创建网络的过程比较复杂, 共计调用了7个API, 创建三层网络时我们需要为其添加DNSIP Rangenetwork 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)

  • 请求方式

    POSTzstack/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)

  • 请求方式

    POSTzstack/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)

/ ZStack全流程相关博文链接 /

ZStack - 登录

ZStack - 创建区域、集群

ZStack - 创建物理机

ZStack - 创建主存储

ZStack - 创建2层3层网络

ZStack - 创建云主机计算规格

ZStack - 创建镜像

ZStack - 创建云主机计算规格

ZStack - 创建云主机

ZStack - 全流程代码

原创文章 42 获赞 51 访问量 1万+

猜你喜欢

转载自blog.csdn.net/F1004145107/article/details/106085634