- PVSM.RU - https://www.pvsm.ru -

Управление Parallels Automation for Cloud Infrastructure через API

В прошлый раз [1] мы рассказывали про Облачные серверы на базе Parallels Automation for Cloud Infrastructure (PACI) – предполагаемые цены, функционал, в том числе, мельком упомянули наличие API для управления серверами. Сегодня мы подробнее рассмотрим доступные через API действия и примеры основных команд.

К сожалению, предыдущий пост оценили не очень высоко, но мы получили интересные вопросы, много отзывов и несколько баг-репортов от читательов, присоединившихся к тестированию [2]. Постараемся охватить затронутые вами темы в этом и следующих постах.

Как мы уже рассказывали, основа нашего облака – Parallels Automation for Cloud Infrastructure – модуль системы биллинга и провиженинга услуг Parallels Automation. Продукт поставляется с отличным RESTful API. Приводить весь листинг с командами API мы не будем – его можно посмотреть в официальной документации [3]. Лучше покажем несколько примеров этого способа управления виртуальными машинами и контейнерами.

Управление Parallels Automation for Cloud Infrastructure через API

Синтаксис и пунктуация

Работа с ресурсами облака осуществляется через отправку API-запросов управляющему серверу PACI. Ответы приходят в XML-формате, код максимально читабелен и ориентирован на пользователя, а не на обработку бездушным парсером, так что все поля имеют вразумительные имена. Вдобавок, можно легко автоматизировать управление, а сам XML без проблем парсится, если вам вдруг это понадобится.

Обращаться к API нужно по адресу управляющего сервера PACI (в дальнейшем будем сокращать до baseURL):

https://{ip_address | hostname}:port/paci/version

Если с ip_address hostname и port всё более-менее понятно, то на оставшихся двух полях стоит заострить внимание. /paci/ всегда должно выглядеть как /paci/, и никак иначе. А версия указывается в формате v1.0 (цифры, соответственно, могут и меняться в будущих версиях PACI).

Таким образом, готовый baseURL будет выглядеть вот так:

https://109.120.*.*:4465/paci/v1.0 

Дальнейшее общение с виртуальным сервером осуществляется при помощи расширения baseURL “вправо” — мы просто ставим / и дописываем дополнительные параметры к baseURL. /ve — обращение к виртуальному серверу, а так как сервер, обычно, имеет свой идентификатор, то после /ve дописывается имя сервера /my-server-01.

Строка baseURL с двумя дополнительными параметрами принимает вид:

https://109.120.*.*:4465/paci/v1.0/ve/my-server-01 

Что равноценно строке:

baseURL/ve/my-server-01

Некоторые запросы позволяют определение дополнительных параметров. Зачастую параметры не обязательные, но очень полезные. Все дополнительные параметры перечисляются после знака вопроса.

Примером такого запроса может служить следующая строка:

GET baseURL/ve?subscription=1000001

С синтаксисом мы более-менее разобрались, теперь перейдём к возможностям.

Какие действия доступны через API?

Возможности достаточно широкие. Доступны “невинные” функции:

  • листинг и мониторинг имеющихся виртуалок
  • создание новых и управление уже созданными серверами
  • развёртывание образов
  • клонирование существующих систем
  • настройка доступных серверу ресурсов

И более серьёзные вещи:

  • создание новых образов
  • управление уже созданными образами серверов
  • создание, настройка, и, разумеется, удаление балансировщика нагрузки
  • а также подключение и отключение серверов от балансировщика

Управление серверами

Как вы уже знаете, просмотреть список серверов можно командой

GET baseURL/ve/

В ответ придёт несложная XML-ка:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ve-list> 
   <ve-info subscription-id="1000001" name="Habr1" state="CREATED" description="Habr Example 1"/> 
   <ve-info subscription-id="1000002" name="Habr2" state="CREATED" description="Habr Example 2"/> 
</ve-list> 

Описание полей есть в документации, но и их названия, в принципе, говорят сами за себя.

Остановить или запустить готовый сервер можно простым запросом:

PUT baseURL/ve/{ve-name}/start|stop

Вместо {ve-name} вставляем название сервера (поле name из ответа выше), а после него добавляем команду на запуск или остановку сервера. Опять же, проще простого и останавливаться тут, в принципе, не на чем.

