使用SoftLayer Ruby API指定flavor时出错

时间:2018-01-04 00:40:27

标签: ibm-cloud ibm-cloud-infrastructure

我有一个工作的ruby脚本,我们已经使用了很长一段时间从SoftLayer订购VSI。该脚本为CPU指定了一个价格项,一个用于内存,另一个用于磁盘。我正在尝试修改脚本以使用各种口味,但我一直无法弄清楚我做错了什么。基本上我已经从产品订单中删除了CPU,内存和磁盘价格项目,并添加到supplementalCeyateObjectOptions中的flavorKeyName中,如下所示:

#!/usr/bin/ruby

require 'softlayer_api'

client = SoftLayer::Client.new(username: 'XXXXX', api_key: 'XXXXX')

 productOrder = {
  'virtualGuests' => [{
     'hostname' => 'test',
     'domain'   => 'mycompany.com',
     'primaryNetworkComponent' => { 'networkVlan' => { 'id' => XXXXXX } },
     'primaryBackendNetworkComponent' => { 'networkVlan' => { 'id' => XXXXXX },
     'supplementalCreateObjectOptions' => { 'flavorKeyName' => 'B1_1X2X100' } }
  }],
  'location' => XXXXXX,
  'packageId' => 46,
  'imageTemplateId' => XXXXX,
  'useHourlyPricing' => true,
  'prices' => [
     {'id' => 34183 }, # 0 GB Bandwidth
     {'id' => 24713 }, # 1 Gbps Public & Private Network Uplinks
     {'id' => 34807 }, # 1 IP Address
     {'id' => 33483 }, # Unlimited SSL VPN Users & 1 PPTP VPN User per account
     {'id' => 34241 }, # Host Ping and TCP Service Monitoring
     {'id' => 32500 }, # Email and Ticket
     {'id' => 35310 }, # NESSUS_VULNERABILITY_ASSESSMENT_REPORTING
     {'id' => 23070 }, # REBOOT_REMOTE_CONSOLE
     {'id' => 32627 }  # AUTOMATED_NOTIFICATION
  ]
 }
 order = client['Product_Order'].verifyOrder(productOrder)

但是失败了:

/usr/lib64/ruby/2.1.0/xmlrpc/client.rb:271:in `call': Internal Error (XMLRPC::FaultException)
    from /usr/lib64/ruby/gems/2.1.0/gems/softlayer_api-3.2.2/lib/softlayer/Service.rb:269:in `call_softlayer_api_with_params'
    from /usr/lib64/ruby/gems/2.1.0/gems/softlayer_api-3.2.2/lib/softlayer/Service.rb:198:in `method_missing'
    from /tmp/yy2:34:in `<main>'

错误对我可能错误指定或可能缺失的内容没有太大帮助。

有人对我可能做错了什么有建议吗?

1 个答案:

答案 0 :(得分:1)

使用Softlayer_Product_Order::verifyOrderSoftlayer_Product_Order::placeOrder时,您需要使用包835,并设置 presetId 参数以指定您要订购的风味配置。

使用SoftLayer_Virtual_Guest::createObject方法时指定 supplementalCreateObjectOptions 参数。

以下是两种使用flavor配置订购虚拟客户设备的方法。

<强> PlaceOrder

要获取包835的可用预设ID列表,您需要使用SoftLayer_Product_Package::getActivePresets方法。

https://api.softlayer.com/rest/v3/SoftLayer_Product_Package/835/getActivePresets

检查 keyName 值,了解哪些是Balanced,Memory等,它们应该从以下开始:

  

B1 适用于“平衡”

     

BL1 用于“平衡本地存储”

     

BL2 适用于“平衡本地存储 - SSD”

     

C1 用于“计算”

     

M1 用于“记忆”

这些字符后面是VSI配置的简短描述,如下所示:

  用于“2 x 2.0 GHz内核,2 GB RAM,100 GB磁盘”的计算VSI的

C1_2X2X100

     

B1_8X16X25 用于“8 x 2.0 GHz内核,16 GB RAM,25 GB磁盘”的平衡VSI

如果我没错, presetId 333适用于B1_1X2X100,这是您想要的风味配置。

require 'rubygems'
require 'softlayer_api'
require 'json'

# Your SoftLayer API username and API Key.
USERNAME = 'set-me'
API_KEY = 'set-me'

# Location where server will be provisioned.
location = 'AMSTERDAM03'

# The id of the SoftLayer_Product_Package, use the 835 for VSI Families.
package_id = 835

# Following is the preset id used to complete this example. 
preset_id = 333   # B1_1X2X100  (1 x 2.0 GHz Cores, 2 GB RAM, and primary disk of 25 GB)

