Как создать хеш priceConflicts как при настройке пакета магазина
Контекст:
На странице настройки программного слоя для виртуального гостя ( https://www.softlayer.com/Store/orderComputingInstance/1640,1644,2202) JavaScript выполняет много операций "показать / скрыть" для ценовых позиций на основе некоторых ограничений, таких как:
- MySQL для Linux скрыт, когда вы выбираете Windows в качестве операционной системы (ограничение цены)
- Частный узел недоступен в Далласе (местоположение с ценовым ограничением)
Моя проблема:
Создание веб-интерфейса для настройки виртуального гостя, мне нужно создать хэш, как priceConflicts
это показано на странице конфигурации.
призвание SoftLayer_Product_Package.getItemLocationConflicts
Я могу получить местоположение с ценовыми ограничениями, но когда я звоню SoftLayer_Product_Package.getItemConflicts
возвращается массив SoftLayer_Product_Item_Resource_Conflict_Item
с 4 атрибутами itemId
, packageId
, resourceTableId
а также message
это именно то, что описано для http://sldn.softlayer.com/reference/datatypes/SoftLayer_Product_Item_Resource_Conflict_Item
Некоторые странные вещи:
- Согласно документации: http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getItemConflicts возвращаемые значения должны были быть массивом SoftLayer_Product_Item_Resource_Conflict, а не массивом SoftLayer_Product_Item_Resource_Conflict_Item
- Согласно документации: http://sldn.softlayer.com/reference/datatypes/SoftLayer_Product_Item_Resource_Conflict_Item есть свойство реляционного ресурса, но когда я вызываю с маской
mask[resource]
возвращается следующая ошибка: свойство 'resource' недопустимо для 'SoftLayer_Product_Item_Resource_Conflict'.
Итак, как мне получить информацию, необходимую для создания такой структуры, как priceConflicts
хэш?
Спасибо
1 ответ
Для обоих случаев он возвращает массив http://sldn.softlayer.com/reference/datatypes/SoftLayer_Product_Item_Resource_Conflict
Вы должны предположить,
Для http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getItemLocationConflicts у "itemId" есть "конфликт местоположения" с местоположением, которое имеет тот же идентификатор, что и "resourceTableId".
Вы можете получить идентификаторы местоположения с помощью следующего метода: http://sldn.softlayer.com/reference/services/SoftLayer_Location_Datacenter/getDatacenters. Таким образом, вам нужно будет соответствовать идентификатору, чтобы получить местоположение
- Для http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getItemConflicts"itemId" конфликтует с "resourceTableId", который соответствует другому "itemId". Вы должны сопоставить эти значения с результатом из SoftLayer_Product_Package::getItems
Как вы сказали, JavaScript много показывает / скрывает элементы цены, основываясь на некоторых ограничениях.
Я могу предоставить скрипт Python, который поможет вам получить всю эту информацию
обновленный
"""
Get item prices information
This script retrieves information of prices from a package. It retrieves the item description,
location conflicts, pricing location group and item conflicts
Important manual pages:
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getRegions
http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getItemPrices
http://sldn.softlayer.com/reference/datatypes/SoftLayer_Product_Package/getItemPrices
http://sldn.softlayer.com/article/object-masks
@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 image template id
packageId = 46
# Create a client instance
client = SoftLayer.Client(username=API_USERNAME, api_key=API_KEY)
# Declare an object mask to get location conflicts
objectMask = 'mask[pricingLocationGroup[locations],item[locationConflicts, conflicts]]'
try:
locations = client['SoftLayer_Product_Package'].getRegions(id=packageId)
items = client['SoftLayer_Product_Package'].getItems(id=packageId)
print('***** AVAILABLE LOCATIONS *****')
for location in locations:
print('Id: %s, Location: %s' % (location['location']['location']['id'], location['location']['location']['longName']))
itemPrices = client['SoftLayer_Product_Package'].getItemPrices(id=packageId, mask=objectMask)
items = client['SoftLayer_Product_Package'].getItems(id=packageId, mask='mask[prices]')
x = PrettyTable(["Price Id", "Item Id", "Description", "Datacenter conflicts", "Pricing Location", 'Price conflicts', 'Item conflicts'])
x.align["Price Id"] = "l" # Left align city names
x.padding_width = 1
for price in itemPrices:
dcConflicts = ''
pricingLocation = ''
conflictItems = ''
conflictPrices = ''
# Get location conflicts
if len(price['item']['locationConflicts']) > 0:
for locationConflicts in price['item']['locationConflicts']:
for location in locations:
if locationConflicts['resourceTableId'] == location['location']['location']['id']:
dcConflicts = dcConflicts + ' ' + location['location']['location']['longName']
else:
dcConflicts = "None"
# Get Pricing location
if 'pricingLocationGroup' in price:
for priceLocation in price['pricingLocationGroup']['locations']:
pricingLocation = pricingLocation + ' ' + priceLocation['longName']
else:
pricingLocation = 'Standard price'
# Get item conflicts
if len(price['item']['conflicts']) > 0:
for conflict in price['item']['conflicts']:
for item in items:
if conflict['resourceTableId'] == item['id']:
conflictItems = conflictItems + ' ' + str(conflict['resourceTableId'])
for priceConf in item['prices']:
conflictPrices = conflictPrices + ' ' + str(priceConf['id'])
if conflictItems == '':
conflictItems = 'None'
conflictPrices = 'None'
x.add_row([price['id'], price['item']['id'], price['item']['description'], dcConflicts, pricingLocation, conflictPrices, conflictItems])
print(x)
except SoftLayer.SoftLayerAPIError as e:
print("Unable to get item prices faultCode=%s, faultString=%s" % (e.faultCode, e.faultString))
exit(1)