【问题标题】:How to assign subnet to a vlan on softlayer? [closed]如何将子网分配给 softlayer 上的 vlan? [关闭]
【发布时间】:2017-01-18 09:16:52
【问题描述】:

对于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 或只是在子网和 vlan 之间建立关系的 api,但没有运气。

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

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

如果有人能提供信息,我真的很感激。

【问题讨论】:

    标签: api ibm-cloud-infrastructure subnet vlan


    【解决方案1】:

    当您订购一个 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 分配给您的机器,您只能在订购时执行该过程,如果您想在订购后更改 VLAN,您需要向 softlayer 提交票证并询问他们。

    获得 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
                      }
                   ]
                }
             ]
          }
       ]
    }
    

    【讨论】:

    • 非常感谢!从你的回答中,我得到了关于 order vsi/subnet/vlan 的清晰结构。对于“关于您的另一个问题,即使您没有配置任何 IP,总是会为您的机器分配一个 IP。”,仍然想了解有关如何选择 IP 的更多信息。我认为如果未在 order api 中指定子网/vlan,则应该有一些策略来检查可以分配给 vsi 的可用 IP。你能解释一下吗?谢谢!
    • softlayer 在您的帐户中查找可用的 VLAN 并且正在分配它,就是这样。如果没有可用的 VLAN,您的订单将在配置过程中失败,softlayer 的员工将与您联系
    • 谢谢!我的疑惑在这里解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    相关资源
    最近更新 更多