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

в 9:33, , рубрики: infobox, paci, Parallels, Блог компании Infobox, виртуализация, облако, Облачные вычисления, облачные серверы, облачные технологии, облачный хостинг, хостинг, метки: , , , , , , ,

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

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

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

Управление 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. Развитие сервиса во многом зависит от ваших отзывов. Присоединяйтесь!

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

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

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

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

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

Блог компании Infobox

Автор: infobox

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js