Softlayer Java: указан недопустимый контейнер: SoftLayer_Container_Product_Order

Я хочу заказать почасовой Bare Metal, используя Softlayer java API. Я позаимствовал идею у https://gist.github.com/bmpotter/fe2de7f8028d73ada4e5. Вот мои шаги:

    Hardware hardware = new Hardware();
    Order orderTemplate = new Order();

    // 1. Set hostname, domain to hardware
    // 2. set Preset 
    Preset preset = new Preset();
    preset.setKeyName("S1270_8GB_2X1TBSATA_NORAID");
    hardware.setFixedConfigurationPreset(preset);
    // 3. Component setMaxSpeed, and added to hardware
    hardware.setPrimaryNetworkComponent()
    // 4. "UBUNTU_14_64"
    hardware.setOperatingSystemReferenceCode()

    // 1. Added Quantity to orderTemplate
    // 2. Added location to orderTemplate
    // 3. Added Hardware to orderTemplate
    // 4. Added Container, since I am see the exception
    orderTemplate.setContainerIdentifier("SoftLayer_Product_Package_Preset");

    Finally tried to verify the Order.

Я все время получаю типичное сообщение об ошибке:

Указан недопустимый контейнер: SoftLayer_Container_Product_Order. Для заказа сервера или услуги требуется конкретный тип контейнера, а не общий контейнер базового заказа.

Что я делаю неправильно? Нужно ли мне отправлять priceIds, аналогично не почасовому заказу на Bare Metal? Есть ли руководство по устранению неполадок, чтобы узнать, чего не хватает в моем заказе?

Педро Давид Фуэнтес. Не могли бы вы помочь? Я попробовал это, выяснив цены:

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

{
   "parameters": [
   {
     "complexType": "SoftLayer_Container_Product_Order_Hardware_Server",
     "quantity": 1,
     "location": "DALLAS",
     "packageId": 200,
     "useHourlyPricing": 1,
     "presetId": 66,
     "prices": [
     {
        "id": 37318
     }, 
     {
        "id": 34183
     }, 
     {
        "id": 26737
     }, 
     {
        "id": 34807
     }, 
     {
        "id": 25014
     }
  ],
  "hardware": [
    {
      "hostname": "myhostname",
      "domain": "mydomain.com"
    }
   ]
  }
 ]
}
{ 
    "error": "Unable to add a Graphics Processing Unit price (178119) because it is not valid for the package (200).", 
    "code": "SoftLayer_Exception_Public" 
}

Также воспроизводится с помощью кода JAVA, поэтому также пробовал использовать REST.

Модифицированный код с дополнительным логированием:

String username = "xxxxx";
String apiKey = "xxxxx";

Location datacenter = new Location();
datacenter.setName("seo01");

Preset preset = new Preset();
preset.setKeyName("S1270_8GB_2X1TBSATA_NORAID");

Component networkComponent = new Component();
networkComponent.setMaxSpeed(100L);

Hardware hardware = new Hardware();
hardware.setDatacenter(datacenter);
hardware.setHostname("xxxxx_xxxxx_BM_HOURLY");
hardware.setDomain("xxxx.xxx");
hardware.setHourlyBillingFlag(true);
hardware.setFixedConfigurationPreset(preset);
List<Component> networkComponents = hardware.getNetworkComponents();
networkComponents.add(networkComponent);
hardware.setOperatingSystemReferenceCode("CENTOS_LATEST");

ApiClient client = new RestApiClient().withCredentials(username, apiKey).withLoggingEnabled();
Hardware.Service hardwareService = Hardware.service(client); 
try
{  
  Gson gson = new Gson();
  Hardware hardwarePlaced = hardwareService.createObject(hardware);
  System.out.println("createObject: " + gson.toJson(hardwarePlaced));
}
catch(Exception e)
{
    System.out.println("Error: " + e);  
}

