Proposed Smaug API v1.0

Easier link view  of the proposed API
http://editor.swagger.io/#/?import=http:%2F%2Ffpaste.org%2F300684%2F11781145%2Fraw%2F

Implements: blueprint api-data-model
Change-Id: I1eb3c4c80da74cfedf589b9446c55c80955c40d3
This commit is contained in:
Saggi Mizrahi 2015-11-12 18:40:30 +02:00 committed by Saggi Mizrahi
parent 409b447de1
commit 3cbe3390d3
5 changed files with 834 additions and 0 deletions

139
doc/source/api/bank.md Normal file
View File

@ -0,0 +1,139 @@
# Bank basics
*** :exclamation: This is still a work in progress ***
This document will describe the layout and algorithms used by smaug using the
bank interface.
## Abstract
Since Smaug want's to be able to store metadata in many locations (swift, mongodb, etc.)
we defined a simplified object store interface that we believe most backends will be able
to support without much work.
But the simplified interface doesn't describe how Smaug will do it's higher
level operations and how the higher level logic will be layed out in the object
store. This is why we need higher level logic defined explicitly so that later
we could use higher level bank functions knowing they are correct, safe and atomic.
## Layout
### Checkpoint directory
`/checkpoints/<checkpoint_id>/index.json`
#### Example content
```json
{
"trigger": {},
"started_at": "11 OCT 2237",
"status": "in progress",
"plan": {},
"plugins": {
"plugin_1": {
"name": "cinder volume",
"version": "1.2.3",
}
}
}
```
### Protection definition directory
`/checkpoints/<Checkpoint_id>/<protection_definition_id>/index.json`
#### Example content
```json
{
"plugin": "plugin_1",
"dependencies": {
"vol1": "<other_protection_defintion_id>"
}
}
```
### Protection definition plugin data directory
`/checkpoints/<checkpoint_id>/<protection_defintion_id>/plugin_data/*`
## Checkpoint Creation Process
Create new Checkpoint with id <CHECKPOINT-ID>;
1. Acquire checkpoint lock
* action acquire_lock
* id: `<CHECKPOINT-ID>`
2. Create checkpoint pointer
* action: write_object
* path: `/indices/unfinished_checkpoints/<CHECKPOINT-ID>`,
* buffer: `<CHECKPOINT-ID>`
3. Create checkpoint
* action: write_object
* path: `/checkpoints/<CHECKPOINT-ID>/index.json`,
* buffer:
```json
{
"smaug_version": "1.0.0",
"status": "in_progress",
"plugins": {}
}
```
4. Run plugins
5. Checkpoint finished but indices not yet created
* action: write_object
* path: `/checkpoints/<CHECKPOINT-ID>/index.json`,
* buffer:
```json
{
"smaug_version": "1.0.0",
"status": "creating_indices",
"plugins": {}
}
```
6. Create index 'plan' (Example, there could be any number of indexes)
* action: write_object
* path: `/indices/by_plan/<PLAN-ID>/<CHECKPOINT-ID>`
* buffer: `<CHECKPOINT-ID>`
7. Remove checkpoint pointer
* action: delete_object
* path: `/indices/unfinished_checkpoints/<CHECKPOINT-ID>`
8. Release checkpoint lock
* action: release_lock
* id: `<CHECKPOINT-ID>`
## Delete Checkpoint
1. Acquire checkpoint lock
* action acquire_lock
* id: `<CHECKPOINT-ID>`
2. Create checkpoint pointer
* action: write_object
* path: `/indices/unfinished_checkpoints/<CHECKPOINT-ID>`,
* buffer: `<CHECKPOINT-ID>`
3. Mark transaction as being deleted
* action: write_object
* path: `/checkpoints/<CHECKPOINT-ID>/index.json`,
* buffer:
```json
{
"smaug_version": "1.0.0",
"status": "deleting",
"plugins": {}
}
```
4. Remove indices
- Remove index 'plan' (Example, there could be any number of indexes)
* action: delete_object
* path: `/indices/by_plan/<PLAN-ID>/<CHECKPOINT-ID>`
6. Run plugins
7. Delete checkpoint file
* action: delete_object
* path: `/checkpoints/<CHECKPOINT-ID>/index.json`,
8. Remove checkpoints pointer
* action: delete_object
* path: `/indices/unfinished_checkpoints/<CHECKPOINT-ID>`
9. Release checkpoint lock
* action: release_lock
* id: `<CHECKPOINT-ID>`

View File

