Add doc for Share Replication
- Document extra_spec and capabilities involved - Document driver interfaces properly to please Sphinx - Document scheduler behavior - Document replica and snapshot workflows - Fix trailing white spaces in the descriptions of capabilities Change-Id: I054aebda9618968ab8bd3881ccdd8164e1283682 Closes-Bug: #1544812
This commit is contained in:
parent
ffc0d5962a
commit
f14808a2d1
@ -14,7 +14,7 @@
|
||||
Introduction to Manila Shared Filesystem Management Service
|
||||
===========================================================
|
||||
|
||||
:term:`Manila` is the File Share service project for OpenStack. To administer the
|
||||
:term:`manila` is the File Share service project for OpenStack. To administer the
|
||||
OpenStack File Share service, it is helpful to understand a number of concepts
|
||||
like share networks, shares, multi-tenancy and back ends that can be configured
|
||||
with Manila. When configuring the File Share service, it is required to declare
|
||||
|
@ -46,36 +46,36 @@ The CapabilitiesFilter uses the following for matching operators:
|
||||
|
||||
This does a float conversion and then uses the python operators as expected.
|
||||
|
||||
* **<in>**
|
||||
* **<in>**
|
||||
|
||||
This either chooses a host that has partially matching string in the capability
|
||||
or chooses a host if it matches any value in a list. For example, if "<in> sse4"
|
||||
or chooses a host if it matches any value in a list. For example, if "<in> sse4"
|
||||
is used, it will match a host that reports capability of "sse4_1" or "sse4_2".
|
||||
|
||||
* **<or>**
|
||||
|
||||
This chooses a host that has one of the items specified. If the first word in
|
||||
the string is <or>, another <or> and value pair can be concatenated. Examples
|
||||
are "<or> 3", "<or> 3 <or> 5", and "<or> 1 <or> 3 <or> 7". This is for
|
||||
string values only.
|
||||
This chooses a host that has one of the items specified. If the first word in
|
||||
the string is <or>, another <or> and value pair can be concatenated. Examples
|
||||
are "<or> 3", "<or> 3 <or> 5", and "<or> 1 <or> 3 <or> 7". This is for
|
||||
string values only.
|
||||
|
||||
* **<is>**
|
||||
|
||||
This chooses a host that matches a boolean capability. An example extra-spec value
|
||||
This chooses a host that matches a boolean capability. An example extra-spec value
|
||||
would be "<is> True".
|
||||
|
||||
* **=**
|
||||
|
||||
This does a float conversion and chooses a host that has equal to or greater
|
||||
This does a float conversion and chooses a host that has equal to or greater
|
||||
than the resource specified. This operator behaves this way for historical
|
||||
reasons.
|
||||
|
||||
* **s==, s!=, s>=, s>, s<=, s<**
|
||||
|
||||
The "s" indicates it is a string comparison. These choose a host that satisfies
|
||||
the comparison of strings in capability and specification. For example,
|
||||
if "capabilities:replication_type s== dr", a host that reports replication_type of
|
||||
"dr" will be chosen.
|
||||
The "s" indicates it is a string comparison. These choose a host that satisfies
|
||||
the comparison of strings in capability and specification. For example,
|
||||
if "capabilities:replication_type s== dr", a host that reports
|
||||
replication_type of "dr" will be chosen.
|
||||
|
||||
For vendor-specific capabilities (which need to be visible to the
|
||||
CapabilityFilter), it is recommended to use the vendor prefix followed
|
||||
@ -133,6 +133,19 @@ be created.
|
||||
filter by pools that either have or don't have QoS support enabled. Added in
|
||||
Mitaka.
|
||||
|
||||
* `replication_type` - indicates the style of replication supported for the
|
||||
backend/pool. This extra_spec will have a string value and could be one
|
||||
of :term:`writable`, :term:`readable` or :term:`dr`. `writable` replication
|
||||
type involves synchronously replicated shares where all replicas are
|
||||
writable. Promotion is not supported and not needed. `readable` and `dr`
|
||||
replication types involve a single `active` or `primary` replica and one or
|
||||
more `non-active` or secondary replicas per share. In `readable` type of
|
||||
replication, `non-active` replicas have one or more export_locations and
|
||||
can thus be mounted and read while the `active` replica is the only one
|
||||
that can be written into. In `dr` style of replication, only
|
||||
the `active` replica can be mounted, read from and written into. Added in
|
||||
Mitaka.
|
||||
|
||||
Reporting Capabilities
|
||||
----------------------
|
||||
Drivers report capabilities as part of the updated stats (e.g. capacity)
|
||||
@ -173,10 +186,19 @@ example vendor prefix:
|
||||
'thin_provisioning': True, #
|
||||
'max_over_subscription_ratio': 10, # (mandatory for thin)
|
||||
'provisioned_capacity_gb': 270, # (mandatory for thin)
|
||||
#
|
||||
#
|
||||
'replication_type': 'dr', # this backend supports
|
||||
# replication_type 'dr'
|
||||
#/
|
||||
'my_dying_disks': 100, #\
|
||||
'my_super_hero_1': 'Hulk', # "my" optional vendor
|
||||
'my_super_hero_2': 'Spider-Man' # stats & capabilities
|
||||
'my_super_hero_2': 'Spider-Man', # stats & capabilities
|
||||
#/
|
||||
#\
|
||||
# can replicate to other
|
||||
'replication_domain': 'asgard', # backends in
|
||||
# replication_domain 'asgard'
|
||||
#/
|
||||
},
|
||||
{'pool_name': 'thick pool',
|
||||
@ -187,6 +209,7 @@ example vendor prefix:
|
||||
'dedupe': False,
|
||||
'compression': False,
|
||||
'thin_provisioning': False,
|
||||
'replication_type': None,
|
||||
'my_dying_disks': 200,
|
||||
'my_super_hero_1': 'Batman',
|
||||
'my_super_hero_2': 'Robin',
|
||||
|
@ -94,7 +94,11 @@ function correctly in manila, such as:
|
||||
- compression: whether the backend supports compressed shares;
|
||||
- thin_provisioning: whether the backend is overprovisioning shares;
|
||||
- pools: list of storage pools managed by this driver instance;
|
||||
- qos: whether the backend supports quality of service for shares.
|
||||
- qos: whether the backend supports quality of service for shares;
|
||||
- replication_domain: string specifying a common group name for all backends
|
||||
that can replicate between each other;
|
||||
- replication_type: string specifying the type of replication supported by
|
||||
the driver. Can be one of ('readable', 'writable' or 'dr').
|
||||
|
||||
.. note:: for more information please see http://docs.openstack.org/developer/manila/devref/capabilities_and_extra_specs.html
|
||||
|
||||
@ -199,3 +203,14 @@ consistency of multiple shares. In order to make use of this feature, driver
|
||||
vendors must report this capability and implement its functions to work
|
||||
according to the backend, so the feature can be properly invoked through
|
||||
manila API.
|
||||
|
||||
Share Replication
|
||||
-----------------
|
||||
|
||||
Replicas of shares can be created for either data protection (for disaster
|
||||
recovery) or for load sharing. In order to utilize this feature, drivers must
|
||||
report the ``replication_type`` they support as a capability and implement
|
||||
necessary methods.
|
||||
|
||||
More details can be found at:
|
||||
http://docs.openstack.org/developer/manila/devref/share_replication.html
|
||||
|
@ -78,6 +78,7 @@ Module Reference
|
||||
fakes
|
||||
manila
|
||||
ganesha
|
||||
share_replication
|
||||
|
||||
Capabilities and Extra-Specs
|
||||
----------------------------
|
||||
|
@ -50,6 +50,17 @@ The following operations are supported on Clustered Data ONTAP:
|
||||
- Create consistency group from CG snapshot
|
||||
- Create CG snapshot
|
||||
- Delete CG snapshot
|
||||
- Create a replica (DHSS=False)
|
||||
- Promote a replica (DHSS=False)
|
||||
- Delete a replica (DHSS=False)
|
||||
- Update a replica (DHSS=False)
|
||||
- Create a replicated snapshot (DHSS=False)
|
||||
- Delete a replicated snapshot (DHSS=False)
|
||||
- Update a replicated snapshot (DHSS=False)
|
||||
|
||||
.. note::
|
||||
|
||||
:term:`DHSS` is abbreviated from `driver_handles_share_servers`.
|
||||
|
||||
Supported Operating Modes
|
||||
-------------------------
|
||||
|
@ -90,6 +90,13 @@ Driver methods that are wrapped with hooks
|
||||
- publish_service_capabilities
|
||||
- shrink_share
|
||||
- unmanage_share
|
||||
- create_share_replica
|
||||
- promote_share_replica
|
||||
- delete_share_replica
|
||||
- update_share_replica
|
||||
- create_replicated_snapshot
|
||||
- delete_replicated_snapshot
|
||||
- update_replicated_snapshot
|
||||
|
||||
Above list with wrapped methods can be extended in future.
|
||||
|
||||
|
313
doc/source/devref/share_replication.rst
Normal file
313
doc/source/devref/share_replication.rst
Normal file
@ -0,0 +1,313 @@
|
||||
..
|
||||
Copyright (c) 2016 Goutham Pacha Ravi
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
not use this file except in compliance with the License. You may obtain
|
||||
a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
License for the specific language governing permissions and limitations
|
||||
under the License.
|
||||
|
||||
|
||||
=================
|
||||
Share Replication
|
||||
=================
|
||||
|
||||
As of the Mitaka release of OpenStack, :term:`manila` supports replication of
|
||||
shares between different pools for drivers that operate with
|
||||
``driver_handles_share_servers=False`` mode. These pools may be on different
|
||||
backends or within the same backend. This feature can be used as a disaster
|
||||
recovery solution or as a load sharing mirroring solution depending upon the
|
||||
replication style chosen, the capability of the driver and the configuration
|
||||
of backends.
|
||||
|
||||
This feature assumes and relies on the fact that share drivers will be
|
||||
responsible for communicating with ALL storage controllers necessary to
|
||||
achieve any replication tasks, even if that involves sending commands to
|
||||
other storage controllers in other Availability Zones (or AZs).
|
||||
|
||||
End users would be able to create and manage their replicas, alongside their
|
||||
shares and snapshots.
|
||||
|
||||
|
||||
Storage availability zones and replication domains
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Replication is supported within the same availability zone, but in an ideal
|
||||
solution, an Availability Zone should be perceived as a single failure domain.
|
||||
So this feature provides the most value in an inter-AZ replication use case.
|
||||
|
||||
The ``replication_domain`` option is a backend specific StrOpt option to be
|
||||
used within ``manila.conf``. The value can be any ASCII string. Two backends
|
||||
that can replicate between each other would have the same
|
||||
``replication_domain``. This comes from the premise that manila expects
|
||||
Share Replication to be performed between backends that have similar
|
||||
characteristics.
|
||||
|
||||
When scheduling new replicas, the scheduler takes into account the
|
||||
``replication_domain`` option to match similar backends. It also ensures that
|
||||
only one replica can be scheduled per pool. When backends report multiple
|
||||
pools, manila would allow for replication between two pools on the same
|
||||
backend.
|
||||
|
||||
The ``replication_domain`` option is meant to be used in conjunction with the
|
||||
``storage_availability_zone`` option to utilize this solution for Data
|
||||
Protection/Disaster Recovery.
|
||||
|
||||
|
||||
Replication types
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
When creating a share that is meant to have replicas in the future, the user
|
||||
will use a ``share_type`` with an extra_spec, :term:`replication_type` set to
|
||||
a valid replication type that manila supports. Drivers must report the
|
||||
replication type that they support as the :term:`replication_type`
|
||||
capability during the ``_update_share_stats()`` call.
|
||||
|
||||
Three types of replication are currently supported:
|
||||
|
||||
**writable**
|
||||
Synchronously replicated shares where all replicas are writable.
|
||||
Promotion is not supported and not needed.
|
||||
|
||||
**readable**
|
||||
Mirror-style replication with a primary (writable) copy
|
||||
and one or more secondary (read-only) copies which can become writable
|
||||
after a promotion.
|
||||
|
||||
**dr (for Disaster Recovery)**
|
||||
Generalized replication with secondary copies that are inaccessible until
|
||||
they are promoted to become the ``active`` replica.
|
||||
|
||||
.. note::
|
||||
|
||||
The term :term:`active` replica refers to the ``primary`` share. In
|
||||
:term:`writable` style of replication, all replicas are :term:`active`,
|
||||
and there could be no distinction of a ``primary`` share. In
|
||||
:term:`readable` and :term:`dr` styles of replication, a ``secondary``
|
||||
replica may be referred to as ``passive``, ``non-active`` or simply
|
||||
``replica``.
|
||||
|
||||
|
||||
Health of a share replica
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Apart from the ``status`` attribute, share replicas have the
|
||||
:term:`replica_state` attribute to denote the state of the replica. The
|
||||
``primary`` replica will have it's :term:`replica_state` attribute set to
|
||||
:term:`active`. A ``secondary`` replica may have one of the following values as
|
||||
its :term:`replica_state`:
|
||||
|
||||
**in_sync**
|
||||
The replica is up to date with the active replica
|
||||
(possibly within a backend specific :term:`recovery point objective`).
|
||||
|
||||
**out_of_sync**
|
||||
The replica has gone out of date (all new replicas start out in this
|
||||
:term:`replica_state`).
|
||||
|
||||
**error**
|
||||
When the scheduler failed to schedule this replica or some potentially
|
||||
irrecoverable damage occurred with regard to updating data for this
|
||||
replica.
|
||||
|
||||
Manila requests periodic update of the :term:`replica_state` of all non-active
|
||||
replicas. The update occurs with respect to an interval defined through the
|
||||
``replica_state_update_interval`` option in ``manila.conf``.
|
||||
|
||||
Administrators have an option of initiating a ``resync`` of a secondary
|
||||
replica (for :term:`readable` and :term:`dr` types of replication). This could
|
||||
be performed before a planned failover operation in order to have the most
|
||||
up-to-date data on the replica.
|
||||
|
||||
|
||||
Promotion
|
||||
~~~~~~~~~
|
||||
|
||||
For :term:`readable` and :term:`dr` styles, we refer to the task of
|
||||
switching a ``non-active`` replica with the :term:`active` replica as
|
||||
`promotion`. For the :term:`writable` style of replication, promotion does
|
||||
not make sense since all replicas are :term:`active` (or writable) at all
|
||||
given points of time.
|
||||
|
||||
The ``status`` attribute of the non-active replica being promoted will be set
|
||||
to :term:`replication_change` during its promotion. This has been classified
|
||||
as a ``busy`` state and hence API interactions with the share are restricted
|
||||
while one of its replicas is in this state.
|
||||
|
||||
Promotion of replicas with :term:`replica_state` set to ``error`` may not be
|
||||
fully supported by the backend. However, manila allows the action as an
|
||||
administrator feature and such an attempt may be honored by backends if
|
||||
possible.
|
||||
|
||||
When multiple replicas exist, multiple replication relationships
|
||||
between shares may need to be redefined at the backend during the promotion
|
||||
operation. If the driver fails at this stage, the replicas may be left in an
|
||||
inconsistent state. The share manager will set all replicas to have the
|
||||
``status`` attribute set to ``error``. Recovery from this state would require
|
||||
administrator intervention.
|
||||
|
||||
|
||||
Snapshots
|
||||
~~~~~~~~~
|
||||
|
||||
If the driver supports snapshots, the replication of a snapshot is expected
|
||||
to be initiated simultaneously with the creation of the snapshot on the
|
||||
:term:`active` replica. Manila tracks snapshots across replicas as separate
|
||||
snapshot instances. The aggregate snapshot object itself will be in
|
||||
``creating`` state until it is ``available`` across all of the share's replicas
|
||||
that have their :term:`replica_state` attribute set to :term:`active` or
|
||||
``in_sync``.
|
||||
|
||||
Therefore, for a driver that supports snapshots, the definition of being
|
||||
``in_sync`` with the primary is not only that data is ensured (within the
|
||||
:term:`recovery point objective`), but also that any 'available' snapshots
|
||||
on the primary are ensured on the replica as well. If the snapshots cannot
|
||||
be ensured, the :term:`replica_state` *must* be reported to manila as being
|
||||
``out_of_sync`` until the snapshots have been replicated.
|
||||
|
||||
When a snapshot instance has its ``status`` attribute set to ``creating`` or
|
||||
``deleting``, manila will poll the respective drivers for a status update. As
|
||||
described earlier, the parent snapshot itself will be ``available`` only when
|
||||
its instances across the :term:`active` and ``in_sync`` replicas of the share
|
||||
are ``available``. The polling interval will be the same as
|
||||
``replica_state_update_interval``.
|
||||
|
||||
|
||||
Access Rules
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Access rules are not meant to be different across the replicas of the share.
|
||||
Manila expects drivers to handle these access rules effectively depending on
|
||||
the style of replication supported. For example, the :term:`dr` style of
|
||||
replication does mean that the non-active replicas are inaccessible, so if
|
||||
read-write rules are expected, then the rules should be applied on the
|
||||
:term:`active` replica only. Similarly, drivers that
|
||||
support :term:`readable` replication type should apply any read-write
|
||||
rules as read-only for the non-active replicas.
|
||||
|
||||
Drivers will receive all the access rules in ``create_replica``,
|
||||
``delete_replica`` and ``update_replica_state`` calls and have ample
|
||||
opportunity to reconcile these rules effectively across replicas.
|
||||
|
||||
|
||||
Understanding Replication Workflows
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Creating a share that supports replication
|
||||
------------------------------------------
|
||||
Administrators can create a share type with extra-spec
|
||||
:term:`replication_type`, matching the style of replication the desired backend
|
||||
supports. Users can use the share type to create a new share that
|
||||
allows/supports replication. A replicated share always starts out with one
|
||||
replica, the ``primary`` share itself.
|
||||
|
||||
The :term:`manila-scheduler` service will filter and weigh available pools to
|
||||
find a suitable pool for the share being created. In particular,
|
||||
|
||||
* The ``CapabilityFilter`` will match the :term:`replication_type` extra_spec
|
||||
in the request share_type with the ``replication_type`` capability reported
|
||||
by a pool.
|
||||
* The ``ShareReplicationFilter`` will further ensure that the pool has a
|
||||
non-empty ``replication_domain`` capability being reported as well.
|
||||
* The ``AvailabilityZoneFilter`` will ensure that the availability_zone
|
||||
requested matches with the pool's availability zone.
|
||||
|
||||
Creating a replica
|
||||
------------------
|
||||
The user has to specify the share name/id of the share that is supposed to be
|
||||
replicated and optionally an availability zone for the replica to exist in.
|
||||
The replica inherits the parent share's share_type and associated
|
||||
extra_specs. Scheduling of the replica is similar to that of the share.
|
||||
|
||||
* The `ShareReplicationFilter` will ensure that the pool is within
|
||||
the same ``replication_domain`` as the :term:`active` replica and also
|
||||
ensures that the pool does not already have a replica for that share.
|
||||
|
||||
Drivers supporting :term:`writable` style **must** set the
|
||||
:term:`replica_state` attribute to :term:`active` when the replica has been
|
||||
created and is ``available``.
|
||||
|
||||
Deleting a replica
|
||||
------------------
|
||||
Users can remove replicas that have their `status` attribute set to
|
||||
``error``, ``in_sync`` or ``out_of_sync``. They could even delete an
|
||||
:term:`active` replica as long as there is another :term:`active` replica
|
||||
(as could be the case with `writable` replication style). Before the
|
||||
``delete_replica`` call is made to the driver, an update_access call is made
|
||||
to ensure access rules are safely removed for the replica.
|
||||
|
||||
Administrators may also ``force-delete`` replicas. Any driver exceptions will
|
||||
only be logged and not re-raised; the replica will be purged from manila's
|
||||
database.
|
||||
|
||||
Promoting a replica
|
||||
-------------------
|
||||
Users can promote replicas that have their :term:`replica_state` attribute set
|
||||
to ``in_sync``. Administrators can attempt to promote replicas that have their
|
||||
:term:`replica_state` attribute set to ``out_of_sync`` or ``error``. During a
|
||||
promotion, if the driver raises an exception, all replicas will have their
|
||||
`status` attribute set to `error` and recovery from this state will require
|
||||
administrator intervention.
|
||||
|
||||
Resyncing a replica
|
||||
-------------------
|
||||
Prior to a planned failover, an administrator could attempt to update the
|
||||
data on the replica. The ``update_replica_state`` call will be made during
|
||||
such an action, giving drivers an opportunity to push the latest updates from
|
||||
the `active` replica to the secondaries.
|
||||
|
||||
Creating a snapshot
|
||||
-------------------
|
||||
When a user takes a snapshot of a share that has replicas, manila creates as
|
||||
many snapshot instances as there are share replicas. These snapshot
|
||||
instances all begin with their `status` attribute set to `creating`. The driver
|
||||
is expected to create the snapshot of the ``active`` replica and then begin to
|
||||
replicate this snapshot as soon as the :term:`active` replica's
|
||||
snapshot instance is created and becomes ``available``.
|
||||
|
||||
Deleting a snapshot
|
||||
-------------------
|
||||
When a user deletes a snapshot, the snapshot instances corresponding to each
|
||||
replica of the share have their ``status`` attribute set to ``deleting``.
|
||||
Drivers must update their secondaries as soon as the :term:`active` replica's
|
||||
snapshot instance is deleted.
|
||||
|
||||
|
||||
Driver Interfaces
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
As part of the ``_update_share_stats()`` call, the base driver reports the
|
||||
``replication_domain`` capability. Drivers are expected to update the
|
||||
:term:`replication_type` capability.
|
||||
|
||||
Drivers must implement the methods enumerated below in order to support
|
||||
replication. ``promote_replica``, ``update_replica_state`` and
|
||||
``update_replicated_snapshot`` need not be implemented by drivers that support
|
||||
the :term:`writable` style of replication. The snapshot methods
|
||||
``create_replicated_snapshot``, ``delete_replicated_snapshot`` and
|
||||
``update_replicated_snapshot`` need not be implemented by a driver that does
|
||||
not support snapshots.
|
||||
|
||||
Each driver request is made on a specific host. Create/delete operations
|
||||
on secondary replicas are always made on the destination host. Create/delete
|
||||
operations on snapshots are always made on the :term:`active` replica's host.
|
||||
``update_replica_state`` and ``update_replicated_snapshot`` calls are made on
|
||||
the host that the replica or snapshot resides on.
|
||||
|
||||
Share Replica interfaces:
|
||||
-------------------------
|
||||
|
||||
.. autoclass:: manila.share.driver.ShareDriver
|
||||
:members: create_replica, delete_replica, promote_replica, update_replica_state
|
||||
|
||||
Replicated Snapshot interfaces:
|
||||
-------------------------------
|
||||
|
||||
.. autoclass:: manila.share.driver.ShareDriver
|
||||
:members: create_replicated_snapshot, delete_replicated_snapshot, update_replicated_snapshot
|
@ -4,7 +4,7 @@ Glossary
|
||||
|
||||
.. glossary::
|
||||
|
||||
Manila
|
||||
manila
|
||||
OpenStack project to provide "Shared Filesystems as a service".
|
||||
|
||||
manila-api
|
||||
@ -13,8 +13,8 @@ Glossary
|
||||
There is :term:`python-manilaclient` to interact with the API.
|
||||
|
||||
python-manilaclient
|
||||
Command line interface to interact with :term:`Manila` via :term:`manila-api` and also a
|
||||
Python module to interact programmatically with :term:`Manila`.
|
||||
Command line interface to interact with :term:`manila` via :term:`manila-api` and also a
|
||||
Python module to interact programmatically with :term:`manila`.
|
||||
|
||||
manila-scheduler
|
||||
Responsible for scheduling/routing requests to the appropriate :term:`manila-share` service.
|
||||
@ -27,3 +27,53 @@ Glossary
|
||||
Acronym for 'driver handles share servers'. It defines two different share driver modes
|
||||
when they either do handle share servers or not. Each driver is allowed to work only in
|
||||
one mode at once. Requirement is to support, at least, one mode.
|
||||
|
||||
replication_type
|
||||
Type of replication supported by a share driver. If the share driver supports replication
|
||||
it will report a valid value to the :term:`manila-scheduler`. The value of this
|
||||
capability can be one of :term:`readable`, :term:`writable` or :term:`dr`.
|
||||
|
||||
readable
|
||||
A type of replication supported by :term:`manila` in which there is one :term:`active`
|
||||
replica (also referred to as `primary` share) and one or more non-active replicas (also
|
||||
referred to as `secondary` shares). All share replicas have at least one export location
|
||||
and are mountable. However, the non-active replicas cannot be written to until after
|
||||
promotion.
|
||||
|
||||
writable
|
||||
A type of replication supported by :term:`manila` in which all share replicas are
|
||||
writable. There is no requirement of a promotion since replication is synchronous.
|
||||
All share replicas have one or more export locations each and are mountable.
|
||||
|
||||
dr
|
||||
Acronym for `Disaster Recovery`. It is a type of replication supported by :term:`manila`
|
||||
in which there is one :term:`active` replica (also referred to as `primary` share) and
|
||||
one or more non-active replicas (also referred to as `secondary` shares). Only the
|
||||
`active` replica has one or more export locations and can be mounted. The non-active
|
||||
replicas are inaccessible until after promotion.
|
||||
|
||||
active
|
||||
In :term:`manila`, an `active` replica refers to a share that can be written to. In
|
||||
`readable` and `dr` styles of replication, there is only one `active` replica at any given
|
||||
point in time. Thus, it may also be referred to as the `primary` share. In `writable`
|
||||
style of replication, all replicas are writable and there may be no distinction of a
|
||||
`primary` share.
|
||||
|
||||
replica_state
|
||||
An attribute of the Share Instance (Share Replica) model in :term:`manila`. If the value is
|
||||
:term:`active`, it refers to the type of the replica. If the value is one of `in_sync` or
|
||||
`out_of_sync`, it refers to the state of consistency of data between the :term:`active`
|
||||
replica and the share replica. If the value is `error`, a potentially irrecoverable
|
||||
error may have occurred during the update of data between the :term:`active` replica and
|
||||
the share replica.
|
||||
|
||||
replication_change
|
||||
State of a non-active replica when it is being promoted to become the :term:`active`
|
||||
replica.
|
||||
|
||||
recovery point objective
|
||||
Abbreviated as ``RPO``, recovery point objective is a target window of time between which
|
||||
a storage backend may guarantee that data is consistent between a primary and a secondary
|
||||
replica. This window is **not** managed by :term:`manila`.
|
||||
|
||||
|
||||
|
@ -512,8 +512,8 @@ class ShareDriver(object):
|
||||
may be added by the driver instead of R/W. Note that raising an
|
||||
exception *will* result in the access_rules_status on the replica,
|
||||
and the share itself being "out_of_sync". Drivers can sync on the
|
||||
valid access rules that are provided on the create_replica and
|
||||
promote_replica calls.
|
||||
valid access rules that are provided on the ``create_replica`` and
|
||||
``promote_replica`` calls.
|
||||
|
||||
:param context: Current context
|
||||
:param share: Share model with share data.
|
||||
@ -1049,15 +1049,16 @@ class ShareDriver(object):
|
||||
access_rules, replica_snapshots, share_server=None):
|
||||
"""Replicate the active replica to a new replica on this backend.
|
||||
|
||||
NOTE: This call is made on the host that the new replica is
|
||||
being created upon.
|
||||
.. note::
|
||||
This call is made on the host that the new replica is being created
|
||||
upon.
|
||||
|
||||
:param context: Current context
|
||||
:param replica_list: List of all replicas for a particular share.
|
||||
This list also contains the replica to be created. The 'active'
|
||||
replica will have its 'replica_state' attr set to 'active'.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
This list also contains the replica to be created. The 'active'
|
||||
replica will have its 'replica_state' attr set to 'active'.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
@ -1086,59 +1087,69 @@ class ShareDriver(object):
|
||||
},
|
||||
...
|
||||
]
|
||||
|
||||
:param new_replica: The share replica dictionary.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
|
||||
Example::
|
||||
|
||||
{
|
||||
'id': 'e82ff8b6-65f0-11e5-9d70-feff819cdc9f',
|
||||
'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'deleted': False,
|
||||
'host': 'openstack2@cmodeSSVMNFS2',
|
||||
'status': 'creating',
|
||||
'scheduled_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'launched_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'terminated_at': None,
|
||||
'replica_state': 'out_of_sync',
|
||||
'availability_zone_id': 'f6e146d0-65f0-11e5-9d70-feff819cdc9f',
|
||||
'export_locations': [
|
||||
models.ShareInstanceExportLocations,
|
||||
],
|
||||
'access_rules_status': 'out_of_sync',
|
||||
'share_network_id': '4ccd5318-65f1-11e5-9d70-feff819cdc9f',
|
||||
'share_server_id': 'e6155221-ea00-49ef-abf9-9f89b7dd900a',
|
||||
'share_server': <models.ShareServer> or None,
|
||||
'id': 'e82ff8b6-65f0-11e5-9d70-feff819cdc9f',
|
||||
'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'deleted': False,
|
||||
'host': 'openstack2@cmodeSSVMNFS2',
|
||||
'status': 'creating',
|
||||
'scheduled_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'launched_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'terminated_at': None,
|
||||
'replica_state': 'out_of_sync',
|
||||
'availability_zone_id': 'f6e146d0-65f0-11e5-9d70-feff819cdc9f',
|
||||
'export_locations': [
|
||||
models.ShareInstanceExportLocations,
|
||||
],
|
||||
'access_rules_status': 'out_of_sync',
|
||||
'share_network_id': '4ccd5318-65f1-11e5-9d70-feff819cdc9f',
|
||||
'share_server_id': 'e6155221-ea00-49ef-abf9-9f89b7dd900a',
|
||||
'share_server': <models.ShareServer> or None,
|
||||
}
|
||||
:param access_rules: A list of access rules that other instances of
|
||||
the share already obey. Drivers are expected to apply access rules
|
||||
to the new replica or disregard access rules that don't apply.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
[ {
|
||||
'id': 'f0875f6f-766b-4865-8b41-cccb4cdf1676',
|
||||
'deleted' = False,
|
||||
'share_id' = 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'access_type' = 'ip',
|
||||
'access_to' = '172.16.20.1',
|
||||
'access_level' = 'rw',
|
||||
}]
|
||||
:param replica_snapshots: List of dictionaries of snapshot instances
|
||||
for each snapshot of the share whose 'aggregate_status' property was
|
||||
reported to be 'available' when the share manager initiated this
|
||||
request. Each list member will have two sub dictionaries:
|
||||
'active_replica_snapshot' and 'share_replica_snapshot'. The 'active'
|
||||
replica snapshot corresponds to the instance of the snapshot on any
|
||||
of the 'active' replicas of the share while share_replica_snapshot
|
||||
corresponds to the snapshot instance for the specific replica that
|
||||
will need to exist on the new share replica that is being created.
|
||||
The driver needs to ensure that this snapshot instance is truly
|
||||
available before transitioning the replica from 'out_of_sync' to
|
||||
'in_sync'. Snapshots instances for snapshots that have an
|
||||
'aggregate_status' of 'creating' or 'deleting' will be polled for in
|
||||
the update_replicated_snapshot method.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
[ {
|
||||
|
||||
:param access_rules: A list of access rules.
|
||||
These are rules that other instances of the share already obey.
|
||||
Drivers are expected to apply access rules to the new replica or
|
||||
disregard access rules that don't apply.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
'id': 'f0875f6f-766b-4865-8b41-cccb4cdf1676',
|
||||
'deleted' = False,
|
||||
'share_id' = 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'access_type' = 'ip',
|
||||
'access_to' = '172.16.20.1',
|
||||
'access_level' = 'rw',
|
||||
}
|
||||
]
|
||||
|
||||
:param replica_snapshots: List of dictionaries of snapshot instances.
|
||||
This includes snapshot instances of every snapshot of the share
|
||||
whose 'aggregate_status' property was reported to be 'available'
|
||||
when the share manager initiated this request. Each list member
|
||||
will have two sub dictionaries: 'active_replica_snapshot' and
|
||||
'share_replica_snapshot'. The 'active' replica snapshot corresponds
|
||||
to the instance of the snapshot on any of the 'active' replicas of
|
||||
the share while share_replica_snapshot corresponds to the snapshot
|
||||
instance for the specific replica that will need to exist on the
|
||||
new share replica that is being created. The driver needs to ensure
|
||||
that this snapshot instance is truly available before transitioning
|
||||
the replica from 'out_of_sync' to 'in_sync'. Snapshots instances
|
||||
for snapshots that have an 'aggregate_status' of 'creating' or
|
||||
'deleting' will be polled for in the ``update_replicated_snapshot``
|
||||
method.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
'active_replica_snapshot': {
|
||||
'id': '8bda791c-7bb6-4e7b-9b64-fefff85ff13e',
|
||||
'share_instance_id': '10e49c3e-aca9-483b-8c2d-1c337b38d6af',
|
||||
@ -1153,17 +1164,27 @@ class ShareDriver(object):
|
||||
'provider_location': None,
|
||||
...
|
||||
},
|
||||
}]
|
||||
:param share_server: <models.ShareServer> or None,
|
||||
Share server of the replica being created.
|
||||
:return: None or a dictionary containing export_locations,
|
||||
replica_state and access_rules_status. export_locations is a list of
|
||||
paths and replica_state is one of active, in_sync, out_of_sync or
|
||||
error. A backend supporting 'writable' type replication should return
|
||||
'active' as the replica_state. Export locations should be in the
|
||||
same format as returned during the create_share call.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
}
|
||||
]
|
||||
|
||||
:param share_server: <models.ShareServer> or None
|
||||
Share server of the replica being created.
|
||||
:return: None or a dictionary.
|
||||
The dictionary can contain export_locations replica_state and
|
||||
access_rules_status. export_locations is a list of paths and
|
||||
replica_state is one of 'active', 'in_sync', 'out_of_sync' or
|
||||
'error'.
|
||||
|
||||
.. important::
|
||||
|
||||
A backend supporting 'writable' type replication should return
|
||||
'active' as the replica_state.
|
||||
|
||||
Export locations should be in the same format as returned during the
|
||||
``create_share`` call.
|
||||
|
||||
Example::
|
||||
|
||||
{
|
||||
'export_locations': [
|
||||
{
|
||||
@ -1175,6 +1196,7 @@ class ShareDriver(object):
|
||||
'replica_state': 'in_sync',
|
||||
'access_rules_status': 'in_sync',
|
||||
}
|
||||
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@ -1182,15 +1204,16 @@ class ShareDriver(object):
|
||||
replica, share_server=None):
|
||||
"""Delete a replica.
|
||||
|
||||
NOTE: This call is made on the host that hosts the replica being
|
||||
deleted.
|
||||
.. note::
|
||||
This call is made on the host that hosts the replica being
|
||||
deleted.
|
||||
|
||||
:param context: Current context
|
||||
:param replica_list: List of all replicas for a particular share.
|
||||
This list also contains the replica to be deleted. The 'active'
|
||||
replica will have its 'replica_state' attr set to 'active'.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
:param replica_list: List of all replicas for a particular share
|
||||
This list also contains the replica to be deleted. The 'active'
|
||||
replica will have its 'replica_state' attr set to 'active'.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
@ -1219,38 +1242,41 @@ class ShareDriver(object):
|
||||
},
|
||||
...
|
||||
]
|
||||
|
||||
:param replica: Dictionary of the share replica being deleted.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
|
||||
Example::
|
||||
|
||||
{
|
||||
'id': 'e82ff8b6-65f0-11e5-9d70-feff819cdc9f',
|
||||
'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'deleted': False,
|
||||
'host': 'openstack2@cmodeSSVMNFS2',
|
||||
'status': 'available',
|
||||
'scheduled_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'launched_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'terminated_at': None,
|
||||
'replica_state': 'in_sync',
|
||||
'availability_zone_id': 'f6e146d0-65f0-11e5-9d70-feff819cdc9f',
|
||||
'export_locations': [
|
||||
models.ShareInstanceExportLocations
|
||||
],
|
||||
'access_rules_status': 'out_of_sync',
|
||||
'share_network_id': '4ccd5318-65f1-11e5-9d70-feff819cdc9f',
|
||||
'share_server_id': '53099868-65f1-11e5-9d70-feff819cdc9f',
|
||||
'share_server': <models.ShareServer> or None,
|
||||
'id': 'e82ff8b6-65f0-11e5-9d70-feff819cdc9f',
|
||||
'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'deleted': False,
|
||||
'host': 'openstack2@cmodeSSVMNFS2',
|
||||
'status': 'available',
|
||||
'scheduled_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'launched_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'terminated_at': None,
|
||||
'replica_state': 'in_sync',
|
||||
'availability_zone_id': 'f6e146d0-65f0-11e5-9d70-feff819cdc9f',
|
||||
'export_locations': [
|
||||
models.ShareInstanceExportLocations
|
||||
],
|
||||
'access_rules_status': 'out_of_sync',
|
||||
'share_network_id': '4ccd5318-65f1-11e5-9d70-feff819cdc9f',
|
||||
'share_server_id': '53099868-65f1-11e5-9d70-feff819cdc9f',
|
||||
'share_server': <models.ShareServer> or None,
|
||||
}
|
||||
:param replica_snapshots: A list of dictionaries containing snapshot
|
||||
instances that are associated with the share replica being deleted.
|
||||
No model updates are possible in this method. The driver should
|
||||
return when the cleanup is completed on the backend for both,
|
||||
the snapshots and the replica itself. Drivers must handle situations
|
||||
where the snapshot may not yet have finished 'creating' on this
|
||||
replica.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
|
||||
:param replica_snapshots: List of dictionaries of snapshot instances.
|
||||
The dict contains snapshot instances that are associated with the
|
||||
share replica being deleted.
|
||||
No model updates to snapshot instances are possible in this method.
|
||||
The driver should return when the cleanup is completed on the
|
||||
backend for both, the snapshots and the replica itself. Drivers
|
||||
must handle situations where the snapshot may not yet have
|
||||
finished 'creating' on this replica.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
@ -1269,12 +1295,14 @@ class ShareDriver(object):
|
||||
},
|
||||
...
|
||||
]
|
||||
:param share_server: <models.ShareServer> or None,
|
||||
Share server of the replica to be deleted.
|
||||
|
||||
:param share_server: <models.ShareServer> or None
|
||||
Share server of the replica to be deleted.
|
||||
:return: None.
|
||||
:raises Exception. Any exception raised will set the share replica's
|
||||
'status' and 'replica_state' to 'error_deleting'. It will not affect
|
||||
snapshots belonging to this replica.
|
||||
:raises: Exception.
|
||||
Any exception raised will set the share replica's 'status' and
|
||||
'replica_state' attributes to 'error_deleting'. It will not affect
|
||||
snapshots belonging to this replica.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@ -1282,15 +1310,16 @@ class ShareDriver(object):
|
||||
share_server=None):
|
||||
"""Promote a replica to 'active' replica state.
|
||||
|
||||
NOTE: This call is made on the host that hosts the replica being
|
||||
promoted.
|
||||
.. note::
|
||||
This call is made on the host that hosts the replica being
|
||||
promoted.
|
||||
|
||||
:param context: Current context
|
||||
:param replica_list: List of all replicas for a particular share.
|
||||
This list also contains the replica to be promoted. The 'active'
|
||||
replica will have its 'replica_state' attr set to 'active'.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
:param replica_list: List of all replicas for a particular share
|
||||
This list also contains the replica to be promoted. The 'active'
|
||||
replica will have its 'replica_state' attr set to 'active'.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
@ -1321,54 +1350,59 @@ class ShareDriver(object):
|
||||
]
|
||||
|
||||
:param replica: Dictionary of the replica to be promoted.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
|
||||
Example::
|
||||
|
||||
{
|
||||
'id': 'e82ff8b6-65f0-11e5-9d70-feff819cdc9f',
|
||||
'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'deleted': False,
|
||||
'host': 'openstack2@cmodeSSVMNFS2',
|
||||
'status': 'available',
|
||||
'scheduled_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'launched_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'terminated_at': None,
|
||||
'replica_state': 'in_sync',
|
||||
'availability_zone_id': 'f6e146d0-65f0-11e5-9d70-feff819cdc9f',
|
||||
'export_locations': [
|
||||
models.ShareInstanceExportLocations
|
||||
],
|
||||
'access_rules_status': 'in_sync',
|
||||
'share_network_id': '4ccd5318-65f1-11e5-9d70-feff819cdc9f',
|
||||
'share_server_id': '07574742-67ea-4dfd-9844-9fbd8ada3d87',
|
||||
'share_server': <models.ShareServer> or None,
|
||||
'id': 'e82ff8b6-65f0-11e5-9d70-feff819cdc9f',
|
||||
'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'deleted': False,
|
||||
'host': 'openstack2@cmodeSSVMNFS2',
|
||||
'status': 'available',
|
||||
'scheduled_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'launched_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'terminated_at': None,
|
||||
'replica_state': 'in_sync',
|
||||
'availability_zone_id': 'f6e146d0-65f0-11e5-9d70-feff819cdc9f',
|
||||
'export_locations': [
|
||||
models.ShareInstanceExportLocations
|
||||
],
|
||||
'access_rules_status': 'in_sync',
|
||||
'share_network_id': '4ccd5318-65f1-11e5-9d70-feff819cdc9f',
|
||||
'share_server_id': '07574742-67ea-4dfd-9844-9fbd8ada3d87',
|
||||
'share_server': <models.ShareServer> or None,
|
||||
}
|
||||
:param access_rules: A list of access rules that other instances of
|
||||
the share already obey.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
[ {
|
||||
'id': 'f0875f6f-766b-4865-8b41-cccb4cdf1676',
|
||||
'deleted' = False,
|
||||
'share_id' = 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'access_type' = 'ip',
|
||||
'access_to' = '172.16.20.1',
|
||||
'access_level' = 'rw',
|
||||
}]
|
||||
:param share_server: <models.ShareServer> or None,
|
||||
Share server of the replica to be promoted.
|
||||
:return: updated_replica_list or None
|
||||
|
||||
:param access_rules: A list of access rules
|
||||
These access rules are obeyed by other instances of the share
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
'id': 'f0875f6f-766b-4865-8b41-cccb4cdf1676',
|
||||
'deleted' = False,
|
||||
'share_id' = 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'access_type' = 'ip',
|
||||
'access_to' = '172.16.20.1',
|
||||
'access_level' = 'rw',
|
||||
}
|
||||
]
|
||||
|
||||
:param share_server: <models.ShareServer> or None
|
||||
Share server of the replica to be promoted.
|
||||
:return: updated_replica_list or None.
|
||||
The driver can return the updated list as in the request
|
||||
parameter. Changes that will be updated to the Database are:
|
||||
'export_locations', 'access_rules_status' and 'replica_state'.
|
||||
:raises Exception
|
||||
:raises: Exception.
|
||||
This can be any exception derived from BaseException. This is
|
||||
re-raised by the manager after some necessary cleanup. If the
|
||||
driver raises an exception during promotion, it is assumed
|
||||
that all of the replicas of the share are in an inconsistent
|
||||
state. Recovery is only possible through the periodic update
|
||||
call and/or administrator intervention to correct the 'status'
|
||||
of the affected replicas if they become healthy again.
|
||||
driver raises an exception during promotion, it is assumed that
|
||||
all of the replicas of the share are in an inconsistent state.
|
||||
Recovery is only possible through the periodic update call and/or
|
||||
administrator intervention to correct the 'status' of the affected
|
||||
replicas if they become healthy again.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@ -1377,8 +1411,9 @@ class ShareDriver(object):
|
||||
share_server=None):
|
||||
"""Update the replica_state of a replica.
|
||||
|
||||
NOTE: This call is made on the host which hosts the replica being
|
||||
updated.
|
||||
.. note::
|
||||
This call is made on the host which hosts the replica being
|
||||
updated.
|
||||
|
||||
Drivers should fix replication relationships that were broken if
|
||||
possible inside this method.
|
||||
@ -1387,11 +1422,11 @@ class ShareDriver(object):
|
||||
whenever requested by the administrator through the 'resync' API.
|
||||
|
||||
:param context: Current context
|
||||
:param replica_list: List of all replicas for a particular share.
|
||||
This list also contains the replica to be updated. The 'active'
|
||||
replica will have its 'replica_state' attr set to 'active'.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
:param replica_list: List of all replicas for a particular share
|
||||
This list also contains the replica to be updated. The 'active'
|
||||
replica will have its 'replica_state' attr set to 'active'.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
@ -1420,79 +1455,89 @@ class ShareDriver(object):
|
||||
},
|
||||
...
|
||||
]
|
||||
:param replica: Dictionary of the replica being updated.
|
||||
Replica state will always be 'in_sync', 'out_of_sync', or 'error'.
|
||||
Replicas in 'active' state will not be passed via this parameter.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
|
||||
:param replica: Dictionary of the replica being updated
|
||||
Replica state will always be 'in_sync', 'out_of_sync', or 'error'.
|
||||
Replicas in 'active' state will not be passed via this parameter.
|
||||
|
||||
Example::
|
||||
|
||||
{
|
||||
'id': 'd487b88d-e428-4230-a465-a800c2cce5f8',
|
||||
'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'deleted': False,
|
||||
'host': 'openstack2@cmodeSSVMNFS1',
|
||||
'status': 'available',
|
||||
'scheduled_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'launched_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'terminated_at': None,
|
||||
'replica_state': 'in_sync',
|
||||
'availability_zone_id': 'e2c2db5c-cb2f-4697-9966-c06fb200cb80',
|
||||
'export_locations': [
|
||||
models.ShareInstanceExportLocations,
|
||||
],
|
||||
'access_rules_status': 'in_sync',
|
||||
'share_network_id': '4ccd5318-65f1-11e5-9d70-feff819cdc9f',
|
||||
'share_server_id': '4ce78e7b-0ef6-4730-ac2a-fd2defefbd05',
|
||||
}
|
||||
:param access_rules: A list of access rules that other replicas of
|
||||
the share already obey. The driver could attempt to sync on any
|
||||
un-applied access_rules.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
[ {
|
||||
'id': 'f0875f6f-766b-4865-8b41-cccb4cdf1676',
|
||||
'deleted' = False,
|
||||
'share_id' = 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'access_type' = 'ip',
|
||||
'access_to' = '172.16.20.1',
|
||||
'access_level' = 'rw',
|
||||
}]
|
||||
:param replica_snapshots: List of dictionaries of snapshot instances
|
||||
for each snapshot of the share whose 'aggregate_status' property was
|
||||
reported to be 'available' when the share manager initiated this
|
||||
request. Each list member will have two sub dictionaries:
|
||||
'active_replica_snapshot' and 'share_replica_snapshot'. The 'active'
|
||||
replica snapshot corresponds to the instance of the snapshot on any
|
||||
of the 'active' replicas of the share while share_replica_snapshot
|
||||
corresponds to the snapshot instance for the specific replica being
|
||||
updated. The driver needs to ensure that this snapshot instance is
|
||||
truly available before transitioning from 'out_of_sync' to
|
||||
'in_sync'. Snapshots instances for snapshots that have an
|
||||
'aggregate_status' of 'creating' or 'deleting' will be polled for in
|
||||
the update_replicated_snapshot method.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
[ {
|
||||
'active_replica_snapshot': {
|
||||
'id': '8bda791c-7bb6-4e7b-9b64-fefff85ff13e',
|
||||
'share_instance_id': '10e49c3e-aca9-483b-8c2d-1c337b38d6af',
|
||||
'id': 'd487b88d-e428-4230-a465-a800c2cce5f8',
|
||||
'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'deleted': False,
|
||||
'host': 'openstack2@cmodeSSVMNFS1',
|
||||
'status': 'available',
|
||||
'provider_location': '/newton/share-snapshot-10e49c3e-aca9',
|
||||
...
|
||||
'scheduled_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'launched_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'terminated_at': None,
|
||||
'replica_state': 'in_sync',
|
||||
'availability_zone_id': 'e2c2db5c-cb2f-4697-9966-c06fb200cb80',
|
||||
'export_locations': [
|
||||
models.ShareInstanceExportLocations,
|
||||
],
|
||||
'access_rules_status': 'in_sync',
|
||||
'share_network_id': '4ccd5318-65f1-11e5-9d70-feff819cdc9f',
|
||||
'share_server_id': '4ce78e7b-0ef6-4730-ac2a-fd2defefbd05',
|
||||
}
|
||||
|
||||
:param access_rules: A list of access rules
|
||||
These access rules are obeyed by other instances of the share. The
|
||||
driver could attempt to sync on any un-applied access_rules.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
'id': 'f0875f6f-766b-4865-8b41-cccb4cdf1676',
|
||||
'deleted' = False,
|
||||
'share_id' = 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'access_type' = 'ip',
|
||||
'access_to' = '172.16.20.1',
|
||||
'access_level' = 'rw',
|
||||
}
|
||||
]
|
||||
|
||||
:param replica_snapshots: List of dictionaries of snapshot instances.
|
||||
This includes snapshot instances of every snapshot of the share
|
||||
whose 'aggregate_status' property was reported to be 'available'
|
||||
when the share manager initiated this request. Each list member
|
||||
will have two sub dictionaries: 'active_replica_snapshot' and
|
||||
'share_replica_snapshot'. The 'active' replica snapshot corresponds
|
||||
to the instance of the snapshot on any of the 'active' replicas of
|
||||
the share while share_replica_snapshot corresponds to the snapshot
|
||||
instance for the specific replica being updated. The driver needs
|
||||
to ensure that this snapshot instance is truly available before
|
||||
transitioning from 'out_of_sync' to 'in_sync'. Snapshots instances
|
||||
for snapshots that have an 'aggregate_status' of 'creating' or
|
||||
'deleting' will be polled for in the update_replicated_snapshot
|
||||
method.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
'active_replica_snapshot': {
|
||||
'id': '8bda791c-7bb6-4e7b-9b64-fefff85ff13e',
|
||||
'share_instance_id': '10e49c3e-aca9-483b-8c2d-1c337b38d6af',
|
||||
'status': 'available',
|
||||
'provider_location': '/newton/share-snapshot-10e49c3e-aca9',
|
||||
...
|
||||
},
|
||||
'share_replica_snapshot': {
|
||||
'id': ,
|
||||
'share_instance_id': 'd487b88d-e428-4230-a465-a800c2cce5f8',
|
||||
'status': 'creating',
|
||||
'provider_location': None,
|
||||
'id': '10e49c3e-aca9-483b-8c2d-1c337b38d6af',
|
||||
'share_instance_id': 'd487b88d-e428-4230-a465-a800c2cce5f8',
|
||||
'status': 'creating',
|
||||
'provider_location': None,
|
||||
...
|
||||
},
|
||||
}]
|
||||
}
|
||||
]
|
||||
|
||||
:param share_server: <models.ShareServer> or None
|
||||
:return: replica_state
|
||||
replica_state - a str value denoting the replica_state that the
|
||||
replica can have. Valid values are 'in_sync' and 'out_of_sync'
|
||||
or None (to leave the current replica_state unchanged).
|
||||
:return: replica_state: a str value denoting the replica_state.
|
||||
Valid values are 'in_sync' and 'out_of_sync' or None (to leave the
|
||||
current replica_state unchanged).
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@ -1501,9 +1546,10 @@ class ShareDriver(object):
|
||||
share_server=None):
|
||||
"""Create a snapshot on active instance and update across the replicas.
|
||||
|
||||
NOTE: This call is made on the 'active' replica's host. Drivers
|
||||
are expected to transfer the snapshot created to the respective
|
||||
replicas.
|
||||
.. note::
|
||||
This call is made on the 'active' replica's host. Drivers are
|
||||
expected to transfer the snapshot created to the respective
|
||||
replicas.
|
||||
|
||||
The driver is expected to return model updates to the share manager.
|
||||
If it was able to confirm the creation of any number of the snapshot
|
||||
@ -1512,11 +1558,11 @@ class ShareDriver(object):
|
||||
to '100%'.
|
||||
|
||||
:param context: Current context
|
||||
:param replica_list: List of all replicas for a particular share.
|
||||
The 'active' replica will have its 'replica_state' attr set to
|
||||
'active'.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
:param replica_list: List of all replicas for a particular share
|
||||
The 'active' replica will have its 'replica_state' attr set to
|
||||
'active'.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
@ -1537,11 +1583,14 @@ class ShareDriver(object):
|
||||
},
|
||||
...
|
||||
]
|
||||
:param replica_snapshots: List of all snapshot instances that track
|
||||
the snapshot across the replicas. All the instances will have their
|
||||
status attribute set to 'creating'.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
|
||||
:param replica_snapshots: List of dictionaries of snapshot instances.
|
||||
These snapshot instances track the snapshot across the replicas.
|
||||
All the instances will have their status attribute set to
|
||||
'creating'.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
'id': 'd3931a93-3984-421e-a9e7-d9f71895450a',
|
||||
@ -1559,12 +1608,13 @@ class ShareDriver(object):
|
||||
},
|
||||
...
|
||||
]
|
||||
|
||||
:param share_server: <models.ShareServer> or None
|
||||
:return: List of replica_snapshots, a list of dictionaries containing
|
||||
values that need to be updated on the database for the snapshot
|
||||
instances being created.
|
||||
:raises: Exception. Any exception in this method will set all
|
||||
instances to 'error'.
|
||||
:return: List of dictionaries of snapshot instances.
|
||||
The dictionaries can contain values that need to be updated on the
|
||||
database for the snapshot instances being created.
|
||||
:raises: Exception.
|
||||
Any exception in this method will set all instances to 'error'.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@ -1572,9 +1622,10 @@ class ShareDriver(object):
|
||||
replica_snapshots, share_server=None):
|
||||
"""Delete a snapshot by deleting its instances across the replicas.
|
||||
|
||||
NOTE: This call is made on the 'active' replica's host, since
|
||||
drivers may not be able to delete the snapshot from an individual
|
||||
replica.
|
||||
.. note::
|
||||
This call is made on the 'active' replica's host, since
|
||||
drivers may not be able to delete the snapshot from an individual
|
||||
replica.
|
||||
|
||||
The driver is expected to return model updates to the share manager.
|
||||
If it was able to confirm the removal of any number of the snapshot
|
||||
@ -1583,11 +1634,11 @@ class ShareDriver(object):
|
||||
from the database.
|
||||
|
||||
:param context: Current context
|
||||
:param replica_list: List of all replicas for a particular share.
|
||||
The 'active' replica will have its 'replica_state' attr set to
|
||||
'active'.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
:param replica_list: List of all replicas for a particular share
|
||||
The 'active' replica will have its 'replica_state' attr set to
|
||||
'active'.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
@ -1608,11 +1659,14 @@ class ShareDriver(object):
|
||||
},
|
||||
...
|
||||
]
|
||||
:param replica_snapshots: List of all snapshot instances that track
|
||||
the snapshot across the replicas. All the instances will have their
|
||||
status attribute set to 'deleting'.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
|
||||
:param replica_snapshots: List of dictionaries of snapshot instances.
|
||||
These snapshot instances track the snapshot across the replicas.
|
||||
All the instances will have their status attribute set to
|
||||
'deleting'.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
'id': 'd3931a93-3984-421e-a9e7-d9f71895450a',
|
||||
@ -1630,14 +1684,16 @@ class ShareDriver(object):
|
||||
},
|
||||
...
|
||||
]
|
||||
|
||||
:param share_server: <models.ShareServer> or None
|
||||
:return: List of replica_snapshots, a list of dictionaries containing
|
||||
values that need to be updated on the database for the snapshot
|
||||
instances being deleted. To confirm the deletion of the snapshot
|
||||
instance, set the 'status' attribute of the instance to
|
||||
'deleted'(constants.STATUS_DELETED).
|
||||
:raises: Exception. Any exception in this method will set all
|
||||
instances to 'error_deleting'.
|
||||
:return: List of dictionaries of snapshot instances.
|
||||
The dictionaries can contain values that need to be updated on the
|
||||
database for the snapshot instances being deleted. To confirm the
|
||||
deletion of the snapshot instance, set the 'status' attribute of
|
||||
the instance to 'deleted' (constants.STATUS_DELETED)
|
||||
:raises: Exception.
|
||||
Any exception in this method will set the status attribute of all
|
||||
snapshot instances to 'error_deleting'.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
@ -1646,8 +1702,9 @@ class ShareDriver(object):
|
||||
replica_snapshot, share_server=None):
|
||||
"""Update the status of a snapshot instance that lives on a replica.
|
||||
|
||||
NOTE: For DR and Readable styles of replication, this call is made on
|
||||
the replica's host and not the 'active' replica's host.
|
||||
.. note::
|
||||
For DR and Readable styles of replication, this call is made on
|
||||
the replica's host and not the 'active' replica's host.
|
||||
|
||||
This method is called periodically by the share manager. It will
|
||||
query for snapshot instances that track the parent snapshot across
|
||||
@ -1661,60 +1718,64 @@ class ShareDriver(object):
|
||||
instance status to 'error'.
|
||||
|
||||
:param context: Current context
|
||||
:param replica_list: List of all replicas for a particular share.
|
||||
The 'active' replica will have its 'replica_state' attr set to
|
||||
'active'.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
:param replica_list: List of all replicas for a particular share
|
||||
The 'active' replica will have its 'replica_state' attr set to
|
||||
'active'.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
'id': 'd487b88d-e428-4230-a465-a800c2cce5f8',
|
||||
'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'replica_state': 'in_sync',
|
||||
...
|
||||
'share_server_id': '4ce78e7b-0ef6-4730-ac2a-fd2defefbd05',
|
||||
'share_server': <models.ShareServer> or None,
|
||||
},
|
||||
{
|
||||
'id': '10e49c3e-aca9-483b-8c2d-1c337b38d6af',
|
||||
'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'replica_state': 'active',
|
||||
...
|
||||
'share_server_id': 'f63629b3-e126-4448-bec2-03f788f76094',
|
||||
'share_server': <models.ShareServer> or None,
|
||||
},
|
||||
...
|
||||
{
|
||||
'id': 'd487b88d-e428-4230-a465-a800c2cce5f8',
|
||||
'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'replica_state': 'in_sync',
|
||||
...
|
||||
'share_server_id': '4ce78e7b-0ef6-4730-ac2a-fd2defefbd05',
|
||||
'share_server': <models.ShareServer> or None,
|
||||
},
|
||||
{
|
||||
'id': '10e49c3e-aca9-483b-8c2d-1c337b38d6af',
|
||||
'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'replica_state': 'active',
|
||||
...
|
||||
'share_server_id': 'f63629b3-e126-4448-bec2-03f788f76094',
|
||||
'share_server': <models.ShareServer> or None,
|
||||
},
|
||||
...
|
||||
]
|
||||
:param share_replica: Dictionary of the replica the snapshot instance
|
||||
is meant to be associated with. Replicas in 'active' replica_state
|
||||
will not be passed via this parameter.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
|
||||
:param share_replica: Share replica dictionary.
|
||||
This replica is associated with the snapshot instance whose
|
||||
status is being updated. Replicas in 'active' replica_state will
|
||||
not be passed via this parameter.
|
||||
|
||||
Example::
|
||||
|
||||
{
|
||||
'id': 'd487b88d-e428-4230-a465-a800c2cce5f8',
|
||||
'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'deleted': False,
|
||||
'host': 'openstack2@cmodeSSVMNFS1',
|
||||
'status': 'available',
|
||||
'scheduled_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'launched_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'terminated_at': None,
|
||||
'replica_state': 'in_sync',
|
||||
'availability_zone_id': 'e2c2db5c-cb2f-4697-9966-c06fb200cb80',
|
||||
'export_locations': [
|
||||
models.ShareInstanceExportLocations,
|
||||
],
|
||||
'access_rules_status': 'in_sync',
|
||||
'share_network_id': '4ccd5318-65f1-11e5-9d70-feff819cdc9f',
|
||||
'share_server_id': '4ce78e7b-0ef6-4730-ac2a-fd2defefbd05',
|
||||
'id': 'd487b88d-e428-4230-a465-a800c2cce5f8',
|
||||
'share_id': 'f0e4bb5e-65f0-11e5-9d70-feff819cdc9f',
|
||||
'deleted': False,
|
||||
'host': 'openstack2@cmodeSSVMNFS1',
|
||||
'status': 'available',
|
||||
'scheduled_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'launched_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
|
||||
'terminated_at': None,
|
||||
'replica_state': 'in_sync',
|
||||
'availability_zone_id': 'e2c2db5c-cb2f-4697-9966-c06fb200cb80',
|
||||
'export_locations': [
|
||||
models.ShareInstanceExportLocations,
|
||||
],
|
||||
'access_rules_status': 'in_sync',
|
||||
'share_network_id': '4ccd5318-65f1-11e5-9d70-feff819cdc9f',
|
||||
'share_server_id': '4ce78e7b-0ef6-4730-ac2a-fd2defefbd05',
|
||||
}
|
||||
:param replica_snapshots: List of all snapshot instances that track
|
||||
the snapshot across the replicas. This will include the instance
|
||||
being updated as well.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
|
||||
:param replica_snapshots: List of dictionaries of snapshot instances.
|
||||
These snapshot instances track the snapshot across the replicas.
|
||||
This will include the snapshot instance being updated as well.
|
||||
|
||||
Example::
|
||||
|
||||
[
|
||||
{
|
||||
'id': 'd3931a93-3984-421e-a9e7-d9f71895450a',
|
||||
@ -1728,34 +1789,37 @@ class ShareDriver(object):
|
||||
},
|
||||
...
|
||||
]
|
||||
:param replica_snapshot: Dictionary of the snapshot instance to be
|
||||
updated. replica_snapshot will be in 'creating' or 'deleting'
|
||||
states when sent via this parameter.
|
||||
EXAMPLE:
|
||||
.. code::
|
||||
|
||||
:param replica_snapshot: Dictionary of the snapshot instance.
|
||||
This is the instance to be updated. It will be in 'creating' or
|
||||
'deleting' state when sent via this parameter.
|
||||
|
||||
Example::
|
||||
|
||||
{
|
||||
'name': 'share-snapshot-18825630-574f-4912-93bb-af4611ef35a2',
|
||||
'share_id': 'd487b88d-e428-4230-a465-a800c2cce5f8',
|
||||
'share_name': 'share-d487b88d-e428-4230-a465-a800c2cce5f8',
|
||||
'status': 'creating',
|
||||
'id': '18825630-574f-4912-93bb-af4611ef35a2',
|
||||
'deleted': False,
|
||||
'created_at': datetime.datetime(2016, 8, 3, 0, 5, 58),
|
||||
'share': <models.ShareInstance>,
|
||||
'updated_at': datetime.datetime(2016, 8, 3, 0, 5, 58),
|
||||
'share_instance_id': 'd487b88d-e428-4230-a465-a800c2cce5f8',
|
||||
'snapshot_id': '13ee5cb5-fc53-4539-9431-d983b56c5c40',
|
||||
'progress': '0%',
|
||||
'deleted_at': None,
|
||||
'provider_location': None,
|
||||
'name': 'share-snapshot-18825630-574f-4912-93bb-af4611ef35a2',
|
||||
'share_id': 'd487b88d-e428-4230-a465-a800c2cce5f8',
|
||||
'share_name': 'share-d487b88d-e428-4230-a465-a800c2cce5f8',
|
||||
'status': 'creating',
|
||||
'id': '18825630-574f-4912-93bb-af4611ef35a2',
|
||||
'deleted': False,
|
||||
'created_at': datetime.datetime(2016, 8, 3, 0, 5, 58),
|
||||
'share': <models.ShareInstance>,
|
||||
'updated_at': datetime.datetime(2016, 8, 3, 0, 5, 58),
|
||||
'share_instance_id': 'd487b88d-e428-4230-a465-a800c2cce5f8',
|
||||
'snapshot_id': '13ee5cb5-fc53-4539-9431-d983b56c5c40',
|
||||
'progress': '0%',
|
||||
'deleted_at': None,
|
||||
'provider_location': None,
|
||||
}
|
||||
|
||||
:param share_server: <models.ShareServer> or None
|
||||
:return: replica_snapshot_model_update, a dictionary containing
|
||||
values that need to be updated on the database for the snapshot
|
||||
instance that represents the snapshot on the replica.
|
||||
:raises: exception.SnapshotResourceNotFound for
|
||||
snapshots that are not found on the backend and their status was
|
||||
'deleting'.
|
||||
:return: replica_snapshot_model_update: a dictionary.
|
||||
The dictionary must contain values that need to be updated on the
|
||||
database for the snapshot instance that represents the snapshot on
|
||||
the replica.
|
||||
:raises: exception.SnapshotResourceNotFound
|
||||
Raise this exception for snapshots that are not found on the
|
||||
backend and their status was 'deleting'.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
Loading…
Reference in New Issue
Block a user