From 281b7dd1cd07ba666ca865d53348907d04a46b83 Mon Sep 17 00:00:00 2001
From: silvacarloss <ces.eduardo98@gmail.com>
Date: Mon, 5 Oct 2020 12:54:40 +0000
Subject: [PATCH] Add developer reference to share server migration

Updates the developer reference with informations regarding the
share server migration feature implemented during Victoria release.

Change-Id: Ia72cf037d2b7dc9fb9d4f19ce141cc044206d6fc
Partial-bug: #1897903
---
 .../contributor/driver_requirements.rst       |   7 +
 doc/source/contributor/index.rst              |   1 +
 .../contributor/share_server_migration.rst    | 241 ++++++++++++++++++
 3 files changed, 249 insertions(+)
 create mode 100644 doc/source/contributor/share_server_migration.rst

diff --git a/doc/source/contributor/driver_requirements.rst b/doc/source/contributor/driver_requirements.rst
index c5137fa275..fb438fd4c0 100644
--- a/doc/source/contributor/driver_requirements.rst
+++ b/doc/source/contributor/driver_requirements.rst
@@ -333,3 +333,10 @@ Drivers can update, for all the shares created on a particular backend, the
 consumed space in GiB. While the polling interval for drivers to update this
 information is configurable, drivers can choose to submit cached information
 as necessary, but specify a time at which this information was "gathered_at".
+
+Share Server Migration (Since Victoria)
+---------------------------------------
+
+Shares servers can be migrated between different backends. Driver vendors
+need to implement the share server migration functions in order to migrate
+share servers in an efficient way.
diff --git a/doc/source/contributor/index.rst b/doc/source/contributor/index.rst
index 2825536471..0bc2c636b3 100644
--- a/doc/source/contributor/index.rst
+++ b/doc/source/contributor/index.rst
@@ -97,6 +97,7 @@ Module Reference
    share_replication
    driver_filter_goodness_weigher
    share_migration
+   share_server_migration
 
 .. only:: html
 