Чуть сложнее выглядит создание нового сервера из консоли. У данной команды куча дополнительных параметров, а ограничения на использование тех или иных ресурсов придётся держать в голове или подсматривать в шпаргалке, так как это не GUI с ползунками. При превышении допустимых параметров вы получите ошибку 406: “Subscription limit for VE number exceeded".

Сама команда выглядит вот так:

POST baseURL/ve/

А вот дальше начинается вся магия. Помимо самого запроса, нужно сформировать ему ещё и XML-тело, в котором будут прописаны все-все параметры требуемого сервера:

<?xml version="1.0" encoding="UTF-8"?> 
<ve> 
 <name>HabrExample1</name> 
 <description>VE Linux 40</description> 
 <subscription-id>1000001</subscription-id> 
 <cpu number="1" power="1500"/> 
 <ram-size>256</ram-size> 
 <bandwidth>100</bandwidth> 
 <no-of-public-ip>1</no-of-public-ip>  
 <no-of-public-ipv6>0</no-of-public-ipv6>  
 <ve-disk local="true" size="20"/>  
 <platform> 
   <template-info name="centos-6-x86_64"/> 
     <os-info technology="CT" type="linux-free"/> 
 </platform> 
 <backup-schedule name="daily"/> 
 <admin login="root" password="152eyyBHO"/> 
</ve> 

Если всё указано правильно, то придёт ответ об успешном создании новой виртуалки:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<pwd-response> 
   <message>VE create initiated</message> 
   <password>152eyyBHO</password> 
</pwd-response>  

Управление Parallels Automation for Cloud Infrastructure через API

Управление образами

Функционал, заложенный в эту группу команд, позволяет здорово экономить время и ресурсы при развёртывании и масштабировании новых систем.

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

GET baseURL/image

Допустим, сервер ответил нам, что есть вот такой образ:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<image-list> 
   <image-info image-of="HabrExample3" active="true" load-balancer="true" subscriptionid="100001" created="2012-11-11 19:19:19.84091+04" size="3" name="lbimage"/> 
</image-list>

Хотите развернуть из него ещё один сервер? Нет ничего проще! Стандартный запрос:

POST baseURL/ve/{subscription-id}/{ve-name}/from/{image-name}

в нашем случае превращается в

POST baseURL/ve/1000003/Habr3/from/HabrExample3

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

POST baseURL/ve/{ve-name}/clone-to/{new-server-name}

Управление балансировщиком

Список имеющихся балансировщиков «заказывается» так же, как и многие другие списки имеющихся сервисов, услуг и возможностей:

GET baseURL/load-balancer

В ответ приходит коротенький XML с информацией о созданных load balancer’ах:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<lb-list> 
   <load-balancer state="STARTED" subscription-id="1" name="LB1"/> 
   <load-balancer state="STARTED" subscription-id="1" name="LB2"/> 
</lb-list> 

Любой имеющийся сервер легко присоединить к уже работающему балансировщику:

POST baseURL/load-balancer/{lb-name}/{ve-name}

Да и отсоединить не сложнее:

DELETE baseURL/load-balancer/{lb-name}/{ve-name}

Утилиты

В эту часть API попали пока только функции. Одна из них – список доступных для использования “предустановленных” серверных ОС:

GET baseURL/template/{name}

Список готовых пресетов для автоматического бэкапа:

GET baseURL/schedule

Примеры кода на PHP

GET-запрос на получение списка серверов:

<?php 
    
    $mainStr = "http://109.120.166.3:4465/paci/v1.0/";
    $queryStr = 've';
    $url = $mainStr.$queryStr;
    
    $process = curl_init();
    curl_setopt($process, CURLOPT_URL, $url);    
    curl_setopt($process, CURLOPT_HEADER, 1);
    curl_setopt($process, CURLOPT_USERPWD, '<login>:<password>');
    curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
   
    $head = curl_exec($process);
    curl_close($process);

?>

XML-ответ:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <ve-list> 
        <ve-info subscription-id="1000001" name="web1" state="CREATED" description="Web server 1"/> 
        <ve-info subscription-id="1000002" name="web2" state="CREATED" description="Web server 2"/> 
    </ve-list>

PUT-запрос на запуск-остановку сервера:

