Softlayer Java: указан неверный контейнер: SoftLayer_Container_Product_Order

Я хочу заказать почасовой Bare Metal, используя Java-API Softlayer. Я взял идею с 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 Order? Существует ли руководство по устранению неполадок, чтобы узнать, чего не хватает в моем заказе?

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

https://%5Busername%5D:%5Bapikey%5D@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"},"центр обработки данных": { "ComplexType":"SoftLayer_Location","имя":"seo01"},"hourlyBillingFlag": правда,"networkComponents":[{"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)

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. <sldn@softlayer.com>
* @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:$apiKey@api.softlayer.com/rest/v3/SoftLayer_Product_Package/200/getItemPrices.json?objectMask=mask[id,pricingLocationGroup[locations[name]],item[id,description],categories[categoryCode]]

В следующем запросе в качестве критерия поиска используются объектный фильтр и Host Ping и TCP Service Monitoring. С помощью этого примера можно понять, что цены товара могут иметь одинаковый идентификатор товара, что означает, что они одинаковы, но должны использоваться в соответствии с конкретным местом, где проверяется заказ.

 https://$username:$apiKey@api.softlayer.com/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

Эта документация о заказе серверов 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);  
    }
  }
}
Другие вопросы по тегам