diff --git a/doc/source/contributor/share_server_migration.rst b/doc/source/contributor/share_server_migration.rst
new file mode 100644
index 0000000000..8486e3c5aa
--- /dev/null
+++ b/doc/source/contributor/share_server_migration.rst
@@ -0,0 +1,241 @@
+======================
+Share Server Migration
+======================
+
+As of the Victoria release of OpenStack, Manila supports migration of share
+servers across different pools through an experimental API. This developer
+document reflects the latest version of the experimental Share Server Migration
+API.
+
+Feature definition
+~~~~~~~~~~~~~~~~~~
+
+The Share Server Migration API is an administrator-only API that allows the
+invoker to select a destination backend to migrate a share server to, while
+still allowing clients to access the source share server resources during the
+migration. Migration of data is expected to be disruptive for users accessing
+the source, because at some point it will cease to exist. For this reason, the
+share server migration feature is implemented in a 2-phase approach, for the
+purpose of controlling the timing of that expected disruption of migrating
+share servers.
+
+The first phase of the migration is when operations that take the longest are
+performed, such as data copying or replication. After the first phase of data
+copying is complete, it is up to the administrator to trigger the second phase,
+often referred to as switchover phase, which may perform operations such as a
+last sync and changing the source share server to inactive.
+
+During the data copy phase, users remain connected to the source, and may have
+to reconnect after the switchover phase.
+
+Share server migration only supports driver-assisted migration. This
+mechanism uses the underlying driver running in the manila-share service node
+to coordinate the migration. The migration is performed directly in the
+storage. In order to use this mechanism, the driver should implement this
+functionality. Also, the driver managing the destination back end should
+support driver-assisted migration.
+Typically, drivers would be able to assist migration of share servers within
+storage systems from the same vendor. It is likely that this will be the most
+efficient and reliable mechanism to migrate a given share server, as the
+storage back end may be able to migrate the share server while remaining
+writable, snapshots, and possibly perform this operation non-disruptively.
+
+Note that during a share server migration, access rules cannot be added or
+removed. Also, it is not possible to modify existent access rules for
+shares and share snapshots created upon the share server being migrated.
+
+API description
+~~~~~~~~~~~~~~~
+
+The migration of a share server is started by invoking the
+``migration_start`` API. The parameters are:
+
+**share_server_id**
+    The share server to be migrated. This parameter is mandatory.
+
+**destination**
+    The destination backend in ``host@backend`` representation. This parameter
+    is mandatory.
+
+**preserve_snapshots**
+    Specifies whether migration should enforce the preservation of all existing
+    snapshots at the destination. In other words, the existing snapshots must
+    be migrated along with the share server data. When this behavior is
+    expected (i.e, this parameter is set to `True`) and drivers are not capable
+    of migrating the snapshots, migration will result in an error status.
+    This parameter is mandatory.
+
+**nondisruptive**
+    Specifies whether the migration should only be performed without disrupting
+    clients during migration. For such, it is also expected that the export
+    location does not change.  When this behavior is expected (i.e, this
+    parameter is set to `True`) and drivers are not capable of allowing the
+    share server shares to remain accessible through the two phases of the
+    migration, migration will result in an error status. This parameter
+    is mandatory.
+
+**writable**
+    Specifies whether migration should only be performed if the share server
+    shares can remain writable. When this behavior is expected
+    (i.e, this parameter is set to `True`) and drivers are not capable of
+    allowing the share server shares to remain writable, migration will result
+    in an error status. If drivers are not capable of performing a
+    nondisruptive migration, manila will ensure that the share server shares
+    will remain writable through the data copy phase of migration.
+    However, during the switchover phase the shares will be re-exported at the
+    destination, causing the share to be rendered inaccessible for the duration
+    of this phase. This parameter is mandatory.
+
+**new_share_network_id**
+    If willing to change the share server's share-network so it can be
+    allocated in the desired destination backend, the invoker may supply a new
+    share network to be used. This is often suited when the share server is to
+    be migrated to a backend which operates in a different availability zone or
+    managed by a driver that handles share servers. This parameter is optional.
+
+After started, a migration may be cancelled through the ``migration_cancel``
+API, have its status obtained through the ``migration_get_progress`` API, and
+completed through the ``migration_complete`` API after reaching a certain state
+(see ``Workflows`` section below).
+
+Workflows
+~~~~~~~~~
+
+Upon invoking ``migration_start``, several validations will be performed by
+the API layer, such as:
+
+* If supplied API parameters are valid.
+
+* If share server status is `active`.
+
+* If there are share groups related to the share server.
+
+* If a new share network id was provided and is compatible with the
+  destination.
+
+* If a new host and share network id were provided and they're different from
+  the source share server.
+
+* If the share server to be migrated serves as destination to another share
+  server.
+
+* If all the availability zones match with all shares' share types within the
+  share server.
+
+* If the share server's shares do not have replicas.
+
+* If the share server's shares are not member of a share group.
+
+* If the access rules of the given share server's shares are not in error
+  status.
+
+* If the snapshots of all share server shares are in `available` state.
+
+* If the destination backend chosen to migrate the share server to exists, as
+  well as it and its share service are running.
+
+If any of the above validations fail, the API will return an error. Otherwise,
+the `task_state` field value will transition to `migration_starting` and the
+share server's status will transition to `server_migrating`. Past this point,
+all validations, state transitions and errors will not produce any
+notifications to the user. Instead, the given share server's `task_state`
+field value will transition to `migration_error`.
+
+Right after the API validations, a driver call will be performed in the
+destination backend in order to validate if the destination host is compatible
+within the requested operation. The driver will then determine the
+compatibility between source and destination hosts for the share server
+migration.
+
+A new share server will be created in the database, referred to as the
+"destination share server", with a status field value `server_migrating_to`.
+
+Share server migration data copy phase
+--------------------------------------
+
+A share server will be created as needed at the destination backend. Then, the
+share server details are provided to the driver to report the set of migration
+capabilities for this destination. If the API parameters `writable`,
+`nondisruptive`, `preserve_metadata` and `preserve_snapshots` are satisfied by
+the reported migration capabilities, the `task_state` field value transitions
+to `migration_driver_starting` and the driver is invoked to start the
+migration.
+
+The driver's ``share_server_migration_start`` method should start a job in
+the storage back end and return, allowing the `task_state` field value to
+transition to `migration_driver_in_progress`. If any of the API parameters
+described previously are not satisfied, or the driver raises an exception in
+`share_server_migration_start`, the migration ends setting the `task_state`
+field value to `migration_error`, and the created share server will have its
+status set to error.
+
+Once the ``share_server_migration_start`` driver method succeeds, a periodic
+task that checks for shares with `task_state` field value
+`migration_driver_in_progress` will invoke the driver's
+``share_server_migration_continue`` method, responsible for executing the next
+steps of migration until the data copy phase is completed, transitioning the
+`task_state` field value to `migration_driver_phase1_done`. If this step fails,
+the `task_state` field value transitions to `migration_error` and all allocated
+resources will be cleaned up.
+
+Share server migration switchover phase
+---------------------------------------
+
+When invoked, the `task_state` field value transitions to
+`migration_completing`. In this phase, these operations will happen:
+* The source share instances are deleted
+* The source share server will have its status set to inactive
+* The access rules are applied to the shares of the destination share server
+* A final sync is also performed.
+
+At last, the `task_state` field value transitions to
+`migration_success`. If the `nondisruptive` capability is not
+supported, the export locations will change and clients will need to remount
+the shares.
+
+Driver interfaces
+~~~~~~~~~~~~~~~~~
+
+All drivers that implement the migration mechanism should be able to perform
+all required steps from the source share server back end within the
+implementation of the interfaces listed in the section below.
+Those steps include:
+
+* Validating compatibility and connectivity between the source and destination
+  back end;
+
+* Start the migration job in the storage back end. Return after the job request
+  has been submitted;
+
+* Subsequent invocations to the driver to monitor the job status.
+
+* Complete migration by performing a last sync if necessary and delete the
+  original shares from the source back end.
+
+.. note::
+   The implementation of the ``share_server_migration_cancel`` and
+   ``share_server_migration_get_progress`` operations is not mandatory. If the
+   driver is able to perform such operations, make sure to set
+   ``share_server_migration_cancel`` and
+   ``share_server_migration_get_progress`` equal to ``True`` in the response of
+   the ``share_server_migration_check`` operation.
+
+Additional notes
+~~~~~~~~~~~~~~~~
+
+* In case of an error in the storage back end during the execution of the
+  migration job, the driver should raise an exception within the
+  ``share_server_migration_continue`` method.
+
+* If the manila-share service is restarted during a migration, the driver's
+  ``share_server_migration_continue`` will be invoked periodically with an
+  interval configured in the share manager service
+  (``share_server_migration_driver_continue_interval``). The invocation
+  will stop when the driver finishes the data copy phase.
+
+Share Server Migration interfaces:
+----------------------------------
+
+.. autoclass:: manila.share.driver.ShareDriver
+    :noindex:
+    :members: share_server_migration_check_compatibility, share_server_migration_start, share_server_migration_continue, share_server_migration_complete, share_server_migration_cancel, share_server_migration_get_progress