<?php

    $mainStr = "http://109.120.166.3:4465/paci/v1.0/";
    $queryStr = 've/<ve-name>/<start | stop>';
    $url = $mainStr.$queryStr;
    $process = curl_init();
    curl_setopt($process, CURLOPT_URL, $url);
    curl_setopt($process, CURLOPT_HTTPHEADER, array('Content-Type: application/xml'));
    curl_setopt($process, CURLOPT_PUT, 1);
    
    curl_setopt($process, CURLOPT_HEADER, 1);
    curl_setopt($process, CURLOPT_USERPWD, '<login>:<password>');
    curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
   
    $head = curl_exec($process);
    curl_close($process);

?>

XML-ответ:

    * VE START initiated 

POST-запрос на создание сервера:

<?php

    $mainStr = "http://109.120.166.3:4465/paci/v1.0/";
    $queryStr = 've';
    $serverInfo = 
    '<?xml version="1.0" encoding="UTF-8"?> 
        <ve> 
          <name>Web40</name> 
          <description>VE Linux 40</description> 
          <subscription-id>1000001</subscription-id> 
          <cpu number="2" power="1600"/> 
          <ram-size>512</ram-size> 
          <bandwidth>100</bandwidth> 
          <no-of-public-ip>2</no-of-public-ip>  
          <no-of-public-ipv6>2</no-of-public-ipv6>  
          <ve-disk local="true" size="3"/>  
          <platform> 
            <template-info name="centos-6-x86_64"/> 
              <os-info technology="CT" type="linux-free"/> 
          </platform> 
          <backup-schedule name="daily"/> 
          <admin login="root" password="qwwqq45"/> 
        </ve> ';
    
    $url = $mainStr.$queryStr;
    
    $process = curl_init();
    curl_setopt($process, CURLOPT_URL, $url);
    curl_setopt($process, CURLOPT_HTTPHEADER, array('Content-Type: application/xml'));
    curl_setopt($process, CURLOPT_POST, 1);
    curl_setopt($process, CURLOPT_HEADER, 1);
    curl_setopt($process, CURLOPT_USERPWD, '<login>:<password>');
    curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($process, CURLOPT_POSTFIELDS, $serverInfo);    
    
    $head = curl_exec($process);
    curl_close($process);
?>

XML-ответ:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <pwd-response> 
        <message>VE create initiated</message> 
        <password>152eyyBHO</password> 
    </pwd-response>  

DELETE-запрос на удаление сервера

<?php

    $mainStr = "http://109.120.166.3:4465/paci/v1.0/";
    $queryStr = 've/<ve-name>';
    $url = $mainStr.$queryStr;
    
    $process = curl_init();
    curl_setopt($process, CURLOPT_URL, $url);
    curl_setopt($process, CURLOPT_CUSTOMREQUEST, "DELETE");
    curl_setopt($process, CURLOPT_HEADER, 1);
    curl_setopt($process, CURLOPT_USERPWD, '<login>:<password>');
    curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
    
    $head = curl_exec($process);
    curl_close($process);    
    
?>

XML-ответ:

    * VE DELETE initiated

Некоммерческое тестирование Облачных серверов продолжится до 1 февраля 2013. Развитие сервиса во многом зависит от ваших отзывов. Присоединяйтесь [2]!

Для авторов лучших обзоров сервиса мы приготовили призы [4].

Наши предыдущие посты по теме

Облачные серверы от Infobox [1]

Ссылки на упоминаемые материалы

Официальная документация по использованию API в Parallels Automation for Cloud Infrastructure (PDF) [3]

Блог компании Infobox [5]

Автор: infobox

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/virtualizatsiya/21386

Ссылки в тексте:

[1] прошлый раз: http://habrahabr.ru/company/infobox/blog/159801/

[2] тестированию: http://infobox.ru/habr-cloud-test

[3] в официальной документации: http://download.pa.parallels.com/poa/5.4/doc/pdf/POA%20RESTful%20API%20Guide/paci-restful-api-guide-5.4.pdf

[4] приготовили призы: http://blog.infobox.ru/2012/11/24/iipphone5-za-obzory-oblaka/

[5] Блог компании Infobox: http://habrahabr.ru/company/infobox/blog/

[6] Источник: http://habrahabr.ru/post/160667/