Trove/volume-data-snapshot-design
Allow user to perform volume snapshot
Description
Volumes Snapshots
This introduction provides a high level overview of the two basic resources offered by the OpenStack Block Storage service. The first is Volumes and the second is Snapshots which are derived from Volumes.
Volumes
Volumes are allocated block storage resources that can be attached to instances as secondary storage or they can be used as the root store to boot instances. Volumes are persistent R/W Block Storage devices most commonly attached to the Compute node via iSCSI.
Snapshots
A Snapshot in OpenStack Block Storage is a read-only point in time copy of a Volume. The Snapshot can be created from a Volume that is currently in use (via the use of '--force True') or in an available state. The Snapshot can then be used to create a new volume via create from snapshot.
Justification/Benefits:
Data could be backued in two ways: 1. Standart backup strategies (innobackupex, nodetoolsnapshot) + Swift container (already implemented). 2. Snapshot of the attached block storage (not implemented).
Basically, its the another way of backupin' data through standard OpenStack capabilities.
Impacts
Configuration
None, yet.
Database
Volume snapshot table:
- id: UUID (string) - instance_id: UUID (string) (i guess it could be optional) - volume_id: UUID (string) - datastore: UUID (string) - datastore_version: UUID (string) - created: Time - deleted: Time
Public API
______________________
Create data snapshot ______________________
CLI interface:
trove data-snapshot-create <instance>
HTTP POST: /{tenant_id}/instances/{instance_id}/create_snapshot
Request body:
"body": {}
Response object:
"volume_snapshot": {
"instance_id": "UUID" "volume_id": "UUID", "size": "100Mb" "datastore": "UUID" or "name", "datastore_version": "UUID" "created": "2011-01-22T13:25:27-06:00"
} ____________________
Apply data snapshot ____________________
CLI interface:
trove data-snapshot-apply <instance>
HTTP POST: /{tenant_id}/instances/{instance_id}/apply_snapshot
Request body:
"body": {
"data_snapshot": "UUID"
}
Response object:
None
__________________
List data snapshot __________________
CLI interface:
trove data-snapshot-list
HTTP GET: /{tenant_id}/instances/snapshot
Request body:
"body": {
"data_snapshot": "UUID"
}
Response object:
[
"data_snapshot_1": { "id": "UUID" "instance_id": "UUID" "volume_id": "UUID", }, "data_snapshot_2": { "id": "UUID" "instance_id": "UUID" "volume_id": "UUID", }
]
_____________________
Show data snapshot _____________________
CLI interface:
trove data-snapshot-show <data_snapshot>
HTTP GET: /{tenant_id}/instances/snapshot/{id}
Request body:
"body": {}
Response object:
"data_snapshot_1": { "id": "UUID" "instance_id": "UUID" "volume_id": "UUID", "size": "100Mb" "datastore": "UUID" or "name", "datastore_version": "UUID" "created": "2011-01-22T13:25:27-06:00" },
_____________________
Delete data snapshot _____________________
CLI interface:
trove data-snapshot-delete <data_snapshot>
HTTP POST: /{tenant_id}/instances/snapshot/{id}
Request body:
"body": {}
Response object:
None
Internal API
From trove-api to trove-taskamanger:
Message: create_data_snapshot Parameters: instance_id, volume_id Message type: cast
Message: apply_data_snapshot Parameters: instance_id, volume_id Message type: cast
Message: delete_data_snapshot Parameters: instance_id, volume_id Message type: cast
Guest Agent
From trove-taskamanger to trove-guestagent:
Message: apply_data_snapshot Parameters: device_path (where the volume mounted) Message type: cast