This blog is part of my series on Openstack Juno. In this blog, I will cover different management interfaces to Openstack. Following are the different management interfaces available.
- Horizon web interface
- CLI interface to each service. CLI interface is provided by Python script. Internally, the script calls the REST interface.
- REST interface. This is accessible either through Curl or a POSTMAN kind of client.
- Programmatic interface using Python SDK.
Horizon interface:
On the host where stacking is done, webserver runs on port 80 and all Openstack services can be configured using this interface. Login to Horizon can be done with either tenant userid or admin userid. Based on the userid, privileges are granted.
CLI interface:
CLI interface is provided for each service. Nova services are accessible through “nova” client, Swift services are accessible with “swift” client and so on. Following example lists running VMs.
$ nova list +--------------------------------------+-------------------------------------------------+--------+------------+-------------+------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+-------------------------------------------------+--------+------------+-------------+------------------+ | 2dc7c43f-f7c5-4577-b286-7db2a22b57be | cirrostest-2dc7c43f-f7c5-4577-b286-7db2a22b57be | ACTIVE | - | Running | private=10.0.0.3 | | 554d8453-cd74-4223-ada6-f330ac8ed345 | cirrostest-554d8453-cd74-4223-ada6-f330ac8ed345 | ACTIVE | - | Running | private=10.0.0.2 | +--------------------------------------+-------------------------------------------------+--------+------------+-------------+------------------+
To install and use CLI interface, there are 2 options:
Local devstack machine:
Source openrc file.
cd devstack; source openrc admin demo
From remote machine:
Download the appropriate client.
sudo pip install python-novaclient sudo pip install python-neutronclient
Download the openrc file from the machine where openstack is running(can be done from access and security tab) and export to the machine where we need to access openstack clients. Source the openrc file and then we should be able to execute the cli commands.
REST interface:
To access the REST interface, authentication token needs to be obtained. The command below gives the authentication token and list of endpoints. If we are executing on the remote machine, we need to replace the localhost with the machine ip address.
curl -d '{"auth":{"passwordCredentials":{"username": "admin", "password": "openstack"},"tenantName": "demo"}}' -H "Content-Type: application/json" http://localhost:5000/v2.0/tokens | python -m json.tool
Following output is relevant where we can get the tokenid and tenantid.The authentication token will expire at the time mentioned and after that we need to get a new token.
"token": {
"audit_ids": [
"z52Me0kxQ62iI_En64CTBA"
],
"expires": "2015-02-18T12:07:13Z",
"id": "ae767b7f8cd143b29039fce7737606b3", -> authentication token
"issued_at": "2015-02-18T11:07:13.478911",
"tenant": {
"description": null,
"enabled": true,
"id": "10f9e3f2d79740af88530902c4f2a039", -> tenant id
"name": "demo"
}
},
Using the tenantid and authentication key, lets get the list of flavors.
$ curl http://localhost:8774/v2/10f9e3f2d79740af88530902c4f2a039/flavors -H 'X-Auth-Token: ae767b7f8cd143b29039fce7737606b3' | python -m json.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1920 100 1920 0 0 10471 0 --:--:-- --:--:-- --:--:-- 10491
{
"flavors": [
{
"id": "1",
"links": [
{
"href": "http://localhost:8774/v2/10f9e3f2d79740af88530902c4f2a039/flavors/1",
"rel": "self"
},
{
"href": "http://localhost:8774/10f9e3f2d79740af88530902c4f2a039/flavors/1",
"rel": "bookmark"
}
],
"name": "m1.tiny"
},
.
.
Lets get list of servers:
$ curl http://localhost:8774/v2/10f9e3f2d79740af88530902c4f2a039/servers -H 'X-Auth-Token: ae767b7f8cd143b29039fce7737606b3' | python -m json.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 775 100 775 0 0 3596 0 --:--:-- --:--:-- --:--:-- 3604
{
"servers": [
{
"id": "2dc7c43f-f7c5-4577-b286-7db2a22b57be",
"links": [
{
"href": "http://localhost:8774/v2/10f9e3f2d79740af88530902c4f2a039/servers/2dc7c43f-f7c5-4577-b286-7db2a22b57be",
"rel": "self"
},
{
"href": "http://localhost:8774/10f9e3f2d79740af88530902c4f2a039/servers/2dc7c43f-f7c5-4577-b286-7db2a22b57be",
"rel": "bookmark"
}
],
"name": "cirrostest-2dc7c43f-f7c5-4577-b286-7db2a22b57be"
},
{
"id": "554d8453-cd74-4223-ada6-f330ac8ed345",
"links": [
{
"href": "http://localhost:8774/v2/10f9e3f2d79740af88530902c4f2a039/servers/554d8453-cd74-4223-ada6-f330ac8ed345",
"rel": "self"
},
{
"href": "http://localhost:8774/10f9e3f2d79740af88530902c4f2a039/servers/554d8453-cd74-4223-ada6-f330ac8ed345",
"rel": "bookmark"
}
],
"name": "cirrostest-554d8453-cd74-4223-ada6-f330ac8ed345"
}
]
}
Postman client:
REST interface can be accessed through Postman client. Postman client for Chrome browsers can be downloaded from here. We need the tenantid and authentication token obtained in the previous step. To get list of servers, do:
http://localhost:8774/v2/tenantid/servers headers: X-Auth-Token value: auth token
For this case:
URL: http://localhost:8774/v2/10f9e3f2d79740af88530902c4f2a039/servers GET request Headers: X-Auth-Token, ae767b7f8cd143b29039fce7737606b3
Results will be seen in the body section.
Programmatic interface:
Openstack provides programmatic interface using Python SDK. This makes it easier to do automation. The libraries are common between the CLI and SDK. The packages installed for the CLI client is enough for the SDK. Following is a simple program to get list of flavors and servers.
from os import environ as env
from novaclient.client import Client
def get_nova_credentials_v2():
d = {}
d['version'] = '2'
d['username'] = env['OS_USERNAME']
d['api_key'] = env['OS_PASSWORD']
d['auth_url'] = env['OS_AUTH_URL']
d['project_id'] = env['OS_TENANT_NAME']
return d
credentials = get_nova_credentials_v2()
nova_client = Client(**credentials)
print "--- Servers ---"
print(nova_client.servers.list())
print "--- Flavors ---"
print(nova_client.flavors.list())
Lets run this program.
$ python nova_test.py --- Servers --- [, ] --- Flavors --- [, , , , , , , ]
References: