
- All OpenStack projects have API versioning - Existing endpoints are now prefixed with /v1 - Still fully backward compatible with old endpoints - No HTTP redirects is used to avoid unexpected behaviors with existing clients Change-Id: If51f3291c44615991b3378b711dffacc1bd2591f
22 KiB
Welcome to the Almanach documentation!
Almanach stores the utilization of OpenStack resources (instances and volumes) for each tenant.
What is Almanach?
The main purpose of this software is to record the usage of the cloud resources of each tenants.
Almanach is composed of two parts:
- Collector: Listen for OpenStack events and store the relevant information in the database.
- REST API: Expose the information collected to external systems.
Requirements
- OpenStack infrastructure installed (Nova, Cinder...)
- MongoDB
- Python 2.7, 3.4 or 3.5
Generate config file with default values
tox -e genconfig
Command line usage
Start the API daemon:
almanach-api --config-file /etc/almanach/almanach.conf
Start the collector:
almanach-collector --config-file /etc/almanach/almanach.conf
Signal Handling
SIGINT
: force instantaneous terminationSIGTERM
: graceful termination of the serviceSIGHUP
: reload service
Authentication
Protocol
The authentication mechanism use the HTTP header
X-Auth-Token
to send a token. This token is validated
through Keystone or with the config file (private secret key).
GET /volume_types HTTP/1.1
X-Auth-Token: secret
Content-Type: application/json
{}
If the token is not valid, you will receive a
401 Not Authorized
response.
Private Key Authentication
The private secret key authentication is the default method. In your
config file, you have to define your private key in the field
auth_token
:
[auth]
strategy = private_key
private_key = secret
Keystone Authentication
The token will be validated with Keystone. To use this authentication
backend you have to define the authentication strategy to
keystone
.
[auth]
strategy = keystone
[keystone_authtoken]
# Keystone service username (string value)
username = almanach
# Keystone service password (string value)
password = secret
# Keystone service user domain ID (string value)
user_domain_id = default
# Keystone service user domain name (string value)
user_domain_name = Default
# Keystone service project domain name (string value)
project_domain_name = Default
# Keystone service project name (string value)
project_name = service
# Keystone API V3 admin endpoint (string value)
auth_url = http://127.0.0.1:35357/v3
RabbitMQ configuration
Each OpenStack services (Nova, Cinder, Neutron) need to be configured to send notifications to the Almanach queue.
For example with Nova, add the topic "almanach" in the config file
/etc/nova.conf
:
notification_topics=almanach
MongoDB configuration
Almanach requires a specific user to connect to the database. To create a new user, open a new MongoDB shell:
= new Mongo()
m .getDB("almanach").createUser({user: "almanach", pwd: "almanach", roles: [{role: "readWrite", db: "almanach"}]}) m
Devstack configuration
[[local|localrc]]
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
enable_plugin almanach https://git.openstack.org/openstack/almanach
Database entities
Each entity have at least these properties:
entity_id
: Unique id for the entity (UUID)entity_type
: "instance" or "volume"project_id
: Tenant unique ID (UUID)start
: Start date of the resource usageend
: End date of the resource usage ornull
if the resource still in use by the tenantname
: Resource name
Compute Object
{
"entity_id": "UUID",
"entity_type": "instance",
"project_id": "UUID",
"start": "2014-01-01T06:00:00.000Z",
"end": null,
"last_event": "2014-01-01T06:00:00.000Z",
"flavor": "MyFlavor1",
"os": {
"distro": "ubuntu",
"version": "14.04"
},
"name": "my-virtual-machine.domain.tld"
}
Block Storage Object
{
"entity_id": "UUID",
"entity_type": "volume",
"project_id": "UUID",
"start": "2014-01-01T06:00:00.000Z",
"end": null,
"last_event": "2014-01-01T06:00:00.000Z",
"volume_type": "MyVolumeType",
"size": 50,
"name": "my-virtual-machine.domain.tld-volume",
"attached_to": "UUID"
}
List of events handled
Almanach will process those events:
compute.instance.create.end
compute.instance.delete.end
compute.instance.resize.confirm.end
compute.instance.rebuild.end
volume.create.end
volume.delete.end
volume.resize.end
volume.attach.end
volume.detach.end
volume.update.end
volume.exists
volume_type.create
API v1 Documentation
GET /v1/volume_types
List volume types.
Status Codes:
- 200 OK Volume types exist
Example output:
api_examples/output/volume_types.json
GET /v1/volume_type/<volume_type_id>
Get a volume type.
Status Codes:
- 200 OK Volume type exist
- 400 Bad Request If request data has an invalid or missing field
- 404 Not Found If the volume type does not exist
Request:
Name In Type Description volume_type_id path uuid The Volume Type Uuid Example output:
api_examples/output/volume_type.json
POST /v1/volume_type
Create a volume type.
Status Codes:
- 201 Created Volume type successfully created
- 400 Bad Request If request data has an invalid or missing field
Request:
Name In Type Description type_id body uuid The Volume Type Uuid type_name body string The Volume Type Name Example input:
api_examples/input/create_volume_type-body.json
DELETE /v1/volume_type/<volume_type_id>
Delete a volume type.
Status Codes:
- 202 Accepted Volume type successfully deleted
- 404 Not Found If the volume type does not exist
Request:
Name In Type Description volume_type_id path uuid The Volume Type Uuid
GET /v1/info
Display information about the current version and entity counts.
Status Codes:
- 200 OK Service is available
Example output:
api_examples/output/info.json
POST /v1/project/<project_id>/instance
Create an instance.
Status Codes:
- 201 Created Instance successfully created
- 400 Bad Request If request data has an invalid or missing field
- 404 Not Found If tenant does not exist
Request:
Name In Type Description project_id path uuid The Tenant Uuid id body uuid The instance Uuid created_at body datetime Y-m-d H:M:S.f flavor body uuid The flavor Uuid os_type body string The OS type os_distro body string The OS distro os_version body string The OS version name body string The instance name Example input:
api_examples/input/create_instance-body.json
DELETE /v1/instance/<instance_id>
Delete an instance.
Status Codes:
- 202 Accepted Instance successfully deleted
- 400 Bad Request If request data has an invalid or missing field
- 404 Not Found If the instance does not exist
Request:
Name In Type Description instance_id path uuid The instance Uuid date body datetime Y-m-d H:M:S.f Example input:
api_examples/input/delete_instance-body.json
PUT /v1/instance/<instance_id>/resize
Re-size an instance.
Status Codes:
- 202 Accepted Instance successfully re-sized
- 400 Bad Request If request data has an invalid or missing field
- 404 Not Found If the instance does not exist
Request:
Name In Type Description instance_id path uuid The instance Uuid date body datetime Y-m-d H:M:S.f flavor body uuid The flavor Uuid Example input:
api_examples/input/resize_instance-body.json
PUT /v1/instance/<instance_id>/rebuild
Rebuild an instance.
Status Codes:
- 202 Accepted Instance successfully rebuilt
- 400 Bad Request If request data has an invalid or missing field
- 404 Not Found If the instance does not exist
Request:
Name In Type Description instance_id path uuid The instance Uuid rebuild_date body datetime Y-m-d H:M:S.f os_type body string The OS type os_distro body string The OS distro os_version body string The OS version Example input:
api_examples/input/rebuild_instance-body.json
GET /v1/project/<project_id>/instances
List instances for a tenant.
Status Codes:
- 200 OK Instances exist
- 400 Bad Request If request data has an invalid or missing field
- 404 Not Found If the tenant does not exist
Request:
Name In Type Description project_id path uuid The Tenant Uuid start path datetime Y-m-d H:M:S.f end path datetime Y-m-d H:M:S.f Example output:
api_examples/output/instances.json
POST /v1/project/<project_id>/volume
Create a volume.
Status Codes:
- 201 Created Volume successfully created
- 400 Bad Request If request data has an invalid or missing field
- 404 Not Found If tenant does not exist
Request:
Name In Type Description project_id path uuid The Tenant Uuid volume_id body uuid The volume Uuid start body datetime Y-m-d H:M:S.f volume_type body uuid The volume type Uuid size body string The volume size volume_name body string The volume name attached_to body uuid The instance uuid the volume is attached to Example input:
api_examples/input/create_volume-body.json
DELETE /v1/volume/<volume_id>
Delete a volume.
Status Codes:
- 202 Accepted Volume successfully deleted
- 400 Bad Request If request data has an invalid or missing field
- 404 Not Found If the volume does not exist
Request:
Name In Type Description volume_id path uuid The volume Uuid date body datetime Y-m-d H:M:S.f Example input:
api_examples/input/delete_volume-body.json
PUT /v1/volume/<volume_id>/resize
Re-size a volume.
Status Codes:
- 202 Accepted Volume successfully re-sized
- 400 Bad Request If request data has an invalid or missing field
- 404 Not Found If the volume does not exist
Request:
Name In Type Description volume_id path uuid The volume Uuid date body datetime Y-m-d H:M:S.f size body string The volume size Example input:
api_examples/input/resize_volume-body.json
PUT /v1/volume/<volume_id>/attach
Update the attachments for a volume.
Status Codes:
- 202 Accepted Volume successfully attached
- 400 Bad Request If request data has an invalid or missing field
- 404 Not Found If the volume does not exist
Request:
Name In Type Description volume_id path uuid The volume Uuid date body datetime Y-m-d H:M:S.f attachments body dict The volume attachments Example input:
api_examples/input/attach_volume-body.json
PUT /v1/volume/<volume_id>/detach
Detach a volume.
Status Codes:
- 202 Accepted Volume successfully detached
- 400 Bad Request If request data has an invalid or missing field
- 404 Not Found If the volume does not exist
Request:
Name In Type Description volume_id path uuid The volume Uuid date body datetime Y-m-d H:M:S.f attachments body dict The volume attachments Example input:
api_examples/input/detach_volume-body.json
GET /v1/project/<project_id>/volumes
List volumes for a tenant.
Status Codes:
- 200 OK Volumes exist
- 400 Bad Request If request data has an invalid or missing field
- 404 Not Found If the tenant does not exist
Request:
Name In Type Description project_id path uuid The Tenant Uuid start path datetime Y-m-d H:M:S.f end path datetime Y-m-d H:M:S.f Example output:
api_examples/output/volumes.json
GET /v1/project/<project_id>/entities
List entities for a tenant.
Status Codes:
- 200 OK Entities exist
- 400 Bad Request If request data has an invalid or missing field
- 404 Not Found If the tenant does not exist
Request:
Name In Type Description project_id path uuid The Tenant Uuid start path datetime Y-m-d H:M:S.f end path datetime Y-m-d H:M:S.f Example output:
api_examples/output/entities.json
PUT /v1/entity/instance/<instance_id>
Update an instance.
Status Codes:
- 202 Accepted Instance successfully updated
- 400 Bad Request If request data has an invalid or missing field
- 404 Not Found If the instance does not exist
Request:
Name In Type Description instance_id path uuid The instance Uuid start body datetime Y-m-d H:M:S.f end body datetime Y-m-d H:M:S.f Example input:
api_examples/input/update_instance_entity-body.json
Example output:
api_examples/output/update_instance_entity.json
HEAD /v1/entity/<entity_id>
Verify that an entity exists.
Status Codes:
- 200 OK Entity exists
- 404 Not Found If the entity does not exist
Request:
Name In Type Description entity_id path uuid The Entity Uuid Example output:
api_examples/output/entity.json
GET /v1/entity/<entity_id>
Get an entity.
Status Codes:
- 200 OK If the entity exists
- 404 Not Found If the entity does not exist
Request:
Name In Type Description entity_id path uuid The Entity Uuid Example output:
api_examples/output/entity.json