Softlayer

This is the (unofficial) SoftLayer API Client in Ruby

Installation

Add this line to your application's Gemfile:

gem 'softlayer'

And then execute:

$ bundle

Or install it yourself as:

$ gem install softlayer

Usage

First step is configure your client with your credentials

Softlayer.configure do |config|
  config.username = '<API_USER>'
  config.api_key = '<API_KEY>'
  config.open_timeout = 30 # if you want specify timeout (default 5)
  config.read_timeout = 30 # if you want specify timeout (default 5)
end

then you are able to access any SoftLayer service, get some information from your account using:

Softlayer::Account.get_object # to get the account itself
Softlayer::Account.get_master_user
Softlayer::Account.get_virtual_guests

When you need to pass a parameter to a method, you can pass the Softlayer object, and the client handles eveything behind the curtains, if you generate a order template to virtual guest, then you wanna send this template to verifyOrder you can easily like this:

template = {
  hostname: 'anyhost',
  domain: 'anydomain.com',
  startCpus: 1,
  maxMemory: 1024,
  datacenter: {
    name: 'wdc01'
  },
  operatingSystemReferenceCode: 'DEBIAN_8_64',
  localDiskFlag: true
}
order_template = Softlayer::Virtual::Guest.generate_order_template(template_object: template)
Softlayer::Product::Order.verify_order(order_data: order_template)
# don't know why we are passing `order_data` here?
# You can always check the parameters for a method, in this case you can check on this page
# http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/verifyOrder

Masks

If you'd like to get relational properties, you can use masks to get more information in a single request, lets consider the example below

Consider an example where we want to get datacenters, but not only their id, longName, name and statusId (default returned information), we want to get their groups too, instead of make one request per datacenter, we can get all the information with just one request

location_object_mask = "mask[groups]"
Softlayer::Location::Datacenter.mask(location_object_mask).get_datacenters

And voilá, we have all datacenters and its groups, pretty neat and cool, no?

Check the Object Mask Article on SoftLayer for more information.

Filters

Lets consider an example where we want to find a datacenter based on its name, we can create a filter and do the request as following:

location_object_filter = {
  'name': {'operation': 'wdc01'}
}
Softlayer::Location::Datacenter.filter(location_object_filter)

For an in operation you must add the operation in and the options array, let's search for wdc01 and wdc04

location_object_filter = {
    'name': {
      'operation': "in",
      "options": [
        {
          "name": "data",
          "value": ['wdc01', 'wdc04']
        }
      ]
    }
}
Softlayer::Location::Datacenter.filter(location_object_filter).get_datacenters

Check the Object Filter Article on SoftLayer for more information and operations.

Limits

To use limits, let's search for groups of a datacenter, first we get a specific one

location_object_filter = {
    'name': {'operation': 'sao01'}
}
sao01 = Softlayer::Location::Datacenter.filter(location_object_filter).get_datacenters.first

Then we can call the limits passing first the quantity, then the offset

sao01.limit(2, 0).get_groups # 2 elements, offset 0 (page 1)
sao01.limit(2, 2).get_groups # 2 elements, offset 2 (page 2)
sao01.limit(2, 4).get_groups # 2 elements, offset 4 (page 3)

Complex Operations

What if you want to use a mask, filtering just what you want and limiting the request, can we do this? Sure!

location_object_filter = {
  'name': {
    'operation': "in",
    "options": [
      {
        "name": "data",
        "value": ['wdc01', 'wdc04']
      }
    ]
  }
}
location_object_mask = "mask[groups]"
Softlayer::Location::Datacenter.filter(location_object_filter).mask(location_object_mask).limit(1, 0).get_datacenters

ps: getDatacenters message does not accept a resultLimit header, just using on the call above as an example, to check if the message accepts a resultLimit or not you need to check the WSDL file for the service.

README Driven Development

  • No feature on roadmap

Known Issues

  • Using Savon master until a version is released containing the commit to support rpc/encoded XML
  • Savon do not construct our array correctly, so the client workaround on the problem, this is not a real big deal to who is using the client, but I'm leaving this as a future reference if some problem appears. hope to fix this really soon, in the meanwhile you can check the progress of this bug on this issue

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake test to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Actually we write two kind of tests, one hitting the real API (we save VCR cassetes to replay) and using mocks. This is really useful because of if we need to debug we just hit the real API and check if everything is ok and keeping mocks we enable new users to test the SoftLayer API without needing an account.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/zertico/softlayer.

Trademark

SoftLayer and logo are trademarks of SoftLayer, an IBM Company. This gem was just released to make easier for other clients to consume SoftLayer API.

License

The gem is available as open source under the terms of the MIT License.