This topic describes how to use Alibaba Cloud SDK for Python to create a custom route table.

Prerequisites

Before you use Alibaba Cloud SDK for Python, make sure that the following requirements are met:
  • An Alibaba Cloud account and the AccessKey pair are obtained. You can create and view your AccessKey pair on the Security Management page of the Alibaba Cloud Management Console.
  • Alibaba Cloud SDK for Python is installed.
  • The VPC Python example library is downloaded.
    Go to the directory where the setup.py file is stored, and run the following command to initialize the environment:
    python setup.py install

Background information

The code sample in this topic includes the following operations:
  1. Create a virtual private cloud (VPC) in the China (Zhangjiakou) region.
  2. Create a vSwitch in the VPC.
  3. Create a custom route table named sdk_route_table.
  4. Query the vSwitch.
  5. Associate the custom route table with the vSwitch that belongs to the same VPC.
  6. Disassociate the custom route table from the vSwitch that belongs to the same VPC.
  7. Delete the custom route table.
  8. Delete the vSwitch.
  9. Delete the VPC.

Procedure

  1. Open the aliyun-openapi-python-sdk-examples\sdk_examples\examples\vpc folder in the downloaded SDK directory.
  2. Open the vpc_route_table.py file in your text editor. Set the required parameters, save the configurations, and then exit the editor.
    The following sample code is displayed:
    #encoding=utf-8
    import sys
    import json
    import time
    
    from alibabacloud_credentials.client import Client as CredClient
    from aliyunsdkcore.acs_exception.exceptions import ServerException, ClientException
    from aliyunsdkvpc.request.v20160428 import CreateRouteEntryRequest
    from aliyunsdkvpc.request.v20160428 import DeleteRouteEntryRequest
    from aliyunsdkvpc.request.v20160428 import DescribeRouteTablesRequest
    from sdk_lib.exception import ExceptionHandler
    from sdk_lib.check_status import CheckStatus
    from sdk_lib.common_util import CommonUtil
    from sdk_lib.sdk_vswitch import VSwitch
    from sdk_lib.sdk_route_table import RouteTable
    from sdk_lib.consts import *
    
    class RouteTable(object):
        def __init__(self, client):
            self.client = client
    
    
        def create_route_table(self, params):
            """
            create_route_table: Create a custom route table.
            API reference: https://www.alibabacloud.com/help/virtual-private-cloud/latest/createroutetable
            """
            try:
                request = CreateRouteEntryRequest.CreateRouteEntryRequest()
                request.set_action_name("CreateRouteTable")
                # The ID of the VPC to which the custom route table belongs.
                request.add_query_param("VpcId", params['vpc_id'])
                # The name of the route table.
                request.add_query_param("RouteTableName", params['route_table_name'])
                response = self.client.do_action_with_exception(request)
                response_json = json.loads(response)
                route_table_id = response_json['RouteTableId']
                # Determine whether the route table is available.
                if CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME * 5,
                                            self.describe_route_table_status,
                                            route_table_id, route_table_id):
                    return response_json
            except ServerException as e:
                ExceptionHandler.server_exception(e)
            except ClientException as e:
                ExceptionHandler.client_exception(e)
    
        def associate_route_table(self, params):
            """
            associate_route_table: Associate a custom route table with a vSwitch in the same VPC.
            API reference: https://www.alibabacloud.com/help/virtual-private-cloud/latest/associateroutetable
            """
            try:
                request = AssociateEipAddressRequest.AssociateEipAddressRequest()
                request.set_action_name("AssociateRouteTable")
                # The ID of the route table.
                request.add_query_param("RouteTableId", params['route_table_id'])
                # The ID of the vSwitch that you want to associate.
                request.add_query_param("VSwitchId", params['vswitch_id'])
                response = self.client.do_action_with_exception(request)
                response_json = json.loads(response)
                time.sleep(DEFAULT_TIME * 5)
                return response_json
            except ServerException as e:
                ExceptionHandler.server_exception(e)
            except ClientException as e:
                ExceptionHandler.client_exception(e)
    
        def unassociate_route_table(self, params):
            """
            unassociate_route_table: Disassociate the route table from the vSwitch.
            API reference: https://www.alibabacloud.com/help/virtual-private-cloud/latest/unassociateroutetable
            """
            try:
                request = UnassociateEipAddressRequest.UnassociateEipAddressRequest()
                request.set_action_name("UnassociateRouteTable")
                # The ID of the route table.
                request.add_query_param("RouteTableId", params['route_table_id'])
                # The ID of the vSwitch that you want to disassociate.
                request.add_query_param("VSwitchId", params['vswitch_id'])
                response = self.client.do_action_with_exception(request)
                response_json = json.loads(response)
                time.sleep(DEFAULT_TIME * 5)
                return response_json
            except ServerException as e:
                ExceptionHandler.server_exception(e)
            except ClientException as e:
                ExceptionHandler.client_exception(e)
    
        def delete_route_table(self, params):
            """
            delete_route_table: Delete a custom route table.
            API reference: https://www.alibabacloud.com/help/virtual-private-cloud/latest/deleteroutetable
            """
            try:
                request = DeleteRouteEntryRequest.DeleteRouteEntryRequest()
                request.set_action_name("DeleteRouteTable")
                # The ID of the route table.
                request.add_query_param("RouteTableId", params['route_table_id'])
                response = self.client.do_action_with_exception(request)
                response_json = json.loads(response)
                # Determine whether the route table is deleted.
                if CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME * 5,
                                            self.describe_route_table_status,
                                            '', params['route_table_id']):
                    return response_json
            except ServerException as e:
                ExceptionHandler.server_exception(e)
            except ClientException as e:
                ExceptionHandler.client_exception(e)
    
        def describe_route_table(self, route_table_id):
            """
            describe_route_table: Query a route table.
            API reference: https://www.alibabacloud.com/help/virtual-private-cloud/latest/describeroutetablelist
            """
            try:
                request = DescribeRouteTablesRequest.DescribeRouteTablesRequest()
                # The ID of the route table.
                request.set_RouteTableId(route_table_id)
                response = self.client.do_action_with_exception(request)
                response_json = json.loads(response)
                return response_json
            except ServerException as e:
                ExceptionHandler.server_exception(e)
            except ClientException as e:
                ExceptionHandler.client_exception(e)
    
        def describe_route_table_status(self, route_table_id):
            """
            describe_route_table_status: Query the status of a route table.
            """
            response = self.describe_route_table(route_table_id)
            if len(response["RouteTables"]["RouteTable"]) == 0:
                return ''
            return response["RouteTables"]["RouteTable"][0]["RouteTableId"]
    
    def main():
        # The configuration of the client.
       # Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account because the account has permissions on all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M. 
       # We do not recommend that you save the AccessKey ID and AccessKey secret in your project code. Otherwise, the AccessKey pair may be leaked and the security of your resources may be compromised. 
       # In this example, the AccessKey pair is obtained by using the Alibaba Cloud Credentials tool to authenticate API access. For more information about how to configure the variables, see https://www.alibabacloud.com/help/alibaba-cloud-sdk-262060/latest/configure-credentials-378659. 
       cred = CredClient()
       access_key_id = cred.get_access_key_id()
       access_key_secret = cred.get_access_key_secret()
    
       # Create an AcsClient instance.
       client = AcsClient(access_key_id, access_key_secret, '<your-region-id>')
    
        vswitch = VSwitch(client)
        route_table = RouteTable(client)
        route_entry = RouteEntry(client)
    
        params = {}
        params['route_table_name'] = "sdk_route_table"
        params['destination_cidr_block'] = "0.0.0.0/0"
        params['nexthop_id'] = "i-xxx"
        params['nexthop_type'] = "Instance"
    
        params['vpc_id'] = "vpc-xxx"
        params['vswitch_id'] = "vsw-xxx"
    
        # Create a route table.
        route_table_json = route_table.create_route_table(params)
        CommonUtil.log("create_route_table", route_table_json)
    
        # Query the vSwitch.
        vswitch_json = vswitch.describe_vswitch_attribute(params)
        CommonUtil.log("describe_vswitch_attribute", vswitch_json)
    
        # Associate the route table with the vSwitch.
        params['route_table_id'] = route_table_json['RouteTableId']
        associate_json = route_table.associate_route_table(params)
        CommonUtil.log("associate_route_table", associate_json)
    
        # Create a route.
        create_route_entry_json = route_entry.create_route_entry(params)
        CommonUtil.log("create_route_entry", create_route_entry_json)
    
        # Delete the route.
        delete_route_entry_json = route_entry.delete_route_entry(params)
        CommonUtil.log("delete_route_entry", delete_route_entry_json)
    
        # Disassociate the route table from the vSwitch.
        unassociate_json = route_table.unassociate_route_table(params)
        CommonUtil.log("unassociate_route_table", unassociate_json)
    
        # Delete the route table.
        delete_route_table_json = route_table.delete_route_table(params)
        CommonUtil.log("delete_route_table", delete_route_table_json)
    
    
    if __name__ == "__main__":
        sys.exit(main())
  3. Go to the directory where the vpc_route_table.py file is stored, and run the following command to create a custom route table:
    python vpc_route_table.py

