From 255c13eb85aa9eb83791cd17878d67e6a2ab02a8 Mon Sep 17 00:00:00 2001 From: Yuval Brik Date: Wed, 16 Nov 2016 11:05:50 +0200 Subject: [PATCH] Update Protection Plugin Spec Change activities into hooks, and split the pre hook into prepare_begin and prepare_finish, in order to enable a scenario like: 1. VM quiesce 2. Volume snapshot 3. VM Unquiesce 4. Volume Backup 5. Volume delete snapshot Change-Id: Ide80a6de2bd60961af14bd5ea226bbf355d8e19e --- .../protection-service/activities-links.png | Bin 25368 -> 0 bytes doc/images/protection-service/hooks.png | Bin 0 -> 29394 bytes .../specs/pluggable_protection_provider.rst | 164 ++++++++++++------ 3 files changed, 112 insertions(+), 52 deletions(-) delete mode 100644 doc/images/protection-service/activities-links.png create mode 100644 doc/images/protection-service/hooks.png diff --git a/doc/images/protection-service/activities-links.png b/doc/images/protection-service/activities-links.png deleted file mode 100644 index 90be25acc439f8ff13ea0ad8f566264f1a67f0b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25368 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 MSGq9^9ldz}1j1Eu-2eap diff --git a/doc/images/protection-service/hooks.png b/doc/images/protection-service/hooks.png new file mode 100644 index 0000000000000000000000000000000000000000..afc589c78d2b9c9eeeed73bfa08b8a51793c6a55 GIT binary patch literal 29394 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 .. role:: red .. role:: green .. role:: yellow .. role:: indigo +.. role:: purple +.. role:: black ========================================== Pluggable Protection Provider @@ -110,86 +114,142 @@ defined: Checkpoint #. The implementation of each operation -Protection Plugin Operation Activities -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Protection Plugin API & Workflow +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -*Protection Plugin* defines how to protect, restore, and delete resources. In -order to specify the detailed flow of each operation, a *Protection Plugin* -needs to implement numerous 'hooks'. These hooks, named *Activities*, differ -from one another by their time of execution in respect to other activities, -either of the same resource, or other resources. +*Protection Plugin* defines how to protect, restore, and delete resources. -#. **PreActivity**: invoked before any activity for this resource and dependent - resources has begun -#. **ParallelActivity**: invoked after the resource *PreActivity* is complete, - regardless of the dependent resources' activities. -#. **PostActivity**: invoked after all of the resource's activities are - complete, and the dependent resources' *PostActivities* are complete +When performing an operation there might be a need for a ProtectionPlugin to +perform actions on a resource before or after some operation was performed on +a related resource. -For example, a Protection Plugin for Nova servers, might implement a protect -operation by using *PreActivity* to contact a guest agent, in order to complete -database and operation system transactions, use *ParallelActivity* to backup -the server metadata, and use *PostActivity* to contact a guest agent, in order -to resume transactions. +For example, before takin a spanshot of a volume you need to quiesce the VM +and\or run any guest agent operation. Doing it after taking the checkpoint is +useless. -Practically, the protection plugin may implement methods in the form of:: +On the other hand, when copying a volume's data to different sites there is no +need for other operations to wait on the copy. - activity__ +Finally, there might be a need to perform an operation marking a transaction +as successfull after everything related to a VM was protected. -Where: +Looking at this we see there are 3 distinct phases for every protection. -* ``operation_type`` is one of: ``protect``, ``restore``, ``delete`` -* ``activity_type`` is one of: ``pre``, ``post``, ``parallel`` +#. *Preperation Phase*: This phase for performing actions in relation to a + resource's dependencies. It's called the "Preperation Phase" because it + where a plugin should do all the preperation required for the next phase. + Operation in this phase should be as short as possible since they are not + parraralized as much as in the following phases. As an example, taking + snapshots of all the volumes should happen in relation to the owning VMs + and also happen in a narrower time frame. Copying those snapshots can + happen later and is much more parallizable. +#. *Main Phase*: This phase is for doing work that has no dependencies or time + sensitivity. This will be mainly used for transferring the large amount of + information generated in the backup to different sites. +#. *Completion Phase*: This phase is for performing work once *all* the work, + not just preperation, was completed on a resource and all of it's + dependencies. This is a good place to attach resources (in case of restore) + or close transactions. + +As a Protection Plugin developer you want to minimize the work needed to be +done in the preperation and completion phases and do the bulk of the work in +the main phase since will allow for the most efficient execution of the +operation. + +It's important to note that a developer doesn't have to do any action during a +phase. It's completly valid to only use the main or preperation phase. In +fact, we think it's going to be very rare that a Protection Plugin will need +to use all the phases. + +In order to specify the detailed flow of each operation, a *Protection Plugin* +needs to implement numerous 'hooks'. These hooks, differ from one another by +their time of execution in respect to other hooks, either of the same +resource, or other resources. + +For *each* operation the pluggin can implement each of the hooks: + +#. **Preperation hooks**: as noted, preperation is for running tasks in + relation to other resources in the graph. This is why two hooks exist, one + for running before dependent resources' pereperation and one for after. + + #. **Prepare begin hook**: invoked before any hook of this resource and + dependent resources has begun. + + For tasks that need to happen before any dependent resource’s operations + begin + + Hook method name: **on_prepare_begin** + + #. **Prepare finish hook**: invoked after any prepare hooks of dependent + resources are complete. + + For tasks that finish the work began in *prepare begin hook*, for tasks that + require that the dependent resource’s prepare phase finished + + Hook method name: **on_prepare_finish** + +#. **Main hook**: invoked after the resource *prepare hooks* are complete. + + For tasks that do heavy lifting and can run in parallel to dependent or + dependee resources *main hooks* + + Hook method name: **on_main** + +#. **Complete hook**: invoked once the resource's main hook is complete, and + the dependent resources' *complete hooks* are complete + + For tasks that require that the dependent resource's operations are + complete, and finalize the operation on the resource. + + Hook method name: **on_complete** + +For example: a Protection Plugin for Nova servers, might implement a protect +operation by using *prepare begin hook* to quiesce the Server and/or contact a +guest agent to complete transactions. A protection plugin for Cinder volumes +can implement *prepare finish hook* to take a snapshot of the volume. The +server's *prepare finish hook* unquiesces the server and/or contacts a guest +agent. Both the server's and the volume's *main hook* do the heavy lifting of +copying the data. Notes: * Unimplemented methods are practically no-op * Each such method receives as parameters: ``checkpoint``, ``context``, ``resource``, and ``parameters`` objects -* These methods may return immediately, or use ``yield``. In the case ``yield`` - is used, the Protection Provider infrastructure is responsible for - periodically call ``next()``, in order to "poll". This is extremely useful in - cases where asynchronous operations are initiated (such as Cinder volume - creation), but polling must be performed in order to decide when the - operation is complete, and whether it is successful or not. For example: :: - def activity_protect_parallel(self, checkpoint, context, resource, parameters): - id = start_operation( ... ) - while True: - status = get_status(id) - if status == 'error': - raise Exception - elif status == 'success': - return - else: - yield + def prepare_finish(self, checkpoint, context, resource, parameters): + ... -.. figure:: https://raw.githubusercontent.com/openstack/karbor/master/doc/images/protection-service/activities-links.png - :alt: Activities Links +.. figure:: https://raw.githubusercontent.com/openstack/karbor/master/doc/images/protection-service/hooks.png + :alt: Protection Plugin Hooks :align: center - Activities Links + Protection Plugin Hooks - :green:`Green`: link of the parent resource PreActivity to the child - resource PreActivity + :green:`Green`: Child resource Prepare_begin depends on its parent resource + Prepare_begin - :yellow:`Yellow`: link of the resource PreActivity to ParallelActivity + :indigo:`Indigo`: The resource Prepare_finish depends on the resource + Prepare_begin + + :purple:`Purple`: Parent resource Prepare_finish depends on the child + resource Prepare_finish + + :yellow:`Yellow`: The resource Main depends on the resource Prepare_finish + + :red:`Red`: The resource Complete depends on the resource Main + + :black:`Black`: Parent resource Complete depends on the child resource’s + Complete - :red:`Red`: link of the resource ParallelActivity to PostActivity - :indigo:`Indigo`: link of the child resource PostActivity to the parent - resource PostActivity This scheme decouples the tree structure from the task execution. A plugin that handles multiple resources or that aggregates multiple resources to one task can use this mechanism to only return tasks when appropriate for it's scheme. -.. image:: https://raw.githubusercontent.com/openstack/karbor/master/doc/images/pluggable_protection_provider.svg - :alt: Karbor - :align: center - References ========== 1. `Class Diagram Source `_