Я получаю сообщение об ошибке: Выполнение POST для ссылки с телом: {"parameters": [{"complexType": "SoftLayer_Hardware", "hostname": "xxxxx_xxxxx_BM_HOURLY", "domain": "xxxx.xxx", "fixedConfigurationPreset": { "complexType": "SoftLayer_Product_Package_Preset", "keyName": "S1270_8GB_2X1TBSATA_NORAID"}, "datacenter": {"complexType": "SoftLayer_Location", "name": "seo01"}, "hourly trueBillingFlag": {"complexType": "SoftLayer_Network_Component", "maxSpeed": 100}], "operatingSystemReferenceCode": "CENTOS_LATEST"}]} Получено 500 по ссылке с телом: {"error": "Невозможно добавить цену графического процессора (178119 ), потому что он недопустим для пакета (200). "," code ":" SoftLayer_Exception_Public "} Ошибка: com.softlayer.api.ApiException $ Internal: Невозможно добавить цену графического процессора (178119), потому что это не действительно для пакета (200). (код: SoftLayer_Exception_Public, статус: 500)


person CSN    schedule 07.09.2016    source источник


Ответы (2)


вы можете попробовать этот сценарий.

package SoftLayer_Java_Scripts.Examples;
import java.util.ArrayList;
import java.util.List;
import com.softlayer.api.*;
import com.softlayer.api.service.container.product.order.hardware.Server;
import com.softlayer.api.service.Hardware;
import com.softlayer.api.service.product.Order;
import com.softlayer.api.service.product.item.Price;
import com.google.gson.Gson;

/**
* Order a new server with preset configuration.
* 
 * The presets used to simplify ordering by eliminating the need
* for price ids when submitting orders.
* Also when the order contains a preset id, it is not possible
* to configure VLANs in the order.
* 
 * Important manual pages:
* http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/verifyOrder
* http://sldn.softlayer.com/reference/datatypes/SoftLayer_Container_Product_Order_Network_Message_Queue
* http://sldn.softlayer.com/reference/datatypes/SoftLayer_Virtual_Guest
* 
 * @license <http://sldn.softlayer.com/article/License>
* @author SoftLayer Technologies, Inc. <[email protected]>
* @version 1.0
*/
public class OrderPreSetBMS
{
  public static void main( String[] args )
  {
    // Your SoftLayer API username and key.
       String user = "set me";
       String apiKey = "set me";

       long quantity = 1;
       String location = "AMSTERDAM";
       long packageId = 200;
       long presetId = 64;
       String hostname = "test";
       String domain = "example.org";

       // Building a skeleton SoftLayer_Hardware_Server object to model the hostname and
       // domain we want for our server. If you set quantity greater then 1 then you
       // need to define one hostname/domain pair per server you wish to order.
       Hardware hardware = new Hardware();
       hardware.setHostname(hostname);
       hardware.setDomain(domain);

    // Building a skeleton SoftLayer_Product_Item_Price objects. These objects contain
    // much more than ids, but SoftLayer's ordering system only needs the price's id
    // to know what you want to order.
    // Every item in SoftLayer's product catalog is assigned an id. Use these ids
    // to tell the SoftLayer API which options you want in your new server. Use
    // the getActivePackages() method in the SoftLayer_Account API service to get
       // a list of available item and price options per available package.
       // Note: The presets already have some preconfigured items, such as
       // the server or the disks you do not need to configure the prices for those
       // items.
       //
       // Id: 44988 -> CentOS 7.x (64 bit)
    // Id: 1800  -> 0 GB Bandwidth
    // Id: 273   -> 100 Mbps Public & Private Network Uplinks
    // Id: 420   -> Unlimited SSL VPN Users & 1 PPTP VPN User per account
    // Id: 21    -> 1 IP Address
    // Id: 906   -> Reboot / KVM over IP        
    long[] priceIds = {44988, 1800, 273, 420, 21, 906};
    List<Price> prices = new ArrayList<Price>();
    for (int i = 0; i < priceIds.length; i++) {
      Price p = new Price();
      p.setId(priceIds[i]);
      prices.add(p);
    }

    // Building a skeleton SoftLayer_Container_Product_Order_Hardware_Server object
    // containing the order you wish to place.
       Server server = new Server();
       server.setQuantity(quantity);
       server.setLocation(location);
       server.setPackageId(packageId);

    List<Price> priceList = server.getPrices();
    priceList.addAll(prices);

       List<Hardware> hardwareList = server.getHardware();
       hardwareList.add(hardware);
       server.setPresetId(presetId);

       // Creating a SoftLayer API client and service objects. 
       ApiClient client = new RestApiClient().withCredentials(user, apiKey);
       Order.Service service = Order.service(client);

       try
       {
      // 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.
       // Once your order is placed it'll go through SoftLayer's approval and
       // provisioning process. When it's done you'll have a new
       // SoftLayer_Hardware_Server object and server ready to use.
       com.softlayer.api.service.container.product.Order verifiedOrder = service.verifyOrder(server);
         Gson gson = new Gson();
         System.out.println(gson.toJson(verifiedOrder));
       }
       catch(Exception e)
       {
              System.out.println("Error: " + e); 
       }
  }
}

