Proposed Smaug API v1.0

Easier link view  of the proposed API
http://editor.swagger.io/#/?import=http:%2F%2Ffpaste.org%2F305493%2F51319380%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 098ff5df31
6 changed files with 2252 additions and 0 deletions

View File

@ -0,0 +1,470 @@
# Smaug API #
----------
## Protection Provider ##
### List Protection Providers ###
> **get** : /v1/providers
#### Response JSON ####
```json
[
{
"id": "2220f8b1-975d-4621-a872-fa9afb43cb6c",
"name": "OS Infra Provider",
"description": "This provider uses OpenStack's own services (swift, cinder) as storage",
"extended_info_schema": {
"OS::Nova::Cinder": {
"type": "object",
"properties": {
"use_cbt": {
"type": "boolean",
"title": "Use CBT",
"description": "Use Changed Block Tracking when backing up this volume"
}
}
}
}
},
]
```
### Show Protection Provider ###
> **get** : /v1/providers/{provider_id}
#### Response JSON ####
```json
{
"id": "2220f8b1-975d-4621-a872-fa9afb43cb6c",
"name": "OS Infra Provider",
"description": "This provider uses OpenStack's own services (swift, cinder) as storage",
"extended_info_schema": {
"OS::Nova::Cinder": {
"type": "object",
"properties": {
"use_cbt": {
"type": "boolean",
"title": "Use CBT",
"description": "Use Changed Block Tracking when backing up this volume"
}
}
}
}
}
```
----------
## Checkpoint ##
### List Checkpoints ###
> **get** : /v1/providers/{provider_id}/checkpoints
#### Response JSON ####
```json
[
{
"id": "2220f8b1-975d-4621-a872-fa9afb43cb6c",
"project_id": "446a04d8-6ff5-4e0e-99a4-827a6389e9ff",
"status": "committed",
"protection_plan": {
"id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398",
"name": "My 3 tier application",
"resources": [
{
"id": "64e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Nova::Server"
},
{
"id": "61e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Cinder::Volume"
},
{
"id": "62e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Cinder::Volume"
}
],
"protection_provider_id": "efc6a88b-9096-4bb6-8634-cda182a6e12a"
}
},
]
```
### Create Checkpoint ###
> **post** : /v1/providers/{provider_id}/checkpoints
#### Response JSON ####
```json
{
"id": "2220f8b1-975d-4621-a872-fa9afb43cb6c",
"project_id": "446a04d8-6ff5-4e0e-99a4-827a6389e9ff",
"status": "committed",
"protection_plan": {
"id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398",
"name": "My 3 tier application",
"resources": [
{
"id": "64e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Nova::Server"
},
{
"id": "61e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Cinder::Volume"
},
{
"id": "62e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Cinder::Volume"
}
]
},
"protection_provider_id": "efc6a88b-9096-4bb6-8634-cda182a6e12a"
}
```
### Show Checkpoint ###
> **get** : /v1/providers/{provider_id}/checkpoints/{checkpoint_id}
#### Response JSON ####
```json
{
"id": "2220f8b1-975d-4621-a872-fa9afb43cb6c",
"project_id": "446a04d8-6ff5-4e0e-99a4-827a6389e9ff",
"status": "committed",
"protection_plan": {
"id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398",
"name": "My 3 tier application",
"resources": [
{
"id": "64e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Nova::Server"
},
{
"id": "61e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Cinder::Volume"
},
{
"id": "62e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Cinder::Volume"
}
]
},
"protection_provider_id": "efc6a88b-9096-4bb6-8634-cda182a6e12a"
}
```
### Delete Checkpoint ###
> **delete** : /v1/providers/{provider_id}/checkpoints/{checkpoint_id}
#### Response JSON ####
```json
None
```
----------
## Plan ##
### List Plans ###
> **get** : /v1/{project_id}/plans
#### Response JSON ####
```json
[
{
"id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398",
"name": "My 3 tier application",
"resources": [
{
"id": "64e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Nova::Server"
},
{
"id": "61e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Cinder::Volume"
},
{
"id": "62e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Cinder::Volume"
}
],
"protection_provider_id": "efc6a88b-9096-4bb6-8634-cda182a6e12a"
},
]
```
### Create Plan ###
> **post** : /v1/{project_id}/plans
#### Response JSON ####
```json
{
"id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398",
"name": "My 3 tier application",
"resources": [
{
"id": "64e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Nova::Server"
},
{
"id": "61e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Cinder::Volume"
},
{
"id": "62e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Cinder::Volume"
}
],
"protection_provider_id": "efc6a88b-9096-4bb6-8634-cda182a6e12a"
}
```
### Show Plan ###
> **get** : /v1/{project_id}/plans/{plan_id}
#### Response JSON ####
```json
{
"id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398",
"name": "My 3 tier application",
"resources": [
{
"id": "64e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Nova::Server"
},
{
"id": "61e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Cinder::Volume"
},
{
"id": "62e51e85-4f31-441f-9a5d-6e93e3196628",
"type": "OS::Cinder::Volume"
}
],
"protection_provider_id": "efc6a88b-9096-4bb6-8634-cda182a6e12a"
}
```
### Delete Plan ###
> **delete** : /v1/{project_id}/plans/{plan_id}
#### Response JSON ####
```json
None
```
----------
## Protectable ##
### List Protectable Types ###
> **get** : /v1/protectables
#### Response JSON ####
```json
[
"OS::Nova::Server",
"OS::Cinder::Volume"
]
```
### Show Protectable Type ###
> **get** : /v1/protectables/{protectable_type}
#### Response JSON ####
```json
{
"name": "OS::Nova::Server",
"dependent_types": [
"OS::Cinder::Volume",
"OS::Glance::Image",
]
}
```
### List Protectable Instances ###
> **get** : /v1/protectables/{protectable_type}/instances
#### Response JSON ####
```json
[
{
"id": "557d0cd2-fd8d-4279-91a5-24763ebc6cbc",
"type": "OS::Nova::Server",
"dependent_resources": [
{
"id": "5fad94de-2926-486b-ae73-ff5d3477f80d",
"type": "OS::Cinder::Volume"
}
]
},
]
```
----------
## Scheduled Operation ##
### List Scheduled Operations ###
> **get** : /v1/{project_id}/scheduled_operations
#### Response JSON ####
```json
[
{
"id": "1a2c0c3d-f402-4cd8-b5db-82e85cb51fad",
"name": "My scheduled operation",
"project_id": "23902b02-5666-4ee6-8dfe-962ac09c3994",
"operation_type": "protect",
"operation_definition": {
"trigger_id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398",
"plan_id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398"
}
},
]
```
### Create Scheduled Operation ###
> **post** : /v1/{project_id}/scheduled_operations
#### Response JSON ####
```json
{
"id": "1a2c0c3d-f402-4cd8-b5db-82e85cb51fad",
"name": "My scheduled operation",
"project_id": "23902b02-5666-4ee6-8dfe-962ac09c3994",
"operation_type": "protect",
"operation_definition": {
"trigger_id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398",
"plan_id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398"
}
}
```
### Show Scheduled Operation ###
> **get** : /v1/{project_id}/scheduled_operations/{scheduled_operation_id}
#### Response JSON ####
```json
{
"id": "1a2c0c3d-f402-4cd8-b5db-82e85cb51fad",
"name": "My scheduled operation",
"project_id": "23902b02-5666-4ee6-8dfe-962ac09c3994",
"operation_type": "protect",
"operation_definition": {
"trigger_id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398",
"plan_id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398"
}
}
```
### Delete Scheduled Operation ###
> **delete** : /v1/{project_id}/scheduled_operations/{scheduled_operation_id}
#### Response JSON ####
```json
None
```
----------
## Restoration ##
### List Restoration ###
> **get** : /v1/{project_id}/restorations
#### Response JSON ####
```json
[
{
"id": "36ea41b2-c358-48a7-9117-70cb7617410a",
"project_id": "586cc6ce-e286-40bd-b2b5-dd32694d9944",
"provider_id": "2220f8b1-975d-4621-a872-fa9afb43cb6c",
"checkpoint_id": "09edcbdc-d1c2-49c1-a212-122627b20968",
"restore_target": "192.168.1.2:35357/v2.0",
"parameters": {
"username": "admin"
},
"status": "SUCCESS"
},
]
```
### Create Restoration ###
> **post** : /v1/{project_id}/restorations
#### Response JSON ####
```json
{
"id": "36ea41b2-c358-48a7-9117-70cb7617410a",
"project_id": "586cc6ce-e286-40bd-b2b5-dd32694d9944",
"provider_id": "2220f8b1-975d-4621-a872-fa9afb43cb6c",
"checkpoint_id": "09edcbdc-d1c2-49c1-a212-122627b20968",
"restore_target": "192.168.1.2:35357/v2.0",
"parameters": {
"username": "admin"
},
"status": "IN PROGRESS"
}
```
### Show Restoration ###
> **get** : /v1/{project_id}/restorations/{restoration_id}
#### Response JSON ####
```json
{
"id": "36ea41b2-c358-48a7-9117-70cb7617410a",
"project_id": "586cc6ce-e286-40bd-b2b5-dd32694d9944",
"provider_id": "2220f8b1-975d-4621-a872-fa9afb43cb6c",
"checkpoint_id": "09edcbdc-d1c2-49c1-a212-122627b20968",
"restore_target": "192.168.1.2:35357/v2.0",
"parameters": {
"username": "admin"
},
"status": "IN PROGRESS"
}
```
----------
## Trigger ##
### List Triggers ###
> **get** : /v1/{project_id}/triggers
#### Response JSON ####
```json
[
{
"id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398",
"name": "My backup trigger",
"type": "TimeTrigger",
"properties": {
"start_time": "2015-12-17",
"trigger_window": "60",
"recurrence": ""
}
},
]
```
### Create Trigger ###
> **post** : /v1/{project_id}/triggers
#### Response JSON ####
```json
{
"id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398",
"name": "My backup trigger",
"type": "TimeTrigger",
"properties": {
"start_time": "2015-12-17",
"trigger_window": "60",
"recurrence": ""
}
}
```
### Show Trigger ###
> **get** : /v1/{project_id}/triggers/{trigger_id}
#### Response JSON ####
```json
{
"id": "2a9ce1f3-cc1a-4516-9435-0ebb13caa398",
"name": "My backup trigger",
"type": "TimeTrigger",
"properties": {
"start_time": "2015-12-17",
"trigger_window": "60",
"recurrence": ""
}
}
```
### Delete Trigger ###
> **delete** : /v1/{project_id}/triggers/{trigger_id}
#### Response JSON ####
```json
None
```

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

