Статьи

Доступ к HP Cloud OpenStack Nova с использованием Python и запросов

Итак, моя просьба вступить в бесплатную и закрытую бета-версию новых облачных сервисов HP была мягко принята командой HP Cloud , и сегодня у меня наконец-то появилось время поиграть с OpenStack API в HP Cloud. Начну с первых впечатлений от сервиса:

Пользовательский интерфейс управления очень удобен, его дизайн очень похож на загрузочную версию Twitter, см. Скриншот ниже на странице «Compute» в разделе «Manage»:

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

Вот скриншот установленного размера экземпляра:

Поскольку они используют OpenStack, я действительно считаю, что им следовало импортировать словарь OpenStack в пользовательский интерфейс, и вместо того, чтобы называть его «Size», было бы разумнее использовать « Flavor ».

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

Другая важная информация, которую следует упомянуть, — это то, что доступ к экземплярам осуществляется через SSH с использованием сгенерированного ключа RSA, который они предоставляют вам.

Давайте сейчас углубимся в API OpenStack.

OpenStack API

Для доступа к API OpenStack вам потребуются учетные данные для аутентификации, службы HP Cloud предоставляют эти ключи в интерфейсе управления для каждой имеющейся зоны / службы, см. Снимок экрана ниже (с ключами, конечно же, анонимными ):

Теперь проверка подлинности OpenStack может выполняться в разных схемах, и я знаю, что HP поддерживает схему с использованием токенов. Я знаю, что многие клиенты уже поддерживают API OpenStack (у некоторых нет документации, у некоторых странный дизайн API и т. Д.), Но цель этого поста — показать, как легко было бы создать простой интерфейс для доступа API OpenStack с использованием Python и запросов (HTTP для людей!).

Давайте начнем определять нашу схему аутентификации с помощью подкласса Requests AuthBase :

class OpenStackAuth(AuthBase):
    def __init__(self, auth_user, auth_key):
        self.auth_key = auth_key
        self.auth_user = auth_user

def __call__(self, r):
    r.headers['X-Auth-User'] = self.auth_user
    r.headers['X-Auth-Key'] = self.auth_key
    return r

Как видите, мы определяем X-Auth-User и X-Auth-Key в заголовке запроса с параметрами. Этими параметрами являются соответственно идентификатор вашей учетной записи и ключ доступа, которые мы упоминали ранее. Теперь все, что вам нужно сделать, это сделать сам запрос, используя схему аутентификации, что довольно легко с помощью запросов:

ENDPOINT_URL = 'https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/'
ACCESS_KEY = 'Your Access Key'
ACCOUNT_ID = 'Your Account ID'
response = requests.get(ENDPOINT_URL, auth=OpenStackAuth(ACCOUNT_ID, ACCESS_KEY))

И все, вы завершили работу с механизмом аутентификации, используя всего несколько строк кода, и вот как запрос будет отправлен на сервер службы HP Cloud:

 Этот запрос отправляется на URL-адрес конечной точки HP Cloud (https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/). Посмотрим теперь, как сервер ответил на этот запрос аутентификации:

Вы можете показать этот ответ аутентификации, используя Запросы, распечатав атрибут заголовка объекта ответа на запрос. Вы можете видеть, что сервер ответил на наш запрос с двумя важными элементами заголовка: X-Server-Management-URL и X-Auth-Token. URL-адрес управления теперь является нашей новой конечной точкой, это URL-адрес, который мы должны использовать для дальнейших запросов к облачным службам HP, а X-Auth-Token — это токен аутентификации, который сервер генерирует на основе наших учетных данных, эти токены обычно действительны для 24 часа, хотя я не проверял это.

Теперь нам нужно снова создать подкласс класса Requests AuthBase, но на этот раз определить только токен аутентификации, который нам нужно использовать при каждом новом запросе, который мы собираемся сделать, на URL-адрес управления:

class OpenStackAuthToken(AuthBase):
    def __init__(self, request):
        self.auth_token = request.headers['x-auth-token']

def __call__(self, r):
    r.headers['X-Auth-Token'] = self.auth_token
    return r

Обратите внимание, что OpenStackAuthToken теперь получает ответный запрос в качестве параметра, копируя X-Auth-Token и устанавливая его в запросе.

Давайте использовать сервис из OpenStack API v.1.1, я собираюсь вызвать функцию API List Servers , проанализировать результаты с помощью JSON и затем отобразить результаты на экране:

# Get the management URL from the response header
mgmt_url = response.headers['x-server-management-url']

# Create a new request to the management URL using the /servers path
# and the OpenStackAuthToken scheme we created
r_server = requests.get(mgmt_url + '/servers', auth=OpenStackAuthToken(response))

# Parse the response and show it to the screen
json_parse = json.loads(r_server.text)
print json.dumps(json_parse, indent=4)

И вот что мы получаем в ответ на этот запрос:

{
    "servers": [
        {
            "id": 22378,
            "uuid": "e2964d51-fe98-48f3-9428-f3083aa0318e",
            "links": [
                {
                    "href": "https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/20817201684751/servers/22378",
                    "rel": "self"
                },
                {
                    "href": "https://az-1.region-a.geo-1.compute.hpcloudsvc.com/20817201684751/servers/22378",
                    "rel": "bookmark"
                }
            ],
            "name": "Server 22378"
        },
        {
            "id": 11921,
            "uuid": "312ff473-3d5d-433e-b7ee-e46e4efa0e5e",
            "links": [
                {
                    "href": "https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/20817201684751/servers/11921",
                    "rel": "self"
                },
                {
                    "href": "https://az-1.region-a.geo-1.compute.hpcloudsvc.com/20817201684751/servers/11921",
                    "rel": "bookmark"
                }
            ],
            "name": "Server 11921"
        }
    ]
}

И это все, теперь вы знаете, как использовать запросы и Python для использования OpenStack API. Если вы хотите прочитать больше информации об API и о том, как он работает, вы можете прочитать документацию здесь .