首页 文章

如何在softlayer上为vlan分配子网? [关闭]

提问于
浏览
0

对于 softlayer api SoftLayer_Network_Subnet ,描述说:

每个SoftLayer IP地址都与 SoftLayer_Network_Subnet 服务中定义的子网相关联 . SoftLayer子网定义一组IP地址并分配给 SoftLayer_Network_Vlan .

http://sldn.softlayer.com/reference/services/SoftLayer_Network_Subnet

我正在尝试找到可以为vlan分配子网的api,或者只是在子网和vlan之间 Build 关系,但没有运气 .

Q1:有没有可以为vlan分配子网的api?

我还有一个关于 network/subnet/vlan 的问题 . 创建没有子网选项的虚拟服务器时,仍会将IP分配给此虚拟服务器 . 使用什么方法确定子网并将此IP分配给虚拟服务器?

真的很感激,如果有人可以提供信息 .

1 回答

  • 0

    当您订购VLAN时也订购其子网,现在当您订购子网时可以将其附加到vlan,您可以为“Portable Public”,“Portable Private”和“Portable Public IPv6”子网执行此操作 . 正如您所看到的,您可以在订单时刻将子网分配到vlan,在执行订单后没有任何方法可以帮助他们 .

    这里有一个关于子网顺序的简单示例

    """
    Orders a new portable public subnet
    
    Important manual pages:
    http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/placeOrder/
    http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/verifyOrder/
    
    License: http://sldn.softlayer.com/article/License
    Author: SoftLayer Technologies, Inc. <sldn@softlayer.com>
    """
    import SoftLayer
    # For nice debug output:
    from pprint import pprint as pp
    
    API_USERNAME = 'set me'
    API_KEY = 'set me'
    
    # Order Template with all new item configurations
    
    orderTemplate = {
        'location': 224092,    # Singapore 1
        'packageId': 0,
        'endPointVlanId': 527900,
        'prices': [
            {
                'id': 13980
            }
        ],
        'quantity': 1,
        'itemCategoryQuestionAnswers': [
            {
                'categoryId': 313,
                'categoryCode': 'sov_sec_ip_addresses_pub',
                'questionId': 14,
                'answer': 1    # TOTAL_IPS_IN_30_DAYS
            },
            {
                'categoryId': 313,
                'categoryCode': 'sov_sec_ip_addresses_pub',
                'questionId': 15,
                'answer': 3    # TOTAL_IPS_IN_12_MONTHS
            },
            {
                'categoryId': 313,
                'categoryCode': 'sov_sec_ip_addresses_pub',
                'questionId': 16,
                'answer': 'Test description of your need for additional IPs'     # REASON_FOR_IPS
            },
            {
                'categoryId': 313,
                'categoryCode': 'sov_sec_ip_addresses_pub',
                'questionId': 9,
                'answer': 'ContactNameTest'    # CONTACT_NAME
            },
            {
                'categoryId': 313,
                'categoryCode': 'sov_sec_ip_addresses_pub',
                'questionId': 10,
                'answer': 'ContactJobTitleTest'    # CONTACT_JOB_TITLE
            },
            {
                'categoryId': 313,
                'categoryCode': 'sov_sec_ip_addresses_pub',
                'questionId': 11,
                'answer': 'contact.email@myemail.com'    # CONTACT_EMAIL
            },
            {
                'categoryId': 313,
                'categoryCode': 'sov_sec_ip_addresses_pub',
                'questionId': 12,
                'answer': '72878781'    # CONTACT_PHONE_NUMBER
            },
            {
                'categoryId': 313,
                'categoryCode': 'sov_sec_ip_addresses_pub',
                'questionId': 13,
                'answer': True    # CONTACT_VALIDATED
            }
        ],
        'complexType': 'SoftLayer_Container_Product_Order_Network_Subnet'
    }
    
    # Creates a new connection to the API service.
    client = SoftLayer.Client(
        username=API_USERNAME,
        api_key=API_KEY
    )
    
    try:
        result = client['SoftLayer_Product_Order'].verifyOrder(orderTemplate)
        pp(result)
    except SoftLayer.SoftLayerAPIError as e:
        pp('Failed ... Unable to order the new item faultCode=%s, faultString=%s'
            % (e.faultCode, e.faultString))
    

    这是一个更完整的代码来订购任何类型的子网:

    """
    Order a new subnet.
    
    The script order a new subnet using the same options like the portal.
    
    Important manual pages:
    http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getAllObjects
    http://sldn.softlayer.com/reference/services/SoftLayer_Network_Subnet/getSubnetForIpAddress
    http://sldn.softlayer.com/reference/services/SoftLayer_Account/getNetworkVlans
    http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/verifyOrder
    http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/placeOrder
    http://sldn.softlayer.com/reference/datatypes/SoftLayer_Container_Product_Order_Network_Subnet
    http://sldn.softlayer.com/blog/bpotter/Going-Further-SoftLayer-API-Python-Client-Part-3
    http://sldn.softlayer.com/article/Object-Filters
    http://sldn.softlayer.com/article/Python
    http://sldn.softlayer.com/article/Object-Masks
    
    
    License: http://sldn.softlayer.com/article/License
    Author: SoftLayer Technologies, Inc. <sldn@softlayer.com>
    """
    
    import SoftLayer
    import json
    
    # The subnet you wish to order. The available options are the
    # same like in the in the Softlayer Portal.
    # e.g. "1 Static Public IP Address",
    # "/64 Block Static Public IPv6 Addresses", etc.
    option = "Global IPv6"
    
    # The endpoint IP address for the subnet.
    # You need to configure this field if
    # your order belongs to the categories
    # "Static Public" or "Static Public IPv6"
    # e.g. "119.81.142.114", "2401:c900:1201:9c::2".
    endPointIP = "119.81.142.114"
    
    # The VLan number for the subnet.
    # You need to configure this field if
    # your order belongs to the categories
    # "Portable Public", "Portable Private" and
    # "Portable Public IPv6".
    vlanNumber = 758
    
    client = SoftLayer.Client()
    packageService = client['SoftLayer_Product_Package']
    subnetService = client['SoftLayer_Network_Subnet']
    orderService = client['SoftLayer_Product_Order']
    accountService = client['SoftLayer_Account']
    
    # Declaring an object filter to get the packages
    # related to subnets.
    objectFilter = {
        "type": {
            "keyName": {
                "operation": "in",
                "options": [{
                    "name": "data",
                    "value": [
                        "ADDITIONAL_SERVICES",
                        "ADDITIONAL_SERVICES_PORTABLE_IP_ADDRESSES",
                        "ADDITIONAL_SERVICES_STATIC_IP_ADDRESSES"
                    ]
                }]
            }
        }
    }
    
    # Declaring an object mask to get more information about the packages
    objectMask = "mask[items[id, description, prices[id, recurringFee, attributes, categories]]]"
    
    # Getting the items and the prices available to order subnets
    try:
        packages = packageService.getAllObjects(filter=objectFilter,
                                                mask=objectMask)
    
    except SoftLayer.SoftLayerAPIError as e:
        print("Unable to list the packages. faultCode=%s, faultString=%s" %
              (e.faultCode, e.faultString))
        exit(1)
    
    # Getting item price for the configured option to order.
    optionItem = {}
    optionPackage = 0
    for package in packages:
        for item in package['items']:
            if item['description'] == option:
                prices = []
                if len(item['prices']) > 1:
                    for price in item['prices']:
                        if len(price['attributes']) == 0:
                            if 'recurringFee' in price:
                                prices.append(price)
                                item['prices'] = price
                                break
                optionItem = item
                optionPackage = package['id']
                break
        if 'id' in optionItem:
            break
    
    if not 'id' in optionItem:
        print("The configured option: " + option + " is not valid.")
        exit(1)
    
    # Verifying if the configured option requires a VLan or end point IP.
    requireVlan = False
    requireIp = False
    for category in optionItem['prices'][0]["categories"]:
        cat = category['categoryCode']
        if cat == "static_sec_ip_addresses" or cat == "static_ipv6_addresses":
            requireIp = True
        if (cat == "sov_sec_ip_addresses_pub" or
           cat == "sov_sec_ip_addresses_priv" or cat == "sov_ipv6_addresses"):
            requireVlan = True
        break
    
    # Getting the IP address object.
    ip = {}
    if requireIp:
        try:
            objectMask = "mask[ipAddresses]"
            subnet = subnetService.getSubnetForIpAddress(endPointIP,
                                                         mask=objectMask)
            if not 'id' in subnet:
                print("There is no a IP address " + endPointIP +
                      " in the subnets of the account.")
                exit(1)
            else:
                for ipSubnet in subnet['ipAddresses']:
                    if ipSubnet['ipAddress'] == endPointIP:
                        ip = ipSubnet
                        break
        except SoftLayer.SoftLayerAPIError as e:
            print("Unable to find the subnet. faultCode=%s, faultString=%s"
                  % (e.faultCode, e.faultString))
            exit(1)
    
    # Getting the VLan.
    vlan = {}
    if requireVlan:
        try:
            objectFilter = {
                "networkVlans": {
                    "vlanNumber": {
                        "operation": vlanNumber
                    }
                }
            }
            vlans = accountService.getNetworkVlans(filter=objectFilter)
            if len(vlans) == 0:
                print("There is no a VLan number " + str(vlanNumber) +
                      " in the account.")
                exit(1)
            else:
                vlan = vlans[0]
        except SoftLayer.SoftLayerAPIError as e:
            print("Unable to retrieve the VLans. faultCode=%s, faultString=%s" %
                  (e.faultCode, e.faultString))
            exit(1)
    
    # Creating the order template for the subnet
    orderTemplate = {
        'packageId': optionPackage,
        'prices': optionItem['prices'],
        'quantity': 1,
        'complexType': 'SoftLayer_Container_Product_Order_Network_Subnet'
    }
    
    if requireVlan:
        orderTemplate['endPointVlanId'] = vlan['id']
    elif requireIp:
        orderTemplate['endPointIpAddressId'] = ip['id']
    
    try:
        # verifyOrder() will check your order for errors. Replace this with a call
        # to placeOrder() when you're ready to order. Both calls return a receipt
        # object that you can use for your records.
        result = orderService.verifyOrder(orderTemplate)
        print(json.dumps(result, sort_keys=True, indent=2, separators=(',', ': ')))
    except SoftLayer.SoftLayerAPIError as e:
        print("Unable to place the order. faultCode=%s, faultString=%s" %
              (e.faultCode, e.faultString))
    

    关于您的另一个问题,即使您没有配置任何IP,也始终为您的机器分配IP .

    您可以看到有关如何在订单中选择所需VLAN的文章:http://sldn.softlayer.com/blog/phil/CCI-VLAN-Specification

    要将VLAN配置到您的计算机上,您只能在订购时执行该过程,如果您想在需要向softlayer提交故障单并询问它们之后更改vlan .

    获得VLAN后,您可以列出其子网并选择所需的子网,具体如下:

    http://sldn.softlayer.com/reference/services/SoftLayer_Network_Vlan/getSubnets

    这里有一个关于如何订购VSI子网的示例

    https://$user:$apiKey@api.softlayer.com/rest/v3/SoftLayer_Product_Order/placeOrder
    
    Method: Post
    
    {  
       "parameters":[  
          {  
             "orderContainers":[  
                {  
                   "hardware":[  
                      {  
                         "hostname":"testhost",
                         "domain":"softlayer.com",
                         "primaryBackendNetworkComponent":  
                            {  
                               "networkVlanId":971077,
                               "networkVlan":{  
                                  "primarySubnet":{  
                                     "id":225652
                                  }
                               }
                            }
                         ,
                         "primaryNetworkComponent":  
                            {  
                               "networkVlanId":971075,
                               "networkVlan":{  
                                  "primarySubnet":{  
                                     "id":233232
                                  }
                               }
                            }
    
                      }
                   ],
                   "location":"DALLAS05",
                   "quantity":1,
                   "packageId":46,
                   "prices":[  
                      {  
                         "id":1640
                      },
                      {  
                         "id":1644
                      },
                      {  
                         "id":1857
                      },
                      {  
                         "id":1639
                      },
                      {  
                         "id":50367
                      },
                      {  
                         "id":273
                      },
                      {  
                         "id":2302
                      },
                      {  
                         "id":55
                      },
                      {  
                         "id":58
                      },
                      {  
                         "id":420
                      },
                      {  
                         "id":418
                      },
                      {  
                         "id":21
                      },
                      {  
                         "id":57
                      },
                      {  
                         "id":905
                      }
                   ]
                }
             ]
          }
       ]
    }
    

相关问题