Параметры фильтра для проверки POST и размещения заказа на хранение Performance
Я пытаюсь сделать BPM и SoftLayer интеграции с помощью клиента Java REST. При моем первоначальном анализе (а также переполнении стека формы справки) я обнаружил,
Шаг 1) мы должны получить список getPriceItem, чтобы иметь все идентификаторы для следующего запроса.
https://username:api_key@api.softlayer.com/rest/v3/SoftLayer_Product_Package/2/getItemPrices?objectMask=mask[id,item[keyName,description],pricingLocationGroup[locations[id, name, longName]]]
а затем проверьте и разместите заказ POST, используя соответствующие API.
Я застрял на Step 1)
поскольку фильтрация здесь кажется немного хитрой. Я получаю ответ JSON более 20000 строк.
Я хотел показать похожие данные (как и пользовательский интерфейс хранилища SL Performance) в моем пользовательском интерфейсе BPM. (Один выпадающий список для выбора типа хранилища, 2-й для отображения местоположения, 3-й для отображения размера и 4-й для ввода-вывода), где пользователь может выбрать элементы и разместить запрос.
Здесь я обнаружил, что SL похож на это для заполнения выпадающих
Разве мы не можем иметь реализацию, где мы можем использовать control.softlayer.com
так же, как SL вместо api.softlayer.com
? В этом случае мы можем использовать аналогичную логику для отображения данных в пользовательском интерфейсе.
Спасибо анупам
1 ответ
Здесь, с помощью API, выполняются шаги по хранению производительности. Для длительного хранения шаги аналогичны, вам просто нужно просмотреть значение для categoryCode и изменить, если это необходимо
Вы можете получить местоположения, используя этот метод:
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getRegions
вам просто нужно знать пакет хранения, например
GET https://api.softlayer.com/rest/v3.1/SoftLayer_Product_Package/222/getRegions
затем вы можете получить размер хранилища, для которого вы можете использовать методы SoftLayer_Product_Package::getItems или SoftLayer_Product_Package::getItemPrices и фильтр, например
GET https://api.softlayer.com/rest/v3.1/SoftLayer_Product_Package/222/getItemPrices?objectFilter={"itemPrices": {"categories": {"categoryCode": {"operation": "performance_storage_space"}},"locationGroupId": { "operation": "is null"}}}
Примечание. Мы фильтруем данные, чтобы получить цены с кодом категории "performance_storage_space", и мы хотим, чтобы стандартная цена locationGroupId = null
затем вы можете получить IOPS, вы можете использовать тот же подход, что и выше, но есть зависимость между IOPS и пространством хранения, например
GET https://api.softlayer.com/rest/v3.1/SoftLayer_Product_Package/222/getItemPrices?objectFilter={"itemPrices": { "attributes": { "value": { "operation": 20 } }, "categories": { "categoryCode": { "operation": "performance_storage_iops" } }, "locationGroupId": { "operation": "is null" } } }
Примечание. В этом примере мы предполагаем, что выбранное место для хранения было "20", цены на IOPS имеют запись с именем atributes, эта запись сообщает нам действительные места для хранения IOPS, тогда у нас есть другие фильтры, чтобы получить только категорию цен IOPSCodeCode = performance_storage_iops и мы хотим только стандартные цены locationGroupId = null
Для выбора типа хранилища я не думаю, что есть метод, единственный способ, который я вижу, это то, что вы вызываете метод SoftLayer_Product_Package::getAllObjects и фильтруете данные, чтобы получить пакеты на выносливость, производительность и портативное хранилище.
На всякий случай вот пример использования Python-клиента Softlayer для заказа
"""
Order a block storage (performance ISCSI).
Important manual pages:
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/verifyOrder
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/placeOrder
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getItems
http://sldn.softlayer.com/reference/services/SoftLayer_Location
http://sldn.softlayer.com/reference/services/SoftLayer_Location/getDatacenters
http://sldn.softlayer.com/reference/services/SoftLayer_Network_Storage_Iscsi_OS_Type
http://sldn.softlayer.com/reference/services/SoftLayer_Network_Storage_Iscsi_OS_Type/getAllObjects
http://sldn.softlayer.com/reference/datatypes/SoftLayer_Location
http://sldn.softlayer.com/reference/datatypes/SoftLayer_Container_Product_Order_Network_Storage_Enterprise
http://sldn.softlayer.com/reference/datatypes/SoftLayer_Product_Item_Price
http://sldn.softlayer.com/blog/cmporter/Location-based-Pricing-and-You
http://sldn.softlayer.com/blog/bpotter/Going-Further-SoftLayer-API-Python-Client-Part-3
http://sldn.softlayer.com/article/Object-Filters
http://sldn.softlayer.com/article/Python
http://sldn.softlayer.com/article/Object-Masks
License: http://sldn.softlayer.com/article/License
Author: SoftLayer Technologies, Inc. <sldn@softlayer.com>
"""
import SoftLayer
import json
# Values "AMS01", "AMS03", "CHE01", "DAL05", "DAL06" "FRA02", "HKG02", "LON02", etc.
location = "AMS01"
# Values "20", "40", "80", "100", etc.
storageSize = "40"
# Values between "100" and "6000" by intervals of 100.
iops = "100"
# Values "Hyper-V", "Linux", "VMWare", "Windows 2008+", "Windows GPT", "Windows 2003", "Xen"
os = "Linux"
PACKAGE_ID = 222
client = SoftLayer.Client()
productOrderService = client['SoftLayer_Product_Order']
packageService = client['SoftLayer_Product_Package']
locationService = client['SoftLayer_Location']
osService = client['SoftLayer_Network_Storage_Iscsi_OS_Type']
objectFilterDatacenter = {"name": {"operation": location.lower()}}
objectFilterStorageNfs = {"items": {"categories": {"categoryCode": {"operation": "performance_storage_iscsi"}}}}
objectFilterOsType = {"name": {"operation": os}}
try:
# Getting the datacenter.
datacenter = locationService.getDatacenters(filter=objectFilterDatacenter)
# Getting the performance storage NFS prices.
itemsStorageNfs = packageService.getItems(id=PACKAGE_ID, filter=objectFilterStorageNfs)
# Getting the storage space prices
objectFilter = {
"itemPrices": {
"item": {
"capacity": {
"operation": storageSize
}
},
"categories": {
"categoryCode": {
"operation": "performance_storage_space"
}
},
"locationGroupId": {
"operation": "is null"
}
}
}
pricesStorageSpace = packageService.getItemPrices(id=PACKAGE_ID, filter=objectFilter)
# If the prices list is empty that means that the storage space value is invalid.
if len(pricesStorageSpace) == 0:
raise ValueError('The storage space value: ' + storageSize + ' GB, is not valid.')
# Getting the IOPS prices
objectFilter = {
"itemPrices": {
"item": {
"capacity": {
"operation": iops
}
},
"attributes": {
"value": {
"operation": storageSize
}
},
"categories": {
"categoryCode": {
"operation": "performance_storage_iops"
}
},
"locationGroupId": {
"operation": "is null"
}
}
}
pricesIops = packageService.getItemPrices(id=PACKAGE_ID, filter=objectFilter)
# If the prices list is empty that means that the IOPS value is invalid for the configured storage space.
if len(pricesIops) == 0:
raise ValueError('The IOPS value: ' + iops + ', is not valid for the storage space: ' + storageSize + ' GB.')
# Getting the OS.
os = osService.getAllObjects(filter=objectFilterOsType)
# Building the order template.
orderData = {
"complexType": "SoftLayer_Container_Product_Order_Network_PerformanceStorage_Iscsi",
"packageId": PACKAGE_ID,
"location": datacenter[0]['id'],
"quantity": 1,
"prices": [
{
"id": itemsStorageNfs[0]['prices'][0]['id']
},
{
"id": pricesStorageSpace[0]['id']
},
{
"id": pricesIops[0]['id']
}
],
"osFormatType": os[0]
}
# 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.
response = productOrderService.verifyOrder(orderData)
print(json.dumps(response, sort_keys=True, indent=2, separators=(',', ': ')))
except SoftLayer.SoftLayerAPIError as e:
print("Unable to place the order. faultCode=%s, faultString=%s" % (e.faultCode, e.faultString))