SoftLayer API:如何获取所有可能的locationGroupId

时间:2015-12-14 13:59:25

标签: php api ibm-cloud-infrastructure

每小时裸机服务器Softlayer_Product_Package 200有预设。

我试图获取所有地点的每个预设的商品价格。

如果我使用以下查询 https://开头$ apiuser:$apikey@api.softlayer.com/rest/v3/SoftLayer_Product_Package/200/getActivePresets.json objectMask =面膜 [id,packageId,description,name,keyName,configuration.category,configuration.price]

它只返回"标准"价格为" locationGroupId" = null。

我如何从" SoftLayer_Product_Package_Preset"获得所有位置的价格,不同价格的不同loationGroupId值,但不仅限于"标准"价格与loationGroupId = null?

感谢。

3 个答案:

答案 0 :(得分:1)

我在执行SoftLayer_Product_Package :: getActivePresets时得到了相同的值(我的意思是:“locationGroupId”= null)。

但在查看快速服务器的订单配置后,我可以看到预设是预先建立/固定的配置,这似乎是使用“getActivePresets”显示的商品价格没有可供选择的位置的原因。这些具有locationGroupId = null的价格ID被视为“标准价格”,API将在内部切换客户的价格。但建议首先执行verifyOrder以查看所需订单是否正常(费用可能会有所不同)。

例如,在执行以下请求时:

https://[username]:[apikey]@api.softlayer.com/rest/v3/SoftLayer_Product_Package/200/getActivePresets.json?objectMask=mask [id,description,keyName,configuration.category, configuration.price,prices]

我们得到预先确定的价格(套餐:200,预设:66):

* Item prices: Disk Controller (NoRAID)  -- > price id: 32927
* server ("Single Intel Xeon E3-1270 v3 (4 Cores, 3.50 GHz)") --> price id: 37318
* RAM ("32 GB RAM") --> price id: 37360
* disk0 (“960 GB SSD (3 DWPD)”) --> price id: 50407
*disk1 ("960 GB SSD (3 DWPD)”) --> price id: 50407

在内部,API将与客户匹配这些价格和所选位置。 可能与这些价格匹配的位置是旧位置,例如:dal01,ams01,dal07 dal06,sng01,hou02,wdc01,SJC01。

但上述价格不是配置每小时快速服务器的唯一项目。例如,对于此订单,我们需要配置更多项目:

https://[username]:[apikey]@api.softlayer.com/rest/v3/SoftLayer_Product_Order/verifyOrder

{
  "parameters": [
    {
      "complexType": "SoftLayer_Container_Product_Order_Hardware_Server",
      "quantity": 1,
      "location": "SANJOSE",
      "packageId": 200,
      "useHourlyPricing": 1,
      "presetId": 66,
      "prices": [
        {
          "id": 37318        # Single Intel Xeon E3-1270 v3 (4 Cores, 3.50 GHz)
        },
        {
          "id": 37360        # "32 GB RAM
        },
        {
          "id": 44992        # "CentOS 7.x (64 bit)"
        },
        {
          "id": 32927        # "Non-RAID  Non-RAID"
        },
        {
          "id": 50407        # disk0 - 960 GB SSD (3 DWPD)
        },
        {
          "id": 50407        # disk1 - 960 GB SSD (3 DWPD)
        },
        {
          "id": 34183        # "0 GB Bandwidth"
        },
        {
          "id": 26737        # "100 Mbps Public & Private Network Uplinks"
        },
        {
          "id": 33483        # "Unlimited SSL VPN Users & 1 PPTP VPN User per account"
        },
        {
          "id": 34807        # "1 IP Address"
        },
        {
          "id": 25014        # "Reboot / KVM over IP"
        }
      ],
      "hardware": [
        {
          "hostname": "myhostname",
          "domain": "mydomain.com"
        }
      ]
    }
  ]
}

要获得这些商品价格,我们可以使用以下内容:

https://[username]:[apikey]@api.softlayer.com/rest/v3/SoftLayer_Product_Package/200/getItemPrices?objectMask=mask[id,item[keyName,description],pricingLocationGroup[locations[id, name, longName]]]

在此请求中,我们可以看到某些项目可能包含“locationGroupId<> null“根据位置选择

参考文献:

  

http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getItemPrices   http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getAllObjects   http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package   http://sldn.softlayer.com/blog/cmporter/Location-based-Pricing-and-You

修改

每个数据中心的快速配置服务器数量有限。即使我们进入门户并选择任何数据中心,也有一些情况在验证订单后会显示错误,即:

  

目前没有可用于预设的包#200的硬件   配置#66在法兰克福2.请选择其他   数据中心。

这意味着该订单的位置没有足够的硬件。似乎快速配置服务器的可用性订单仅在少数数据中心中,因此他们没有特定的位置组。例如,如果我们执行以下请求以了解可用的位置组定价,我们可以看到每个组具有多个位置,并且快速供应订单可能仅适用于其中一个数据中心(不会接受其他订单)这些DC)。

