Заказ EVault на сервере Bare Metal завершается ошибкой

В основном я следую тому, что было опубликовано здесь, чтобы заказать EVault на чистом металлическом сервере: softlayer">Пример кода для заказа резервной копии EVault в SoftLayer

Это работает для виртуального гостя, но не работает на сервере Bare Metal при вызове verifyOrder с сообщением об ошибке, подобным этому:

There was an error querying the SoftLayer API: EVault orders must be tied to exactly 1 server.

Это тот тип ввода, который у меня есть, и у меня указано только 1 оборудование, и я не понимаю, почему он думает, что у меня нет ровно 1 сервера.

stdClass Object
(
    [location] => 168642
    [packageId] => 0
    [prices] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 22747
                )

        )

    [quantity] => 1
    [useHourlyPricing] =>
    [hardware] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 168137
                )

        )
)

Это код PHP, который я использую для тестирования. (Я удалил некоторые начальные операторы require). Он ссылается на сервер с почасовой оплатой, и все данные, показанные в примере, реальны, за исключением $apiUsername и $apiKey:

<?php
$apiUsername = 'xxxxx';
$apiKey = 'xxxxx';

$hardware = new stdClass();
$hardware->id = 168137;

$orderHardware = array
(
    $hardware
);

# The location for the Evault
$location = "168642";
$packageId = 0;
$quantity = 1;

$prices = array
(
    22747,
);

// Convert our item list into an array of skeleton
$orderPrices = array();

foreach ($prices as $priceId) {
    $price = new stdClass();
    $price->id = $priceId;
    $orderPrices[] = $price;
}

// Build a SoftLayer_Container_Product_Order_Network_Storage_Backup_Evault_Vault object containing
// the order you wish to place.
$orderTemplate = new stdClass();
$orderTemplate->location         = $location;
$orderTemplate->packageId        = $packageId;
$orderTemplate->prices           = $orderPrices;
$orderTemplate->quantity         = $quantity;
$orderTemplate->useHourlyPricing = false;
$orderTemplate->hardware    = $orderHardware;

print_r($orderTemplate);

// Place the order.
try {
    // Re-declare the order template as a SOAP variable, so the SoftLayer
    // ordering system knows what type of order you're placing.
    $orderTemplate = new SoapVar
    (
            $orderTemplate,
            SOAP_ENC_OBJECT,
            'SoftLayer_Container_Product_Order_Network_Storage_Backup_Evault_Vault',
            'http://api.service.softlayer.com/soap/v3/'
    );

    $softLayer_product_order = SoftLayer_SoapClient::getClient('SoftLayer_Product_Order', null, $apiUsername, $apiKey);
    $receipt = $softLayer_product_order->verifyOrder($orderTemplate);
    print_r($receipt);
} catch (Exception $e) {
    echo 'Unable to place server order: ' . $e->getMessage();
}
?>

Это голые данные сервера (168137), которые я собираю, выполняя

GET https://api.softlayer.com/rest/v3/SoftLayer_Hardware/168137/getObject.json?objectMask=activeTransaction.transactionGroup

{
   "accountId" : 79###,
   "bareMetalInstanceFlag" : 0,
   "domain" : "x.net",
   "fullyQualifiedDomainName" : "x.x.net",
   "globalIdentifier" : "2###-##a-4#7-a##6-ed##5",
   "hardwareFunction" : {
      "code" : "WEBSVR",
      "description" : "Web Server",
      "id" : 3
   },
   "hardwareStatus" : {
      "id" : 5,
      "status" : "ACTIVE"
   },
   "hardwareStatusId" : 5,
   "hostname" : "xxxxx",
   "id" : 168137,
   "managedResourceFlag" : false,
   "manufacturerSerialNumber" : "S0#####2009275E",
   "networkManagementIpAddress" : "10.##.###.###",
   "notes" : "",
   "primaryBackendIpAddress" : "10.##.###.###",
   "primaryIpAddress" : "198.##.###.###",
   "privateIpAddress" : "10.##.###.###",
   "provisionDate" : "2016-01-15T09:20:55-06:00",
   "serialNumber" : "ASL####",
   "serviceProviderId" : 1,
   "serviceProviderResourceId" : 168137
}

person KHP    schedule 15.01.2016    source источник
comment
во-первых, вы используете PHP, было бы неплохо вставить свой код, чтобы посмотреть, во-вторых, вы пробовали пример Rest, который вам прислал mcruz?   -  person Nelson Raul Cabero Mendoza    schedule 16.01.2016
comment
Я обновил свой вопрос тестовым кодом, который я использую. Пожалуйста, просмотрите и посмотрите, обнаружите ли вы какие-либо проблемы, и, пожалуйста, дайте мне знать, если вы что-то видите. Спасибо.   -  person KHP    schedule 18.01.2016
comment
Код работает нормально для меня. Если у вас все еще есть проблемы с этим, я рекомендую вам отправить заявку в Softlayer, возможно, что-то не так с вашей учетной записью.   -  person Nelson Raul Cabero Mendoza    schedule 18.01.2016


Ответы (1)


Вы правы, причиной этой ошибки являются лишние атрибуты networkType и numOfTabs.

Ошибки, отображаемые с использованием этих атрибутов:

{
"error": "The property 'networkType' is not valid for 'SoftLayer_Container_Product_Order_Network_Storage_Backup_Evault_Vault'."
"code": "SoftLayer_Exception_Public"
}

