Вызов Ruby SoftLayer API SoftLayer_Billing_Invoice::getItems возвращает значение hostName в нижнем регистре

Я запускаю программу для получения моего последнего повторяющегося счета, а затем я хочу просмотреть каждый элемент в счете и получить список имен хостов. Вот в упрощенном виде:

account = SoftLayer::Service.new("SoftLayer_Account",:username => user, :api_key => api_key, :timeout => 999999999)

softlayer_client = SoftLayer::Client.new(:username => user, :api_key => api_key)

billing_invoice_service = softlayer_client.service_named("Billing_Invoice")

object_filter = SoftLayer::ObjectFilter.new
object_filter.set_criteria_for_key_path('invoices.createDate', 'operation' => 'betweenDate', 'options' => [{'name' => 'startDate', 'value' => ["01/01/2016"]}, {'name' => 'endDate', 'value' => ["01/02/2016"]}])

invoices = account.result_limit(0,10000).object_filter(object_filter).object_mask("mask[id,typeCode,itemCount,invoiceTotalAmount,closedDate,createDate]").getInvoices

invoices.each do | invoice |
  if invoice["typeCode"] == "RECURRING"
    invoice_reference = billing_invoice_service.object_with_id(invoice["id"])
    invoice_object = invoice_reference.object_mask("mask[itemCount]").getObject
    billing_items_count = invoice_object["itemCount"]

    for i in 0..(billing_items_count/10000.0).ceil - 1
      billing_items = invoice_reference.result_limit(i*10000, 10000).object_mask("mask[id,hostName]").getItems()
      billing_items.each do | billing_item |
        if billing_item["hostName"]
          pp billing_item
        end
      end
    end
  end
end

Вот соответствующая ссылка на документацию: http://sldn.softlayer.com/reference/services/SoftLayer_Billing_Invoice/getItems

Результатом является список имен хостов, но значения были уменьшены. Это блокирует меня, поскольку позже я делаю вызов find_servers и передаю это значение «hostName» сверху. Не удается найти сведения о сервере, поскольку регистр не совпадает. Я провел тест, как показано ниже, чтобы подтвердить это поведение:

softlayer_client = SoftLayer::Client.new(:username => user, :api_key => api_key)

found_downcased_version = SoftLayer::VirtualServer.find_servers({ :client => softlayer_client, :hostname => "host-hadr-1" })

if !found_downcased_version.empty?
  pp "FOUND DOWNCASED VERSION OF HOSTNAME"
end

found_unchanged_case_version = SoftLayer::VirtualServer.find_servers({ :client => softlayer_client, :hostname => "host-HADR-1" })

if !found_unchanged_case_version.empty?
  pp "FOUND UNCHANGED CASE VERSION OF HOSTNAME"
end

Похоже, проблема в том, что SoftLayer вернет результат, если он изменил регистр имени хоста.

1) Есть ли способ сделать мой вызов find_servers нечувствительным к регистру?

or

2) Есть ли способ получить идентификатор virtual_guest/оборудования из счета? Так что вместо использования find_server с аргументом имени хоста я потенциально мог использовать server_with_id.

Благодарю вас!


person haunm    schedule 29.01.2016    source источник


Ответы (1)


Метод getItems возвращает массив SoftLayer_Billing_Invoice_Item, этот объект имеет свойство billingItemId (см. http://sldn.softlayer.com/reference/datatypes/SoftLayer_Billing_Invoice_Item), который является элементом выставления счетов, из которого был создан этот элемент счета. Теперь этот billingItemId должен совпадать со связанным billingItemId либо с сервером, либо с VSI в вашей учетной записи. Таким образом, вы можете найти свой сервер или VSI, используя billingItemId

взгляните на этот код:

# To get the VSI
billingItemId = invoiceItem["billingItemId"]
account_service = softlayer_client.service_named("Account")
filter = SoftLayer::ObjectFilter.new {|f| f.accept("virtualGuests.billingItem.id").when_it is(billingItemId)}
# The method returns an array of VSIs, but because the filter the arrays should contain only one VSI
vsis = account_service.object_filter(filter).getVirtualGuests()
myVSI = vsi[0]


# To get the Server
billingItemId = invoiceItem["billingItemId"]
filter = SoftLayer::ObjectFilter.new {|f| f.accept("hardware.billingItem.id").when_it is(billingItemId)}
hardwares = account_service.object_filter(filter).getHardware()
myHardware = hardwares[0]

Я надеюсь, что это помогает

person Nelson Raul Cabero Mendoza    schedule 30.01.2016
comment
Спасибо, Нельсон. Это определенно дало мне что-то жизнеспособное для работы. Хотя я все еще думаю, что некоторые вызовы API возвращают имя хоста в нижнем регистре, а другие вызовы - нет. - person haunm; 02.02.2016
comment
да, это странно, если хотите, вы можете сообщить о проблеме, перейдя на портал Softlayer и открыв тикет. - person Nelson Raul Cabero Mendoza; 02.02.2016
comment
Я постараюсь углубиться в это и придумаю заклинание, чтобы указать цены. - person Nelson Raul Cabero Mendoza; 03.02.2016