# The number of servers you wish to order in this configuration.
quantity = 1

# Build a skeleton SoftLayer_Virtual_Guest object. If you set quantity greater than 1 
# then you need to define one hostname/domain per server you wish to order.
virtual_guest = [
    {
        'hostname' => 'test-vsi', 
        'domain' => 'mycompany.com',
        'primaryNetworkComponent' => { 'networkVlan' => { 'id' => 11111 } },
        'primaryBackendNetworkComponent' => { 'networkVlan' => { 'id' => 22222 }}
    }
]

# Specify the item prices. Note that you don't need to specify the item price for 
# cpus, ram, and primary disk, and take into account that “Balanced Local Storage”
# and “Balanced Local Storage - SSD” requires a second disk, the system will select one
# if you don’t specify it. 
prices = [
    {'id' => 34183 }, # 0 GB Bandwidth
    {'id' => 24713 }, # 1 Gbps Public & Private Network Uplinks
    {'id' => 34807 }, # 1 IP Address
    {'id' => 33483 }, # Unlimited SSL VPN Users & 1 PPTP VPN User per account
    {'id' => 34241 }, # Host Ping and TCP Service Monitoring
    {'id' => 32500 }, # Email and Ticket
    {'id' => 35310 }, # NESSUS_VULNERABILITY_ASSESSMENT_REPORTING
    {'id' => 23070 }, # REBOOT_REMOTE_CONSOLE
    {'id' => 32627 }  # AUTOMATED_NOTIFICATION
]

# Build a skeleton SoftLayer_Container_Product_Order object containing the order
# you wish to place.
order_template = {
    'quantity' => quantity,
    'location' => location,
    'packageId' => package_id,
    'presetId' => preset_id,    
    'imageTemplateId' => 1111111,
    'useHourlyPricing' => true,
    'prices' => prices,    
    'virtual_guest' => virtual_guest
}

# Declare the API client to use the SoftLayer_Product_Order API service
client = SoftLayer::Client.new(username: USERNAME, api_key: API_KEY)
product_order_service = client.service_named('SoftLayer_Product_Order')

begin
  # verifyOrder() will check your order for errors. Replace this with placeOrder()
  # when you're ready to order. 
  receipt = product_order_service.verifyOrder(order_template)
  puts JSON.pretty_generate(receipt)
rescue StandardError => exception
  puts "There was an error in your order: #{exception}"
end

<强>的CreateObject

考虑到 createObject 方法是订购虚拟客户设备的简化方法,因此您可能无法设置IPV6,辅助IP地址等项目。请参阅SoftLayer_Virtual_Guest::createObject以了解您可以设置哪些属性。

以下示例是订购带有配置B1_1X2X100的vsi系列,在这种情况下,需要设置参数 supplementalCreateObjectOptions

require 'rubygems'
require 'softlayer_api'
require 'json'

# Your SoftLayer API username and API Key.
USERNAME = 'set-me'
API_KEY = 'set-me'

# Build the skeleton of SoftLayer_Virtual_Guest object.
virtual_guest_template = {
    'hostname' => 'test-vsi',
    'domain' => 'mycompany.com',
    'primaryNetworkComponent' => { 'networkVlan' => { 'id' => 11111 } },
    'primaryBackendNetworkComponent' => { 'networkVlan' => { 'id' => 22222 }},
    'datacenter' => { 'name' => 'dal05' },
    'supplementalCreateObjectOptions' => {
        'flavorKeyName' => 'B1_1X2X100'
    },
    'hourlyBillingFlag' => true,
    # Following is to specify the imageTemplate you want to use. But on this case you need
    # to set the globalIdentifier of imageTemplate.
    'blockDeviceTemplateGroup' => {      
      'globalIdentifier' => '6x06c3x8-4158-4b69-ba5x-433c18x3xac3'
    },
    'networkComponents' => [
        { 'maxSpeed' => 1000}   # 1 Gbps Public & Private Network Uplinks
    ]
}

# Declare the API client to use the SoftLayer_Virtual_Guest API service
client = SoftLayer::Client.new(username: USERNAME,  api_key: API_KEY)
virtual_guest_service = client['SoftLayer_Virtual_Guest']

begin
  # Call to createObject() when you're ready to order. 
  # Call to generateOrderTemplate() if you want to create an order container that can be
  # used with the methods verifyOrder and  placeOrder. 
  virtual_guest = virtual_guest_service.createObject(virtual_guest_template)
  puts JSON.pretty_generate(virtual_guest)
rescue StandardError => exception
  puts "There was an error in your order: #{exception}"
end