{
"error": "The property 'numOfTabs' is not valid for 'SoftLayer_Container_Product_Order_Network_Storage_Backup_Evault_Vault'."
"code": "SoftLayer_Exception_Public"
}

Если их убрать, то заказ сработает успешно.

Ниже приведен пример REST, удаляющий эти атрибуты:

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

Method: POST

{
  "parameters": [
    {
   "complexType" : "SoftLayer_Container_Product_Order_Network_Storage_Backup_Evault_Vault",
   "hardware" : [
      {
         "id" : "149654",
         "notes" : "Bare Metal"
      }
   ],
   "location" : "449500",
   "packageId" : 0,
   "prices" : [
      {
         "id" : "83867"
      }
   ],
   "quantity" : 1,
   "useHourlyPricing" : 0
}
  ]
}

Использованная литература:

http://sldn.softlayer.com/reference/datatypes/SoftLayer_Container_Product_Order_Network_Storage_Backup_Evault_Vault

ИЗМЕНИТЬ

Но если в заказе все еще есть ошибки, нам нужно рассмотреть другие возможные проблемы. Например, одной из них может быть проблема с металлическим стержнем, который мы используем. Мы можем проверить, может ли быть запущена активная транзакция, которая остановит наш заказ. Чтобы узнать, есть ли на этом сервере активные транзакции, выполните:

https://[username]:[apikey]@api.softlayer.com/rest/v3/SoftLayer_Hardware/149654/getObject?objectMask=activeTransaction.transactionGroup

Method: GET 
where: “149654” is the Hardware_id.

Если в металлическом слитке есть активная транзакция, результат будет выглядеть примерно так:

"serviceProviderResourceId": 149654
"globalIdentifier": "aaaaaa-aaaa-aaaa-8851-c3c68f764a4e"
"hardwareFunction": {
"code": "WEBSVR"
"description": "Web Server"
"id": 3
}-
"hardwareStatus": {
"id": 8
"status": "RECLAIM"
}-
"managedResourceFlag": false
"networkManagementIpAddress": "11.11.11.11"
"primaryBackendIpAddress": "10.44.44.44"
"primaryIpAddress": "50.50.50.50"
"activeTransaction": {
"createDate": "2016-01-15T08:54:04-06:00"
"elapsedSeconds": 10328
"guestId": null
"hardwareId": 149654
"id": 1234567
"modifyDate": "2016-01-15T12:45:31-06:00"
"statusChangeDate": "2016-01-15T10:07:22-06:00"
"transactionGroup": {
"averageTimeToComplete": "641.64"
"name": "Reclaim Server"
}-
"transactionStatus": {
"averageDuration": "162.31"
"name": "XX_ERASEDRIVES"
}-
}
person mcruz    schedule 15.01.2016
comment
Я обновил вопрос, указав новый ввод, в котором я удалил лишние атрибуты. Тем не менее, я все еще сталкиваюсь с той же проблемой. - person KHP; 15.01.2016
comment
@KHP, в настоящее время у барметала с id = 149654 есть активная транзакция, поэтому ордер не может быть успешно выполнен. См. EDIT в ответе, чтобы получить активную транзакцию с помощью запроса. Я надеюсь, что это поможет вам. С Уважением - person mcruz; 15.01.2016
comment
Ой? Когда оно переходит в какое-то другое состояние? или в каком состоянии оно должно быть и как я могу установить его в это состояние? - person KHP; 15.01.2016
comment
Я могу получить эти ошибки при выполнении заказа с использованием запросов REST с помощью «Advanced Rest Client App» для Chrome. По своему опыту я видел больше подробностей об ошибках, используя REST :) - person mcruz; 15.01.2016
comment
Кроме того, активная транзакция должна быть завершена сама, клиент не может манипулировать этим выполнением (в этом случае кажется, что ваш сервер высвобождается, и он больше не будет использоваться). Но когда сервер активен, его статус ACTIVE и активная транзакция NULL (если мы выполним последний запрос, который я отправил, активная транзакция не будет отображаться в результате). - person mcruz; 15.01.2016
comment
Я добавил последний статус своего устройства в свой вопрос внизу. Судя по вашему последнему комментарию, мое устройство АКТИВНО, и у меня нет активных транзакций. Таким образом, он должен быть в допустимом состоянии, чтобы разместить на нем заказ EVault. Я создал код PHP, который сейчас запускаю локально, чтобы воспроизвести эту проблему, и при этом он не показывает ошибку о других дополнительных атрибутах. Но все же удалил их. - person KHP; 15.01.2016
comment
Как вы определили, что мой голый металл недоступен для добавления EVault? Где на клиентском портале и какие данные об этом говорят? Я просто зашел на клиентский портал SoftLayer и щелкнул свое устройство с пустым металлом, затем перешел в раздел хранилища и щелкнул «Добавить в EVault», и я могу выбрать местоположение, размер и, похоже, проверить, что часть заказа работает, хотя я не завершил приказ. - person KHP; 16.01.2016
comment
Я обновил свой вопрос с помощью примера PHP-кода, который я использую. Пожалуйста, проверьте и посмотрите, видите ли вы что-то, что я делаю неправильно. - person KHP; 18.01.2016
comment
Мне удалось успешно выполнить php-скрипт. - person mcruz; 18.01.2016
comment
Ваш сервер на голом металле работает почасово или ежемесячно? Интересно, есть ли разница? Не могли бы вы опубликовать подробности о вашем чистом металлическом сервере, который вы использовали здесь? - person KHP; 19.01.2016