Следующий запрос REST извлекает цены на товарные позиции для идентификатора пакета. Важно отметить, как организованы эти цены и какую информацию они содержат. Например, у этих цен на товарные позиции может быть один и тот же идентификатор товара, потому что цены разделены по местоположению.

 https://$username:[email protected]/rest/v3/SoftLayer_Product_Package/200/getItemPrices.json?objectMask=mask[id,pricingLocationGroup[locations[name]],item[id,description],categories[categoryCode]]

В следующем запросе в качестве критериев поиска используется фильтр объектов и Мониторинг хоста и TCP-службы. В этом примере можно понять, что цены на товарные позиции могут иметь один и тот же идентификатор товара, что означает, что они одинаковы, но должны использоваться в соответствии с конкретным местом, где проверяется заказ.

 https://$username:[email protected]/rest/v3/SoftLayer_Product_Package/200/getItemPrices.json?objectMask=mask[id,pricingLocationGroup[locations[name]],item[id,description],categories[categoryCode]]&objectFilter={"itemPrices":{"item":{"description":{"operation":"Host Ping and TCP Service Monitoring"}}}} 

Для дальнейшего чтения:

https://sldn.softlayer.com/article/object-masks

https://sldn.softlayer.com/article/object-filters

person Pedro David Fuentes Antezana    schedule 07.09.2016
comment
Спасибо за образец кода. Когда я устанавливаю packageId как 200 и перечисляю цены на пропускную способность, я получаю следующее: 1) пропускная способность 1000 ГБ, priceId: 50233 2) неограниченная пропускная способность (восходящий канал 100 Мбит / с), priceId: 24745 3) пропускная способность 5000 ГБ, priceId: 50243 4) Пропускная способность 500 ГБ, priceId: 50359 5) Пропускная способность 0 ГБ, priceId: 35963 6) Пропускная способность 20000 ГБ, priceId: 50263 7) Пропускная способность 10000 ГБ, priceId: 50253 8) Пропускная способность 0 ГБ, priceId: 34183 Ни один из приведенных выше списков Пропускная способность 1800. Ожидается ли использование жестко запрограммированных значений, например, для 0 ГБ BW? Жестко запрограммированные значения могут время от времени меняться, поэтому спрашивают. - person CSN; 08.09.2016
comment
Точно так же нет priceId 420 для PackageId: 200 1) Desc: восходящий канал частной сети 100 Мбит / с, priceId: 23787 2) Desc: восходящий канал общественной и частной сети 10 Мбит / с, priceId: 22829 3) Desc: восходящий канал частной сети 1 Гбит / с, priceId : 23777 4) Desc: 1 Гбит / с восходящих каналов для публичных и частных сетей, priceId: 24713 5) Desc: 100 Мбит / с для восходящих каналов для публичных и частных сетей, соответствует (): true priceId: 26737 6) Desc: 10 Мбит / с для восходящих каналов в частной сети, priceId: 27052 7) Описание: восходящие каналы общественной и частной сети 1 Гбит / с (без привязки), priceId: 37220 8) Описание: двойные восходящие каналы для общедоступных и частных сетей 10 Гбит / с (без привязки), priceId: 40200 - person CSN; 08.09.2016
comment
Дэвид Поддерживаете ли вы Redhat linux для ежечасной BM? Когда я использую приведенный выше код, я получаю следующее исключение: com.softlayer.api.ApiException $ Internal: Price # 44988 не существует. (Код: SoftLayer_Exception_Public, статус: 500) - person CSN; 09.09.2016
comment
Эта ссылка может помочь вам понять, как и почему цены на некоторые товары имеют разные идентификаторы. sldn.softlayer.com/blog/cmporter/location-based- ценообразование и вы - person Pedro David Fuentes Antezana; 09.09.2016
comment
Можете ли вы проверить мой обновленный вопрос? Я все еще не могу заставить его работать. - person CSN; 10.09.2016
comment
Я посмотрю документы. Я спрашивал, я получаю следующую ошибку: невозможно добавить цену графического процессора (178119), потому что она недействительна для пакета (200)., stackoverflow.com/questions/39003084/, вы упомянули, что это решено. Я снова вижу эту ошибку. - person CSN; 12.09.2016
comment
Причина, по которой вы видите разные цены, чем в примере, заключается в том, что у Педро и у вас разные учетные записи, softlayer имеет разные типы учетных записей, и каждый из них имеет разные цены, поэтому не ожидайте, что один и тот же идентификатор цены будет работать для вас, вы необходимо вызвать метод getItems, чтобы получить цены, которые будут работать для вас, и, конечно, вам не нужно использовать цены в жестком коде, потому что они могут меняться (ваш код всегда должен запрашивать цены до того, как сделать заказ). - person Nelson Raul Cabero Mendoza; 13.09.2016
comment
Теперь имейте в виду, что не все цены (или конфигурации) будут работать для предустановок (лучший способ проверить это - посмотреть, можете ли вы заказать их через портал), например, вы не можете установить VLAN для предустановок, я не уверен, что невозможно добавьте графический процессор, но проверьте его на портале. - person Nelson Raul Cabero Mendoza; 13.09.2016
comment
Это недостаток использования предустановок, в основном вы можете настроить только основные параметры, такие как ОС или пропускная способность (как в примере Педро), если вам нужно настроить больше параметров, лучший вариант для вас - не использовать предустановки. - person Nelson Raul Cabero Mendoza; 13.09.2016
comment
Предустановки предназначались для быстрой подготовки, и лучше использовать sldn.softlayer.com / reference / services / SoftLayer_Hardware_Server /, чтобы упорядочить их, и вы можете увидеть допустимые параметры, используя sldn.softlayer.com/reference/services/SoftLayer_Hardware_Server/, я постараюсь отправить вам экзамен с использованием java - person Nelson Raul Cabero Mendoza; 13.09.2016
comment
Даже если мы используем Bare Metals в течение нескольких дней и удаляем их, с нас взимается ежемесячная плата. Итак, команда SL посоветовала нам использовать почасовые БМ. Приветствуется любой пример на java. Я получаю сообщение "Невозможно добавить цену графического процессора" (178119), потому что она недействительна для пакета (200). когда я пытаюсь подтвердить заказ, используя https: // [имя пользователя]: [apikey] @ api.softlayer.com / rest / v3 / SoftLayer_Product_Order / verifyOrder тоже. - person CSN; 13.09.2016

