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