Search code examples
ibm-cloud-infrastructure

SoftLayer API Hardware Order Options Specification


I am trying to order a couple of very specific node types, and am wondering how it would be possible to do this via the SoftLayer API. When running the command slcli server create-options or call the get_create_options() function in the Python API, I do not receive a full list of available hardware, operating systems, network controller options (mostly due to not having redundant options), and subnet types. In other words, the choices in the API do not match up with the choices in the SoftLayer web portal. The nodes that I would want to hypothetically order are specified below.

Chassis: 4U
CPU: 4*E7-4850 v2 (12-core HT, 2.30 GHz)
RAM: 256GB 
HDD: 2*1TB SATA RAID 1 (Boot); 8*600GB SAS RAID 10 (Ephemeral) (10 total)
NIC: 2*10Gbps
OS: Ubuntu 14.04 LTS Minimal Install

Chassis: 2U
CPU: 2*E5-2650 v3 (10-core HT, 2.30 GHz) 
RAM: 64 GB
HDD: 2*1TB SATA RAID 1 (Boot); 6*600GB SAS RAID 10 (Data) (8 total)
NIC: 2*10 Gbps
OS: Ubuntu 14.04 LTS Minimal Install

Chassis: 2U
CPU: 2*E5-2690 v3 (12-core HT, 2.60 GHz)
RAM: 128GB
HDD: 2*1TB SATA RAID 1 (Boot); 4*600GB SAS RAID 10 (Ephemeral) (6 total)
NIC: 2*1 Gbps
OS: Ubuntu 14.04 LTS Minimal Install

Is there any documentation for the full hardware ordering options? Any help is greatly appreciated.