Эта документация о заказе серверов BM может помочь вам http://sldn.softlayer.com/blog/bpotter/ordering-bare-metal-servers-using-softlayer-api

Вот пример заказа пресетов:

import java.util.List;
import com.softlayer.api.*;
import com.softlayer.api.service.Hardware;
import com.softlayer.api.service.Location;
import com.softlayer.api.service.network.Component;
import com.softlayer.api.service.product.Order;
import com.softlayer.api.service.product.pkg.Preset;
import com.google.gson.Gson;

public class OrderPreSetBMS2
{
  public static void main( String[] args )
  {
    String user = "set me";
    String apiKey = "set me";

    Location datacenter = new Location();
    datacenter.setName("seo01");

    Preset preset = new Preset();
    preset.setKeyName("S1270_8GB_2X1TBSATA_NORAID");

    Component networkComponent = new Component();
    networkComponent.setMaxSpeed(100L);


    Hardware hardware = new Hardware();
    hardware.setDatacenter(datacenter);
    hardware.setHostname("simplebmi");
    hardware.setDomain("test.com");
    hardware.setHourlyBillingFlag(true);
    hardware.setFixedConfigurationPreset(preset);
    List<Component> networkComponents = hardware.getNetworkComponents();
    networkComponents.add(networkComponent);
    hardware.setOperatingSystemReferenceCode("UBUNTU_14_64");

    ApiClient client = new RestApiClient().withCredentials(user, apiKey);
    Hardware.Service hardwareService = Hardware.service(client); 
    Order.Service orderService = Order.service(client); 

    try
    {
      //Change generateOrderTemplate method by createObject when you are ready to order the server. 
      com.softlayer.api.service.container.product.Order productOrder = hardwareService.generateOrderTemplate(hardware);
      Gson gson = new Gson();
      System.out.println(gson.toJson(productOrder));
    }
    catch(Exception e)
    {
        System.out.println("Error: " + e);  
    }
  }
}
person Nelson Raul Cabero Mendoza    schedule 13.09.2016
comment
Большое спасибо @Nelson Raul Cabero Mendoza. Я точно запустил вашу программу и попытался проверить заказ, используя productOrder: com.softlayer.api.service.container.product.Order verifyOrder = com.softlayer.api.service.product.Order.service (client) .verifyOrder (productOrder ); Я получаю то же исключение: Ошибка: com.softlayer.api.ApiException $ Internal: Невозможно добавить цену графического процессора (178119), потому что она недействительна для пакета (200). (Код: SoftLayer_Exception_Public, статус: 500) . Что означает это исключение? - person CSN; 13.09.2016
comment
это простой способ заказать серверы BM, но вы можете настроить только некоторые вещи. Если вы хотите настроить больше вещей, вам нужно использовать метод placeOrder, а не использовать предустановки - person Nelson Raul Cabero Mendoza; 13.09.2016
comment
Нельсон - @Nelson Raul Cabero Mendoza Я снова вижу то же исключение, я редактировал, пока вы комментировали. - person CSN; 13.09.2016
comment
Не проверяйте порядок. Похоже, что метод generateOrderTemplate не создает правильный шаблон заказа, если вы хотите, чтобы сервер использовал метод createObject. - person Nelson Raul Cabero Mendoza; 13.09.2016
comment
пожалуйста, если вы используете java-клиент, разрешите ему регистрировать запрос следующим образом: ApiClient client = new RestApiClient (). withCredentials (user, apiKey) .withLoggingEnabled (); он будет регистрировать успокаивающий запрос, который он делает, пожалуйста, опубликуйте это. - person Nelson Raul Cabero Mendoza; 13.09.2016
comment
Я могу успешно заказать предварительную настройку 66, и она правильно проверяет порядок. - person Nelson Raul Cabero Mendoza; 13.09.2016
comment
также убедитесь, что вы можете заказать предустановку через портал manage.softlayer.com/Store/orderHourlyBareMetalInstance/ 37278 / - person Nelson Raul Cabero Mendoza; 13.09.2016
comment
Не удалось добавить ссылку: link = api.softlayer.com/rest/v3 .1 / SoftLayer_Hardware.json. @ Нельсон Рауль Каберо Мендоса, мы можем где-нибудь поболтать? На портале Softlayer или по электронной почте? Я изменил вопрос, указав код и сообщение об ошибке. Не смог добавить ссылку в вопрос. - person CSN; 13.09.2016
comment
Я рассмотрю его и сообщу вам, как только смогу, но, похоже, это проблема с вашей учетной записью, и в этом случае лучший вариант - отправить заявку. - person Nelson Raul Cabero Mendoza; 13.09.2016
comment
Да, это проблема с вашей учетной записью, кто-то из отдела продаж softlayer должен проверить вашу учетную запись, отправить заявку на портале управления softlayer для получения дополнительной помощи. - person Nelson Raul Cabero Mendoza; 14.09.2016
comment
Да, я уже открыл тикет Softlayer. Ошибка вводила в заблуждение. Спасибо за вашу помощь. - person CSN; 14.09.2016