https://[username]:[apikey]@api.softlayer.com/rest/v3/SoftLayer_Location_Group_Pricing/getAllObjects?objectMask=mask[locations]

当使用FastProvision服务器并取消它们的客户时,他们会返回可用池并再次“可订购”。

目前这些订单正在以“标准价格”运作。

答案 1 :(得分:0)

控制门户网站会执行一些内部流程来获取您订购服务器时要选择的数据中心的价格。遗憾的是,无法通过单个休息请求检索所需的所有信息。

但是,我们可以使用SoftLayer支持的编程语言。您可以在以下位置查看SoftLayer支持的语言:

http://sldn.softlayer.com/

我可以提供以下python脚本,它将帮助您获取每个活动预设配置的每个数据中心的价格。这段代码可以改进,只是一个想法。

"""
Get active presets and its prices per location

This script retrieves the active presets with their prices per datacenter. 
Also it displays the information for hourly recurring fee and recurring fee.

Important manual pages:
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getActivePresets
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getItemPrices
http://sldn.softlayer.com/search/site/object%20mask
http://sldn.softlayer.com/article/Object-Filters

@License: http://sldn.softlayer.com/article/License
@Author: SoftLayer Technologies, Inc. <sldn@softlayer.com>
"""

# So we can talk to the SoftLayer API:
import SoftLayer
from prettytable import PrettyTable

# Your SoftLayer API username and key.
API_USERNAME = 'set me'
API_KEY = 'set me'
# Declare the package id
packageId = 200
# Create a client instance
client = SoftLayer.Client(username=API_USERNAME, api_key=API_KEY)
# Declare an object mask to get prices and items information
objectMask = 'mask[prices[item]]'
# Declare an object mask to get pricingLocationGroup
objectMaskPrice = 'mask[pricingLocationGroup[locations]]'
try:
    # Get active presets
    activePresets = client['SoftLayer_Product_Package'].getActivePresets(id=packageId, mask=objectMask)
    for activePreset in activePresets:
        print('**************   PRESET ID: %s   **************' % activePreset['id'])
        # Configuring table's columns
        x = PrettyTable(['Locations', 'Price Id', 'Item Id', 'Item Description', 'hourlyRecurringFee', 'recurringFee'])
        x.padding_width = 1
        print('Id: %s, Description: %s, isActive: %s' % (activePreset['id'], activePreset['description'], activePreset['isActive']))
        print('        KeyName: %s, Name: %s' % (activePreset['keyName'], activePreset['name']))
        for prices in activePreset['prices']:
            print('                 Price Id: %s, Item Id: %s Item Description: %s' % (prices['id'], prices['item']['id'], prices['item']['description']))
            objectFilterItem = {'itemPrices':{'item':{'id':{'operation':prices['item']['id']}}}}
            prices = client['SoftLayer_Product_Package'].getItemPrices(id=200, filter=objectFilterItem, mask=objectMaskPrice)
            for price in prices:
                locationDisplay = ''
                recurringFee = 0
                # Verifying if the price has pricingLocationGroup 
                if 'pricingLocationGroup' in price:
                    for location in price['pricingLocationGroup']['locations']:
                        locationDisplay = locationDisplay + ' ' + location['longName']
                else:
                    locationDisplay = 'STANDARD PRICE'
                # Verifying if the price has Recurring Fee
                if 'recurringFee' in price:
                    recurringFee = price['recurringFee']
                else:
                    recurringFee = 'null'
                x.add_row([locationDisplay, price['id'], price['item']['id'], price['item']['description'], price['hourlyRecurringFee'], recurringFee])
        print(x)
except SoftLayer.SoftLayerAPIError as e:
    print('Unable to get active presets faultCode=%s, faultString=%s' % (e.faultCode, e.faultString))
    exit(1)

我希望这可以帮到你。

让我知道任何疑问或评论

答案 2 :(得分:0)

为了获得门户等预设订单的价格,您需要使用其他方法:

此方法将为您提供可用的服务器,其预设(如果有)以及门户网站中的价格 http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package_Server/getAllObjects

但价格是标准的,为了获得特定地点的价格,您需要使用以下方法:http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getItemPriceshttp://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getItems

他们将返回每个地点的所有价格。

getActivePresets方法可以帮助您了解预设中的项目,使用其他方法可以获得特定位置的价格。

此致