SoftLayer API: Ordering Subnet

2019-01-29 13:05发布

I'm on looking for the API that retrieve the list of subnet and its prices.

For, Portable IP Addresses and the static found category ID as 279 and 281. And found for Global IPv4, Portable Public IPv6 and Global IPv6. We've done it through, Package ID 0 and joined with item names.

Is there any better way to get it? Or else what are the category ID for Global IPv4, Portable Public IPv6 and Global IPv6.

Thanks.

2条回答
Summer. ? 凉城
2楼-- · 2019-01-29 13:41

Well the Portal uses 3 pacakges to list the prices. I have examples in python I hope it helps you

"""
List the options and te prices to order a subnet like the portal.

Important manual pages:
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getAllObjects
http://sldn.softlayer.com/article/Object-Masks
http://sldn.softlayer.com/article/Object-Filters

License: http://sldn.softlayer.com/article/License
Author: SoftLayer Technologies, Inc. <sldn@softlayer.com>
"""

import SoftLayer
import json

client = SoftLayer.Client()
packageService = client['SoftLayer_Product_Package']

# The groups listed in the portal and its category code.
groups = {
    "Static Public": "static_sec_ip_addresses",
    "Portable Public": "sov_sec_ip_addresses_pub",
    "Portable Private": "sov_sec_ip_addresses_priv",
    "Global IPv4": "global_ipv4",
    "Static Public IPv6": "static_ipv6_addresses",
    "Portable Public IPv6": "sov_ipv6_addresses",
    "Global IPv6": "global_ipv6"
}

# Declaring a 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[categoryCode]]]"

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

options = []
for group in groups.keys():
    option = {}
    option['category'] = group
    option['items'] = []
    for package in packages:
        for item in package['items']:
            newOpItem = True
            for opItem in option['items']:
                if opItem['id'] == item['id']:
                    newOpItem = False
                    break
            if newOpItem:
                for category in item['categories']:
                    if category['categoryCode'] == groups[group]:
                        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
                        option['items'].append(item)
                        break
    options.append(option)

print(json.dumps(options, sort_keys=True, indent=2, separators=(',', ': ')))

To order the subnets

"""
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))
查看更多
狗以群分
3楼-- · 2019-01-29 13:45

To get all category subnets, execute:

https://[username]:[ap[ikey]@api.softlayer.com/rest/v3/SoftLayer_Product_Item_Category/getSubnetCategories

Method: GET

The Result will something like this:

0:  {
"categoryCode": "global_ipv4"
"id": 330
"name": "Global IPv4"
"quantityLimit": 0
}-
1:  {
"categoryCode": "global_ipv6"
"id": 331
"name": "Global IPv6"
"quantityLimit": 0
}-
2:  {
"categoryCode": "sec_ip_addresses"
"id": 14
"name": "Public Secondary IP Addresses"
"quantityLimit": 0
}-
3:  {
"categoryCode": "sov_ipv6_addresses"
"id": 70
"name": "Public Portable IPv6 Addresses"
"quantityLimit": 0
}-
4:  {
"categoryCode": "sov_sec_ip_addresses"
"id": 54
"name": "Public Secondary VLAN IP Addresses"
"quantityLimit": 0

To see the subnet packages ids and categories, please execute:

https://[username]:[apikey]@api.softlayer.com/rest/v3/SoftLayer_Product_Package/getAllObjects?objectMask=mask[id,description,categories[categoryCode,group.name]]

Method: GET

The result will something like this:

{
"id": 0
"categories": [23]
0:  {
"categoryCode": "dedicated_load_balancer"
"group": {
"name": "Network"
}-
}-
… 
6:  {
"categoryCode": "global_ipv4"
"group": {
"name": "Network"
}-
}-
7:  {
"categoryCode": "global_ipv6"
"group": {
"name": "Network"
}-
}

Where: “global_ipv4” and “global_ipv6” use the package 0.

Below are some examples to order some subnets: Global IP V6:

https://[username]:[apikey]@api.softlayer.com/rest/v3/SoftLayer_Product_Order/verifyOrder.json
Method: POST
Json:
|=========================
{
  "parameters": [
    {
      "packageId": 0,
      "prices": [
        {
          "id": 19066
        }
      ],
      "quantity": 1,
      "complexType": "SoftLayer_Container_Product_Order_Network_Subnet"
    }
  ]
}
|=========================

How to get the Global IPv6 prices?

https://[username]:[apikey]@api.softlayer.com/rest/v3/SoftLayer_Product_Package/0/getItemPrices?objectFilter={"itemPrices":{"item":{"keyName": {"operation": "GLOBAL_IPV6"}}}}

Global IP v4:

https://[username]:[apikey]@api.softlayer.com/rest/v3/SoftLayer_Product_Order/verifyOrder.json

Method: POST

Json:
|===========================
{
  "parameters": [
    {
      "packageId": 0,
      "prices": [
        {
          "id": 19065
        }
      ],
      "quantity": 1,
      "complexType": "SoftLayer_Container_Product_Order_Network_Subnet"
    }
  ]
}
|===========================

References:

http://sldn.softlayer.com/reference/services/SoftLayer_Virtual_Guest/editObject http://sldn.softlayer.com/reference/services/SoftLayer_Hardware_Server/editObject

查看更多
登录 后发表回答