Solution

  • The slcli only displays the “FAST SERVERS”, these servers have a preset configuration which makes the provisioning process easy and fast. You can see more information about the preset configuration in bare metal servers here: http://sldn.softlayer.com/blog/bpotter/ordering-bare-metal-servers-using-softlayer-api So using the scli, currently, it is not possible to order all the bare metal server flavors like the SL Portal. But that task is possible using API calls, for that you need to call the palceOrder() method (which is the same method that the SL portal uses). Please see this documentation about how to order devices using the API: http://sldn.softlayer.com/es/blog/bpotter/Going-Further-SoftLayer-API-Python-Client-Part-3 Take a look at this code to order bare metal servers using the placeOrder method.

    """
    Order a new server.
    
    Build a SoftLayer_Container_Product_Order object for a new
    server order and pass it to the SoftLayer_Product_Order API service to order
    it. In this care we'll order a Xeon 3460 server with 2G RAM, 100mbit NICs,
    2000GB bandwidth, a 500G SATA drive, CentOS 5 32-bit, and default server
    order options. See below for more details.
    
    Important manual pages:
    http://sldn.softlayer.com/reference/datatypes/SoftLayer_Container_Product_Order
    http://sldn.softlayer.com/reference/datatypes/SoftLayer_Hardware_Server
    http://sldn.softlayer.com/reference/datatypes/SoftLayer_Product_Item_Price
    http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/verifyOrder
    http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/placeOrder
    
    License: http://sldn.softlayer.com/article/License
    Author: SoftLayer Technologies, Inc. <[email protected]>
    """
    
    import SoftLayer
    
    
    # Your SoftLayer API username and key.
    USERNAME = 'set me'
    API_KEY = 'set me'
    
    
    # The number of servers you wish to order in this configuration.
    quantity = 1
    
    """
    Where you'd like your new server provisioned.
    
    This can either be the id of the datacenter you wish your new server to be
    provisioned in or the string.
    
    Location id 3     = Dallas
    Location id 18171 = Seattle
    Location id 37473 = Washington, D.C.
    
    """
    location = 'AMSTERDAM'
    
    """
    The id of the SoftLayer_Product_Package you wish to order.
    
    In this case the Intel Xeon 3460's package id is 145.
    """
    
    packageId = 146
    
    """
    Build a skeleton SoftLayer_Hardware_Server object to model the hostname and
    domain we want for our server. If you set quantity greater then 1 then you
    need to define one hostname/domain pair per server you wish to order.
    """
    hardware = [
        {
            'hostname': 'test',  # The hostname of the server you wish to order.
            'domain': 'example.org'  # The domain name of the server you wish to order.
        }
    ]
    
    
    """
    Build a skeleton SoftLayer_Product_Item_Price objects. These objects contain
    much more than ids, but SoftLayer's ordering system only needs the price's id
    to know what you want to order.
    
    Every item in SoftLayer's product catalog is assigned an id. Use these ids
    to tell the SoftLayer API which options you want in your new server. Use
    the getActivePackages() method in the SoftLayer_Account API service to get
    a list of available item and price options per available package.
    """
    prices = [
        {'id': 17232},  # Single Processor Quad Core Xeon 3460 - 2.80GHz (Lynnfield) - 1 x 8MB cache w/HT
        {'id': 637},  # 2 GB DDR2 667
        {'id': 682},  # CentOS 5.x (32 bit)
        {'id': 876},  # 2 GB DDR2 667
        {'id': 20},  # 500GB SATA II
        {'id': 342},  # 20000 GB Bandwidth
        {'id': 273},  # 100 Mbps Public & Private Network Uplinks
        {'id': 55},  # Host Ping
        {'id': 58},  # Automated Notification
        {'id': 420},  # Unlimited SSL VPN Users & 1 PPTP VPN User per account
        {'id': 418},  # Nessus Vulnerability Assessment & Reporting
        {'id': 21},  # 1 IP Address
        {'id': 57},  # Email and Ticket
        {'id': 906}  # Reboot / KVM over IP
    ]
    
    """
    Build a skeleton SoftLayer_Container_Product_Order_Hardware_Server object
    containing the order you wish to place.
    """
    
    orderTemplate = {
        'quantity': quantity,
        'location': location,
        'packageId': packageId,
        'prices': prices,
        'hardware': hardware
    }
    
    # Create a SoftLayer API client object
    client = SoftLayer.Client(username=USERNAME, api_key=API_KEY)
    
    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.
    
        Once your order is placed it'll go through SoftLayer's approval and
        provisioning process. When it's done you'll have a new
        SoftLayer_Hardware_Server object and server ready to use.
        """
        receipt = client['Product_Order'].verifyOrder(orderTemplate)
        print(receipt)
    except SoftLayer.SoftLayerAPIError as e:
        print("Unable to place a server order faultCode=%s, faultString=%s"
              % (e.faultCode, e.faultString))
        exit(1)
    

    And also see this example which returns all the available servers to order:

    """
    List all the servers to order.
    
    Important manual pages:
    http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package_Server/getAllObjects
    http://sldn.softlayer.com/reference/datatypes/SoftLayer_Product_Package_Server/
    http://sldn.softlayer.com/article/Object-Filters
    
    License: http://sldn.softlayer.com/article/License
    Author: SoftLayer Technologies, Inc. <[email protected]>
    """
    
    import SoftLayer
    import json
    
    USERNAME = 'set me'
    API_KEY = 'set me'
    
    client = SoftLayer.Client(username=USERNAME, api_key=API_KEY)
    packageService = client['SoftLayer_Product_Package_Server']
    
    objectFilter = {"packageType": {"operation": "in", "options": [{"name": "data", "value": ["BARE_METAL_CORE", "BARE_METAL_CPU", "BARE_METAL_CPU_FAST_PROVISION"]}]}}
    
    try:
        servers = packageService.getAllObjects(filter=objectFilter)
        print(json.dumps(servers, sort_keys=True, indent=2, separators=(',', ': ')))
    except SoftLayer.SoftLayerAPIError as e:
        print("Unable to list the servers to order. faultCode=%s, faultString=%s" % (e.faultCode, e.faultString