Result

The following output is returned:
---------------------------create_vpc---------------------------
{
  "ResourceGroupId": "rg-acfmxazxxxxxxxx",
  "RouteTableId": "vtb-8vb65a5hqy8pcxxxxxxxx",
  "VRouterId": "vrt-8vbbbiftzizc3xxxxxxxx",
  "VpcId": "vpc-8vbebihln001gxxxxxxxx",
  "RequestId": "862F279B-4A27-4300-87A1-047FB9961AF2"
}

---------------------------create_vswitch---------------------------
{
  "VSwitchId": "vsw-8vb30klhn2is5xxxxxxxx",
  "RequestId": "1DA17173-CB61-4DCE-9C29-AABFDF3001A6"
}

---------------------------create_route_table---------------------------
{
  "RouteTableId": "vtb-8vbc4iwpo13apxxxxxxxx",
  "RequestId": "01E66E67-7801-4705-A02A-853BA7EEA89F"
}

---------------------------describe_vswitch_attribute---------------------------

{
  "Status": "Available",
  "NetworkAclId": "",
  "VpcId": "vpc-8vbebihln001gxxxxxxxx",
  "Description": "",
  "RouteTable": {
    "RouteTableId": "vtb-8vb65a5hqy8pcxxxxxxxx",
    "RouteTableType": "System"
  },
  "CidrBlock": "172.16.0.0/16",
  "CreationTime": "2019-04-12T03:08:43Z",
  "CloudResources": {
    "CloudResourceSetType": []
  },
  "ZoneId": "cn-zhangjiakou-b",
  "ResourceGroupId": "rg-acfmxazbxxxxxxxx",
  "VSwitchId": "vsw-8vb30klhn2is5xxxxxxxx",
  "RequestId": "C5A20BA3-E998-498D-8900-35AE5FDFFB77",
  "Ipv6CidrBlock": "",
  "VSwitchName": "",
  "AvailableIpAddressCount": 252,
  "IsDefault": false
}

---------------------------associate_route_table---------------------------
{
  "RequestId": "5FC0143B-D34B-47DC-8D49-AFD222EA5876"
}

---------------------------unassociate_route_table---------------------------
{
  "RequestId": "F0194718-6E4C-496C-9DA8-1B88DF1D6FAD"
}

---------------------------delete_route_table---------------------------
{
  "RequestId": "B5C068A6-137C-4337-8E3A-9E30E1726703"
}

---------------------------delete_vswitch---------------------------
{
  "RequestId": "26DEDBF8-2F0D-4A13-8CB3-23A84C947704"
}

---------------------------delete_vpc---------------------------
{
  "RequestId": "E1B2641F-5911-40E4-9F36-CC0B2EDD1747"
}