November 23, 2017


# Determine Required items
# Each Package is aware of a list of ItemCategories that make sense for that Package.
# This list is called the Packages "Configuration". Within the configuration,
# the Package may identify certain categories that are required, meaning you must include
# an ItemPrice from that category in any order you make against that Package
# Important manual pages:
# @License:
# @Author: SoftLayer Technologies, Inc. <>

require 'rubygems'
require 'softlayer_api'
require 'pp'

SL_API_USERNAME = 'set me'
SL_API_KEY = 'set me'

client =
  username: SL_API_USERNAME,
  api_key: SL_API_KEY
# Set the ID of the package to retrieve the information
package_id = 46

# Only retrieve the boolean to determine if this category
# is required and the category name and ID
category_object_mask = 'mask[isRequired, itemCategory[id, name]]'

# Retrieve a list of category configurations associated with our chosen package
configurations = client['Product_Package'].object_mask(category_object_mask).object_with_id(package_id).getConfiguration

# For each price we only want the id, the ID of the category(ies) it is a member of,
# and the item description
prices_object_mask = 'mask[id,item.description,]'

# Get all itemPrices for this package
prices = client['SoftLayer_Product_Package'].object_mask(prices_object_mask).object_with_id(package_id).getItemPrices

# Text format for our prettified output
header_format = "%s - %s:\n"
price_format = "    %s -- %s\n"
configurations.each do |configuration|
  # We are only concerned with required categories...
  # skip it if we do not need it!
  next if configuration['isRequired'] != 1
  printf(header_format, configuration['itemCategory']['name'], configuration['itemCategory']['id'])
  prices.each do |price|
    if price.key?('categories')
      price['categories'].each do |category|
        if category['id'] == configuration['itemCategory']['id']
          printf(price_format, price['id'], price['item']['description'])