@ -0,0 +1,146 @@
@startuml
title "Smaug API model"
class Protectable {
name: string
instances: []Resource
is_root: bool
}
Protectable --> Resource: lists
class Resource {
id: UUID
type: ResourceType
schema: JSONSchema
dependent_resources: []Resource
}
class Trigger {
}
class TimedTrigger extends Trigger {
}
class EventTrigger extends Trigger {
}
class Checkpoint {
id: UUID
tenant_id: UUID
plan: ProtectionPlan
status: string
started_at: DateTime
}
Checkpoint *-> ProtectionPlan: stores a copy of
class AutomaticOperation {
id: UUID
name: string
comments: string
tenant_id: UUID
}
class PlanRetention extends AutomaticOperation {
daily: bool
weekly: bool
monthly: bool
yearly: bool
protection_plan: ProtectionPlan
}
class ScheduledOperation <<abstract>> extends AutomaticOperation {
trigger: Trigger
}
ScheduledOperation *- Trigger: when should the operation should trigger
class BackupPlan extends ScheduledOperation {
protection_plan: ProtectionPlan
}
BackupPlan *--> ProtectionPlan
class DeleteCheckpoints extends ScheduledOperation {
query: string
protection_provider: ProtectionProvider
}
class ProtectionProvider {
name: string
description: string
managed_type: string
extended_info_schema: [ResourceType]JSONSchema
options_schema: [ResourceType]JSONSchema
checkpoints: []Checkpoint
}
ProtectionProvider o-> Checkpoint: lists
class ProtectionPlan {
id: UUID
is_enabled: boolean
name: string
comments: string
resources: []Resource
protection_provider: ProtectionProvider
parameters: dict
Start()
Suspend()
}
ProtectionPlan "1" *--> "N" Resource: aggragates
ProtectionPlan -> ProtectionProvider
class RestoreTarget {
keystone_uri: URI
}
class Restoration {
template: string
target: RestoreTarget
provider: ProtectionProvider
checkpoint: Checkpoint
started_at: string
}
Restoration *-> RestoreTarget: restores to
@enduml
@startuml
package "Plugin Examples" {
interface BackupPlugin <<action set>> {
<<protect>> create_backup(resource: Resource, bank: Bank)
<<delete>> delete_backup(backup: Backup)
}
interface ReplicationPlugin <<action set>> {
<<enable>> start_replication(resource: Resource, replicationType: eReplicationType)
<<protect>> create_snapshot_from_replicated_target(resource: Resource, replicationType: eReplicationType)
<<delete>> delete_snapshot(resource: Resource, replicationType: eReplicationType)
<<disable>> stop_replication(resource: Resource)
}
ReplicationPlugin -> eReplicationType
interface SnapshotPlugin <<action set>> {
<<protect>> create_snapshot(resource: Resource)
<<delete>> delete_snapshot(snapshot: Snapshot)
}
enum eReplicationType {
hypervisor
cinder
}
}
@enduml

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 32 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@ -0,0 +1,547 @@
swagger: '2.0'
info:
title: Smaug API
description: Protect all you hold dear
version: 0.99.0
host: api.smaug.nowhere.com
schemes:
- https
basePath: /v1
produces:
- application/json
paths:
/providers:
get:
summary: Providers
description: |
The Providers endpoint returns information about the providers
offered at a given service. All providers need to be configuered
first by the admin.
parameters:
- $ref: '#/parameters/nameFilterParam'
- $ref: '#/parameters/sortParam'
- $ref: '#/parameters/limitParam'
- $ref: '#/parameters/markerParam'
tags:
- Protection Provider
responses:
'200':
description: An array of providers
schema:
type: array
items:
$ref: '#/definitions/Provider'
default:
description: Unexpected error
schema:
$ref: '#/definitions/Error'
/providers/{provider_id}/checkpoints:
get:
summary: Checkpoints
description: |
The Checkpoints endpoint returns information about the checkpoints
offered at a given provider.
parameters:
- $ref: '#/parameters/provider_idParam'
- name: tenant_id
in: query
description: |
Specifies the ID of the tenant that owns this entity
type: string
format: uuid
required: false
- $ref: '#/parameters/sortParam'
- $ref: '#/parameters/limitParam'
- $ref: '#/parameters/markerParam'
tags:
- Protection Provider
- Checkpoint
responses:
'200':
description: An array of checkpoints
schema:
type: object
properties:
checkpoints:
type: array
items:
$ref: '#/definitions/Checkpoint'
default:
description: Unexpected error
schema:
$ref: '#/definitions/Error'
post:
summary: Checkpoints
description: |
The Checkpoints endpoint creates a checkpoint
at a given provider.
parameters:
- $ref: '#/parameters/provider_idParam'
- name: checkpoint
in: body
required: true
schema:
$ref: '#/definitions/Checkpoint'
tags:
- Protection Provider
- Checkpoint
responses:
'200':
description: Checkpoint created
schema:
$ref: '#/definitions/Checkpoint'
default:
description: Unexpected error
schema:
$ref: '#/definitions/Error'
/providers/{provider_id}/checkpoints/{checkpoint_id}:
delete:
summary: Checkpoints
description: |
The Checkpoints endpoint deletes a checkpoint
at a given provider.
parameters:
- $ref: '#/parameters/provider_idParam'
- $ref: '#/parameters/checkpoint_idParam'
tags:
- Protection Provider
- Checkpoint
responses:
'200':
description: Checkpoint deleted
default:
description: Unexpected error
schema:
$ref: '#/definitions/Error'
/{tenant_id}/plans:
get:
summary: Get protection plans
description: |
The Plans endpoint returns information about the protection plans
offered for the given tenant.
parameters:
- $ref: '#/parameters/tenantParam'
- $ref: '#/parameters/nameFilterParam'
- $ref: '#/parameters/sortParam'
- $ref: '#/parameters/limitParam'
- $ref: '#/parameters/markerParam'
tags:
- Tenant API
- Protection Plan
responses:
'200':
description: An array of protection plans
schema:
type: object
properties:
plans:
type: array
items:
$ref: '#/definitions/ProtectionPlan'
default:
description: Unexpected error
schema:
$ref: '#/definitions/Error'
post:
summary: Create a plan
description: |
Create a new plan. The update will create a new revision for
the plan.
tags:
- Tenant API
- Protection Plan
parameters:
- $ref: '#/parameters/tenantParam'
- name: plan
in: body
required: true
schema:
$ref: '#/definitions/ProtectionPlan'
responses:
'200':
description: The new checkpoint
schema:
$ref: '#/definitions/ProtectionPlan'
default:
description: Unexpected error
schema:
$ref: '#/definitions/Error'
/{tenant_id}/plans/{plan_id}:
get:
summary: Protection Plan
description: |
The Plan endpoint returns information about a specific plan.
parameters:
- $ref: '#/parameters/tenantParam'
- $ref: '#/parameters/plan_idParam'
tags:
- Tenant API
- Protection Plan
responses:
'200':
description: the protection plan
schema:
$ref: '#/definitions/ProtectionPlan'
default:
description: Unexpected error
schema:
$ref: '#/definitions/Error'
delete:
summary: Protection Plan
description: |
The Plan endpoint deletes a specific plan.
parameters:
- $ref: '#/parameters/tenantParam'
- $ref: '#/parameters/plan_idParam'
tags:
- Tenant API
- Protection Plan
responses:
'200':
description: the protection plan
default:
description: Unexpected error
schema:
$ref: '#/definitions/Error'
/resource_types:
get:
summary: Resource Types
description: |
The returns all the available resource types.
parameters:
- $ref: '#/parameters/nameFilterParam'
- $ref: '#/parameters/sortParam'
- $ref: '#/parameters/limitParam'
- $ref: '#/parameters/markerParam'
tags:
- Resource
responses:
'200':
description: The available resource types
schema:
type: object
properties:
resource_types:
type: array
items:
$ref: '#/definitions/ResourceTypeInfo'
default:
description: Unexpected error
schema:
$ref: '#/definitions/Error'
/resource_types/{resource_type}:
get:
summary: Resource Type
description: |
The returns all the available resource types.
parameters:
- $ref: '#/parameters/resource_typeParam'
tags:
- Resource
responses:
'200':
description: The resource type
schema:
$ref: '#/definitions/ResourceTypeInfo'
default:
description: Unexpected error
schema:
$ref: '#/definitions/Error'
/resource_types/{resource_type}/instances:
get:
summary: Resource Instances
description: |
The returns all the available instances for the resource type.
parameters:
- $ref: '#/parameters/resource_typeParam'
- $ref: '#/parameters/nameFilterParam'
- $ref: '#/parameters/sortParam'
- $ref: '#/parameters/limitParam'
- $ref: '#/parameters/markerParam'
tags:
- Resource
responses:
'200':
description: The available instances for the resource type.
schema:
type: object
properties:
resources:
type: array
items:
$ref: '#/definitions/Resource'
default:
description: Unexpected error
schema:
$ref: '#/definitions/Error'
/{tenant_id}/scheduled_operations:
get:
summary: Scheduled Operations
description: |
Scheduled operations are operations that will be executed when
a specific trigger is triggered.
parameters:
- $ref: '#/parameters/tenantParam'
- $ref: '#/parameters/nameFilterParam'
- $ref: '#/parameters/sortParam'
- $ref: '#/parameters/limitParam'
- $ref: '#/parameters/markerParam'
tags:
- Tenant API
- Scheduled Operation
responses:
'200':
description: An array of scheduled operations
schema:
type: object
properties:
scheduled_operations:
type: array
items:
$ref: '#/definitions/ScheduledOperation'
default:
description: Unexpected error
schema:
$ref: '#/definitions/Error'
post:
summary: Create an scheduled operation
description: |
Create a new scheduled operation.
tags:
- Tenant API
- Scheduled Operation
parameters:
- $ref: '#/parameters/tenantParam'
- name: schedlued_operation
in: body
required: true
schema:
$ref: '#/definitions/ScheduledOperation'
responses:
'200':
description: The new scheduled operation
schema:
$ref: '#/definitions/ScheduledOperation'
default:
description: Unexpected error
schema:
$ref: '#/definitions/Error'
definitions:
Provider:
type: object
required: [ name ]
properties:
id:
readOnly: true
type: string
format: UUID
description: Unique identifier representing a specific protection provider.
description:
type: string
description: Description of provider.
name:
type: string
description: Display name of provider.
Checkpoint:
type: object
properties:
id:
readOnly: true
type: string
format: UUID
description: Unique identifier representing a specific protection provider.
description:
type: string
description: Description of provider.
Resource:
type: object
properties:
type:
$ref: '#/definitions/ResourceType'
readOnly: true
id:
readOnly: true
type: string
ProtectionPlan:
type: object
required: [ name, protection_provider_id, resources ]
properties:
id:
readOnly: true
type: string
format: UUID
description: Unique identifier representing a specific protection protection plan.
name:
type: string
description: Display name of plan.
comments:
type: string
description: Comments about the plan.
resources:
type: array
items:
$ref: '#/definitions/Resource'
protection_provider_id:
type: string
format: UUID
description: |
Unique identifier representing a specific protection provider that
will store checkpoints for this protection plan.
parameters:
type: object
description: TODO
ResourceType:
type: string
format: Heat Type String
example: "OS::Nova::Server"
description: |
Name of the resource type. When available the types that are defined by Heat
are used.
ResourceTypeInfo:
type: object
properties:
name:
$ref: '#/definitions/ResourceType'
is_root:
type: boolean
description: |
Defines whether this type has any dependencies or not. Useful for
UIs.
dependent_types:
type: array
description: |
List of types that might depend on this type. For example an
"OS::Nova::Server" has "OS::Cinder::Volume" as a dependent type.
items:
$ref: '#/definitions/ResourceType'
OperationDefinition:
type: object
discriminator: type
required: [ type ]
properties:
id:
type: string
format: UUID
description: |
Unique identifier representing a specific operation definition.
type:
type: string
description: |
Type of the operation. This defines what kind of operation this
object defines the arguments for.
ProtectOperationDefinition:
description: |
Opration definition for protect operation.
allOf:
- $ref: '#/definitions/OperationDefinition'
- type: object
properties:
protection_plan_id:
type: string
format: UUID
required: [ protection_plan_id ]
ScheduledOperation:
type: object
properties:
id:
type: string
format: UUID
description: |
Unique identifier representing a specific scheduled operation.
name:
type: string
description: Display name of scheduled operation.
comments:
type: string
description: Comments about the scheduled operation.
trigger_id:
type: string
format: UUID
operation_definition:
$ref: '#/definitions/OperationDefinition'
Error:
type: object
properties:
code:
type: integer
format: int32
message:
type: string
fields:
type: string
parameters:
sortParam:
name: sort
in: query
description: |
Comma-separated list of sort keys and optional sort directions in the
form of '&lt;key&gt;[&#58;&lt;direction&gt;]`. A valid direction is asc
(ascending) or desc (descending).
required: false
type: string
limitParam:
name: limit
in: query
description: |
Requests a specified page size of returned items from the query.
Returns a number of items up to the specified limit value.
Use the limit parameter to make an initial limited request and use the
ID of the last-seen item from the response as the marker parameter value
in a subsequent limited request.
type: integer
format: int64
markerParam:
name: marker
in: query
description: |
Specifies the ID of the last-seen item. Use the limit parameter to make
an initial limited request and use the ID of the last-seen item from the
response as the marker parameter value in a subsequent limited request.
type: string
tenantParam:
name: tenant_id
in: path
description: |
Specifies the ID of the tenant that owns this entity
type: string
format: uuid
required: true
nameFilterParam:
name: name
in: query
format: regex
description: name of the entity. Could be a regex pattern.
required: false
type: string
provider_idParam:
name: provider_id
type: string
format: uuid
required: true
in: path
description: id of the provider.
plan_idParam:
name: plan_id
type: string
format: uuid
required: true
in: path
description: id of the plan.
checkpoint_idParam:
name: checkpoint_id
type: string
format: uuid
required: true
in: path
description: id of the checkpoint.
resource_typeParam:
name: resource_type
type: string
format: Heat Type String
required: true
in: path
description: the resource type.