@ -0,0 +1,141 @@
# 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>/<resource_id>/index.json`
#### Example content
```json
{
"name": "vm",
"id": "8a562ed6-81ff-4bda-9672-2a8c49f130c3",
"dependent_resources": [
"92b022d9-cca4-4d02-b7fb-6cec9183d9f2",
"b081d472-023c-4a98-b57b-f2013996739b"
]
}
```
### Protection definition plugin data directory
`/checkpoints/<checkpoint_id>/<resource_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,145 @@
@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
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

View File

@ -0,0 +1,211 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="874px" style="width:1489px;height:874px;" version="1.1" viewBox="0 0 1489 874" width="1489px">
<defs>
<filter height="300%" id="f1" width="300%" x="-1" y="-1">
<feGaussianBlur result="blurOut" stdDeviation="2.0" />
<feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0" />
<feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3" />
<feBlend in="SourceGraphic" in2="blurOut3" mode="normal" />
</filter>
</defs>
<g>
<text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="172" x="663" y="16.708">"Smaug API model"</text>
<rect fill="#FEFECE" filter="url(#f1)" height="86.4141" style="stroke: #A80036; stroke-width: 1.5;" width="136" x="928" y="564.4531" />
<ellipse cx="956.95" cy="580.4531" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M959.9188,586.0938 Q959.3406,586.3906 958.7,586.5391 Q958.0594,586.6875 957.3563,586.6875 Q954.8563,586.6875 953.5359,585.0391 Q952.2156,583.3906 952.2156,580.2656 Q952.2156,577.1406 953.5359,575.4844 Q954.8563,573.8281 957.3563,573.8281 Q958.0594,573.8281 958.7078,573.9844 Q959.3563,574.1406 959.9188,574.4375 L959.9188,577.1563 Q959.2938,576.5781 958.7,576.3047 Q958.1063,576.0313 957.4813,576.0313 Q956.1375,576.0313 955.45,577.1016 Q954.7625,578.1719 954.7625,580.2656 Q954.7625,582.3594 955.45,583.4297 Q956.1375,584.5 957.4813,584.5 Q958.1063,584.5 958.7,584.2266 Q959.2938,583.9531 959.9188,583.375 L959.9188,586.0938 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="73" x="974.05" y="584.6074">Protectable</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="929" x2="1063" y1="596.4531" y2="596.4531" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="934" y="610.6636">name: string</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="124" x="934" y="623.4683">instances: []Resource</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="71" x="934" y="636.2729">is_root: bool</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="929" x2="1063" y1="642.8672" y2="642.8672" />
<rect fill="#FEFECE" filter="url(#f1)" height="99.2188" style="stroke: #A80036; stroke-width: 1.5;" width="205" x="714.5" y="765.9531" />
<ellipse cx="783.25" cy="781.9531" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M786.2188,787.5938 Q785.6406,787.8906 785,788.0391 Q784.3594,788.1875 783.6563,788.1875 Q781.1563,788.1875 779.8359,786.5391 Q778.5156,784.8906 778.5156,781.7656 Q778.5156,778.6406 779.8359,776.9844 Q781.1563,775.3281 783.6563,775.3281 Q784.3594,775.3281 785.0078,775.4844 Q785.6563,775.6406 786.2188,775.9375 L786.2188,778.6563 Q785.5938,778.0781 785,777.8047 Q784.4063,777.5313 783.7813,777.5313 Q782.4375,777.5313 781.75,778.6016 Q781.0625,779.6719 781.0625,781.7656 Q781.0625,783.8594 781.75,784.9297 Q782.4375,786 783.7813,786 Q784.4063,786 785,785.7266 Q785.5938,785.4531 786.2188,784.875 L786.2188,787.5938 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="59" x="803.75" y="786.1074">Resource</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="715.5" x2="918.5" y1="797.9531" y2="797.9531" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="45" x="720.5" y="812.1636">id: UUID</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="112" x="720.5" y="824.9683">type: ResourceType</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="720.5" y="837.7729">schema: JSONSchema</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="193" x="720.5" y="850.5776">dependent_resources: []Resource</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="715.5" x2="918.5" y1="857.1719" y2="857.1719" />
<rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="76" x="918" y="233.9531" />
<ellipse cx="933" cy="249.9531" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M935.9688,255.5938 Q935.3906,255.8906 934.75,256.0391 Q934.1094,256.1875 933.4063,256.1875 Q930.9063,256.1875 929.5859,254.5391 Q928.2656,252.8906 928.2656,249.7656 Q928.2656,246.6406 929.5859,244.9844 Q930.9063,243.3281 933.4063,243.3281 Q934.1094,243.3281 934.7578,243.4844 Q935.4063,243.6406 935.9688,243.9375 L935.9688,246.6563 Q935.3438,246.0781 934.75,245.8047 Q934.1563,245.5313 933.5313,245.5313 Q932.1875,245.5313 931.5,246.6016 Q930.8125,247.6719 930.8125,249.7656 Q930.8125,251.8594 931.5,252.9297 Q932.1875,254 933.5313,254 Q934.1563,254 934.75,253.7266 Q935.3438,253.4531 935.9688,252.875 L935.9688,255.5938 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="44" x="947" y="254.1074">Trigger</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="919" x2="993" y1="265.9531" y2="265.9531" />
<line style="stroke: #A80036; stroke-width: 1.5;" x1="919" x2="993" y1="273.9531" y2="273.9531" />
<rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="113" x="801.5" y="387.9531" />
<ellipse cx="816.5" cy="403.9531" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M819.4688,409.5938 Q818.8906,409.8906 818.25,410.0391 Q817.6094,410.1875 816.9063,410.1875 Q814.4063,410.1875 813.0859,408.5391 Q811.7656,406.8906 811.7656,403.7656 Q811.7656,400.6406 813.0859,398.9844 Q814.4063,397.3281 816.9063,397.3281 Q817.6094,397.3281 818.2578,397.4844 Q818.9063,397.6406 819.4688,397.9375 L819.4688,400.6563 Q818.8438,400.0781 818.25,399.8047 Q817.6563,399.5313 817.0313,399.5313 Q815.6875,399.5313 815,400.6016 Q814.3125,401.6719 814.3125,403.7656 Q814.3125,405.8594 815,406.9297 Q815.6875,408 817.0313,408 Q817.6563,408 818.25,407.7266 Q818.8438,407.4531 819.4688,406.875 L819.4688,409.5938 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="81" x="830.5" y="408.1074">TimedTrigger</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="802.5" x2="913.5" y1="419.9531" y2="419.9531" />
<line style="stroke: #A80036; stroke-width: 1.5;" x1="802.5" x2="913.5" y1="427.9531" y2="427.9531" />
<rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="111" x="949.5" y="387.9531" />
<ellipse cx="964.5" cy="403.9531" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M967.4688,409.5938 Q966.8906,409.8906 966.25,410.0391 Q965.6094,410.1875 964.9063,410.1875 Q962.4063,410.1875 961.0859,408.5391 Q959.7656,406.8906 959.7656,403.7656 Q959.7656,400.6406 961.0859,398.9844 Q962.4063,397.3281 964.9063,397.3281 Q965.6094,397.3281 966.2578,397.4844 Q966.9063,397.6406 967.4688,397.9375 L967.4688,400.6563 Q966.8438,400.0781 966.25,399.8047 Q965.6563,399.5313 965.0313,399.5313 Q963.6875,399.5313 963,400.6016 Q962.3125,401.6719 962.3125,403.7656 Q962.3125,405.8594 963,406.9297 Q963.6875,408 965.0313,408 Q965.6563,408 966.25,407.7266 Q966.8438,407.4531 967.4688,406.875 L967.4688,409.5938 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="79" x="978.5" y="408.1074">EventTrigger</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="950.5" x2="1059.5" y1="419.9531" y2="419.9531" />
<line style="stroke: #A80036; stroke-width: 1.5;" x1="950.5" x2="1059.5" y1="427.9531" y2="427.9531" />
<rect fill="#FEFECE" filter="url(#f1)" height="112.0234" style="stroke: #A80036; stroke-width: 1.5;" width="132" x="6" y="551.4531" />
<ellipse cx="34.5" cy="567.4531" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M37.4688,573.0938 Q36.8906,573.3906 36.25,573.5391 Q35.6094,573.6875 34.9063,573.6875 Q32.4063,573.6875 31.0859,572.0391 Q29.7656,570.3906 29.7656,567.2656 Q29.7656,564.1406 31.0859,562.4844 Q32.4063,560.8281 34.9063,560.8281 Q35.6094,560.8281 36.2578,560.9844 Q36.9063,561.1406 37.4688,561.4375 L37.4688,564.1563 Q36.8438,563.5781 36.25,563.3047 Q35.6563,563.0313 35.0313,563.0313 Q33.6875,563.0313 33,564.1016 Q32.3125,565.1719 32.3125,567.2656 Q32.3125,569.3594 33,570.4297 Q33.6875,571.5 35.0313,571.5 Q35.6563,571.5 36.25,571.2266 Q36.8438,570.9531 37.4688,570.375 L37.4688,573.0938 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="70" x="51.5" y="571.6074">Checkpoint</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="137" y1="583.4531" y2="583.4531" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="45" x="12" y="597.6636">id: UUID</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="87" x="12" y="610.4683">tenant_id: UUID</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="113" x="12" y="623.2729">plan: ProtectionPlan</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="77" x="12" y="636.0776">status: string</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="120" x="12" y="648.8823">started_at: DateTime</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="137" y1="655.4766" y2="655.4766" />
<rect fill="#FEFECE" filter="url(#f1)" height="163.2422" style="stroke: #A80036; stroke-width: 1.5;" width="234" x="277" y="525.9531" />
<ellipse cx="343.75" cy="541.9531" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M346.7188,547.5938 Q346.1406,547.8906 345.5,548.0391 Q344.8594,548.1875 344.1563,548.1875 Q341.6563,548.1875 340.3359,546.5391 Q339.0156,544.8906 339.0156,541.7656 Q339.0156,538.6406 340.3359,536.9844 Q341.6563,535.3281 344.1563,535.3281 Q344.8594,535.3281 345.5078,535.4844 Q346.1563,535.6406 346.7188,535.9375 L346.7188,538.6563 Q346.0938,538.0781 345.5,537.8047 Q344.9063,537.5313 344.2813,537.5313 Q342.9375,537.5313 342.25,538.6016 Q341.5625,539.6719 341.5625,541.7656 Q341.5625,543.8594 342.25,544.9297 Q342.9375,546 344.2813,546 Q344.9063,546 345.5,545.7266 Q346.0938,545.4531 346.7188,544.875 L346.7188,547.5938 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="92" x="364.25" y="546.1074">ProtectionPlan</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="278" x2="510" y1="557.9531" y2="557.9531" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="45" x="283" y="572.1636">id: UUID</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="114" x="283" y="584.9683">is_enabled: boolean</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="283" y="597.7729">name: string</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="101" x="283" y="610.5776">comments: string</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="283" y="623.3823">resources: []Resource</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="222" x="283" y="636.187">protection_provider: ProtectionProvider</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="95" x="283" y="648.9917">parameters: dict</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="278" x2="510" y1="655.5859" y2="655.5859" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="36" x="283" y="669.7964">Start()</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="58" x="283" y="682.6011">Suspend()</text>
<rect fill="#FEFECE" filter="url(#f1)" height="99.2188" style="stroke: #A80036; stroke-width: 1.5;" width="157" x="888.5" y="35.4531" />
<ellipse cx="903.5" cy="51.4531" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M906.4688,57.0938 Q905.8906,57.3906 905.25,57.5391 Q904.6094,57.6875 903.9063,57.6875 Q901.4063,57.6875 900.0859,56.0391 Q898.7656,54.3906 898.7656,51.2656 Q898.7656,48.1406 900.0859,46.4844 Q901.4063,44.8281 903.9063,44.8281 Q904.6094,44.8281 905.2578,44.9844 Q905.9063,45.1406 906.4688,45.4375 L906.4688,48.1563 Q905.8438,47.5781 905.25,47.3047 Q904.6563,47.0313 904.0313,47.0313 Q902.6875,47.0313 902,48.1016 Q901.3125,49.1719 901.3125,51.2656 Q901.3125,53.3594 902,54.4297 Q902.6875,55.5 904.0313,55.5 Q904.6563,55.5 905.25,55.2266 Q905.8438,54.9531 906.4688,54.375 L906.4688,57.0938 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="125" x="917.5" y="55.6074">AutomaticOperation</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="889.5" x2="1044.5" y1="67.4531" y2="67.4531" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="45" x="894.5" y="81.6636">id: UUID</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="894.5" y="94.4683">name: string</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="101" x="894.5" y="107.2729">comments: string</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="87" x="894.5" y="120.0776">tenant_id: UUID</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="889.5" x2="1044.5" y1="126.6719" y2="126.6719" />
<rect fill="#FEFECE" filter="url(#f1)" height="112.0234" style="stroke: #A80036; stroke-width: 1.5;" width="188" x="1029" y="201.9531" />
<ellipse cx="1074.75" cy="217.9531" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M1077.7188,223.5938 Q1077.1406,223.8906 1076.5,224.0391 Q1075.8594,224.1875 1075.1563,224.1875 Q1072.6563,224.1875 1071.3359,222.5391 Q1070.0156,220.8906 1070.0156,217.7656 Q1070.0156,214.6406 1071.3359,212.9844 Q1072.6563,211.3281 1075.1563,211.3281 Q1075.8594,211.3281 1076.5078,211.4844 Q1077.1563,211.6406 1077.7188,211.9375 L1077.7188,214.6563 Q1077.0938,214.0781 1076.5,213.8047 Q1075.9063,213.5313 1075.2813,213.5313 Q1073.9375,213.5313 1073.25,214.6016 Q1072.5625,215.6719 1072.5625,217.7656 Q1072.5625,219.8594 1073.25,220.9297 Q1073.9375,222 1075.2813,222 Q1075.9063,222 1076.5,221.7266 Q1077.0938,221.4531 1077.7188,220.875 L1077.7188,223.5938 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="88" x="1095.25" y="222.1074">PlanRetention</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="1030" x2="1216" y1="233.9531" y2="233.9531" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="58" x="1035" y="248.1636">daily: bool</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="70" x="1035" y="260.9683">weekly: bool</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="77" x="1035" y="273.7729">monthly: bool</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="1035" y="286.5776">yearly: bool</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="176" x="1035" y="299.3823">protection_plan: ProtectionPlan</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="1030" x2="1216" y1="305.9766" y2="305.9766" />
<rect fill="#FEFECE" filter="url(#f1)" height="66.7422" style="stroke: #A80036; stroke-width: 1.5;" width="160" x="460" y="224.4531" />
<ellipse cx="475" cy="243.4219" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M477.9688,249.0625 Q477.3906,249.3594 476.75,249.5078 Q476.1094,249.6563 475.4063,249.6563 Q472.9063,249.6563 471.5859,248.0078 Q470.2656,246.3594 470.2656,243.2344 Q470.2656,240.1094 471.5859,238.4531 Q472.9063,236.7969 475.4063,236.7969 Q476.1094,236.7969 476.7578,236.9531 Q477.4063,237.1094 477.9688,237.4063 L477.9688,240.125 Q477.3438,239.5469 476.75,239.2734 Q476.1563,239 475.5313,239 Q474.1875,239 473.5,240.0703 Q472.8125,241.1406 472.8125,243.2344 Q472.8125,245.3281 473.5,246.3984 Q474.1875,247.4688 475.5313,247.4688 Q476.1563,247.4688 476.75,247.1953 Q477.3438,246.9219 477.9688,246.3438 L477.9688,249.0625 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="66" x="520" y="240.5918">«abstract»</text>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="128" x="489" y="254.5605">ScheduledOperation</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="461" x2="619" y1="262.3906" y2="262.3906" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="87" x="466" y="276.6011">trigger: Trigger</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="461" x2="619" y1="283.1953" y2="283.1953" />
<rect fill="#FEFECE" filter="url(#f1)" height="60.8047" style="stroke: #A80036; stroke-width: 1.5;" width="188" x="300" y="381.4531" />
<ellipse cx="353.25" cy="397.4531" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M356.2188,403.0938 Q355.6406,403.3906 355,403.5391 Q354.3594,403.6875 353.6563,403.6875 Q351.1563,403.6875 349.8359,402.0391 Q348.5156,400.3906 348.5156,397.2656 Q348.5156,394.1406 349.8359,392.4844 Q351.1563,390.8281 353.6563,390.8281 Q354.3594,390.8281 355.0078,390.9844 Q355.6563,391.1406 356.2188,391.4375 L356.2188,394.1563 Q355.5938,393.5781 355,393.3047 Q354.4063,393.0313 353.7813,393.0313 Q352.4375,393.0313 351.75,394.1016 Q351.0625,395.1719 351.0625,397.2656 Q351.0625,399.3594 351.75,400.4297 Q352.4375,401.5 353.7813,401.5 Q354.4063,401.5 355,401.2266 Q355.5938,400.9531 356.2188,400.375 L356.2188,403.0938 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="73" x="373.75" y="401.6074">BackupPlan</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="301" x2="487" y1="413.4531" y2="413.4531" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="176" x="306" y="427.6636">protection_plan: ProtectionPlan</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="301" x2="487" y1="434.2578" y2="434.2578" />
<rect fill="#FEFECE" filter="url(#f1)" height="73.6094" style="stroke: #A80036; stroke-width: 1.5;" width="234" x="523" y="374.9531" />
<ellipse cx="576.75" cy="390.9531" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M579.7188,396.5938 Q579.1406,396.8906 578.5,397.0391 Q577.8594,397.1875 577.1563,397.1875 Q574.6563,397.1875 573.3359,395.5391 Q572.0156,393.8906 572.0156,390.7656 Q572.0156,387.6406 573.3359,385.9844 Q574.6563,384.3281 577.1563,384.3281 Q577.8594,384.3281 578.5078,384.4844 Q579.1563,384.6406 579.7188,384.9375 L579.7188,387.6563 Q579.0938,387.0781 578.5,386.8047 Q577.9063,386.5313 577.2813,386.5313 Q575.9375,386.5313 575.25,387.6016 Q574.5625,388.6719 574.5625,390.7656 Q574.5625,392.8594 575.25,393.9297 Q575.9375,395 577.2813,395 Q577.9063,395 578.5,394.7266 Q579.0938,394.4531 579.7188,393.875 L579.7188,396.5938 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="118" x="597.25" y="395.1074">DeleteCheckpoints</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="524" x2="756" y1="406.9531" y2="406.9531" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="529" y="421.1636">query: string</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="222" x="529" y="433.9683">protection_provider: ProtectionProvider</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="524" x2="756" y1="440.5625" y2="440.5625" />
<rect fill="#FEFECE" filter="url(#f1)" height="112.0234" style="stroke: #A80036; stroke-width: 1.5;" width="312" x="581" y="551.4531" />
<ellipse cx="674.75" cy="567.4531" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M677.7188,573.0938 Q677.1406,573.3906 676.5,573.5391 Q675.8594,573.6875 675.1563,573.6875 Q672.6563,573.6875 671.3359,572.0391 Q670.0156,570.3906 670.0156,567.2656 Q670.0156,564.1406 671.3359,562.4844 Q672.6563,560.8281 675.1563,560.8281 Q675.8594,560.8281 676.5078,560.9844 Q677.1563,561.1406 677.7188,561.4375 L677.7188,564.1563 Q677.0938,563.5781 676.5,563.3047 Q675.9063,563.0313 675.2813,563.0313 Q673.9375,563.0313 673.25,564.1016 Q672.5625,565.1719 672.5625,567.2656 Q672.5625,569.3594 673.25,570.4297 Q673.9375,571.5 675.2813,571.5 Q675.9063,571.5 676.5,571.2266 Q677.0938,570.9531 677.7188,570.375 L677.7188,573.0938 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="116" x="695.25" y="571.6074">ProtectionProvider</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="582" x2="892" y1="583.4531" y2="583.4531" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="587" y="597.6636">name: string</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="104" x="587" y="610.4683">description: string</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="300" x="587" y="623.2729">extended_info_schema: [ResourceType]JSONSchema</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="263" x="587" y="636.0776">options_schema: [ResourceType]JSONSchema</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="145" x="587" y="648.8823">checkpoints: []Checkpoint</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="582" x2="892" y1="655.4766" y2="655.4766" />
<rect fill="#FEFECE" filter="url(#f1)" height="60.8047" style="stroke: #A80036; stroke-width: 1.5;" width="122" x="1358" y="54.4531" />
<ellipse cx="1373" cy="70.4531" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M1375.9688,76.0938 Q1375.3906,76.3906 1374.75,76.5391 Q1374.1094,76.6875 1373.4063,76.6875 Q1370.9063,76.6875 1369.5859,75.0391 Q1368.2656,73.3906 1368.2656,70.2656 Q1368.2656,67.1406 1369.5859,65.4844 Q1370.9063,63.8281 1373.4063,63.8281 Q1374.1094,63.8281 1374.7578,63.9844 Q1375.4063,64.1406 1375.9688,64.4375 L1375.9688,67.1563 Q1375.3438,66.5781 1374.75,66.3047 Q1374.1563,66.0313 1373.5313,66.0313 Q1372.1875,66.0313 1371.5,67.1016 Q1370.8125,68.1719 1370.8125,70.2656 Q1370.8125,72.3594 1371.5,73.4297 Q1372.1875,74.5 1373.5313,74.5 Q1374.1563,74.5 1374.75,74.2266 Q1375.3438,73.9531 1375.9688,73.375 L1375.9688,76.0938 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="90" x="1387" y="74.6074">RestoreTarget</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="1359" x2="1479" y1="86.4531" y2="86.4531" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="98" x="1364" y="100.6636">keystone_uri: URI</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="1359" x2="1479" y1="107.2578" y2="107.2578" />
<rect fill="#FEFECE" filter="url(#f1)" height="112.0234" style="stroke: #A80036; stroke-width: 1.5;" width="171" x="1080.5" y="28.9531" />
<ellipse cx="1125.25" cy="44.9531" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M1128.2188,50.5938 Q1127.6406,50.8906 1127,51.0391 Q1126.3594,51.1875 1125.6563,51.1875 Q1123.1563,51.1875 1121.8359,49.5391 Q1120.5156,47.8906 1120.5156,44.7656 Q1120.5156,41.6406 1121.8359,39.9844 Q1123.1563,38.3281 1125.6563,38.3281 Q1126.3594,38.3281 1127.0078,38.4844 Q1127.6563,38.6406 1128.2188,38.9375 L1128.2188,41.6563 Q1127.5938,41.0781 1127,40.8047 Q1126.4063,40.5313 1125.7813,40.5313 Q1124.4375,40.5313 1123.75,41.6016 Q1123.0625,42.6719 1123.0625,44.7656 Q1123.0625,46.8594 1123.75,47.9297 Q1124.4375,49 1125.7813,49 Q1126.4063,49 1127,48.7266 Q1127.5938,48.4531 1128.2188,47.875 L1128.2188,50.5938 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="73" x="1145.75" y="49.1074">Restoration</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="1081.5" x2="1250.5" y1="60.9531" y2="60.9531" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="91" x="1086.5" y="75.1636">template: string</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="123" x="1086.5" y="87.9683">target: RestoreTarget</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="159" x="1086.5" y="100.7729">provider: ProtectionProvider</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="130" x="1086.5" y="113.5776">checkpoint: Checkpoint</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="99" x="1086.5" y="126.3823">started_at: string</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="1081.5" x2="1250.5" y1="132.9766" y2="132.9766" />
<path d="M959.345,650.6371 C931.431,682.7611 892.833,727.1821 862.871,761.6631 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="#A80036" points="859.261,765.8174,868.1838,761.648,862.5408,762.0434,862.1454,756.4004,859.261,765.8174" style="stroke: #A80036; stroke-width: 1.0;" />
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="25" x="897" y="732.02">lists</text>
<path d="M930.098,299.1281 C911.898,327.3561 888.187,364.1331 873.024,387.6501 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="none" points="924.395,295.0551,941.116,282.0391,936.162,302.6411,924.395,295.0551" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M969.606,301.1591 C978.613,329.0991 990.087,364.6931 997.488,387.6501 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="none" points="962.916,303.2221,963.442,282.0391,976.241,298.9261,962.916,303.2221" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M151.351,607.4531 C185.2,607.4531 225.597,607.4531 263.627,607.4531 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="#A80036" points="276.965,607.4531,267.965,603.4531,271.965,607.4531,267.965,611.4531,276.965,607.4531" style="stroke: #A80036; stroke-width: 1.0;" />
<line style="stroke: #A80036; stroke-width: 1.0;" x1="271.965" x2="263.965" y1="607.4531" y2="607.4531" />
<polygon fill="#A80036" points="138.328,607.4531,144.328,611.4531,150.328,607.4531,144.328,603.4531,138.328,607.4531" style="stroke: #A80036; stroke-width: 1.0;" />
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="102" x="156.5" y="600.52">stores a copy of</text>
<path d="M1024.95,149.4731 C1040.58,166.6091 1057.37,185.0091 1072.55,201.6561 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="none" points="1019.59,153.9901,1011.29,134.4971,1029.94,144.5551,1019.59,153.9901" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M869.156,125.1371 C793.739,155.3391 690.746,196.5841 620.167,224.8491 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="none" points="867.015,118.4531,888.184,117.5161,872.22,131.4501,867.015,118.4531" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M633.395,257.9531 C723.017,257.9531 853.91,257.9531 917.911,257.9531 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="#A80036" points="620.209,257.9531,626.209,261.9531,632.209,257.9531,626.209,253.9531,620.209,257.9531" style="stroke: #A80036; stroke-width: 1.0;" />
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="261" x="638.5" y="251.02">when should the operation should trigger</text>
<path d="M494.702,306.1121 C471.142,330.6411 443.062,359.8751 422.546,381.2331 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="none" points="489.776,301.1361,508.679,291.5611,499.873,310.8341,489.776,301.1361" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M394,455.8261 C394,472.6711 394,492.7151 394,512.5961 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="#A80036" points="394,525.6011,398,516.6011,394,520.6011,390,516.6011,394,525.6011" style="stroke: #A80036; stroke-width: 1.0;" />
<line style="stroke: #A80036; stroke-width: 1.0;" x1="394" x2="394" y1="520.6011" y2="512.6011" />
<polygon fill="#A80036" points="394,442.7631,390,448.7631,394,454.7631,398,448.7631,394,442.7631" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M572.558,308.4421 C586.817,330.1151 603.24,355.0771 616.309,374.9421 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="none" points="566.597,312.1171,561.453,291.5611,578.293,304.4221,566.597,312.1171" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M613.159,546.1261 C515.919,505.9761 377.384,466.4671 257.5,498.9531 C219.328,509.2971 180.963,529.6771 149.11,550.0091 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="#A80036" points="138.125,557.1821,147.8476,555.6104,142.3114,554.4483,143.4735,548.9121,138.125,557.1821" style="stroke: #A80036; stroke-width: 1.0;" />
<line style="stroke: #A80036; stroke-width: 1.0;" x1="142.3114" x2="149.01" y1="554.4483" y2="550.0741" />
<polygon fill="none" points="625.405,551.2761,621.4245,545.2632,614.3431,546.6248,618.3236,552.6378,625.405,551.2761" style="stroke: #A80036; stroke-width: 1.0;" />
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="25" x="258.5" y="492.02">lists</text>
<path d="M523.169,671.3581 C581.355,699.6941 649.391,732.8281 705.334,760.0721 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="#A80036" points="717.08,765.7922,710.7394,758.2559,712.5846,763.6033,707.2371,765.4485,717.08,765.7922" style="stroke: #A80036; stroke-width: 1.0;" />
<line style="stroke: #A80036; stroke-width: 1.0;" x1="712.5846" x2="705.392" y1="763.6033" y2="760.1001" />
<polygon fill="#A80036" points="511.267,665.5621,514.9104,671.7851,522.056,670.8155,518.4126,664.5925,511.267,665.5621" style="stroke: #A80036; stroke-width: 1.0;" />
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="73" x="645" y="732.02">aggragates</text>
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="8" x="519.0357" y="665.8677">1</text>
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="10" x="696.2601" y="756.9599">N</text>
<path d="M511.236,607.4531 C532.736,607.4531 554.235,607.4531 575.735,607.4531 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="#A80036" points="580.906,607.4531,571.906,603.4531,575.906,607.4531,571.906,611.4531,580.906,607.4531" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M1264.91,84.9531 C1291.46,84.9531 1319.72,84.9531 1344.69,84.9531 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="#A80036" points="1357.81,84.9531,1348.81,80.9531,1352.81,84.9531,1348.81,88.9531,1357.81,84.9531" style="stroke: #A80036; stroke-width: 1.0;" />
<line style="stroke: #A80036; stroke-width: 1.0;" x1="1352.81" x2="1344.81" y1="84.9531" y2="84.9531" />
<polygon fill="#A80036" points="1251.65,84.9531,1257.65,88.9531,1263.65,84.9531,1257.65,80.9531,1251.65,84.9531" style="stroke: #A80036; stroke-width: 1.0;" />
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="70" x="1269.75" y="78.02">restores to</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 35 KiB

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="187px" style="width:1550px;height:187px;" version="1.1" viewBox="0 0 1550 187" width="1550px">
<defs>
<filter height="300%" id="f1" width="300%" x="-1" y="-1">
<feGaussianBlur result="blurOut" stdDeviation="2.0" />
<feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0" />
<feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3" />
<feBlend in="SourceGraphic" in2="blurOut3" mode="normal" />
</filter>
</defs>
<g>
<polygon fill="#FFFFFF" filter="url(#f1)" points="22,24,155,24,162,46.2969,1543,46.2969,1543,180,22,180,22,24" style="stroke: #000000; stroke-width: 2.0;" />
<line style="stroke: #000000; stroke-width: 2.0;" x1="22" x2="162" y1="46.2969" y2="46.2969" />
<text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="127" x="26" y="38.9951">Plugin Examples</text>
<rect fill="#FEFECE" filter="url(#f1)" height="79.5469" style="stroke: #A80036; stroke-width: 1.5;" width="343" x="358.5" y="71.5" />
<ellipse cx="484.25" cy="90.4688" fill="#B4A7E5" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M480.1719,86.2344 L480.1719,84.0781 L487.5625,84.0781 L487.5625,86.2344 L485.0938,86.2344 L485.0938,94.3125 L487.5625,94.3125 L487.5625,96.4688 L480.1719,96.4688 L480.1719,94.3125 L482.6406,94.3125 L482.6406,86.2344 L480.1719,86.2344 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="76" x="508.25" y="87.6387">«action set»</text>
<text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="83" x="504.75" y="101.6074">BackupPlugin</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="359.5" x2="700.5" y1="109.4375" y2="109.4375" />
<line style="stroke: #A80036; stroke-width: 1.5;" x1="359.5" x2="700.5" y1="117.4375" y2="117.4375" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="331" x="364.5" y="131.6479">«protect» create_backup(resource: Resource, bank: Bank)</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="231" x="364.5" y="144.4526">«delete» delete_backup(backup: Backup)</text>
<rect fill="#FEFECE" filter="url(#f1)" height="105.1563" style="stroke: #A80036; stroke-width: 1.5;" width="617" x="736.5" y="59" />
<ellipse cx="987.75" cy="77.9688" fill="#B4A7E5" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M983.6719,73.7344 L983.6719,71.5781 L991.0625,71.5781 L991.0625,73.7344 L988.5938,73.7344 L988.5938,81.8125 L991.0625,81.8125 L991.0625,83.9688 L983.6719,83.9688 L983.6719,81.8125 L986.1406,81.8125 L986.1406,73.7344 L983.6719,73.7344 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="76" x="1023.25" y="75.1387">«action set»</text>
<text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="106" x="1008.25" y="89.1074">ReplicationPlugin</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="737.5" x2="1352.5" y1="96.9375" y2="96.9375" />
<line style="stroke: #A80036; stroke-width: 1.5;" x1="737.5" x2="1352.5" y1="104.9375" y2="104.9375" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="465" x="742.5" y="119.1479">«enable» start_replication(resource: Resource, replicationType: eReplicationType)</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="605" x="742.5" y="131.9526">«protect» create_snapshot_from_replicated_target(resource: Resource, replicationType: eReplicationType)</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="464" x="742.5" y="144.7573">«delete» delete_snapshot(resource: Resource, replicationType: eReplicationType)</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="269" x="742.5" y="157.562">«disable» stop_replication(resource: Resource)</text>
<rect fill="#FEFECE" filter="url(#f1)" height="73.6094" style="stroke: #A80036; stroke-width: 1.5;" width="138" x="1389" y="74.5" />
<ellipse cx="1404" cy="90.5" fill="#EB937F" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M1408.1094,96.5 L1400.3906,96.5 L1400.3906,84.1094 L1408.1094,84.1094 L1408.1094,86.2656 L1402.8438,86.2656 L1402.8438,88.9375 L1407.6094,88.9375 L1407.6094,91.0938 L1402.8438,91.0938 L1402.8438,94.3438 L1408.1094,94.3438 L1408.1094,96.5 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="106" x="1418" y="94.6543">eReplicationType</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="1390" x2="1526" y1="106.5" y2="106.5" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="60" x="1395" y="120.7104">hypervisor</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="1395" y="133.5151">cinder</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="1390" x2="1526" y1="140.1094" y2="140.1094" />
<rect fill="#FEFECE" filter="url(#f1)" height="79.5469" style="stroke: #A80036; stroke-width: 1.5;" width="285" x="38.5" y="71.5" />
<ellipse cx="128.75" cy="90.4688" fill="#B4A7E5" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;" />
<path d="M124.6719,86.2344 L124.6719,84.0781 L132.0625,84.0781 L132.0625,86.2344 L129.5938,86.2344 L129.5938,94.3125 L132.0625,94.3125 L132.0625,96.4688 L124.6719,96.4688 L124.6719,94.3125 L127.1406,94.3125 L127.1406,86.2344 L124.6719,86.2344 Z "
/>
<text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="76" x="159.25" y="87.6387">«action set»</text>
<text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="96" x="149.25" y="101.6074">SnapshotPlugin</text>
<line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="322.5" y1="109.4375" y2="109.4375" />
<line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="322.5" y1="117.4375" y2="117.4375" />
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="273" x="44.5" y="131.6479">«protect» create_snapshot(resource: Resource)</text>
<text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="270" x="44.5" y="144.4526">«delete» delete_snapshot(snapshot: Snapshot)</text>
<path d="M1353.54,111.5 C1363.5,111.5 1373.46,111.5 1383.42,111.5 " fill="none" style="stroke: #A80036; stroke-width: 1.0;" />
<polygon fill="#A80036" points="1388.63,111.5,1379.63,107.5,1383.63,111.5,1379.63,115.5,1388.63,111.5" style="stroke: #A80036; stroke-width: 1.0;" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.8 KiB

File diff suppressed because it is too large Load Diff