from solidfire.adaptor import ElementServiceAdaptor
from solidfire.common import ServiceBase , ApiVersionExceededError , \
- ApiVersionUnsupportedError
-from solidfire.results import AddAccountResult
-from solidfire.results import AddClusterAdminResult
-from solidfire.results import AddDrivesResult
-from solidfire.results import AddLdapClusterAdminResult
-from solidfire.results import AddNodesResult
-from solidfire.results import AddVirtualNetworkResult
-from solidfire.results import AsyncHandleResult
-from solidfire.results import ClearClusterFaultsResult
-from solidfire.results import CloneMultipleVolumesResult
-from solidfire.results import CloneVolumeResult
-from solidfire.results import CompleteClusterPairingResult
-from solidfire.results import CompleteVolumePairingResult
-from solidfire.results import CreateBackupTargetResult
-from solidfire.results import CreateGroupSnapshotResult
-from solidfire.results import CreateScheduleResult
-from solidfire.results import CreateSnapshotResult
-from solidfire.results import CreateVolumeAccessGroupResult
-from solidfire.results import CreateVolumeResult
-from solidfire.results import DeleteGroupSnapshotResult
-from solidfire.results import DeleteSnapshotResult
-from solidfire.results import DeleteVolumeAccessGroupResult
-from solidfire.results import DeleteVolumeResult
-from solidfire.results import DisableEncryptionAtRestResult
-from solidfire.results import DisableLdapAuthenticationResult
-from solidfire.results import DisableSnmpResult
-from solidfire.results import EnableEncryptionAtRestResult
-from solidfire.results import EnableLdapAuthenticationResult
-from solidfire.results import EnableSnmpResult
-from solidfire.results import GetAPIResult
-from solidfire.results import GetAccountResult
-from solidfire.results import GetAsyncResultResult
-from solidfire.results import GetBackupTargetResult
-from solidfire.results import GetClusterCapacityResult
-from solidfire.results import GetClusterConfigResult
-from solidfire.results import GetClusterFullThresholdResult
-from solidfire.results import GetClusterInfoResult
-from solidfire.results import GetClusterStatsResult
-from solidfire.results import GetClusterVersionInfoResult
-from solidfire.results import GetConfigResult
-from solidfire.results import GetCurrentClusterAdminResult
-from solidfire.results import GetDriveHardwareInfoResult
-from solidfire.results import GetDriveStatsResult
-from solidfire.results import GetEfficiencyResult
-from solidfire.results import GetLdapConfigurationResult
-from solidfire.results import GetLimitsResult
-from solidfire.results import GetNetworkConfigResult
-from solidfire.results import GetNodeStatsResult
-from solidfire.results import GetScheduleResult
-from solidfire.results import GetSnmpACLResult
-from solidfire.results import GetSnmpInfoResult
-from solidfire.results import GetSnmpStateResult
-from solidfire.results import GetSnmpTrapInfoResult
-from solidfire.results import GetVolumeAccessGroupLunAssignmentsResult
-from solidfire.results import GetVolumeEfficiencyResult
-from solidfire.results import GetVolumeStatsResult
-from solidfire.results import ListAccountsResult
-from solidfire.results import ListActiveNodesResult
-from solidfire.results import ListActivePairedVolumesResult
-from solidfire.results import ListActiveVolumesResult
-from solidfire.results import ListAllNodesResult
-from solidfire.results import ListBackupTargetsResult
-from solidfire.results import ListBulkVolumeJobsResult
-from solidfire.results import ListClusterAdminsResult
-from solidfire.results import ListClusterFaultsResult
-from solidfire.results import ListClusterPairsResult
-from solidfire.results import ListDeletedVolumesResult
-from solidfire.results import ListDriveHardwareResult
-from solidfire.results import ListDrivesResult
-from solidfire.results import ListEventsResult
-from solidfire.results import ListFibreChannelPortInfoResult
-from solidfire.results import ListFibreChannelSessionsResult
-from solidfire.results import ListGroupSnapshotsResult
-from solidfire.results import ListISCSISessionsResult
-from solidfire.results import ListNodeFibreChannelPortInfoResult
-from solidfire.results import ListNodeStatsResult
-from solidfire.results import ListPendingNodesResult
-from solidfire.results import ListSchedulesResult
-from solidfire.results import ListSnapshotsResult
-from solidfire.results import ListTestsResult
-from solidfire.results import ListUtilitiesResult
-from solidfire.results import ListVirtualNetworksResult
-from solidfire.results import ListVolumeAccessGroupsResult
-from solidfire.results import ListVolumeStatsByAccountResult
-from solidfire.results import ListVolumeStatsByVolumeAccessGroupResult
-from solidfire.results import ListVolumeStatsByVolumeResult
-from solidfire.results import ListVolumesForAccountResult
-from solidfire.results import ListVolumesResult
-from solidfire.results import ModifyAccountResult
-from solidfire.results import ModifyBackupTargetResult
-from solidfire.results import ModifyClusterAdminResult
-from solidfire.results import ModifyClusterFullThresholdResult
-from solidfire.results import ModifyGroupSnapshotResult
-from solidfire.results import ModifyScheduleResult
-from solidfire.results import ModifySnapshotResult
-from solidfire.results import ModifyVolumeAccessGroupLunAssignmentsResult
-from solidfire.results import ModifyVolumeAccessGroupResult
-from solidfire.results import ModifyVolumePairResult
-from solidfire.results import ModifyVolumeResult
-from solidfire.results import PurgeDeletedVolumeResult
-from solidfire.results import RemoveAccountResult
-from solidfire.results import RemoveBackupTargetResult
-from solidfire.results import RemoveClusterAdminResult
-from solidfire.results import RemoveClusterPairResult
-from solidfire.results import RemoveNodesResult
-from solidfire.results import RemoveVirtualNetworkResult
-from solidfire.results import RemoveVolumePairResult
-from solidfire.results import ResetDrivesResult
-from solidfire.results import RestoreDeletedVolumeResult
-from solidfire.results import SetClusterConfigResult
-from solidfire.results import SetConfigResult
-from solidfire.results import SetNetworkConfigResult
-from solidfire.results import SetSnmpACLResult
-from solidfire.results import SetSnmpInfoResult
-from solidfire.results import SetSnmpTrapInfoResult
-from solidfire.results import SnmpSendTestTrapsResult
-from solidfire.results import StartBulkVolumeReadResult
-from solidfire.results import StartBulkVolumeWriteResult
-from solidfire.results import StartClusterPairingResult
-from solidfire.results import StartVolumePairingResult
-from solidfire.results import TestConnectEnsembleResult
-from solidfire.results import TestConnectMvipResult
-from solidfire.results import TestConnectSvipResult
-from solidfire.results import TestDrivesResult
-from solidfire.results import TestLdapAuthenticationResult
-from solidfire.results import TestPingResult
-from solidfire.results import UpdateBulkVolumeStatusResult
+ ApiVersionUnsupportedError , ApiParameterVersionError
-OPTIONAL = None
+from solidfire.models import *
+OPTIONAL = None
[docs] class Element ( ServiceBase ):
@@ -310,7 +213,7 @@
Source code for solidfire
:return: a configured and tested instance of Element
"""
- ServiceBase . __init__ ( self , mvip , username , password , api_version ,
+ ServiceBase . __init__ ( self , mvip , username , password , api_version ,
verify_ssl , dispatcher )
[docs] def add_account (
@@ -320,42 +223,23 @@
Source code for solidfire
target_secret = OPTIONAL ,
attributes = OPTIONAL ,):
"""
- Used to add a new account to the system.
- New volumes can be created under the new account.
- The CHAP settings specified for the account applies to all volumes
- owned by the account.
-
- :param username: [required] Unique username for this account. (May be 1
- to 64 characters in length).
+ You can use AddAccount to add a new account to the system. You can create new volumes under the new account. The CHAP settings you specify for the account apply to all volumes owned by the account.
+ :param username: [required] Specifies the username for this account. (Might be 1 to 64 characters in length).
:type username: str
- :param initiator_secret: (optional) CHAP secret to use for the
- initiator. Should be 12-16 characters long and impenetrable. The
- CHAP initiator secrets must be unique and cannot be the same as the
- target CHAP secret.
-
- If not specified, a random secret is created.
-
- :type initiator_secret: CHAPSecret
-
- :param target_secret: (optional) CHAP secret to use for the target
- (mutual CHAP authentication). Should be 12-16 characters long and
- impenetrable. The CHAP target secrets must be unique and cannot be
- the same as the initiator CHAP secret.
+ :param initiatorSecret: The CHAP secret to use for the initiator. This secret must be 12-16 characters in length and should be impenetrable. The initiator CHAP secret must be unique and cannot be the same as the target CHAP secret. If unspecified, a random secret is created.
+ :type initiatorSecret: CHAPSecret
- If not specified, a random secret is created.
+ :param targetSecret: The CHAP secret to use for the target (mutual CHAP authentication). This secret must be 12-16 characters in length and should be impenetrable. The target CHAP secret must be unique and cannot be the same as the initiator CHAP secret. If unspecified, a random secret is created.
+ :type targetSecret: CHAPSecret
- :type target_secret: CHAPSecret
-
- :param attributes: (optional) List of Name/Value pairs in JSON object
- format.
+ :param attributes: List of name-value pairs in JSON object format.
:type attributes: dict
-
- :returns: a response
- :rtype: AddAccountResult
"""
- params = {
+ self . _check_connection_type ( "add_account" , "Cluster" )
+
+ params = {
"username" : username ,
}
if initiator_secret is not None :
@@ -364,92 +248,123 @@ Source code for solidfire
params [ "targetSecret" ] = target_secret
if attributes is not None :
params [ "attributes" ] = attributes
-
+
+ # There is no adaptor.
return self . send_request (
'AddAccount' ,
AddAccountResult ,
params ,
+ since = 1.0
)
[docs] def get_account_by_id (
self ,
account_id ,):
"""
-
Returns details about an account, given its AccountID.
-
-
:param account_id: [required] Specifies the account for which details
-
are gathered.
-
:type account_id: int
-
-
:returns: a response
-
:rtype: GetAccountResult
+
GetAccountByID enables you to return details about a specific account, given its accountID.
+
:param accountID: [required] Specifies the account for which details are gathered.
+
:type accountID: int
"""
-
params = {
+
self . _check_connection_type ( "get_account_by_id" , "Cluster" )
+
+
params = {
"accountID" : account_id ,
}
-
+
+
# There is no adaptor.
return self . send_request (
'GetAccountByID' ,
GetAccountResult ,
params ,
+
since = 1.0
)
[docs] def get_account_by_name (
self ,
username ,):
"""
-
Returns details about an account, given its Username.
-
-
:param username: [required] Username for the account.
+
GetAccountByName enables you to retrieve details about a specific account, given its username.
+
:param username: [required] Username for the account.
:type username: str
-
-
:returns: a response
-
:rtype: GetAccountResult
"""
-
params = {
+
self . _check_connection_type ( "get_account_by_name" , "Cluster" )
+
+
params = {
"username" : username ,
}
-
+
+
# There is no adaptor.
return self . send_request (
'GetAccountByName' ,
GetAccountResult ,
params ,
+
since = 1.0
+
)
+
+[docs] def get_account_efficiency (
+
self ,
+
account_id ,):
+
"""
+
GetAccountEfficiency enables you to retrieve efficiency statistics about a volume account. This method returns efficiency information
+
only for the account you specify as a parameter.
+
:param accountID: [required] Specifies the volume account for which efficiency statistics are returned.
+
:type accountID: int
+
"""
+
+
self . _check_connection_type ( "get_account_efficiency" , "Cluster" )
+
+
params = {
+
"accountID" : account_id ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetAccountEfficiency' ,
+
GetEfficiencyResult ,
+
params ,
+
since = 6.0
)
[docs] def list_accounts (
self ,
start_account_id = OPTIONAL ,
-
limit = OPTIONAL ,):
+
limit = OPTIONAL ,
+
include_storage_containers = OPTIONAL ,):
"""
-
Returns the entire list of accounts, with optional paging support.
-
-
:param start_account_id: (optional) Starting *account_id* to return. If
-
no Account exists with this *account_id,* the next Account by
-
*account_id* order is used as the start of the list. To page
-
through the list, pass the *account_id* of the last Account in the
-
previous response + 1
-
:type start_account_id: int
+
ListAccounts returns the entire list of accounts, with optional paging support.
+
:param startAccountID: Starting AccountID to return. If no account exists with this AccountID, the next account by AccountID order is used as the start of the list. To page through the list, pass the AccountID of the last account in the previous response + 1.
+
:type startAccountID: int
-
:param limit: (optional) Maximum number of *account_info* objects to
-
return.
+
:param limit: Maximum number of AccountInfo objects to return.
:type limit: int
-
:returns: a response
-
:rtype: ListAccountsResult
+
:param includeStorageContainers: Includes storage containers in the response by default. To exclude storage containers, set to false.
+
:type includeStorageContainers: bool
"""
-
params = {}
+
self . _check_connection_type ( "list_accounts" , "Cluster" )
+
+
params = {
+
}
if start_account_id is not None :
params [ "startAccountID" ] = start_account_id
if limit is not None :
params [ "limit" ] = limit
-
+
if include_storage_containers is not None :
+
if self . api_version < 9.0 :
+
raise ApiParameterVersionError ( "list_accounts" , 9.0 ,
+
[( "include_storage_containers" , include_storage_containers , 9.0 , False )])
+
else :
+
params [ "includeStorageContainers" ] = include_storage_containers
+
+
# There is no adaptor.
return self . send_request (
'ListAccounts' ,
ListAccountsResult ,
params ,
+
since = 1.0
)
[docs] def modify_account (
@@ -461,42 +376,33 @@
Source code for solidfire
target_secret = OPTIONAL ,
attributes = OPTIONAL ,):
"""
- Used to modify an existing account.
- When locking an account, any existing connections from that account are
- immediately terminated.
- When changing CHAP settings, any existing connections continue to be
- active,
- and the new CHAP values are only used on subsequent connection or
- reconnection.
+ ModifyAccount enables you to modify an existing account.
+ When you lock an account, any existing connections from that account are immediately terminated. When you change an account's
+ CHAP settings, any existing connections remain active, and the new CHAP settings are used on subsequent connections or
+ reconnections.
+ To clear an account's attributes, specify {} for the attributes parameter.
+ :param accountID: [required] Specifies the AccountID for the account to be modified.
+ :type accountID: int
- :param account_id: [required] *account_id* for the account to modify.
- :type account_id: int
-
- :param username: (optional) Change the username of the account to this
- value.
+ :param username: Specifies the username associated with the account. (Might be 1 to 64 characters in length).
:type username: str
- :param status: (optional) Status of the account.
+ :param status: Sets the status for the account. Possible values are: active: The account is active and connections are allowed. locked: The account is locked and connections are refused.
:type status: str
- :param initiator_secret: (optional) CHAP secret to use for the
- initiator. Should be 12-16 characters long and impenetrable.
- :type initiator_secret: CHAPSecret
+ :param initiatorSecret: Specifies the CHAP secret to use for the initiator. This secret must be 12-16 characters in length and should be impenetrable. The initiator CHAP secret must be unique and cannot be the same as the target CHAP secret.
+ :type initiatorSecret: CHAPSecret
- :param target_secret: (optional) CHAP secret to use for the target
- (mutual CHAP authentication). Should be 12-16 characters long and
- impenetrable.
- :type target_secret: CHAPSecret
+ :param targetSecret: Specifies the CHAP secret to use for the target (mutual CHAP authentication). This secret must be 12-16 characters in length and should be impenetrable. The target CHAP secret must be unique and cannot be the same as the initiator CHAP secret.
+ :type targetSecret: CHAPSecret
- :param attributes: (optional) List of Name/Value pairs in JSON object
- format.
+ :param attributes: List of name-value pairs in JSON object format.
:type attributes: dict
-
- :returns: a response
- :rtype: ModifyAccountResult
"""
- params = {
+ self . _check_connection_type ( "modify_account" , "Cluster" )
+
+ params = {
"accountID" : account_id ,
}
if username is not None :
@@ -509,70 +415,97 @@ Source code for solidfire
params [ "targetSecret" ] = target_secret
if attributes is not None :
params [ "attributes" ] = attributes
-
+
+ # There is no adaptor.
return self . send_request (
'ModifyAccount' ,
ModifyAccountResult ,
params ,
+ since = 1.0
)
[docs] def remove_account (
self ,
account_id ,):
"""
-
Used to remove an existing account.
-
All Volumes must be deleted and purged on the account before it can be
-
removed.
-
If volumes on the account are still pending deletion, *remove_account*
-
cannot be used until *delete_volume* to delete and purge the volumes.
-
-
:param account_id: [required] *account_id* for the account to remove.
-
:type account_id: int
-
-
:returns: a response
-
:rtype: RemoveAccountResult
+
RemoveAccount enables you to remove an existing account. You must delete and purge all volumes associated with the account
+
using DeleteVolume before you can remove the account. If volumes on the account are still pending deletion, you cannot use
+
RemoveAccount to remove the account.
+
:param accountID: [required] Specifies the AccountID for the account to be removed.
+
:type accountID: int
"""
-
params = {
+
self . _check_connection_type ( "remove_account" , "Cluster" )
+
+
params = {
"accountID" : account_id ,
}
-
+
+
# There is no adaptor.
return self . send_request (
'RemoveAccount' ,
RemoveAccountResult ,
params ,
+
since = 1.0
)
-[docs] def get_account_efficiency (
+
[docs] def get_async_result (
self ,
-
account_id ,
-
force = OPTIONAL ,):
+
async_handle ,
+
keep_result = OPTIONAL ,):
"""
-
*get_account_efficiency* is used to retrieve information about a volume
-
account. Only the account given as a parameter in this API method is
-
used to compute the capacity.
+
You can use GetAsyncResult to retrieve the result of asynchronous method calls. Some method calls require some time to run, and
+
might not be finished when the system sends the initial response. To obtain the status or result of the method call, use
+
GetAsyncResult to poll the asyncHandle value returned by the method.
+
GetAsyncResult returns the overall status of the operation (in progress, completed, or error) in a standard fashion, but the actual
+
data returned for the operation depends on the original method call and the return data is documented with each method.
+
:param asyncHandle: [required] A value that was returned from the original asynchronous method call.
+
:type asyncHandle: int
-
:param account_id: [required] Specifies the volume account for which
-
capacity is computed.
-
:type account_id: int
+
:param keepResult: If true, GetAsyncResult does not remove the asynchronous result upon returning it, enabling future queries to that asyncHandle.
+
:type keepResult: bool
+
"""
-
:param force: (optional)
-
:type force: bool
+
self . _check_connection_type ( "get_async_result" , "Cluster" )
+
+
params = {
+
"asyncHandle" : async_handle ,
+
}
+
if keep_result is not None :
+
params [ "keepResult" ] = keep_result
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetAsyncResult' ,
+
dict ,
+
params ,
+
since = 1.0
+
)
-
:returns: a response
-
:rtype: GetEfficiencyResult
+
[docs] def list_async_results (
+
self ,
+
async_result_types = OPTIONAL ,):
+
"""
+
You can use ListAsyncResults to list the results of all currently running and completed asynchronous methods on the system.
+
Querying asynchronous results with ListAsyncResults does not cause completed asyncHandles to expire; you can use GetAsyncResult
+
to query any of the asyncHandles returned by ListAsyncResults.
+
:param asyncResultTypes: An optional list of types of results. You can use this list to restrict the results to only these types of operations. Possible values are: BulkVolume: Copy operations between volumes, such as backups or restores. Clone: Volume cloning operations. DriveRemoval: Operations involving the system copying data from a drive in preparation to remove it from the cluster. RtfiPendingNode: Operations involving the system installing compatible software on a node before adding it to the cluster
+
:type asyncResultTypes: str
"""
-
params = {
-
"accountID" : account_id ,
-
}
-
if force is not None :
-
params [ "force" ] = force
+
self . _check_connection_type ( "list_async_results" , "Cluster" )
+
params = {
+
}
+
if async_result_types is not None :
+
params [ "asyncResultTypes" ] = async_result_types
+
+
# There is no adaptor.
return self . send_request (
-
'GetAccountEfficiency' ,
-
GetEfficiencyResult ,
+
'ListAsyncResults' ,
+
ListAsyncResultsResult ,
params ,
+
since = 9.0
)
[docs] def create_backup_target (
@@ -580,74 +513,69 @@
Source code for solidfire
name ,
attributes = OPTIONAL ,):
"""
- *create_backup_target* allows you to create and store backup target
- information so that you do not need to re-enter it each time a backup
- is created.
-
- :param name: [required] Name for the backup target.
+ CreateBackupTarget enables you to create and store backup target information so that you do not need to re-enter it each time a backup is created.
+ :param name: [required] The name of the backup target.
:type name: str
- :param attributes: (optional) List of Name/Value pairs in JSON object
- format.
+ :param attributes: List of name-value pairs in JSON object format.
:type attributes: dict
-
- :returns: a response
- :rtype: CreateBackupTargetResult
"""
- params = {
+ self . _check_connection_type ( "create_backup_target" , "Cluster" )
+
+ params = {
"name" : name ,
}
if attributes is not None :
params [ "attributes" ] = attributes
-
+
+ # There is no adaptor.
return self . send_request (
'CreateBackupTarget' ,
CreateBackupTargetResult ,
params ,
+ since = 6.0
)
[docs] def get_backup_target (
self ,
backup_target_id ,):
"""
-
*get_backup_target* allows you to return information about a specific
-
backup target that has been created.
-
-
:param backup_target_id: [required] Unique identifier assigned to the
-
backup target.
-
:type backup_target_id: int
-
-
:returns: a response
-
:rtype: GetBackupTargetResult
+
GetBackupTarget enables you to return information about a specific backup target that you have created.
+
:param backupTargetID: [required] The unique identifier assigned to the backup target.
+
:type backupTargetID: int
"""
-
params = {
+
self . _check_connection_type ( "get_backup_target" , "Cluster" )
+
+
params = {
"backupTargetID" : backup_target_id ,
}
-
+
+
# There is no adaptor.
return self . send_request (
'GetBackupTarget' ,
GetBackupTargetResult ,
params ,
+
since = 6.0
)
[docs] def list_backup_targets (
self ,):
"""
-
You can use *list_backup_targets* to retrieve information about all
-
backup targets that have been created.
-
-
:returns: a response
-
:rtype: ListBackupTargetsResult
-
"""
+
You can use ListBackupTargets to retrieve information about all backup targets that have been created. """
-
params = {}
+
self . _check_connection_type ( "list_backup_targets" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
'ListBackupTargets' ,
ListBackupTargetsResult ,
params ,
+
since = 6.0
)
[docs] def modify_backup_target (
@@ -656,1158 +584,1051 @@
Source code for solidfire
name = OPTIONAL ,
attributes = OPTIONAL ,):
"""
- *modify_backup_target* is used to change attributes of a backup target.
+ ModifyBackupTarget enables you to change attributes of a backup target.
+ :param backupTargetID: [required] The unique target ID for the target to modify.
+ :type backupTargetID: int
- :param backup_target_id: [required] Unique identifier assigned to the
- backup target.
- :type backup_target_id: int
-
- :param name: (optional) Name for the backup target.
+ :param name: The new name for the backup target.
:type name: str
- :param attributes: (optional) List of Name/Value pairs in JSON object
- format.
+ :param attributes: List of name-value pairs in JSON object format.
:type attributes: dict
-
- :returns: a response
- :rtype: ModifyBackupTargetResult
"""
- params = {
+ self . _check_connection_type ( "modify_backup_target" , "Cluster" )
+
+ params = {
"backupTargetID" : backup_target_id ,
}
if name is not None :
params [ "name" ] = name
if attributes is not None :
params [ "attributes" ] = attributes
-
+
+ # There is no adaptor.
return self . send_request (
'ModifyBackupTarget' ,
ModifyBackupTargetResult ,
params ,
+ since = 6.0
)
[docs] def remove_backup_target (
self ,
backup_target_id ,):
"""
-
*remove_backup_target* allows you to delete backup targets.
-
-
:param backup_target_id: [required] Unique target ID of the target to
-
remove.
-
:type backup_target_id: int
-
-
:returns: a response
-
:rtype: RemoveBackupTargetResult
+
RemoveBackupTarget allows you to delete backup targets.
+
:param backupTargetID: [required] The unique target ID of the target to remove.
+
:type backupTargetID: int
"""
-
params = {
+
self . _check_connection_type ( "remove_backup_target" , "Cluster" )
+
+
params = {
"backupTargetID" : backup_target_id ,
}
-
+
+
# There is no adaptor.
return self . send_request (
'RemoveBackupTarget' ,
RemoveBackupTargetResult ,
params ,
+
since = 6.0
)
-
[docs] def get_cluster_capacity (
-
self ,):
+
[docs] def clear_cluster_faults (
+
self ,
+
fault_types = OPTIONAL ,):
"""
-
Return the high-level capacity measurements for an entire cluster.
-
The fields returned from this method can be used to calculate the
-
efficiency rates that are displayed in the Element User Interface.
-
-
:returns: a response
-
:rtype: GetClusterCapacityResult
+
You can use the ClearClusterFaults method to clear information about both current and previously detected faults. Both resolved
+
and unresolved faults can be cleared.
+
:param faultTypes: Determines the types of faults cleared. Possible values are: current: Faults that are currently detected and have not been resolved. resolved: (Default) Faults that were previously detected and resolved. all: Both current and resolved faults are cleared. The fault status can be determined by the resolved field of the fault object.
+
:type faultTypes: str
"""
-
params = {}
+
self . _check_connection_type ( "clear_cluster_faults" , "Cluster" )
+
params = {
+
}
+
if fault_types is not None :
+
params [ "faultTypes" ] = fault_types
+
+
# There is no adaptor.
return self . send_request (
-
'GetClusterCapacity' ,
-
GetClusterCapacityResult ,
+
'ClearClusterFaults' ,
+
ClearClusterFaultsResult ,
params ,
+
since = 1.0
)
-
[docs] def get_cluster_info (
-
self ,):
+
[docs] def create_cluster (
+
self ,
+
mvip ,
+
svip ,
+
rep_count ,
+
username ,
+
password ,
+
nodes ,
+
accept_eula = OPTIONAL ,
+
attributes = OPTIONAL ,):
"""
-
Return configuration information about the cluster.
-
-
:returns: a response
-
:rtype: GetClusterInfoResult
-
"""
+
The CreateCluster method enables you to initialize the node in a cluster that has ownership of the "mvip" and "svip" addresses. Each new cluster is initialized using the management IP (MIP) of the first node in the cluster. This method also automatically adds all the nodes being configured into the cluster. You only need to use this method once each time a new cluster is initialized.
+
Note: You need to log in to the node that is used as the master node for the cluster. After you log in, run the GetBootstrapConfig method on the node to get the IP addresses for the rest of the nodes that you want to include in the
+
cluster. Then, run the CreateCluster method.
+
:param acceptEula: Required to indicate your acceptance of the End User License Agreement when creating this cluster. To accept the EULA, set this parameter to true.
+
:type acceptEula: bool
-
params = {}
-
-
return self . send_request (
-
'GetClusterInfo' ,
-
GetClusterInfoResult ,
-
params ,
-
)
+
:param mvip: [required] Floating (virtual) IP address for the cluster on the management network.
+
:type mvip: str
-
[docs] def get_cluster_version_info (
-
self ,):
-
"""
-
Return information about the Element software version running on each
-
node in the cluster.
-
Information about the nodes that are currently in the process of
-
upgrading software is also returned.
+
:param svip: [required] Floating (virtual) IP address for the cluster on the storage (iSCSI) network.
+
:type svip: str
-
:returns: a response
-
:rtype: GetClusterVersionInfoResult
-
"""
+
:param repCount: [required] Number of replicas of each piece of data to store in the cluster. Valid value is "2".
+
:type repCount: int
-
params = {}
+
:param username: [required] Username for the cluster admin.
+
:type username: str
-
return self . send_request (
-
'GetClusterVersionInfo' ,
-
GetClusterVersionInfoResult ,
-
params ,
-
)
+
:param password: [required] Initial password for the cluster admin account.
+
:type password: str
-
[docs] def get_limits (
-
self ,):
-
"""
-
Retrieves the limit values set by the API
+
:param nodes: [required] CIP/SIP addresses of the initial set of nodes making up the cluster. This node's IP must be in the list.
+
:type nodes: str
-
:returns: a response
-
:rtype: GetLimitsResult
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
"""
-
params = {}
+
self . _check_connection_type ( "create_cluster" , "Both" )
+
params = {
+
"mvip" : mvip ,
+
"svip" : svip ,
+
"repCount" : rep_count ,
+
"username" : username ,
+
"password" : password ,
+
"nodes" : nodes ,
+
}
+
if accept_eula is not None :
+
params [ "acceptEula" ] = accept_eula
+
if attributes is not None :
+
params [ "attributes" ] = attributes
+
+
# There is no adaptor.
return self . send_request (
-
'GetLimits' ,
-
GetLimitsResult ,
+
'CreateCluster' ,
+
CreateClusterResult ,
params ,
+
since = None
)
-
[docs] def list_events (
+
[docs] def create_support_bundle (
self ,
-
max_events = OPTIONAL ,
-
start_event_id = OPTIONAL ,
-
end_event_id = OPTIONAL ,
-
event_queue_type = OPTIONAL ,):
+
bundle_name = OPTIONAL ,
+
extra_args = OPTIONAL ,
+
timeout_sec = OPTIONAL ,):
"""
-
*list_events* returns events detected on the cluster, sorted from
-
oldest to newest.
-
-
:param max_events: (optional) Specifies the maximum number of events to
-
return.
-
:type max_events: int
-
-
:param start_event_id: (optional) Identifies the beginning of a range
-
of events to return.
-
:type start_event_id: int
+
CreateSupportBundle enables you to create a support bundle file under the node's directory. After creation, the bundle is stored on the node as a tar.gz file.
+
:param bundleName: The unique name for the support bundle. If no name is provided, "supportbundle" and the node name are used as the filename.
+
:type bundleName: str
-
:param end_event_id: (optional) Identifies the end of a range of events
-
to return.
-
:type end_event_id: int
+
:param extraArgs: Passed to the sf_make_support_bundle script. You should use this parameter only at the request of NetApp SolidFire Support.
+
:type extraArgs: str
-
:param event_queue_type: (optional)
-
:type event_queue_type: str
-
-
:returns: a response
-
:rtype: ListEventsResult
+
:param timeoutSec: The number of seconds to allow the support bundle script to run before stopping. The default value is 1500 seconds.
+
:type timeoutSec: int
"""
-
params = {}
-
self . _check_param_versions (
-
'list_events' ,
-
[
-
( "event_queue_type" ,
-
event_queue_type , 9.0 , None ),
-
]
-
)
-
if max_events is not None :
-
params [ "maxEvents" ] = max_events
-
if start_event_id is not None :
-
params [ "startEventID" ] = start_event_id
-
if end_event_id is not None :
-
params [ "endEventID" ] = end_event_id
-
if event_queue_type is not None :
-
params [ "eventQueueType" ] = event_queue_type
+
self . _check_connection_type ( "create_support_bundle" , "Node" )
+
params = {
+
}
+
if bundle_name is not None :
+
params [ "bundleName" ] = bundle_name
+
if extra_args is not None :
+
params [ "extraArgs" ] = extra_args
+
if timeout_sec is not None :
+
params [ "timeoutSec" ] = timeout_sec
+
+
# There is no adaptor.
return self . send_request (
-
'ListEvents' ,
-
ListEventsResult ,
+
'CreateSupportBundle' ,
+
CreateSupportBundleResult ,
params ,
+
since = 8.0
)
-
[docs] def list_cluster_faults (
-
self ,
-
exceptions = OPTIONAL ,
-
best_practices = OPTIONAL ,
-
update = OPTIONAL ,
-
fault_types = OPTIONAL ,):
+
[docs] def delete_all_support_bundles (
+
self ,):
"""
-
*list_cluster_faults* is used to retrieve information about any faults
-
detected on the cluster.
-
With this method, both current and resolved faults can be retrieved.
-
The system caches faults every 30 seconds.
-
-
:param exceptions: (optional)
-
:type exceptions: bool
-
-
:param best_practices: (optional) Include faults triggered by
-
sub-optimal system configuration. Possible values: true, false
-
:type best_practices: bool
-
-
:param update: (optional)
-
:type update: bool
-
-
:param fault_types: (optional) Determines the types of faults returned:
-
current: List active, unresolved faults. **resolved**: List faults
-
that were previously detected and resolved. **all**: (Default) List
-
both current and resolved faults. You can see the fault status in
-
the 'resolved' field of the Cluster Fault object.
-
:type fault_types: str
+
DeleteAllSupportBundles enables you to delete all support bundles generated with the CreateSupportBundle API method. """
-
:returns: a response
-
:rtype: ListClusterFaultsResult
-
"""
-
-
params = {}
-
if exceptions is not None :
-
params [ "exceptions" ] = exceptions
-
if best_practices is not None :
-
params [ "bestPractices" ] = best_practices
-
if update is not None :
-
params [ "update" ] = update
-
if fault_types is not None :
-
params [ "faultTypes" ] = fault_types
+
self . _check_connection_type ( "delete_all_support_bundles" , "Node" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'ListClusterFaults' ,
-
ListClusterFaultsResult ,
+
'DeleteAllSupportBundles' ,
+
DeleteAllSupportBundlesResult ,
params ,
+
since = 8.0
)
-
[docs] def clear_cluster_faults (
-
self ,
-
fault_types = OPTIONAL ,):
+
[docs] def disable_encryption_at_rest (
+
self ,):
"""
-
*clear_cluster_faults* is used to clear information about both current
-
faults that are resolved as well as faults that were previously
-
detected and resolved can be cleared.
-
-
:param fault_types: (optional) Determines the types of faults cleared:
+
The DisableEncryptionAtRest method enables you to remove the encryption that was previously applied to the cluster using the EnableEncryptionAtRest method. This disable method is asynchronous and returns a response before encryption is disabled. You can use the GetClusterInfo method to poll the system to see when the process has completed. """
-
**current**: Faults that are currently detected and have not been
-
resolved.
+
self . _check_connection_type ( "disable_encryption_at_rest" , "Cluster" )
-
**resolved**: Faults that were previously detected and resolved.
-
-
**all**: Both current and resolved faults are cleared. The fault
-
status can be determined by the \"resolved\" field of the fault
-
object.
-
-
:type fault_types: str
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'DisableEncryptionAtRest' ,
+
DisableEncryptionAtRestResult ,
+
params ,
+
since = 5.0
+
)
-
:returns: a response
-
:rtype: ClearClusterFaultsResult
-
"""
+
[docs] def enable_encryption_at_rest (
+
self ,):
+
"""
+
You can use the EnableEncryptionAtRest method to enable the Advanced Encryption Standard (AES) 256-bit encryption at rest on the cluster, so that the cluster can manage the encryption key used for the drives on each node. This feature is not enabled by default.
+
When you enable Encryption at Rest, the cluster automatically manages encryption keys internally for the drives on each node in the cluster. Nodes do not store the keys to unlock drives and the keys are never passed over the network. Two nodes participating in a cluster are required to access the key to disable encryption on a drive. The encryption management does not affect performance or efficiency on the cluster. If an encryption-enabled drive or node is removed from the cluster with the API, Encryption at Rest is disabled and the data is not secure erased. Data can be secure erased using the SecureEraseDrives API method.
+
Note: If you have a node type with a model number ending in "-NE", the EnableEncryptionAtRest method call fails with a response of "Encryption not allowed. Cluster detected non-encryptable node".
+
You should only enable or disable encryption when the cluster is running and in a healthy state. You can enable or disable encryption at your discretion and as often as you need.
+
Note: This process is asynchronous and returns a response before encryption is enabled. You can use the GetClusterInfo
+
method to poll the system to see when the process has completed. """
-
params = {}
-
if fault_types is not None :
-
params [ "faultTypes" ] = fault_types
+
self . _check_connection_type ( "enable_encryption_at_rest" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'ClearClusterFaults' ,
-
ClearClusterFaultsResult ,
+
'EnableEncryptionAtRest' ,
+
EnableEncryptionAtRestResult ,
params ,
+
since = 5.0
)
-
[docs] def get_cluster_config (
+
[docs] def get_api (
self ,):
"""
-
The *get_cluster_config* API method is used to return information about
-
the cluster configuration this node uses to communicate with the
-
cluster it is a part of.
-
+
You can use the GetAPI method to return a list of all the API methods and supported API endpoints that can be used in the system. """
+
self . _check_connection_type ( "get_api" , "Both" )
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetAPI' ,
+
GetAPIResult ,
+
params ,
+
since = 1.0
+
)
-
**Note**: This method is available only through the per-node API
-
endpoint 5.0 or later.
+
[docs] def get_cluster_capacity (
+
self ,):
+
"""
+
You can use the GetClusterCapacity method to return the high-level capacity measurements for an entire cluster. You can use the fields returned from this method to calculate the efficiency rates that are displayed in the Element OS Web UI. You can use the following calculations in scripts to return the efficiency rates for thin provisioning, deduplication, compression, and overall efficiency. """
-
:returns: a response
-
:rtype: GetClusterConfigResult
-
"""
+
self . _check_connection_type ( "get_cluster_capacity" , "Cluster" )
-
params = {}
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetClusterCapacity' ,
+
GetClusterCapacityResult ,
+
params ,
+
since = 1.0
+
)
+
[docs] def get_cluster_config (
+
self ,):
+
"""
+
The GetClusterConfig API method enables you to return information about the cluster configuration this node uses to communicate with the cluster that it is a part of. """
+
+
self . _check_connection_type ( "get_cluster_config" , "Node" )
+
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
'GetClusterConfig' ,
GetClusterConfigResult ,
params ,
+
since = 5.0
)
[docs] def get_cluster_full_threshold (
self ,):
"""
-
*get_cluster_full_threshold* is used to view the stages set for cluster
-
fullness levels. All levels are returned when this method is entered.
-
-
:returns: a response
-
:rtype: GetClusterFullThresholdResult
-
"""
+
You can use GetClusterFullThreshold to view the stages set for cluster fullness levels. This method returns all fullness metrics for the
+
cluster.
+
Note: When a cluster reaches the Error stage of block cluster fullness, the maximum IOPS on all volumes are reduced linearly to the volume's minimum IOPS as the cluster approaches the Critical stage. This helps prevent the cluster from
+
reaching the Critical stage of block cluster fullness. """
-
params = {}
+
self . _check_connection_type ( "get_cluster_full_threshold" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
'GetClusterFullThreshold' ,
GetClusterFullThresholdResult ,
params ,
+
since = 1.0
)
-
[docs] def modify_cluster_full_threshold (
-
self ,
-
stage2_aware_threshold = OPTIONAL ,
-
stage3_block_threshold_percent = OPTIONAL ,
-
max_metadata_over_provision_factor = OPTIONAL ,):
+
[docs] def get_cluster_info (
+
self ,):
"""
-
*modify_cluster_full_threshold* is used to change the level at which an
-
event is generated when the storage cluster approaches the capacity
-
utilization requested. The number entered in this setting is used to
-
indicate the number of node failures the system is required to recover
-
from. For example, on a 10 node cluster, if you want to be alerted when
-
the system cannot recover from 3 nodes failures, enter the value of
-
\"3\". When this number is reached, a message alert is sent to the
-
Event Log in the Cluster Management Console.
-
-
:param stage2_aware_threshold: (optional) Number of nodes worth of
-
capacity remaining on the cluster that triggers a notification.
-
:type stage2_aware_threshold: int
-
-
:param stage3_block_threshold_percent: (optional) Percent below
-
\"Error\" state to raise a cluster \"Warning\" alert.
-
:type stage3_block_threshold_percent: int
-
-
:param max_metadata_over_provision_factor: (optional) A value
-
representative of the number of times metadata space can be over
-
provisioned relative to the amount of space available. For example,
-
if there was enough metadata space to store 100 *ti_b* of volumes
-
and this number was set to 5, then 500 *ti_b* worth of volumes
-
could be created.
-
:type max_metadata_over_provision_factor: int
-
-
:returns: a response
-
:rtype: ModifyClusterFullThresholdResult
-
"""
-
-
params = {}
-
self . _check_param_versions (
-
'modify_cluster_full_threshold' ,
-
[
-
( "stage3_block_threshold_percent" ,
-
stage3_block_threshold_percent , 8.0 , None ),
-
]
-
)
-
if stage2_aware_threshold is not None :
-
params [ "stage2AwareThreshold" ] = stage2_aware_threshold
-
if stage3_block_threshold_percent is not None :
-
params [ "stage3BlockThresholdPercent" ] = \
-
stage3_block_threshold_percent
-
if max_metadata_over_provision_factor is not None :
-
params [ "maxMetadataOverProvisionFactor" ] = \
-
max_metadata_over_provision_factor
+
GetClusterInfo enables you to return configuration information about the cluster. """
+
self . _check_connection_type ( "get_cluster_info" , "Cluster" )
+
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'ModifyClusterFullThreshold' ,
-
ModifyClusterFullThresholdResult ,
+
'GetClusterInfo' ,
+
GetClusterInfoResult ,
params ,
+
since = 1.0
)
-
[docs] def get_cluster_stats (
+
[docs] def get_cluster_master_node_id (
self ,):
"""
-
*get_cluster_stats* is used to return high-level activity measurements
-
for the cluster. Values returned are cumulative from the creation of
-
the cluster.
+
GetClusterMasterNodeID enables you to retrieve the ID of the node that can perform cluster-wide administration tasks and holds the
+
storage virtual IP address (SVIP) and management virtual IP address (MVIP). """
-
:returns: a response
-
:rtype: GetClusterStatsResult
-
"""
-
-
params = {}
+
self . _check_connection_type ( "get_cluster_master_node_id" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'GetClusterStats' ,
-
GetClusterStatsResult ,
+
'GetClusterMasterNodeID' ,
+
GetClusterMasterNodeIDResult ,
params ,
+
since = 1.0
)
-
[docs] def list_cluster_admins (
-
self ,):
+
[docs] def get_cluster_state (
+
self ,
+
force ,):
"""
-
*list_cluster_admins* returns the list of all cluster administrators
-
for the cluster. There can be several cluster administrators that have
-
different levels of permissions. There can be only one primary cluster
-
administrator in the system. The primary Cluster Admin is the
-
administrator that was created when the cluster was created. LDAP
-
administrators can also be created when setting up an LDAP system on
-
the cluster.
-
-
:returns: a response
-
:rtype: ListClusterAdminsResult
+
The GetClusterState API method enables you to indicate if a node is part of a cluster or not. The three states are:
+
Available: Node has not been configured with a cluster name.
+
Pending: Node is pending for a specific named cluster and can be added.
+
Active: Node is an active member of a cluster and may not be added to another
+
cluster.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
:param force: [required] To run this command, the force parameter must be set to true.
+
:type force: bool
"""
-
params = {}
+
self . _check_connection_type ( "get_cluster_state" , "Cluster" )
+
params = {
+
"force" : force ,
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'ListClusterAdmins' ,
-
ListClusterAdminsResult ,
+
'GetClusterState' ,
+
GetClusterStateResult ,
params ,
+
since = 5.0
)
-
[docs] def add_cluster_admin (
-
self ,
-
username ,
-
password ,
-
access ,
-
accept_eula = OPTIONAL ,
-
attributes = OPTIONAL ,):
+
[docs] def get_cluster_stats (
+
self ,):
"""
-
*add_cluster_admin* adds a new Cluster Admin. A Cluster Admin can be
-
used to manage the cluster via the API and management tools. Cluster
-
Admins are completely separate and unrelated to standard tenant
-
accounts.
-
-
-
-
-
Each Cluster Admin can be restricted to a sub-set of the API. SolidFire
-
recommends using multiple Cluster Admins for different users and
-
applications. Each Cluster Admin should be given the minimal
-
permissions necessary to reduce the potential impact of credential
-
compromise.
-
-
:param username: [required] Unique username for this Cluster Admin.
-
:type username: str
-
-
:param password: [required] Password used to authenticate this Cluster
-
Admin.
-
:type password: str
+
GetClusterStats enables you to retrieve high-level activity measurements for the cluster. Values returned are cumulative from the
+
creation of the cluster. """
-
:param access: [required] Controls which methods this Cluster Admin can
-
use. For more details on the levels of access, see \"Access
-
Control\" in the Element API Guide.
-
:type access: str[]
-
-
:param accept_eula: (optional) Indicate your acceptance of the End User
-
License Agreement when creating this cluster admin. To accept the
-
EULA, set this parameter to true.
-
:type accept_eula: bool
-
-
:param attributes: (optional) List of Name/Value pairs in JSON object
-
format.
-
:type attributes: dict
+
self . _check_connection_type ( "get_cluster_stats" , "Cluster" )
-
:returns: a response
-
:rtype: AddClusterAdminResult
-
"""
-
-
params = {
-
"username" : username ,
-
"password" : password ,
-
"access" : access ,
+
params = {
}
-
self . _check_param_versions (
-
'add_cluster_admin' ,
-
[
-
( "accept_eula" ,
-
accept_eula , 9.0 , None ),
-
]
-
)
-
if accept_eula is not None :
-
params [ "acceptEula" ] = accept_eula
-
if attributes is not None :
-
params [ "attributes" ] = attributes
-
+
+
# There is no adaptor.
return self . send_request (
-
'AddClusterAdmin' ,
-
AddClusterAdminResult ,
+
'GetClusterStats' ,
+
GetClusterStatsResult ,
params ,
+
since = 1.0
)
-
[docs] def modify_cluster_admin (
-
self ,
-
cluster_admin_id ,
-
password = OPTIONAL ,
-
access = OPTIONAL ,
-
attributes = OPTIONAL ,):
+
[docs] def get_cluster_version_info (
+
self ,):
"""
-
*modify_cluster_admin* is used to change the settings for a Cluster
-
Admin or LDAP Cluster Admin. Access for the administrator Cluster Admin
-
account cannot be changed.
-
-
:param cluster_admin_id: [required] *cluster_admin_id* for the Cluster
-
Admin or LDAP Cluster Admin to modify.
-
:type cluster_admin_id: int
-
-
:param password: (optional) Password used to authenticate this Cluster
-
Admin.
-
:type password: str
-
-
:param access: (optional) Controls which methods this Cluster Admin can
-
use. For more details on the levels of access, see \"Access
-
Control\" in the Element API Guide.
-
:type access: str[]
+
GetClusterVersionInfo enables you to retrieve information about the Element software version running on each node in the cluster.
+
This method also returns information about nodes that are currently in the process of upgrading software. """
-
:param attributes: (optional) List of Name/Value pairs in JSON object
-
format.
-
:type attributes: dict
-
-
:returns: a response
-
:rtype: ModifyClusterAdminResult
-
"""
+
self . _check_connection_type ( "get_cluster_version_info" , "Cluster" )
-
params = {
-
"clusterAdminID" : cluster_admin_id ,
+
params = {
}
-
if password is not None :
-
params [ "password" ] = password
-
if access is not None :
-
params [ "access" ] = access
-
if attributes is not None :
-
params [ "attributes" ] = attributes
-
+
+
# There is no adaptor.
return self . send_request (
-
'ModifyClusterAdmin' ,
-
ModifyClusterAdminResult ,
+
'GetClusterVersionInfo' ,
+
GetClusterVersionInfoResult ,
params ,
+
since = 1.0
)
-
[docs] def remove_cluster_admin (
-
self ,
-
cluster_admin_id ,):
+
[docs] def get_complete_stats (
+
self ,):
"""
-
*remove_cluster_admin* is used to remove a Cluster Admin. The \"admin\"
-
Cluster Admin cannot be removed.
+
NetApp engineering uses the GetCompleteStats API method to troubleshoot new features. The data returned from GetCompleteStats is not documented, changes frequently, and is not guaranteed to be accurate. NetApp does not recommend using GetCompleteStats for collecting performance data or any other
+
management integration with a SolidFire cluster. """
-
:param cluster_admin_id: [required] *cluster_admin_id* for the Cluster
-
Admin to remove.
-
:type cluster_admin_id: int
+
self . _check_connection_type ( "get_complete_stats" , "Cluster" )
-
:returns: a response
-
:rtype: RemoveClusterAdminResult
-
"""
-
-
params = {
-
"clusterAdminID" : cluster_admin_id ,
+
params = {
}
-
+
+
# There is no adaptor.
return self . send_request (
-
'RemoveClusterAdmin' ,
-
RemoveClusterAdminResult ,
+
'GetCompleteStats' ,
+
dict ,
params ,
+
since = 1.0
)
-
[docs] def set_cluster_config (
-
self ,
-
cluster ,):
+
[docs] def get_limits (
+
self ,):
"""
-
The *set_cluster_config* API method is used to set the configuration
-
this node uses to communicate with the cluster it is associated with.
-
To see the states in which these objects can be modified see Cluster
-
Object on page 109. To display the current cluster interface settings
-
for a node, run the *get_cluster_config* API method.
-
-
-
-
-
**Note**: This method is available only through the per-node API
-
endpoint 5.0 or later.
-
-
:param cluster: [required] Objects that are changed for the cluster
-
interface settings. Only the fields you want changed need to be
-
added to this method as objects in the \"cluster\" parameter.
-
:type cluster: ClusterConfig
+
GetLimits enables you to retrieve the limit values set by the API. These values might change between releases of Element OS, but do not change without an update to the system. Knowing the limit values set by the API can be useful when writing API scripts for user-facing tools.
+
Note: The GetLimits method returns the limits for the current software version regardless of the API endpoint version used to pass the method. """
-
:returns: a response
-
:rtype: SetClusterConfigResult
-
"""
+
self . _check_connection_type ( "get_limits" , "Cluster" )
-
params = {
-
"cluster" : cluster ,
+
params = {
}
-
+
+
# There is no adaptor.
return self . send_request (
-
'SetClusterConfig' ,
-
SetClusterConfigResult ,
+
'GetLimits' ,
+
GetLimitsResult ,
params ,
+
since = 1.0
)
-
[docs] def get_snmp_acl (
+
[docs] def get_ntp_info (
self ,):
"""
-
*get_snmp_acl* is used to return the current SNMP access permissions on
-
the cluster nodes.
+
GetNtpInfo enables you to return the current network time protocol (NTP) configuration information. """
-
:returns: a response
-
:rtype: GetSnmpACLResult
-
"""
-
-
params = {}
+
self . _check_connection_type ( "get_ntp_info" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'GetSnmpACL' ,
-
GetSnmpACLResult ,
+
'GetNtpInfo' ,
+
GetNtpInfoResult ,
params ,
-
since = 8.0 ,
+
since = 1.0
)
-
[docs] def set_snmp_acl (
-
self ,
-
networks ,
-
usm_users ,):
+
[docs] def get_raw_stats (
+
self ,):
"""
-
*set_snmp_acl* is used to configure SNMP access permissions on the
-
cluster nodes. The values set with this interface apply to all nodes in
-
the cluster, and the values that are passed replace, in whole, all
-
values set in any previous call to SetSnmpACL. Also note that the
-
values set with this interface replace all \"network\" or
-
*\"usm_users\"* values set with the older SetSnmpInfo.
-
-
:param networks: [required] List of networks and what type of access
-
they have to the SNMP servers running on the cluster nodes. See
-
SNMP Network Object for possible \"networks\" values. REQUIRED if
-
SNMP *v_* is disabled.
-
:type networks: SnmpNetwork[]
+
NetApp engineering uses the GetRawStats API method to troubleshoot new features. The data returned from GetRawStats is not documented, changes frequently, and is not guaranteed to be accurate. NetApp does not recommend using GetCompleteStats for collecting performance data or any other
+
management integration with a SolidFire cluster. """
-
:param usm_users: [required] List of users and the type of access they
-
have to the SNMP servers running on the cluster nodes. REQUIRED if
-
SNMP v3 is enabled.
-
:type usm_users: SnmpV3UsmUser[]
+
self . _check_connection_type ( "get_raw_stats" , "Cluster" )
-
:returns: a response
-
:rtype: SetSnmpACLResult
-
"""
-
-
params = {
-
"networks" : networks ,
-
"usmUsers" : usm_users ,
+
params = {
}
-
+
+
# There is no adaptor.
return self . send_request (
-
'SetSnmpACL' ,
-
SetSnmpACLResult ,
+
'GetRawStats' ,
+
dict ,
params ,
-
since = 8.0 ,
+
since = 1.0
)
-
[docs] def get_snmp_trap_info (
+
[docs] def get_system_status (
self ,):
"""
-
*get_snmp_trap_info* is used to return current SNMP trap configuration
-
information.
+
GetSystemStatus enables you to return whether a reboot ir required or not. """
-
:returns: a response
-
:rtype: GetSnmpTrapInfoResult
-
"""
-
-
params = {}
+
self . _check_connection_type ( "get_system_status" , "Node" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'GetSnmpTrapInfo' ,
-
GetSnmpTrapInfoResult ,
+
'GetSystemStatus' ,
+
GetSystemStatusResult ,
params ,
+
since = 5.0
)
-
[docs] def set_snmp_trap_info (
+
[docs] def list_cluster_faults (
self ,
-
trap_recipients ,
-
cluster_fault_traps_enabled ,
-
cluster_fault_resolved_traps_enabled ,
-
cluster_event_traps_enabled ,):
+
best_practices = OPTIONAL ,
+
fault_types = OPTIONAL ,):
"""
-
*set_snmp_trap_info* is used to enable and disable the generation of
-
SolidFire SNMP notifications (traps) and to specify the set of network
-
host computers that are to receive the notifications. The values passed
-
with each *set_snmp_trap_info* method replaces all values set in any
-
previous method to SetSnmpTrapInfo.
-
-
:param trap_recipients: [required] List of hosts that are to receive
-
the traps generated by the Cluster Master. At least one object is
-
required if any one of the trap types is enabled.
-
:type trap_recipients: SnmpTrapRecipient[]
-
-
:param cluster_fault_traps_enabled: [required] If \"true\", when a
-
cluster fault is logged a corresponding
-
*solid_fire_cluster_fault_notification* is sent to the configured
-
list of trap recipients.
-
:type cluster_fault_traps_enabled: bool
-
-
:param cluster_fault_resolved_traps_enabled: [required] If \"true\",
-
when a cluster fault is logged a corresponding
-
*solid_fire_cluster_fault_resolved_notification* is sent to the
-
configured list of trap recipients.
-
:type cluster_fault_resolved_traps_enabled: bool
-
-
:param cluster_event_traps_enabled: [required] If \"true\", when a
-
cluster fault is logged a corresponding
-
*solid_fire_cluster_event_notification* is sent to the configured
-
list of trap recipients.
-
:type cluster_event_traps_enabled: bool
+
ListClusterFaults enables you to retrieve information about any faults detected on the cluster. With this method, you can retrieve both current faults as well as faults that have been resolved. The system caches faults every 30 seconds.
+
:param bestPractices: Specifies whether to include faults triggered by suboptimal system configuration. Possible values are: true false
+
:type bestPractices: bool
-
:returns: a response
-
:rtype: SetSnmpTrapInfoResult
+
:param faultTypes: Determines the types of faults returned. Possible values are: current: List active, unresolved faults. resolved: List faults that were previously detected and resolved. all: (Default) List both current and resolved faults. You can see the fault status in the resolved field of the Cluster Fault object.
+
:type faultTypes: str
"""
-
params = {
-
"trapRecipients" : trap_recipients ,
-
"clusterFaultTrapsEnabled" : cluster_fault_traps_enabled ,
-
"clusterFaultResolvedTrapsEnabled" :
-
cluster_fault_resolved_traps_enabled ,
-
"clusterEventTrapsEnabled" : cluster_event_traps_enabled ,
-
}
+
self . _check_connection_type ( "list_cluster_faults" , "Cluster" )
+
params = {
+
}
+
if best_practices is not None :
+
params [ "bestPractices" ] = best_practices
+
if fault_types is not None :
+
params [ "faultTypes" ] = fault_types
+
+
# There is no adaptor.
return self . send_request (
-
'SetSnmpTrapInfo' ,
-
SetSnmpTrapInfoResult ,
+
'ListClusterFaults' ,
+
ListClusterFaultsResult ,
params ,
+
since = 1.0
)
-
[docs] def enable_snmp (
+
[docs] def list_events (
self ,
-
snmp_v3_enabled ,):
+
max_events = OPTIONAL ,
+
start_event_id = OPTIONAL ,
+
end_event_id = OPTIONAL ,):
"""
-
*enable_snmp* is used to enable SNMP on the cluster nodes. The values
-
set with this interface apply to all nodes in the cluster, and the
-
values that are passed replace, in whole, all values set in any
-
previous call to EnableSnmp.
+
ListEvents returns events detected on the cluster, sorted from oldest to newest.
+
:param maxEvents: Specifies the maximum number of events to return.
+
:type maxEvents: int
-
:param snmp_v3_enabled: [required] If set to \"true\", then SNMP v3 is
-
enabled on each node in the cluster. If set to \"false\", then SNMP
-
v2 is enabled.
-
:type snmp_v3_enabled: bool
+
:param startEventID: Identifies the beginning of a range of events to return.
+
:type startEventID: int
-
:returns: a response
-
:rtype: EnableSnmpResult
+
:param endEventID: Identifies the end of a range of events to return.
+
:type endEventID: int
"""
-
params = {
-
"snmpV3Enabled" : snmp_v3_enabled ,
-
}
+
self . _check_connection_type ( "list_events" , "Cluster" )
+
params = {
+
}
+
if max_events is not None :
+
params [ "maxEvents" ] = max_events
+
if start_event_id is not None :
+
params [ "startEventID" ] = start_event_id
+
if end_event_id is not None :
+
params [ "endEventID" ] = end_event_id
+
+
# There is no adaptor.
return self . send_request (
-
'EnableSnmp' ,
-
EnableSnmpResult ,
+
'ListEvents' ,
+
ListEventsResult ,
params ,
+
since = 1.0
)
-
[docs] def disable_snmp (
+
[docs] def list_sync_jobs (
self ,):
"""
-
*disable_snmp* is used to disable SNMP on the cluster nodes.
-
-
:returns: a response
-
:rtype: DisableSnmpResult
-
"""
+
ListSyncJobs enables you to return information about synchronization jobs that are running on a SolidFire cluster. The type of
+
synchronization jobs that are returned with this method are slice, clone, and remote. """
-
params = {}
+
self . _check_connection_type ( "list_sync_jobs" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'DisableSnmp' ,
-
DisableSnmpResult ,
+
'ListSyncJobs' ,
+
ListSyncJobsResult ,
params ,
+
since = 1.0
)
-
[docs] def get_snmp_info (
-
self ,):
+
[docs] def modify_cluster_full_threshold (
+
self ,
+
stage2_aware_threshold = OPTIONAL ,
+
stage3_block_threshold_percent = OPTIONAL ,
+
max_metadata_over_provision_factor = OPTIONAL ,):
"""
-
*get_snmp_info* is used to return the current simple network management
-
protocol (SNMP) configuration information.
+
You can use ModifyClusterFullThreshold to change the level at which the system generates an event when the storage cluster approaches a certain capacity utilization. You can use the threshold setting to indicate the acceptable amount of utilized block storage before the system generates a warning. For example, if you want to be alerted when the system reaches 3% below the "Error" level block storage utilization, enter a value of "3" for the stage3BlockThresholdPercent parameter. If this level is reached, the system sends an alert to the Event Log in the Cluster Management Console.
+
:param stage2AwareThreshold: The number of nodes of capacity remaining in the cluster before the system triggers a capacity notification.
+
:type stage2AwareThreshold: int
+
:param stage3BlockThresholdPercent: The percentage of block storage utilization below the "Error" threshold that causes the system to trigger a cluster "Warning" alert.
+
:type stage3BlockThresholdPercent: int
-
-
-
**Note**: *get_snmp_info* will be available for Element OS 8 and prior
-
releases. It will be deprecated after Element OS 8. There are two new
-
SNMP API methods that you should migrate over to. They are
-
*get_snmp_state* and GetSnmpACL. Please see details in this document
-
for their descriptions and usage.
-
-
:returns: a response
-
:rtype: GetSnmpInfoResult
+
:param maxMetadataOverProvisionFactor: A value representative of the number of times metadata space can be overprovisioned relative to the amount of space available. For example, if there was enough metadata space to store 100 TiB of volumes and this number was set to 5, then 500 TiB worth of volumes can be created.
+
:type maxMetadataOverProvisionFactor: int
"""
-
params = {}
+
self . _check_connection_type ( "modify_cluster_full_threshold" , "Cluster" )
+
params = {
+
}
+
if stage2_aware_threshold is not None :
+
params [ "stage2AwareThreshold" ] = stage2_aware_threshold
+
if stage3_block_threshold_percent is not None :
+
if self . api_version < 8.0 :
+
raise ApiParameterVersionError ( "modify_cluster_full_threshold" , 8.0 ,
+
[( "stage3_block_threshold_percent" , stage3_block_threshold_percent , 8.0 , False )])
+
else :
+
params [ "stage3BlockThresholdPercent" ] = stage3_block_threshold_percent
+
if max_metadata_over_provision_factor is not None :
+
params [ "maxMetadataOverProvisionFactor" ] = max_metadata_over_provision_factor
+
+
# There is no adaptor.
return self . send_request (
-
'GetSnmpInfo' ,
-
GetSnmpInfoResult ,
+
'ModifyClusterFullThreshold' ,
+
ModifyClusterFullThresholdResult ,
params ,
+
since = 1.0
)
-
[docs] def set_snmp_info (
+
[docs] def set_cluster_config (
self ,
-
networks = OPTIONAL ,
-
enabled = OPTIONAL ,
-
snmp_v3_enabled = OPTIONAL ,
-
usm_users = OPTIONAL ,):
+
cluster ,):
"""
-
*set_snmp_info* is used to configure SNMP v2 and v3 on the cluster
-
nodes. The values set with this interface apply to all nodes in the
-
cluster, and the values that are passed replace, in whole, all values
-
set in any previous call to SetSnmpInfo.
-
-
-
-
-
**Note**: *enable_snmp* and *set_snmp_acl* methods can be used to
-
accomplish the same results as SetSnmpInfo. *set_snmp_info* will no
-
longer be available after the Element 8 release. Please use
-
*enable_snmp* and *set_snmp_acl* in the future.
-
-
:param networks: (optional) List of networks and what type of access
-
they have to the SNMP servers running on the cluster nodes. See
-
SNMP Network Object for possible \"networks\" values. SNMP v2 only.
-
:type networks: SnmpNetwork[]
+
The SetClusterConfig API method enables you to set the configuration this node uses to communicate with the cluster it is associated with. To see the states in which these objects can be modified, see Cluster Object Attributes. To display the current cluster
+
interface settings for a node, run the GetClusterConfig API method.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
:param cluster: [required] Objects that are changed for the cluster interface settings.
+
:type cluster: ClusterConfig
+
"""
-
:param enabled: (optional) If set to \"true\", then SNMP is enabled on
-
each node in the cluster.
-
:type enabled: bool
+
self . _check_connection_type ( "set_cluster_config" , "Node" )
-
:param snmp_v3_enabled: (optional) If set to \"true\", then SNMP v3 is
-
enabled on each node in the cluster.
-
:type snmp_v3_enabled: bool
+
params = {
+
"cluster" : cluster ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'SetClusterConfig' ,
+
SetClusterConfigResult ,
+
params ,
+
since = 5.0
+
)
-
:param usm_users: (optional) If SNMP v3 is enabled, this value must be
-
passed in place of the \"networks\" parameter. SNMP v3 only.
-
:type usm_users: SnmpV3UsmUser[]
+
[docs] def set_ntp_info (
+
self ,
+
servers ,
+
broadcastclient = OPTIONAL ,):
+
"""
+
SetNtpInfo enables you to configure NTP on cluster nodes. The values you set with this interface apply to all nodes in the cluster. If an NTP broadcast server periodically broadcasts time information on your network, you can optionally configure nodes as broadcast clients.
+
Note: NetApp recommends using NTP servers that are internal to your network, rather than the installation defaults.
+
:param servers: [required] List of NTP servers to add to each nodes NTP configuration.
+
:type servers: str
-
:returns: a response
-
:rtype: SetSnmpInfoResult
+
:param broadcastclient: Enables every node in the cluster as a broadcast client.
+
:type broadcastclient: bool
"""
-
params = {}
-
if networks is not None :
-
params [ "networks" ] = networks
-
if enabled is not None :
-
params [ "enabled" ] = enabled
-
if snmp_v3_enabled is not None :
-
params [ "snmpV3Enabled" ] = snmp_v3_enabled
-
if usm_users is not None :
-
params [ "usmUsers" ] = usm_users
+
self . _check_connection_type ( "set_ntp_info" , "Cluster" )
+
params = {
+
"servers" : servers ,
+
}
+
if broadcastclient is not None :
+
params [ "broadcastclient" ] = broadcastclient
+
+
# There is no adaptor.
return self . send_request (
-
'SetSnmpInfo' ,
-
SetSnmpInfoResult ,
+
'SetNtpInfo' ,
+
SetNtpInfoResult ,
params ,
+
since = 1.0
)
-
[docs] def get_snmp_state (
-
self ,):
+
[docs] def add_cluster_admin (
+
self ,
+
username ,
+
password ,
+
access ,
+
accept_eula = OPTIONAL ,
+
attributes = OPTIONAL ,):
"""
-
*get_snmp_state* is used to return the current state of the SNMP
-
feature.
-
+
You can use AddClusterAdmin to add a new cluster admin account. A cluster ddmin can manage the cluster using the API and management tools. Cluster admins are completely separate and unrelated to standard tenant accounts.
+
Each cluster admin can be restricted to a subset of the API. NetApp recommends using multiple cluster admin accounts for different users and applications. You should give each cluster admin the minimal permissions necessary; this reduces the potential impact of credential compromise.
+
You must accept the End User License Agreement (EULA) by setting the acceptEula parameter to true to add a cluster administrator account to the system.
+
:param username: [required] Unique username for this cluster admin. Must be between 1 and 1024 characters in length.
+
:type username: str
+
:param password: [required] Password used to authenticate this cluster admin.
+
:type password: str
+
:param access: [required] Controls which methods this cluster admin can use. For more details on the levels of access, see Access Control in the Element API Reference Guide.
+
:type access: str
-
**Note**: *get_snmp_state* is new for Element OS 8. Please use this
-
method and *set_snmp_acl* to migrate your SNMP functionality in the
-
future.
+
:param acceptEula: Required to indicate your acceptance of the End User License Agreement when creating this cluster. To accept the EULA, set this parameter to true.
+
:type acceptEula: bool
-
:returns: a response
-
:rtype: GetSnmpStateResult
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
"""
-
params = {}
+
self . _check_connection_type ( "add_cluster_admin" , "Cluster" )
+
params = {
+
"username" : username ,
+
"password" : password ,
+
"access" : access ,
+
}
+
if accept_eula is not None :
+
params [ "acceptEula" ] = accept_eula
+
if attributes is not None :
+
params [ "attributes" ] = attributes
+
+
# There is no adaptor.
return self . send_request (
-
'GetSnmpState' ,
-
GetSnmpStateResult ,
+
'AddClusterAdmin' ,
+
AddClusterAdminResult ,
params ,
-
since = 8.0 ,
+
since = 1.0
)
-
[docs] def get_api (
+
[docs] def get_current_cluster_admin (
self ,):
"""
-
Retrieves the current version of the API and a list of all supported
-
versions.
-
-
:returns: a response
-
:rtype: GetAPIResult
-
"""
+
GetCurrentClusterAdmin returns information for the current primary cluster administrator. The primary Cluster Admin was created when the cluster was created. """
-
params = {}
+
self . _check_connection_type ( "get_current_cluster_admin" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'GetAPI' ,
-
GetAPIResult ,
+
'GetCurrentClusterAdmin' ,
+
GetCurrentClusterAdminResult ,
params ,
+
since = 6.0
)
-
[docs] def get_current_cluster_admin (
+
[docs] def list_cluster_admins (
self ,):
"""
-
*get_current_cluster_admin* returns information for the current primary
-
cluster administrator. The primary Cluster Admin was ncreated when the
-
cluster was created.
-
-
:returns: a response
-
:rtype: GetCurrentClusterAdminResult
-
"""
+
ListClusterAdmins returns the list of all cluster administrators for the cluster. There can be several cluster administrator accounts with different levels of permissions. There can be only one primary cluster administrator in the system. The primary Cluster Admin is the administrator that was created when the cluster was created. You can also create LDAP administrators when setting up an LDAP system on the cluster. """
-
params = {}
+
self . _check_connection_type ( "list_cluster_admins" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'GetCurrentClusterAdmin' ,
-
GetCurrentClusterAdminResult ,
+
'ListClusterAdmins' ,
+
ListClusterAdminsResult ,
params ,
+
since = 1.0
)
-
[docs] def enable_encryption_at_rest (
-
self ,):
+
[docs] def modify_cluster_admin (
+
self ,
+
cluster_admin_id ,
+
password = OPTIONAL ,
+
access = OPTIONAL ,
+
attributes = OPTIONAL ,):
"""
-
The *enable_encryption_at_rest* method is used to enable the Advanced
-
Encryption Standard (AES) 256-bit encryption at rest on the cluster so
-
that the cluster can manage the encryption key used for the drives on
-
each node. This feature is not enabled by default. Enabling this
-
operation allows the cluster to automatically manage encryption keys
-
internally for the drives on each node in the cluster. Nodes do not
-
store the keys to unlock drives and the keys are never passed over the
-
network. Two nodes participating in a cluster are required to access
-
the key to disable encryption on a drive. The encryption management
-
does not affect performance or efficiency on the cluster. If an
-
encryption-enabled drive or node is removed from the cluster with the
-
API, all data is secure erased and any data left on the drive cannot be
-
read or accessed.
-
Enabling or disabling encryption should be performed when the cluster
-
is running and in a healthy state. Encryption can be enabled or
-
disabled at your discretion and can be performed as often as you need.
-
+
You can use ModifyClusterAdmin to change the settings for a cluster admin or LDAP cluster admin. You cannot change access for the administrator cluster admin account.
+
:param clusterAdminID: [required] ClusterAdminID for the cluster admin or LDAP cluster admin to modify.
+
:type clusterAdminID: int
-
**Note**: This process is asynchronous and returns a response
-
before encryption is enabled. The *get_cluster_info* method can be used
-
to poll the system to see when the process has completed.
+
:param password: Password used to authenticate this cluster admin.
+
:type password: str
+
:param access: Controls which methods this cluster admin can use. For more details, see Access Control in the Element API Reference Guide.
+
:type access: str
-
:returns: a response
-
:rtype: EnableEncryptionAtRestResult
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
"""
-
params = {}
+
self . _check_connection_type ( "modify_cluster_admin" , "Cluster" )
+
params = {
+
"clusterAdminID" : cluster_admin_id ,
+
}
+
if password is not None :
+
params [ "password" ] = password
+
if access is not None :
+
params [ "access" ] = access
+
if attributes is not None :
+
params [ "attributes" ] = attributes
+
+
# There is no adaptor.
return self . send_request (
-
'EnableEncryptionAtRest' ,
-
EnableEncryptionAtRestResult ,
+
'ModifyClusterAdmin' ,
+
ModifyClusterAdminResult ,
params ,
+
since = 1.0
)
-
[docs] def disable_encryption_at_rest (
-
self ,):
+
[docs] def remove_cluster_admin (
+
self ,
+
cluster_admin_id ,):
"""
-
The *disable_encryption_at_rest* method enables you to remove the
-
encryption that was previously applied to the cluster using the
-
*enable_encryption_at_rest* method.
-
This disable method is asynchronous and returns a response before
-
encryption is disabled.
-
You can use the *get_cluster_info* method to poll the system to see
-
when the process has completed.
-
-
:returns: a response
-
:rtype: DisableEncryptionAtRestResult
+
You can use RemoveClusterAdmin to remove a Cluster Admin. You cannot remove the administrator cluster admin account.
+
:param clusterAdminID: [required] ClusterAdminID for the cluster admin to remove.
+
:type clusterAdminID: int
"""
-
params = {}
+
self . _check_connection_type ( "remove_cluster_admin" , "Cluster" )
+
params = {
+
"clusterAdminID" : cluster_admin_id ,
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'DisableEncryptionAtRest' ,
-
DisableEncryptionAtRestResult ,
+
'RemoveClusterAdmin' ,
+
RemoveClusterAdminResult ,
params ,
+
since = 1.0
)
-
[docs] def snmp_send_test_traps (
-
self ,):
+
[docs] def add_drives (
+
self ,
+
drives ,
+
force_during_upgrade = OPTIONAL ,):
"""
-
*snmp_send_test_traps* enables you to test SNMP functionality for a
-
cluster. This method instructs the cluster to send test SNMP traps to
-
the currently configured SNMP manager.
+
AddDrives enables you to add one or more available drives to the cluster, enabling the drives to host a portion of the cluster's data.
+
When you add a node to the cluster or install new drives in an existing node, the new drives are marked as "available" and must be
+
added via AddDrives before they can be utilized. Use the ListDrives method to display drives that are "available" to be added. When
+
you add multiple drives, it is more efficient to add them in a single AddDrives method call rather than multiple individual methods
+
with a single drive each. This reduces the amount of data balancing that must occur to stabilize the storage load on the cluster.
+
When you add a drive, the system automatically determines the "type" of drive it should be.
+
The method is asynchronous and returns immediately. However, it can take some time for the data in the cluster to be rebalanced
+
using the newly added drives. As the new drives are syncing on the system, you can use the ListSyncJobs method to see how the
+
drives are being rebalanced and the progress of adding the new drive. You can also use the GetAsyncResult method to query the
+
method's returned asyncHandle.
+
:param drives: [required] Returns information about each drive to be added to the cluster. Possible values are: driveID: The ID of the drive to add. (Integer) type: (Optional) The type of drive to add. Valid values are "slice" or "block". If omitted, the system assigns the correct type. (String)
+
:type drives: NewDrive
-
:returns: a response
-
:rtype: SnmpSendTestTrapsResult
+
:param forceDuringUpgrade: Allows the user to force the addition of drives during an upgrade.
+
:type forceDuringUpgrade: bool
"""
-
params = {}
+
self . _check_connection_type ( "add_drives" , "Cluster" )
+
params = {
+
"drives" : drives ,
+
}
+
if force_during_upgrade is not None :
+
params [ "forceDuringUpgrade" ] = force_during_upgrade
+
+
# There is no adaptor.
return self . send_request (
-
'SnmpSendTestTraps' ,
-
SnmpSendTestTrapsResult ,
+
'AddDrives' ,
+
AddDrivesResult ,
params ,
+
since = 1.0
)
-
[docs] def get_async_result (
-
self ,
-
async_handle ,):
+
[docs] def get_drive_config (
+
self ,):
"""
-
Used to retrieve the result of asynchronous method calls.
-
Some method calls are long running and do not complete when the initial
-
response is sent.
-
To obtain the result of the method call, polling with
-
*get_async_result* is required.
-
-
-
-
-
*get_async_result* returns the overall status of the operation (in
-
progress, completed, or error) in a standard fashion,
-
but the actual data returned for the operation depends on the original
-
method call and the return data is documented with each method.
-
-
+
GetDriveConfig enables you to display drive information for expected slice and block drive counts as well as the number of slices
+
and block drives that are currently connected to the node.
+
Note: This method is available only through the per-node API endpoint 5.0 or later. """
+
self . _check_connection_type ( "get_drive_config" , "Node" )
-
The result for a completed asynchronous method call can only be
-
retrieved once.
-
Once the final result has been returned, later attempts returns an
-
error.
-
-
:param async_handle: [required] A value that was returned from the
-
original asynchronous method call.
-
:type async_handle: int
-
-
:returns: a response
-
:rtype: GetAsyncResultResult
-
"""
-
-
params = {
-
"asyncHandle" : async_handle ,
+
params = {
}
-
+
+
# There is no adaptor.
return self . send_request (
-
'GetAsyncResult' ,
-
GetAsyncResultResult ,
+
'GetDriveConfig' ,
+
GetDriveConfigResult ,
params ,
+
since = 2.0
)
-
[docs] def add_drives (
+
[docs] def get_drive_hardware_info (
self ,
-
drives ,):
+
drive_id ,):
"""
-
*add_drives* is used to add one or more available drives to the cluster
-
enabling the drives to host a portion of the cluster's data.
-
When you add a node to the cluster or install new drives in an existing
-
node, the new drives are marked as \"available\" and must be added via
-
*add_drives* before they can be utilized.
-
Use the *\"list_drives\"* method to display drives that are
-
\"available\" to be added.
-
When you add multiple drives, it is more efficient to add them in a
-
single *\"add_drives\"* method call rather than multiple individual
-
methods with a single drive each.
-
This reduces the amount of data balancing that must occur to stabilize
-
the storage load on the cluster.
-
-
-
-
-
When you add a drive, the system automatically determines the \"type\"
-
of drive it should be.
+
GetDriveHardwareInfo returns all the hardware information for the given drive. This generally includes details about manufacturers, vendors, versions, and
+
other associated hardware identification information.
+
:param driveID: [required] DriveID for the drive information requested. You can get DriveIDs by using the ListDrives method.
+
:type driveID: int
+
"""
+
self . _check_connection_type ( "get_drive_hardware_info" , "Cluster" )
+
params = {
+
"driveID" : drive_id ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetDriveHardwareInfo' ,
+
GetDriveHardwareInfoResult ,
+
params ,
+
since = 1.0
+
)
+
[docs] def get_drive_stats (
+
self ,
+
drive_id ,):
+
"""
+
GetDriveStats returns high-level activity measurements for a single drive. Values are cumulative from the addition of the drive to the
+
cluster. Some values are specific to block drives. You might not obtain statistical data for both block and metadata drives when you
+
run this method.
+
:param driveID: [required] Specifies the drive for which statistics are gathered.
+
:type driveID: int
+
"""
-
The method returns immediately. However, it may take some time for the
-
data in the cluster to be rebalanced using the newly added drives.
-
As the new drive(s) are syncing on the system, you can use the
-
*\"list_sync_jobs\"* method to see how the drive(s) are being
-
rebalanced and the progress of adding the new drive.
+
self . _check_connection_type ( "get_drive_stats" , "Cluster" )
-
:param drives: [required] List of drives to add to the cluster.
-
:type drives: NewDrive[]
+
params = {
+
"driveID" : drive_id ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetDriveStats' ,
+
GetDriveStatsResult ,
+
params ,
+
since = 1.0
+
)
-
:returns: a response
-
:rtype: AddDrivesResult
+
[docs] def list_drive_hardware (
+
self ,
+
force ,):
+
"""
+
ListDriveHardware returns all the drives connected to a node. Use this method on individual nodes to return drive hardware
+
information or use this method on the cluster master node MVIP to see information for all the drives on all nodes.
+
Note: The "securitySupported": true line of the method response does not imply that the drives are capable of
+
encryption; only that the security status can be queried. If you have a node type with a model number ending in "-NE",
+
commands to enable security features on these drives will fail. See the EnableEncryptionAtRest method for more information.
+
:param force: [required] To run this command, the force parameter must be set to true.
+
:type force: bool
"""
-
params = {
-
"drives" : drives ,
-
}
+
self . _check_connection_type ( "list_drive_hardware" , "Cluster" )
+
params = {
+
"force" : force ,
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'AddDrives' ,
-
AddDrivesResult ,
+
'ListDriveHardware' ,
+
ListDriveHardwareResult ,
params ,
+
since = 7.0
)
[docs] def list_drives (
self ,):
"""
-
*list_drives* allows you to retrieve the list of the drives that exist
-
in the cluster's active nodes.
-
This method returns drives that have been added as volume metadata or
-
block drives as well as drives that have not been added and are
-
available.
-
-
:returns: a response
-
:rtype: ListDrivesResult
-
"""
+
ListDrives enables you to retrieve the list of the drives that exist in the cluster's active nodes. This method returns drives that have
+
been added as volume metadata or block drives as well as drives that have not been added and are available. """
-
params = {}
+
self . _check_connection_type ( "list_drives" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
'ListDrives' ,
ListDrivesResult ,
params ,
+
since = 1.0
)
-
[docs] def get_drive_hardware_info (
+
[docs] def list_drive_stats (
self ,
-
drive_id ,):
+
drives = OPTIONAL ,):
"""
-
*get_drive_hardware_info* returns all the hardware info for the given
-
drive. This generally includes manufacturers, vendors, versions, and
-
other associated hardware identification information.
-
-
:param drive_id: [required] *drive_id* for the drive information
-
requested. *drive_ids* can be obtained via the \"ListDrives\"
-
method.
-
:type drive_id: int
-
-
:returns: a response
-
:rtype: GetDriveHardwareInfoResult
+
ListDriveStats enables you to retrieve high-level activity measurements for multiple drives in the cluster. By default, this method returns statistics for all drives in the cluster, and these measurements are cumulative from the addition of the drive to the cluster. Some values this method returns are specific to block drives, and some are specific to metadata drives.
+
:param drives: Optional list of DriveIDs for which to return drive statistics. If you omit this parameter, measurements for all drives are returned.
+
:type drives: int
"""
-
params = {
-
"driveID" : drive_id ,
-
}
+
self . _check_connection_type ( "list_drive_stats" , "Cluster" )
+
params = {
+
}
+
if drives is not None :
+
params [ "drives" ] = drives
+
+
# There is no adaptor.
return self . send_request (
-
'GetDriveHardwareInfo' ,
-
GetDriveHardwareInfoResult ,
+
'ListDriveStats' ,
+
ListDriveStatsResult ,
params ,
+
since = 9.0
)
-
[docs] def list_drive_hardware (
+
[docs] def remove_drives (
self ,
-
force ,):
+
drives ,
+
force_during_upgrade = OPTIONAL ,):
"""
-
*list_drive_hardware* returns all the drives connected to a node. Use
-
this method on the cluster to return drive hardware information for all
-
the drives on all nodes.
+
You can use RemoveDrives to proactively remove drives that are part of the cluster. You might want to use this method when
+
reducing cluster capacity or preparing to replace drives nearing the end of their service life. Any data on the drives is removed and
+
migrated to other drives in the cluster before the drive is removed from the cluster. This is an asynchronous method. Depending on
+
the total capacity of the drives being removed, it might take several minutes to migrate all of the data. Use the GetAsyncResult
+
method to check the status of the remove operation.
+
When removing multiple drives, use a single RemoveDrives method call rather than multiple individual methods with a single drive
+
each. This reduces the amount of data balancing that must occur to even stabilize the storage load on the cluster.
+
You can also remove drives with a "failed" status using RemoveDrives. When you remove a drive with a "failed" status it is not
+
returned to an "available" or active status. The drive is unavailable for use in the cluster.
+
Use the ListDrives method to obtain the driveIDs for the drives you want to remove.
+
:param drives: [required] List of driveIDs to remove from the cluster.
+
:type drives: int
-
:param force: [required] This must be set to true in order to retrieve
-
the drive hardware stats from the cluster.
-
:type force: bool
-
-
:returns: a response
-
:rtype: ListDriveHardwareResult
+
:param forceDuringUpgrade: If you want to remove a drive during upgrade, this must be set to true.
+
:type forceDuringUpgrade: bool
"""
-
params = {
-
"force" : force ,
-
}
+
self . _check_connection_type ( "remove_drives" , "Cluster" )
+
params = {
+
"drives" : drives ,
+
}
+
if force_during_upgrade is not None :
+
params [ "forceDuringUpgrade" ] = force_during_upgrade
+
+
# There is no adaptor.
return self . send_request (
-
'ListDriveHardware' ,
-
ListDriveHardwareResult ,
+
'RemoveDrives' ,
+
AsyncHandleResult ,
params ,
+
since = 1.0
)
[docs] def reset_drives (
@@ -1815,278 +1636,377 @@
Source code for solidfire
drives ,
force ,):
"""
- *reset_drives* is used to pro-actively initialize drives and remove all
- data currently residing on the drive. The drive can then be reused in
- an existing node or used in an upgraded SolidFire node. This method
- requires the force=true parameter to be included in the method call.
-
-
-
-
- **Note**: This method is available only through the per-node API
- endpoint 5.0 or later.
-
- :param drives: [required] List of device names (not driveIDs) to reset.
+ ResetDrives enables you to proactively initialize drives and remove all data currently residing on a drive. The drive can then be reused
+ in an existing node or used in an upgraded node. This method requires the force parameter to be included in the method call.
+ :param drives: [required] List of device names (not driveIDs) to reset.
:type drives: str
- :param force: [required] The \"force\" parameter must be included on
- this method to successfully reset a drive.
+ :param force: [required] Required parameter to successfully reset a drive.
:type force: bool
-
- :returns: a response
- :rtype: ResetDrivesResult
"""
- params = {
+ self . _check_connection_type ( "reset_drives" , "Node" )
+
+ params = {
"drives" : drives ,
"force" : force ,
}
-
+
+ # There is no adaptor.
return self . send_request (
'ResetDrives' ,
ResetDrivesResult ,
params ,
+ since = 6.0
+ )
+
+
[docs] def secure_erase_drives (
+
self ,
+
drives ,):
+
"""
+
SecureEraseDrives enables you to remove any residual data from drives that have a status of "available." You might want to use this method when replacing a drive nearing the end of its service life that contained sensitive data. This method uses a Security Erase Unit command to write a predetermined pattern to the drive and resets the encryption key on the drive. This asynchronous method might take up to two minutes to complete. You can use GetAsyncResult to check on the status of the secure erase operation.
+
You can use the ListDrives method to obtain the driveIDs for the drives you want to secure erase.
+
:param drives: [required] List of driveIDs to be secure erased.
+
:type drives: int
+
"""
+
+
self . _check_connection_type ( "secure_erase_drives" , "Cluster" )
+
+
params = {
+
"drives" : drives ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'SecureEraseDrives' ,
+
AsyncHandleResult ,
+
params ,
+
since = 5.0
)
[docs] def test_drives (
self ,
-
force ,
-
minutes = OPTIONAL ,):
+
minutes = OPTIONAL ,
+
force = OPTIONAL ,):
"""
-
The *test_drives* API method is used to run a hardware validation on
-
all the drives on the node. Hardware failures on the drives are
-
detected if present and they are reported in the results of the
-
validation tests.
+
You can use the TestDrives API method to run a hardware validation on all drives on the node. This method detects hardware
+
failures on the drives (if present) and reports them in the results of the validation tests.
+
You can only use the TestDrives method on nodes that are not "active" in a cluster.
+
Note: This test takes approximately 10 minutes.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
:param minutes: Specifies the number of minutes to run the test.
+
:type minutes: int
+
+
:param force: Required parameter to successfully test the drives on the node.
+
:type force: bool
+
"""
+
self . _check_connection_type ( "test_drives" , "Node" )
+
params = {
+
}
+
if minutes is not None :
+
params [ "minutes" ] = minutes
+
if force is not None :
+
params [ "force" ] = force
+
+
# There is no adaptor.
+
return self . send_request (
+
'TestDrives' ,
+
TestDrivesResult ,
+
params ,
+
since = 5.0
+
)
+
[docs] def get_cluster_hardware_info (
+
self ,
+
type = OPTIONAL ,):
+
"""
+
You can use the GetClusterHardwareInfo method to retrieve the hardware status and information for all Fibre Channel nodes, iSCSI
+
nodes and drives in the cluster. This generally includes details about manufacturers, vendors, versions, and other associated hardware
+
identification information.
+
:param type: Includes only a certain type of hardware information in the response. Possible values are: drives: List only drive information in the response. nodes: List only node information in the response. all: Include both drive and node information in the response. If this parameter is omitted, a type of "all" is assumed.
+
:type type: str
+
"""
-
**Note**: This test takes approximately 10 minutes.
+
self . _check_connection_type ( "get_cluster_hardware_info" , "Cluster" )
+
params = {
+
}
+
if type is not None :
+
params [ "type" ] = type
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetClusterHardwareInfo' ,
+
GetClusterHardwareInfoResult ,
+
params ,
+
since = 1.0
+
)
+
[docs] def get_hardware_config (
+
self ,):
+
"""
+
GetHardwareConfig enables you to display the hardware configuration information for a node.
+
Note: This method is available only through the per-node API endpoint 5.0 or later. """
+
self . _check_connection_type ( "get_hardware_config" , "Node" )
-
**Note**: This method is available only through the per-node API
-
endpoint 5.0 or later.
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetHardwareConfig' ,
+
GetHardwareConfigResult ,
+
params ,
+
since = 5.0
+
)
-
:param force: [required] The \"force\" parameter must be included on
-
this method to successfully test the drives on the node.
-
:type force: bool
+
[docs] def get_hardware_info (
+
self ,):
+
"""
+
The GetHardwareInfo API method enables you to return hardware information and status for a single node. This generally includes details about manufacturers, vendors, versions, drives, and other associated hardware identification information. """
-
:param minutes: (optional) The number of minutes to run the test can be
-
specified.
-
:type minutes: int
+
self . _check_connection_type ( "get_hardware_info" , "Node" )
-
:returns: a response
-
:rtype: TestDrivesResult
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetHardwareInfo' ,
+
GetHardwareInfoResult ,
+
params ,
+
since = 9.0
+
)
+
+
[docs] def get_node_hardware_info (
+
self ,
+
node_id ,):
+
"""
+
GetNodeHardwareInfo enables you to return all the hardware information and status for the node specified. This generally includes details about
+
manufacturers, vendors, versions, and other associated hardware identification information.
+
:param nodeID: [required] The ID of the node for which hardware information is being requested. Information about a Fibre Channel node is returned if a Fibre Channel node is specified.
+
:type nodeID: int
"""
-
params = {
-
"force" : force ,
-
}
-
if minutes is not None :
-
params [ "minutes" ] = minutes
+
self . _check_connection_type ( "get_node_hardware_info" , "Cluster" )
+
params = {
+
"nodeID" : node_id ,
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'TestDrives' ,
-
TestDrivesResult ,
+
'GetNodeHardwareInfo' ,
+
GetNodeHardwareInfoResult ,
+
params ,
+
since = 1.0
+
)
+
+
[docs] def get_nvram_info (
+
self ,
+
force = OPTIONAL ,):
+
"""
+
GetNvramInfo enables you to retrieve information from each node about the NVRAM card.
+
:param force: Required parameter to successfully run on all nodes in the cluster.
+
:type force: bool
+
"""
+
+
self . _check_connection_type ( "get_nvram_info" , "Node" )
+
+
params = {
+
}
+
if force is not None :
+
params [ "force" ] = force
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetNvramInfo' ,
+
GetNvramInfoResult ,
params ,
+
since = 5.0
)
-
[docs] def get_drive_stats (
+
[docs] def add_initiators_to_volume_access_group (
self ,
-
drive_id ,):
+
volume_access_group_id ,
+
initiators ,):
"""
-
*get_drive_stats* return high-level activity measurements for a single
-
drive. Values are cumulative from the addition of the drive to the
-
cluster. Some values are specific to Block Drives. Statistical data may
-
not be returned for both block and metadata drives when running this
-
method.
-
For more information on which drive type returns which data, see
-
Response Example (Block Drive) and Response Example (Volume Metadata
-
Drive) in the SolidFire API guide.
+
AddInitiatorsToVolumeAccessGroup enables you
+
to add initiators to a specified volume access group.
+
:param volumeAccessGroupID: [required] The ID of the volume access group to modify.
+
:type volumeAccessGroupID: int
-
:param drive_id: [required] Specifies the drive for which statistics
-
are gathered.
-
:type drive_id: int
-
-
:returns: a response
-
:rtype: GetDriveStatsResult
+
:param initiators: [required] The list of initiators to add to the volume access group.
+
:type initiators: str
"""
-
params = {
-
"driveID" : drive_id ,
-
}
+
self . _check_connection_type ( "add_initiators_to_volume_access_group" , "Cluster" )
+
params = {
+
"volumeAccessGroupID" : volume_access_group_id ,
+
"initiators" : initiators ,
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'GetDriveStats' ,
-
GetDriveStatsResult ,
+
'AddInitiatorsToVolumeAccessGroup' ,
+
ModifyVolumeAccessGroupResult ,
params ,
+
since = 5.0
)
-
[docs] def secure_erase_drives (
+
[docs] def create_initiators (
self ,
-
drives ,):
+
initiators ,):
"""
-
*secure_erase_drives* is used to remove any residual data from drives
-
that have a status of \"available.\" For example, when replacing a
-
drive at its end-of-life that contained sensitive data.
-
It uses a Security Erase Unit command to write a predetermined pattern
-
to the drive and resets the encryption key on the drive. The method may
-
take up to two minutes to complete, so it is an asynchronous method.
-
The *get_async_result* method can be used to check on the status of the
-
secure erase operation.
-
-
-
-
-
Use the *\"list_drives\"* method to obtain the *drive_ids* for the
-
drives you want to secure erase.
-
-
:param drives: [required] List of *drive_ids* to secure erase.
-
:type drives: int[]
-
-
:returns: a response
-
:rtype: AsyncHandleResult
+
CreateInitiators enables you to create multiple new initiator IQNs or World Wide Port Names (WWPNs) and optionally assign them
+
aliases and attributes. When you use CreateInitiators to create new initiators, you can also add them to volume access groups.
+
If CreateInitiators fails to create one of the initiators provided in the parameter, the method returns an error and does not create
+
any initiators (no partial completion is possible).
+
:param initiators: [required] A list of objects containing characteristics of each new initiator. Values are: name: (Required) The name of the initiator (IQN or WWPN) to create. (String) alias: (Optional) The friendly name to assign to this initiator. (String) attributes: (Optional) A set of JSON attributes to assign to this initiator. (JSON Object) volumeAccessGroupID: (Optional) The ID of the volume access group into to which this newly created initiator will be added. (Integer)
+
:type initiators: CreateInitiator
"""
-
params = {
-
"drives" : drives ,
-
}
+
self . _check_connection_type ( "create_initiators" , "Cluster" )
+
params = {
+
"initiators" : initiators ,
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'SecureEraseDrives' ,
-
AsyncHandleResult ,
+
'CreateInitiators' ,
+
CreateInitiatorsResult ,
params ,
+
since = 9.0
)
-
[docs] def remove_drives (
+
[docs] def delete_initiators (
self ,
-
drives ,):
+
initiators ,):
"""
-
You can use *remove_drives* to proactively remove drives that are part
-
of the cluster.
-
You may want to use this method when reducing cluster capacity or
-
preparing to replace drives nearing the end of their service life.
-
Any data on the drives is removed and migrated to other drives in the
-
cluster before the drive is removed from the cluster. This is an
-
asynchronous method.
-
Depending on the total capacity of the drives being removed, it may
-
take several minutes to migrate all of the data.
-
Use the *\"get_async_result\"* method to check the status of the remove
-
operation.
-
-
-
-
-
When removing multiple drives, use a single *\"remove_drives\"* method
-
call rather than multiple individual methods with a single drive each.
-
This reduces the amount of data balancing that must occur to even
-
stabilize the storage load on the cluster.
-
-
-
-
-
You can also remove drives with a \"failed\" status using
-
\"RemoveDrives\".
-
When you remove a drive with a \"failed\" status it is not returned to
-
an \"available\" or \"active\" status.
-
The drive is unavailable for use in the cluster.
-
-
-
-
-
Use the *\"list_drives\"* method to obtain the *drive_ids* for the
-
drives you want to remove.
-
-
:param drives: [required] List of *drive_ids* to remove from the
-
cluster.
-
:type drives: int[]
-
-
:returns: a response
-
:rtype: AsyncHandleResult
+
DeleteInitiators enables you to delete one or more initiators from the system (and from any associated volumes or volume access
+
groups).
+
If DeleteInitiators fails to delete one of the initiators provided in the parameter, the system returns an error and does not delete any
+
initiators (no partial completion is possible).
+
:param initiators: [required] An array of IDs of initiators to delete.
+
:type initiators: int
"""
-
params = {
-
"drives" : drives ,
-
}
+
self . _check_connection_type ( "delete_initiators" , "Cluster" )
+
params = {
+
"initiators" : initiators ,
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'RemoveDrives' ,
-
AsyncHandleResult ,
+
'DeleteInitiators' ,
+
DeleteInitiatorsResult ,
params ,
+
since = 9.0
)
-
[docs] def list_fibre_channel_port_info (
-
self ,):
+
[docs] def list_initiators (
+
self ,
+
start_initiator_id = OPTIONAL ,
+
limit = OPTIONAL ,
+
initiators = OPTIONAL ,):
"""
-
The *list_fibre_channel_port_info* is used to return information about
-
the Fibre Channel ports. The API method is intended for use on
-
individual nodes; userid and password is required for access to
-
individual Fibre Channel nodes. However, this method can be used on the
-
cluster if the force=true parameter is included in the method call.
-
When used on the cluster, all Fibre Channel interfaces are listed.
+
ListInitiators enables you to list initiator IQNs or World Wide Port Names (WWPNs).
+
:param startInitiatorID: The initiator ID at which to begin the listing. You can supply this parameter or the "initiators" parameter, but not both.
+
:type startInitiatorID: int
+
+
:param limit: The maximum number of initiator objects to return.
+
:type limit: int
-
:returns: a response
-
:rtype: ListFibreChannelPortInfoResult
+
:param initiators: A list of initiator IDs to retrieve. You can provide a value for this parameter or the "startInitiatorID" parameter, but not both.
+
:type initiators: int
"""
-
params = {}
+
self . _check_connection_type ( "list_initiators" , "Cluster" )
+
params = {
+
}
+
if start_initiator_id is not None :
+
params [ "startInitiatorID" ] = start_initiator_id
+
if limit is not None :
+
params [ "limit" ] = limit
+
if initiators is not None :
+
params [ "initiators" ] = initiators
+
+
# There is no adaptor.
return self . send_request (
-
'ListFibreChannelPortInfo' ,
-
ListFibreChannelPortInfoResult ,
+
'ListInitiators' ,
+
ListInitiatorsResult ,
params ,
-
since = 8.0 ,
+
since = 9.0
)
-
[docs] def list_node_fibre_channel_port_info (
+
[docs] def modify_initiators (
self ,
-
force = OPTIONAL ,):
+
initiators ,):
"""
-
The *list_node_fibre_channel_port_info* is used to return information
-
about the Fibre Channel ports. The API method is intended for use on
-
individual nodes; userid and password is required for access to
-
individual Fibre Channel nodes. However, this method can be used on the
-
cluster if the force=true parameter is included in the method call.
-
When used on the cluster, all Fibre Channel interfaces are listed.
-
-
:param force: (optional) Specify force=true to call method on all
-
member nodes of the cluster.
-
:type force: bool
-
-
:returns: a response
-
:rtype: ListNodeFibreChannelPortInfoResult
+
ModifyInitiators enables you to change the attributes of one or more existing initiators. You cannot change the name of an existing
+
initiator. If you need to change the name of an initiator, delete it first with DeleteInitiators and create a new one with
+
CreateInitiators.
+
If ModifyInitiators fails to change one of the initiators provided in the parameter, the method returns an error and does not modify
+
any initiators (no partial completion is possible).
+
:param initiators: [required] A list of objects containing characteristics of each initiator to modify. Values are: initiatorID: (Required) The ID of the initiator to modify. (Integer) alias: (Optional) A new friendly name to assign to the initiator. (String) attributes: (Optional) A new set of JSON attributes to assign to the initiator. (JSON Object) volumeAccessGroupID: (Optional) The ID of the volume access group into to which the initiator should be added. If the initiator was previously in a different volume access group, it is removed from the old volume access group. If this key is present but null, the initiator is removed from its current volume access group, but not placed in any new volume access group. (Integer)
+
:type initiators: ModifyInitiator
"""
-
params = {}
-
if force is not None :
-
params [ "force" ] = force
+
self . _check_connection_type ( "modify_initiators" , "Cluster" )
+
params = {
+
"initiators" : initiators ,
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'ListNodeFibreChannelPortInfo' ,
-
ListNodeFibreChannelPortInfoResult ,
+
'ModifyInitiators' ,
+
ModifyInitiatorsResult ,
params ,
-
since = 7.0 ,
+
since = 9.0
)
-
[docs] def list_fibre_channel_sessions (
-
self ,):
+
[docs] def remove_initiators_from_volume_access_group (
+
self ,
+
volume_access_group_id ,
+
initiators ,
+
delete_orphan_initiators = OPTIONAL ,):
"""
-
The *list_fibre_channel_sessions* is used to return information about
-
the active Fibre Channel sessions on a cluster.
+
RemoveInitiatorsFromVolumeAccessGroup enables
+
you to remove initiators from a specified volume access
+
group.
+
:param volumeAccessGroupID: [required] The ID of the volume access group from which the initiators are removed.
+
:type volumeAccessGroupID: int
+
+
:param initiators: [required] The list of initiators to remove from the volume access group.
+
:type initiators: str
-
:returns: a response
-
:rtype: ListFibreChannelSessionsResult
+
:param deleteOrphanInitiators: true: Delete initiator objects after they are removed from a volume access group. false: Do not delete initiator objects after they are removed from a volume access group.
+
:type deleteOrphanInitiators: bool
"""
-
params = {}
+
self . _check_connection_type ( "remove_initiators_from_volume_access_group" , "Cluster" )
+
params = {
+
"volumeAccessGroupID" : volume_access_group_id ,
+
"initiators" : initiators ,
+
}
+
if delete_orphan_initiators is not None :
+
params [ "deleteOrphanInitiators" ] = delete_orphan_initiators
+
+
# There is no adaptor.
return self . send_request (
-
'ListFibreChannelSessions' ,
-
ListFibreChannelSessionsResult ,
+
'RemoveInitiatorsFromVolumeAccessGroup' ,
+
ModifyVolumeAccessGroupResult ,
params ,
-
since = 7.0 ,
+
since = 5.0
)
[docs] def add_ldap_cluster_admin (
@@ -2096,121 +2016,58 @@
Source code for solidfire
accept_eula = OPTIONAL ,
attributes = OPTIONAL ,):
"""
- *add_ldap_cluster_admin* is used to add a new LDAP Cluster Admin. An
- LDAP Cluster Admin can be used to manage the cluster via the API and
- management tools. LDAP Cluster Admins are completely separate and
- unrelated to standard tenant accounts.
-
-
-
-
- An LDAP group that has been defined in Active Directory can also be
- added using this API method. The access level that is given to the
- group will be passed to the individual users in the LDAP group.
-
- :param username: [required] The distinguished user name for the new
- LDAP cluster admin.
+ AddLdapClusterAdmin enables you to add a new LDAP cluster administrator user. An LDAP cluster administrator can manage the
+ cluster via the API and management tools. LDAP cluster admin accounts are completely separate and unrelated to standard tenant
+ accounts.
+ You can also use this method to add an LDAP group that has been defined in Active Directory. The access level that is given to the group is passed to the individual users in the LDAP group.
+ :param username: [required] The distinguished user name for the new LDAP cluster admin.
:type username: str
- :param access: [required] Controls which methods this Cluster Admin can
- use. For more details on the levels of access, see the Access
- Control appendix in the SolidFire API Reference.
- :type access: str[]
+ :param access: [required] Controls which methods this Cluster Admin can use. For more details on the levels of access, see the Access Control appendix in the SolidFire API Reference.
+ :type access: str
- :param accept_eula: (optional) Indicate your acceptance of the End User
- License Agreement when creating this cluster admin. To accept the
- EULA, set this parameter to true.
- :type accept_eula: bool
+ :param acceptEula: Accept the End User License Agreement. Set to true to add a cluster administrator account to the system. If omitted or set to false, the method call fails.
+ :type acceptEula: bool
- :param attributes: (optional) List of Name/Value pairs in JSON object
- format.
+ :param attributes: List of name-value pairs in JSON object format.
:type attributes: dict
-
- :returns: a response
- :rtype: AddLdapClusterAdminResult
"""
- params = {
+ self . _check_connection_type ( "add_ldap_cluster_admin" , "Cluster" )
+
+ params = {
"username" : username ,
"access" : access ,
}
- self . _check_param_versions (
- 'add_ldap_cluster_admin' ,
- [
- ( "accept_eula" ,
- accept_eula , 9.0 , None ),
- ]
- )
if accept_eula is not None :
params [ "acceptEula" ] = accept_eula
if attributes is not None :
params [ "attributes" ] = attributes
-
+
+ # There is no adaptor.
return self . send_request (
'AddLdapClusterAdmin' ,
AddLdapClusterAdminResult ,
params ,
- since = 8.0 ,
- )
-
-
[docs] def test_ldap_authentication (
-
self ,
-
username ,
-
password ,
-
ldap_configuration = OPTIONAL ,):
-
"""
-
The *test_ldap_authentication* is used to verify the currently enabled
-
LDAP authentication configuration settings are correct. If the
-
configuration settings are correct, the API call returns a list of the
-
groups the tested user is a member of.
-
-
:param username: [required] The username to be tested.
-
:type username: str
-
-
:param password: [required] The password for the username to be tester.
-
:type password: str
-
-
:param ldap_configuration: (optional) An *ldap_configuration* object to
-
be tested. If this parameter is provided, the API call will test
-
the provided configuration even if LDAP authentication is currently
-
disabled.
-
:type ldap_configuration: LdapConfiguration
-
-
:returns: a response
-
:rtype: TestLdapAuthenticationResult
-
"""
-
-
params = {
-
"username" : username ,
-
"password" : password ,
-
}
-
if ldap_configuration is not None :
-
params [ "ldapConfiguration" ] = ldap_configuration
-
-
return self . send_request (
-
'TestLdapAuthentication' ,
-
TestLdapAuthenticationResult ,
-
params ,
-
since = 8.0 ,
+
since = 8.0
)
-
[docs] def get_ldap_configuration (
+
[docs] def disable_ldap_authentication (
self ,):
"""
-
The *get_ldap_configuration* is used to get the LDAP configuration
-
currently active on the cluster.
-
-
:returns: a response
-
:rtype: GetLdapConfigurationResult
-
"""
+
The DisableLdapAuthentication method enables you to disable LDAP authentication and remove all LDAP configuration settings. This method does not remove any configured cluster admin accounts (user or group). However, those cluster admin accounts will no longer be able to log in. """
-
params = {}
+
self . _check_connection_type ( "disable_ldap_authentication" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'GetLdapConfiguration' ,
-
GetLdapConfigurationResult ,
+
'DisableLdapAuthentication' ,
+
DisableLdapAuthenticationResult ,
params ,
-
since = 8.0 ,
+
since = 7.0
)
[docs] def enable_ldap_authentication (
@@ -2226,533 +2083,807 @@
Source code for solidfire
user_search_base_dn = OPTIONAL ,
user_search_filter = OPTIONAL ,):
"""
- The *enable_ldap_authentication* method is used to configure an LDAP
- server connection to use for LDAP authentication to a SolidFire
- cluster. Users that are members on the LDAP server can then log in to a
- SolidFire storage system using their LDAP authentication userid and
- password.
-
- :param server_uris: [required] A list of LDAP server *uris* (examples:
- \"ldap://1.2.3.4\" and ldaps://1.2.3.4:123\")
- :type server_uris: str[]
-
- :param auth_type: (optional) Identifies which user authentcation method
- will be used.
-
- Must be one of the following:
+ The EnableLdapAuthentication method enables you to configure an LDAP directory connection to use for LDAP authentication to a cluster. Users that are members of the LDAP directory can then log in to the storage system using their LDAP credentials.
+ :param authType: Identifies which user authentication method to use. Must be one of the following: DirectBind SearchAndBind
+ :type authType: str
- **DirectBind**
+ :param groupSearchBaseDN: The base DN of the tree to start the group search (will do a subtree search from here).
+ :type groupSearchBaseDN: str
- **SearchAndBind** (default)
+ :param groupSearchCustomFilter: For use with the CustomFilter search type, an LDAP filter to use to return the DNs of a users groups. The string can have placeholder text of %USERNAME% and %USERDN% to be replaced with their username and full userDN as needed.
+ :type groupSearchCustomFilter: str
- :type auth_type: str
+ :param groupSearchType: Controls the default group search filter used, and must be one of the following: NoGroups: No group support. ActiveDirectory: Nested membership of all of a users AD groups. MemberDN: MemberDN style groups (single level).
+ :type groupSearchType: str
- :param group_search_base_dn: (optional) The base DN of the tree to
- start the group search (will do a subtree search from here).
- :type group_search_base_dn: str
+ :param searchBindDN: A fully qualified DN to log in with to perform an LDAP search for the user (needs read access to the LDAP directory).
+ :type searchBindDN: str
- :param group_search_custom_filter: (optional) REQUIRED for
- *custom_filter*
+ :param searchBindPassword: The password for the searchBindDN account used for searching.
+ :type searchBindPassword: str
- For use with the *custom_filter* search type, an LDAP filter to use
- to return the *dns* of a user's groups.
+ :param serverURIs: [required] A comma-separated list of LDAP server URIs (examples: "ldap://1.2.3.4" and ldaps://1.2.3.4:123")
+ :type serverURIs: str
- The string can have placeholder text of %USERNAME% and %USERDN% to
- be replaced with their username and full *user_dn* as needed.
+ :param userDNTemplate: A string that is used to form a fully qualified user DN. The string should have the placeholder text %USERNAME%, which is replaced with the username of the authenticating user.
+ :type userDNTemplate: str
- :type group_search_custom_filter: str
+ :param userSearchBaseDN: The base DN of the tree to start the search (will do a subtree search from here).
+ :type userSearchBaseDN: str
- :param group_search_type: (optional) Controls the default group search
- filter used, can be one of the following:
-
- **NoGroups**: No group support.
+ :param userSearchFilter: The LDAP filter to use. The string should have the placeholder text %USERNAME% which is replaced with the username of the authenticating user. Example: (&(objectClass=person)(sAMAccountName=%USERNAME%)) will use the sAMAccountName field in Active Directory to match the username entered at cluster login.
+ :type userSearchFilter: str
+ """
- **ActiveDirectory**: (default) Nested membership of all of a user's
- AD groups.
+ self . _check_connection_type ( "enable_ldap_authentication" , "Cluster" )
- **MemberDN**: *member_dn* style groups (single-level).
+ params = {
+ "serverURIs" : server_uris ,
+ }
+ if auth_type is not None :
+ params [ "authType" ] = auth_type
+ if group_search_base_dn is not None :
+ params [ "groupSearchBaseDN" ] = group_search_base_dn
+ if group_search_custom_filter is not None :
+ params [ "groupSearchCustomFilter" ] = group_search_custom_filter
+ if group_search_type is not None :
+ params [ "groupSearchType" ] = group_search_type
+ if search_bind_dn is not None :
+ params [ "searchBindDN" ] = search_bind_dn
+ if search_bind_password is not None :
+ params [ "searchBindPassword" ] = search_bind_password
+ if user_dntemplate is not None :
+ params [ "userDNTemplate" ] = user_dntemplate
+ if user_search_base_dn is not None :
+ params [ "userSearchBaseDN" ] = user_search_base_dn
+ if user_search_filter is not None :
+ params [ "userSearchFilter" ] = user_search_filter
+
+ # There is no adaptor.
+ return self . send_request (
+ 'EnableLdapAuthentication' ,
+ EnableLdapAuthenticationResult ,
+ params ,
+ since = 7.0
+ )
-
:type group_search_type: str
+
[docs] def get_ldap_configuration (
+
self ,):
+
"""
+
The GetLdapConfiguration method enables you to get the currently active LDAP configuration on the cluster. """
-
:param search_bind_dn: (optional) REQUIRED for *search_and_bind*
+
self . _check_connection_type ( "get_ldap_configuration" , "Cluster" )
-
A fully qualified DN to log in with to perform an LDAP search for
-
the user (needs read access to the LDAP directory).
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetLdapConfiguration' ,
+
GetLdapConfigurationResult ,
+
params ,
+
since = 7.0
+
)
-
:type search_bind_dn: str
+
[docs] def test_ldap_authentication (
+
self ,
+
username ,
+
password ,
+
ldap_configuration = OPTIONAL ,):
+
"""
+
The TestLdapAuthentication method enables you to validate the currently enabled LDAP authentication settings. If the configuration is
+
correct, the API call returns the group membership of the tested user.
+
:param username: [required] The username to be tested.
+
:type username: str
-
:param search_bind_password: (optional) REQUIRED for *search_and_bind*
+
:param password: [required] The password for the username to be tested.
+
:type password: str
-
The password for the *search_bind_dn* account used for searching.
+
:param ldapConfiguration: An ldapConfiguration object to be tested. If specified, the API call tests the provided configuration even if LDAP authentication is disabled.
+
:type ldapConfiguration: LdapConfiguration
+
"""
-
:type search_bind_password: str
+
self . _check_connection_type ( "test_ldap_authentication" , "Cluster" )
-
:param user_dntemplate: (optional) REQUIRED for *direct_bind*
+
params = {
+
"username" : username ,
+
"password" : password ,
+
}
+
if ldap_configuration is not None :
+
params [ "ldapConfiguration" ] = ldap_configuration
+
+
# There is no adaptor.
+
return self . send_request (
+
'TestLdapAuthentication' ,
+
TestLdapAuthenticationResult ,
+
params ,
+
since = 7.0
+
)
-
A string that is used to form a fully qualified user DN.
+
[docs] def get_login_session_info (
+
self ,):
+
"""
+
GetLoginSessionInfo enables you to return the period of time a log in authentication session is valid for both log in shells and the TUI. """
-
The string should have the placeholder text \"%USERNAME%\" which
-
will be replaced with the username of the authenticating user.
+
self . _check_connection_type ( "get_login_session_info" , "Cluster" )
-
:type user_dntemplate: str
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetLoginSessionInfo' ,
+
GetLoginSessionInfoResult ,
+
params ,
+
since = 7.0
+
)
-
:param user_search_base_dn: (optional) REQUIRED for *search_and_bind*
-
The base DN of the tree used to start the search (will do a subtree
-
search from here).
-
:type user_search_base_dn: str
+
[docs] def get_remote_logging_hosts (
+
self ,):
+
"""
+
GetRemoteLoggingHosts enables you to retrieve the current list of log servers. """
-
:param user_search_filter: (optional) REQUIRED for SearchAndBind.
+
self . _check_connection_type ( "get_remote_logging_hosts" , "Cluster" )
-
The LDAP filter to use.
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetRemoteLoggingHosts' ,
+
GetRemoteLoggingHostsResult ,
+
params ,
+
since = 1.0
+
)
-
The string should have the placeholder text \"%USERNAME%\" which
-
will be replaced with the username of the authenticating user.
+
[docs] def set_login_session_info (
+
self ,
+
timeout ,):
+
"""
+
You can use SetLoginSessionInfo to set the period of time that a session's login authentication is valid. After the log in period elapses without activity on the system, the authentication expires. New login credentials are required for continued access to the cluster after the timeout period has elapsed.
+
:param timeout: [required] Cluster authentication expiration period. Formatted in HH:mm:ss. For example, 01:30:00, 00:90:00, and 00:00:5400 can be used to equal a 90 minute timeout period. The default value is 30 minutes.
+
:type timeout: str
+
"""
-
Example: (&(objectClass=person) (sAMAccountName=%USERNAME%)) will
-
use the *s_amaccount_name* field in Active Directory to match the
-
nusername entered at cluster login.
+
self . _check_connection_type ( "set_login_session_info" , "Cluster" )
-
:type user_search_filter: str
+
params = {
+
"timeout" : timeout ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'SetLoginSessionInfo' ,
+
SetLoginSessionInfoResult ,
+
params ,
+
since = 7.0
+
)
-
:returns: a response
-
:rtype: EnableLdapAuthenticationResult
+
[docs] def set_remote_logging_hosts (
+
self ,
+
remote_hosts ,):
+
"""
+
SetRemoteLoggingHosts enables you to configure remote logging from the nodes in the storage cluster to a centralized log server or servers. Remote logging is performed over TCP using the default port 514. This API does not add to the existing logging hosts. Rather, it replaces what currently exists with new values specified by this API method. You can use GetRemoteLoggingHosts to determine what the current logging hosts are, and then use SetRemoteLoggingHosts to set the desired list of current and new logging hosts.
+
:param remoteHosts: [required] A list of hosts to send log messages to.
+
:type remoteHosts: LoggingServer
"""
-
params = {
-
"serverURIs" : server_uris ,
+
self . _check_connection_type ( "set_remote_logging_hosts" , "Cluster" )
+
+
params = {
+
"remoteHosts" : remote_hosts ,
}
-
if auth_type is not None :
-
params [ "authType" ] = auth_type
-
if group_search_base_dn is not None :
-
params [ "groupSearchBaseDN" ] = group_search_base_dn
-
if group_search_custom_filter is not None :
-
params [ "groupSearchCustomFilter" ] = group_search_custom_filter
-
if group_search_type is not None :
-
params [ "groupSearchType" ] = group_search_type
-
if search_bind_dn is not None :
-
params [ "searchBindDN" ] = search_bind_dn
-
if search_bind_password is not None :
-
params [ "searchBindPassword" ] = search_bind_password
-
if user_dntemplate is not None :
-
params [ "userDNTemplate" ] = user_dntemplate
-
if user_search_base_dn is not None :
-
params [ "userSearchBaseDN" ] = user_search_base_dn
-
if user_search_filter is not None :
-
params [ "userSearchFilter" ] = user_search_filter
+
+
# There is no adaptor.
+
return self . send_request (
+
'SetRemoteLoggingHosts' ,
+
SetRemoteLoggingHostsResult ,
+
params ,
+
since = 1.0
+
)
+
+
[docs] def list_fibre_channel_port_info (
+
self ,):
+
"""
+
ListFibreChannelPortInfo enables you to retrieve information about the Fibre Channel ports on a node. The API method is intended for use on individual nodes; userid and password authentication is required for access to individual Fibre Channel nodes. """
+
self . _check_connection_type ( "list_fibre_channel_port_info" , "Cluster" )
+
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'EnableLdapAuthentication' ,
-
EnableLdapAuthenticationResult ,
+
'ListFibreChannelPortInfo' ,
+
ListFibreChannelPortInfoResult ,
params ,
-
since = 8.0 ,
+
since = 8.0
)
-
[docs] def disable_ldap_authentication (
+
[docs] def list_fibre_channel_sessions (
self ,):
"""
-
The *disable_ldap_authentication* method is used disable LDAP
-
authentication and remove all LDAP configuration settings. This call
-
will not remove any configured cluster admin accounts (user or group).
-
However, those cluster admin accounts will no longer be able to log in.
-
-
:returns: a response
-
:rtype: DisableLdapAuthenticationResult
-
"""
+
ListFibreChannelSessions enables you to retrieve information about the active Fibre Channel sessions on a cluster. """
-
params = {}
+
self . _check_connection_type ( "list_fibre_channel_sessions" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'DisableLdapAuthentication' ,
-
DisableLdapAuthenticationResult ,
+
'ListFibreChannelSessions' ,
+
ListFibreChannelSessionsResult ,
params ,
-
since = 8.0 ,
+
since = 7.0
)
-
[docs] def list_active_nodes (
+
[docs] def list_iscsisessions (
self ,):
"""
-
*list_active_nodes* returns the list of currently active nodes that are
-
in the cluster.
-
-
:returns: a response
-
:rtype: ListActiveNodesResult
-
"""
+
You can use ListISCSISessions to return iSCSI information for volumes in the cluster. """
-
params = {}
+
self . _check_connection_type ( "list_iscsisessions" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'ListActiveNodes' ,
-
ListActiveNodesResult ,
+
'ListISCSISessions' ,
+
ListISCSISessionsResult ,
params ,
+
since = 1.0
)
-
[docs] def list_all_nodes (
+
[docs] def list_network_interfaces (
self ,):
"""
-
*list_all_nodes* enables you to retrieve a list of active and pending
-
nodes in the cluster.
-
-
:returns: a response
-
:rtype: ListAllNodesResult
-
"""
+
ListNetworkInterfaces enables you to retrieve information about each network interface on a node. The API method is intended for use on individual nodes; userid and password authentication is required for access to individual nodes. """
-
params = {}
+
self . _check_connection_type ( "list_network_interfaces" , "Node" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'ListAllNodes' ,
-
ListAllNodesResult ,
+
'ListNetworkInterfaces' ,
+
ListNetworkInterfacesResult ,
params ,
+
since = 7.0
)
-
[docs] def list_pending_nodes (
+
[docs] def list_node_fibre_channel_port_info (
self ,):
"""
-
Gets the list of pending nodes.
-
Pending nodes are running and configured to join the cluster, but have
-
not been added via the *add_nodes* method.
-
-
:returns: a response
-
:rtype: ListPendingNodesResult
-
"""
+
The ListNodeFibreChannelPortInfo API method enables you to retrieve information about the Fibre Channel ports on a node. The API method is intended for use on individual nodes; userid and password authentication is required for access to individual Fibre Channel nodes. """
-
params = {}
+
self . _check_connection_type ( "list_node_fibre_channel_port_info" , "Node" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'ListPendingNodes' ,
-
ListPendingNodesResult ,
+
'ListNodeFibreChannelPortInfo' ,
+
ListNodeFibreChannelPortInfoResult ,
params ,
+
since = 7.0
)
[docs] def add_nodes (
self ,
-
pending_nodes ,):
+
pending_nodes ,
+
auto_install = OPTIONAL ,):
"""
-
*add_nodes* is used to add one or more new nodes to the cluster. When a
-
node is not configured and starts up for the first time you are
-
prompted to configure the node. Once a node is configured it is
-
registered as a \"pending node\" with the cluster.
+
AddNodes enables you to add one or more new nodes to a cluster. When a node that is not configured starts up for the first time, you are prompted to configure the node. After you configure the node, it is registered as a "pending node" with the cluster.
+
Note: It might take several seconds after adding a new node for it to start up and register its drives as available.
+
:param pendingNodes: [required] List of pending NodeIDs for the nodes to be added. You can obtain the list of pending nodes using the ListPendingNodes method.
+
:type pendingNodes: int
+
:param autoInstall: Whether these nodes should be autoinstalled
+
:type autoInstall: bool
+
"""
+
self . _check_connection_type ( "add_nodes" , "Cluster" )
+
params = {
+
"pendingNodes" : pending_nodes ,
+
}
+
if auto_install is not None :
+
params [ "autoInstall" ] = auto_install
+
+
# There is no adaptor.
+
return self . send_request (
+
'AddNodes' ,
+
AddNodesResult ,
+
params ,
+
since = 1.0
+
)
-
Adding a node to a cluster that has been set up for virtual networking
-
will require a sufficient number of virtual storage IP addresses to
-
allocate a virtual IP to the new node. If there are no virtual IP
-
addresses available for the new node, the *add_node* operation will not
-
complete successfully. Use the *\"modify_virtual_network\"* method to
-
add more storage IP addresses to your virtual network.
+
[docs] def get_bootstrap_config (
+
self ,):
+
"""
+
GetBootstrapConfig returns cluster and node information from the bootstrap configuration file. Use this API method on an individual node before it has been joined with a cluster. You can use the information this method returns in the cluster configuration interface when you create a cluster. """
+
self . _check_connection_type ( "get_bootstrap_config" , "Both" )
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetBootstrapConfig' ,
+
GetBootstrapConfigResult ,
+
params ,
+
since = 2.0
+
)
+
[docs] def get_config (
+
self ,):
+
"""
+
The GetConfig API method enables you to retrieve all configuration information for a node. This method includes the same information available in both the GetClusterConfig and GetNetworkConfig API methods.
+
Note: This method is available only through the per-node API endpoint 5.0 or later. """
-
The software version on each node in a cluster must be compatible. Run
-
the *\"list_all_nodes\"* API to see what versions of software are
-
currently running on the cluster nodes. For an explanation of software
-
version compatibility, see *\"node* Versioning and Compatibility\" in
-
the Element API guide.
+
self . _check_connection_type ( "get_config" , "Node" )
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetConfig' ,
+
GetConfigResult ,
+
params ,
+
since = 5.0
+
)
+
[docs] def get_network_config (
+
self ,):
+
"""
+
The GetNetworkConfig API method enables you to display the network configuration information for a node.
+
Note: This method is available only through the per-node API endpoint 5.0 or later. """
+
self . _check_connection_type ( "get_network_config" , "Node" )
-
Once a node has been added, the drives on the node are made available
-
and can then be added via the *\"add_drives\"* method to increase the
-
storage capacity of the cluster.
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetNetworkConfig' ,
+
GetNetworkConfigResult ,
+
params ,
+
since = 5.0
+
)
+
[docs] def get_node_stats (
+
self ,
+
node_id ,):
+
"""
+
GetNodeStats enables you to retrieve the high-level activity measurements for a single node.
+
:param nodeID: [required] Specifies the node for which statistics are gathered.
+
:type nodeID: int
+
"""
+
self . _check_connection_type ( "get_node_stats" , "Cluster" )
+
params = {
+
"nodeID" : node_id ,
+
}
+
+
# There is an adaptor!
+
since = 1.0
+
deprecated = None
-
**Note**: It may take several seconds after adding a new Node for it to
-
start up and register the drives as being available.
+
return ElementServiceAdaptor . get_node_stats ( self , params ,
+
since , deprecated )
-
:param pending_nodes: [required] List of *pending_node_ids* for the
-
Nodes to be added. You can obtain the list of Pending Nodes via the
-
*list_pending_nodes* method.
-
:type pending_nodes: int[]
+
[docs] def get_origin (
+
self ,):
+
"""
+
GetOrigin enables you to retrieve the origination certificate for where the node was built. This method might return null if there is no origination certification. """
-
:returns: a response
-
:rtype: AddNodesResult
-
"""
+
self . _check_connection_type ( "get_origin" , "Cluster" )
-
params = {
-
"pendingNodes" : pending_nodes ,
+
params = {
}
-
+
+
# There is no adaptor.
return self . send_request (
-
'AddNodes' ,
-
AddNodesResult ,
+
'GetOrigin' ,
+
GetOriginResult ,
params ,
+
since = 9.0
)
-
[docs] def remove_nodes (
-
self ,
-
nodes ,):
+
[docs] def get_pending_operation (
+
self ,):
"""
-
*remove_nodes* is used to remove one or more nodes that should no
-
longer participate in the cluster. Before removing a node, all drives
-
it contains must first be removed with *\"remove_drives\"* method. A
-
node cannot be removed until the *remove_drives* process has completed
-
and all data has been migrated away from the node.
-
+
You can use GetPendingOperation to detect an operation on a node that is currently in progress. You can also use this method to report back when an operation has completed.
+
Note: method is available only through the per-node API endpoint 5.0 or later. """
+
self . _check_connection_type ( "get_pending_operation" , "Node" )
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetPendingOperation' ,
+
GetPendingOperationResult ,
+
params ,
+
since = 5.0
+
)
-
Once removed, a node registers itself as a pending node and can be
-
added again, or shut down which removes it from the *\"pending* Node\"
-
list.
-
-
:param nodes: [required] List of *node_ids* for the nodes to be
-
removed.
-
:type nodes: int[]
+
[docs] def list_active_nodes (
+
self ,):
+
"""
+
ListActiveNodes returns the list of currently active nodes that are in the cluster. """
-
:returns: a response
-
:rtype: RemoveNodesResult
-
"""
+
self . _check_connection_type ( "list_active_nodes" , "Cluster" )
-
params = {
-
"nodes" : nodes ,
+
params = {
}
-
+
+
# There is no adaptor.
return self . send_request (
-
'RemoveNodes' ,
-
RemoveNodesResult ,
+
'ListActiveNodes' ,
+
ListActiveNodesResult ,
params ,
+
since = 1.0
)
-
[docs] def get_network_config (
+
[docs] def list_all_nodes (
self ,):
"""
-
The *get_network_config* API method is used to display the network
-
configuration information for a node.
-
+
ListAllNodes enables you to retrieve a list of active and pending nodes in the cluster. """
+
self . _check_connection_type ( "list_all_nodes" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'ListAllNodes' ,
+
ListAllNodesResult ,
+
params ,
+
since = 1.0
+
)
-
**Note**: This method is available only through the per-node API
-
endpoint 5.0 or later.
-
-
:returns: a response
-
:rtype: GetNetworkConfigResult
-
"""
+
[docs] def list_node_stats (
+
self ,):
+
"""
+
ListNodeStats enables you to view the high-level activity measurements for all nodes in a cluster. """
-
params = {}
+
self . _check_connection_type ( "list_node_stats" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'GetNetworkConfig' ,
-
GetNetworkConfigResult ,
+
'ListNodeStats' ,
+
ListNodeStatsResult ,
params ,
+
since = 6.0
)
-
[docs] def set_config (
-
self ,
-
config ,):
+
[docs] def list_pending_active_nodes (
+
self ,):
"""
-
The *set_config* API method is used to set all the configuration
-
information for the node. This includes the same information available
-
via calls to *set_cluster_config* and *set_network_config* in one API
-
method.
-
+
ListPendingActiveNodes returns the list of nodes in the cluster that are currently in the PendingActive state, between the pending and active states. These are nodes that are currently being returned to the factory image. """
+
self . _check_connection_type ( "list_pending_active_nodes" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'ListPendingActiveNodes' ,
+
ListPendingActiveNodesResult ,
+
params ,
+
since = 9.0
+
)
-
**Warning!** Changing the 'bond-mode' on a node can cause a temporary
-
loss of network connectivity. Caution should be taken when using this
-
method.
+
[docs] def list_pending_nodes (
+
self ,):
+
"""
+
ListPendingNodes returns a list of the currently pending nodes in the system. Pending nodes are nodes that are running and configured to join the cluster, but have not yet been added via the AddNodes API method. """
+
self . _check_connection_type ( "list_pending_nodes" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'ListPendingNodes' ,
+
ListPendingNodesResult ,
+
params ,
+
since = 1.0
+
)
+
[docs] def remove_nodes (
+
self ,
+
nodes ,):
+
"""
+
You can use RemoveNodes to remove one or more nodes that should no longer participate in the cluster. Before removing a node, you must remove all drives the node contains using the RemoveDrives method. You cannot remove a node until the RemoveDrives process has completed and all data has been migrated away from the node.
+
After you remove a node, it registers itself as a pending node. You can add the node again or shut it down (shutting the node down removes it from the Pending Node list).
+
:param nodes: [required] List of NodeIDs for the nodes to be removed.
+
:type nodes: int
+
"""
-
**Note**: This method is available only through the per-node API
-
endpoint 5.0 or later.
+
self . _check_connection_type ( "remove_nodes" , "Cluster" )
-
:param config: [required] Objects that you want changed for the cluster
-
interface settings.
-
:type config: Config
+
params = {
+
"nodes" : nodes ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'RemoveNodes' ,
+
RemoveNodesResult ,
+
params ,
+
since = 1.0
+
)
-
:returns: a response
-
:rtype: SetConfigResult
+
[docs] def set_config (
+
self ,
+
config ,):
+
"""
+
The SetConfig API method enables you to set all the configuration information for the node. This includes the same information available via calls to SetClusterConfig and SetNetworkConfig in one API method.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
Caution: Changing the "bond-mode" on a node can cause a temporary loss of network connectivity. Exercise caution when using this method.
+
:param config: [required] Objects that you want changed for the cluster interface settings.
+
:type config: ConfigParams
"""
-
params = {
+
self . _check_connection_type ( "set_config" , "Node" )
+
+
params = {
"config" : config ,
}
-
+
+
# There is no adaptor.
return self . send_request (
'SetConfig' ,
SetConfigResult ,
params ,
+
since = 5.0
)
[docs] def set_network_config (
self ,
network ,):
"""
-
The *\"set_network_config\"* method is used to set the network
-
configuration for a node. To see the states in which these objects can
-
be modified, see *\"network* Object for 1G and 10G Interfaces\" on page
-
109 of the Element API. To display the current network settings for a
-
node, run the *\"get_network_config\"* method.
-
-
-
-
-
**WARNING!** Changing the \"bond-mode\" on a node can cause a temporary
-
loss of network connectivity. Caution should be taken when using this
-
method.
-
-
-
-
-
**Note**: This method is available only through the per-node API
-
endpoint 5.0 or later.
-
-
:param network: [required] Objects that will be changed for the node
-
network settings.
-
:type network: Network
-
-
:returns: a response
-
:rtype: SetNetworkConfigResult
+
The SetNetworkConfig API method enables you to set the network configuration for a node. To display the current network settings for a node, run the GetNetworkConfig API method.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
Changing the "bond-mode" on a node can cause a temporary loss of network connectivity. Exercise caution when using this method.
+
:param network: [required] An object containing node network settings to modify.
+
:type network: NetworkParams
"""
-
params = {
+
self . _check_connection_type ( "set_network_config" , "Node" )
+
+
params = {
"network" : network ,
}
-
+
+
# There is no adaptor.
return self . send_request (
'SetNetworkConfig' ,
SetNetworkConfigResult ,
params ,
+
since = 5.0
)
-
[docs] def get_config (
-
self ,):
+
[docs] def complete_cluster_pairing (
+
self ,
+
cluster_pairing_key ,):
"""
-
The *get_config* API method is used to retrieve all the configuration
-
information for the node. This one API method includes the same
-
information available in both *\"get_cluster_config\"* and
-
*\"get_network_config\"* methods.
-
+
You can use the CompleteClusterPairing method with the encoded key received from the StartClusterPairing method to complete the cluster pairing process. The CompleteClusterPairing method is the second step in the cluster pairing process.
+
:param clusterPairingKey: [required] A string of characters that is returned from the "StartClusterPairing" API method.
+
:type clusterPairingKey: str
+
"""
+
self . _check_connection_type ( "complete_cluster_pairing" , "Cluster" )
+
params = {
+
"clusterPairingKey" : cluster_pairing_key ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'CompleteClusterPairing' ,
+
CompleteClusterPairingResult ,
+
params ,
+
since = 6.0
+
)
-
**Note**: This method is available only through the per-node API
-
endpoint 5.0 or later.
+
[docs] def complete_volume_pairing (
+
self ,
+
volume_pairing_key ,
+
volume_id ,):
+
"""
+
You can use the CompleteVolumePairing method to complete the pairing of two volumes.
+
:param volumePairingKey: [required] The key returned from the StartVolumePairing method.
+
:type volumePairingKey: str
-
:returns: a response
-
:rtype: GetConfigResult
+
:param volumeID: [required] The ID of the volume on which to complete the pairing process.
+
:type volumeID: int
"""
-
params = {}
+
self . _check_connection_type ( "complete_volume_pairing" , "Cluster" )
+
params = {
+
"volumePairingKey" : volume_pairing_key ,
+
"volumeID" : volume_id ,
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'GetConfig' ,
-
GetConfigResult ,
+
'CompleteVolumePairing' ,
+
CompleteVolumePairingResult ,
params ,
+
since = 6.0
)
-
[docs] def get_node_stats (
+
[docs] def list_active_paired_volumes (
self ,
-
node_id ,):
+
start_volume_id = OPTIONAL ,
+
limit = OPTIONAL ,):
"""
-
*get_node_stats* is used to return the high-level activity measurements
-
for a single node.
+
ListActivePairedVolumes enables you to list all the active volumes paired with a volume. This method returns information about volumes with active and pending pairings.
+
:param startVolumeID: The beginning of the range of active paired volumes to return.
+
:type startVolumeID: int
-
:param node_id: [required] Specifies the node for which statistics are
-
gathered.
-
:type node_id: int
-
-
:returns: a response
-
:rtype: GetNodeStatsResult
+
:param limit: Maximum number of active paired volumes to return.
+
:type limit: int
"""
-
params = {
-
"nodeID" : node_id ,
+
self . _check_connection_type ( "list_active_paired_volumes" , "Cluster" )
+
+
params = {
}
+
if start_volume_id is not None :
+
params [ "startVolumeID" ] = start_volume_id
+
if limit is not None :
+
params [ "limit" ] = limit
+
+
# There is no adaptor.
+
return self . send_request (
+
'ListActivePairedVolumes' ,
+
ListActivePairedVolumesResult ,
+
params ,
+
since = 6.0
+
)
-
since = None
-
deprecated = None
+
[docs] def list_cluster_pairs (
+
self ,):
+
"""
+
You can use the ListClusterPairs method to list all the clusters that a cluster is paired with. This method returns information about active and pending cluster pairings, such as statistics about the current pairing as well as the connectivity and latency (in milliseconds) of the cluster pairing. """
-
return ElementServiceAdaptor . get_node_stats ( self , params ,
-
since , deprecated )
+
self . _check_connection_type ( "list_cluster_pairs" , "Cluster" )
+
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'ListClusterPairs' ,
+
ListClusterPairsResult ,
+
params ,
+
since = 6.0
+
)
-
[docs] def list_node_stats (
-
self ,):
+
[docs] def modify_volume_pair (
+
self ,
+
volume_id ,
+
paused_manual = OPTIONAL ,
+
mode = OPTIONAL ,
+
pause_limit = OPTIONAL ,):
"""
-
*list_node_stats* is used to return the high-level activity
-
measurements for all nodes in a cluster.
+
ModifyVolumePair enables you to pause or restart replication between a pair of volumes.
+
:param volumeID: [required] The ID of the volume to be modified.
+
:type volumeID: int
+
+
:param pausedManual: Specifies whether to pause or restart volume replication process. Valid values are: true: Pauses volume replication false: Restarts volume replication
+
:type pausedManual: bool
-
:returns: a response
-
:rtype: ListNodeStatsResult
+
:param mode: Specifies the volume replication mode. Possible values are: Async: Writes are acknowledged when they complete locally. The cluster does not wait for writes to be replicated to the target cluster. Sync: The source acknowledges the write when the data is stored locally and on the remote cluster. SnapshotsOnly: Only snapshots created on the source cluster are replicated. Active writes from the source volume are not replicated.
+
:type mode: str
+
+
:param pauseLimit: Internal use only.
+
:type pauseLimit: int
"""
-
params = {}
+
self . _check_connection_type ( "modify_volume_pair" , "Cluster" )
+
params = {
+
"volumeID" : volume_id ,
+
}
+
if paused_manual is not None :
+
params [ "pausedManual" ] = paused_manual
+
if mode is not None :
+
params [ "mode" ] = mode
+
if pause_limit is not None :
+
params [ "pauseLimit" ] = pause_limit
+
+
# There is no adaptor.
return self . send_request (
-
'ListNodeStats' ,
-
ListNodeStatsResult ,
+
'ModifyVolumePair' ,
+
ModifyVolumePairResult ,
params ,
+
since = 6.0
)
-
[docs] def list_cluster_pairs (
-
self ,):
+
[docs] def remove_cluster_pair (
+
self ,
+
cluster_pair_id ,):
"""
-
*list_cluster_pairs* is used to list all of the clusters a cluster is
-
paired with.
-
This method returns information about active and pending cluster
-
pairings, such as statistics about the current pairing as well as the
-
connectivity and latency (in milliseconds) of the cluster pairing.
-
-
:returns: a response
-
:rtype: ListClusterPairsResult
+
You can use the RemoveClusterPair method to close the open connections between two paired clusters.
+
Note: Before you remove a cluster pair, you must first remove all volume pairing to the clusters with the "RemoveVolumePair" API method.
+
:param clusterPairID: [required] Unique identifier used to pair two clusters.
+
:type clusterPairID: int
"""
-
params = {}
+
self . _check_connection_type ( "remove_cluster_pair" , "Cluster" )
+
params = {
+
"clusterPairID" : cluster_pair_id ,
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'ListClusterPairs' ,
-
ListClusterPairsResult ,
+
'RemoveClusterPair' ,
+
RemoveClusterPairResult ,
params ,
+
since = 6.0
)
-
[docs] def list_active_paired_volumes (
-
self ,):
+
[docs] def remove_volume_pair (
+
self ,
+
volume_id ,):
"""
-
*list_active_paired_volumes* is used to list all of the active volumes
-
paired with a volume.
-
Volumes listed in the return for this method include volumes with
-
active and pending pairings.
-
-
:returns: a response
-
:rtype: ListActivePairedVolumesResult
+
RemoveVolumePair enables you to remove the remote pairing between two volumes. Use this method on both the source and target volumes that are paired together. When you remove the volume pairing information, data is no longer replicated to or from the volume.
+
:param volumeID: [required] The ID of the volume on which to stop the replication process.
+
:type volumeID: int
"""
-
params = {}
+
self . _check_connection_type ( "remove_volume_pair" , "Cluster" )
+
params = {
+
"volumeID" : volume_id ,
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'ListActivePairedVolumes' ,
-
ListActivePairedVolumesResult ,
+
'RemoveVolumePair' ,
+
RemoveVolumePairResult ,
params ,
+
since = 6.0
)
[docs] def start_cluster_pairing (
self ,):
"""
-
*start_cluster_pairing* is used to create an encoded key from a cluster
-
that is used to pair with another cluster.
-
The key created from this API method is used in the
-
*\"complete_cluster_pairing\"* API method to establish a cluster
-
pairing.
-
You can pair a cluster with a maximum of four other SolidFire clusters.
-
-
:returns: a response
-
:rtype: StartClusterPairingResult
-
"""
+
You can use the StartClusterPairing method to create an encoded key from a cluster that is used to pair with another cluster. The key created from this API method is used in the CompleteClusterPairing API method to establish a cluster pairing. You can pair a cluster with a maximum of four other clusters. """
-
params = {}
+
self . _check_connection_type ( "start_cluster_pairing" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
'StartClusterPairing' ,
StartClusterPairingResult ,
params ,
+
since = 6.0
)
[docs] def start_volume_pairing (
@@ -2760,541 +2891,458 @@
Source code for solidfire
volume_id ,
mode = OPTIONAL ,):
"""
- *start_volume_pairing* is used to create an encoded key from a volume
- that is used to pair with another volume.
- The key that this method creates is used in the
- *\"complete_volume_pairing\"* API method to establish a volume pairing.
-
- :param volume_id: [required] The ID of the volume on which to start the
- pairing process.
- :type volume_id: int
-
- :param mode: (optional) The mode of the volume on which to start the
- pairing process. The mode can only be set if the volume is the
- source volume.
-
- Possible values:
-
- **Async**: (default if no mode parameter specified) Writes are
- acknowledged when they complete locally. The cluster does not wait
- for writes to be replicated to the target cluster.
-
- **Sync**: Source acknowledges write when the data is stored locally
- and on the remote cluster.
-
- **SnapshotsOnly**: Only snapshots created on the source cluster
- will be replicated. Active writes from the source volume will not
- be replicated.
-
-
+ StartVolumePairing enables you to create an encoded key from a volume that is used to pair with another volume. The key that this
+ method creates is used in the CompleteVolumePairing API method to establish a volume pairing.
+ :param volumeID: [required] The ID of the volume on which to start the pairing process.
+ :type volumeID: int
+ :param mode: The mode of the volume on which to start the pairing process. The mode can only be set if the volume is the source volume. Possible values are: Async: (default if no mode parameter specified) Writes are acknowledged when they complete locally. The cluster does not wait for writes to be replicated to the target cluster. Sync: Source acknowledges write when the data is stored locally and on the remote cluster. SnapshotsOnly: Only snapshots created on the source cluster will be replicated. Active writes from the source volume are not replicated.
:type mode: str
-
- :returns: a response
- :rtype: StartVolumePairingResult
"""
- params = {
+ self . _check_connection_type ( "start_volume_pairing" , "Cluster" )
+
+ params = {
"volumeID" : volume_id ,
}
if mode is not None :
- params [ "mode" ] = mode
-
+ if self . api_version < 8.0 :
+ raise ApiParameterVersionError ( "start_volume_pairing" , 8.0 ,
+ [( "mode" , mode , 8.0 , False )])
+ else :
+ params [ "mode" ] = mode
+
+ # There is no adaptor.
return self . send_request (
'StartVolumePairing' ,
StartVolumePairingResult ,
params ,
+ since = 6.0
)
-
[docs] def complete_cluster_pairing (
+
[docs] def reset_node (
self ,
-
cluster_pairing_key ,):
+
build ,
+
force ,):
"""
-
The *complete_cluster_pairing* method is the second step in the cluster
-
pairing process.
-
Use this method with the encoded key received from the
-
*\"start_cluster_pairing\"* API method to complete the cluster pairing
-
process.
-
-
:param cluster_pairing_key: [required] A string of characters that is
-
returned from the \"StartClusterPairing\" API method.
-
:type cluster_pairing_key: str
-
-
:returns: a response
-
:rtype: CompleteClusterPairingResult
+
The ResetNode API method enables you to reset a node to the factory settings. All data, packages (software upgrades, and so on),
+
configurations, and log files are deleted from the node when you call this method. However, network settings for the node are
+
preserved during this operation. Nodes that are participating in a cluster cannot be reset to the factory settings.
+
The ResetNode API can only be used on nodes that are in an "Available" state. It cannot be used on nodes that are "Active" in a
+
cluster, or in a "Pending" state.
+
Caution: This method clears any data that is on the node. Exercise caution when using this method.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
:param build: [required] Specifies the URL to a remote Element software image to which the node will be reset.
+
:type build: str
+
+
:param force: [required] Required parameter to successfully reset the node.
+
:type force: bool
"""
-
params = {
-
"clusterPairingKey" : cluster_pairing_key ,
-
}
+
self . _check_connection_type ( "reset_node" , "Node" )
+
params = {
+
"build" : build ,
+
"force" : force ,
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'CompleteClusterPairing' ,
-
CompleteClusterPairingResult ,
+
'ResetNode' ,
+
ResetNodeResult ,
params ,
+
since = 5.0
)
-
[docs] def complete_volume_pairing (
+
[docs] def restart_networking (
self ,
-
volume_pairing_key ,
-
volume_id ,):
+
force ,):
"""
-
*complete_volume_pairing* is used to complete the pairing of two
-
volumes.
-
-
:param volume_pairing_key: [required] The key returned from the
-
\"StartVolumePairing\" API method.
-
:type volume_pairing_key: str
-
-
:param volume_id: [required] The ID of volume on which to complete the
-
pairing process.
-
:type volume_id: int
-
-
:returns: a response
-
:rtype: CompleteVolumePairingResult
+
The RestartNetworking API method enables you to restart the networking services on a node.
+
Warning: This method restarts all networking services on a node, causing temporary loss of networking connectivity.
+
Exercise caution when using this method.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
:param force: [required] Required parameter to successfully reset the node.
+
:type force: bool
"""
-
params = {
-
"volumePairingKey" : volume_pairing_key ,
-
"volumeID" : volume_id ,
-
}
+
self . _check_connection_type ( "restart_networking" , "Node" )
+
params = {
+
"force" : force ,
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'CompleteVolumePairing' ,
-
CompleteVolumePairingResult ,
+
'RestartNetworking' ,
+
dict ,
params ,
+
since = 5.0
)
-
[docs] def remove_cluster_pair (
+
[docs] def shutdown (
self ,
-
cluster_pair_id ,):
+
nodes ,
+
option = OPTIONAL ,):
"""
-
You can use the *remove_cluster_pair* method to close the open
-
connections between two paired clusters.
-
+
The Shutdown API method enables you to restart or shutdown a node that has not yet been added to a cluster. To use this method,
+
log in to the MIP for the pending node, and enter the "shutdown" method with either the "restart" or "halt" options.
+
:param nodes: [required] List of NodeIDs for the nodes to be shutdown.
+
:type nodes: int
-
-
**Note**: Before you remove a cluster pair, you must first remove all
-
volume pairing to the clusters with the *\"remove_volume_pair\"* API
-
method.
-
-
:param cluster_pair_id: [required] Unique identifier used to pair two
-
clusters.
-
:type cluster_pair_id: int
-
-
:returns: a response
-
:rtype: RemoveClusterPairResult
+
:param option: Specifies the action to take for the node shutdown. Possible values are: restart: Restarts the node. halt: Shuts down the node.
+
:type option: str
"""
-
params = {
-
"clusterPairID" : cluster_pair_id ,
-
}
+
self . _check_connection_type ( "shutdown" , "Cluster" )
+
params = {
+
"nodes" : nodes ,
+
}
+
if option is not None :
+
params [ "option" ] = option
+
+
# There is no adaptor.
return self . send_request (
-
'RemoveClusterPair' ,
-
RemoveClusterPairResult ,
+
'Shutdown' ,
+
ShutdownResult ,
params ,
+
since = 1.0
)
-
[docs] def remove_volume_pair (
+
[docs] def create_schedule (
self ,
-
volume_id ,):
+
schedule ,):
"""
-
*remove_volume_pair* is used to remove the remote pairing between two
-
volumes.
-
When the volume pairing information is removed, data is no longer
-
replicated to or from the volume.
-
This method should be run on both the source and target volumes that
-
are paired together.
-
-
:param volume_id: [required] ID of the volume on which to stop the
-
replication process.
-
:type volume_id: int
-
-
:returns: a response
-
:rtype: RemoveVolumePairResult
+
CreateSchedule enables you to schedule an automatic snapshot of a volume at a defined interval.
+
You can use the created snapshot later as a backup or rollback to ensure the data on a volume or group of volumes is consistent for
+
the point in time in which the snapshot was created.
+
If you schedule a snapshot to run at a time period that is not divisible by 5 minutes, the snapshot runs at the next time period
+
that is divisible by 5 minutes. For example, if you schedule a snapshot to run at 12:42:00 UTC, it runs at 12:45:00 UTC.
+
Note: You can create snapshots if cluster fullness is at stage 1, 2 or 3. You cannot create snapshots after cluster fullness reaches stage 4 or 5.
+
:param schedule: [required] The "Schedule" object will be used to create a new schedule. Do not set ScheduleID property, it will be ignored. Frequency property must be of type that inherits from Frequency. Valid types are: DaysOfMonthFrequency DaysOrWeekFrequency TimeIntervalFrequency
+
:type schedule: Schedule
"""
-
params = {
-
"volumeID" : volume_id ,
+
self . _check_connection_type ( "create_schedule" , "Cluster" )
+
+
params = {
+
"schedule" : schedule ,
}
+
+
# There is an adaptor!
+
since = 8.0
+
deprecated = None
-
return self . send_request (
-
'RemoveVolumePair' ,
-
RemoveVolumePairResult ,
-
params ,
-
)
+
return ElementServiceAdaptor . create_schedule ( self , params ,
+
since , deprecated )
-
[docs] def modify_volume_pair (
+
[docs] def get_schedule (
self ,
-
volume_id ,
-
paused_manual = OPTIONAL ,
-
mode = OPTIONAL ,):
+
schedule_id ,):
"""
-
*modify_volume_pair* is used to pause or restart replication between a
-
pair of volumes.
-
-
:param volume_id: [required] Identification number of the volume to be
-
modified.
-
:type volume_id: int
-
-
:param paused_manual: (optional) Valid values that can be entered:
-
-
**true**: to pause volume replication.
-
-
**false**: to restart volume replication.
-
-
If no value is specified, no change in replication is performed.
-
-
:type paused_manual: bool
-
-
:param mode: (optional) Volume replication mode.
-
-
Possible values:
-
-
**Async**: Writes are acknowledged when they complete locally. The
-
cluster does not wait for writes to be replicated to the target
-
cluster.
-
-
**Sync**: The source acknowledges the write when the data is stored
-
locally and on the remote cluster.
+
You can use the GetSchedule method to retrieve information about a scheduled snapshot. You can see information about a specific
+
schedule if there are many snapshot schedules in the system. You also retrieve information about more than one schedule with this
+
method by specifying additional scheduleIDs in the parameter.
+
:param scheduleID: [required] Specifies the unique ID of the schedule or multiple schedules to display.
+
:type scheduleID: int
+
"""
-
**SnapshotsOnly**: Only snapshots created on the source cluster
-
will be replicated. Active writes from the source volume are not
-
replicated.
+
self . _check_connection_type ( "get_schedule" , "Cluster" )
+
params = {
+
"scheduleID" : schedule_id ,
+
}
+
+
# There is an adaptor!
+
since = 8.0
+
deprecated = None
+
return ElementServiceAdaptor . get_schedule ( self , params ,
+
since , deprecated )
-
:type mode: str
+
[docs] def list_schedules (
+
self ,):
+
"""
+
ListSchedule enables you to retrieve information about all scheduled snapshots that have been created. """
-
:returns: a response
-
:rtype: ModifyVolumePairResult
-
"""
+
self . _check_connection_type ( "list_schedules" , "Cluster" )
-
params = {
-
"volumeID" : volume_id ,
+
params = {
}
-
if paused_manual is not None :
-
params [ "pausedManual" ] = paused_manual
-
if mode is not None :
-
params [ "mode" ] = mode
+
+
# There is an adaptor!
+
since = 8.0
+
deprecated = None
-
return self . send_request (
-
'ModifyVolumePair' ,
-
ModifyVolumePairResult ,
-
params ,
-
)
+
return ElementServiceAdaptor . list_schedules ( self , params ,
+
since , deprecated )
-
[docs] def create_snapshot (
+
[docs] def modify_schedule (
self ,
-
volume_id ,
-
snapshot_id = OPTIONAL ,
-
name = OPTIONAL ,
-
enable_remote_replication = OPTIONAL ,
-
retention = OPTIONAL ,
-
attributes = OPTIONAL ,):
+
schedule ,):
"""
-
*create_snapshot* is used to create a point-in-time copy of a volume.
-
A snapshot can be created from any volume or from an existing snapshot.
-
-
-
-
-
**Note**: Creating a snapshot is allowed if cluster fullness is at
-
stage 2 or 3.
-
Snapshots are not created when cluster fullness is at stage 4 or 5.
-
-
:param volume_id: [required] ID of the volume image from which to copy.
-
:type volume_id: int
-
-
:param snapshot_id: (optional) Unique ID of a snapshot from which the
-
new snapshot is made. The *snapshot_id* passed must be a snapshot
-
on the given volume. If a *snapshot_id* is not provided, a snapshot
-
is created from the volume's active branch.
-
:type snapshot_id: int
-
-
:param name: (optional) A name for the snapshot. If no name is
-
provided, the date and time the snapshot was taken is used.
-
:type name: str
+
ModifySchedule enables you to change the intervals at which a scheduled snapshot occurs. This allows for adjustment to the snapshot frequency and retention.
+
:param schedule: [required] The "Schedule" object will be used to modify an existing schedule. The ScheduleID property is required. Frequency property must be of type that inherits from Frequency. Valid types are: DaysOfMonthFrequency DaysOrWeekFrequency TimeIntervalFrequency
+
:type schedule: Schedule
+
"""
-
:param enable_remote_replication: (optional) Identifies if snapshot is
-
enabled for remote replication.
-
:type enable_remote_replication: bool
+
self . _check_connection_type ( "modify_schedule" , "Cluster" )
-
:param retention: (optional) The amount of time the snapshot will be
-
retained. Enter in *hh:mm:ss*
-
:type retention: str
+
params = {
+
"schedule" : schedule ,
+
}
+
+
# There is an adaptor!
+
since = 8.0
+
deprecated = None
-
:param attributes: (optional) List of Name/Value pairs in JSON object
-
format.
-
:type attributes: dict
+
return ElementServiceAdaptor . modify_schedule ( self , params ,
+
since , deprecated )
-
:returns: a response
-
:rtype: CreateSnapshotResult
+
[docs] def get_ipmi_config (
+
self ,
+
chassis_type = OPTIONAL ,):
+
"""
+
GetIpmiConfig enables you to retrieve hardware sensor information from sensors that are in your node.
+
:param chassisType: Displays information for each node chassis type. Valid values are: all: Returns sensor information for each chassis type. {chassis type}: Returns sensor information for a specified chassis type.
+
:type chassisType: str
"""
-
params = {
-
"volumeID" : volume_id ,
-
}
-
self . _check_param_versions (
-
'create_snapshot' ,
-
[
-
( "enable_remote_replication" ,
-
enable_remote_replication , 8.0 , None ),
-
( "retention" ,
-
retention , 8.0 , None ),
-
]
-
)
-
if snapshot_id is not None :
-
params [ "snapshotID" ] = snapshot_id
-
if name is not None :
-
params [ "name" ] = name
-
if enable_remote_replication is not None :
-
params [ "enableRemoteReplication" ] = enable_remote_replication
-
if retention is not None :
-
params [ "retention" ] = retention
-
if attributes is not None :
-
params [ "attributes" ] = attributes
+
self . _check_connection_type ( "get_ipmi_config" , "Cluster" )
+
params = {
+
}
+
if chassis_type is not None :
+
params [ "chassisType" ] = chassis_type
+
+
# There is no adaptor.
return self . send_request (
-
'CreateSnapshot' ,
-
CreateSnapshotResult ,
+
'GetIpmiConfig' ,
+
GetIpmiConfigResult ,
params ,
+
since = 9.0
)
-
[docs] def delete_snapshot (
-
self ,
-
snapshot_id ,):
+
[docs] def get_ipmi_info (
+
self ,):
"""
-
*delete_snapshot* is used to delete a snapshot.
-
A snapshot that is currently the \"active\" snapshot cannot be deleted.
-
You must rollback and make another snapshot \"active\" before the
-
current snapshot can be deleted.
-
To rollback a snapshot, use RollbackToSnapshot.
-
-
:param snapshot_id: [required] The ID of the snapshot to delete.
-
:type snapshot_id: int
+
GetIpmiInfo enables you to display a detailed reporting of sensors (objects) for node fans, intake and exhaust temperatures, and power supplies that are monitored by the system. """
-
:returns: a response
-
:rtype: DeleteSnapshotResult
-
"""
+
self . _check_connection_type ( "get_ipmi_info" , "Cluster" )
-
params = {
-
"snapshotID" : snapshot_id ,
+
params = {
}
-
+
+
# There is no adaptor.
return self . send_request (
-
'DeleteSnapshot' ,
-
DeleteSnapshotResult ,
+
'GetIpmiInfo' ,
+
GetIpmiInfoResult ,
params ,
+
since = 9.0
)
-
[docs] def list_snapshots (
-
self ,
-
volume_id = OPTIONAL ,):
+
[docs] def list_services (
+
self ,):
"""
-
*list_snapshots* is used to return the attributes of each snapshot
-
taken on the volume.
-
-
:param volume_id: (optional) The volume to list snapshots for. If not
-
provided, all snapshots for all volumes are returned.
-
:type volume_id: int
-
-
:returns: a response
-
:rtype: ListSnapshotsResult
-
"""
+
You can use ListServices to return the services information for nodes, drives, current software, and other services that are running on the cluster. """
-
params = {}
-
if volume_id is not None :
-
params [ "volumeID" ] = volume_id
+
self . _check_connection_type ( "list_services" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'ListSnapshots' ,
-
ListSnapshotsResult ,
+
'ListServices' ,
+
ListServicesResult ,
params ,
+
since = 1.0
)
-
[docs] def modify_snapshot (
+
[docs] def restart_services (
self ,
-
snapshot_id ,
-
expiration_time = OPTIONAL ,
-
enable_remote_replication = OPTIONAL ,):
+
force ,
+
service = OPTIONAL ,
+
action = OPTIONAL ,):
"""
-
*modify_snapshot* is used to change the attributes currently assigned
-
to a snapshot.
-
Use this API method to enable the snapshots created on the Read/Write
-
(source) volume to be remotely replicated to a target SolidFire storage
-
system.
-
-
:param snapshot_id: [required] ID of the snapshot.
-
:type snapshot_id: int
-
-
:param expiration_time: (optional) Use to set the time when the
-
snapshot should be removed.
-
:type expiration_time: str
-
-
:param enable_remote_replication: (optional) Use to enable the snapshot
-
created to be replicated to a remote SolidFire cluster. Possible
-
values:
-
-
**true**: the snapshot will be replicated to remote storage.
-
-
**false**: Default. No replication.
+
The RestartServices API method enables you to restart the services on a node.
+
Caution: This method causes temporary node services interruption. Exercise caution when using this method.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
:param force: [required] Required parameter to successfully restart services on a node.
+
:type force: bool
-
:type enable_remote_replication: bool
+
:param service: Service name to be restarted.
+
:type service: str
-
:returns: a response
-
:rtype: ModifySnapshotResult
+
:param action: Action to perform on the service (start, stop, restart).
+
:type action: str
"""
-
params = {
-
"snapshotID" : snapshot_id ,
-
}
-
if expiration_time is not None :
-
params [ "expirationTime" ] = expiration_time
-
if enable_remote_replication is not None :
-
params [ "enableRemoteReplication" ] = enable_remote_replication
-
+
self . _check_connection_type ( "restart_services" , "Node" )
+
+
params = {
+
"force" : force ,
+
}
+
if service is not None :
+
params [ "service" ] = service
+
if action is not None :
+
params [ "action" ] = action
+
+
# There is no adaptor.
return self . send_request (
-
'ModifySnapshot' ,
-
ModifySnapshotResult ,
+
'RestartServices' ,
+
dict ,
params ,
-
since = 8.0 ,
+
since = 5.0
)
-
[docs] def rollback_to_snapshot (
+
[docs] def invoke_sfapi (
self ,
-
volume_id ,
-
snapshot_id ,
-
save_current_state ,
-
name = OPTIONAL ,
-
attributes = OPTIONAL ,):
+
method ,
+
parameters = OPTIONAL ,):
"""
-
*rollback_to_snapshot* is used to make an existing snapshot the
-
\"active\" volume image. This method creates a new
-
snapshot from an existing snapshot. The new snapshot becomes \"active\"
-
and the existing snapshot is preserved until
-
it is manually deleted. The previously \"active\" snapshot is deleted
-
unless the parameter *save_current_state* is set with
-
a value of \"true.\"
-
**Note**: Creating a snapshot is allowed if cluster fullness is at
-
stage 2 or 3.
-
Snapshots are not created when cluster fullness is at stage 4 or 5.
+
This will invoke any API method supported by the SolidFire API for the version and port the connection is using.
+
Returns a nested hashtable of key/value pairs that contain the result of the invoked method.
+
:param method: [required] The name of the method to invoke. This is case sensitive.
+
:type method: str
-
:param volume_id: [required] *volume_id* for the volume.
-
:type volume_id: int
-
-
:param snapshot_id: [required] ID of a previously created snapshot on
-
the given volume.
-
:type snapshot_id: int
+
:param parameters: An object, normally a dictionary or hashtable of the key/value pairs, to be passed as the params for the method being invoked.
+
:type parameters: str
+
"""
-
:param save_current_state: [required]
+
self . _check_connection_type ( "invoke_sfapi" , "Both" )
-
**true**: The previous active volume image is kept.
+
params = {
+
"method" : method ,
+
}
+
if parameters is not None :
+
params [ "parameters" ] = parameters
+
+
# There is an adaptor!
+
since = 1.0
+
deprecated = None
-
**false**: (default) The previous active volume image is deleted.
+
return ElementServiceAdaptor . invoke_sfapi ( self , params ,
+
since , deprecated )
-
:type save_current_state: bool
+
[docs] def create_group_snapshot (
+
self ,
+
volumes ,
+
name = OPTIONAL ,
+
enable_remote_replication = OPTIONAL ,
+
retention = OPTIONAL ,
+
attributes = OPTIONAL ,):
+
"""
+
CreateGroupSnapshot enables you to create a point-in-time copy of a group of volumes. You can use this snapshot later as a backup or rollback to ensure the data on the group of volumes is consistent for the point in time that you created the snapshot.
+
Note: Creating a group snapshot is allowed if cluster fullness is at stage 2 or 3. Snapshots are not created when cluster fullness is at stage 4 or 5.
+
:param volumes: [required] Unique ID of the volume image from which to copy.
+
:type volumes: int
-
:param name: (optional) Name for the snapshot. If no name is given,
-
then the name of the snapshot being rolled back to is used with
-
\"-copy\" appended to the end of the name.
+
:param name: Name for the group snapshot. If unspecified, the date and time the group snapshot was taken is used.
:type name: str
-
:param attributes: (optional) List of Name/Value pairs in JSON object
-
format
-
:type attributes: dict
+
:param enableRemoteReplication: Replicates the snapshot created to remote storage. Possible values are: true: The snapshot is replicated to remote storage. false: Default. The snapshot is not replicated.
+
:type enableRemoteReplication: bool
+
+
:param retention: Specifies the amount of time for which the snapshots are retained. The format is HH:mm:ss.
+
:type retention: str
-
:returns: a response
-
:rtype: CreateSnapshotResult
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
"""
-
params = {
-
"volumeID" : volume_id ,
-
"snapshotID" : snapshot_id ,
-
"saveCurrentState" : save_current_state ,
+
self . _check_connection_type ( "create_group_snapshot" , "Cluster" )
+
+
params = {
+
"volumes" : volumes ,
}
if name is not None :
params [ "name" ] = name
+
if enable_remote_replication is not None :
+
if self . api_version < 8.0 :
+
raise ApiParameterVersionError ( "create_group_snapshot" , 8.0 ,
+
[( "enable_remote_replication" , enable_remote_replication , 8.0 , False )])
+
else :
+
params [ "enableRemoteReplication" ] = enable_remote_replication
+
if retention is not None :
+
if self . api_version < 8.0 :
+
raise ApiParameterVersionError ( "create_group_snapshot" , 8.0 ,
+
[( "retention" , retention , 8.0 , False )])
+
else :
+
params [ "retention" ] = retention
if attributes is not None :
params [ "attributes" ] = attributes
-
+
+
# There is no adaptor.
return self . send_request (
-
'RollbackToSnapshot' ,
-
CreateSnapshotResult ,
+
'CreateGroupSnapshot' ,
+
CreateGroupSnapshotResult ,
params ,
+
since = 7.0
)
-
[docs] def create_group_snapshot (
+
[docs] def create_snapshot (
self ,
-
volumes ,
+
volume_id ,
+
snapshot_id = OPTIONAL ,
name = OPTIONAL ,
enable_remote_replication = OPTIONAL ,
retention = OPTIONAL ,
attributes = OPTIONAL ,):
"""
-
*create_group_snapshot* is used to create a point-in-time copy of a
-
group of volumes.
-
The snapshot created can then be used later as a backup or rollback to
-
ensure the data on the group of volumes is consistent for the point in
-
time in which the snapshot was created.
+
CreateSnapshot enables you to create a point-in-time copy of a volume. You can create a snapshot from any volume or from an existing snapshot. If you do not provide a SnapshotID with this API method, a snapshot is created from the volume's active branch.
+
If the volume from which the snapshot is created is being replicated to a remote cluster, the snapshot can also be replicated to the same target. Use the enableRemoteReplication parameter to enable snapshot replication.
+
Note: Creating a snapshot is allowed if cluster fullness is at stage 2 or 3. Snapshots are not created when cluster fullness is at stage 4 or 5.
+
:param volumeID: [required] Specifies the unique ID of the volume image from which to copy.
+
:type volumeID: int
+
:param snapshotID: Specifies the unique ID of a snapshot from which the new snapshot is made. The snapshotID passed must be a snapshot on the given volume.
+
:type snapshotID: int
-
-
-
**Note**: Creating a group snapshot is allowed if cluster fullness is
-
at stage 2 or 3.
-
Snapshots are not created when cluster fullness is at stage 4 or 5.
-
-
:param volumes: [required] Unique ID of the volume image from which to
-
copy.
-
:type volumes: int[]
-
-
:param name: (optional) A name for the snapshot. If no name is
-
provided, the date and time the snapshot was taken is used.
+
:param name: Specifies a name for the snapshot. If unspecified, the date and time the snapshot was taken is used.
:type name: str
-
:param enable_remote_replication: (optional) Identifies if snapshot is
-
enabled for remote replication.
-
:type enable_remote_replication: bool
+
:param enableRemoteReplication: Replicates the snapshot created to a remote cluster. Possible values are: true: The snapshot is replicated to remote storage. false: Default. The snapshot is not replicated.
+
:type enableRemoteReplication: bool
-
:param retention: (optional) The amount of time the snapshot will be
-
retained. Enter in *hh:mm:ss*
+
:param retention: Specifies the amount of time for which the snapshot is retained. The format is HH:mm:ss.
:type retention: str
-
:param attributes: (optional) List of Name/Value pairs in JSON object
-
format.
+
:param attributes: List of name-value pairs in JSON object format.
:type attributes: dict
-
-
:returns: a response
-
:rtype: CreateGroupSnapshotResult
"""
-
params = {
-
"volumes" : volumes ,
+
self . _check_connection_type ( "create_snapshot" , "Cluster" )
+
+
params = {
+
"volumeID" : volume_id ,
}
-
self . _check_param_versions (
-
'create_group_snapshot' ,
-
[
-
( "enable_remote_replication" ,
-
enable_remote_replication , 8.0 , None ),
-
( "retention" ,
-
retention , 8.0 , None ),
-
]
-
)
+
if snapshot_id is not None :
+
params [ "snapshotID" ] = snapshot_id
if name is not None :
params [ "name" ] = name
if enable_remote_replication is not None :
-
params [ "enableRemoteReplication" ] = enable_remote_replication
+
if self . api_version < 8.0 :
+
raise ApiParameterVersionError ( "create_snapshot" , 8.0 ,
+
[( "enable_remote_replication" , enable_remote_replication , 8.0 , False )])
+
else :
+
params [ "enableRemoteReplication" ] = enable_remote_replication
if retention is not None :
-
params [ "retention" ] = retention
+
if self . api_version < 8.0 :
+
raise ApiParameterVersionError ( "create_snapshot" , 8.0 ,
+
[( "retention" , retention , 8.0 , False )])
+
else :
+
params [ "retention" ] = retention
if attributes is not None :
params [ "attributes" ] = attributes
-
+
+
# There is no adaptor.
return self . send_request (
-
'CreateGroupSnapshot' ,
-
CreateGroupSnapshotResult ,
+
'CreateSnapshot' ,
+
CreateSnapshotResult ,
params ,
+
since = 6.0
)
[docs] def delete_group_snapshot (
@@ -3302,62 +3350,115 @@
Source code for solidfire
group_snapshot_id ,
save_members ,):
"""
- *delete_group_snapshot* is used to delete a group snapshot.
- The *save_members* parameter can be used to preserve all the snapshots
- that
- were made for the volumes in the group but the group association will
- be removed.
-
- :param group_snapshot_id: [required] Unique ID of the group snapshot.
- :type group_snapshot_id: int
-
- :param save_members: [required]
-
- **true**: Snapshots are kept, but group association is removed.
+ DeleteGroupSnapshot enables you to delete a group snapshot. You can use the saveMembers parameter to preserve all the snapshots that were made for the volumes in the group, but the group association is removed.
+ :param groupSnapshotID: [required] Specifies the unique ID of the group snapshot.
+ :type groupSnapshotID: int
- **false**: The group and snapshots are deleted.
-
- :type save_members: bool
-
- :returns: a response
- :rtype: DeleteGroupSnapshotResult
+ :param saveMembers: [required] Specifies whether to preserve snapshots or delete them. Valid values are: true: Snapshots are preserved, but group association is removed. false: The group and snapshots are deleted.
+ :type saveMembers: bool
"""
- params = {
+ self . _check_connection_type ( "delete_group_snapshot" , "Cluster" )
+
+ params = {
"groupSnapshotID" : group_snapshot_id ,
"saveMembers" : save_members ,
}
-
+
+ # There is no adaptor.
return self . send_request (
'DeleteGroupSnapshot' ,
DeleteGroupSnapshotResult ,
params ,
+ since = 7.0
)
-
[docs] def list_group_snapshots (
+
[docs] def delete_snapshot (
self ,
-
volume_id = OPTIONAL ,):
+
snapshot_id ,):
"""
-
*list_group_snapshots* is used to return information about all group
-
snapshots that have been created.
+
DeleteSnapshot enables you to delete a snapshot. A snapshot that is currently the "active" snapshot cannot be deleted. You must
+
rollback and make another snapshot "active" before the current snapshot can be deleted. For more details on rolling back snapshots, see RollbackToSnapshot.
+
:param snapshotID: [required] The ID of the snapshot to be deleted.
+
:type snapshotID: int
+
"""
+
+
self . _check_connection_type ( "delete_snapshot" , "Cluster" )
+
+
params = {
+
"snapshotID" : snapshot_id ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'DeleteSnapshot' ,
+
DeleteSnapshotResult ,
+
params ,
+
since = 6.0
+
)
-
:param volume_id: (optional) An array of unique volume *ids* to query.
-
If this parameter is not specified, all group snapshots on the
-
cluster will be included.
-
:type volume_id: int
+
[docs] def list_group_snapshots (
+
self ,
+
volumes = OPTIONAL ,
+
group_snapshot_id = OPTIONAL ,):
+
"""
+
ListGroupSnapshots enables you to get information about all group snapshots that have been created.
+
:param volumes: An array of unique volume IDs to query. If you do not specify this parameter, all group snapshots on the cluster are included.
+
:type volumes: int
-
:returns: a response
-
:rtype: ListGroupSnapshotsResult
+
:param groupSnapshotID: Retrieves information for a specific group snapshot ID.
+
:type groupSnapshotID: int
"""
-
params = {}
-
if volume_id is not None :
-
params [ "volumeID" ] = volume_id
+
self . _check_connection_type ( "list_group_snapshots" , "Cluster" )
+
params = {
+
}
+
if volumes is not None :
+
params [ "volumes" ] = volumes
+
if group_snapshot_id is not None :
+
if self . api_version < 9.0 :
+
raise ApiParameterVersionError ( "list_group_snapshots" , 9.0 ,
+
[( "group_snapshot_id" , group_snapshot_id , 9.0 , False )])
+
else :
+
params [ "groupSnapshotID" ] = group_snapshot_id
+
+
# There is no adaptor.
return self . send_request (
'ListGroupSnapshots' ,
ListGroupSnapshotsResult ,
params ,
+
since = 7.0
+
)
+
+
[docs] def list_snapshots (
+
self ,
+
volume_id = OPTIONAL ,
+
snapshot_id = OPTIONAL ,):
+
"""
+
ListSnapshots enables you to return the attributes of each snapshot taken on the volume. Information about snapshots that reside on the target cluster is displayed on the source cluster when this method is called from the source cluster.
+
:param volumeID: Retrieves snapshots for a volume. If volumeID is not provided, all snapshots for all volumes are returned.
+
:type volumeID: int
+
+
:param snapshotID: Retrieves information for a specific snapshot ID.
+
:type snapshotID: int
+
"""
+
+
self . _check_connection_type ( "list_snapshots" , "Cluster" )
+
+
params = {
+
}
+
if volume_id is not None :
+
params [ "volumeID" ] = volume_id
+
if snapshot_id is not None :
+
params [ "snapshotID" ] = snapshot_id
+
+
# There is no adaptor.
+
return self . send_request (
+
'ListSnapshots' ,
+
ListSnapshotsResult ,
+
params ,
+
since = 6.0
)
[docs] def modify_group_snapshot (
@@ -3366,43 +3467,69 @@
Source code for solidfire
expiration_time = OPTIONAL ,
enable_remote_replication = OPTIONAL ,):
"""
- *modify_group_snapshot* is used to change the attributes currently
- assigned to a group snapshot.
+ ModifyGroupSnapshot enables you to change the attributes of a group of snapshots. You can also use this method to enable snapshots created on the Read/Write (source) volume to be remotely replicated to a target SolidFire storage system.
+ :param groupSnapshotID: [required] Specifies the ID of the group of snapshots.
+ :type groupSnapshotID: int
- :param group_snapshot_id: [required] ID of the snapshot.
- :type group_snapshot_id: int
+ :param expirationTime: Sets the time when the snapshot should be removed. If unspecified, the current time is used.
+ :type expirationTime: str
- :param expiration_time: (optional) Use to set the time when the
- snapshot should be removed.
- :type expiration_time: str
+ :param enableRemoteReplication: Replicates the snapshot created to a remote cluster. Possible values are: true: The snapshot is replicated to remote storage. false: Default. The snapshot is not replicated.
+ :type enableRemoteReplication: bool
+ """
- :param enable_remote_replication: (optional) Use to enable the snapshot
- created to be replicated to a remote SolidFire cluster. Possible
- values:
+ self . _check_connection_type ( "modify_group_snapshot" , "Cluster" )
- **true**: the snapshot will be replicated to remote storage.
+ params = {
+ "groupSnapshotID" : group_snapshot_id ,
+ }
+ if expiration_time is not None :
+ params [ "expirationTime" ] = expiration_time
+ if enable_remote_replication is not None :
+ params [ "enableRemoteReplication" ] = enable_remote_replication
+
+ # There is no adaptor.
+ return self . send_request (
+ 'ModifyGroupSnapshot' ,
+ ModifyGroupSnapshotResult ,
+ params ,
+ since = 8.0
+ )
-
**false**: Default. No replication.
+
[docs] def modify_snapshot (
+
self ,
+
snapshot_id ,
+
expiration_time = OPTIONAL ,
+
enable_remote_replication = OPTIONAL ,):
+
"""
+
ModifySnapshot enables you to change the attributes currently assigned to a snapshot. You can use this method to enable snapshots created on
+
the Read/Write (source) volume to be remotely replicated to a target SolidFire storage system.
+
:param snapshotID: [required] Specifies the ID of the snapshot.
+
:type snapshotID: int
-
:type enable_remote_replication: bool
+
:param expirationTime: Sets the time when the snapshot should be removed.
+
:type expirationTime: str
-
:returns: a response
-
:rtype: ModifyGroupSnapshotResult
+
:param enableRemoteReplication: Replicates the snapshot created to a remote cluster. Possible values are: true: The snapshot is replicated to remote storage. false: Default. The snapshot is not replicated.
+
:type enableRemoteReplication: bool
"""
-
params = {
-
"groupSnapshotID" : group_snapshot_id ,
+
self . _check_connection_type ( "modify_snapshot" , "Cluster" )
+
+
params = {
+
"snapshotID" : snapshot_id ,
}
if expiration_time is not None :
params [ "expirationTime" ] = expiration_time
if enable_remote_replication is not None :
params [ "enableRemoteReplication" ] = enable_remote_replication
-
+
+
# There is no adaptor.
return self . send_request (
-
'ModifyGroupSnapshot' ,
-
ModifyGroupSnapshotResult ,
+
'ModifySnapshot' ,
+
ModifySnapshotResult ,
params ,
-
since = 8.0 ,
+
since = 8.0
)
[docs] def rollback_to_group_snapshot (
@@ -3412,393 +3539,596 @@
Source code for solidfire
name = OPTIONAL ,
attributes = OPTIONAL ,):
"""
- *rollback_to_group_snapshot* is used to roll back each individual
- volume in a snapshot group to a copy of their individual snapshots.
-
+ RollbackToGroupSnapshot enables you to roll back all individual volumes in a snapshot group to each volume's individual snapshot.
+ Note: Rolling back to a group snapshot creates a temporary snapshot of each volume within the group snapshot.
+ Snapshots are allowed if cluster fullness is at stage 2 or 3. Snapshots are not created when cluster fullness is at stage 4 or 5.
+ :param groupSnapshotID: [required] Specifies the unique ID of the group snapshot.
+ :type groupSnapshotID: int
+ :param saveCurrentState: [required] Specifies whether to save an active volume image or delete it. Values are: true: The previous active volume image is kept. false: (default) The previous active volume image is deleted.
+ :type saveCurrentState: bool
+ :param name: Name for the group snapshot of the volume's current state that is created if "saveCurrentState" is set to true. If you do not give a name, the name of the snapshots (group and individual volume) are set to a timestamp of the time that the rollback occurred.
+ :type name: str
- **Note**: Creating a snapshot is allowed if cluster fullness is at
- stage 2 or 3.
- Snapshots are not created when cluster fullness is at stage 4 or 5.
+ :param attributes: List of name-value pairs in JSON object format.
+ :type attributes: dict
+ """
- :param group_snapshot_id: [required] Unique ID of the group snapshot.
- :type group_snapshot_id: int
+ self . _check_connection_type ( "rollback_to_group_snapshot" , "Cluster" )
- :param save_current_state: [required]
+ params = {
+ "groupSnapshotID" : group_snapshot_id ,
+ "saveCurrentState" : save_current_state ,
+ }
+ if name is not None :
+ params [ "name" ] = name
+ if attributes is not None :
+ params [ "attributes" ] = attributes
+
+ # There is no adaptor.
+ return self . send_request (
+ 'RollbackToGroupSnapshot' ,
+ RollbackToGroupSnapshotResult ,
+ params ,
+ since = 7.0
+ )
-
**true**: The previous active volume image is kept.
+
[docs] def rollback_to_snapshot (
+
self ,
+
volume_id ,
+
snapshot_id ,
+
save_current_state ,
+
name = OPTIONAL ,
+
attributes = OPTIONAL ,):
+
"""
+
RollbackToSnapshot enables you to make an existing snapshot of the "active" volume image. This method creates a new snapshot
+
from an existing snapshot. The new snapshot becomes "active" and the existing snapshot is preserved until you delete it.
+
The previously "active" snapshot is deleted unless you set the parameter saveCurrentState to true.
+
Note: Creating a snapshot is allowed if cluster fullness is at stage 2 or 3. Snapshots are not created when cluster fullness is
+
at stage 4 or 5.
+
:param volumeID: [required] VolumeID for the volume.
+
:type volumeID: int
-
**false**: (default) The previous active volume image is deleted.
+
:param snapshotID: [required] The ID of a previously created snapshot on the given volume.
+
:type snapshotID: int
-
:type save_current_state: bool
+
:param saveCurrentState: [required] Specifies whether to save an active volume image or delete it. Values are: true: The previous active volume image is kept. false: (default) The previous active volume image is deleted.
+
:type saveCurrentState: bool
-
:param name: (optional) Name for the snapshot. If no name is given,
-
then the name of the snapshot being rolled back to is used with
-
\"-copy\" appended to the end of the name.
+
:param name: Name for the snapshot. If unspecified, the name of the snapshot being rolled back to is used with "- copy" appended to the end of the name.
:type name: str
-
:param attributes: (optional) List of Name/Value pairs in JSON object
-
format
+
:param attributes: List of name-value pairs in JSON object format.
:type attributes: dict
-
-
:returns: a response
-
:rtype: CreateGroupSnapshotResult
"""
-
params = {
-
"groupSnapshotID" : group_snapshot_id ,
+
self . _check_connection_type ( "rollback_to_snapshot" , "Cluster" )
+
+
params = {
+
"volumeID" : volume_id ,
+
"snapshotID" : snapshot_id ,
"saveCurrentState" : save_current_state ,
}
if name is not None :
params [ "name" ] = name
if attributes is not None :
params [ "attributes" ] = attributes
+
+
# There is no adaptor.
+
return self . send_request (
+
'RollbackToSnapshot' ,
+
RollbackToSnapshotResult ,
+
params ,
+
since = 6.0
+
)
+
+
[docs] def disable_snmp (
+
self ,):
+
"""
+
You can use DisableSnmp to disable SNMP on the cluster nodes. """
+
+
self . _check_connection_type ( "disable_snmp" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'RollbackToGroupSnapshot' ,
-
CreateGroupSnapshotResult ,
+
'DisableSnmp' ,
+
DisableSnmpResult ,
params ,
-
since = 7.0 ,
+
since = 8.0
)
-
[docs] def get_schedule (
+
[docs] def enable_snmp (
self ,
-
schedule_id ,):
+
snmp_v3_enabled ,):
"""
-
*get_schedule* is used to return information about a scheduled snapshot
-
that has been created. You can see information about a specified
-
schedule if there are many snapshot schedules in the system. You can
-
include more than one schedule with this method by specifying
-
additional *schedule_ids* to the parameter.
+
EnableSnmp enables you to enable SNMP on cluster nodes. When you enable SNMP, the action applies to all nodes in the cluster, and
+
the values that are passed replace, in whole, all values set in any previous call to EnableSnmp.
+
:param snmpV3Enabled: [required] If set to "true", then SNMP v3 is enabled on each node in the cluster. If set to "false", then SNMP v2 is enabled.
+
:type snmpV3Enabled: bool
+
"""
-
:param schedule_id: [required] Unique ID of the schedule or multiple
-
schedules to display
-
:type schedule_id: int
+
self . _check_connection_type ( "enable_snmp" , "Cluster" )
-
:returns: a response
-
:rtype: GetScheduleResult
-
"""
+
params = {
+
"snmpV3Enabled" : snmp_v3_enabled ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'EnableSnmp' ,
+
EnableSnmpResult ,
+
params ,
+
since = 8.0
+
)
-
params = {
-
"scheduleID" : schedule_id ,
+
[docs] def get_snmp_acl (
+
self ,):
+
"""
+
GetSnmpACL enables you to return the current SNMP access permissions on the cluster nodes. """
+
+
self . _check_connection_type ( "get_snmp_acl" , "Cluster" )
+
+
params = {
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetSnmpACL' ,
+
GetSnmpACLResult ,
+
params ,
+
since = 8.0
+
)
-
since = 8.0
-
deprecated = None
+
[docs] def get_snmp_info (
+
self ,):
+
"""
+
GetSnmpInfo enables you to retrieve the current simple network management protocol (SNMP) configuration information.
+
Note: GetSnmpInfo is available for Element OS 8 and prior releases. It is deprecated for versions later than Element OS 8.
+
NetApp recommends that you migrate to the GetSnmpState and SetSnmpACL methods. See details in the Element API Reference Guide
+
for their descriptions and usage. """
-
return ElementServiceAdaptor . get_schedule ( self , params ,
-
since , deprecated )
+
self . _check_connection_type ( "get_snmp_info" , "Cluster" )
-
[docs] def list_schedules (
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetSnmpInfo' ,
+
GetSnmpInfoResult ,
+
params ,
+
since = 1.0
+
)
+
+
[docs] def get_snmp_state (
self ,):
"""
-
*list_schedule* is used to return information about all scheduled
-
snapshots that have been created.
+
You can use GetSnmpState to return the current state of the SNMP feature. """
-
:returns: a response
-
:rtype: ListSchedulesResult
-
"""
+
self . _check_connection_type ( "get_snmp_state" , "Cluster" )
+
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetSnmpState' ,
+
GetSnmpStateResult ,
+
params ,
+
since = 8.0
+
)
-
params = {}
+
[docs] def get_snmp_trap_info (
+
self ,):
+
"""
+
You can use GetSnmpTrapInfo to return current SNMP trap configuration information. """
-
since = 8.0
-
deprecated = None
+
self . _check_connection_type ( "get_snmp_trap_info" , "Cluster" )
-
return ElementServiceAdaptor . list_schedules ( self , params ,
-
since , deprecated )
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetSnmpTrapInfo' ,
+
GetSnmpTrapInfoResult ,
+
params ,
+
since = 5.0
+
)
-
[docs] def create_schedule (
+
[docs] def set_snmp_acl (
self ,
-
schedule ,):
+
networks ,
+
usm_users ,):
"""
-
*create_schedule* is used to create a schedule that will autonomously
-
make a snapshot of a volume at a defined interval.
-
-
-
-
-
+
SetSnmpACL enables you to configure SNMP access permissions on the cluster nodes. The values you set with this interface apply to all
+
nodes in the cluster, and the values that are passed replace, in whole, all values set in any previous call to SetSnmpACL. Also note
+
that the values set with this interface replace all network or usmUsers values set with the older SetSnmpInfo.
+
:param networks: [required] List of networks and what type of access they have to the SNMP servers running on the cluster nodes. See SNMP Network Object for possible "networks" values. This parameter is required if SNMP v3 is disabled.
+
:type networks: SnmpNetwork
+
:param usmUsers: [required] List of users and the type of access they have to the SNMP servers running on the cluster nodes.
+
:type usmUsers: SnmpV3UsmUser
+
"""
-
The snapshot created can be used later as a backup or rollback to
-
ensure the data on a volume or group of volumes is consistent for the
-
point in time in which the snapshot was created.
+
self . _check_connection_type ( "set_snmp_acl" , "Cluster" )
+
params = {
+
"networks" : networks ,
+
"usmUsers" : usm_users ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'SetSnmpACL' ,
+
SetSnmpACLResult ,
+
params ,
+
since = 8.0
+
)
+
[docs] def set_snmp_info (
+
self ,
+
networks = OPTIONAL ,
+
enabled = OPTIONAL ,
+
snmp_v3_enabled = OPTIONAL ,
+
usm_users = OPTIONAL ,):
+
"""
+
SetSnmpInfo enables you to configure SNMP version 2 and version 3 on cluster nodes. The values you set with this interface apply to
+
all nodes in the cluster, and the values that are passed replace, in whole, all values set in any previous call to SetSnmpInfo.
+
Note: SetSnmpInfo is deprecated. Use the EnableSnmp and SetSnmpACL methods instead.
+
:param networks: List of networks and what type of access they have to the SNMP servers running on the cluster nodes. See the SNMP Network Object for possible "networks" values. This parameter is required only for SNMP v2.
+
:type networks: SnmpNetwork
+
:param enabled: If set to true, SNMP is enabled on each node in the cluster.
+
:type enabled: bool
+
:param snmpV3Enabled: If set to true, SNMP v3 is enabled on each node in the cluster.
+
:type snmpV3Enabled: bool
+
:param usmUsers: If SNMP v3 is enabled, this value must be passed in place of the networks parameter. This parameter is required only for SNMP v3.
+
:type usmUsers: SnmpV3UsmUser
+
"""
+
self . _check_connection_type ( "set_snmp_info" , "Cluster" )
-
**Note**: Creating a snapshot is allowed if cluster fullness is at
-
stage 2 or 3. Snapshots are not created when cluster fullness is at
-
stage 4 or 5.
+
params = {
+
}
+
if networks is not None :
+
params [ "networks" ] = networks
+
if enabled is not None :
+
params [ "enabled" ] = enabled
+
if snmp_v3_enabled is not None :
+
params [ "snmpV3Enabled" ] = snmp_v3_enabled
+
if usm_users is not None :
+
params [ "usmUsers" ] = usm_users
+
+
# There is no adaptor.
+
return self . send_request (
+
'SetSnmpInfo' ,
+
SetSnmpInfoResult ,
+
params ,
+
since = 1.0
+
)
-
:param schedule: [required] The \"Schedule\" object will be used to
-
create a new schedule.
+
[docs] def set_snmp_trap_info (
+
self ,
+
trap_recipients ,
+
cluster_fault_traps_enabled ,
+
cluster_fault_resolved_traps_enabled ,
+
cluster_event_traps_enabled ,):
+
"""
+
You can use SetSnmpTrapInfo to enable and disable the generation of cluster SNMP notifications (traps) and to specify the set of network host computers that receive the notifications. The values you pass with each SetSnmpTrapInfo method call replace all values set in any previous call to SetSnmpTrapInfo.
+
:param trapRecipients: [required] List of hosts that are to receive the traps generated by the Cluster Master. At least one object is required if any one of the trap types is enabled.
+
:type trapRecipients: SnmpTrapRecipient
-
Do not set *schedule_id* property, it will be ignored.
+
:param clusterFaultTrapsEnabled: [required] If the value is set to true, a corresponding solidFireClusterFaultNotification is sent to the configured list of trap recipients when a cluster fault is logged. The default value is false.
+
:type clusterFaultTrapsEnabled: bool
-
Frequency property must be of type that inherits from Frequency.
-
Valid types are:
+
:param clusterFaultResolvedTrapsEnabled: [required] If the value is set to true, a corresponding solidFireClusterFaultResolvedNotification is sent to the configured list of trap recipients when a cluster fault is resolved. The default value is false.
+
:type clusterFaultResolvedTrapsEnabled: bool
-
*days_of_month_frequency*
+
:param clusterEventTrapsEnabled: [required] If the value is set to true, a corresponding solidFireClusterEventNotification is sent to the configured list of trap recipients when a cluster event is logged. The default value is false.
+
:type clusterEventTrapsEnabled: bool
+
"""
-
*days_or_week_frequency*
+
self . _check_connection_type ( "set_snmp_trap_info" , "Cluster" )
-
*time_interval_frequency*
+
params = {
+
"trapRecipients" : trap_recipients ,
+
"clusterFaultTrapsEnabled" : cluster_fault_traps_enabled ,
+
"clusterFaultResolvedTrapsEnabled" : cluster_fault_resolved_traps_enabled ,
+
"clusterEventTrapsEnabled" : cluster_event_traps_enabled ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'SetSnmpTrapInfo' ,
+
SetSnmpTrapInfoResult ,
+
params ,
+
since = 5.0
+
)
-
:type schedule: Schedule
+
[docs] def snmp_send_test_traps (
+
self ,):
+
"""
+
SnmpSendTestTraps enables you to test SNMP functionality for a cluster. This method instructs the cluster to send test SNMP traps to the currently configured SNMP manager. """
-
:returns: a response
-
:rtype: CreateScheduleResult
-
"""
+
self . _check_connection_type ( "snmp_send_test_traps" , "Cluster" )
-
params = {
-
"schedule" : schedule ,
+
params = {
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'SnmpSendTestTraps' ,
+
SnmpSendTestTrapsResult ,
+
params ,
+
since = 6.0
+
)
-
since = 8.0
-
deprecated = None
-
-
return ElementServiceAdaptor . create_schedule ( self , params ,
-
since , deprecated )
-
-
[docs] def modify_schedule (
+
[docs] def create_storage_container (
self ,
-
schedule ,):
+
name ,
+
initiator_secret = OPTIONAL ,
+
target_secret = OPTIONAL ,
+
account_id = OPTIONAL ,):
"""
-
*modify_schedule* is used to change the intervals at which a scheduled
-
snapshot occurs. This allows for adjustment to the snapshot frequency
-
and retention.
-
-
+
CreateStorageContainer enables you to create a Virtual Volume (VVol) storage container. Storage containers are associated with a SolidFire storage system account, and are used for reporting and resource allocation. Storage containers can only be associated with virtual volumes. You need at least one storage container to use the Virtual Volumes feature.
+
:param name: [required] The name of the storage container. Follows SolidFire account naming restrictions.
+
:type name: str
+
:param initiatorSecret: The secret for CHAP authentication for the initiator.
+
:type initiatorSecret: str
-
:param schedule: [required] The \"Schedule\" object will be used to
-
modify an existing schedule.
+
:param targetSecret: The secret for CHAP authentication for the target.
+
:type targetSecret: str
-
The *schedule_id* property is required.
+
:param accountID: Non-storage container account that will become a storage container.
+
:type accountID: int
+
"""
-
Frequency property must be of type that inherits from Frequency.
-
Valid types are:
+
self . _check_connection_type ( "create_storage_container" , "Cluster" )
-
*days_of_month_frequency*
+
params = {
+
"name" : name ,
+
}
+
if initiator_secret is not None :
+
params [ "initiatorSecret" ] = initiator_secret
+
if target_secret is not None :
+
params [ "targetSecret" ] = target_secret
+
if account_id is not None :
+
params [ "accountID" ] = account_id
+
+
# There is no adaptor.
+
return self . send_request (
+
'CreateStorageContainer' ,
+
CreateStorageContainerResult ,
+
params ,
+
since = 9.0
+
)
-
*days_or_week_frequency*
+
[docs] def delete_storage_containers (
+
self ,
+
storage_container_ids ,):
+
"""
+
DeleteStorageContainers enables you to remove up to 2000 Virtual Volume (VVol) storage containers from the system at one time.
+
The storage containers you remove must not contain any VVols.
+
:param storageContainerIDs: [required] A list of IDs of the storage containers to delete. You can specify up to 2000 IDs in the list.
+
:type storageContainerIDs: UUID
+
"""
-
*time_interval_frequency*
+
self . _check_connection_type ( "delete_storage_containers" , "Cluster" )
-
:type schedule: Schedule
+
params = {
+
"storageContainerIDs" : storage_container_ids ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'DeleteStorageContainers' ,
+
DeleteStorageContainerResult ,
+
params ,
+
since = 9.0
+
)
-
:returns: a response
-
:rtype: ModifyScheduleResult
+
[docs] def get_storage_container_efficiency (
+
self ,
+
storage_container_id ,):
+
"""
+
GetStorageContainerEfficiency enables you to retrieve efficiency information about a virtual volume storage container.
+
:param storageContainerID: [required] The ID of the storage container for which to retrieve efficiency information.
+
:type storageContainerID: UUID
"""
-
params = {
-
"schedule" : schedule ,
-
}
-
-
since = 8.0
-
deprecated = None
+
self . _check_connection_type ( "get_storage_container_efficiency" , "Cluster" )
-
return ElementServiceAdaptor . modify_schedule ( self , params ,
-
since , deprecated )
+
params = {
+
"storageContainerID" : storage_container_id ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetStorageContainerEfficiency' ,
+
GetStorageContainerEfficiencyResult ,
+
params ,
+
since = 9.0
+
)
-
[docs] def get_raw_stats (
-
self ,):
+
[docs] def list_storage_containers (
+
self ,
+
storage_container_ids = OPTIONAL ,):
"""
-
The *get_raw_stats* call is used by SolidFire engineering to
-
troubleshoot new features. The data returned from *get_raw_stats* is
-
not documented, it changes frequently, and is not guaranteed to be
-
accurate. It is not recommended to ever use *get_raw_stats* for
-
collecting performance data or any other management integration with a
-
SolidFire cluster.
-
The data returned from *get_raw_stats* changes frequently, and is not
-
guaranteed to accurately show performance from the system. It is not
-
recommended to ever use *get_raw_stats* for collecting performance data
-
or any other management integration with a SolidFire cluster.
-
-
:returns: a response
-
:rtype: Object
+
ListStorageContainers enables you to retrieve information about all virtual volume storage containers known to the system.
+
:param storageContainerIDs: A list of storage container IDs for which to retrieve information. If you omit this parameter, the method returns information about all storage containers in the system.
+
:type storageContainerIDs: UUID
"""
-
params = {}
+
self . _check_connection_type ( "list_storage_containers" , "Cluster" )
+
params = {
+
}
+
if storage_container_ids is not None :
+
params [ "storageContainerIDs" ] = storage_container_ids
+
+
# There is no adaptor.
return self . send_request (
-
'GetRawStats' ,
-
str ,
+
'ListStorageContainers' ,
+
ListStorageContainersResult ,
params ,
+
since = 9.0
)
-
[docs] def get_complete_stats (
-
self ,):
+
[docs] def modify_storage_container (
+
self ,
+
storage_container_id ,
+
initiator_secret = OPTIONAL ,
+
target_secret = OPTIONAL ,):
"""
-
The *get_complete_stats* API method is used by SolidFire engineering to
-
troubleshoot new features. The data returned from *get_complete_stats*
-
is not documented, changes frequently, and is not guaranteed to be
-
accurate. It is not recommended to ever use *get_complete_stats* for
-
collecting performance data or any other management integration with a
-
SolidFire cluster.
-
The data returned from *get_complete_stats* changes frequently, and is
-
not guaranteed to accurately show performance from the system. It is
-
not recommended to ever use *get_complete_stats* for collecting
-
performance data or any other management integration with a SolidFire
-
cluster.
+
ModifyStorageContainer enables you to make changes to an existing virtual volume storage container.
+
:param storageContainerID: [required] The unique ID of the virtual volume storage container to modify.
+
:type storageContainerID: UUID
+
+
:param initiatorSecret: The new secret for CHAP authentication for the initiator.
+
:type initiatorSecret: str
-
:returns: a response
-
:rtype: Object
+
:param targetSecret: The new secret for CHAP authentication for the target.
+
:type targetSecret: str
"""
-
params = {}
+
self . _check_connection_type ( "modify_storage_container" , "Cluster" )
+
params = {
+
"storageContainerID" : storage_container_id ,
+
}
+
if initiator_secret is not None :
+
params [ "initiatorSecret" ] = initiator_secret
+
if target_secret is not None :
+
params [ "targetSecret" ] = target_secret
+
+
# There is no adaptor.
return self . send_request (
-
'GetCompleteStats' ,
-
str ,
+
'ModifyStorageContainer' ,
+
ModifyStorageContainerResult ,
params ,
+
since = 9.0
)
[docs] def list_tests (
self ,):
"""
-
The *list_tests* API method is used to return the tests that are
-
available to run on a node.
-
-
-
**Note**: This method is available only through the per-node API
-
endpoint 5.0 or later.
-
+
You can use the ListTests API method to return the tests that are available to run on a node.
+
Note: This method is available only through the per-node API endpoint 5.0 or later. """
-
:returns: a response
-
:rtype: ListTestsResult
-
"""
-
-
params = {}
+
self . _check_connection_type ( "list_tests" , "Node" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
'ListTests' ,
ListTestsResult ,
params ,
+
since = 5.0
)
[docs] def list_utilities (
self ,):
"""
-
The *list_utilities* API method is used to return the tests that are
-
available to run on a node.
-
-
-
**Note**: This method is available only through the per-node API
-
endpoint 5.0 or later.
-
-
-
:returns: a response
-
:rtype: ListUtilitiesResult
-
"""
+
You can use the ListUtilities API method to return the operations that are available to run on a node.
+
Note: This method is available only through the per-node API endpoint 5.0 or later. """
-
params = {}
+
self . _check_connection_type ( "list_utilities" , "Node" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
'ListUtilities' ,
ListUtilitiesResult ,
params ,
+
since = 5.0
)
[docs] def test_connect_ensemble (
self ,
ensemble = OPTIONAL ,):
"""
-
The *test_connect_ensemble* API method is used to verify connectivity
-
with a sepcified database ensemble. By default it uses the ensemble for
-
the cluster the node is associated with. Alternatively you can provide
-
a different ensemble to test connectivity with.
-
-
-
**Note**: This method is available only through the per-node API
-
endpoint 5.0 or later.
-
-
-
:param ensemble: (optional) A comma-separated list of ensemble node
-
*cips* for connectivity testing
+
The TestConnectEnsemble API method enables you to verify connectivity with a specified database ensemble. By default, it uses the ensemble for the cluster that the node is associated with. Alternatively, you can provide a different ensemble to test connectivity with.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
:param ensemble: Uses a comma-separated list of ensemble node cluster IP addresses to test connectivity. This parameter is optional.
:type ensemble: str
-
-
:returns: a response
-
:rtype: TestConnectEnsembleResult
"""
-
params = {}
+
self . _check_connection_type ( "test_connect_ensemble" , "Node" )
+
+
params = {
+
}
if ensemble is not None :
params [ "ensemble" ] = ensemble
-
+
+
# There is no adaptor.
return self . send_request (
'TestConnectEnsemble' ,
TestConnectEnsembleResult ,
params ,
+
since = 5.0
)
[docs] def test_connect_mvip (
self ,
mvip = OPTIONAL ,):
"""
-
The *test_connect_mvip* API method is used to test the management
-
connection to the cluster. The test pings the MVIP and executes a
-
simple API method to verify connectivity.
-
-
-
**Note**: This method is available only through the per-node API
-
endpoint 5.0 or later.
-
-
-
:param mvip: (optional) Optionally, use to test the management
-
connection of a different MVIP. This is not needed to test the
-
connection to the target cluster.
+
The TestConnectMvip API method enables you to test the
+
management connection to the cluster. The test pings the MVIP and executes a simple API method to verify connectivity.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
:param mvip: If specified, tests the management connection of a different MVIP. You do not need to use this value when testing the connection to the target cluster. This parameter is optional.
:type mvip: str
-
-
:returns: a response
-
:rtype: TestConnectMvipResult
"""
-
params = {}
+
self . _check_connection_type ( "test_connect_mvip" , "Node" )
+
+
params = {
+
}
if mvip is not None :
params [ "mvip" ] = mvip
-
+
+
# There is no adaptor.
return self . send_request (
'TestConnectMvip' ,
TestConnectMvipResult ,
params ,
+
since = 5.0
)
[docs] def test_connect_svip (
self ,
svip = OPTIONAL ,):
"""
-
The *test_connect_svip* API method is used to test the storage
-
connection to the cluster. The test pings the SVIP using ICMP packets
-
and when successful connects as an iSCSI initiator.
-
-
-
**Note**: This method is available only through the per-node API
-
endpoint 5.0 or later.
-
-
-
:param svip: (optional) Optionally, use to test the storage connection
-
of a different SVIP. This is not needed to test the connection to
-
the target cluster.
+
The TestConnectSvip API method enables you to test the storage connection to the cluster. The test pings the SVIP using ICMP packets, and when successful, connects as an iSCSI initiator.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
:param svip: If specified, tests the storage connection of a different SVIP. You do not need to use this value when testing the connection to the target cluster. This parameter is optional.
:type svip: str
-
-
:returns: a response
-
:rtype: TestConnectSvipResult
"""
-
params = {}
+
self . _check_connection_type ( "test_connect_svip" , "Node" )
+
+
params = {
+
}
if svip is not None :
params [ "svip" ] = svip
-
+
+
# There is no adaptor.
return self . send_request (
'TestConnectSvip' ,
TestConnectSvipResult ,
params ,
+
since = 5.0
)
[docs] def test_ping (
@@ -3807,45 +4137,35 @@
Source code for solidfire
hosts = OPTIONAL ,
total_timeout_sec = OPTIONAL ,
packet_size = OPTIONAL ,
- ping_timeout_msec = OPTIONAL ,):
+ ping_timeout_msec = OPTIONAL ,
+ prohibit_fragmentation = OPTIONAL ,):
"""
- The *test_ping* API method is used to validate the connection to all
- nodes in the cluster on both 1G and 10G interfaces using ICMP packets.
- The test uses the appropriate MTU sizes for each packet based on the
- MTU settings in the network configuration.
-
-
- **Note**: This method is available only through the per-node API
- endpoint 5.0 or later.
-
-
- :param attempts: (optional) Specifies the number of times the system
- should repeat the test ping. Default is 5.
+ You can use the TestPing API method to validate the
+ connection to all the nodes in a cluster on both 1G and 10G interfaces by using ICMP packets. The test uses the appropriate MTU sizes for each packet based on the MTU settings in the network configuration.
+ Note: This method is available only through the per-node API endpoint 5.0 or later.
+ :param attempts: Specifies the number of times the system should repeat the test ping. The default value is 5.
:type attempts: int
- :param hosts: (optional) Specify address or hostnames of devices to
- ping.
+ :param hosts: Specifies a comma-separated list of addresses or hostnames of devices to ping.
:type hosts: str
- :param total_timeout_sec: (optional) Specifies the length of time the
- ping should wait for a system response before issuing the next ping
- attempt or ending the process.
- :type total_timeout_sec: int
+ :param totalTimeoutSec: Specifies the length of time the ping should wait for a system response before issuing the next ping attempt or ending the process.
+ :type totalTimeoutSec: int
- :param packet_size: (optional) Specify the number of bytes to send in
- the ICMP packet sent to each IP. Number be less than the maximum
- MTU specified in the network configuration.
- :type packet_size: int
+ :param packetSize: Specifies the number of bytes to send in the ICMP packet that is sent to each IP. The number must be less than the maximum MTU specified in the network configuration.
+ :type packetSize: int
- :param ping_timeout_msec: (optional) Specify the number of milliseconds
- to wait for each individual ping response. Default is 500ms.
- :type ping_timeout_msec: int
+ :param pingTimeoutMsec: Specifies the number of milliseconds to wait for each individual ping response. The default value is 500 ms.
+ :type pingTimeoutMsec: int
- :returns: a response
- :rtype: TestPingResult
+ :param prohibitFragmentation: Specifies that the Do not Fragment (DF) flag is enabled for the ICMP packets.
+ :type prohibitFragmentation: bool
"""
- params = {}
+ self . _check_connection_type ( "test_ping" , "Node" )
+
+ params = {
+ }
if attempts is not None :
params [ "attempts" ] = attempts
if hosts is not None :
@@ -3856,63 +4176,15 @@ Source code for solidfire
params [ "packetSize" ] = packet_size
if ping_timeout_msec is not None :
params [ "pingTimeoutMsec" ] = ping_timeout_msec
-
+ if prohibit_fragmentation is not None :
+ params [ "prohibitFragmentation" ] = prohibit_fragmentation
+
+ # There is no adaptor.
return self . send_request (
'TestPing' ,
TestPingResult ,
params ,
- )
-
-[docs] def list_virtual_networks (
-
self ,
-
virtual_network_id = OPTIONAL ,
-
virtual_network_tag = OPTIONAL ,
-
virtual_network_ids = OPTIONAL ,
-
virtual_network_tags = OPTIONAL ,):
-
"""
-
*list_virtual_networks* is used to get a list of all the configured
-
virtual networks for the cluster. This method can be used to verify the
-
virtual network settings in the cluster.
-
-
This method does not require any parameters to be passed. But, one or
-
more *virtual_network_ids* or *virtual_network_tags* can be passed in
-
order to filter the results.
-
-
:param virtual_network_id: (optional) Network ID to filter the list for
-
a single virtual network
-
:type virtual_network_id: int
-
-
:param virtual_network_tag: (optional) Network Tag to filter the list
-
for a single virtual network
-
:type virtual_network_tag: int
-
-
:param virtual_network_ids: (optional) *network_ids* to include in the
-
list.
-
:type virtual_network_ids: int[]
-
-
:param virtual_network_tags: (optional) Network Tags to include in the
-
list.
-
:type virtual_network_tags: int[]
-
-
:returns: a response
-
:rtype: ListVirtualNetworksResult
-
"""
-
-
params = {}
-
if virtual_network_id is not None :
-
params [ "virtualNetworkID" ] = virtual_network_id
-
if virtual_network_tag is not None :
-
params [ "virtualNetworkTag" ] = virtual_network_tag
-
if virtual_network_ids is not None :
-
params [ "virtualNetworkIDs" ] = virtual_network_ids
-
if virtual_network_tags is not None :
-
params [ "virtualNetworkTags" ] = virtual_network_tags
-
-
return self . send_request (
-
'ListVirtualNetworks' ,
-
ListVirtualNetworksResult ,
-
params ,
-
since = 7.0 ,
+
since = 5.0
)
[docs] def add_virtual_network (
@@ -3926,89 +4198,114 @@
Source code for solidfire
namespace = OPTIONAL ,
attributes = OPTIONAL ,):
"""
- *add_virtual_network* is used to add a new virtual network to a cluster
- configuration. When a virtual network is added, an interface for each
- node is created and each will require a virtual network IP address. The
- number of IP addresses specified as a parameter for this API method
- must be equal to or greater than the number of nodes in the cluster.
- Virtual network addresses are bulk provisioned by SolidFire and
- assigned to individual nodes automatically. Virtual network addresses
- do not need to be assigned to nodes manually.
-
-
-
-
- **Note:** The *add_virtual_network* method is used only to create a new
- virtual network. If you want to make changes to a virtual network,
- please use the *modify_virtual_network* method.
-
- :param virtual_network_tag: [required] A unique virtual network (VLAN)
- tag. Supported values are 1 to 4095 (the number zero (0) is not
- supported).
- :type virtual_network_tag: int
-
- :param name: [required] User defined name for the new virtual network.
+ You can use the AddVirtualNetwork method to add a new virtual network to a cluster configuration. When you add a virtual network,
+ an interface for each node is created and each interface will require a virtual network IP address. The number of IP addresses you
+ specify as a parameter for this API method must be equal to or greater than the number of nodes in the cluster. The system bulk
+ provisions virtual network addresses and assigns them to individual nodes automatically. You do not need to assign virtual
+ network addresses to nodes manually.
+ Note: You can use AddVirtualNetwork only to create a new virtual network. If you want to make changes to an
+ existing virtual network, use ModifyVirtualNetwork.
+ Note: Virtual network parameters must be unique to each virtual network when setting the namespace parameter to false.
+ :param virtualNetworkTag: [required] A unique virtual network (VLAN) tag. Supported values are 1 through 4094.The number zero (0) is not supported.
+ :type virtualNetworkTag: int
+
+ :param name: [required] A user-defined name for the new virtual network.
:type name: str
- :param address_blocks: [required] Unique Range of IP addresses to
- include in the virtual network. Attributes for this parameter are:
-
- **start:** start of the IP address range. (String)
-
- **size:** numbre of IP addresses to include in the block. (Integer)
+ :param addressBlocks: [required] Unique range of IP addresses to include in the virtual network. Attributes for this parameter are: start: The start of the IP address range. (String) size: The number of IP addresses to include in the block. (Integer)
+ :type addressBlocks: AddressBlockParams
- :type address_blocks: AddressBlock[]
-
- :param netmask: [required] Unique netmask for the virtual network being
- created.
+ :param netmask: [required] Unique network mask for the virtual network being created.
:type netmask: str
- :param svip: [required] Unique storage IP address for the virtual
- network being created.
+ :param svip: [required] Unique storage IP address for the virtual network being created.
:type svip: str
- :param gateway: (optional)
+ :param gateway: The IP address of a gateway of the virtual network. This parameter is only valid if the "namespace" parameter is set to true.
:type gateway: str
- :param namespace: (optional)
+ :param namespace: When set to true, enables the Routable Storage VLANs functionality by creating and configuring a namespace and the virtual network contained by it.
:type namespace: bool
- :param attributes: (optional) List of Name/Value pairs in JSON object
- format.
+ :param attributes: List of name-value pairs in JSON object format.
:type attributes: dict
-
- :returns: a response
- :rtype: AddVirtualNetworkResult
"""
- params = {
+ self . _check_connection_type ( "add_virtual_network" , "Cluster" )
+
+ params = {
"virtualNetworkTag" : virtual_network_tag ,
"name" : name ,
"addressBlocks" : address_blocks ,
"netmask" : netmask ,
"svip" : svip ,
}
- self . _check_param_versions (
- 'add_virtual_network' ,
- [
- ( "gateway" ,
- gateway , 9.0 , None ),
- ( "namespace" ,
- namespace , 9.0 , None ),
- ]
- )
if gateway is not None :
- params [ "gateway" ] = gateway
+ if self . api_version < 9.0 :
+ raise ApiParameterVersionError ( "add_virtual_network" , 9.0 ,
+ [( "gateway" , gateway , 9.0 , False )])
+ else :
+ params [ "gateway" ] = gateway
if namespace is not None :
- params [ "namespace" ] = namespace
+ if self . api_version < 9.0 :
+ raise ApiParameterVersionError ( "add_virtual_network" , 9.0 ,
+ [( "namespace" , namespace , 9.0 , False )])
+ else :
+ params [ "namespace" ] = namespace
if attributes is not None :
params [ "attributes" ] = attributes
+
+ # There is no adaptor.
+ return self . send_request (
+ 'AddVirtualNetwork' ,
+ AddVirtualNetworkResult ,
+ params ,
+ since = 7.0
+ )
+
+
[docs] def list_virtual_networks (
+
self ,
+
virtual_network_id = OPTIONAL ,
+
virtual_network_tag = OPTIONAL ,
+
virtual_network_ids = OPTIONAL ,
+
virtual_network_tags = OPTIONAL ,):
+
"""
+
ListVirtualNetworks enables you to list all configured virtual networks for the cluster. You can use this method to verify the virtual
+
network settings in the cluster.
+
There are no required parameters for this method. However, to filter the results, you can pass one or more VirtualNetworkID or
+
VirtualNetworkTag values.
+
:param virtualNetworkID: Network ID to filter the list for a single virtual network.
+
:type virtualNetworkID: int
+
+
:param virtualNetworkTag: Network tag to filter the list for a single virtual network.
+
:type virtualNetworkTag: int
+
+
:param virtualNetworkIDs: Network IDs to include in the list.
+
:type virtualNetworkIDs: int
+
+
:param virtualNetworkTags: Network tag to include in the list.
+
:type virtualNetworkTags: int
+
"""
+
+
self . _check_connection_type ( "list_virtual_networks" , "Cluster" )
+
params = {
+
}
+
if virtual_network_id is not None :
+
params [ "virtualNetworkID" ] = virtual_network_id
+
if virtual_network_tag is not None :
+
params [ "virtualNetworkTag" ] = virtual_network_tag
+
if virtual_network_ids is not None :
+
params [ "virtualNetworkIDs" ] = virtual_network_ids
+
if virtual_network_tags is not None :
+
params [ "virtualNetworkTags" ] = virtual_network_tags
+
+
# There is no adaptor.
return self . send_request (
-
'AddVirtualNetwork' ,
-
AddVirtualNetworkResult ,
+
'ListVirtualNetworks' ,
+
ListVirtualNetworksResult ,
params ,
-
since = 7.0 ,
+
since = 7.0
)
[docs] def modify_virtual_network (
@@ -4023,77 +4320,45 @@
Source code for solidfire
namespace = OPTIONAL ,
attributes = OPTIONAL ,):
"""
- *modify_virtual_network* is used to change various attributes of a
- *virtual_network* object. This method can be used to add or remove
- address blocks, change the netmask IP, or modify the name or
- description of the virtual network.
+ You can use ModifyVirtualNetwork to change the attributes of an existing virtual network. This method enables you to add or remove
+ address blocks, change the netmask, or modify the name or description of the virtual network. You can also use it to enable or
+ disable namespaces, as well as add or remove a gateway if namespaces are enabled on the virtual network.
+ Note: This method requires either the VirtualNetworkID or the VirtualNetworkTag as a parameter, but not both.
+ Caution: Enabling or disabling the Routable Storage VLANs functionality for an existing virtual network by changing the
+ "namespace" parameter disrupts any traffic handled by the virtual network. NetApp strongly recommends changing the
+ "namespace" parameter only during a scheduled maintenance window.
+ :param virtualNetworkID: The unique identifier of the virtual network to modify. This is the virtual network ID assigned by the cluster. Note: This parameter is optional but either virtualNetworkID or virtualNetworkTag must be specified with this API method.
+ :type virtualNetworkID: int
+ :param virtualNetworkTag: The network tag that identifies the virtual network to modify. Note: This parameter is optional but either virtualNetworkID or virtualNetworkTag must be specified with this API method.
+ :type virtualNetworkTag: int
-
-
- **Note:** This method requires either the *virtual_network_id* or the
- *virtual_network_tag* as a parameter, but not both.
-
- :param virtual_network_id: (optional) Unique identifier of the virtual
- network to modify. This is the virtual network ID assigned by the
- SolidFire cluster.
- :type virtual_network_id: int
-
- :param virtual_network_tag: (optional) Network Tag that identifies the
- virtual network to modify.
- :type virtual_network_tag: int
-
- :param name: (optional) New name for the virtual network.
+ :param name: The new name for the virtual network.
:type name: str
- :param address_blocks: (optional) New *address_block* to set for this
- Virtual Network object. This may contain new address blocks to add
- to the existing object or it may omit unused address blocks that
- need to be removed. Alternatively, existing address blocks may be
- extended or reduced in size. The size of the starting
- *address_blocks* for a Virtual Network object can only be
- increased, and can never be decreased. Attributes for this
- parameter are:
-
- **start:** start of the IP address range. (String)
-
- **size:** numbre of IP addresses to include in the block. (Integer)
-
- :type address_blocks: AddressBlock[]
+ :param addressBlocks: The new addressBlock to set for this virtual network. This might contain new address blocks to add to the existing object or omit unused address blocks that need to be removed. Alternatively, you can extend or reduce the size of existing address blocks. You can only increase the size of the starting addressBlocks for a virtual network object; you can never decrease it. Attributes for this parameter are: start: The start of the IP address range. (String) size: The number of IP addresses to include in the block. (Integer)
+ :type addressBlocks: AddressBlockParams
- :param netmask: (optional) New netmask for this virtual network.
+ :param netmask: New network mask for this virtual network.
:type netmask: str
- :param svip: (optional) The storage virtual IP address for this virtual
- network. The svip for Virtual Network cannot be changed. A new
- Virtual Network must be created in order to use a different svip
- address.
+ :param svip: The storage virtual IP address for this virtual network. The svip for a virtual network cannot be changed. You must create a new virtual network to use a different svip address.
:type svip: str
- :param gateway: (optional)
+ :param gateway: The IP address of a gateway of the virtual network. This parameter is only valid if the "namespace" parameter is set to true.
:type gateway: str
- :param namespace: (optional)
+ :param namespace: When set to true, enables Routable Storage VLANs functionality by recreating the virtual network and configuring a namespace to contain it. When set to false, disables the VRF functionality for the virtual network. Changing this value disrupts traffic running through this virtual network.
:type namespace: bool
- :param attributes: (optional) A new list of Name/Value pairs in JSON
- object format.
+ :param attributes: A new list of name-value pairs in JSON object format.
:type attributes: dict
-
- :returns: a response
- :rtype: AddVirtualNetworkResult
"""
- params = {}
- self . _check_param_versions (
- 'modify_virtual_network' ,
- [
- ( "gateway" ,
- gateway , 9.0 , None ),
- ( "namespace" ,
- namespace , 9.0 , None ),
- ]
- )
+ self . _check_connection_type ( "modify_virtual_network" , "Cluster" )
+
+ params = {
+ }
if virtual_network_id is not None :
params [ "virtualNetworkID" ] = virtual_network_id
if virtual_network_tag is not None :
@@ -4107,17 +4372,26 @@ Source code for solidfire
if svip is not None :
params [ "svip" ] = svip
if gateway is not None :
- params [ "gateway" ] = gateway
+ if self . api_version < 9.0 :
+ raise ApiParameterVersionError ( "modify_virtual_network" , 9.0 ,
+ [( "gateway" , gateway , 9.0 , False )])
+ else :
+ params [ "gateway" ] = gateway
if namespace is not None :
- params [ "namespace" ] = namespace
+ if self . api_version < 9.0 :
+ raise ApiParameterVersionError ( "modify_virtual_network" , 9.0 ,
+ [( "namespace" , namespace , 9.0 , False )])
+ else :
+ params [ "namespace" ] = namespace
if attributes is not None :
params [ "attributes" ] = attributes
-
+
+ # There is no adaptor.
return self . send_request (
'ModifyVirtualNetwork' ,
AddVirtualNetworkResult ,
params ,
- since = 7.0 ,
+ since = 7.0
)
[docs] def remove_virtual_network (
@@ -4125,201 +4399,374 @@
Source code for solidfire
virtual_network_id = OPTIONAL ,
virtual_network_tag = OPTIONAL ,):
"""
- *remove_virtual_network* is used to remove a previously added virtual
- network.
-
-
-
+ RemoveVirtualNetwork enables you to remove a previously added virtual network.
+ Note: This method requires either the virtualNetworkID or the virtualNetworkTag as a parameter, but not both.
+ :param virtualNetworkID: Network ID that identifies the virtual network to remove.
+ :type virtualNetworkID: int
- **Note:** This method requires either the *virtual_network_id* of the
- *virtual_network_tag* as a parameter, but not both.
-
- :param virtual_network_id: (optional) Network ID that identifies the
- virtual network to remove.
- :type virtual_network_id: int
-
- :param virtual_network_tag: (optional) Network Tag that identifies the
- virtual network to remove.
- :type virtual_network_tag: int
-
- :returns: a response
- :rtype: RemoveVirtualNetworkResult
+ :param virtualNetworkTag: Network tag that identifies the virtual network to remove.
+ :type virtualNetworkTag: int
"""
- params = {}
+ self . _check_connection_type ( "remove_virtual_network" , "Cluster" )
+
+ params = {
+ }
if virtual_network_id is not None :
params [ "virtualNetworkID" ] = virtual_network_id
if virtual_network_tag is not None :
params [ "virtualNetworkTag" ] = virtual_network_tag
-
+
+ # There is no adaptor.
return self . send_request (
'RemoveVirtualNetwork' ,
RemoveVirtualNetworkResult ,
params ,
- since = 7.0 ,
+ since = 7.0
)
-
[docs] def clone_volume (
+
[docs] def enable_feature (
self ,
-
volume_id ,
-
name ,
-
new_account_id = OPTIONAL ,
-
new_size = OPTIONAL ,
-
access = OPTIONAL ,
-
snapshot_id = OPTIONAL ,
-
attributes = OPTIONAL ,):
+
feature ,):
"""
-
*clone_volume* is used to create a copy of the volume.
-
This method is asynchronous and may take a variable amount of time to
-
complete.
-
The cloning process begins immediately when the *clone_volume* request
-
is made and is representative of the state of the volume when the API
-
method is issued.
-
*get_async_results* can be used to determine when the cloning process
-
is complete and the new volume is available for connections.
-
*list_sync_jobs* can be used to see the progress of creating the clone.
+
You can use EnableFeature to enable cluster features that are disabled by default.
+
:param feature: [required] Indicates which feature to enable. Valid value is: vvols: Enable the NetApp SolidFire VVols cluster feature.
+
:type feature: str
+
"""
+
self . _check_connection_type ( "enable_feature" , "Cluster" )
+
params = {
+
"feature" : feature ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'EnableFeature' ,
+
EnableFeatureResult ,
+
params ,
+
since = 9.0
+
)
+
[docs] def get_feature_status (
+
self ,
+
feature = OPTIONAL ,):
+
"""
+
GetFeatureStatus enables you to retrieve the status of a cluster feature.
+
:param feature: Specifies the feature for which the status is returned. Valid value is: vvols: Retrieve status for the NetApp SolidFire VVols cluster feature.
+
:type feature: str
+
"""
-
**Note**: The initial attributes and quality of service settings for
-
the volume are inherited from the volume being cloned.
-
If different settings are required, they can be changed via
-
ModifyVolume.
+
self . _check_connection_type ( "get_feature_status" , "Cluster" )
+
params = {
+
}
+
if feature is not None :
+
params [ "feature" ] = feature
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetFeatureStatus' ,
+
GetFeatureStatusResult ,
+
params ,
+
since = 9.0
+
)
+
[docs] def get_virtual_volume_count (
+
self ,):
+
"""
+
Enables retrieval of the number of virtual volumes currently in the system. """
+
self . _check_connection_type ( "get_virtual_volume_count" , "Cluster" )
-
**Note**: Cloned volumes do not inherit volume access group memberships
-
from the source volume.
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetVirtualVolumeCount' ,
+
GetVirtualVolumeCountResult ,
+
params ,
+
since = 9.0
+
)
-
:param volume_id: [required] The ID of the volume to clone.
-
:type volume_id: int
+
[docs] def list_protocol_endpoints (
+
self ,
+
protocol_endpoint_ids = OPTIONAL ,):
+
"""
+
ListProtocolEndpoints enables you to retrieve information about all protocol endpoints in the cluster. Protocol endpoints govern
+
access to their associated virtual volume storage containers.
+
:param protocolEndpointIDs: A list of protocol endpoint IDs for which to retrieve information. If you omit this parameter, the method returns information about all protocol endpoints.
+
:type protocolEndpointIDs: UUID
+
"""
-
:param name: [required] The name for the newly-created volume.
-
:type name: str
+
self . _check_connection_type ( "list_protocol_endpoints" , "Cluster" )
-
:param new_account_id: (optional) *account_id* for the owner of the new
-
volume. If unspecified, the *account_id* of the owner of the volume
-
being cloned is used.
-
:type new_account_id: int
+
params = {
+
}
+
if protocol_endpoint_ids is not None :
+
params [ "protocolEndpointIDs" ] = protocol_endpoint_ids
+
+
# There is no adaptor.
+
return self . send_request (
+
'ListProtocolEndpoints' ,
+
ListProtocolEndpointsResult ,
+
params ,
+
since = 9.0
+
)
-
:param new_size: (optional) New size of the volume, in bytes. May be
-
greater or less than the size of the volume being cloned. If
-
unspecified, the clone's volume size will be the same as the source
-
volume. Size is rounded up to the nearest 1 MiB.
-
:type new_size: int
+
[docs] def list_virtual_volume_bindings (
+
self ,
+
virtual_volume_binding_ids = OPTIONAL ,):
+
"""
+
ListVirtualVolumeBindings returns a list of all virtual volumes in the cluster that are bound to protocol endpoints.
+
:param virtualVolumeBindingIDs: A list of virtual volume binding IDs for which to retrieve information. If you omit this parameter, the method returns information about all virtual volume bindings.
+
:type virtualVolumeBindingIDs: int
+
"""
-
:param access: (optional) Access settings for the new volume.
+
self . _check_connection_type ( "list_virtual_volume_bindings" , "Cluster" )
-
**readOnly**: Only read operations are allowed.
+
params = {
+
}
+
if virtual_volume_binding_ids is not None :
+
params [ "virtualVolumeBindingIDs" ] = virtual_volume_binding_ids
+
+
# There is no adaptor.
+
return self . send_request (
+
'ListVirtualVolumeBindings' ,
+
ListVirtualVolumeBindingsResult ,
+
params ,
+
since = 9.0
+
)
-
**readWrite**: Reads and writes are allowed.
+
[docs] def list_virtual_volume_hosts (
+
self ,
+
virtual_volume_host_ids = OPTIONAL ,):
+
"""
+
ListVirtualVolumeHosts returns a list of all virtual volume hosts known to the cluster. A virtual volume host is a VMware ESX host
+
that has initiated a session with the VASA API provider.
+
:param virtualVolumeHostIDs: A list of virtual volume host IDs for which to retrieve information. If you omit this parameter, the method returns information about all virtual volume hosts.
+
:type virtualVolumeHostIDs: UUID
+
"""
-
**locked**: No reads or writes are allowed.
+
self . _check_connection_type ( "list_virtual_volume_hosts" , "Cluster" )
-
**replicationTarget**: Identify a volume as the target volume for a
-
paired set of volumes. If the volume is not paired, the access
-
status is locked.
+
params = {
+
}
+
if virtual_volume_host_ids is not None :
+
params [ "virtualVolumeHostIDs" ] = virtual_volume_host_ids
+
+
# There is no adaptor.
+
return self . send_request (
+
'ListVirtualVolumeHosts' ,
+
ListVirtualVolumeHostsResult ,
+
params ,
+
since = 9.0
+
)
-
If unspecified, the access settings of the clone will be the same
-
as the source.
+
[docs] def list_virtual_volumes (
+
self ,
+
details = OPTIONAL ,
+
limit = OPTIONAL ,
+
recursive = OPTIONAL ,
+
start_virtual_volume_id = OPTIONAL ,
+
virtual_volume_ids = OPTIONAL ,):
+
"""
+
ListVirtualVolumes enables you to list the virtual volumes currently in the system. You can use this method to list all virtual volumes,
+
or only list a subset.
+
:param details: Specifies the level of detail about each virtual volume that is returned. Possible values are: true: Include more details about each virtual volume in the response. false: Include the standard level of detail about each virtual volume in the response.
+
:type details: bool
-
:type access: str
+
:param limit: The maximum number of virtual volumes to list.
+
:type limit: int
-
:param snapshot_id: (optional) ID of the snapshot to use as the source
-
of the clone. If unspecified, the clone will be created with a
-
snapshot of the active volume.
-
:type snapshot_id: int
+
:param recursive: Specifies whether to include information about the children of each virtual volume in the response. Possible values are: true: Include information about the children of each virtual volume in the response. false: Do not include information about the children of each virtual volume in the response.
+
:type recursive: bool
-
:param attributes: (optional) List of Name/Value pairs in JSON object
-
format.
-
:type attributes: dict
+
:param startVirtualVolumeID: The ID of the virtual volume at which to begin the list.
+
:type startVirtualVolumeID: UUID
-
:returns: a response
-
:rtype: CloneVolumeResult
+
:param virtualVolumeIDs: A list of virtual volume IDs for which to retrieve information. If you specify this parameter, the method returns information about only these virtual volumes.
+
:type virtualVolumeIDs: UUID
"""
-
params = {
-
"volumeID" : volume_id ,
-
"name" : name ,
+
self . _check_connection_type ( "list_virtual_volumes" , "Cluster" )
+
+
params = {
}
-
if new_account_id is not None :
-
params [ "newAccountID" ] = new_account_id
-
if new_size is not None :
-
params [ "newSize" ] = new_size
-
if access is not None :
-
params [ "access" ] = access
-
if snapshot_id is not None :
-
params [ "snapshotID" ] = snapshot_id
-
if attributes is not None :
-
params [ "attributes" ] = attributes
+
if details is not None :
+
params [ "details" ] = details
+
if limit is not None :
+
params [ "limit" ] = limit
+
if recursive is not None :
+
params [ "recursive" ] = recursive
+
if start_virtual_volume_id is not None :
+
params [ "startVirtualVolumeID" ] = start_virtual_volume_id
+
if virtual_volume_ids is not None :
+
params [ "virtualVolumeIDs" ] = virtual_volume_ids
+
+
# There is no adaptor.
+
return self . send_request (
+
'ListVirtualVolumes' ,
+
ListVirtualVolumesResult ,
+
params ,
+
since = 9.0
+
)
+
+
[docs] def list_virtual_volume_tasks (
+
self ,
+
virtual_volume_task_ids = OPTIONAL ,):
+
"""
+
ListVirtualVolumeTasks returns a list of virtual volume tasks in the system.
+
:param virtualVolumeTaskIDs: A list of virtual volume task IDs for which to retrieve information. If you omit this parameter, the method returns information about all virtual volume tasks.
+
:type virtualVolumeTaskIDs: UUID
+
"""
+
self . _check_connection_type ( "list_virtual_volume_tasks" , "Cluster" )
+
+
params = {
+
}
+
if virtual_volume_task_ids is not None :
+
params [ "virtualVolumeTaskIDs" ] = virtual_volume_task_ids
+
+
# There is no adaptor.
return self . send_request (
-
'CloneVolume' ,
-
CloneVolumeResult ,
+
'ListVirtualVolumeTasks' ,
+
ListVirtualVolumeTasksResult ,
params ,
+
since = 9.0
)
-
[docs] def clone_multiple_volumes (
+
[docs] def list_volume_stats_by_virtual_volume (
self ,
-
volumes ,
-
access = OPTIONAL ,
-
group_snapshot_id = OPTIONAL ,
-
new_account_id = OPTIONAL ,):
+
virtual_volume_ids = OPTIONAL ,):
"""
-
*clone_multiple_volumes* is used to create a clone of a group of
-
specified volumes. A consistent set of characteristics can be assigned
-
to a group of multiple volume when they are cloned together.
-
If *group_snapshot_id* is going to be used to clone the volumes in a
-
group snapshot, the group snapshot must be created first using the
-
*create_group_snapshot* API method or the SolidFire Element WebUI.
-
Using *group_snapshot_id* is optional when cloning multiple volumes.
+
ListVolumeStatsByVirtualVolume enables you to list volume statistics for any volumes in the system that are associated with virtual volumes. Statistics are cumulative from the creation of the volume.
+
:param virtualVolumeIDs: A list of one or more virtual volume IDs for which to retrieve information. If you specify this parameter, the method returns information about only these virtual volumes.
+
:type virtualVolumeIDs: UUID
+
"""
+
+
self . _check_connection_type ( "list_volume_stats_by_virtual_volume" , "Cluster" )
+
+
params = {
+
}
+
if virtual_volume_ids is not None :
+
params [ "virtualVolumeIDs" ] = virtual_volume_ids
+
+
# There is no adaptor.
+
return self . send_request (
+
'ListVolumeStatsByVirtualVolume' ,
+
ListVolumeStatsByVirtualVolumeResult ,
+
params ,
+
since = 9.0
+
)
+
[docs] def add_volumes_to_volume_access_group (
+
self ,
+
volume_access_group_id ,
+
volumes ,):
+
"""
+
AddVolumesToVolumeAccessGroup enables you to add
+
volumes to a specified volume access group.
+
:param volumeAccessGroupID: [required] The ID of the volume access group to which volumes are added.
+
:type volumeAccessGroupID: int
+
:param volumes: [required] The list of volumes to add to the volume access group.
+
:type volumes: int
+
"""
+
self . _check_connection_type ( "add_volumes_to_volume_access_group" , "Cluster" )
-
**Note**: Cloning multiple volumes is allowed if cluster fullness is at
-
stage 2 or 3. Clones are not created when cluster fullness is at stage
-
4 or 5.
+
params = {
+
"volumeAccessGroupID" : volume_access_group_id ,
+
"volumes" : volumes ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'AddVolumesToVolumeAccessGroup' ,
+
ModifyVolumeAccessGroupResult ,
+
params ,
+
since = 5.0
+
)
-
:param volumes: [required] Array of Unique ID for each volume to
-
include in the clone with optional parameters. If optional
-
parameters are not specified, the values will be inherited from the
-
source volumes.
-
:type volumes: CloneMultipleVolumeParams[]
+
[docs] def cancel_clone (
+
self ,
+
clone_id ,):
+
"""
+
CancelClone enables you to stop an ongoing CloneVolume or CopyVolume process. When you cancel a group clone operation, the
+
system completes and removes the operation's associated asyncHandle.
+
:param cloneID: [required] The cloneID for the ongoing clone process.
+
:type cloneID: int
+
"""
-
:param access: (optional) New default access method for the new volumes
-
if not overridden by information passed in the volumes array.
+
self . _check_connection_type ( "cancel_clone" , "Cluster" )
-
**readOnly**: Only read operations are allowed.
+
params = {
+
"cloneID" : clone_id ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'CancelClone' ,
+
CancelCloneResult ,
+
params ,
+
since = 9.0
+
)
-
**readWrite**: Reads and writes are allowed.
+
[docs] def cancel_group_clone (
+
self ,
+
group_clone_id ,):
+
"""
+
CancelGroupClone enables you to stop an ongoing CloneMultipleVolumes process occurring on a group of volumes. When you cancel
+
a group clone operation, the system completes and removes the operation's associated asyncHandle.
+
:param groupCloneID: [required] The cloneID for the ongoing clone process.
+
:type groupCloneID: int
+
"""
-
**locked**: No reads or writes are allowed.
+
self . _check_connection_type ( "cancel_group_clone" , "Cluster" )
-
**replicationTarget**: Identify a volume as the target volume for a
-
paired set of volumes. If the volume is not paired, the access
-
status is locked.
+
params = {
+
"groupCloneID" : group_clone_id ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'CancelGroupClone' ,
+
CancelGroupCloneResult ,
+
params ,
+
since = 9.0
+
)
-
If unspecified, the access settings of the clone will be the same
-
as the source.
+
[docs] def clone_multiple_volumes (
+
self ,
+
volumes ,
+
access = OPTIONAL ,
+
group_snapshot_id = OPTIONAL ,
+
new_account_id = OPTIONAL ,):
+
"""
+
CloneMultipleVolumes enables you to create a clone of a group of specified volumes. You can assign a consistent set of characteristics
+
to a group of multiple volumes when they are cloned together.
+
Before using groupSnapshotID to clone the volumes in a group snapshot, you must create the group snapshot by using the
+
CreateGroupSnapshot API method or the Element OS Web UI. Using groupSnapshotID is optional when cloning multiple volumes.
+
Note: Cloning multiple volumes is allowed if cluster fullness is at stage 2 or 3. Clones are not created when cluster fullness is
+
at stage 4 or 5.
+
:param volumes: [required] Unique ID for each volume to include in the clone. If optional parameters are not specified, the values are inherited from the source volumes. Required parameter for "volumes" array: volumeID Optional parameters for "volumes" array: access: Can be one of readOnly, readWrite, locked, or replicationTarget attributes: List of name-value pairs in JSON object format. name: New name for the clone. newAccountID: Account ID for the new volumes. newSize: New size Total size of the volume, in bytes. Size is rounded up to the nearest 1MB.
+
:type volumes: CloneMultipleVolumeParams
+
:param access: New default access method for the new volumes if not overridden by information passed in the volume's array.
:type access: str
-
:param group_snapshot_id: (optional) ID of the group snapshot to use as
-
a basis for the clone.
-
:type group_snapshot_id: int
+
:param groupSnapshotID: ID of the group snapshot to use as a basis for the clone.
+
:type groupSnapshotID: int
-
:param new_account_id: (optional) New account ID for the volumes if not
-
overridden by information passed in the volumes array.
-
:type new_account_id: int
-
-
:returns: a response
-
:rtype: CloneMultipleVolumesResult
+
:param newAccountID: New account ID for the volumes if not overridden by information passed in the volumes array.
+
:type newAccountID: int
"""
-
params = {
+
self . _check_connection_type ( "clone_multiple_volumes" , "Cluster" )
+
+
params = {
"volumes" : volumes ,
}
if access is not None :
@@ -4328,11 +4775,119 @@
Source code for solidfire
params [ "groupSnapshotID" ] = group_snapshot_id
if new_account_id is not None :
params [ "newAccountID" ] = new_account_id
-
+
+ # There is no adaptor.
return self . send_request (
'CloneMultipleVolumes' ,
CloneMultipleVolumesResult ,
params ,
+ since = 7.0
+ )
+
+
[docs] def clone_volume (
+
self ,
+
volume_id ,
+
name ,
+
new_account_id = OPTIONAL ,
+
new_size = OPTIONAL ,
+
access = OPTIONAL ,
+
snapshot_id = OPTIONAL ,
+
attributes = OPTIONAL ,
+
enable512e = OPTIONAL ,):
+
"""
+
CloneVolume enables you to create a copy of a volume. This method is asynchronous and might take a variable amount of time to complete. The cloning process begins immediately when you make the CloneVolume request and is representative of the state of the volume when the API method is issued. You can use the GetAsyncResult method to determine when the cloning process is complete and the new volume is available for connections. You can use ListSyncJobs to see the progress of creating the clone.
+
Note: The initial attributes and QoS settings for the volume are inherited from the volume being cloned. You can change these settings with ModifyVolume.
+
Note: Cloned volumes do not inherit volume access group memberships from the source volume.
+
:param volumeID: [required] VolumeID for the volume to be cloned.
+
:type volumeID: int
+
+
:param name: [required] The name of the new cloned volume. Might be 1 to 64 characters in length.
+
:type name: str
+
+
:param newAccountID: AccountID for the owner of the new volume. If unspecified, the accountID of the owner of the volume being cloned is used.
+
:type newAccountID: int
+
+
:param newSize: New size of the volume, in bytes. Might be greater or less than the size of the volume being cloned. If unspecified, the volume size is not changed. Size is rounded to the nearest 1MB.
+
:type newSize: int
+
+
:param access: Specifies the level of access allowed for the new volume. Possible values are: readOnly: Only read operations are allowed. readWrite: Reads and writes are allowed. locked: No reads or writes are allowed. If unspecified, the level of access of the volume being cloned is used. replicationTarget: Identify a volume as the target volume for a paired set of volumes. If the volume is not paired, the access status is locked. If a value is not specified, the access value does not change.
+
:type access: str
+
+
:param snapshotID: ID of the snapshot that is used as the source of the clone. If no ID is provided, the current active volume is used.
+
:type snapshotID: int
+
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
+
+
:param enable512e: Should the volume provide 512-byte sector emulation?
+
:type enable512e: bool
+
"""
+
+
self . _check_connection_type ( "clone_volume" , "Cluster" )
+
+
params = {
+
"volumeID" : volume_id ,
+
"name" : name ,
+
}
+
if new_account_id is not None :
+
params [ "newAccountID" ] = new_account_id
+
if new_size is not None :
+
params [ "newSize" ] = new_size
+
if access is not None :
+
params [ "access" ] = access
+
if snapshot_id is not None :
+
params [ "snapshotID" ] = snapshot_id
+
if attributes is not None :
+
params [ "attributes" ] = attributes
+
if enable512e is not None :
+
params [ "enable512e" ] = enable512e
+
+
# There is no adaptor.
+
return self . send_request (
+
'CloneVolume' ,
+
CloneVolumeResult ,
+
params ,
+
since = 1.0
+
)
+
+
[docs] def copy_volume (
+
self ,
+
volume_id ,
+
dst_volume_id ,
+
snapshot_id = OPTIONAL ,):
+
"""
+
CopyVolume enables you to overwrite the data contents of an existing volume with the data contents of another volume (or
+
snapshot). Attributes of the destination volume such as IQN, QoS settings, size, account, and volume access group membership are
+
not changed. The destination volume must already exist and must be the same size as the source volume.
+
NetApp strongly recommends that clients unmount the destination volume before the CopyVolume operation begins. If the
+
destination volume is modified during the copy operation, the changes will be lost.
+
This method is asynchronous and may take a variable amount of time to complete. You can use the GetAsyncResult method to
+
determine when the process has finished, and ListSyncJobs to see the progress of the copy.
+
:param volumeID: [required] VolumeID of the volume to be read from.
+
:type volumeID: int
+
+
:param dstVolumeID: [required] VolumeID of the volume to be overwritten.
+
:type dstVolumeID: int
+
+
:param snapshotID: ID of the snapshot that is used as the source of the clone. If no ID is provided, the current active volume is used.
+
:type snapshotID: int
+
"""
+
+
self . _check_connection_type ( "copy_volume" , "Cluster" )
+
+
params = {
+
"volumeID" : volume_id ,
+
"dstVolumeID" : dst_volume_id ,
+
}
+
if snapshot_id is not None :
+
params [ "snapshotID" ] = snapshot_id
+
+
# There is no adaptor.
+
return self . send_request (
+
'CopyVolume' ,
+
CopyVolumeResult ,
+
params ,
+
since = 9.0
)
[docs] def create_volume (
@@ -4344,44 +4899,30 @@
Source code for solidfire
qos = OPTIONAL ,
attributes = OPTIONAL ,):
"""
- *create_volume* is used to create a new (empty) volume on the cluster.
- When the volume is created successfully it is available for connection
- via iSCSI.
-
- :param name: [required] Name of the volume. Not required to be unique,
- but it is recommended. May be 1 to 64 characters in length.
+ CreateVolume enables you to create a new (empty) volume on the cluster. As soon as the volume creation is complete, the volume is
+ available for connection via iSCSI.
+ :param name: [required] The name of the volume access group (might be user specified). Not required to be unique, but recommended. Might be 1 to 64 characters in length.
:type name: str
- :param account_id: [required] *account_id* for the owner of this
- volume.
- :type account_id: int
+ :param accountID: [required] AccountID for the owner of this volume.
+ :type accountID: int
- :param total_size: [required] Total size of the volume, in bytes. Size
- is rounded up to the nearest 1MB size.
- :type total_size: int
+ :param totalSize: [required] Total size of the volume, in bytes. Size is rounded up to the nearest 1MB size.
+ :type totalSize: int
- :param enable512e: [required] Should the volume provides 512-byte
- sector emulation?
+ :param enable512e: [required] Specifies whether 512e emulation is enabled or not. Possible values are: true: The volume provides 512-byte sector emulation. false: 512e emulation is not enabled.
:type enable512e: bool
- :param qos: (optional) Initial quality of service settings for this
- volume.
-
- Volumes created without specified *qos* values are created with the
- default values for QoS. Default values for a volume can be found by
- running the *get_default_qos* method.
-
+ :param qos: Initial quality of service settings for this volume. Default values are used if none are specified. Valid settings are: minIOPS maxIOPS burstIOPS You can get the default values for a volume by using the GetDefaultQoS method.
:type qos: QoS
- :param attributes: (optional) List of Name/Value pairs in JSON object
- format.
+ :param attributes: The list of name-value pairs in JSON object format. Total attribute size must be less than 1000B, or 1KB, including JSON formatting characters.
:type attributes: dict
-
- :returns: a response
- :rtype: CreateVolumeResult
"""
- params = {
+ self . _check_connection_type ( "create_volume" , "Cluster" )
+
+ params = {
"name" : name ,
"accountID" : account_id ,
"totalSize" : total_size ,
@@ -4391,216 +4932,269 @@ Source code for solidfire
params [ "qos" ] = qos
if attributes is not None :
params [ "attributes" ] = attributes
-
+
+ # There is no adaptor.
return self . send_request (
'CreateVolume' ,
CreateVolumeResult ,
params ,
+ since = 1.0
)
[docs] def delete_volume (
self ,
volume_id ,):
"""
-
*delete_volume* marks an active volume for deletion.
-
It is purged (permanently deleted) after the cleanup interval elapses.
-
After making a request to delete a volume, any active iSCSI connections
-
to the volume is immediately terminated and no further connections are
-
allowed while the volume is in this state.
-
It is not returned in target discovery requests.
-
-
-
-
-
Any snapshots of a volume that has been marked to delete are not
-
affected.
-
Snapshots are kept until the volume is purged from the system.
-
-
-
-
-
If a volume is marked for deletion, and it has a bulk volume read or
-
bulk volume write operation in progress, the bulk volume operation is
-
stopped.
-
-
-
-
-
If the volume you delete is paired with a volume, replication between
-
the paired volumes is suspended and no data is transferred to it or
-
from it while in a deleted state.
-
The remote volume the deleted volume was paired with enters into a
-
*paused_misconfigured* state and data is no longer sent to it or from
-
the deleted volume.
-
Until the deleted volume is purged, it can be restored and data
-
transfers resumes.
-
If the deleted volume gets purged from the system, the volume it was
-
paired with enters into a *stopped_misconfigured* state and the volume
-
pairing status is removed.
-
The purged volume becomes permanently unavailable.
-
-
:param volume_id: [required] The ID of the volume to delete.
-
:type volume_id: int
-
-
:returns: a response
-
:rtype: DeleteVolumeResult
+
DeleteVolume marks an active volume for deletion. When marked, the volume is purged (permanently deleted) after the cleanup
+
interval elapses. After making a request to delete a volume, any active iSCSI connections to the volume are immediately terminated
+
and no further connections are allowed while the volume is in this state. A marked volume is not returned in target discovery
+
requests.
+
Any snapshots of a volume that has been marked for deletion are not affected. Snapshots are kept until the volume is purged from
+
the system.
+
If a volume is marked for deletion and has a bulk volume read or bulk volume write operation in progress, the bulk volume read or
+
write operation is stopped.
+
If the volume you delete is paired with a volume, replication between the paired volumes is suspended and no data is transferred
+
to it or from it while in a deleted state. The remote volume that the deleted volume was paired with enters into a PausedMisconfigured state and data is no longer sent to it or from the deleted volume. Until the deleted volume is purged, it can be restored and data transfers resume. If the deleted volume gets purged from the system, the volume it was paired with enters into a StoppedMisconfigured state and the volume pairing status is removed. The purged volume becomes permanently unavailable.
+
:param volumeID: [required] The ID of the volume to be deleted.
+
:type volumeID: int
"""
-
params = {
+
self . _check_connection_type ( "delete_volume" , "Cluster" )
+
+
params = {
"volumeID" : volume_id ,
}
-
+
+
# There is no adaptor.
return self . send_request (
'DeleteVolume' ,
DeleteVolumeResult ,
params ,
+
since = 1.0
)
-[docs] def get_volume_stats (
+
[docs] def delete_volumes (
self ,
-
volume_id ,):
+
account_ids = OPTIONAL ,
+
volume_access_group_ids = OPTIONAL ,
+
volume_ids = OPTIONAL ,):
"""
-
*get_volume_stats* is used to retrieve high-level activity measurements
-
for a single volume.
-
Values are cumulative from the creation of the volume.
+
DeleteVolumes marks multiple (up to 500) active volumes for deletion.
+
Once marked, the volumes are purged (permanently deleted) after the cleanup interval elapses.
+
The cleanup interval can be set in the SetClusterSettings method.
+
For more information on using this method, see SetClusterSettings on page 1.
+
After making a request to delete volumes, any active iSCSI connections to the volumes are immediately terminated
+
and no further connections are allowed while the volumes are in this state.
+
A marked volume is not returned in target discovery requests.
+
Any snapshots of a volume that has been marked for deletion are not affected.
+
Snapshots are kept until the volume is purged from the system.
+
If a volume is marked for deletion and has a bulk volume read or bulk volume write operation in progress,
+
the bulk volume read or write operation is stopped.
+
If the volumes you delete are paired with a volume, replication between the paired volumes is suspended
+
and no data is transferred to them or from them while in a deleted state.
+
The remote volumes the deleted volumes were paired with enter into a PausedMisconfigured state
+
and data is no longer sent to them or from the deleted volumes.
+
Until the deleted volumes are purged, they can be restored and data transfers resume.
+
If the deleted volumes are purged from the system, the volumes they were paired with enter into a
+
StoppedMisconfigured state and the volume pairing status is removed.
+
The purged volumes become permanently unavailable.
+
:param accountIDs: A list of account IDs. All volumes from these accounts are deleted from the system.
+
:type accountIDs: int
-
:param volume_id: [required] Specifies the volume for which statistics
-
is gathered.
-
:type volume_id: int
+
:param volumeAccessGroupIDs: A list of volume access group IDs. All of the volumes from all of the volume access groups you specify in this list are deleted from the system.
+
:type volumeAccessGroupIDs: int
-
:returns: a response
-
:rtype: GetVolumeStatsResult
+
:param volumeIDs: The list of IDs of the volumes to delete from the system.
+
:type volumeIDs: int
"""
-
params = {
-
"volumeID" : volume_id ,
+
self . _check_connection_type ( "delete_volumes" , "Cluster" )
+
+
params = {
}
+
if account_ids is not None :
+
params [ "accountIDs" ] = account_ids
+
if volume_access_group_ids is not None :
+
params [ "volumeAccessGroupIDs" ] = volume_access_group_ids
+
if volume_ids is not None :
+
params [ "volumeIDs" ] = volume_ids
+
+
# There is no adaptor.
+
return self . send_request (
+
'DeleteVolumes' ,
+
DeleteVolumesResult ,
+
params ,
+
since = 9.0
+
)
+
+
[docs] def get_default_qos (
+
self ,):
+
"""
+
GetDefaultQoS enables you to retrieve the default QoS values for a newly created volume. """
+
self . _check_connection_type ( "get_default_qos" , "Cluster" )
+
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'GetVolumeStats' ,
-
GetVolumeStatsResult ,
+
'GetDefaultQoS' ,
+
VolumeQOS ,
params ,
+
since = 1.0
)
-
[docs] def get_volume_efficiency (
-
self ,
-
volume_id ,
-
force = OPTIONAL ,):
+
[docs] def get_volume_count (
+
self ,):
"""
-
*get_volume_efficiency* is used to retrieve information about a volume.
-
Only the volume given as a parameter in this API method is used to
-
compute the capacity.
+
GetVolumeCount enables you to retrieve the number of volumes currently in the system. """
-
:param volume_id: [required] Specifies the volume for which capacity is
-
computed.
-
:type volume_id: int
+
self . _check_connection_type ( "get_volume_count" , "Cluster" )
-
:param force: (optional)
-
:type force: bool
+
params = {
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'GetVolumeCount' ,
+
GetVolumeCountResult ,
+
params ,
+
since = 9.0
+
)
-
:returns: a response
-
:rtype: GetVolumeEfficiencyResult
+
[docs] def get_volume_efficiency (
+
self ,
+
volume_id ,):
+
"""
+
GetVolumeEfficiency enables you to retrieve information about a volume. Only the volume you give as a parameter in this API method is used to compute the capacity.
+
:param volumeID: [required] Specifies the volume for which capacity is computed.
+
:type volumeID: int
"""
-
params = {
+
self . _check_connection_type ( "get_volume_efficiency" , "Cluster" )
+
+
params = {
"volumeID" : volume_id ,
}
-
if force is not None :
-
params [ "force" ] = force
-
+
+
# There is no adaptor.
return self . send_request (
'GetVolumeEfficiency' ,
GetVolumeEfficiencyResult ,
params ,
+
since = 6.0
)
-
[docs] def list_bulk_volume_jobs (
-
self ,):
+
[docs] def get_volume_stats (
+
self ,
+
volume_id ,):
"""
-
*list_bulk_volume_jobs* is used to return information about each bulk
-
volume read or write operation that is occurring in the system.
-
-
:returns: a response
-
:rtype: ListBulkVolumeJobsResult
+
GetVolumeStats enables you to retrieve high-level activity measurements for a single volume. Values are cumulative from the creation of the volume.
+
:param volumeID: [required] Specifies the volume for which statistics are gathered.
+
:type volumeID: int
"""
-
params = {}
+
self . _check_connection_type ( "get_volume_stats" , "Cluster" )
+
params = {
+
"volumeID" : volume_id ,
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'ListBulkVolumeJobs' ,
-
ListBulkVolumeJobsResult ,
+
'GetVolumeStats' ,
+
GetVolumeStatsResult ,
params ,
+
since = 1.0
)
[docs] def list_active_volumes (
self ,
start_volume_id = OPTIONAL ,
-
limit = OPTIONAL ,):
+
limit = OPTIONAL ,
+
include_virtual_volumes = OPTIONAL ,):
"""
-
*list_active_volumes* is used to return the list of active volumes
-
currently in the system.
-
The list of volumes is returned sorted in *volume_id* order and can be
-
returned in multiple parts (pages).
-
-
:param start_volume_id: (optional) The ID of the first volume to list.
-
This can be useful for paging results. By default, this starts at
-
the lowest VolumeID.
-
:type start_volume_id: int
+
ListActiveVolumes enables you to return the list of active volumes currently in the system. The list of volumes is returned sorted in
+
VolumeID order and can be returned in multiple parts (pages).
+
:param startVolumeID: Starting VolumeID to return. If no volume exists with this VolumeID, the next volume by VolumeID order is used as the start of the list. To page through the list, pass the VolumeID of the last volume in the previous response + 1.
+
:type startVolumeID: int
-
:param limit: (optional) The maximum number of volumes to return from
-
the API.
+
:param limit: Maximum number of Volume Info objects to return. A value of 0 (zero) returns all volumes (unlimited).
:type limit: int
-
:returns: a response
-
:rtype: ListActiveVolumesResult
+
:param includeVirtualVolumes: Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false.
+
:type includeVirtualVolumes: bool
"""
-
params = {}
+
self . _check_connection_type ( "list_active_volumes" , "Cluster" )
+
+
params = {
+
}
if start_volume_id is not None :
params [ "startVolumeID" ] = start_volume_id
if limit is not None :
params [ "limit" ] = limit
-
+
if include_virtual_volumes is not None :
+
if self . api_version < 9.0 :
+
raise ApiParameterVersionError ( "list_active_volumes" , 9.0 ,
+
[( "include_virtual_volumes" , include_virtual_volumes , 9.0 , False )])
+
else :
+
params [ "includeVirtualVolumes" ] = include_virtual_volumes
+
+
# There is no adaptor.
return self . send_request (
'ListActiveVolumes' ,
ListActiveVolumesResult ,
params ,
+
since = 1.0
)
-
[docs] def list_deleted_volumes (
+
[docs] def list_bulk_volume_jobs (
self ,):
"""
-
*list_deleted_volumes* is used to return the entire list of volumes
-
that have been marked for deletion and is purged from the system.
-
-
:returns: a response
-
:rtype: ListDeletedVolumesResult
-
"""
+
ListBulkVolumeJobs enables you to retrieve information about each bulk volume read or write operation that is occurring in the
+
system. """
-
params = {}
+
self . _check_connection_type ( "list_bulk_volume_jobs" , "Cluster" )
+
params = {
+
}
+
+
# There is no adaptor.
return self . send_request (
-
'ListDeletedVolumes' ,
-
ListDeletedVolumesResult ,
+
'ListBulkVolumeJobs' ,
+
ListBulkVolumeJobsResult ,
params ,
+
since = 6.0
)
-
[docs] def list_iscsisessions (
-
self ,):
+
[docs] def list_deleted_volumes (
+
self ,
+
include_virtual_volumes = OPTIONAL ,):
"""
-
*list_iscsisessions* is used to return iSCSI connection information for
-
volumes in the cluster.
-
-
:returns: a response
-
:rtype: ListISCSISessionsResult
+
ListDeletedVolumes enables you to retrieve the list of volumes that have been marked for deletion and purged from the system.
+
:param includeVirtualVolumes: Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false.
+
:type includeVirtualVolumes: bool
"""
-
params = {}
+
self . _check_connection_type ( "list_deleted_volumes" , "Cluster" )
+
params = {
+
}
+
if include_virtual_volumes is not None :
+
if self . api_version < 9.0 :
+
raise ApiParameterVersionError ( "list_deleted_volumes" , 9.0 ,
+
[( "include_virtual_volumes" , include_virtual_volumes , 9.0 , False )])
+
else :
+
params [ "includeVirtualVolumes" ] = include_virtual_volumes
+
+
# There is no adaptor.
return self . send_request (
-
'ListISCSISessions' ,
-
ListISCSISessionsResult ,
+
'ListDeletedVolumes' ,
+
ListDeletedVolumesResult ,
params ,
+
since = 1.0
)
[docs] def list_volumes (
@@ -4610,53 +5204,41 @@
Source code for solidfire
volume_status = OPTIONAL ,
accounts = OPTIONAL ,
is_paired = OPTIONAL ,
- volume_ids = OPTIONAL ,):
+ volume_ids = OPTIONAL ,
+ volume_name = OPTIONAL ,
+ include_virtual_volumes = OPTIONAL ,):
"""
- The *list_volumes* method is used to return a list of volumes that are
- in a cluster.
- You can specify the volumes you want to return in the list by using the
- available parameters.
+ The ListVolumes method enables you to retrieve a list of volumes that are in a cluster. You can specify the volumes you want to
+ return in the list by using the available parameters.
+ :param startVolumeID: Only volumes with an ID greater than or equal to this value are returned. Mutually exclusive with the volumeIDs parameter.
+ :type startVolumeID: int
- :param start_volume_id: (optional) The ID of the first volume to list.
- This can be useful for paging results. By default, this starts at
- the lowest VolumeID.
- :type start_volume_id: int
-
- :param limit: (optional) The maximum number of volumes to return from
- the API.
+ :param limit: Specifies the maximum number of volume results that are returned. Mutually exclusive with the volumeIDs parameter.
:type limit: int
- :param volume_status: (optional) If specified, filter to only volumes
- with the provided status. By default, list all volumes.
- :type volume_status: str
-
- :param accounts: (optional) If specified, only fetch volumes which
- belong to the provided accounts. By default, list volumes for all
- accounts.
- :type accounts: int[]
-
- :param is_paired: (optional) If specified, only fetch volumes which are
- paired (if true) or non-paired (if false). By default, list all
- volumes regardless of their pairing status.
- :type is_paired: bool
-
- :param volume_ids: (optional) If specified, only fetch volumes
- specified in this list. This option cannot be specified if
- *start_volume_id,* limit, or accounts option is specified.
- :type volume_ids: int[]
-
- :returns: a response
- :rtype: ListVolumesResult
- """
-
- params = {}
- self . _check_param_versions (
- 'list_volumes' ,
- [
- ( "volume_ids" ,
- volume_ids , 9.0 , None ),
- ]
- )
+ :param volumeStatus: Only volumes with a status equal to the status value are returned. Possible values are: creating snapshotting active deleted
+ :type volumeStatus: str
+
+ :param accounts: Returns only the volumes owned by the accounts you specify here. Mutually exclusive with the volumeIDs parameter.
+ :type accounts: int
+
+ :param isPaired: Returns volumes that are paired or not paired. Possible values are: true: Returns all paired volumes. false: Returns all volumes that are not paired.
+ :type isPaired: bool
+
+ :param volumeIDs: A list of volume IDs. If you supply this parameter, other parameters operate only on this set of volumes. Mutually exclusive with the accounts, startVolumeID, and limit parameters.
+ :type volumeIDs: int
+
+ :param volumeName: Only volume object information matching the volume name is returned.
+ :type volumeName: str
+
+ :param includeVirtualVolumes: Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false.
+ :type includeVirtualVolumes: bool
+ """
+
+ self . _check_connection_type ( "list_volumes" , "Cluster" )
+
+ params = {
+ }
if start_volume_id is not None :
params [ "startVolumeID" ] = start_volume_id
if limit is not None :
@@ -4668,120 +5250,193 @@ Source code for solidfire
if is_paired is not None :
params [ "isPaired" ] = is_paired
if volume_ids is not None :
- params [ "volumeIDs" ] = volume_ids
-
+ if self . api_version < 9.0 :
+ raise ApiParameterVersionError ( "list_volumes" , 9.0 ,
+ [( "volume_ids" , volume_ids , 9.0 , False )])
+ else :
+ params [ "volumeIDs" ] = volume_ids
+ if volume_name is not None :
+ params [ "volumeName" ] = volume_name
+ if include_virtual_volumes is not None :
+ if self . api_version < 9.0 :
+ raise ApiParameterVersionError ( "list_volumes" , 9.0 ,
+ [( "include_virtual_volumes" , include_virtual_volumes , 9.0 , False )])
+ else :
+ params [ "includeVirtualVolumes" ] = include_virtual_volumes
+
+ # There is no adaptor.
return self . send_request (
'ListVolumes' ,
ListVolumesResult ,
params ,
- since = 8.0 ,
+ since = 8.0
)
[docs] def list_volumes_for_account (
self ,
account_id ,
start_volume_id = OPTIONAL ,
-
limit = OPTIONAL ,):
+
limit = OPTIONAL ,
+
include_virtual_volumes = OPTIONAL ,):
"""
-
*list_volumes_for_account* returns the list of active AND (pending)
-
deleted volumes for an account.
-
-
:param account_id: [required] The ID of the account to list the volumes
-
for.
-
:type account_id: int
+
ListVolumesForAccount returns the list of active and (pending) deleted volumes for an account.
+
:param accountID: [required] Returns all volumes owned by this AccountID.
+
:type accountID: int
-
:param start_volume_id: (optional) The ID of the first volume to list.
-
This can be useful for paging results. By default, this starts at
-
the lowest VolumeID.
-
:type start_volume_id: int
+
:param startVolumeID: The ID of the first volume to list. This can be useful for paging results. By default, this starts at the lowest VolumeID.
+
:type startVolumeID: int
-
:param limit: (optional) The maximum number of volumes to return from
-
the API.
+
:param limit: The maximum number of volumes to return from the API.
:type limit: int
-
:returns: a response
-
:rtype: ListVolumesForAccountResult
+
:param includeVirtualVolumes: Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false.
+
:type includeVirtualVolumes: bool
"""
-
params = {
+
self . _check_connection_type ( "list_volumes_for_account" , "Cluster" )
+
+
params = {
"accountID" : account_id ,
}
if start_volume_id is not None :
params [ "startVolumeID" ] = start_volume_id
if limit is not None :
params [ "limit" ] = limit
-
+
if include_virtual_volumes is not None :
+
if self . api_version < 9.0 :
+
raise ApiParameterVersionError ( "list_volumes_for_account" , 9.0 ,
+
[( "include_virtual_volumes" , include_virtual_volumes , 9.0 , True )])
+
else :
+
params [ "includeVirtualVolumes" ] = include_virtual_volumes
+
+
# There is no adaptor.
return self . send_request (
'ListVolumesForAccount' ,
ListVolumesForAccountResult ,
params ,
-
deprecated = 8.0
+
since = 1.0
+
)
+
+[docs] def list_volume_stats (
+
self ,
+
volume_ids = OPTIONAL ,):
+
"""
+
ListVolumeStats returns high-level activity measurements for a single volume, list of volumes, or all volumes (if you omit the volumeIDs parameter). Measurement values are cumulative from the creation of the volume.
+
:param volumeIDs: A list of volume IDs of volumes from which to retrieve activity information.
+
:type volumeIDs: int
+
"""
+
+
self . _check_connection_type ( "list_volume_stats" , "Cluster" )
+
+
params = {
+
}
+
if volume_ids is not None :
+
params [ "volumeIDs" ] = volume_ids
+
+
# There is no adaptor.
+
return self . send_request (
+
'ListVolumeStats' ,
+
ListVolumeStatsResult ,
+
params ,
+
since = 7.0
)
[docs] def list_volume_stats_by_account (
-
self ,):
+
self ,
+
accounts = OPTIONAL ,
+
include_virtual_volumes = OPTIONAL ,):
"""
-
*list_volume_stats_by_account* returns high-level activity measurements
-
for every account.
-
Values are summed from all the volumes owned by the account.
+
ListVolumeStatsByAccount returns high-level activity measurements for every account. Values are summed from all the volumes owned by the account.
+
:param accounts: One or more account ids by which to filter the result.
+
:type accounts: int
-
:returns: a response
-
:rtype: ListVolumeStatsByAccountResult
+
:param includeVirtualVolumes: Includes virtual volumes in the response by default. To exclude virtual volumes, set to false.
+
:type includeVirtualVolumes: bool
"""
-
params = {}
+
self . _check_connection_type ( "list_volume_stats_by_account" , "Cluster" )
+
params = {
+
}
+
if accounts is not None :
+
params [ "accounts" ] = accounts
+
if include_virtual_volumes is not None :
+
if self . api_version < 9.0 :
+
raise ApiParameterVersionError ( "list_volume_stats_by_account" , 9.0 ,
+
[( "include_virtual_volumes" , include_virtual_volumes , 9.0 , False )])
+
else :
+
params [ "includeVirtualVolumes" ] = include_virtual_volumes
+
+
# There is no adaptor.
return self . send_request (
'ListVolumeStatsByAccount' ,
ListVolumeStatsByAccountResult ,
params ,
+
since = 1.0
)
[docs] def list_volume_stats_by_volume (
-
self ,):
+
self ,
+
include_virtual_volumes = OPTIONAL ,):
"""
-
*list_volume_stats_by_volume* returns high-level activity measurements
-
for every volume, by volume.
-
Values are cumulative from the creation of the volume.
-
-
:returns: a response
-
:rtype: ListVolumeStatsByVolumeResult
+
ListVolumeStatsByVolume returns high-level activity measurements for every volume, by volume. Values are cumulative from the
+
creation of the volume.
+
:param includeVirtualVolumes: Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false.
+
:type includeVirtualVolumes: bool
"""
-
params = {}
+
self . _check_connection_type ( "list_volume_stats_by_volume" , "Cluster" )
+
params = {
+
}
+
if include_virtual_volumes is not None :
+
if self . api_version < 9.0 :
+
raise ApiParameterVersionError ( "list_volume_stats_by_volume" , 9.0 ,
+
[( "include_virtual_volumes" , include_virtual_volumes , 9.0 , False )])
+
else :
+
params [ "includeVirtualVolumes" ] = include_virtual_volumes
+
+
# There is no adaptor.
return self . send_request (
'ListVolumeStatsByVolume' ,
ListVolumeStatsByVolumeResult ,
params ,
+
since = 1.0
)
[docs] def list_volume_stats_by_volume_access_group (
self ,
-
volume_access_groups = OPTIONAL ,):
+
volume_access_groups = OPTIONAL ,
+
include_virtual_volumes = OPTIONAL ,):
"""
-
*list_volume_stats_by_volume_access_group* is used to get total
-
activity measurements for all of the volumes that are a member of the
+
ListVolumeStatsByVolumeAccessGroup enables you to get total activity measurements for all of the volumes that are a member of the
specified volume access group(s).
+
:param volumeAccessGroups: An array of VolumeAccessGroupIDs for which volume activity is returned. If omitted, statistics for all volume access groups are returned.
+
:type volumeAccessGroups: int
-
:param volume_access_groups: (optional) An array of
-
*volume_access_group_ids* for which volume activity is returned. If
-
no *volume_access_group_id* is specified, stats for all volume
-
access groups is returned.
-
:type volume_access_groups: int[]
-
-
:returns: a response
-
:rtype: ListVolumeStatsByVolumeAccessGroupResult
+
:param includeVirtualVolumes: Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false.
+
:type includeVirtualVolumes: bool
"""
-
params = {}
+
self . _check_connection_type ( "list_volume_stats_by_volume_access_group" , "Cluster" )
+
+
params = {
+
}
if volume_access_groups is not None :
params [ "volumeAccessGroups" ] = volume_access_groups
-
+
if include_virtual_volumes is not None :
+
if self . api_version < 9.0 :
+
raise ApiParameterVersionError ( "list_volume_stats_by_volume_access_group" , 9.0 ,
+
[( "include_virtual_volumes" , include_virtual_volumes , 9.0 , False )])
+
else :
+
params [ "includeVirtualVolumes" ] = include_virtual_volumes
+
+
# There is no adaptor.
return self . send_request (
'ListVolumeStatsByVolumeAccessGroup' ,
ListVolumeStatsByVolumeAccessGroupResult ,
params ,
+
since = 5.0
)
[docs] def modify_volume (
@@ -4789,234 +5444,314 @@
Source code for solidfire
volume_id ,
account_id = OPTIONAL ,
access = OPTIONAL ,
- set_create_time = OPTIONAL ,
qos = OPTIONAL ,
total_size = OPTIONAL ,
attributes = OPTIONAL ,):
"""
- *modify_volume* is used to modify settings on an existing volume.
- Modifications can be made to one volume at a time and changes take
- place immediately.
- If an optional parameter is left unspecified, the value will not be
- changed.
-
-
-
-
- Extending the size of a volume that is being replicated should be done
- in an order.
- The target (Replication Target) volume should first be increased in
- size, then the source (Read/Write) volume can be resized.
- It is recommended that both the target and the source volumes be the
- same size.
-
-
-
-
- **Note**: If you change access status to locked or target all existing
- iSCSI connections are terminated.
-
- :param volume_id: [required] *volume_id* for the volume to be modified.
- :type volume_id: int
-
- :param account_id: (optional) *account_id* to which the volume is
- reassigned. If none is specified, the previous account name is
- used.
- :type account_id: int
-
- :param access: (optional) Access allowed for the volume.
+ ModifyVolume enables you to modify settings on an existing volume. You can make modifications to one volume at a time and
+ changes take place immediately. If you do not specify QoS values when you modify a volume, they remain the same as before the modification. You can retrieve
+ default QoS values for a newly created volume by running the GetDefaultQoS method.
+ When you need to increase the size of a volume that is being replicated, do so in the following order to prevent replication errors:
+ 1. Increase the size of the "Replication Target" volume.
+ 2. Increase the size of the source or "Read / Write" volume.
+ NetApp recommends that both the target and source volumes are the same size.
+ Note: If you change the "access" status to locked or target, all existing iSCSI connections are terminated.
+ :param volumeID: [required] VolumeID for the volume to be modified.
+ :type volumeID: int
+
+ :param accountID: AccountID to which the volume is reassigned. If unspecified, the previous account name is used.
+ :type accountID: int
+
+ :param access: Specifies the access allowed for the volume. Possible values are: readOnly: Only read operations are allowed. readWrite: Reads and writes are allowed. locked: No reads or writes are allowed. If not specified, the access value does not change. replicationTarget: Identify a volume as the target volume for a paired set of volumes. If the volume is not paired, the access status is locked. If a value is not specified, the access value does not change.
+ :type access: str
- **readOnly**: Only read operations are allowed.
+ :param qos: New QoS settings for this volume. If not specified, the QoS settings are not changed.
+ :type qos: QoS
- **readWrite**: Reads and writes are allowed.
+ :param totalSize: New size of the volume in bytes. 1000000000 is equal to 1GB. Size is rounded up to the nearest 1MB. This parameter can only be used to increase the size of a volume.
+ :type totalSize: int
- **locked**: No reads or writes are allowed.
+ :param attributes: List of name-value pairs in JSON object format.
+ :type attributes: dict
+ """
- **replicationTarget**: Identify a volume as the target volume for a
- paired set of volumes. If the volume is not paired, the access
- status is locked.
+ self . _check_connection_type ( "modify_volume" , "Cluster" )
- If unspecified, the access settings of the clone will be the same
- as the source.
+ params = {
+ "volumeID" : volume_id ,
+ }
+ if account_id is not None :
+ params [ "accountID" ] = account_id
+ if access is not None :
+ params [ "access" ] = access
+ if qos is not None :
+ params [ "qos" ] = qos
+ if total_size is not None :
+ params [ "totalSize" ] = total_size
+ if attributes is not None :
+ params [ "attributes" ] = attributes
+
+ # There is no adaptor.
+ return self . send_request (
+ 'ModifyVolume' ,
+ ModifyVolumeResult ,
+ params ,
+ since = 1.0
+ )
+
[docs] def modify_volumes (
+
self ,
+
volume_ids ,
+
account_id = OPTIONAL ,
+
access = OPTIONAL ,
+
qos = OPTIONAL ,
+
total_size = OPTIONAL ,
+
attributes = OPTIONAL ,):
+
"""
+
ModifyVolumes allows you to configure up to 500 existing volumes at one time. Changes take place immediately.
+
If ModifyVolumes fails to modify any of the specified volumes, none of the specified volumes are changed.
+
If you do not specify QoS values when you modify volumes, the QoS values for each volume remain unchanged.
+
You can retrieve default QoS values for a newly created volume by running the GetDefaultQoS method.
+
When you need to increase the size of volumes that are being replicated, do so in the following order
+
to prevent replication errors:
+
Increase the size of the "Replication Target" volume.
+
Increase the size of the source or "Read / Write" volume.
+
Recommend that both the target and source volumes be the same size.
+
NOTE: If you change access status to locked or replicationTarget all existing iSCSI connections are terminated.
+
:param volumeIDs: [required] A list of volumeIDs for the volumes to be modified.
+
:type volumeIDs: int
+
+
:param accountID: AccountID to which the volume is reassigned. If none is specified, the previous account name is used.
+
:type accountID: int
+
+
:param access: Access allowed for the volume. Possible values:readOnly: Only read operations are allowed.readWrite: Reads and writes are allowed.locked: No reads or writes are allowed.If not specified, the access value does not change.replicationTarget: Identify a volume as the target volume for a paired set of volumes. If the volume is not paired, the access status is locked.If a value is not specified, the access value does not change.
:type access: str
-
:param set_create_time: (optional) Identify the time at which the
-
volume was created.
-
:type set_create_time: str
-
-
:param qos: (optional) New quality of service settings for this volume.
+
:param qos: New quality of service settings for this volume.If not specified, the QoS settings are not changed.
:type qos: QoS
-
:param total_size: (optional) New size of the volume in bytes. Size is
-
rounded up to the nearest 1MiB size. This parameter can only be
-
used to *increase* the size of a volume.
-
:type total_size: int
+
:param totalSize: New size of the volume in bytes. 1000000000 is equal to 1GB. Size is rounded up to the nearest 1MB in size. This parameter can only be used to increase the size of a volume.
+
:type totalSize: int
-
:param attributes: (optional) List of Name/Value pairs in JSON object
-
format.
+
:param attributes: List of name/value pairs in JSON object format.
:type attributes: dict
-
-
:returns: a response
-
:rtype: ModifyVolumeResult
"""
-
params = {
-
"volumeID" : volume_id ,
+
self . _check_connection_type ( "modify_volumes" , "Cluster" )
+
+
params = {
+
"volumeIDs" : volume_ids ,
}
if account_id is not None :
params [ "accountID" ] = account_id
if access is not None :
params [ "access" ] = access
-
if set_create_time is not None :
-
params [ "setCreateTime" ] = set_create_time
if qos is not None :
params [ "qos" ] = qos
if total_size is not None :
params [ "totalSize" ] = total_size
if attributes is not None :
params [ "attributes" ] = attributes
-
+
+
# There is no adaptor.
return self . send_request (
-
'ModifyVolume' ,
-
ModifyVolumeResult ,
+
'ModifyVolumes' ,
+
ModifyVolumesResult ,
params ,
+
since = 9.0
)
[docs] def purge_deleted_volume (
self ,
volume_id ,):
"""
-
*purge_deleted_volume* immediately and permanently purges a volume
-
which has been deleted.
-
A volume must be deleted using *delete_volume* before it can be purged.
-
Volumes are purged automatically after a period of time, so usage of
-
this method is not typically required.
-
-
:param volume_id: [required] The ID of the volume to purge.
-
:type volume_id: int
-
-
:returns: a response
-
:rtype: PurgeDeletedVolumeResult
+
PurgeDeletedVolume immediately and permanently purges a volume that has been deleted. You must delete a volume using
+
DeleteVolume before it can be purged. Volumes are purged automatically after a period of time, so usage of this method is not
+
typically required.
+
:param volumeID: [required] The ID of the volume to be purged.
+
:type volumeID: int
"""
-
params = {
+
self . _check_connection_type ( "purge_deleted_volume" , "Cluster" )
+
+
params = {
"volumeID" : volume_id ,
}
-
+
+
# There is no adaptor.
return self . send_request (
'PurgeDeletedVolume' ,
PurgeDeletedVolumeResult ,
params ,
+
since = 1.0
)
-
[docs] def restore_deleted_volume (
+
[docs] def purge_deleted_volumes (
self ,
-
volume_id ,):
+
volume_ids = OPTIONAL ,
+
account_ids = OPTIONAL ,
+
volume_access_group_ids = OPTIONAL ,):
"""
-
*restore_deleted_volume* marks a deleted volume as active again.
-
This action makes the volume immediately available for iSCSI
-
connection.
+
PurgeDeletedVolumes immediately and permanently purges volumes that have been deleted.
+
You can use this method to purge up to 500 volumes at one time.
+
You must delete volumes using DeleteVolumes before they can be purged.
+
Volumes are purged by the system automatically after a period of time, so usage of this method is not typically required.
+
:param volumeIDs: A list of volumeIDs of volumes to be purged from the system.
+
:type volumeIDs: int
-
:param volume_id: [required] *volume_id* for the deleted volume to
-
restore.
-
:type volume_id: int
+
:param accountIDs: A list of accountIDs. All of the volumes from all of the specified accounts are purged from the system.
+
:type accountIDs: int
-
:returns: a response
-
:rtype: RestoreDeletedVolumeResult
+
:param volumeAccessGroupIDs: A list of volumeAccessGroupIDs. All of the volumes from all of the specified Volume Access Groups are purged from the system.
+
:type volumeAccessGroupIDs: int
"""
-
params = {
-
"volumeID" : volume_id ,
-
}
+
self . _check_connection_type ( "purge_deleted_volumes" , "Cluster" )
+
params = {
+
}
+
if volume_ids is not None :
+
params [ "volumeIDs" ] = volume_ids
+
if account_ids is not None :
+
params [ "accountIDs" ] = account_ids
+
if volume_access_group_ids is not None :
+
params [ "volumeAccessGroupIDs" ] = volume_access_group_ids
+
+
# There is no adaptor.
return self . send_request (
-
'RestoreDeletedVolume' ,
-
RestoreDeletedVolumeResult ,
+
'PurgeDeletedVolumes' ,
+
PurgeDeletedVolumesResult ,
params ,
+
since = 9.0
)
-
[docs] def start_bulk_volume_read (
+
[docs] def remove_volumes_from_volume_access_group (
self ,
-
volume_id ,
-
format ,
-
snapshot_id = OPTIONAL ,
-
script = OPTIONAL ,
-
script_parameters = OPTIONAL ,
-
attributes = OPTIONAL ,):
+
volume_access_group_id ,
+
volumes ,):
"""
-
*start_bulk_volume_read* allows you to initialize a bulk volume read
-
session on a specified volume.
-
Only two bulk volume processes can run simultaneously on a volume.
-
When you initialize the session, data is read from a SolidFire storage
-
volume for the purposes of storing the data on an external backup
-
source.
-
The external data is accessed by a web server running on a SolidFire
-
node.
-
Communications and server interaction information for external data
-
access is passed by a script running on the SolidFire storage system.
-
-
-
-
-
-
-
-
At the start of a bulk volume read operation, a snapshot of the volume
-
is made and the snapshot is deleted when the read has completed.
-
You can also read a snapshot of the volume by entering the ID of the
-
snapshot as a parameter.
-
Reading a previous snapshot does not create a new snapshot of the
-
volume, nor does the previous snapshot be deleted when the read
-
completes.
+
The RemoveVolumeFromVolumeAccessGroup method enables you to remove volumes from a volume access group.
+
:param volumeAccessGroupID: [required] The ID of the volume access group to remove volumes from.
+
:type volumeAccessGroupID: int
+
:param volumes: [required] The ID of the volume access group to remove volumes from.
+
:type volumes: int
+
"""
+
self . _check_connection_type ( "remove_volumes_from_volume_access_group" , "Cluster" )
+
params = {
+
"volumeAccessGroupID" : volume_access_group_id ,
+
"volumes" : volumes ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'RemoveVolumesFromVolumeAccessGroup' ,
+
ModifyVolumeAccessGroupResult ,
+
params ,
+
since = 5.0
+
)
+
[docs] def restore_deleted_volume (
+
self ,
+
volume_id ,):
+
"""
+
RestoreDeletedVolume marks a deleted volume as active again. This action makes the volume immediately available for iSCSI connection.
+
:param volumeID: [required] VolumeID of the deleted volume to be restored.
+
:type volumeID: int
+
"""
+
self . _check_connection_type ( "restore_deleted_volume" , "Cluster" )
+
params = {
+
"volumeID" : volume_id ,
+
}
+
+
# There is no adaptor.
+
return self . send_request (
+
'RestoreDeletedVolume' ,
+
RestoreDeletedVolumeResult ,
+
params ,
+
since = 1.0
+
)
-
**Note**: This process creates a new snapshot if the ID of an existing
-
snapshot is not provided.
-
Snapshots can be created if cluster fullness is at stage 2 or 3.
-
Snapshots are not created when cluster fullness is at stage 4 or 5.
+
[docs] def set_default_qos (
+
self ,
+
min_iops = OPTIONAL ,
+
max_iops = OPTIONAL ,
+
burst_iops = OPTIONAL ,):
+
"""
+
SetDefaultQoS enables you to configure the default Quality of Service (QoS) values (measured in inputs and outputs per second, or
+
IOPS) for a volume. For more information about QoS in a SolidFire cluster, see the User Guide.
+
:param minIOPS: The minimum number of sustained IOPS provided by the cluster to a volume.
+
:type minIOPS: int
-
:param volume_id: [required] ID of the volume to be read.
-
:type volume_id: int
+
:param maxIOPS: The maximum number of sustained IOPS provided by the cluster to a volume.
+
:type maxIOPS: int
-
:param format: [required] The format of the volume data. Can be either:
+
:param burstIOPS: The maximum number of IOPS allowed in a short burst scenario.
+
:type burstIOPS: int
+
"""
-
**uncompressed**: every byte of the volume is returned without any
-
compression.
+
self . _check_connection_type ( "set_default_qos" , "Cluster" )
-
**native**: opaque data is returned that is smaller and more
-
efficiently stored and written on a subsequent bulk volume write.
+
params = {
+
}
+
if min_iops is not None :
+
params [ "minIOPS" ] = min_iops
+
if max_iops is not None :
+
params [ "maxIOPS" ] = max_iops
+
if burst_iops is not None :
+
params [ "burstIOPS" ] = burst_iops
+
+
# There is no adaptor.
+
return self . send_request (
+
'SetDefaultQoS' ,
+
SetDefaultQoSResult ,
+
params ,
+
since = 9.0
+
)
+
[docs] def start_bulk_volume_read (
+
self ,
+
volume_id ,
+
format ,
+
snapshot_id = OPTIONAL ,
+
script = OPTIONAL ,
+
script_parameters = OPTIONAL ,
+
attributes = OPTIONAL ,):
+
"""
+
StartBulkVolumeRead enables you to initialize a bulk volume read session on a specified volume. Only two bulk volume processes
+
can run simultaneously on a volume. When you initialize the session, data is read from a SolidFire storage volume for the purposes
+
of storing the data on an external backup source. The external data is accessed by a web server running on an SF-series node.
+
Communications and server interaction information for external data access is passed by a script running on the storage system.
+
At the start of a bulk volume read operation, a snapshot of the volume is made and the snapshot is deleted when the read is complete. You can also read a snapshot of the volume by entering the ID of the snapshot as a parameter. When you read a
+
previous snapshot, the system does not create a new snapshot of the volume or delete the previous snapshot when the
+
read completes.
+
Note: This process creates a new snapshot if the ID of an existing snapshot is not provided. Snapshots can be created if cluster fullness is at stage 2 or 3. Snapshots are not created when cluster fullness is at stage 4 or 5.
+
:param volumeID: [required] The ID of the volume to be read.
+
:type volumeID: int
+
+
:param format: [required] The format of the volume data. It can be either of the following formats: uncompressed: Every byte of the volume is returned without any compression. native: Opaque data is returned that is smaller and more efficiently stored and written on a subsequent bulk volume write.
:type format: str
-
:param snapshot_id: (optional) ID of a previously created snapshot used
-
for bulk volume reads. If no ID is entered, a snapshot of the
-
current active volume image is made.
-
:type snapshot_id: int
+
:param snapshotID: The ID of a previously created snapshot used for bulk volume reads. If no ID is entered, a snapshot of the current active volume image is made.
+
:type snapshotID: int
-
:param script: (optional) Executable name of a script. If no script
-
name is given then the key and URL is necessary to access SolidFire
-
nodes. The script is run on the primary node and the key and URL is
-
returned to the script so the local web server can be contacted.
+
:param script: The executable name of a script. If unspecified, the key and URL is necessary to access SF-series nodes. The script is run on the primary node and the key and URL is returned to the script so the local web server can be contacted.
:type script: str
-
:param script_parameters: (optional) JSON parameters to pass to the
-
script.
-
:type script_parameters: str
+
:param scriptParameters: JSON parameters to pass to the script.
+
:type scriptParameters: dict
-
:param attributes: (optional) JSON attributes for the bulk volume job.
+
:param attributes: JSON attributes for the bulk volume job.
:type attributes: dict
-
-
:returns: a response
-
:rtype: StartBulkVolumeReadResult
"""
-
params = {
+
self . _check_connection_type ( "start_bulk_volume_read" , "Cluster" )
+
+
params = {
"volumeID" : volume_id ,
"format" : format ,
}
@@ -5028,11 +5763,13 @@
Source code for solidfire
params [ "scriptParameters" ] = script_parameters
if attributes is not None :
params [ "attributes" ] = attributes
-
+
+ # There is no adaptor.
return self . send_request (
'StartBulkVolumeRead' ,
StartBulkVolumeReadResult ,
params ,
+ since = 6.0
)
[docs] def start_bulk_volume_write (
@@ -5043,48 +5780,27 @@
Source code for solidfire
script_parameters = OPTIONAL ,
attributes = OPTIONAL ,):
"""
- *start_bulk_volume_write* allows you to initialize a bulk volume write
- session on a specified volume.
- Only two bulk volume processes can run simultaneously on a volume.
- When the session is initialized, data can be written to a SolidFire
- storage volume from an external backup source.
- The external data is accessed by a web server running on a SolidFire
- node.
- Communications and server interaction information for external data
- access is passed by a script running on the SolidFire storage system.
-
- :param volume_id: [required] ID of the volume to be written to.
- :type volume_id: int
-
- :param format: [required] The format of the volume data. Can be either:
-
- **uncompressed**: every byte of the volume is returned without any
- compression.
-
- **native**: opaque data is returned that is smaller and more
- efficiently stored and written on a subsequent bulk volume write
+ StartBulkVolumeWrite enables you to initialize a bulk volume write session on a specified volume. Only two bulk volume processes can run simultaneously on a volume. When you initialize the write session, data is written to a SolidFire storage volume from an external backup source. The external data is accessed by a web server running on an SF-series node. Communications and server
+ interaction information for external data access is passed by a script running on the storage system.
+ :param volumeID: [required] The ID of the volume to be written to.
+ :type volumeID: int
+ :param format: [required] The format of the volume data. It can be either of the following formats: uncompressed: Every byte of the volume is returned without any compression. native: Opaque data is returned that is smaller and more efficiently stored and written on a subsequent bulk volume write.
:type format: str
- :param script: (optional) Executable name of a script. If no script
- name is given then the key and URL are necessary to access
- SolidFire nodes. The script runs on the primary node and the key
- and URL is returned to the script so the local web server can be
- contacted.
+ :param script: The executable name of a script. If unspecified, the key and URL are necessary to access SF-series nodes. The script runs on the primary node and the key and URL is returned to the script, so the local web server can be contacted.
:type script: str
- :param script_parameters: (optional) JSON parameters to pass to the
- script.
- :type script_parameters: str
+ :param scriptParameters: JSON parameters to pass to the script.
+ :type scriptParameters: dict
- :param attributes: (optional) JSON attributes for the bulk volume job.
+ :param attributes: JSON attributes for the bulk volume job.
:type attributes: dict
-
- :returns: a response
- :rtype: StartBulkVolumeWriteResult
"""
- params = {
+ self . _check_connection_type ( "start_bulk_volume_write" , "Cluster" )
+
+ params = {
"volumeID" : volume_id ,
"format" : format ,
}
@@ -5094,11 +5810,13 @@ Source code for solidfire
params [ "scriptParameters" ] = script_parameters
if attributes is not None :
params [ "attributes" ] = attributes
-
+
+ # There is no adaptor.
return self . send_request (
'StartBulkVolumeWrite' ,
StartBulkVolumeWriteResult ,
params ,
+ since = 6.0
)
[docs] def update_bulk_volume_status (
@@ -5109,47 +5827,27 @@
Source code for solidfire
message = OPTIONAL ,
attributes = OPTIONAL ,):
"""
- You can use *update_bulk_volume_status* in a script to return to the
- SolidFire system the status of a bulk volume job that you have started
- with the *\"start_bulk_volume_read\"* or *\"start_bulk_volume_write\"*
- methods.
-
- :param key: [required] The key assigned during initialization of a
- \"StartBulkVolumeRead\" or \"StartBulkVolumeWrite\" session.
+ You can use UpdateBulkVolumeStatus in a script to update the status of a bulk volume job that you started with the
+ StartBulkVolumeRead or StartBulkVolumeWrite methods.
+ :param key: [required] The key assigned during initialization of a StartBulkVolumeRead or StartBulkVolumeWrite session.
:type key: str
- :param status: [required] The SolidFire system sets the status of the
- given bulk volume job.
-
- Possible values:
-
-
-
- **running**: jobs that are still active.
-
- **complete**: jobs that are done. failed - jobs that have failed.
-
- **failed**: jobs that have failed.
-
+ :param status: [required] The status of the given bulk volume job. The system sets the status. Possible values are: running: Jobs that are still active. complete: Jobs that are done. failed: Jobs that failed.
:type status: str
- :param percent_complete: (optional) The completed progress of the bulk
- volume job as a percentage.
- :type percent_complete: str
+ :param percentComplete: The completed progress of the bulk volume job as a percentage value.
+ :type percentComplete: str
- :param message: (optional) Returns the status of the bulk volume job
- when the job has completed.
+ :param message: The message returned indicating the status of the bulk volume job after the job is complete.
:type message: str
- :param attributes: (optional) JSON attributes updates what is on the
- bulk volume job.
+ :param attributes: JSON attributes; updates what is on the bulk volume job.
:type attributes: dict
-
- :returns: a response
- :rtype: UpdateBulkVolumeStatusResult
"""
- params = {
+ self . _check_connection_type ( "update_bulk_volume_status" , "Cluster" )
+
+ params = {
"key" : key ,
"status" : status ,
}
@@ -5159,11 +5857,13 @@ Source code for solidfire
params [ "message" ] = message
if attributes is not None :
params [ "attributes" ] = attributes
-
+
+ # There is no adaptor.
return self . send_request (
'UpdateBulkVolumeStatus' ,
UpdateBulkVolumeStatusResult ,
params ,
+ since = 6.0
)
[docs] def create_volume_access_group (
@@ -5175,407 +5875,247 @@
Source code for solidfire
virtual_network_tags = OPTIONAL ,
attributes = OPTIONAL ,):
"""
- Creates a new volume access group.
- The new volume access group must be given a name when it is created.
- Entering initiators and volumes are optional when creating a volume
- access group.
- Once the group is created volumes and initiator IQNs can be added.
- Any initiator IQN that is successfully added to the volume access group
- is able to access any volume in the group without CHAP authentication.
-
- :param name: [required] Name of the volume access group. It is not
- required to be unique, but recommended.
+ You can use CreateVolumeAccessGroup to create a new volume access group. When you create the volume access group, you need to give it a name, and you can optionally enter initiators and volumes. After you create the group, you can add volumes and initiator IQNs. Any initiator IQN that you add to the volume access group is able to access any volume in the group without CHAP authentication.
+ :param name: [required] The name for this volume access group. Not required to be unique, but recommended.
:type name: str
- :param initiators: (optional) List of initiators to include in the
- volume access group. If unspecified, the access group will start
- out without configured initiators.
- :type initiators: str[]
+ :param initiators: List of initiators to include in the volume access group. If unspecified, the access group's configured initiators are not modified.
+ :type initiators: str
- :param volumes: (optional) List of volumes to initially include in the
- volume access group. If unspecified, the access group will start
- without any volumes.
- :type volumes: int[]
+ :param volumes: List of volumes to initially include in the volume access group. If unspecified, the access group's volumes are not modified.
+ :type volumes: int
- :param virtual_network_id: (optional) The ID of the SolidFire Virtual
- Network ID to associate the volume access group with.
- :type virtual_network_id: int[]
+ :param virtualNetworkID: The ID of the SolidFire virtual network to associate the volume access group with.
+ :type virtualNetworkID: int
- :param virtual_network_tags: (optional) The ID of the VLAN Virtual
- Network Tag to associate the volume access group with.
- :type virtual_network_tags: int[]
+ :param virtualNetworkTags: The ID of the SolidFire virtual network to associate the volume access group with.
+ :type virtualNetworkTags: int
- :param attributes: (optional) List of Name/Value pairs in JSON object
- format.
+ :param attributes: List of name-value pairs in JSON object format.
:type attributes: dict
-
- :returns: a response
- :rtype: CreateVolumeAccessGroupResult
"""
- params = {
+ self . _check_connection_type ( "create_volume_access_group" , "Cluster" )
+
+ params = {
"name" : name ,
}
- self . _check_param_versions (
- 'create_volume_access_group' ,
- [
- ( "virtual_network_id" ,
- virtual_network_id , 8.0 , None ),
- ( "virtual_network_tags" ,
- virtual_network_tags , 8.0 , None ),
- ]
- )
if initiators is not None :
params [ "initiators" ] = initiators
if volumes is not None :
params [ "volumes" ] = volumes
if virtual_network_id is not None :
- params [ "virtualNetworkID" ] = virtual_network_id
+ if self . api_version < 8.0 :
+ raise ApiParameterVersionError ( "create_volume_access_group" , 8.0 ,
+ [( "virtual_network_id" , virtual_network_id , 8.0 , False )])
+ else :
+ params [ "virtualNetworkID" ] = virtual_network_id
if virtual_network_tags is not None :
- params [ "virtualNetworkTags" ] = virtual_network_tags
+ if self . api_version < 8.0 :
+ raise ApiParameterVersionError ( "create_volume_access_group" , 8.0 ,
+ [( "virtual_network_tags" , virtual_network_tags , 8.0 , False )])
+ else :
+ params [ "virtualNetworkTags" ] = virtual_network_tags
if attributes is not None :
params [ "attributes" ] = attributes
-
+
+ # There is no adaptor.
return self . send_request (
'CreateVolumeAccessGroup' ,
CreateVolumeAccessGroupResult ,
params ,
- )
-
-
[docs] def list_volume_access_groups (
-
self ,
-
start_volume_access_group_id = OPTIONAL ,
-
limit = OPTIONAL ,):
-
"""
-
*list_volume_access_groups* is used to return information about the
-
volume access groups that are currently in the system.
-
-
:param start_volume_access_group_id: (optional) The lowest
-
*volume_access_group_id* to return. This can be useful for paging.
-
If unspecified, there is no lower limit (implicitly 0).
-
:type start_volume_access_group_id: int
-
-
:param limit: (optional) The maximum number of results to return. This
-
can be useful for paging.
-
:type limit: int
-
-
:returns: a response
-
:rtype: ListVolumeAccessGroupsResult
-
"""
-
-
params = {}
-
if start_volume_access_group_id is not None :
-
params [ "startVolumeAccessGroupID" ] = start_volume_access_group_id
-
if limit is not None :
-
params [ "limit" ] = limit
-
-
return self . send_request (
-
'ListVolumeAccessGroups' ,
-
ListVolumeAccessGroupsResult ,
-
params ,
+
since = 5.0
)
[docs] def delete_volume_access_group (
self ,
volume_access_group_id ,):
"""
-
Delete a volume access group from the system.
-
-
:param volume_access_group_id: [required] The ID of the volume access
-
group to delete.
-
:type volume_access_group_id: int
-
-
:returns: a response
-
:rtype: DeleteVolumeAccessGroupResult
+
DeleteVolumeAccessGroup enables you to delete a
+
volume access group.
+
:param volumeAccessGroupID: [required] The ID of the volume access group to be deleted.
+
:type volumeAccessGroupID: int
"""
-
params = {
+
self . _check_connection_type ( "delete_volume_access_group" , "Cluster" )
+
+
params = {
"volumeAccessGroupID" : volume_access_group_id ,
}
-
+
+
# There is no adaptor.
return self . send_request (
'DeleteVolumeAccessGroup' ,
DeleteVolumeAccessGroupResult ,
params ,
+
since = 5.0
)
-
[docs] def modify_volume_access_group (
+
[docs] def get_volume_access_group_efficiency (
self ,
-
volume_access_group_id ,
-
virtual_network_id = OPTIONAL ,
-
virtual_network_tags = OPTIONAL ,
-
name = OPTIONAL ,
-
initiators = OPTIONAL ,
-
volumes = OPTIONAL ,
-
attributes = OPTIONAL ,):
+
volume_access_group_id ,):
"""
-
Update initiators and add or remove volumes from a volume access group.
-
A specified initiator or volume that duplicates an existing volume or
-
initiator in a volume access group is left as-is.
-
If a value is not specified for volumes or initiators, the current list
-
of initiators and volumes are not changed.
-
-
-
-
-
Often, it is easier to use the convenience functions to modify
-
initiators and volumes independently:
-
-
-
-
-
*add_initiators_to_volume_access_group*
-
-
-
-
*remove_initiators_from_volume_access_group*
-
-
-
-
*add_volumes_to_volume_access_group*
-
-
-
-
*remove_volumes_from_volume_access_group*
-
-
-
-
-
:param volume_access_group_id: [required] The ID of the volume access
-
group to modify.
-
:type volume_access_group_id: int
-
-
:param virtual_network_id: (optional) The ID of the SolidFire Virtual
-
Network ID to associate the volume access group with.
-
:type virtual_network_id: int[]
-
-
:param virtual_network_tags: (optional) The ID of the VLAN Virtual
-
Network Tag to associate the volume access group with.
-
:type virtual_network_tags: int[]
-
-
:param name: (optional) Name of the volume access group. It is not
-
required to be unique, but recommended.
-
:type name: str
-
-
:param initiators: (optional) List of initiators to include in the
-
volume access group. If unspecified, the access group's configured
-
initiators will not be modified.
-
:type initiators: str[]
-
-
:param volumes: (optional) List of volumes to initially include in the
-
volume access group. If unspecified, the access group's volumes
-
will not be modified.
-
:type volumes: int[]
-
-
:param attributes: (optional) List of Name/Value pairs in JSON object
-
format.
-
:type attributes: dict
-
-
:returns: a response
-
:rtype: ModifyVolumeAccessGroupResult
+
GetVolumeAccessGroupEfficiency enables you to
+
retrieve efficiency information about a volume access
+
group. Only the volume access group you provide as the
+
parameter in this API method is used to compute the
+
capacity.
+
:param volumeAccessGroupID: [required] The volume access group for which capacity is computed.
+
:type volumeAccessGroupID: int
"""
-
params = {
-
"volumeAccessGroupID" : volume_access_group_id ,
-
}
-
self . _check_param_versions (
-
'modify_volume_access_group' ,
-
[
-
( "virtual_network_id" ,
-
virtual_network_id , 8.0 , None ),
-
( "virtual_network_tags" ,
-
virtual_network_tags , 8.0 , None ),
-
]
-
)
-
if virtual_network_id is not None :
-
params [ "virtualNetworkID" ] = virtual_network_id
-
if virtual_network_tags is not None :
-
params [ "virtualNetworkTags" ] = virtual_network_tags
-
if name is not None :
-
params [ "name" ] = name
-
if initiators is not None :
-
params [ "initiators" ] = initiators
-
if volumes is not None :
-
params [ "volumes" ] = volumes
-
if attributes is not None :
-
params [ "attributes" ] = attributes
-
-
return self . send_request (
-
'ModifyVolumeAccessGroup' ,
-
ModifyVolumeAccessGroupResult ,
-
params ,
-
)
-
-
[docs] def add_initiators_to_volume_access_group (
-
self ,
-
volume_access_group_id ,
-
initiators ,):
-
"""
-
Add initiators to a volume access group.
-
-
:param volume_access_group_id: [required] The ID of the volume access
-
group to modify.
-
:type volume_access_group_id: int
-
-
:param initiators: [required] List of initiators to add to the volume
-
access group.
-
:type initiators: str[]
+
self . _check_connection_type ( "get_volume_access_group_efficiency" , "Cluster" )
-
:returns: a response
-
:rtype: ModifyVolumeAccessGroupResult
-
"""
-
-
params = {
+
params = {
"volumeAccessGroupID" : volume_access_group_id ,
-
"initiators" : initiators ,
}
-
+
+
# There is no adaptor.
return self . send_request (
-
'AddInitiatorsToVolumeAccessGroup' ,
-
ModifyVolumeAccessGroupResult ,
+
'GetVolumeAccessGroupEfficiency' ,
+
GetEfficiencyResult ,
params ,
+
since = 6.0
)
-
[docs] def remove_initiators_from_volume_access_group (
+
[docs] def get_volume_access_group_lun_assignments (
self ,
-
volume_access_group_id ,
-
initiators ,):
+
volume_access_group_id ,):
"""
-
Remove initiators from a volume access group.
-
-
:param volume_access_group_id: [required] The ID of the volume access
-
group to modify.
-
:type volume_access_group_id: int
-
-
:param initiators: [required] List of initiators to remove from the
-
volume access group.
-
:type initiators: str[]
-
-
:returns: a response
-
:rtype: ModifyVolumeAccessGroupResult
+
The GetVolumeAccessGroupLunAssignments
+
method enables you to retrieve details on LUN mappings
+
of a specified volume access group.
+
:param volumeAccessGroupID: [required] The unique volume access group ID used to return information.
+
:type volumeAccessGroupID: int
"""
-
params = {
+
self . _check_connection_type ( "get_volume_access_group_lun_assignments" , "Cluster" )
+
+
params = {
"volumeAccessGroupID" : volume_access_group_id ,
-
"initiators" : initiators ,
}
-
+
+
# There is no adaptor.
return self . send_request (
-
'RemoveInitiatorsFromVolumeAccessGroup' ,
-
ModifyVolumeAccessGroupResult ,
+
'GetVolumeAccessGroupLunAssignments' ,
+
GetVolumeAccessGroupLunAssignmentsResult ,
params ,
+
since = 7.0
)
-
[docs] def add_volumes_to_volume_access_group (
+
[docs] def list_volume_access_groups (
self ,
-
volume_access_group_id ,
-
volumes ,):
+
start_volume_access_group_id = OPTIONAL ,
+
limit = OPTIONAL ,
+
volume_access_groups = OPTIONAL ,):
"""
-
Add volumes to a volume access group.
-
-
:param volume_access_group_id: [required] The ID of the volume access
-
group to modify.
-
:type volume_access_group_id: int
+
ListVolumeAccessGroups enables you to return
+
information about the volume access groups that are
+
currently in the system.
+
:param startVolumeAccessGroupID: The volume access group ID at which to begin the listing. If unspecified, there is no lower limit (implicitly 0).
+
:type startVolumeAccessGroupID: int
-
:param volumes: [required] List of volumes to add to this volume access
-
group.
-
:type volumes: int[]
+
:param limit: The maximum number of results to return. This can be useful for paging.
+
:type limit: int
-
:returns: a response
-
:rtype: ModifyVolumeAccessGroupResult
+
:param volumeAccessGroups: The list of ids of the volume access groups you wish to list
+
:type volumeAccessGroups: int
"""
-
params = {
-
"volumeAccessGroupID" : volume_access_group_id ,
-
"volumes" : volumes ,
-
}
+
self . _check_connection_type ( "list_volume_access_groups" , "Cluster" )
+
params = {
+
}
+
if start_volume_access_group_id is not None :
+
params [ "startVolumeAccessGroupID" ] = start_volume_access_group_id
+
if limit is not None :
+
params [ "limit" ] = limit
+
if volume_access_groups is not None :
+
params [ "volumeAccessGroups" ] = volume_access_groups
+
+
# There is no adaptor.
return self . send_request (
-
'AddVolumesToVolumeAccessGroup' ,
-
ModifyVolumeAccessGroupResult ,
+
'ListVolumeAccessGroups' ,
+
ListVolumeAccessGroupsResult ,
params ,
+
since = 5.0
)
-
[docs] def remove_volumes_from_volume_access_group (
+
[docs] def modify_volume_access_group (
self ,
volume_access_group_id ,
-
volumes ,):
+
virtual_network_id = OPTIONAL ,
+
virtual_network_tags = OPTIONAL ,
+
name = OPTIONAL ,
+
initiators = OPTIONAL ,
+
volumes = OPTIONAL ,
+
delete_orphan_initiators = OPTIONAL ,
+
attributes = OPTIONAL ,):
"""
-
Remove volumes from a volume access group.
-
-
:param volume_access_group_id: [required] The ID of the volume access
-
group to modify.
-
:type volume_access_group_id: int
+
You can use ModifyVolumeAccessGroup to update initiators and add or remove volumes from a volume access group. If a specified initiator or volume is a duplicate of what currently exists, the volume access group is left as-is. If you do not specify a value for volumes or initiators, the current list of initiators and volumes is not changed.
+
:param volumeAccessGroupID: [required] The ID of the volume access group to modify.
+
:type volumeAccessGroupID: int
-
:param volumes: [required] List of volumes to remove from this volume
-
access group.
-
:type volumes: int[]
+
:param virtualNetworkID: The ID of the SolidFire virtual network to associate the volume access group with.
+
:type virtualNetworkID: int
-
:returns: a response
-
:rtype: ModifyVolumeAccessGroupResult
-
"""
+
:param virtualNetworkTags: The ID of the SolidFire virtual network to associate the volume access group with.
+
:type virtualNetworkTags: int
-
params = {
-
"volumeAccessGroupID" : volume_access_group_id ,
-
"volumes" : volumes ,
-
}
+
:param name: The new name for this volume access group. Not required to be unique, but recommended.
+
:type name: str
-
return self . send_request (
-
'RemoveVolumesFromVolumeAccessGroup' ,
-
ModifyVolumeAccessGroupResult ,
-
params ,
-
)
+
:param initiators: List of initiators to include in the volume access group. If unspecified, the access group's configured initiators are not modified.
+
:type initiators: str
-
[docs] def get_volume_access_group_efficiency (
-
self ,
-
volume_access_group_id ,):
-
"""
-
*get_volume_access_group_efficiency* is used to retrieve efficiency
-
information about a volume access group. Only the volume access group
-
provided as parameters in this API method is used to compute the
-
capacity.
+
:param volumes: List of volumes to initially include in the volume access group. If unspecified, the access group's volumes are not modified.
+
:type volumes: int
-
:param volume_access_group_id: [required] Specifies the volume access
-
group for which capacity is computed.
-
:type volume_access_group_id: int
+
:param deleteOrphanInitiators: true: Delete initiator objects after they are removed from a volume access group. false: Do not delete initiator objects after they are removed from a volume access group.
+
:type deleteOrphanInitiators: bool
-
:returns: a response
-
:rtype: GetEfficiencyResult
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
"""
-
params = {
-
"volumeAccessGroupID" : volume_access_group_id ,
-
}
-
-
return self . send_request (
-
'GetVolumeAccessGroupEfficiency' ,
-
GetEfficiencyResult ,
-
params ,
-
)
-
-
[docs] def get_volume_access_group_lun_assignments (
-
self ,
-
volume_access_group_id ,):
-
"""
-
The *get_volume_access_group_lun_assignments* is used to return
-
information LUN mappings of a specified volume access group.
-
-
:param volume_access_group_id: [required] Unique volume access group ID
-
used to return information.
-
:type volume_access_group_id: int
-
-
:returns: a response
-
:rtype: GetVolumeAccessGroupLunAssignmentsResult
-
"""
+
self . _check_connection_type ( "modify_volume_access_group" , "Cluster" )
-
params = {
+
params = {
"volumeAccessGroupID" : volume_access_group_id ,
}
-
+
if virtual_network_id is not None :
+
if self . api_version < 8.0 :
+
raise ApiParameterVersionError ( "modify_volume_access_group" , 8.0 ,
+
[( "virtual_network_id" , virtual_network_id , 8.0 , False )])
+
else :
+
params [ "virtualNetworkID" ] = virtual_network_id
+
if virtual_network_tags is not None :
+
if self . api_version < 8.0 :
+
raise ApiParameterVersionError ( "modify_volume_access_group" , 8.0 ,
+
[( "virtual_network_tags" , virtual_network_tags , 8.0 , False )])
+
else :
+
params [ "virtualNetworkTags" ] = virtual_network_tags
+
if name is not None :
+
params [ "name" ] = name
+
if initiators is not None :
+
params [ "initiators" ] = initiators
+
if volumes is not None :
+
params [ "volumes" ] = volumes
+
if delete_orphan_initiators is not None :
+
if self . api_version < 9.0 :
+
raise ApiParameterVersionError ( "modify_volume_access_group" , 9.0 ,
+
[( "delete_orphan_initiators" , delete_orphan_initiators , 9.0 , False )])
+
else :
+
params [ "deleteOrphanInitiators" ] = delete_orphan_initiators
+
if attributes is not None :
+
params [ "attributes" ] = attributes
+
+
# There is no adaptor.
return self . send_request (
-
'GetVolumeAccessGroupLunAssignments' ,
-
GetVolumeAccessGroupLunAssignmentsResult ,
+
'ModifyVolumeAccessGroup' ,
+
ModifyVolumeAccessGroupResult ,
params ,
+
since = 5.0
)
[docs] def modify_volume_access_group_lun_assignments (
@@ -5583,57 +6123,41 @@
Source code for solidfire
volume_access_group_id ,
lun_assignments ,):
"""
- The *modifyt_volume_access_group_lun_assignments* is used to define
- custom LUN assignments for specific volumes. Only LUN values set on the
- *lun_assignments* parameter will be changed in the volume access group.
- All other LUN assignments will remain unchanged.
-
-
-
-
- LUN assignment values must be unique for volumes in a volume access
- group. An exception will be seen if LUN assignments are duplicated in a
- volume access group. However, the same LUN values can be used again in
- different volume access groups.
+ The ModifyVolumeAccessGroupLunAssignments
+ method enables you to define custom LUN assignments
+ for specific volumes. This method changes only LUN
+ values set on the lunAssignments parameter in the
+ volume access group. All other LUN assignments remain
+ unchanged. LUN assignment values must be unique for volumes in a volume access group. You cannot define duplicate LUN values within a volume access group. However, you can use the same LUN values again in different volume access groups.
+ Note: Correct LUN values are 0 through 16383. The system generates an exception if you pass a LUN value outside of this range. None of the specified LUN assignments are modified if there is an exception.
+ Caution: If you change a LUN assignment for a volume with active I/O, the I/O can be disrupted. You might need to change the server configuration before changing volume LUN assignments.
+ :param volumeAccessGroupID: [required] The ID of the volume access group for which the LUN assignments will be modified.
+ :type volumeAccessGroupID: int
-
-
-
- **Note:** Correct LUN values are 0 - 16383. An exception will be seen
- if an incorrect LUN value is passed. None of the specified LUN
- assignments will be modified if there is an exception.
-
-
-
-
- **Caution:** If a LUN assignment is changed for a volume with active
- I/O, the I/O could be disrupted. Changes to the server configuration
- may be required in order to change volume LUN assignments.
-
- :param volume_access_group_id: [required] Unique volume access group ID
- for which the LUN assignments will be modified.
- :type volume_access_group_id: int
-
- :param lun_assignments: [required] The volume *ids* with new assigned
- LUN values.
- :type lun_assignments: LunAssignment[]
-
- :returns: a response
- :rtype: ModifyVolumeAccessGroupLunAssignmentsResult
+ :param lunAssignments: [required] The volume IDs with new assigned LUN values.
+ :type lunAssignments: LunAssignment
"""
- params = {
+ self . _check_connection_type ( "modify_volume_access_group_lun_assignments" , "Cluster" )
+
+ params = {
"volumeAccessGroupID" : volume_access_group_id ,
"lunAssignments" : lun_assignments ,
}
-
+
+ # There is no adaptor.
return self . send_request (
'ModifyVolumeAccessGroupLunAssignments' ,
ModifyVolumeAccessGroupLunAssignmentsResult ,
params ,
+ since = 7.0
)
+
+
+
+
@@ -5665,10 +6189,11 @@ Source code for solidfire
diff --git a/docs/_build/html/_modules/solidfire/adaptor.html b/docs/_build/html/_modules/solidfire/adaptor.html
index b96e489c..b71bb452 100644
--- a/docs/_build/html/_modules/solidfire/adaptor.html
+++ b/docs/_build/html/_modules/solidfire/adaptor.html
@@ -8,13 +8,15 @@
- solidfire.adaptor — SolidFire Python SDK v1.1.0.91
+ solidfire.adaptor — SolidFire Python SDK v1.4.0.271
+
+
@@ -34,7 +36,10 @@
-
+
+
+
@@ -44,6 +49,7 @@
+
@@ -66,7 +72,7 @@
- 1.1.0.91
+ 1.4.0.271
@@ -87,8 +93,11 @@
-
- SolidFire Python SDK
+
+
+
+
+ SolidFire Python SDK v1.2
Account Management Examples
Snapshot Scheduling Examples
solidfire package
@@ -104,8 +113,10 @@
-
- solidfire-sdk-python
+
+
+ solidfire-sdk-python
+
@@ -118,21 +129,38 @@
+
+
+
+
+
+
+
+
+
+
@@ -149,8 +177,7 @@
Source code for solidfire.adaptor
# EXPRESS WRITTEN PERMISSION OF NETAPP, INC.
"""Module implements the generated adaptor calls from solidfire.Element"""
from solidfire.adaptor.schedule_adaptor import ScheduleAdaptor
-from solidfire.results import GetNodeStatsResult
-
+from solidfire.models import GetNodeStatsResult
[docs] class ElementServiceAdaptor ( object ):
"""
@@ -191,6 +218,24 @@
Source code for solidfire.adaptor
+
@staticmethod
+
[docs] def invoke_sfapi ( element , params , since , deprecated ):
+
if "parameters" in params :
+
return element . send_request (
+
params [ "method" ],
+
dict ,
+
params [ "parameters" ],
+
since ,
+
deprecated
+
)
+
else :
+
return element . send_request (
+
params [ "method" ],
+
dict ,
+
since = since ,
+
deprecated = deprecated
+
)
+
@staticmethod
[docs] def get_schedule ( element , params , since , deprecated ):
"""
@@ -236,6 +281,9 @@
Source code for solidfire.adaptor
+
+
+
@@ -267,10 +315,11 @@ Source code for solidfire.adaptor
diff --git a/docs/_build/html/_modules/solidfire/adaptor/schedule_adaptor.html b/docs/_build/html/_modules/solidfire/adaptor/schedule_adaptor.html
index f88d9f59..88d8e64a 100644
--- a/docs/_build/html/_modules/solidfire/adaptor/schedule_adaptor.html
+++ b/docs/_build/html/_modules/solidfire/adaptor/schedule_adaptor.html
@@ -8,13 +8,15 @@
- solidfire.adaptor.schedule_adaptor — SolidFire Python SDK v1.1.0.91
+ solidfire.adaptor.schedule_adaptor — SolidFire Python SDK v1.4.0.271
+
+
@@ -34,7 +36,10 @@
-
+
+
+
@@ -44,6 +49,7 @@
+
@@ -66,7 +72,7 @@
- 1.1.0.91
+ 1.4.0.271
@@ -87,8 +93,11 @@
-
- SolidFire Python SDK
+
+
+
+
+ SolidFire Python SDK v1.2
Account Management Examples
Snapshot Scheduling Examples
solidfire package
@@ -104,8 +113,10 @@
-
- solidfire-sdk-python
+
+
+ solidfire-sdk-python
+
@@ -118,23 +129,40 @@
+
+
+
+
+
+
+
+
+
+
@@ -151,12 +179,10 @@
Source code for solidfire.adaptor.schedule_adaptor # EXPRESS WRITTEN PERMISSION OF NETAPP, INC.
"""Module implements Schedule Simplification conversion logic."""
from solidfire.apiactual import ApiSchedule , ApiScheduleInfo , ApiWeekday , \
-
ApiGetScheduleResult , ApiListSchedulesResult , ApiModifyScheduleResult , \
-
ApiCreateScheduleResult
+
ApiGetScheduleResult , ApiListSchedulesResult , ApiModifyScheduleResult
from solidfire.custom.models import Weekday , DaysOfMonthFrequency , \
DaysOfWeekFrequency , TimeIntervalFrequency
-
from solidfire.models import Schedule , Frequency , ScheduleInfo
-
from solidfire.results import GetScheduleResult , ListSchedulesResult , \
+
from solidfire.models import Schedule , Frequency , ScheduleInfo , GetScheduleResult , ListSchedulesResult , \
CreateScheduleResult , ModifyScheduleResult
import logging
@@ -180,11 +206,7 @@
Source code for solidfire.adaptor.schedule_adaptor ApiGetScheduleResult, params ,
since , deprecated )
- result = GetScheduleResult ()
-
- result . schedule = ScheduleAdaptor . to_schedule ( api_result . schedule )
-
- return result
+
return GetScheduleResult ( schedule = ScheduleAdaptor . to_schedule ( api_result . schedule ))
@staticmethod
[docs] def list_schedules ( element , params , since , deprecated ):
@@ -197,16 +219,11 @@
Source code for solidfire.adaptor.schedule_adaptor api_result = element . send_request ( "ListSchedules" ,
ApiListSchedulesResult , params ,
since , deprecated )
-
- result = ListSchedulesResult ()
-
schedules = []
for schedule in api_result . schedules :
schedules . append ( ScheduleAdaptor . to_schedule ( schedule ))
- result . schedules = schedules
-
- return result
+
return ListSchedulesResult ( schedules = schedules )
@staticmethod
[docs] def modify_schedule ( element , params , since , deprecated ):
@@ -216,19 +233,17 @@
Source code for solidfire.adaptor.schedule_adaptor directly. Documentation here is intentionally brief.
"""
-
if hasattr ( params [ 'schedule' ] . schedule_id , '_member_type' ) or \
-
params [ 'schedule' ] . schedule_id is None :
+
if params [ 'schedule' ] . schedule_id is None :
raise AttributeError ( "ScheduleID is missing. Cannot modify a "
"schedule without a ScheduleID" )
-
if hasattr ( params [ 'schedule' ] . frequency , '_member_type' ) or \
-
params [ 'schedule' ] . frequency is None :
+
if params [ 'schedule' ] . frequency is None :
raise AttributeError ( "Frequency is not present. Make sure the "
"schedule object has a value in the "
"frequency property before attempting to "
-
"modify a Schedule." )
+
"create a Schedule." )
-
if hasattr ( params [ 'schedule' ] . schedule_info , '_member_type' ):
+
if params [ 'schedule' ] . schedule_info is None :
raise AttributeError ( "Schedule_info is not present. Make sure the "
"schedule object has a value in the "
"schedule_info property before attempting to "
@@ -236,11 +251,14 @@
Source code for solidfire.adaptor.schedule_adaptor api_schedule = ScheduleAdaptor . to_api_schedule ( params [ 'schedule' ])
- element . send_request ( "ModifySchedule" ,
+ api_result = element . send_request ( "ModifySchedule" ,
ApiModifyScheduleResult , api_schedule . to_json (),
since , deprecated )
- return ModifyScheduleResult ()
+
if api_result . schedule is not None :
+
return ModifyScheduleResult ( schedule = ScheduleAdaptor . to_schedule ( api_result . schedule ))
+
else :
+
return ModifyScheduleResult ()
@staticmethod
[docs] def create_schedule ( element , params , since , deprecated ):
@@ -249,27 +267,29 @@
Source code for solidfire.adaptor.schedule_adaptor create_schedules method in the Element class. DO NOT CALL THIS
directly. Documentation here is intentionally brief.
"""
-
if not hasattr ( params [ 'schedule' ] . schedule_id , '_member_type' ):
+
if params [ 'schedule' ] . schedule_id is not None :
raise AttributeError ( "ScheduleID should not be present. Do "
"not specify ScheduleID when creating a "
"Schedule. One will be assigned upon "
"creation." )
-
if hasattr ( params [ 'schedule' ] . frequency , '_member_type' ) or \
-
params [ 'schedule' ] . frequency is None :
+
if params [ 'schedule' ] . frequency is None :
raise AttributeError ( "Frequency is not present. Make sure the "
"schedule object has a value in the "
"frequency property before attempting to "
"create a Schedule." )
-
if hasattr ( params [ 'schedule' ] . schedule_info , '_member_type' ):
+
if params [ 'schedule' ] . schedule_info is None :
raise AttributeError ( "Schedule_info is not present. Make sure the "
"schedule object has a value in the "
"schedule_info property before attempting to "
"modify a Schedule." )
+
if params [ "schedule" ] . frequency . minutes is None :
+
params . setdefault ( "frequency" , {})[ "minutes" ] = 0
+
if params [ "schedule" ] . frequency . hours is None :
+
params . setdefault ( "frequency" , {})[ "hours" ] = 0
api_schedule = ScheduleAdaptor . to_api_schedule ( params [ 'schedule' ])
-
api_result = element . send_request ( "CreateSchedule" ,
CreateScheduleResult ,
api_schedule . to_json (),
@@ -287,53 +307,51 @@
Source code for solidfire.adaptor.schedule_adaptor :return: solidfire.models.Schedule
"""
- schedule = Schedule ()
-
- schedule . has_error = api . has_error
- schedule . last_run_status = api . last_run_status
- schedule . last_run_time_start = api . last_run_time_start
- schedule . name = api . schedule_name
- schedule . paused = api . paused
- schedule . recurring = api . recurring
- schedule . run_next_interval = api . run_next_interval
- schedule . schedule_id = api . schedule_id
- schedule . starting_date = api . starting_date
- schedule . to_be_deleted = api . to_be_deleted
-
- schedule . schedule_info = ScheduleAdaptor . to_schedule_info (
+ schedule_info = ScheduleAdaptor . to_schedule_info (
api . schedule_info )
+ frequency = None
try :
freq = api . attributes [ "frequency" ]
if freq == "Time Interval" :
- schedule . frequency = TimeIntervalFrequency ()
- schedule . frequency . days = int ( api . hours / 24 )
- schedule . frequency . hours = int ( api . hours % 24 )
- schedule . frequency . minutes = api . minutes
- schedule . frequency . weekdays = None
- schedule . frequency . monthdays = None
+ frequency = TimeIntervalFrequency (
+ days = int ( api . hours / 24 ),
+ hours = int ( api . hours % 24 ),
+ minutes = api . minutes
+ )
elif freq == "Days Of Month" :
- schedule . frequency = DaysOfMonthFrequency ()
- schedule . frequency . hours = api . hours
- schedule . frequency . minutes = api . minutes
- schedule . frequency . monthdays = api . monthdays
- schedule . frequency . weekdays = None
+ frequency = DaysOfMonthFrequency (
+ hours = api . hours ,
+ minutes = api . minutes ,
+ monthdays = api . monthdays ,
+ )
elif freq == "Days Of Week" :
- schedule . frequency = DaysOfWeekFrequency ()
- schedule . frequency . hours = api . hours
- schedule . frequency . minutes = api . minutes
- schedule . frequency . weekdays = ScheduleAdaptor \
- . to_weekdays ( api . weekdays )
- schedule . frequency . monthdays = None
+ frequency = DaysOfWeekFrequency (
+ hours = api . hours ,
+ minutes = api . minutes ,
+ weekdays = ScheduleAdaptor . to_weekdays ( api . weekdays ),
+ )
else :
raise Exception ( "Cannot determine frequency" )
except :
LOG . error ( "Cannot deserialize Schedule {0} . The frequency "
- "property has an unknown value." . format (
- schedule . name ))
-
- return schedule
+
"property has an unknown value." . format ( api . schedule_name ))
+
+
return Schedule (
+
has_error = api . has_error ,
+
last_run_status = api . last_run_status ,
+
last_run_time_started = api . last_run_time_started ,
+
name = api . schedule_name ,
+
paused = api . paused ,
+
recurring = api . recurring ,
+
run_next_interval = api . run_next_interval ,
+
schedule_id = api . schedule_id ,
+
starting_date = api . starting_date ,
+
to_be_deleted = api . to_be_deleted ,
+
schedule_info = schedule_info ,
+
frequency = frequency
+
)
@staticmethod
[docs] def to_schedule_info ( api ):
@@ -345,20 +363,20 @@
Source code for solidfire.adaptor.schedule_adaptor :return: solidfire.models.ScheduleInfo
"""
- info = ScheduleInfo ()
- info . enable_remote_replication = api . enable_remote_replication
- info . snapshot_name = api . name
- info . retention = api . retention
volume_ids = []
if api . volume_id is not None :
- volume_ids . append ( api . volume_id )
+ volume_ids . append ( int ( api . volume_id ))
if api . volumes is not None :
# noinspection PyTypeChecker
- volume_ids . extend ( api . volumes )
-
- info . volume_ids = volume_ids
-
+ volume_ids . extend ([ int ( vol ) for vol in api . volumes ])
+
+ info = ScheduleInfo (
+ enable_remote_replication = api . enable_remote_replication ,
+ snapshot_name = api . name ,
+ retention = api . retention ,
+ volume_ids = volume_ids
+ )
return info
@staticmethod
@@ -385,24 +403,12 @@
Source code for solidfire.adaptor.schedule_adaptor :return: solidfire.apiactual.ApiSchedule
"""
-
api = ApiSchedule ()
-
api . has_error = schedule . has_error
-
api . last_run_status = schedule . last_run_status
-
api . last_run_time_start = schedule . last_run_time_start
-
api . schedule_name = schedule . name
-
api . paused = schedule . paused
-
api . recurring = schedule . recurring
-
api . run_next_interval = schedule . run_next_interval
-
api . schedule_id = schedule . schedule_id
-
api . starting_date = schedule . starting_date
-
api . to_be_deleted = schedule . to_be_deleted
-
api . schedule_type = 'Snapshot'
-
-
api . schedule_info = ScheduleAdaptor \
+
+
schedule_info = ScheduleAdaptor \
. to_api_schedule_info ( schedule . schedule_info )
frequency = schedule . frequency
-
api . attributes = {}
+
attributes = {}
if type ( frequency ) is TimeIntervalFrequency :
if hasattr ( frequency . days , '_member_type' ) or frequency . days is \
@@ -414,29 +420,47 @@
Source code for solidfire.adaptor.schedule_adaptor if hasattr ( frequency . minutes , '_member_type' ) or \
frequency . minutes is None :
frequency . minutes = 0
- api . minutes = frequency . minutes
- api . hours = frequency . days * 24 + frequency . hours
- api . attributes [ "frequency" ] = "Time Interval"
- api . weekdays = None
- api . monthdays = None
+ minutes = frequency . minutes
+ hours = frequency . days * 24 + frequency . hours
+ attributes [ "frequency" ] = "Time Interval"
+ weekdays = None
+ monthdays = None
if type ( frequency ) is DaysOfMonthFrequency :
- api . minutes = frequency . minutes
- api . hours = frequency . hours
- api . monthdays = frequency . monthdays
- api . weekdays = None
- api . attributes [ "frequency" ] = "Days Of Month"
+ minutes = frequency . minutes
+ hours = frequency . hours
+ monthdays = frequency . monthdays
+ weekdays = None
+ attributes [ "frequency" ] = "Days Of Month"
if type ( frequency ) is DaysOfWeekFrequency :
- api . minutes = frequency . minutes
- api . hours = frequency . hours
+ minutes = frequency . minutes
+ hours = frequency . hours
api_weekdays = []
for weekday in frequency . weekdays :
- api_weekday = ApiWeekday ()
- api_weekday . day = weekday [ 1 ]
- api_weekday . offset = 1
+ api_weekday = ApiWeekday ( day = weekday [ 1 ],
+ offset = 1 )
api_weekdays . append ( api_weekday )
- api . weekdays = api_weekdays
- api . monthdays = None
- api . attributes [ "frequency" ] = "Days Of Week"
+ weekdays = api_weekdays
+ monthdays = None
+ attributes [ "frequency" ] = "Days Of Week"
+
+
+ api = ApiSchedule ( has_error = schedule . has_error ,
+ last_run_status = schedule . last_run_status ,
+ last_run_time_started = schedule . last_run_time_started ,
+ schedule_name = schedule . name ,
+ paused = schedule . paused ,
+ recurring = schedule . recurring ,
+ run_next_interval = schedule . run_next_interval ,
+ schedule_id = schedule . schedule_id ,
+ starting_date = schedule . starting_date ,
+ to_be_deleted = schedule . to_be_deleted ,
+ schedule_type = 'Snapshot' ,
+ attributes = attributes ,
+ minutes = minutes ,
+ hours = hours ,
+ monthdays = monthdays ,
+ weekdays = weekdays ,
+ schedule_info = schedule_info )
return api
@staticmethod
@@ -449,11 +473,8 @@
Source code for solidfire.adaptor.schedule_adaptor :return: solidfire.apiactual.ApiScheduleInfo
"""
-
api = ApiScheduleInfo ()
-
api . enable_remote_replication = info . enable_remote_replication
-
api . name = info . snapshot_name
-
api . retention = info . retention
+
volumes = None
# noinspection PyTypeChecker
if hasattr ( info . volume_ids , '_member_type' ) or info . volume_ids \
is None or len ( info . volume_ids ) == 0 :
@@ -463,11 +484,18 @@
Source code for solidfire.adaptor.schedule_adaptor else:
- api . volumes = info . volume_ids
+ volumes = info . volume_ids
+ api = ApiScheduleInfo ( enable_remote_replication = info . enable_remote_replication ,
+ name = info . snapshot_name ,
+ retention = info . retention ,
+ volumes = volumes )
return api
+
+
+
@@ -499,10 +527,11 @@ Source code for solidfire.adaptor.schedule_adaptor
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'../../../',
- VERSION:'1.1.0.91',
+ VERSION:'1.4.0.271',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'.html',
- HAS_SOURCE: true
+ HAS_SOURCE: true,
+ SOURCELINK_SUFFIX: '.txt'
};
diff --git a/docs/_build/html/_modules/solidfire/apiactual.html b/docs/_build/html/_modules/solidfire/apiactual.html
index e667752c..aad76a06 100644
--- a/docs/_build/html/_modules/solidfire/apiactual.html
+++ b/docs/_build/html/_modules/solidfire/apiactual.html
@@ -8,13 +8,15 @@
-
solidfire.apiactual — SolidFire Python SDK v1.1.0.91
+
solidfire.apiactual — SolidFire Python SDK v1.4.0.271
+
+
@@ -34,7 +36,10 @@
-
+
+
+
@@ -44,6 +49,7 @@
+
@@ -66,7 +72,7 @@
- 1.1.0.91
+ 1.4.0.271
@@ -87,8 +93,11 @@
-
- SolidFire Python SDK
+
+
+
+
+ SolidFire Python SDK v1.2
Account Management Examples
Snapshot Scheduling Examples
solidfire package
@@ -104,8 +113,10 @@
-
- solidfire-sdk-python
+
+
+ solidfire-sdk-python
+
@@ -118,21 +129,38 @@
+
+
+
+
+
+
+
+
+
+
@@ -225,7 +253,7 @@
Source code for solidfire.apiactual
)
def __init__ ( self , ** kwargs ):
- data_model . DataObject . __init__ ( self , ** kwargs )
+
data_model . DataObject . __init__ ( self , ** kwargs )
[docs] class ApiWeekday ( data_model . DataObject ):
@@ -257,7 +285,7 @@
Source code for solidfire.apiactual
)
def __init__ ( self , ** kwargs ):
- data_model . DataObject . __init__ ( self , ** kwargs )
+
data_model . DataObject . __init__ ( self , ** kwargs )
[docs] class ApiSchedule ( data_model . DataObject ):
@@ -304,14 +332,14 @@
Source code for solidfire.apiactual
:type last_run_status: str
- :param last_run_time_start: Indicates the last time the schedule
+ :param last_run_time_started: Indicates the last time the schedule
started n ISO 8601 date string. Valid values are:
Success
Failed
- :type last_run_time_start: str
+ :type last_run_time_started: str
:param minutes: [required] Shows the minutes that will elapse before the
next snapshot is created. Valid values are: 0 - 59
@@ -402,8 +430,8 @@ Source code for solidfire.apiactual
"
)
- last_run_time_start = data_model . property (
- "lastRunTimeStart" , str ,
+ last_run_time_started = data_model . property (
+ "lastRunTimeStarted" , str ,
array = False , optional = True ,
documentation = " \
Indicates the last time the schedule started n ISO 8601 date string. \
@@ -425,7 +453,7 @@ Source code for solidfire.apiactual
monthdays = data_model . property (
"monthdays" , int ,
- array = True , optional = False ,
+ array = True , optional = True ,
documentation = " \
Shows the days of the month that the next snapshot will be created on. \
Valid values are: 0 - 31 \
@@ -511,14 +539,30 @@ Source code for solidfire.apiactual
weekdays = data_model . property (
"weekdays" , ApiWeekday ,
- array = True , optional = False ,
+ array = True , optional = True ,
documentation = " \
Indicates the days of the week that a snapshot will be made. \
"
)
+ # We implement this function so that the user doesn't have to provide weekdays and
+ # monthdays. To make the command work, if one of them is set, the other must be set
+ # to none.
+[docs] def to_json ( self ):
+
"""
+
Converts DataObject to json.
+
+
:return: the DataObject as a json structure.
+
"""
+
out = super ( ApiSchedule , self ) . to_json ()
+
if "weekdays" not in out :
+
out [ "weekdays" ] = None
+
if "monthdays" not in out :
+
out [ "monthdays" ] = None
+
return out
+
def __init__ ( self , ** kwargs ):
- data_model . DataObject . __init__ ( self , ** kwargs )
+ data_model . DataObject . __init__ ( self , ** kwargs )
[docs] class ApiGetScheduleResult ( data_model . DataObject ):
@@ -538,7 +582,7 @@
Source code for solidfire.apiactual
)
def __init__ ( self , ** kwargs ):
- data_model . DataObject . __init__ ( self , ** kwargs )
+
data_model . DataObject . __init__ ( self , ** kwargs )
[docs] class ApiListSchedulesResult ( data_model . DataObject ):
@@ -559,7 +603,7 @@
Source code for solidfire.apiactual
)
def __init__ ( self , ** kwargs ):
- data_model . DataObject . __init__ ( self , ** kwargs )
+
data_model . DataObject . __init__ ( self , ** kwargs )
[docs] class ApiModifyScheduleResult ( data_model . DataObject ):
@@ -567,30 +611,21 @@
Source code for solidfire.apiactual
The object returned by the \"modify_schedule\" API Service call.
"""
-
- def __init__ ( self , ** kwargs ):
- data_model . DataObject . __init__ ( self , ** kwargs )
-
-
[docs] class ApiCreateScheduleResult ( data_model . DataObject ):
-
"""
-
The object returned by the \"modify_schedule\" API Service call.
-
-
:param schedule: [required] Schedule attributes with modifications.
-
:type schedule: Schedule
-
"""
-
schedule = data_model . property (
"schedule" , ApiSchedule ,
array = False , optional = False ,
documentation = " \
-
Schedule attributes with modifications. \
-
"
+
Schedule attributes with modifications. \
+
"
)
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
+
@@ -622,10 +657,11 @@ Source code for solidfire.apiactual
diff --git a/docs/_build/html/_modules/solidfire/common.html b/docs/_build/html/_modules/solidfire/common.html
index c4c12376..29d9226d 100644
--- a/docs/_build/html/_modules/solidfire/common.html
+++ b/docs/_build/html/_modules/solidfire/common.html
@@ -8,13 +8,15 @@
- solidfire.common — SolidFire Python SDK v1.1.0.91
+ solidfire.common — SolidFire Python SDK v1.4.0.271
+
+
@@ -34,7 +36,10 @@
-
+
+
+
@@ -44,6 +49,7 @@
+
@@ -66,7 +72,7 @@
- 1.1.0.91
+ 1.4.0.271
@@ -87,8 +93,11 @@
-
- SolidFire Python SDK
+
+
+
+
+ SolidFire Python SDK v1.2
Account Management Examples
Snapshot Scheduling Examples
solidfire package
@@ -104,8 +113,10 @@
-
- solidfire-sdk-python
+
+
+ solidfire-sdk-python
+
@@ -118,21 +129,38 @@
+
+
+
+
+
+
+
+
+
+
@@ -149,12 +177,15 @@
Source code for solidfire.common
# EXPRESS WRITTEN PERMISSION OF NETAPP, INC.
"""API Common Library"""
-import json
-from contextlib import closing
-
import itertools
+import json
import logging
+import requests
+from requests.auth import HTTPBasicAuth
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+requests . packages . urllib3 . disable_warnings ( InsecureRequestWarning )
+
from solidfire.common import model
LOG = logging . getLogger ( 'solidfire.Element' )
@@ -187,7 +218,7 @@ Source code for solidfire.common
[docs] class SdkOperationError ( Exception ):
def __init__ ( self , * args , ** kwargs ):
-
Exception . __init__ ( self , * args , ** kwargs )
+ Exception . __init__ ( self , * args , ** kwargs )
[docs] class ApiServerError ( Exception ):
@@ -211,11 +242,11 @@
Source code for solidfire.common
self . _method_name = method_name
self . _err_json = err_json
- Exception . __init__ ( self )
+ Exception . __init__ ( self )
def __repr__ ( self ):
return ' %s (method_name=" %s ", err_json= %s )' % (
- self . __class__ . __name__ ,
+ self . __class__ . __name__ ,
self . _method_name ,
self . _err_json
)
@@ -281,14 +312,14 @@ Source code for solidfire.common
self . _since = float ( since ) if since is not None else since
self . _deprecated = float ( deprecated ) \
if deprecated is not None else deprecated
- Exception . __init__ ( self )
+ Exception . __init__ ( self )
def __repr__ ( self ):
return ' %s (method_name=" %s ", ' \
'api_version= %s , ' \
'since= %s , ' \
'deprecated= %s ) ' % (
- self . __class__ . __name__ ,
+ self . __class__ . __name__ ,
self . _method_name ,
self . _api_version ,
self . _since ,
@@ -302,7 +333,7 @@ Source code for solidfire.common
' Service Api Version: {_api_version} \n '
' Method Exists Since: {_since} \n '
' Method Deprecated: {_deprecated} \n ' ,
- ** self . __dict__
+ ** self . __dict__
)
@property
@@ -361,13 +392,13 @@ Source code for solidfire.common
self . _violations . append (
name + ' (version: ' + str ( since ) + ')'
)
- Exception . __init__ ( self )
+ Exception . __init__ ( self )
def __repr__ ( self ):
return ' %s (method_name=" %s ", ' \
'api_version= %s , ' \
'params= %s ) ' % (
- self . __class__ . __name__ ,
+ self . __class__ . __name__ ,
self . _method_name ,
self . _api_version ,
self . _params ,
@@ -379,7 +410,7 @@ Source code for solidfire.common
' Method: {_method_name} \n '
' Api Version: {_api_version} \n '
' Invalid Parameters: {_violations} \n ' ,
- ** self . __dict__
+ ** self . __dict__
)
@property
@@ -424,12 +455,12 @@ Source code for solidfire.common
"""
self . _api_version = float ( api_version )
self . _current_version = float ( current_version )
- Exception . __init__ ( self )
+ Exception . __init__ ( self )
def __repr__ ( self ):
return ' %s (api_version= %s , ' \
'current_version= %s ) ' % (
- self . __class__ . __name__ ,
+ self . __class__ . __name__ ,
self . _api_version ,
self . _current_version
)
@@ -440,7 +471,7 @@ Source code for solidfire.common
' Provided Api Version: {_api_version} \n '
' Max Version: {current_version} \n ' ,
current_version = self . _current_version ,
- ** self . __dict__
+ ** self . __dict__
)
@property
@@ -476,12 +507,12 @@ Source code for solidfire.common
"""
self . _api_version = float ( api_version )
self . _supported_versions = [ float ( i ) for i in supported_versions ]
- Exception . __init__ ( self )
+ Exception . __init__ ( self )
def __repr__ ( self ):
return ' %s (api_version= %s , ' \
'supported_versions= %s )' % (
- self . __class__ . __name__ ,
+ self . __class__ . __name__ ,
self . _api_version ,
self . _supported_versions
)
@@ -491,7 +522,7 @@ Source code for solidfire.common
' \n Version Unsupported: \n '
' Provided Api Version: {_api_version} \n '
' Supported Version: {_supported_versions} \n ' ,
- ** self . __dict__
+ ** self . __dict__
)
@property
@@ -504,14 +535,15 @@ Source code for solidfire.common
"""The versions supported by the connected Element OS"""
return self . _supported_versions
+[docs] class ApiConnectionError ( Exception ):
+
def __init__ ( self , message ):
+
super ( ApiConnectionError , self ) . __init__ ( message )
[docs] class CurlDispatcher ( object ):
"""
The CurlDispatcher is responsible for connecting, sending, and receiving
data to a server.
"""
-
import pycurl
-
pycurl . version_info ()
def __init__ ( self , endpoint , username , password , verify_ssl ):
"""
@@ -531,8 +563,8 @@
Source code for solidfire.common
:type verify_ssl: bool
"""
self . _endpoint = endpoint
- self . _credentials = str . format ( ' {u} : {p} ' , u = username , p = password ) \
- if ( username or password ) else None
+ self . _username = username
+ self . _password = password
self . _verify_ssl = verify_ssl
self . _timeout = 300
self . _connect_timeout = 30
@@ -581,31 +613,15 @@ Source code for solidfire.common
:param data: the data to be posted.
:type data: str or json
"""
- try :
- from io import BytesIO
- assert BytesIO
- except ImportError :
- from io import StringIO as BytesIO
-
- with closing ( CurlDispatcher . pycurl . Curl ()) as c :
- c . setopt ( c . URL , self . _endpoint )
- obuffer = BytesIO ()
- c . setopt ( c . POSTFIELDS , data )
- c . setopt ( c . WRITEFUNCTION , obuffer . write )
- c . setopt ( c . CONNECTTIMEOUT , self . _connect_timeout )
- c . setopt ( c . TIMEOUT , self . _timeout )
-
- if self . _credentials :
- c . setopt ( c . HTTPAUTH , c . HTTPAUTH_BASIC )
- c . setopt ( c . USERPWD , self . _credentials )
-
- if not self . _verify_ssl :
- c . setopt ( c . SSL_VERIFYPEER , 0 )
- c . setopt ( c . SSL_VERIFYHOST , 0 )
-
- c . perform ()
-
- return obuffer . getvalue () . decode ( 'utf-8' )
+
auth = None
+
if self . _username is None or self . _password is None :
+
raise ValueError ( "Username or Password is not set" )
+
else :
+
auth = HTTPBasicAuth ( self . _username , self . _password )
+
resp = requests . post ( self . _endpoint , data = data , json = None ,
+
verify = self . _verify_ssl , timeout = self . _timeout ,
+
auth = auth )
+
return resp . text
[docs] class ServiceBase ( object ):
@@ -641,13 +657,23 @@
Source code for solidfire.common
"""
self . _api_version = float ( api_version )
+ endpoint = str . format ( 'https:// {mvip} /json-rpc/ {api_version} ' ,
+ mvip = mvip , api_version = self . _api_version )
+ if 'https' in endpoint :
+ self . _port = 443
+ else :
+ self . _port = ''
+
if not dispatcher :
- endpoint = str . format ( 'https:// {mvip} /json-rpc/ {api_version} ' ,
- mvip = mvip , api_version = self . _api_version )
dispatcher = CurlDispatcher ( endpoint , username , password ,
verify_ssl )
self . _dispatcher = dispatcher
+ if mvip is not None :
+ mvipArr = mvip . split ( ':' )
+ if len ( mvipArr ) == 2 :
+ self . _port = mvipArr [ 1 ]
+
[docs] def timeout ( self , timeout_in_sec ):
"""
Set the time to wait for a response before timeout.
@@ -691,7 +717,8 @@
Source code for solidfire.common
result_type ,
params = None ,
since = None ,
- deprecated = None ):
+ deprecated = None ,
+ return_response_raw = False ):
"""
:param method_name: the name of the API method to call
:type method_name: str
@@ -722,50 +749,84 @@ Source code for solidfire.common
if hasattr ( ATOMIC_COUNTER , 'next' ):
atomic_id = ATOMIC_COUNTER . next ()
else :
- atomic_id = ATOMIC_COUNTER . __next__ ()
+ atomic_id = ATOMIC_COUNTER . __next__ ()
+
encoded = json . dumps ({
'method' : method_name ,
'id' : atomic_id if atomic_id > 0 else 0 ,
'params' : dict (
- ( name , model . serialize ( val ))
- for name , val in params . items ()
- ),
+ ( name , model . serialize ( val ))
+ for name , val in params . items ()
+ ),
})
- import pycurl
try :
LOG . info ( msg = encoded )
response_raw = self . _dispatcher . post ( encoded )
- except pycurl . error as error :
+ except requests . ConnectionError :
+ raise ApiConnectionError ( "Was not able to connect to the specified target as a result of timing out." )
+ except requests . ReadTimeout :
+ raise ApiConnectionError ( "Read timed out." )
+ except requests . exceptions . ChunkedEncodingError as error :
+ raise ApiConnectionError ( error . args )
+ except Exception as error :
+ if 2 <= len ( error . args ):
+ json_err = json . dumps (
+ {
+ 'error' :
+ {
+ 'name' : str ( error . __class__ ) . split ( ' \' ' )[ 1 ],
+ 'code' : 500 ,
+ 'message' : error . args [ 1 ] . __str__ ()
+ }
+ }
+ )
+ else :
+ json_err = json . dumps (
+ {
+ 'error' :
+ {
+ 'name' : str ( error . __class__ ) . split ( ' \' ' )[ 1 ],
+ 'code' : 500 ,
+ 'message' : error . args . __str__ ()
+ }
+ }
+ )
+ raise ApiServerError ( method_name , json_err )
+
+ if "401 Unauthorized." in response_raw :
json_err = json . dumps (
{
'error' :
{
- 'name' : str ( error . __class__ ) . split ( ' \' ' )[ 1 ],
- 'code' : 500 ,
- 'message' : error . args [ 1 ]
+ 'name' : 'AuthorizationError' ,
+ 'code' : 401 ,
+ 'message' : 'Username or password incorrect.'
}
}
)
- raise ApiServerError ( method_name , json_err )
+ raise ApiConnectionError ( json_err )
- if "401 Unauthorized." in response_raw :
+ if "404 Not Found" in response_raw :
json_err = json . dumps (
{
'error' :
{
- 'name' : 'AuthorizationError' ,
- 'code' : 401 ,
- 'message' : 'Username or password incorrect.'
+ 'name' : 'NotFoundError' ,
+ 'code' : 404 ,
+ 'message' : 'The connection was not found.'
}
}
)
- raise ApiServerError ( 'login' , json_err )
+ raise ApiConnectionError ( json_err )
+
+ if return_response_raw :
+ return response_raw
# noinspection PyBroadException
try :
response = json . loads ( response_raw )
- LOG . debug ( msg = response )
+ LOG . debug ( msg = response_raw )
except Exception as error :
LOG . error ( msg = response_raw )
response = json . dumps (
@@ -780,10 +841,26 @@ Source code for solidfire.common
)
if 'error' in response :
- raise ApiServerError ( method_name , response [ 'error' ])
+ raise ApiServerError ( method_name , json . dumps ( response ))
else :
return model . extract ( result_type , response [ 'result' ])
+ def _check_connection_type ( self , method_name ,
+ connection_type ):
+ """
+ Check the connection type to verify that it is right.
+
+ :param connection_type: connection type the method expects.
+ :type connection_type: str
+ """
+ if ( connection_type == "Cluster" and int ( self . _port ) == 442 ):
+ error = method_name + " cannot be called on a node connection. It is a cluster-only method."
+ raise ApiConnectionError ( error )
+ elif ( connection_type == "Node" and int ( self . _port ) == 443 ):
+ error = method_name + " cannot be called on a cluster connection. It is a node-only method."
+ raise ApiConnectionError ( error )
+
+
def _check_method_version ( self ,
method_name ,
since ,
@@ -842,6 +919,9 @@ Source code for solidfire.common
+
+
+
@@ -873,10 +953,11 @@ Source code for solidfire.common
diff --git a/docs/_build/html/_modules/solidfire/common/model.html b/docs/_build/html/_modules/solidfire/common/model.html
index 0f0ca918..2d74d23b 100644
--- a/docs/_build/html/_modules/solidfire/common/model.html
+++ b/docs/_build/html/_modules/solidfire/common/model.html
@@ -8,13 +8,15 @@
- solidfire.common.model — SolidFire Python SDK v1.1.0.91
+ solidfire.common.model — SolidFire Python SDK v1.4.0.271
+
+
@@ -34,7 +36,10 @@
-
+
+
+
@@ -44,6 +49,7 @@
+
@@ -66,7 +72,7 @@
- 1.1.0.91
+ 1.4.0.271
@@ -87,8 +93,11 @@
-
- SolidFire Python SDK
+
+
+
+
+ SolidFire Python SDK v1.2
Account Management Examples
Snapshot Scheduling Examples
solidfire package
@@ -104,8 +113,10 @@
-
- solidfire-sdk-python
+
+
+ solidfire-sdk-python
+
@@ -118,23 +129,40 @@
+
+
+
+
+
+
+
+
+
+
@@ -156,7 +184,8 @@
Source code for solidfire.common.model
from future.utils import with_metaclass
KNOWN_CONVERSIONS = {
- type ( set ): list
+ type ( set ): list ,
+ UUID : str
}
@@ -215,8 +244,8 @@ Source code for solidfire.common.model
return_value = src
elif typ == UUID :
return_value = UUID ( src )
- elif typ . __init__ ( src ) is not None :
- return_value = typ . __init__ ( src )
+ elif typ . __init__ ( src ) is not None :
+ return_value = typ . __init__ ( src )
else :
return_value = src
@@ -229,7 +258,7 @@ Source code for solidfire.common.model
"""
def __init__ ( self , member_name , member_type , array = False , optional = False ,
- documentation = None ):
+ documentation = None , dictionaryType = None ):
"""
ModelProperty constructor.
@@ -253,6 +282,7 @@ Source code for solidfire.common.model
self . _array = array
self . _optional = optional
self . _documentation = documentation
+ self . _dictionaryType = dictionaryType
def __repr__ ( self ):
if self . _array :
@@ -272,7 +302,10 @@ Source code for solidfire.common.model
"""
if data is None or hasattr ( data , '_member_type' ): # HACK ALERT
if not self . _optional :
- out [ self . _member_name ] = None
+ # We want to catch this error.
+ raise ValueError ( self . _member_name + " is a required parameter." )
+ # THE OLD WAY!
+ #out[self._member_name] = None
elif self . _array :
out [ self . _member_name ] = [ serialize ( x ) for x in data ]
elif self . _optional :
@@ -293,6 +326,11 @@ Source code for solidfire.common.model
if self . _array :
return [] if data is None else [ extract ( self . _member_type , x ) for x
in data ]
+ if self . _dictionaryType :
+ newdict = dict ()
+ for key in data :
+ newdict [ key ] = extract ( self . _dictionaryType , data [ key ])
+ return newdict
else :
return None if data is None else extract ( self . _member_type , data )
@@ -349,9 +387,9 @@ Source code for solidfire.common.model
MetaDataObject defines a method for attributing ModelProperties to a type.
"""
- def __init__ ( cls , name , bases , classdict ):
- super ( MetaDataObject , cls ) . __init__ ( name , bases , classdict )
- cls . _create_properties ()
+ def __init__ ( cls , name , bases , classdict ):
+ super ( MetaDataObject , cls ) . __init__ ( name , bases , classdict )
+ cls . _create_properties ()
def _create_properties ( self ):
pass
@@ -365,25 +403,28 @@ Source code for solidfire.common.model
_properties = None
@classmethod
- def _create_properties ( cls ):
+ def _create_properties ( cls ):
"""
Maps api descriptor attributes to the MetaData properties for this
object.
"""
- cls . _properties = {}
- for name in dir ( cls ):
- prop = getattr ( cls , name , None )
+ cls . _properties = {}
+ for name in dir ( cls ):
+ prop = getattr ( cls , name , None )
if isinstance ( prop , ModelProperty ):
- cls . _properties [ name ] = prop
+ cls . _properties [ name ] = prop
def __init__ ( self , ** kwargs ):
- for key , value in kwargs . items ():
- if key not in type ( self ) . _properties :
- msg_fmt = 'Key " {key} " is not a valid property'
- msg = msg_fmt . format ( key )
- raise TypeError ( msg )
- else :
- setattr ( self , key , value )
+ # Iterate through available properties and start removing them
+ # from kwargs
+ for name , property in type ( self ) . _properties . items ():
+ if not property . optional () and name not in kwargs . keys () and name != "secret" :
+ raise ValueError ( name + " is a required parameter." )
+ if name in kwargs :
+ setattr ( self , name , kwargs [ name ])
+ del kwargs [ name ]
+ if ( len ( kwargs . keys ()) != 0 ):
+ raise ValueError ( "The following params are invalid: " + str ( kwargs . keys ()))
[docs] def get_properties ( self ):
"""
@@ -421,7 +462,7 @@
Source code for solidfire.common.model
msg = msg_fmt . format ( name = name , repr = attr_repr )
props . append ( msg )
return str . format ( str ( ' {cls} ( {props} )' ),
- cls = type ( self ) . __name__ ,
+ cls = type ( self ) . __name__ ,
props = str . join ( str ( ', ' ), props ))
[docs] def to_json ( self ):
@@ -436,7 +477,7 @@
Source code for solidfire.common.model
@classmethod
-
[docs] def property ( member_name , member_type ,
array = False , optional = False ,
-
documentation = None ):
+
documentation = None , dictionaryType = None ):
"""
Constructs the type for a DataObject property.
@@ -516,9 +562,13 @@
Source code for solidfire.common.model
member_type = member_type ,
array = array ,
optional = optional ,
- documentation = documentation )
+
documentation = documentation ,
+
dictionaryType = dictionaryType )
+
+
+
@@ -550,10 +600,11 @@ Source code for solidfire.common.model
diff --git a/docs/_build/html/_modules/solidfire/factory.html b/docs/_build/html/_modules/solidfire/factory.html
index 1daa5c05..f55454ab 100644
--- a/docs/_build/html/_modules/solidfire/factory.html
+++ b/docs/_build/html/_modules/solidfire/factory.html
@@ -8,13 +8,15 @@
- solidfire.factory — SolidFire Python SDK v1.1.0.91
+ solidfire.factory — SolidFire Python SDK v1.4.0.271
+
+
@@ -34,7 +36,10 @@
-
+
+
+
@@ -44,6 +49,7 @@
+
@@ -66,7 +72,7 @@
- 1.1.0.91
+ 1.4.0.271
@@ -87,8 +93,11 @@
-
- SolidFire Python SDK
+
+
+
+
+ SolidFire Python SDK v1.2
Account Management Examples
Snapshot Scheduling Examples
solidfire package
@@ -104,8 +113,10 @@
-
- solidfire-sdk-python
+
+
+ solidfire-sdk-python
+
@@ -118,21 +129,38 @@
+
+
+
+
+
+
+
+
+
+
@@ -157,7 +185,7 @@
Source code for solidfire.factory
LOG = logging . getLogger ( 'solidfire.Element' )
min_sdk_version = 7.0
-max_sdk_version = 8.4
+max_sdk_version = 9.1
[docs] class ElementFactory :
@@ -167,7 +195,7 @@
Source code for solidfire.factory
@staticmethod
[docs] def create ( target , username , password , version = None ,
-
verify_ssl = False , port = 443 ):
+
verify_ssl = False , port = 443 , print_ascii_art = True ):
"""
Factory method to create a Element object which is used to call
the SolidFire API. This method runs multiple checks and logic
@@ -193,6 +221,9 @@
Source code for solidfire.factory
default for a SolidFire cluster. Specify 442 if connecting to
a SoldiFire node.
:type port: int
+ :param print_ascii_art: When True, print the SolidFire Robot to the
+ log. Production deployments might consider disabling this feature.
+ :type print_ascii_art: bool
:return: a configured and tested instance of Element
:raises:
SdkOperationError: verify_ssl is true but target is an IP address
@@ -201,7 +232,7 @@ Source code for solidfire.factory
instance of Element OS.
"""
- target_is_ip = re . match ( r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$" ,
+ target_is_ip = re . match ( r "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$" ,
target )
if target_is_ip is not None and verify_ssl :
@@ -209,6 +240,12 @@ Source code for solidfire.factory
"address. Set verify_ssl to false or use "
"a fully qualified domain name." )
+ if port is None :
+ port = 443
+
+ if verify_ssl is None :
+ verify_ssl = False
+
if port != 443 :
target = target + ":" + str ( port )
@@ -263,10 +300,14 @@ Source code for solidfire.factory
LOG . info ( "Connected to {0} using API version {1} "
. format ( target , element . api_version ))
- LOG . info ( ascii_art ( element . api_version ))
+ if print_ascii_art :
+ LOG . info ( ascii_art ( element . api_version ))
return element
+
+
+
@@ -298,10 +339,11 @@ Source code for solidfire.factory
diff --git a/docs/_build/html/_modules/solidfire/models.html b/docs/_build/html/_modules/solidfire/models.html
index 3bc9b4b4..7bc0fd61 100644
--- a/docs/_build/html/_modules/solidfire/models.html
+++ b/docs/_build/html/_modules/solidfire/models.html
@@ -8,13 +8,15 @@
- solidfire.models — SolidFire Python SDK v1.1.0.91
+ solidfire.models — SolidFire Python SDK v1.4.0.271
+
+
@@ -34,7 +36,10 @@
-
+
+
+
@@ -44,6 +49,7 @@
+
@@ -66,7 +72,7 @@
- 1.1.0.91
+ 1.4.0.271
@@ -87,8 +93,11 @@
-
- SolidFire Python SDK
+
+
+
+
+ SolidFire Python SDK v1.2
Account Management Examples
Snapshot Scheduling Examples
solidfire package
@@ -104,8 +113,10 @@
-
- solidfire-sdk-python
+
+
+ solidfire-sdk-python
+
@@ -118,21 +129,38 @@
+
+
+
+
+
+
+
+
+
+
@@ -140,12 +168,11 @@
Source code for solidfire.models
#!/usr/bin/python
-# -*- coding: utf-8 -*-
#
# Copyright © 2014-2016 NetApp, Inc. All Rights Reserved.
#
# DO NOT EDIT THIS CODE BY HAND! It has been generated with jsvcgen.
-#
+
from __future__ import unicode_literals
from __future__ import absolute_import
from solidfire.common import model as data_model
@@ -153,6486 +180,19917 @@ Source code for solidfire.models
from solidfire.custom.models import CHAPSecret as UserDefinedCHAPSecret
from solidfire.custom.models import Frequency as UserDefinedFrequency
+[docs] class Frequency ( UserDefinedFrequency ):
+
def __init__ ( self , ** kwargs ):
+
self = UserDefinedFrequency ()
+
data_model . DataObject . __init__ ( self , ** kwargs )
[docs] class CHAPSecret ( UserDefinedCHAPSecret ):
def __init__ ( self , ** kwargs ):
self = UserDefinedCHAPSecret ()
-
data_model . DataObject . __init__ ( self , ** kwargs )
+ data_model . DataObject . __init__ ( self , ** kwargs )
+[docs] class StorageContainer ( data_model . DataObject ):
+
"""StorageContainer
-
[docs] class Frequency ( UserDefinedFrequency ):
-
def __init__ ( self , ** kwargs ):
-
self = UserDefinedFrequency ()
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
:param name: [required]
+
:type name: str
+
:param storage_container_id: [required]
+
:type storage_container_id: UUID
-
[docs] class AddressBlock ( data_model . DataObject ):
-
"""
-
Unique Range of IP addresses to include in the virtual network.
+
:param account_id: [required]
+
:type account_id: int
-
:param start: [required] Start of the IP address range.
-
:type start: str
+
:param protocol_endpoint_type: [required]
+
:type protocol_endpoint_type: str
-
:param size: [required] Number of IP addresses to include in the block.
-
:type size: int
-
"""
+
:param initiator_secret: [required]
+
:type initiator_secret: str
-
start = data_model . property (
-
"start" , str ,
+
:param target_secret: [required]
+
:type target_secret: str
+
+
:param status: [required]
+
:type status: str
+
+
:param virtual_volumes:
+
:type virtual_volumes: UUID
+
+
"""
+
name = data_model . property (
+
"name" , str ,
array = False , optional = False ,
-
documentation = " \
-
Start of the IP address range. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
size = data_model . property (
-
"size" , int ,
+
storage_container_id = data_model . property (
+
"storageContainerID" , UUID ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
account_id = data_model . property (
+
"accountID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
protocol_endpoint_type = data_model . property (
+
"protocolEndpointType" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
initiator_secret = data_model . property (
+
"initiatorSecret" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
target_secret = data_model . property (
+
"targetSecret" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
status = data_model . property (
+
"status" , str ,
array = False , optional = False ,
-
documentation = " \
-
Number of IP addresses to include in the block. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
virtual_volumes = data_model . property (
+
"virtualVolumes" , UUID ,
+
array = True , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
name ,
+
storage_container_id ,
+
account_id ,
+
protocol_endpoint_type ,
+
initiator_secret ,
+
target_secret ,
+
status ,
+
virtual_volumes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+[docs] class ListStorageContainersResult ( data_model . DataObject ):
+
"""ListStorageContainersResult
-
[docs] class DriveHardware ( data_model . DataObject ):
-
"""
+
:param storage_containers: [required]
+
:type storage_containers: StorageContainer
-
:param canonical_name: [required]
-
:type canonical_name: str
+
"""
+
storage_containers = data_model . property (
+
"storageContainers" , StorageContainer ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
-
:param connected: [required]
-
:type connected: bool
+
def __init__ ( self ,
+
storage_containers ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param dev: [required]
-
:type dev: int
+
[docs] class CreateSnapshotRequest ( data_model . DataObject ):
+
"""CreateSnapshotRequest
+
CreateSnapshot enables you to create a point-in-time copy of a volume. You can create a snapshot from any volume or from an existing snapshot. If you do not provide a SnapshotID with this API method, a snapshot is created from the volume's active branch.
+
If the volume from which the snapshot is created is being replicated to a remote cluster, the snapshot can also be replicated to the same target. Use the enableRemoteReplication parameter to enable snapshot replication.
+
Note: Creating a snapshot is allowed if cluster fullness is at stage 2 or 3. Snapshots are not created when cluster fullness is at stage 4 or 5.
-
:param dev_path: [required]
-
:type dev_path: str
+
:param volume_id: [required] Specifies the unique ID of the volume image from which to copy.
+
:type volume_id: int
-
:param drive_type: [required]
-
:type drive_type: str
+
:param snapshot_id: Specifies the unique ID of a snapshot from which the new snapshot is made. The snapshotID passed must be a snapshot on the given volume.
+
:type snapshot_id: int
-
:param life_remaining_percent: [required]
-
:type life_remaining_percent: int
+
:param name: Specifies a name for the snapshot. If unspecified, the date and time the snapshot was taken is used.
+
:type name: str
-
:param lifetime_read_bytes: [required]
-
:type lifetime_read_bytes: int
+
:param enable_remote_replication: Replicates the snapshot created to a remote cluster. Possible values are: true: The snapshot is replicated to remote storage. false: Default. The snapshot is not replicated.
+
:type enable_remote_replication: bool
-
:param lifetime_write_bytes: [required]
-
:type lifetime_write_bytes: int
+
:param retention: Specifies the amount of time for which the snapshot is retained. The format is HH:mm:ss.
+
:type retention: str
-
:param name: [required]
-
:type name: str
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
-
:param path: [required]
-
:type path: str
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """Specifies the unique ID of the volume image from which to copy. """ ,
+
dictionaryType = None
+
)
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
+
array = False , optional = True ,
+
documentation = """Specifies the unique ID of a snapshot from which the new snapshot is made. The snapshotID passed must be a snapshot on the given volume. """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = True ,
+
documentation = """Specifies a name for the snapshot. If unspecified, the date and time the snapshot was taken is used. """ ,
+
dictionaryType = None
+
)
+
enable_remote_replication = data_model . property (
+
"enableRemoteReplication" , bool ,
+
array = False , optional = True ,
+
documentation = """Replicates the snapshot created to a remote cluster. Possible values are: true: The snapshot is replicated to remote storage. false: Default. The snapshot is not replicated. """ ,
+
dictionaryType = None
+
)
+
retention = data_model . property (
+
"retention" , str ,
+
array = False , optional = True ,
+
documentation = """Specifies the amount of time for which the snapshot is retained. The format is HH:mm:ss. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
-
:param path_link: [required]
-
:type path_link: str
+
def __init__ ( self ,
+
volume_id ,
+
snapshot_id = None ,
+
name = None ,
+
enable_remote_replication = None ,
+
retention = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param power_on_hours: [required]
-
:type power_on_hours: int
+
-
:param security_at_maximum: [required]
-
:type security_at_maximum: bool
+
[docs] class VolumeStats ( data_model . DataObject ):
+
"""VolumeStats
+
Contains statistical data for an individual volume.
-
:param security_enabled: [required]
-
:type security_enabled: bool
+
:param account_id: [required] AccountID of the volume owner.
+
:type account_id: int
-
:param security_frozen: [required]
-
:type security_frozen: bool
+
:param actual_iops: Current actual IOPS to the volume in the last 500 milliseconds.
+
:type actual_iops: int
-
:param security_locked: [required]
-
:type security_locked: bool
+
:param average_iopsize: Average size in bytes of recent I/O to the volume in the last 500 milliseconds.
+
:type average_iopsize: int
-
:param security_supported: [required]
-
:type security_supported: bool
+
:param burst_iopscredit: The total number of IOP credits available to the user. When users are not using up to the max IOPS, credits are accrued.
+
:type burst_iopscredit: int
-
:param serial: [required]
-
:type serial: str
+
:param client_queue_depth: The number of outstanding read and write operations to the cluster.
+
:type client_queue_depth: int
-
:param size: [required]
-
:type size: int
+
:param latency_usec: The observed latency time, in microseconds, to complete operations to a volume. A "0" (zero) value means there is no I/O to the volume.
+
:type latency_usec: int
-
:param slot: [required]
-
:type slot: int
+
:param async_delay:
+
:type async_delay: int
-
:param uuid: [required]
-
:type uuid: UUID
+
:param metadata_hosts: The volume services on which the volume metadata resides.
+
:type metadata_hosts: MetadataHosts
-
:param vendor: [required]
-
:type vendor: str
+
:param desired_metadata_hosts:
+
:type desired_metadata_hosts: MetadataHosts
-
:param version: [required]
-
:type version: str
+
:param non_zero_blocks: [required] The number of 4KiB blocks with data after the last garbage collection operation has completed.
+
:type non_zero_blocks: int
-
:param smart_ssd_write_capable: (optional)
-
:type smart_ssd_write_capable: bool
-
"""
+
:param read_bytes: [required] Total bytes read by clients.
+
:type read_bytes: int
-
canonical_name = data_model . property (
-
"canonicalName" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param read_latency_usec: The average time, in microseconds, to complete read operations.
+
:type read_latency_usec: int
-
connected = data_model . property (
-
"connected" , bool ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param read_ops: [required] Total read operations.
+
:type read_ops: int
-
dev = data_model . property (
-
"dev" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param throttle: A floating value between 0 and 1 that represents how much the system is throttling clients below their max IOPS because of re-replication of data, transient errors and snapshots taken.
+
:type throttle: float
-
dev_path = data_model . property (
-
"devPath" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param timestamp: [required] The current time in UTC.
+
:type timestamp: str
-
drive_type = data_model . property (
-
"driveType" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param total_latency_usec: The average time, in microseconds, to complete read and write operations to a volume.
+
:type total_latency_usec: int
-
life_remaining_percent = data_model . property (
-
"lifeRemainingPercent" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param unaligned_reads: [required] For 512e volumes, the number of read operations that were not on a 4k sector boundary. High numbers of unaligned reads may indicate improper partition alignment.
+
:type unaligned_reads: int
-
lifetime_read_bytes = data_model . property (
-
"lifetimeReadBytes" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param unaligned_writes: [required] For 512e volumes, the number of write operations that were not on a 4k sector boundary. High numbers of unaligned writes may indicate improper partition alignment.
+
:type unaligned_writes: int
-
lifetime_write_bytes = data_model . property (
-
"lifetimeWriteBytes" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param volume_access_groups: [required] List of volume access group(s) to which a volume beintegers.
+
:type volume_access_groups: int
-
name = data_model . property (
-
"name" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param volume_id: [required] Volume ID of the volume.
+
:type volume_id: int
-
path = data_model . property (
-
"path" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param volume_size: [required] Total provisioned capacity in bytes.
+
:type volume_size: int
-
path_link = data_model . property (
-
"pathLink" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param volume_utilization: A floating value that describes how much the client is using the volume. Values: 0 = Client is not using the volume 1 = Client is using their max >1 = Client is using their burst
+
:type volume_utilization: float
-
power_on_hours = data_model . property (
-
"powerOnHours" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param write_bytes: [required] Total bytes written by clients.
+
:type write_bytes: int
-
product = data_model . property (
-
"product" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param write_latency_usec: The average time, in microseconds, to complete write operations.
+
:type write_latency_usec: int
-
reallocated_sectors = data_model . property (
-
"reallocatedSectors" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param write_ops: [required] Total write operations occurring on the volume.
+
:type write_ops: int
-
reserve_capacity_percent = data_model . property (
-
"reserveCapacityPercent" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param zero_blocks: [required] Total number of 4KiB blocks without data after the last round of garbage collection operation has completed.
+
:type zero_blocks: int
-
scsi_compat_id = data_model . property (
-
"scsiCompatId" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param write_bytes_last_sample: The total number of bytes written to the volume during the last sample period.
+
:type write_bytes_last_sample: int
-
scsi_state = data_model . property (
-
"scsiState" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param sample_period_msec: The length of the sample period in milliseconds.
+
:type sample_period_msec: int
-
security_at_maximum = data_model . property (
-
"securityAtMaximum" , bool ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param read_bytes_last_sample: The total number of bytes read from the volume during the last sample period.
+
:type read_bytes_last_sample: int
-
security_enabled = data_model . property (
-
"securityEnabled" , bool ,
+
:param read_ops_last_sample: The total number of read operations durin gth elast sample period.
+
:type read_ops_last_sample: int
+
+
:param write_ops_last_sample: The total number of write operations during the last sample period.
+
:type write_ops_last_sample: int
+
+
"""
+
account_id = data_model . property (
+
"accountID" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """AccountID of the volume owner. """ ,
+
dictionaryType = None
)
-
-
security_frozen = data_model . property (
-
"securityFrozen" , bool ,
+
actual_iops = data_model . property (
+
"actualIOPS" , int ,
+
array = False , optional = True ,
+
documentation = """Current actual IOPS to the volume in the last 500 milliseconds. """ ,
+
dictionaryType = None
+
)
+
average_iopsize = data_model . property (
+
"averageIOPSize" , int ,
+
array = False , optional = True ,
+
documentation = """Average size in bytes of recent I/O to the volume in the last 500 milliseconds. """ ,
+
dictionaryType = None
+
)
+
burst_iopscredit = data_model . property (
+
"burstIOPSCredit" , int ,
+
array = False , optional = True ,
+
documentation = """The total number of IOP credits available to the user. When users are not using up to the max IOPS, credits are accrued. """ ,
+
dictionaryType = None
+
)
+
client_queue_depth = data_model . property (
+
"clientQueueDepth" , int ,
+
array = False , optional = True ,
+
documentation = """The number of outstanding read and write operations to the cluster. """ ,
+
dictionaryType = None
+
)
+
latency_usec = data_model . property (
+
"latencyUSec" , int ,
+
array = False , optional = True ,
+
documentation = """The observed latency time, in microseconds, to complete operations to a volume. A "0" (zero) value means there is no I/O to the volume. """ ,
+
dictionaryType = None
+
)
+
async_delay = data_model . property (
+
"asyncDelay" , int ,
+
array = False , optional = True ,
+
documentation = """""" ,
+
dictionaryType = None
+
)
+
metadata_hosts = data_model . property (
+
"metadataHosts" , MetadataHosts ,
+
array = False , optional = True ,
+
documentation = """The volume services on which the volume metadata resides. """ ,
+
dictionaryType = None
+
)
+
desired_metadata_hosts = data_model . property (
+
"desiredMetadataHosts" , MetadataHosts ,
+
array = False , optional = True ,
+
documentation = """""" ,
+
dictionaryType = None
+
)
+
non_zero_blocks = data_model . property (
+
"nonZeroBlocks" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """The number of 4KiB blocks with data after the last garbage collection operation has completed. """ ,
+
dictionaryType = None
)
-
-
security_locked = data_model . property (
-
"securityLocked" , bool ,
+
read_bytes = data_model . property (
+
"readBytes" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """Total bytes read by clients. """ ,
+
dictionaryType = None
)
-
-
security_supported = data_model . property (
-
"securitySupported" , bool ,
+
read_latency_usec = data_model . property (
+
"readLatencyUSec" , int ,
+
array = False , optional = True ,
+
documentation = """The average time, in microseconds, to complete read operations. """ ,
+
dictionaryType = None
+
)
+
read_ops = data_model . property (
+
"readOps" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """Total read operations. """ ,
+
dictionaryType = None
)
-
-
serial = data_model . property (
-
"serial" , str ,
+
throttle = data_model . property (
+
"throttle" , float ,
+
array = False , optional = True ,
+
documentation = """A floating value between 0 and 1 that represents how much the system is throttling clients below their max IOPS because of re-replication of data, transient errors and snapshots taken. """ ,
+
dictionaryType = None
+
)
+
timestamp = data_model . property (
+
"timestamp" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """The current time in UTC. """ ,
+
dictionaryType = None
)
-
-
size = data_model . property (
-
"size" , int ,
+
total_latency_usec = data_model . property (
+
"totalLatencyUSec" , int ,
+
array = False , optional = True ,
+
documentation = """The average time, in microseconds, to complete read and write operations to a volume. """ ,
+
dictionaryType = None
+
)
+
unaligned_reads = data_model . property (
+
"unalignedReads" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """For 512e volumes, the number of read operations that were not on a 4k sector boundary. High numbers of unaligned reads may indicate improper partition alignment. """ ,
+
dictionaryType = None
)
-
-
slot = data_model . property (
-
"slot" , int ,
+
unaligned_writes = data_model . property (
+
"unalignedWrites" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """For 512e volumes, the number of write operations that were not on a 4k sector boundary. High numbers of unaligned writes may indicate improper partition alignment. """ ,
+
dictionaryType = None
)
-
-
smart_ssd_write_capable = data_model . property (
-
"smartSsdWriteCapable" , bool ,
+
volume_access_groups = data_model . property (
+
"volumeAccessGroups" , int ,
+
array = True , optional = False ,
+
documentation = """List of volume access group(s) to which a volume beintegers. """ ,
+
dictionaryType = None
+
)
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """Volume ID of the volume. """ ,
+
dictionaryType = None
+
)
+
volume_size = data_model . property (
+
"volumeSize" , int ,
+
array = False , optional = False ,
+
documentation = """Total provisioned capacity in bytes. """ ,
+
dictionaryType = None
+
)
+
volume_utilization = data_model . property (
+
"volumeUtilization" , float ,
array = False , optional = True ,
-
documentation = None
+
documentation = """A floating value that describes how much the client is using the volume. Values: 0 = Client is not using the volume 1 = Client is using their max >1 = Client is using their burst """ ,
+
dictionaryType = None
)
-
-
uuid = data_model . property (
-
"uuid" , UUID ,
+
write_bytes = data_model . property (
+
"writeBytes" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """Total bytes written by clients. """ ,
+
dictionaryType = None
)
-
-
vendor = data_model . property (
-
"vendor" , str ,
+
write_latency_usec = data_model . property (
+
"writeLatencyUSec" , int ,
+
array = False , optional = True ,
+
documentation = """The average time, in microseconds, to complete write operations. """ ,
+
dictionaryType = None
+
)
+
write_ops = data_model . property (
+
"writeOps" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """Total write operations occurring on the volume. """ ,
+
dictionaryType = None
)
+
zero_blocks = data_model . property (
+
"zeroBlocks" , int ,
+
array = False , optional = False ,
+
documentation = """Total number of 4KiB blocks without data after the last round of garbage collection operation has completed. """ ,
+
dictionaryType = None
+
)
+
write_bytes_last_sample = data_model . property (
+
"writeBytesLastSample" , int ,
+
array = False , optional = True ,
+
documentation = """The total number of bytes written to the volume during the last sample period. """ ,
+
dictionaryType = None
+
)
+
sample_period_msec = data_model . property (
+
"samplePeriodMSec" , int ,
+
array = False , optional = True ,
+
documentation = """The length of the sample period in milliseconds. """ ,
+
dictionaryType = None
+
)
+
read_bytes_last_sample = data_model . property (
+
"readBytesLastSample" , int ,
+
array = False , optional = True ,
+
documentation = """The total number of bytes read from the volume during the last sample period. """ ,
+
dictionaryType = None
+
)
+
read_ops_last_sample = data_model . property (
+
"readOpsLastSample" , int ,
+
array = False , optional = True ,
+
documentation = """The total number of read operations durin gth elast sample period. """ ,
+
dictionaryType = None
+
)
+
write_ops_last_sample = data_model . property (
+
"writeOpsLastSample" , int ,
+
array = False , optional = True ,
+
documentation = """The total number of write operations during the last sample period. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
account_id ,
+
non_zero_blocks ,
+
read_bytes ,
+
read_ops ,
+
timestamp ,
+
unaligned_reads ,
+
unaligned_writes ,
+
volume_access_groups ,
+
volume_id ,
+
volume_size ,
+
write_bytes ,
+
write_ops ,
+
zero_blocks ,
+
actual_iops = None ,
+
average_iopsize = None ,
+
burst_iopscredit = None ,
+
client_queue_depth = None ,
+
latency_usec = None ,
+
async_delay = None ,
+
metadata_hosts = None ,
+
desired_metadata_hosts = None ,
+
read_latency_usec = None ,
+
throttle = None ,
+
total_latency_usec = None ,
+
volume_utilization = None ,
+
write_latency_usec = None ,
+
write_bytes_last_sample = None ,
+
sample_period_msec = None ,
+
read_bytes_last_sample = None ,
+
read_ops_last_sample = None ,
+
write_ops_last_sample = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetVolumeStatsResult ( data_model . DataObject ):
+
"""GetVolumeStatsResult
+
+
:param volume_stats: [required] Volume activity information.
+
:type volume_stats: VolumeStats
-
version = data_model . property (
-
"version" , str ,
+
"""
+
volume_stats = data_model . property (
+
"volumeStats" , VolumeStats ,
array = False , optional = False ,
-
documentation = None
+
documentation = """Volume activity information. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
volume_stats ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+[docs] class VolumeAccessGroup ( data_model . DataObject ):
+
"""VolumeAccessGroup
+
A volume access group is a useful way of grouping volumes and initiators together for ease of management.
+
+
Volume Access Group Limits:
+
+
- A volume access group can contain up to sixty-four initiator IQNs.
+
- An initiator can only beinteger to only one volume access group.
+
- A volume access group can contain up to two thousand volumes.
+
- Each volume access group can beinteger to a maximum of four other volume access groups.
-
[docs] class DriveHardwareInfo ( data_model . DataObject ):
-
"""
+
:param deleted_volumes: [required] A list of deleted volumes that have yet to be purged from the VAG.
+
:type deleted_volumes: int
-
:param description: [required]
-
:type description: str
+
:param volume_access_group_id: [required] Unique ID for this volume access group.
+
:type volume_access_group_id: int
-
:param dev: [required]
-
:type dev: str
+
:param name: [required] Name of the volume access group.
+
:type name: str
-
:param devpath: [required]
-
:type devpath: str
+
:param initiator_ids: [required] A list of IDs of initiators that are mapped to the VAG.
+
:type initiator_ids: int
-
:param drive_security_at_maximum: [required]
-
:type drive_security_at_maximum: bool
+
:param initiators: [required] List of unique initiator names beintegering to the volume access group.
+
:type initiators: str
-
:param drive_security_frozen: [required]
-
:type drive_security_frozen: bool
+
:param volumes: [required] List of volumes beintegering to the volume access group.
+
:type volumes: int
-
:param drive_security_locked: [required]
-
:type drive_security_locked: bool
+
:param attributes: [required] List of name/value pairs
+
:type attributes: dict
-
:param logicalname: [required]
-
:type logicalname: str
+
"""
+
deleted_volumes = data_model . property (
+
"deletedVolumes" , int ,
+
array = True , optional = False ,
+
documentation = """A list of deleted volumes that have yet to be purged from the VAG. """ ,
+
dictionaryType = None
+
)
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
+
array = False , optional = False ,
+
documentation = """Unique ID for this volume access group. """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """Name of the volume access group. """ ,
+
dictionaryType = None
+
)
+
initiator_ids = data_model . property (
+
"initiatorIDs" , int ,
+
array = True , optional = False ,
+
documentation = """A list of IDs of initiators that are mapped to the VAG. """ ,
+
dictionaryType = None
+
)
+
initiators = data_model . property (
+
"initiators" , str ,
+
array = True , optional = False ,
+
documentation = """List of unique initiator names beintegering to the volume access group. """ ,
+
dictionaryType = None
+
)
+
volumes = data_model . property (
+
"volumes" , int ,
+
array = True , optional = False ,
+
documentation = """List of volumes beintegering to the volume access group. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = False ,
+
documentation = """List of name/value pairs """ ,
+
dictionaryType = None
+
)
-
:param product: [required]
-
:type product: str
+
def __init__ ( self ,
+
deleted_volumes ,
+
volume_access_group_id ,
+
name ,
+
initiator_ids ,
+
initiators ,
+
volumes ,
+
attributes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param security_feature_enabled: [required]
-
:type security_feature_enabled: bool
+
[docs] class ModifyVolumeAccessGroupResult ( data_model . DataObject ):
+
"""ModifyVolumeAccessGroupResult
-
:param security_feature_supported: [required]
-
:type security_feature_supported: bool
+
:param volume_access_group: [required] An object containing information about the newly modified volume access group.
+
:type volume_access_group: VolumeAccessGroup
-
:param serial: [required]
-
:type serial: str
+
"""
+
volume_access_group = data_model . property (
+
"volumeAccessGroup" , VolumeAccessGroup ,
+
array = False , optional = False ,
+
documentation = """An object containing information about the newly modified volume access group. """ ,
+
dictionaryType = None
+
)
-
:param size: [required]
-
:type size: int
+
def __init__ ( self ,
+
volume_access_group ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param uuid: [required]
-
:type uuid: UUID
+
[docs] class CancelGroupCloneResult ( data_model . DataObject ):
+
"""CancelGroupCloneResult
-
:param version: [required]
-
:type version: str
"""
-
description = data_model . property (
-
"description" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
dev = data_model . property (
-
"dev" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
[docs] class ProtocolEndpoint ( data_model . DataObject ):
+
"""ProtocolEndpoint
-
devpath = data_model . property (
-
"devpath" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param protocol_endpoint_id: [required]
+
:type protocol_endpoint_id: UUID
-
drive_security_at_maximum = data_model . property (
-
"driveSecurityAtMaximum" , bool ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param protocol_endpoint_state: [required]
+
:type protocol_endpoint_state: str
-
drive_security_frozen = data_model . property (
-
"driveSecurityFrozen" , bool ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param provider_type: [required]
+
:type provider_type: str
-
drive_security_locked = data_model . property (
-
"driveSecurityLocked" , bool ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param primary_provider_id: [required]
+
:type primary_provider_id: int
-
logicalname = data_model . property (
-
"logicalname" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param secondary_provider_id: [required]
+
:type secondary_provider_id: int
-
product = data_model . property (
-
"product" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param scsi_naadevice_id: [required]
+
:type scsi_naadevice_id: str
-
security_feature_enabled = data_model . property (
-
"securityFeatureEnabled" , bool ,
+
"""
+
protocol_endpoint_id = data_model . property (
+
"protocolEndpointID" , UUID ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
security_feature_supported = data_model . property (
-
"securityFeatureSupported" , bool ,
+
protocol_endpoint_state = data_model . property (
+
"protocolEndpointState" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
serial = data_model . property (
-
"serial" , str ,
+
provider_type = data_model . property (
+
"providerType" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
size = data_model . property (
-
"size" , int ,
+
primary_provider_id = data_model . property (
+
"primaryProviderID" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
uuid = data_model . property (
-
"uuid" , UUID ,
+
secondary_provider_id = data_model . property (
+
"secondaryProviderID" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
version = data_model . property (
-
"version" , str ,
+
scsi_naadevice_id = data_model . property (
+
"scsiNAADeviceID" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
-
-
[docs] class FibreChannelPortInfo ( data_model . DataObject ):
-
"""
-
Fibre Channel Node Port Info object returns information about all Fibre
-
Channel ports on a node, or for one node in the cluster. The same
-
information is returned for all ports or port information for one node.
-
This information is returned with the API method
-
*list_node_fibre_channel_port_info* (in the SolidFire API Guide).
-
-
:param firmware: [required] The version of the firmware installed on the
-
Fibre Channel port.
-
:type firmware: str
+
def __init__ ( self ,
+
protocol_endpoint_id ,
+
protocol_endpoint_state ,
+
provider_type ,
+
primary_provider_id ,
+
secondary_provider_id ,
+
scsi_naadevice_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param hba_port: [required] The ID of the individual HBA port.
-
:type hba_port: int
+
[docs] class ListProtocolEndpointsResult ( data_model . DataObject ):
+
"""ListProtocolEndpointsResult
-
:param model: [required] Model of the HBA on the port.
-
:type model: str
+
:param protocol_endpoints: [required]
+
:type protocol_endpoints: ProtocolEndpoint
-
:param n_port_id: [required] Unique SolidFire port node ID.
-
:type n_port_id: str
+
"""
+
protocol_endpoints = data_model . property (
+
"protocolEndpoints" , ProtocolEndpoint ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
-
:param pci_slot: [required] Slot in which the pci card resides on the Fibre
-
Channel node hardware.
-
:type pci_slot: int
+
def __init__ ( self ,
+
protocol_endpoints ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param serial: [required] Serial number on the Fibre Channel port.
-
:type serial: str
+
[docs] class ModifyStorageContainerResult ( data_model . DataObject ):
+
"""ModifyStorageContainerResult
-
:param speed: [required] Speed of the HBA on the port.
-
:type speed: str
+
:param storage_container: [required]
+
:type storage_container: StorageContainer
-
:param state: [required] Possible values:
+
"""
+
storage_container = data_model . property (
+
"storageContainer" , StorageContainer ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
-
**Unknown
+
def __init__ ( self ,
+
storage_container ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
*not_present*
+
[docs] class ClearClusterFaultsResult ( data_model . DataObject ):
+
"""ClearClusterFaultsResult
-
Online
+
"""
-
Offline
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
Blocked
+
[docs] class EnableSnmpRequest ( data_model . DataObject ):
+
"""EnableSnmpRequest
+
EnableSnmp enables you to enable SNMP on cluster nodes. When you enable SNMP, the action applies to all nodes in the cluster, and
+
the values that are passed replace, in whole, all values set in any previous call to EnableSnmp.
-
Bypassed
+
:param snmp_v3_enabled: [required] If set to "true", then SNMP v3 is enabled on each node in the cluster. If set to "false", then SNMP v2 is enabled.
+
:type snmp_v3_enabled: bool
-
Diagnostics
+
"""
+
snmp_v3_enabled = data_model . property (
+
"snmpV3Enabled" , bool ,
+
array = False , optional = False ,
+
documentation = """If set to "true", then SNMP v3 is enabled on each node in the cluster. If set to "false", then SNMP v2 is enabled. """ ,
+
dictionaryType = None
+
)
-
Linkdown
+
def __init__ ( self ,
+
snmp_v3_enabled ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
Error
+
[docs] class UpdateBulkVolumeStatusResult ( data_model . DataObject ):
+
"""UpdateBulkVolumeStatusResult
-
Loopback
+
:param status: [required] Status of the session requested. Returned status: preparing active done failed
+
:type status: str
-
Deleted**
+
:param url: [required] The URL to access the node's web server provided only if the session is still active.
+
:type url: str
-
:type state: str
+
:param attributes: [required] Returns attributes that were specified in the BulkVolumeStatusUpdate method. Values are returned if they have changed or not.
+
:type attributes: dict
-
:param switch_wwn: [required] The World Wide Name of the Fibre Channel
-
switch port.
-
:type switch_wwn: str
+
"""
+
status = data_model . property (
+
"status" , str ,
+
array = False , optional = False ,
+
documentation = """Status of the session requested. Returned status: preparing active done failed """ ,
+
dictionaryType = None
+
)
+
url = data_model . property (
+
"url" , str ,
+
array = False , optional = False ,
+
documentation = """The URL to access the node's web server provided only if the session is still active. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = False ,
+
documentation = """Returns attributes that were specified in the BulkVolumeStatusUpdate method. Values are returned if they have changed or not. """ ,
+
dictionaryType = None
+
)
-
:param wwnn: [required] World Wide Node Name of the HBA node.
-
:type wwnn: str
+
def __init__ ( self ,
+
status ,
+
url ,
+
attributes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DeleteSnapshotResult ( data_model . DataObject ):
+
"""DeleteSnapshotResult
-
:param wwpn: [required] World Wide Port Name assigned to the physical port
-
of the HBA.
-
:type wwpn: str
"""
-
firmware = data_model . property (
-
"firmware" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The version of the firmware installed on the Fibre Channel port. \
-
"
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyBackupTargetResult ( data_model . DataObject ):
+
"""ModifyBackupTargetResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ClusterConfig ( data_model . DataObject ):
+
"""ClusterConfig
+
Cluster Config object returns information the node uses to communicate with the cluster.
+
+
:param cipi: Network interface used for cluster communication.
+
:type cipi: str
+
+
:param cluster: Unique cluster name.
+
:type cluster: str
+
+
:param ensemble: Nodes that are participating in the cluster.
+
:type ensemble: str
+
+
:param mipi: Network interface used for node management.
+
:type mipi: str
+
+
:param name: Unique cluster name.
+
:type name: str
+
+
:param node_id:
+
:type node_id: int
+
+
:param pending_node_id:
+
:type pending_node_id: int
+
+
:param role: Identifies the role of the node
+
:type role: str
+
+
:param sipi: Network interface used for storage.
+
:type sipi: str
+
+
:param state:
+
:type state: str
+
+
:param encryption_capable:
+
:type encryption_capable: bool
+
+
:param has_local_admin:
+
:type has_local_admin: bool
+
+
:param version:
+
:type version: str
+
+
"""
+
cipi = data_model . property (
+
"cipi" , str ,
+
array = False , optional = True ,
+
documentation = """Network interface used for cluster communication. """ ,
+
dictionaryType = None
+
)
+
cluster = data_model . property (
+
"cluster" , str ,
+
array = False , optional = True ,
+
documentation = """Unique cluster name. """ ,
+
dictionaryType = None
+
)
+
ensemble = data_model . property (
+
"ensemble" , str ,
+
array = True , optional = True ,
+
documentation = """Nodes that are participating in the cluster. """ ,
+
dictionaryType = None
+
)
+
mipi = data_model . property (
+
"mipi" , str ,
+
array = False , optional = True ,
+
documentation = """Network interface used for node management. """ ,
+
dictionaryType = None
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = True ,
+
documentation = """Unique cluster name. """ ,
+
dictionaryType = None
+
)
+
node_id = data_model . property (
+
"nodeID" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
pending_node_id = data_model . property (
+
"pendingNodeID" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
role = data_model . property (
+
"role" , str ,
+
array = False , optional = True ,
+
documentation = """Identifies the role of the node """ ,
+
dictionaryType = None
+
)
+
sipi = data_model . property (
+
"sipi" , str ,
+
array = False , optional = True ,
+
documentation = """Network interface used for storage. """ ,
+
dictionaryType = None
+
)
+
state = data_model . property (
+
"state" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
encryption_capable = data_model . property (
+
"encryptionCapable" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
has_local_admin = data_model . property (
+
"hasLocalAdmin" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
version = data_model . property (
+
"version" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
cipi = None ,
+
cluster = None ,
+
ensemble = None ,
+
mipi = None ,
+
name = None ,
+
node_id = None ,
+
pending_node_id = None ,
+
role = None ,
+
sipi = None ,
+
state = None ,
+
encryption_capable = None ,
+
has_local_admin = None ,
+
version = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetClusterConfigResult ( data_model . DataObject ):
+
"""GetClusterConfigResult
+
+
:param cluster: [required] Cluster configuration information the node uses to communicate with the cluster.
+
:type cluster: ClusterConfig
-
hba_port = data_model . property (
-
"hbaPort" , int ,
+
"""
+
cluster = data_model . property (
+
"cluster" , ClusterConfig ,
array = False , optional = False ,
-
documentation = " \
-
The ID of the individual HBA port. \
-
"
+
documentation = """Cluster configuration information the node uses to communicate with the cluster. """ ,
+
dictionaryType = None
)
-
model = data_model . property (
-
"model" , str ,
+
def __init__ ( self ,
+
cluster ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
+
def __init__ ( self ,
+
virtual_volume_task_id ,
+
virtualvolume_id ,
+
clone_virtual_volume_id ,
+
status ,
+
operation ,
+
virtual_volume_host_id ,
+
parent_metadata ,
+
parent_total_size ,
+
parent_used_size ,
+
cancelled ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+[docs] class ClusterInfo ( data_model . DataObject ):
+
"""ClusterInfo
+
Cluster Info object returns information the node uses to communicate with the cluster.
+
:param mvip_interface:
+
:type mvip_interface: str
-
[docs] class PhysicalAdapter ( data_model . DataObject ):
-
"""
+
:param mvip_vlan_tag:
+
:type mvip_vlan_tag: str
-
:param address: (optional)
-
:type address: str
+
:param svip_interface:
+
:type svip_interface: str
-
:param mac_address: (optional)
-
:type mac_address: str
+
:param svip_vlan_tag:
+
:type svip_vlan_tag: str
-
:param mac_address_permanent: (optional)
-
:type mac_address_permanent: str
+
:param encryption_at_rest_state: [required] Encryption at rest state.
+
:type encryption_at_rest_state: str
-
:param mtu: (optional)
-
:type mtu: str
+
:param ensemble: [required] Array of Node IP addresses that are participating in the cluster.
+
:type ensemble: str
-
:param netmask: (optional)
-
:type netmask: str
+
:param mvip: [required] Management network interface.
+
:type mvip: str
-
:param network: (optional)
-
:type network: str
+
:param mvip_node_id: [required] Node holding the master MVIP address
+
:type mvip_node_id: int
-
:param up_and_running: (optional)
-
:type up_and_running: bool
-
"""
+
:param name: [required] Unique cluster name.
+
:type name: str
-
address = data_model . property (
-
"address" , str ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
:param rep_count: [required] Number of replicas of each piece of data to store in the cluster. Valid value is 2
+
:type rep_count: int
-
mac_address = data_model . property (
-
"macAddress" , str ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
:param svip: [required] Storage virtual IP
+
:type svip: str
-
mac_address_permanent = data_model . property (
-
"macAddressPermanent" , str ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
:param svip_node_id: [required] Node holding the master SVIP address.
+
:type svip_node_id: int
-
mtu = data_model . property (
-
"mtu" , str ,
+
:param unique_id: [required] Unique ID for the cluster.
+
:type unique_id: str
+
+
:param uuid: [required]
+
:type uuid: UUID
+
+
:param attributes: [required] List of Name/Value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
mvip_interface = data_model . property (
+
"mvipInterface" , str ,
array = False , optional = True ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
netmask = data_model . property (
-
"netmask" , str ,
+
mvip_vlan_tag = data_model . property (
+
"mvipVlanTag" , str ,
array = False , optional = True ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
network = data_model . property (
-
"network" , str ,
+
svip_interface = data_model . property (
+
"svipInterface" , str ,
array = False , optional = True ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
up_and_running = data_model . property (
-
"upAndRunning" , bool ,
+
svip_vlan_tag = data_model . property (
+
"svipVlanTag" , str ,
array = False , optional = True ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
-
-
+
+
[docs] class GetClusterInfoResult ( data_model . DataObject ):
+
"""GetClusterInfoResult
+
+
:param cluster_info: [required]
+
:type cluster_info: ClusterInfo
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
-
-
[docs] class QoS ( data_model . DataObject ):
-
"""
-
Quality of Service (QoS) values are used on SolidFire volumes to provision
-
performance expectations.
-
Minimum, maximum and burst *qos* values can be set within the ranges
-
specified in the *qos* table below.
-
-
-
-
-
Volumes created without specified *qos* values are created with the Default
-
values listed below.
-
Default values can be found by running the *get_default_qos* method.
-
-
-
+
"""
+
cluster_info = data_model . property (
+
"clusterInfo" , ClusterInfo ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
-
**minIOPS** Min: 100/50 (v7.0/v8.0), Default: 100, Max: 15,000
+
def __init__ ( self ,
+
cluster_info ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class ModifyInitiator ( data_model . DataObject ):
+
"""ModifyInitiator
+
Object containing characteristics of each initiator to modify
+
:param initiator_id: [required] (Required) The numeric ID of the initiator to modify. (Integer)
+
:type initiator_id: int
-
**maxIOPS** Min: 100/50 (v7.0/v8.0), Default: 15,000, Max: 100,000
+
:param alias: (Optional) A new friendly name to assign to the initiator. (String)
+
:type alias: str
+
:param volume_access_group_id: (Optional) The ID of the volume access group to which the newly created initiator should be added. If the initiator was previously in a different volume access group, it is removed from the old volume access group. If this key is present but null, the initiator is removed from its current volume access group, but not placed in any new volume access group. (Integer)
+
:type volume_access_group_id: int
+
:param attributes: (Optional) A new set of JSON attributes assigned to this initiator. (JSON Object)
+
:type attributes: dict
-
**burstIOPS** Min: 100/50 (v7.0/v8.0), Default: 15,000, Max: 100,000
+
"""
+
initiator_id = data_model . property (
+
"initiatorID" , int ,
+
array = False , optional = False ,
+
documentation = """(Required) The numeric ID of the initiator to modify. (Integer) """ ,
+
dictionaryType = None
+
)
+
alias = data_model . property (
+
"alias" , str ,
+
array = False , optional = True ,
+
documentation = """(Optional) A new friendly name to assign to the initiator. (String) """ ,
+
dictionaryType = None
+
)
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
+
array = False , optional = True ,
+
documentation = """(Optional) The ID of the volume access group to which the newly created initiator should be added. If the initiator was previously in a different volume access group, it is removed from the old volume access group. If this key is present but null, the initiator is removed from its current volume access group, but not placed in any new volume access group. (Integer) """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """(Optional) A new set of JSON attributes assigned to this initiator. (JSON Object) """ ,
+
dictionaryType = None
+
)
+
def __init__ ( self ,
+
initiator_id ,
+
alias = None ,
+
volume_access_group_id = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class TestPingRequest ( data_model . DataObject ):
+
"""TestPingRequest
+
You can use the TestPing API method to validate the
+
connection to all the nodes in a cluster on both 1G and 10G interfaces by using ICMP packets. The test uses the appropriate MTU sizes for each packet based on the MTU settings in the network configuration.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
:param attempts: Specifies the number of times the system should repeat the test ping. The default value is 5.
+
:type attempts: int
-
:param min_iops: (optional) Desired minimum 4KB IOPS to guarantee. The
-
allowed IOPS will only drop below this level if all volumes have been
-
capped at their minimum IOPS value and there is still insufficient
-
performance capacity.
-
:type min_iops: int
+
:param hosts: Specifies a comma-separated list of addresses or hostnames of devices to ping.
+
:type hosts: str
-
:param max_iops: (optional) Desired maximum 4KB IOPS allowed over an
-
extended period of time.
-
:type max_iops: int
+
:param total_timeout_sec: Specifies the length of time the ping should wait for a system response before issuing the next ping attempt or ending the process.
+
:type total_timeout_sec: int
-
:param burst_iops: (optional) Maximum \"peak\" 4KB IOPS allowed for short
-
periods of time. Allows for bursts of I/O activity over the normal max
-
IOPS value.
-
:type burst_iops: int
+
:param packet_size: Specifies the number of bytes to send in the ICMP packet that is sent to each IP. The number must be less than the maximum MTU specified in the network configuration.
+
:type packet_size: int
-
:param burst_time: (optional) The length of time burst IOPS is allowed. The
-
value returned is represented in time units of seconds.
+
:param ping_timeout_msec: Specifies the number of milliseconds to wait for each individual ping response. The default value is 500 ms.
+
:type ping_timeout_msec: int
-
**Note**: this value is calculated by the system based on IOPS set for
-
QoS.
+
:param prohibit_fragmentation: Specifies that the Do not Fragment (DF) flag is enabled for the ICMP packets.
+
:type prohibit_fragmentation: bool
-
:type burst_time: int
"""
-
-
min_iops = data_model . property (
-
"minIOPS" , int ,
+
attempts = data_model . property (
+
"attempts" , int ,
array = False , optional = True ,
-
documentation = " \
-
Desired minimum 4KB IOPS to guarantee. \
-
The allowed IOPS will only drop below this level if all volumes have \
-
been capped \
-
at their minimum IOPS value and there is still insufficient \
-
performance capacity. \
-
"
+
documentation = """Specifies the number of times the system should repeat the test ping. The default value is 5. """ ,
+
dictionaryType = None
)
-
-
max_iops = data_model . property (
-
"maxIOPS" , int ,
+
hosts = data_model . property (
+
"hosts" , str ,
array = False , optional = True ,
-
documentation = " \
-
Desired maximum 4KB IOPS allowed over an extended period of time. \
-
"
+
documentation = """Specifies a comma-separated list of addresses or hostnames of devices to ping. """ ,
+
dictionaryType = None
)
-
-
burst_iops = data_model . property (
-
"burstIOPS" , int ,
+
total_timeout_sec = data_model . property (
+
"totalTimeoutSec" , int ,
array = False , optional = True ,
-
documentation = " \
-
Maximum \" peak \" 4KB IOPS allowed for short periods of time. \
-
Allows for bursts of I/O activity over the normal max IOPS value. \
-
"
+
documentation = """Specifies the length of time the ping should wait for a system response before issuing the next ping attempt or ending the process. """ ,
+
dictionaryType = None
)
-
-
burst_time = data_model . property (
-
"burstTime" , int ,
+
packet_size = data_model . property (
+
"packetSize" , int ,
+
array = False , optional = True ,
+
documentation = """Specifies the number of bytes to send in the ICMP packet that is sent to each IP. The number must be less than the maximum MTU specified in the network configuration. """ ,
+
dictionaryType = None
+
)
+
ping_timeout_msec = data_model . property (
+
"pingTimeoutMsec" , int ,
array = False , optional = True ,
-
documentation = " \
-
The length of time burst IOPS is allowed. \
-
The value returned is represented in time units of seconds. \
-
\
-
\
-
**Note**: this value is calculated by the system based on IOPS set \
-
for QoS. \
-
\
-
"
+
documentation = """Specifies the number of milliseconds to wait for each individual ping response. The default value is 500 ms. """ ,
+
dictionaryType = None
+
)
+
prohibit_fragmentation = data_model . property (
+
"prohibitFragmentation" , bool ,
+
array = False , optional = True ,
+
documentation = """Specifies that the Do not Fragment (DF) flag is enabled for the ICMP packets. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
attempts = None ,
+
hosts = None ,
+
total_timeout_sec = None ,
+
packet_size = None ,
+
ping_timeout_msec = None ,
+
prohibit_fragmentation = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class ScheduleInfo ( data_model . DataObject ):
-
"""
+
"""ScheduleInfo
-
:param volume_ids: (optional) A list of volume *ids* to be included in the
-
group snapshot.
-
:type volume_ids: int[]
+
:param volume_ids: A list of volume IDs to be included in the group snapshot.
+
:type volume_ids: int
-
:param snapshot_name: (optional) The snapshot name to be used.
+
:param snapshot_name: The snapshot name to be used.
:type snapshot_name: str
-
:param enable_remote_replication: (optional) Indicates if the snapshot
-
should be included in remote replication.
+
:param retention: The amount of time the snapshot will be retained in HH:mm:ss.
+
:type retention: str
+
+
:param enable_remote_replication: Indicates if the snapshot should be included in remote replication.
:type enable_remote_replication: bool
-
:param retention: (optional) The amount of time the snapshot will be
-
retained in HH:mm:ss.
-
:type retention: str
"""
-
volume_ids = data_model . property (
"volumeIDs" , int ,
array = True , optional = True ,
-
documentation = " \
-
A list of volume *ids* to be included in the group snapshot. \
-
"
+
documentation = """A list of volume IDs to be included in the group snapshot. """ ,
+
dictionaryType = None
)
-
snapshot_name = data_model . property (
"snapshotName" , str ,
array = False , optional = True ,
-
documentation = " \
-
The snapshot name to be used. \
-
"
-
)
-
-
enable_remote_replication = data_model . property (
-
"enableRemoteReplication" , bool ,
-
array = False , optional = True ,
-
documentation = " \
-
Indicates if the snapshot should be included in remote replication. \
-
"
+
documentation = """The snapshot name to be used. """ ,
+
dictionaryType = None
)
-
retention = data_model . property (
"retention" , str ,
array = False , optional = True ,
-
documentation = " \
-
The amount of time the snapshot will be retained in HH:mm:ss. \
-
"
+
documentation = """The amount of time the snapshot will be retained in HH:mm:ss. """ ,
+
dictionaryType = None
+
)
+
enable_remote_replication = data_model . property (
+
"enableRemoteReplication" , bool ,
+
array = False , optional = True ,
+
documentation = """Indicates if the snapshot should be included in remote replication. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
-
-[docs] class SnapshotReplication ( data_model . DataObject ):
-
"""
-
-
:param state: [required] The state of the snapshot replication.
-
:type state: str
+
def __init__ ( self ,
+
volume_ids = None ,
+
snapshot_name = None ,
+
retention = None ,
+
enable_remote_replication = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
- :param state_details: [required] Reserved for future use.
- :type state_details: str
- """
+[docs] class Schedule ( data_model . DataObject ):
+
"""Schedule
+
Schedule is an object containing information about each schedule created to autonomously make a snapshot of a volume. The return object includes information for all schedules. If scheduleID is used to identify a specific schedule then only information for that scheduleID is returned. Schedules information is returned with the API method, see ListSchedules on the SolidFire API guide page 245.
-
state = data_model . property (
-
"state" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The state of the snapshot replication. \
-
"
-
)
+
:param recurring: Indicates whether or not the schedule is recurring.
+
:type recurring: bool
-
state_details = data_model . property (
-
"stateDetails" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Reserved for future use. \
-
"
-
)
+
:param last_run_time_started: Indicates the last time the schedule started n ISO 8601 date string. Valid values are: Success Failed
+
:type last_run_time_started: str
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+ :param paused: Indicates whether or not the schedule is paused.
+ :type paused: bool
+ :param schedule_info: [required] Includes the unique name given to the schedule, the retention period for the snapshot that was created, and the volume ID of the volume from which the snapshot was created.
+ :type schedule_info: ScheduleInfo
-[docs] class SnmpNetwork ( data_model . DataObject ):
-
"""
-
The SNMP network object contains information about SNMP configuration for
-
the cluster nodes. SNMP v3 is supported on SolidFire clusters.
+
:param last_run_status: Indicates the status of the last scheduled snapshot. Valid values are: Success Failed
+
:type last_run_status: str
-
:param access: [required]
+
:param name: [required] Unique name assigned to the schedule.
+
:type name: str
-
**ro**: read-only access.*
+
:param frequency: [required] Indicates the frequency of the schedule occurrence. Set this to a type that inherits from Frequency. Valid types are: DayOfWeekFrequency DayOfMonthFrequency TimeIntervalFrequency
+
:type frequency: Frequency
-
**rw**: for read-write access.
+
:param to_be_deleted: Indicates if the schedule is marked for deletion.
+
:type to_be_deleted: bool
-
**rosys**: for read-only access to a restricted set of system
-
information *SolidFire recommends that all networks other than the
-
default \"localhost\" be set to \"ro\" access, because all SolidFire
-
MIB objects are read-only.
+
:param has_error: Indicates whether or not the schedule has errors.
+
:type has_error: bool
-
:type access: str
+
:param starting_date: Indicates the date the first time the schedule began of will begin. Formatted in UTC time.
+
:type starting_date: str
-
:param cidr: [required] A CIDR network mask. This network mask must be an
-
integer greater than or equal to 0, and less than or equal to 32. It
-
must also not be equal to 31.
-
:type cidr: int
+
:param schedule_id: Unique ID of the schedule
+
:type schedule_id: int
-
:param community: [required] SNMP community string.
-
:type community: str
+
:param run_next_interval: Indicates whether or not the schedule will run the next time the scheduler is active. When set to "true", the schedule will run the next time the scheduler is active and then reset back to "false".
+
:type run_next_interval: bool
-
:param network: [required] This parameter along with the cidr variable is
-
used to control which network the access and community string apply to.
-
The special value of \"default\" is used to specify an entry that
-
applies to all networks. The cidr mask is ignored when network value is
-
either a host name or default.
-
:type network: str
"""
-
-
access = data_model . property (
-
"access" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
\
-
\
-
**ro**: read-only access.* \
-
\
-
\
-
\
-
**rw**: for read-write access. \
-
\
-
\
-
\
-
**rosys**: for read-only access to a restricted set of system \
-
information \
-
\
-
*SolidFire recommends that all networks other than the default \
-
\" localhost \" be set to \" ro \" access, because all SolidFire MIB \
-
objects are read-only. \
-
"
+
recurring = data_model . property (
+
"recurring" , bool ,
+
array = False , optional = True ,
+
documentation = """Indicates whether or not the schedule is recurring. """ ,
+
dictionaryType = None
)
-
-
cidr = data_model . property (
-
"cidr" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
A CIDR network mask. This network mask must be an integer greater than \
-
or equal to 0, and less than or equal to 32. It must also not be equal \
-
to 31. \
-
"
+
last_run_time_started = data_model . property (
+
"lastRunTimeStarted" , str ,
+
array = False , optional = True ,
+
documentation = """Indicates the last time the schedule started n ISO 8601 date string. Valid values are: Success Failed """ ,
+
dictionaryType = None
)
-
-
community = data_model . property (
-
"community" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
SNMP community string. \
-
"
+
paused = data_model . property (
+
"paused" , bool ,
+
array = False , optional = True ,
+
documentation = """Indicates whether or not the schedule is paused. """ ,
+
dictionaryType = None
)
-
-
network = data_model . property (
-
"network" , str ,
+
schedule_info = data_model . property (
+
"scheduleInfo" , ScheduleInfo ,
array = False , optional = False ,
-
documentation = " \
-
This parameter along with the cidr variable is used to control which \
-
network the access and community string apply to. The special value of \
-
\" default \" is used to specify an entry that applies to all networks. \
-
The cidr mask is ignored when network value is either a host name or \
-
default. \
-
"
+
documentation = """Includes the unique name given to the schedule, the retention period for the snapshot that was created, and the volume ID of the volume from which the snapshot was created. """ ,
+
dictionaryType = None
)
+
last_run_status = data_model . property (
+
"lastRunStatus" , str ,
+
array = False , optional = True ,
+
documentation = """Indicates the status of the last scheduled snapshot. Valid values are: Success Failed """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """Unique name assigned to the schedule. """ ,
+
dictionaryType = None
+
)
+
frequency = data_model . property (
+
"frequency" , Frequency ,
+
array = False , optional = False ,
+
documentation = """Indicates the frequency of the schedule occurrence. Set this to a type that inherits from Frequency. Valid types are: DayOfWeekFrequency DayOfMonthFrequency TimeIntervalFrequency """ ,
+
dictionaryType = None
+
)
+
to_be_deleted = data_model . property (
+
"toBeDeleted" , bool ,
+
array = False , optional = True ,
+
documentation = """Indicates if the schedule is marked for deletion. """ ,
+
dictionaryType = None
+
)
+
has_error = data_model . property (
+
"hasError" , bool ,
+
array = False , optional = True ,
+
documentation = """Indicates whether or not the schedule has errors. """ ,
+
dictionaryType = None
+
)
+
starting_date = data_model . property (
+
"startingDate" , str ,
+
array = False , optional = True ,
+
documentation = """Indicates the date the first time the schedule began of will begin. Formatted in UTC time. """ ,
+
dictionaryType = None
+
)
+
schedule_id = data_model . property (
+
"scheduleID" , int ,
+
array = False , optional = True ,
+
documentation = """Unique ID of the schedule """ ,
+
dictionaryType = None
+
)
+
run_next_interval = data_model . property (
+
"runNextInterval" , bool ,
+
array = False , optional = True ,
+
documentation = """Indicates whether or not the schedule will run the next time the scheduler is active. When set to "true", the schedule will run the next time the scheduler is active and then reset back to "false". """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
schedule_info ,
+
name ,
+
frequency ,
+
recurring = None ,
+
last_run_time_started = None ,
+
paused = None ,
+
last_run_status = None ,
+
to_be_deleted = None ,
+
has_error = None ,
+
starting_date = None ,
+
schedule_id = None ,
+
run_next_interval = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+[docs] class ListVolumeStatsByAccountResult ( data_model . DataObject ):
+
"""ListVolumeStatsByAccountResult
+
+
:param volume_stats: [required] List of account activity information. Note: The volumeID member is 0 for each entry, as the values represent the summation of all volumes owned by the account.
+
:type volume_stats: VolumeStats
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
+ """
+ volume_stats = data_model . property (
+ "volumeStats" , VolumeStats ,
+ array = True , optional = False ,
+ documentation = """List of account activity information. Note: The volumeID member is 0 for each entry, as the values represent the summation of all volumes owned by the account. """ ,
+ dictionaryType = None
+ )
-[docs] class SnmpTrapRecipient ( data_model . DataObject ):
-
"""
-
Host that is to receive the traps generated by the cluster.
+
def __init__ ( self ,
+
volume_stats ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
- :param host: [required] The IP address or host name of the target network
- management station.
- :type host: str
+[docs] class SecureEraseDrivesRequest ( data_model . DataObject ):
+
"""SecureEraseDrivesRequest
+
SecureEraseDrives enables you to remove any residual data from drives that have a status of "available." You might want to use this method when replacing a drive nearing the end of its service life that contained sensitive data. This method uses a Security Erase Unit command to write a predetermined pattern to the drive and resets the encryption key on the drive. This asynchronous method might take up to two minutes to complete. You can use GetAsyncResult to check on the status of the secure erase operation.
+
You can use the ListDrives method to obtain the driveIDs for the drives you want to secure erase.
-
:param community: [required] SNMP community string.
-
:type community: str
+
:param drives: [required] List of driveIDs to be secure erased.
+
:type drives: int
-
:param port: [required] The UDP port number on the host where the trap is
-
to be sent. Valid range is 1 - 65535. 0 (zero) is not a valid port
-
number. Default is 162.
-
:type port: int
"""
+
drives = data_model . property (
+
"drives" , int ,
+
array = True , optional = False ,
+
documentation = """List of driveIDs to be secure erased. """ ,
+
dictionaryType = None
+
)
-
host = data_model . property (
-
"host" , str ,
+
def __init__ ( self ,
+
drives ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+[docs] class LoginSessionInfo ( data_model . DataObject ):
+
"""LoginSessionInfo
+
+
:param timeout: [required]
+
:type timeout: str
+
+
"""
+
timeout = data_model . property (
+
"timeout" , str ,
array = False , optional = False ,
-
documentation = " \
-
The IP address or host name of the target network management station. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
community = data_model . property (
-
"community" , str ,
+
def __init__ ( self ,
+
timeout ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+[docs] class GetLoginSessionInfoResult ( data_model . DataObject ):
+
"""GetLoginSessionInfoResult
+
+
:param login_session_info: [required] The authentication expiration period. Formatted in H:mm:ss. For example: 1:30:00, 20:00, 5:00. All leading zeros and colons are removed regardless of the format the timeout was entered. Objects returned are: timeout - The time, in minutes, when this session will timeout and expire.
+
:type login_session_info: LoginSessionInfo
+
+
"""
+
login_session_info = data_model . property (
+
"loginSessionInfo" , LoginSessionInfo ,
array = False , optional = False ,
-
documentation = " \
-
SNMP community string. \
-
"
+
documentation = """The authentication expiration period. Formatted in H:mm:ss. For example: 1:30:00, 20:00, 5:00. All leading zeros and colons are removed regardless of the format the timeout was entered. Objects returned are: timeout - The time, in minutes, when this session will timeout and expire. """ ,
+
dictionaryType = None
)
-
port = data_model . property (
-
"port" , int ,
+
def __init__ ( self ,
+
login_session_info ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+[docs] class RestoreDeletedVolumeRequest ( data_model . DataObject ):
+
"""RestoreDeletedVolumeRequest
+
RestoreDeletedVolume marks a deleted volume as active again. This action makes the volume immediately available for iSCSI connection.
+
+
:param volume_id: [required] VolumeID of the deleted volume to be restored.
+
:type volume_id: int
+
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
array = False , optional = False ,
-
documentation = " \
-
The UDP port number on the host where the trap is to be sent. Valid \
-
range is 1 - 65535. 0 (zero) is not a valid port number. Default is \
-
162. \
-
"
+
documentation = """VolumeID of the deleted volume to be restored. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+ def __init__ ( self ,
+ volume_id ):
+ kwargs = locals ()
+ del kwargs [ "self" ]
+ data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class GetHardwareInfoResult ( data_model . DataObject ):
+
"""GetHardwareInfoResult
-
[docs] class TestConnectEnsembleDetails ( data_model . DataObject ):
-
"""
+
:param hardware_info: [required] Hardware information for this node.
+
:type hardware_info: dict
-
:param nodes: [required] A list of each ensemble node in the test and the
-
results of the tests.
-
:type nodes: str
"""
-
-
nodes = data_model . property (
-
"nodes" , str ,
+
hardware_info = data_model . property (
+
"hardwareInfo" , dict ,
array = False , optional = False ,
-
documentation = " \
-
A list of each ensemble node in the test and the results of the tests. \
-
"
+
documentation = """Hardware information for this node. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
hardware_info ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class PairedCluster ( data_model . DataObject ):
+
"""PairedCluster
-
[docs] class VolumeQOS ( data_model . DataObject ):
-
"""
-
Quality of Service (QoS) Result values are used on SolidFire volumes to
-
provision performance expectations.
-
-
:param min_iops: [required] Desired minimum 4KB IOPS to guarantee. The
-
allowed IOPS will only drop below this level if all volumes have been
-
capped at their min IOPS value and there is still insufficient
-
performance capacity.
-
:type min_iops: int
+
:param cluster_name: [required] Name of the other cluster in the pair
+
:type cluster_name: str
-
:param max_iops: [required] Desired maximum 4KB IOPS allowed over an
-
extended period of time.
-
:type max_iops: int
+
:param cluster_pair_id: [required] Unique ID given to each cluster in the pair.
+
:type cluster_pair_id: int
-
:param burst_iops: [required] Maximum \"peak\" 4KB IOPS allowed for short
-
periods of time. Allows for bursts of I/O activity over the normal max
-
IOPS value.
-
:type burst_iops: int
+
:param cluster_pair_uuid: [required] Universally unique identifier.
+
:type cluster_pair_uuid: UUID
-
:param burst_time: [required] The length of time burst IOPS is allowed. The
-
value returned is represented in time units of seconds.
+
:param latency: [required] Number, in milliseconds, of latency between clusters.
+
:type latency: int
-
**Note**: this value is calculated by the system based on IOPS set for
-
QoS.
+
:param mvip: [required] IP of the management connection for paired clusters.
+
:type mvip: str
-
:type burst_time: int
+
:param status: [required] Can be one of the following: Connected Misconfigured Disconnected
+
:type status: str
-
:param curve: [required] The curve is a set of key-value pairs. The keys
-
are I/O sizes in bytes. The values represent the cost performing an IOP
-
at a specific I/O size. The curve is calculated relative to a 4096 byte
-
operation set at 100 IOPS.
-
:type curve: dict
-
"""
+
:param version: [required] The Element OS version of the other cluster in the pair.
+
:type version: str
-
min_iops = data_model . property (
-
"minIOPS" , int ,
+
"""
+
cluster_name = data_model . property (
+
"clusterName" , str ,
array = False , optional = False ,
-
documentation = " \
-
Desired minimum 4KB IOPS to guarantee. \
-
The allowed IOPS will only drop below this level if all volumes have \
-
been capped \
-
at their min IOPS value and there is still insufficient performance \
-
capacity. \
-
"
+
documentation = """Name of the other cluster in the pair """ ,
+
dictionaryType = None
)
-
-
max_iops = data_model . property (
-
"maxIOPS" , int ,
+
cluster_pair_id = data_model . property (
+
"clusterPairID" , int ,
array = False , optional = False ,
-
documentation = " \
-
Desired maximum 4KB IOPS allowed over an extended period of time. \
-
"
+
documentation = """Unique ID given to each cluster in the pair. """ ,
+
dictionaryType = None
)
-
-
burst_iops = data_model . property (
-
"burstIOPS" , int ,
+
cluster_pair_uuid = data_model . property (
+
"clusterPairUUID" , UUID ,
array = False , optional = False ,
-
documentation = " \
-
Maximum \" peak \" 4KB IOPS allowed for short periods of time. \
-
Allows for bursts of I/O activity over the normal max IOPS value. \
-
"
+
documentation = """Universally unique identifier. """ ,
+
dictionaryType = None
)
-
-
burst_time = data_model . property (
-
"burstTime" , int ,
+
latency = data_model . property (
+
"latency" , int ,
array = False , optional = False ,
-
documentation = " \
-
The length of time burst IOPS is allowed. \
-
The value returned is represented in time units of seconds. \
-
\
-
\
-
**Note**: this value is calculated by the system based on IOPS set \
-
for QoS. \
-
\
-
"
+
documentation = """Number, in milliseconds, of latency between clusters. """ ,
+
dictionaryType = None
)
-
-
curve = data_model . property (
-
"curve" , dict ,
+
mvip = data_model . property (
+
"mvip" , str ,
array = False , optional = False ,
-
documentation = " \
-
The curve is a set of key-value pairs. \
-
The keys are I/O sizes in bytes. \
-
The values represent the cost performing an IOP at a specific I/O \
-
size. \
-
The curve is calculated relative to a 4096 byte operation set at 100 \
-
IOPS. \
-
"
+
documentation = """IP of the management connection for paired clusters. """ ,
+
dictionaryType = None
+
)
+
status = data_model . property (
+
"status" , str ,
+
array = False , optional = False ,
+
documentation = """Can be one of the following: Connected Misconfigured Disconnected """ ,
+
dictionaryType = None
+
)
+
version = data_model . property (
+
"version" , str ,
+
array = False , optional = False ,
+
documentation = """The Element OS version of the other cluster in the pair. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
cluster_name ,
+
cluster_pair_id ,
+
cluster_pair_uuid ,
+
latency ,
+
mvip ,
+
status ,
+
version ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class ListClusterPairsResult ( data_model . DataObject ):
+
"""ListClusterPairsResult
-
[docs] class ClusterCapacity ( data_model . DataObject ):
-
"""
-
High level capacity measurements for the entire cluster.
+
:param cluster_pairs: [required] Information about each paired cluster.
+
:type cluster_pairs: PairedCluster
-
:param active_block_space: [required] The amount of space on the block
-
drives. This includes additional information such as metadata entries
-
and space which can be cleaned up.
-
:type active_block_space: int
+
"""
+
cluster_pairs = data_model . property (
+
"clusterPairs" , PairedCluster ,
+
array = True , optional = False ,
+
documentation = """Information about each paired cluster. """ ,
+
dictionaryType = None
+
)
-
:param active_sessions: [required] Number of active iSCSI sessions
-
communicating with the cluster
-
:type active_sessions: int
+
def __init__ ( self ,
+
cluster_pairs ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param average_iops: [required] Average IPS for the cluster since midnight
-
Coordinated Universal Time (UTC).
-
:type average_iops: int
+
[docs] class SetNtpInfoRequest ( data_model . DataObject ):
+
"""SetNtpInfoRequest
+
SetNtpInfo enables you to configure NTP on cluster nodes. The values you set with this interface apply to all nodes in the cluster. If an NTP broadcast server periodically broadcasts time information on your network, you can optionally configure nodes as broadcast clients.
+
Note: NetApp recommends using NTP servers that are internal to your network, rather than the installation defaults.
-
:param cluster_recent_iosize: [required] The average size of IOPS to all
-
volumes in the cluster.
-
:type cluster_recent_iosize: int
+
:param servers: [required] List of NTP servers to add to each nodes NTP configuration.
+
:type servers: str
-
:param current_iops: [required] Average IOPS for all volumes in the cluster
-
over the last 5 seconds.
-
:type current_iops: int
+
:param broadcastclient: Enables every node in the cluster as a broadcast client.
+
:type broadcastclient: bool
-
:param max_iops: [required] Estimated maximum IOPS capability of the
-
current cluster.
-
:type max_iops: int
+
"""
+
servers = data_model . property (
+
"servers" , str ,
+
array = True , optional = False ,
+
documentation = """List of NTP servers to add to each nodes NTP configuration. """ ,
+
dictionaryType = None
+
)
+
broadcastclient = data_model . property (
+
"broadcastclient" , bool ,
+
array = False , optional = True ,
+
documentation = """Enables every node in the cluster as a broadcast client. """ ,
+
dictionaryType = None
+
)
-
:param max_over_provisionable_space: [required] The maximum amount of
-
provisionable space. This is a computed value. You cannot create new
-
volumes if the current provisioned space plus the new volume size would
-
exceed this number: *max_over_provisionable_space* =
-
*max_provisioned_space* * *get_cluster_full*
-
:type max_over_provisionable_space: int
+
def __init__ ( self ,
+
servers ,
+
broadcastclient = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param max_provisioned_space: [required] The total amount of provisionable
-
space if all volumes are 100% filled (no thin provisioned metadata).
-
:type max_provisioned_space: int
+
[docs] class SnapshotRemoteStatus ( data_model . DataObject ):
+
"""SnapshotRemoteStatus
-
:param max_used_metadata_space: [required] The amount of bytes on volume
-
drives used to store metadata.
-
:type max_used_metadata_space: int
+
:param remote_status: [required]
+
:type remote_status: str
-
:param max_used_space: [required] The total amount of space on all active
-
block drives.
-
:type max_used_space: int
+
:param volume_pair_uuid: [required] The snapshot is done and is writable (the active branch of the slice).
+
:type volume_pair_uuid: UUID
-
:param non_zero_blocks: [required] Total number of 4KiB blocks with data
-
after the last garbage collection operation has completed.
-
:type non_zero_blocks: int
+
"""
+
remote_status = data_model . property (
+
"remoteStatus" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_pair_uuid = data_model . property (
+
"volumePairUUID" , UUID ,
+
array = False , optional = False ,
+
documentation = """The snapshot is done and is writable (the active branch of the slice). """ ,
+
dictionaryType = None
+
)
-
:param peak_active_sessions: [required] Peak number of iSCSI connections
-
since midnight UTC.
-
:type peak_active_sessions: int
+
def __init__ ( self ,
+
remote_status ,
+
volume_pair_uuid ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param peak_iops: [required] The highest value for *current_iops* since
-
midnight UTC.
-
:type peak_iops: int
+
[docs] class Snapshot ( data_model . DataObject ):
+
"""Snapshot
+
Snapshots is an object containing information about each snapshot made for a volume.
+
The return object includes information for the active snapshot as well as each snapshot created for the volume.
-
:param provisioned_space: [required] Total amount of space provisioned in
-
all volumes on the cluster.
-
:type provisioned_space: int
+
:param snapshot_id: [required] Unique ID for this snapshot.
+
:type snapshot_id: int
-
:param snapshot_non_zero_blocks: [required] Total number of 4KiB blocks in
-
snapshots with data.
-
:type snapshot_non_zero_blocks: int
+
:param volume_id: [required] The volume this snapshot was taken of.
+
:type volume_id: int
-
:param timestamp: [required] The date and time this cluster capacity sample
-
was taken.
-
:type timestamp: str
+
:param name: [required] A name for this snapshot. It is not necessarily unique.
+
:type name: str
-
:param total_ops: [required] The total number of I/O operations performed
-
throughout the lifetime of the cluster
-
:type total_ops: int
+
:param checksum: [required] A string that represents the correct digits in the stored snapshot. This checksum can be used later to compare other snapshots to detect errors in the data.
+
:type checksum: str
-
:param unique_blocks: [required] The total number of blocks stored on the
-
block drives. The value includes replicated blocks.
-
:type unique_blocks: int
+
:param enable_remote_replication: [required] Identifies if snapshot is enabled for remote replication.
+
:type enable_remote_replication: bool
-
:param unique_blocks_used_space: [required] The total amount of data the
-
*unique_blocks* take up on the block drives. This number is always
-
consistent with the *unique_blocks* value.
-
:type unique_blocks_used_space: int
+
:param expiration_reason: [required] Indicates how the snapshot expiration was set. Possible values: api: expiration time was set by using the API. none: there is no expiration time set. test: expiration time was set for testing.
+
:type expiration_reason: str
-
:param used_metadata_space: [required] The total amount of bytes on volume
-
drives used to store metadata
-
:type used_metadata_space: int
+
:param expiration_time: The time at which this snapshot will expire and be purged from the cluster.
+
:type expiration_time: str
-
:param used_metadata_space_in_snapshots: [required] The amount of bytes on
-
volume drives used for storing unique data in snapshots. This number
-
provides an estimate of how much metadata space would be regained by
-
deleting all snapshots on the system.
-
:type used_metadata_space_in_snapshots: int
+
:param remote_statuses: Current remote status of the snapshot remoteStatus: Possible values: Present: Snapshot exists on a remote cluster Not Present: Snapshot does not exist on remote cluster Syncing: This is a target cluster and it is currently replicating the snapshot Deleted: This is a target cluster, the snapshot has been deleted, and it still exists on the source. volumePairUUID: universal identifier of the volume pair
+
:type remote_statuses: SnapshotRemoteStatus
-
:param used_space: [required] Total amount of space used by all block
-
drives in the system.
-
:type used_space: int
+
:param status: [required] Current status of the snapshot Preparing: A snapshot that is being prepared for use and is not yet writable. Done: A snapshot that has finished being prepared and is now usable. Active: This snapshot is the active branch.
+
:type status: str
-
:param zero_blocks: [required] Total number of 4KiB blocks without data
-
after the last round of garabage collection operation has completed.
-
:type zero_blocks: int
-
"""
+
:param snapshot_uuid: [required] Universal Unique ID of an existing snapshot.
+
:type snapshot_uuid: UUID
-
active_block_space = data_model . property (
-
"activeBlockSpace" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The amount of space on the block drives. \
-
This includes additional information such as metadata entries and \
-
space which can be cleaned up. \
-
"
-
)
+
:param total_size: [required] Total size of this snapshot in bytes. It is equivalent to totalSize of the volume when this snapshot was taken.
+
:type total_size: int
-
active_sessions = data_model . property (
-
"activeSessions" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Number of active iSCSI sessions communicating with the cluster \
-
"
-
)
+
:param group_id: If present, the ID of the group this snapshot is a part of. If not present, this snapshot is not part of a group.
+
:type group_id: int
-
average_iops = data_model . property (
-
"averageIOPS" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Average IPS for the cluster since midnight Coordinated Universal Time \
-
(UTC). \
-
"
-
)
+
:param group_snapshot_uuid: [required] The current "members" results contains information about each snapshot in the group. Each of these members will have a "uuid" parameter for the snapshot's UUID.
+
:type group_snapshot_uuid: UUID
-
cluster_recent_iosize = data_model . property (
-
"clusterRecentIOSize" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The average size of IOPS to all volumes in the cluster. \
-
"
-
)
+
:param create_time: [required] The time this snapshot was taken.
+
:type create_time: str
-
current_iops = data_model . property (
-
"currentIOPS" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Average IOPS for all volumes in the cluster over the last 5 seconds. \
-
"
-
)
+
:param virtual_volume_id: The ID of the virtual volume with which the snapshot is associated.
+
:type virtual_volume_id: UUID
-
max_iops = data_model . property (
-
"maxIOPS" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Estimated maximum IOPS capability of the current cluster. \
-
"
-
)
+
:param attributes: [required] List of Name/Value pairs in JSON object format.
+
:type attributes: dict
-
max_over_provisionable_space = data_model . property (
-
"maxOverProvisionableSpace" , int ,
+
"""
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
array = False , optional = False ,
-
documentation = " \
-
The maximum amount of provisionable space. \
-
This is a computed value. \
-
You cannot create new volumes if the current provisioned space plus \
-
the new volume size would exceed this number: \
-
*max_over_provisionable_space* = *max_provisioned_space* * \
-
*get_cluster_full* \
-
"
+
documentation = """Unique ID for this snapshot. """ ,
+
dictionaryType = None
)
-
-
max_provisioned_space = data_model . property (
-
"maxProvisionedSpace" , int ,
+
volume_id = data_model . property (
+
"volumeID" , int ,
array = False , optional = False ,
-
documentation = " \
-
The total amount of provisionable space if all volumes are 100 % f illed \
-
(no thin provisioned metadata). \
-
"
+
documentation = """The volume this snapshot was taken of. """ ,
+
dictionaryType = None
)
-
-
max_used_metadata_space = data_model . property (
-
"maxUsedMetadataSpace" , int ,
+
name = data_model . property (
+
"name" , str ,
array = False , optional = False ,
-
documentation = " \
-
The amount of bytes on volume drives used to store metadata. \
-
"
+
documentation = """A name for this snapshot. It is not necessarily unique. """ ,
+
dictionaryType = None
)
-
-
max_used_space = data_model . property (
-
"maxUsedSpace" , int ,
+
checksum = data_model . property (
+
"checksum" , str ,
array = False , optional = False ,
-
documentation = " \
-
The total amount of space on all active block drives. \
-
"
+
documentation = """A string that represents the correct digits in the stored snapshot. This checksum can be used later to compare other snapshots to detect errors in the data. """ ,
+
dictionaryType = None
)
-
-
non_zero_blocks = data_model . property (
-
"nonZeroBlocks" , int ,
+
enable_remote_replication = data_model . property (
+
"enableRemoteReplication" , bool ,
array = False , optional = False ,
-
documentation = " \
-
Total number of 4KiB blocks with data after the last garbage \
-
collection operation has completed. \
-
"
+
documentation = """Identifies if snapshot is enabled for remote replication. """ ,
+
dictionaryType = None
)
-
-
peak_active_sessions = data_model . property (
-
"peakActiveSessions" , int ,
+
expiration_reason = data_model . property (
+
"expirationReason" , str ,
array = False , optional = False ,
-
documentation = " \
-
Peak number of iSCSI connections since midnight UTC. \
-
"
+
documentation = """Indicates how the snapshot expiration was set. Possible values: api: expiration time was set by using the API. none: there is no expiration time set. test: expiration time was set for testing. """ ,
+
dictionaryType = None
)
-
-
peak_iops = data_model . property (
-
"peakIOPS" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The highest value for *current_iops* since midnight UTC. \
-
"
+
expiration_time = data_model . property (
+
"expirationTime" , str ,
+
array = False , optional = True ,
+
documentation = """The time at which this snapshot will expire and be purged from the cluster. """ ,
+
dictionaryType = None
)
-
-
provisioned_space = data_model . property (
-
"provisionedSpace" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Total amount of space provisioned in all volumes on the cluster. \
-
"
+
remote_statuses = data_model . property (
+
"remoteStatuses" , SnapshotRemoteStatus ,
+
array = True , optional = True ,
+
documentation = """Current remote status of the snapshot remoteStatus: Possible values: Present: Snapshot exists on a remote cluster Not Present: Snapshot does not exist on remote cluster Syncing: This is a target cluster and it is currently replicating the snapshot Deleted: This is a target cluster, the snapshot has been deleted, and it still exists on the source. volumePairUUID: universal identifier of the volume pair """ ,
+
dictionaryType = None
)
-
-
snapshot_non_zero_blocks = data_model . property (
-
"snapshotNonZeroBlocks" , int ,
+
status = data_model . property (
+
"status" , str ,
array = False , optional = False ,
-
documentation = " \
-
Total number of 4KiB blocks in snapshots with data. \
-
"
+
documentation = """Current status of the snapshot Preparing: A snapshot that is being prepared for use and is not yet writable. Done: A snapshot that has finished being prepared and is now usable. Active: This snapshot is the active branch. """ ,
+
dictionaryType = None
)
-
-
timestamp = data_model . property (
-
"timestamp" , str ,
+
snapshot_uuid = data_model . property (
+
"snapshotUUID" , UUID ,
array = False , optional = False ,
-
documentation = " \
-
The date and time this cluster capacity sample was taken. \
-
"
+
documentation = """Universal Unique ID of an existing snapshot. """ ,
+
dictionaryType = None
)
-
-
total_ops = data_model . property (
-
"totalOps" , int ,
+
total_size = data_model . property (
+
"totalSize" , int ,
array = False , optional = False ,
-
documentation = " \
-
The total number of I/O operations performed throughout the lifetime \
-
of the cluster \
-
"
+
documentation = """Total size of this snapshot in bytes. It is equivalent to totalSize of the volume when this snapshot was taken. """ ,
+
dictionaryType = None
)
-
-
unique_blocks = data_model . property (
-
"uniqueBlocks" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The total number of blocks stored on the block drives. \
-
The value includes replicated blocks. \
-
"
+
group_id = data_model . property (
+
"groupID" , int ,
+
array = False , optional = True ,
+
documentation = """If present, the ID of the group this snapshot is a part of. If not present, this snapshot is not part of a group. """ ,
+
dictionaryType = None
)
-
-
unique_blocks_used_space = data_model . property (
-
"uniqueBlocksUsedSpace" , int ,
+
group_snapshot_uuid = data_model . property (
+
"groupSnapshotUUID" , UUID ,
array = False , optional = False ,
-
documentation = " \
-
The total amount of data the *unique_blocks* take up on the block \
-
drives. \
-
This number is always consistent with the *unique_blocks* value. \
-
"
+
documentation = """The current "members" results contains information about each snapshot in the group. Each of these members will have a "uuid" parameter for the snapshot's UUID. """ ,
+
dictionaryType = None
)
-
-
used_metadata_space = data_model . property (
-
"usedMetadataSpace" , int ,
+
create_time = data_model . property (
+
"createTime" , str ,
array = False , optional = False ,
-
documentation = " \
-
The total amount of bytes on volume drives used to store metadata \
-
"
+
documentation = """The time this snapshot was taken. """ ,
+
dictionaryType = None
)
-
-
used_metadata_space_in_snapshots = data_model . property (
-
"usedMetadataSpaceInSnapshots" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The amount of bytes on volume drives used for storing unique data in \
-
snapshots. \
-
This number provides an estimate of how much metadata space would be \
-
regained by deleting all snapshots on the system. \
-
"
+
virtual_volume_id = data_model . property (
+
"virtualVolumeID" , UUID ,
+
array = False , optional = True ,
+
documentation = """The ID of the virtual volume with which the snapshot is associated. """ ,
+
dictionaryType = None
)
-
-
used_space = data_model . property (
-
"usedSpace" , int ,
+
attributes = data_model . property (
+
"attributes" , dict ,
array = False , optional = False ,
-
documentation = " \
-
Total amount of space used by all block drives in the system. \
-
"
-
)
+
documentation = """List of Name/Value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
snapshot_id ,
+
volume_id ,
+
name ,
+
checksum ,
+
enable_remote_replication ,
+
expiration_reason ,
+
status ,
+
snapshot_uuid ,
+
total_size ,
+
group_snapshot_uuid ,
+
create_time ,
+
attributes ,
+
expiration_time = None ,
+
remote_statuses = None ,
+
group_id = None ,
+
virtual_volume_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifySnapshotResult ( data_model . DataObject ):
+
"""ModifySnapshotResult
+
+
:param snapshot:
+
:type snapshot: Snapshot
-
zero_blocks = data_model . property (
-
"zeroBlocks" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Total number of 4KiB blocks without data after the last round of \
-
garabage collection operation has completed. \
-
"
+
"""
+
snapshot = data_model . property (
+
"snapshot" , Snapshot ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
snapshot = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class RollbackToGroupSnapshotRequest ( data_model . DataObject ):
+
"""RollbackToGroupSnapshotRequest
+
RollbackToGroupSnapshot enables you to roll back all individual volumes in a snapshot group to each volume's individual snapshot.
+
Note: Rolling back to a group snapshot creates a temporary snapshot of each volume within the group snapshot.
+
Snapshots are allowed if cluster fullness is at stage 2 or 3. Snapshots are not created when cluster fullness is at stage 4 or 5.
-
[docs] class ClusterStats ( data_model . DataObject ):
-
"""
+
:param group_snapshot_id: [required] Specifies the unique ID of the group snapshot.
+
:type group_snapshot_id: int
-
:param cluster_utilization: [required] The amount of cluster capacity being
-
utilized.
-
:type cluster_utilization: float
+
:param save_current_state: [required] Specifies whether to save an active volume image or delete it. Values are: true: The previous active volume image is kept. false: (default) The previous active volume image is deleted.
+
:type save_current_state: bool
-
:param client_queue_depth: [required]
-
:type client_queue_depth: int
+
:param name: Name for the group snapshot of the volume's current state that is created if "saveCurrentState" is set to true. If you do not give a name, the name of the snapshots (group and individual volume) are set to a timestamp of the time that the rollback occurred.
+
:type name: str
-
:param read_bytes: [required] Total bytes read by clients.
-
:type read_bytes: int
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
-
:param read_ops: [required] Total read operations.
-
:type read_ops: int
+
"""
+
group_snapshot_id = data_model . property (
+
"groupSnapshotID" , int ,
+
array = False , optional = False ,
+
documentation = """Specifies the unique ID of the group snapshot. """ ,
+
dictionaryType = None
+
)
+
save_current_state = data_model . property (
+
"saveCurrentState" , bool ,
+
array = False , optional = False ,
+
documentation = """Specifies whether to save an active volume image or delete it. Values are: true: The previous active volume image is kept. false: (default) The previous active volume image is deleted. """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = True ,
+
documentation = """Name for the group snapshot of the volume's current state that is created if "saveCurrentState" is set to true. If you do not give a name, the name of the snapshots (group and individual volume) are set to a timestamp of the time that the rollback occurred. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
-
:param timestamp: [required] Current time in UTC format. ISO 8601 date
-
string.
-
:type timestamp: str
+
def __init__ ( self ,
+
group_snapshot_id ,
+
save_current_state ,
+
name = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param write_bytes: [required] Total bytes written by clients.
-
:type write_bytes: int
+
[docs] class PurgeDeletedVolumesResult ( data_model . DataObject ):
+
"""PurgeDeletedVolumesResult
-
:param write_ops: [required] Total write operations.
-
:type write_ops: int
"""
-
cluster_utilization = data_model . property (
-
"clusterUtilization" , float ,
-
array = False , optional = False ,
-
documentation = " \
-
The amount of cluster capacity being utilized. \
-
"
-
)
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
client_queue_depth = data_model . property (
-
"clientQueueDepth" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
[docs] class RemoveInitiatorsFromVolumeAccessGroupRequest ( data_model . DataObject ):
+
"""RemoveInitiatorsFromVolumeAccessGroupRequest
+
RemoveInitiatorsFromVolumeAccessGroup enables
+
you to remove initiators from a specified volume access
+
group.
-
read_bytes = data_model . property (
-
"readBytes" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Total bytes read by clients. \
-
"
-
)
+
:param volume_access_group_id: [required] The ID of the volume access group from which the initiators are removed.
+
:type volume_access_group_id: int
-
read_ops = data_model . property (
-
"readOps" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Total read operations. \
-
"
-
)
+
:param initiators: [required] The list of initiators to remove from the volume access group.
+
:type initiators: str
-
timestamp = data_model . property (
-
"timestamp" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Current time in UTC format. ISO 8601 date string. \
-
"
-
)
+
:param delete_orphan_initiators: true: Delete initiator objects after they are removed from a volume access group. false: Do not delete initiator objects after they are removed from a volume access group.
+
:type delete_orphan_initiators: bool
-
write_bytes = data_model . property (
-
"writeBytes" , int ,
+
"""
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
array = False , optional = False ,
-
documentation = " \
-
Total bytes written by clients. \
-
"
+
documentation = """The ID of the volume access group from which the initiators are removed. """ ,
+
dictionaryType = None
)
-
-
write_ops = data_model . property (
-
"writeOps" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Total write operations. \
-
"
+
initiators = data_model . property (
+
"initiators" , str ,
+
array = True , optional = False ,
+
documentation = """The list of initiators to remove from the volume access group. """ ,
+
dictionaryType = None
+
)
+
delete_orphan_initiators = data_model . property (
+
"deleteOrphanInitiators" , bool ,
+
array = False , optional = True ,
+
documentation = """true: Delete initiator objects after they are removed from a volume access group. false: Do not delete initiator objects after they are removed from a volume access group. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
+
def __init__ ( self ,
+
volume_access_group_id ,
+
initiators ,
+
delete_orphan_initiators = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
[docs] class DriveStats ( data_model . DataObject ):
-
"""
+
[docs] class DriveHardwareInfo ( data_model . DataObject ):
+
"""DriveHardwareInfo
-
:param active_sessions: [required]
-
:type active_sessions: int
+
:param description: [required]
+
:type description: str
-
:param failed_die_count: [required]
-
:type failed_die_count: int
+
:param dev: [required]
+
:type dev: str
-
:param life_remaining_percent: [required]
-
:type life_remaining_percent: int
+
:param devpath: [required]
+
:type devpath: str
-
:param lifetime_read_bytes: [required]
-
:type lifetime_read_bytes: int
+
:param drive_security_at_maximum: [required]
+
:type drive_security_at_maximum: bool
-
:param lifetime_write_bytes: [required]
-
:type lifetime_write_bytes: int
+
:param drive_security_frozen: [required]
+
:type drive_security_frozen: bool
-
:param power_on_hours: [required]
-
:type power_on_hours: int
+
:param drive_security_locked: [required]
+
:type drive_security_locked: bool
-
:param read_bytes: [required]
-
:type read_bytes: int
+
:param logicalname: [required]
+
:type logicalname: str
-
:param read_ops: [required]
-
:type read_ops: int
+
:param product: [required]
+
:type product: str
-
:param reallocated_sectors: [required]
-
:type reallocated_sectors: int
+
:param scsi_compat_id: [required]
+
:type scsi_compat_id: str
-
:param reserve_capacity_percent: [required]
-
:type reserve_capacity_percent: int
+
:param security_feature_enabled: [required]
+
:type security_feature_enabled: bool
-
:param timestamp: [required]
-
:type timestamp: str
+
:param security_feature_supported: [required]
+
:type security_feature_supported: bool
-
:param total_capacity: [required]
-
:type total_capacity: int
+
:param serial: [required]
+
:type serial: str
-
:param used_memory: [required]
-
:type used_memory: int
+
:param size: [required]
+
:type size: int
-
:param write_bytes: [required]
-
:type write_bytes: int
+
:param uuid: [required]
+
:type uuid: UUID
-
:param write_ops: [required]
-
:type write_ops: int
+
:param version: [required]
+
:type version: str
-
:param used_capacity: (optional)
-
:type used_capacity: int
"""
-
-
active_sessions = data_model . property (
-
"activeSessions" , int ,
+
description = data_model . property (
+
"description" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
failed_die_count = data_model . property (
-
"failedDieCount" , int ,
+
dev = data_model . property (
+
"dev" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
life_remaining_percent = data_model . property (
-
"lifeRemainingPercent" , int ,
+
devpath = data_model . property (
+
"devpath" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
lifetime_read_bytes = data_model . property (
-
"lifetimeReadBytes" , int ,
+
drive_security_at_maximum = data_model . property (
+
"driveSecurityAtMaximum" , bool ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
lifetime_write_bytes = data_model . property (
-
"lifetimeWriteBytes" , int ,
+
drive_security_frozen = data_model . property (
+
"driveSecurityFrozen" , bool ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
power_on_hours = data_model . property (
-
"powerOnHours" , int ,
+
drive_security_locked = data_model . property (
+
"driveSecurityLocked" , bool ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
read_bytes = data_model . property (
-
"readBytes" , int ,
+
logicalname = data_model . property (
+
"logicalname" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
read_ops = data_model . property (
-
"readOps" , int ,
+
product = data_model . property (
+
"product" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
reallocated_sectors = data_model . property (
-
"reallocatedSectors" , int ,
+
scsi_compat_id = data_model . property (
+
"scsiCompatID" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
reserve_capacity_percent = data_model . property (
-
"reserveCapacityPercent" , int ,
+
security_feature_enabled = data_model . property (
+
"securityFeatureEnabled" , bool ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
timestamp = data_model . property (
-
"timestamp" , str ,
+
security_feature_supported = data_model . property (
+
"securityFeatureSupported" , bool ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
total_capacity = data_model . property (
-
"totalCapacity" , int ,
+
serial = data_model . property (
+
"serial" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
used_capacity = data_model . property (
-
"usedCapacity" , int ,
-
array = False , optional = True ,
-
documentation = None
+
size = data_model . property (
+
"size" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
used_memory = data_model . property (
-
"usedMemory" , int ,
+
uuid = data_model . property (
+
"uuid" , UUID ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
+
version = data_model . property (
+
"version" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
description ,
+
dev ,
+
devpath ,
+
drive_security_at_maximum ,
+
drive_security_frozen ,
+
drive_security_locked ,
+
logicalname ,
+
product ,
+
scsi_compat_id ,
+
security_feature_enabled ,
+
security_feature_supported ,
+
serial ,
+
size ,
+
uuid ,
+
version ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ClusterHardwareInfo ( data_model . DataObject ):
+
"""ClusterHardwareInfo
+
+
:param drives: [required]
+
:type drives: dict
+
+
:param nodes: [required]
+
:type nodes: dict
-
write_bytes = data_model . property (
-
"writeBytes" , int ,
+
"""
+
drives = data_model . property (
+
"drives" , dict ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = DriveHardwareInfo
)
-
-
write_ops = data_model . property (
-
"writeOps" , int ,
+
nodes = data_model . property (
+
"nodes" , dict ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = dict
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
drives ,
+
nodes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class GetClusterHardwareInfoResult ( data_model . DataObject ):
+
"""GetClusterHardwareInfoResult
-
[docs] class DrivesHardware ( data_model . DataObject ):
-
"""
+
:param cluster_hardware_info: [required] Hardware information for all nodes and drives in the cluster. Each object in this output is labeled with the nodeID of the given node.
+
:type cluster_hardware_info: ClusterHardwareInfo
-
:param drive_hardware: [required]
-
:type drive_hardware: DriveHardware[]
"""
-
-
drive_hardware = data_model . property (
-
"driveHardware" , DriveHardware ,
-
array = True , optional = False ,
-
documentation = None
+
cluster_hardware_info = data_model . property (
+
"clusterHardwareInfo" , ClusterHardwareInfo ,
+
array = False , optional = False ,
+
documentation = """Hardware information for all nodes and drives in the cluster. Each object in this output is labeled with the nodeID of the given node. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
cluster_hardware_info ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class BackupTarget ( data_model . DataObject ):
+
"""BackupTarget
+
The object containing information about a backup target.
-
[docs] class FibreChannelPortList ( data_model . DataObject ):
-
"""
-
List of all Fibre Channel ports.
+
:param name: [required] Name for the backup target.
+
:type name: str
+
+
:param backup_target_id: [required] Unique identifier assigned to the backup target.
+
:type backup_target_id: int
+
+
:param attributes: List of Name/Value pairs in JSON object format.
+
:type attributes: dict
-
:param fibre_channel_ports: [required] List of all physical Fibre Channel
-
ports.
-
:type fibre_channel_ports: FibreChannelPortInfo[]
"""
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """Name for the backup target. """ ,
+
dictionaryType = None
+
)
+
backup_target_id = data_model . property (
+
"backupTargetID" , int ,
+
array = False , optional = False ,
+
documentation = """Unique identifier assigned to the backup target. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of Name/Value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
-
fibre_channel_ports = data_model . property (
-
"fibreChannelPorts" , FibreChannelPortInfo ,
+
def __init__ ( self ,
+
name ,
+
backup_target_id ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListBackupTargetsResult ( data_model . DataObject ):
+
"""ListBackupTargetsResult
+
+
:param backup_targets: [required] Objects returned for each backup target.
+
:type backup_targets: BackupTarget
+
+
"""
+
backup_targets = data_model . property (
+
"backupTargets" , BackupTarget ,
array = True , optional = False ,
-
documentation = " \
-
List of all physical Fibre Channel ports. \
-
"
+
documentation = """Objects returned for each backup target. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
backup_targets ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class AddVolumesToVolumeAccessGroupRequest ( data_model . DataObject ):
+
"""AddVolumesToVolumeAccessGroupRequest
+
AddVolumesToVolumeAccessGroup enables you to add
+
volumes to a specified volume access group.
-
[docs] class NetworkConfig ( data_model . DataObject ):
-
"""
+
:param volume_access_group_id: [required] The ID of the volume access group to which volumes are added.
+
:type volume_access_group_id: int
-
:param _default: (optional)
-
:type _default: bool
+
:param volumes: [required] The list of volumes to add to the volume access group.
+
:type volumes: int
-
:param address: (optional)
-
:type address: str
+
"""
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the volume access group to which volumes are added. """ ,
+
dictionaryType = None
+
)
+
volumes = data_model . property (
+
"volumes" , int ,
+
array = True , optional = False ,
+
documentation = """The list of volumes to add to the volume access group. """ ,
+
dictionaryType = None
+
)
-
:param auto: (optional)
-
:type auto: bool
+
def __init__ ( self ,
+
volume_access_group_id ,
+
volumes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param bond_downdelay: (optional)
-
:type bond_downdelay: int
+
[docs] class DeleteGroupSnapshotRequest ( data_model . DataObject ):
+
"""DeleteGroupSnapshotRequest
+
DeleteGroupSnapshot enables you to delete a group snapshot. You can use the saveMembers parameter to preserve all the snapshots that were made for the volumes in the group, but the group association is removed.
-
:param bond_fail_over_mac: (optional)
-
:type bond_fail_over_mac: str
+
:param group_snapshot_id: [required] Specifies the unique ID of the group snapshot.
+
:type group_snapshot_id: int
-
:param bond_primary_reselect: (optional)
-
:type bond_primary_reselect: str
+
:param save_members: [required] Specifies whether to preserve snapshots or delete them. Valid values are: true: Snapshots are preserved, but group association is removed. false: The group and snapshots are deleted.
+
:type save_members: bool
-
:param bond_lacp_rate: (optional)
-
:type bond_lacp_rate: str
+
"""
+
group_snapshot_id = data_model . property (
+
"groupSnapshotID" , int ,
+
array = False , optional = False ,
+
documentation = """Specifies the unique ID of the group snapshot. """ ,
+
dictionaryType = None
+
)
+
save_members = data_model . property (
+
"saveMembers" , bool ,
+
array = False , optional = False ,
+
documentation = """Specifies whether to preserve snapshots or delete them. Valid values are: true: Snapshots are preserved, but group association is removed. false: The group and snapshots are deleted. """ ,
+
dictionaryType = None
+
)
-
:param bond_miimon: (optional)
-
:type bond_miimon: int
+
def __init__ ( self ,
+
group_snapshot_id ,
+
save_members ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param bond_mode: (optional)
-
:type bond_mode: str
+
[docs] class TestConnectEnsembleDetails ( data_model . DataObject ):
+
"""TestConnectEnsembleDetails
-
:param bond_slaves: (optional)
-
:type bond_slaves: str
+
:param nodes: [required] A list of each ensemble node in the test and the results of the tests.
+
:type nodes: dict
-
:param bond_updelay: (optional)
-
:type bond_updelay: int
+
"""
+
nodes = data_model . property (
+
"nodes" , dict ,
+
array = False , optional = False ,
+
documentation = """A list of each ensemble node in the test and the results of the tests. """ ,
+
dictionaryType = None
+
)
-
:param broadcast: (optional)
-
:type broadcast: str
+
def __init__ ( self ,
+
nodes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param dns_nameservers: (optional)
-
:type dns_nameservers: str
+
[docs] class TestConnectEnsembleResult ( data_model . DataObject ):
+
"""TestConnectEnsembleResult
-
:param dns_search: (optional)
-
:type dns_search: str
+
:param details: [required]
+
:type details: TestConnectEnsembleDetails
-
:param family: (optional)
-
:type family: str
+
:param duration: [required] The length of time required to run the test.
+
:type duration: str
-
:param gateway: (optional)
-
:type gateway: str
+
:param result: [required] The results of the entire test
+
:type result: str
-
:param mac_address: (optional)
-
:type mac_address: str
+
"""
+
details = data_model . property (
+
"details" , TestConnectEnsembleDetails ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
duration = data_model . property (
+
"duration" , str ,
+
array = False , optional = False ,
+
documentation = """The length of time required to run the test. """ ,
+
dictionaryType = None
+
)
+
result = data_model . property (
+
"result" , str ,
+
array = False , optional = False ,
+
documentation = """The results of the entire test """ ,
+
dictionaryType = None
+
)
-
:param mac_address_permanent: (optional)
-
:type mac_address_permanent: str
+
def __init__ ( self ,
+
details ,
+
duration ,
+
result ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param method: (optional)
-
:type method: str
+
[docs] class RtfiInfo ( data_model . DataObject ):
+
"""RtfiInfo
-
:param mtu: (optional)
-
:type mtu: str
+
:param mipi:
+
:type mipi: str
-
:param netmask: (optional)
-
:type netmask: str
+
:param generation: [required]
+
:type generation: str
-
:param network: (optional)
-
:type network: str
+
:param status_url_logfile:
+
:type status_url_logfile: str
-
:param physical: (optional)
-
:type physical: PhysicalAdapter
+
:param build: [required]
+
:type build: str
-
:param routes: (optional)
-
:type routes: str[]
+
:param status_url_all: [required]
+
:type status_url_all: str
-
:param status: (optional)
-
:type status: str
+
:param generation_next:
+
:type generation_next: int
-
:param symmetric_route_rules: (optional)
-
:type symmetric_route_rules: str[]
+
:param mip:
+
:type mip: str
-
:param up_and_running: (optional)
-
:type up_and_running: bool
-
"""
+
:param status_url_current: [required]
+
:type status_url_current: str
-
_default = data_model . property (
-
"#default" , bool ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
:param options:
+
:type options: dict
-
address = data_model . property (
-
"address" , str ,
+
"""
+
mipi = data_model . property (
+
"mipi" , str ,
array = False , optional = True ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
auto = data_model . property (
-
"auto" , bool ,
-
array = False , optional = True ,
-
documentation = None
+
generation = data_model . property (
+
"generation" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
bond_downdelay = data_model . property (
-
"bond-downdelay" , int ,
+
status_url_logfile = data_model . property (
+
"statusUrlLogfile" , str ,
array = False , optional = True ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
bond_fail_over_mac = data_model . property (
-
"bond-fail_over_mac" , str ,
-
array = False , optional = True ,
-
documentation = None
+
build = data_model . property (
+
"build" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
bond_primary_reselect = data_model . property (
-
"bond-primary_reselect" , str ,
-
array = False , optional = True ,
-
documentation = None
+
status_url_all = data_model . property (
+
"statusUrlAll" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
bond_lacp_rate = data_model . property (
-
"bond-lacp_rate" , str ,
+
generation_next = data_model . property (
+
"generationNext" , int ,
array = False , optional = True ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
bond_miimon = data_model . property (
-
"bond-miimon" , int ,
+
mip = data_model . property (
+
"mip" , str ,
array = False , optional = True ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
bond_mode = data_model . property (
-
"bond-mode" , str ,
-
array = False , optional = True ,
-
documentation = None
+
status_url_current = data_model . property (
+
"statusUrlCurrent" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
bond_slaves = data_model . property (
-
"bond-slaves" , str ,
+
options = data_model . property (
+
"options" , dict ,
array = False , optional = True ,
-
documentation = None
-
)
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
generation ,
+
build ,
+
status_url_all ,
+
status_url_current ,
+
mipi = None ,
+
status_url_logfile = None ,
+
generation_next = None ,
+
mip = None ,
+
options = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ResetNodeDetails ( data_model . DataObject ):
+
"""ResetNodeDetails
+
+
:param rtfi_info: [required]
+
:type rtfi_info: RtfiInfo
-
bond_updelay = data_model . property (
-
"bond-updelay" , int ,
-
array = False , optional = True ,
-
documentation = None
+
"""
+
rtfi_info = data_model . property (
+
"rtfiInfo" , RtfiInfo ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
broadcast = data_model . property (
-
"broadcast" , str ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
def __init__ ( self ,
+
rtfi_info ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
dns_nameservers = data_model . property (
-
"dns-nameservers" , str ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
[docs] class ResetNodeResult ( data_model . DataObject ):
+
"""ResetNodeResult
-
dns_search = data_model . property (
-
"dns-search" , str ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
:param details:
+
:type details: ResetNodeDetails
-
family = data_model . property (
-
"family" , str ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
:param duration:
+
:type duration: str
-
gateway = data_model . property (
-
"gateway" , str ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
:param result:
+
:type result: str
-
mac_address = data_model . property (
-
"macAddress" , str ,
+
"""
+
details = data_model . property (
+
"details" , ResetNodeDetails ,
array = False , optional = True ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
mac_address_permanent = data_model . property (
-
"macAddressPermanent" , str ,
+
duration = data_model . property (
+
"duration" , str ,
array = False , optional = True ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
method = data_model . property (
-
"method" , str ,
+
result = data_model . property (
+
"result" , str ,
array = False , optional = True ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
mtu = data_model . property (
-
"mtu" , str ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
def __init__ ( self ,
+
details = None ,
+
duration = None ,
+
result = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
netmask = data_model . property (
-
"netmask" , str ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
[docs] class SnmpTrapRecipient ( data_model . DataObject ):
+
"""SnmpTrapRecipient
+
Host that is to receive the traps generated by the cluster.
-
network = data_model . property (
-
"network" , str ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
:param host: [required] The IP address or host name of the target network management station.
+
:type host: str
-
physical = data_model . property (
-
"physical" , PhysicalAdapter ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
:param community: [required] SNMP community string.
+
:type community: str
-
routes = data_model . property (
-
"routes" , str ,
-
array = True , optional = True ,
-
documentation = None
-
)
+
:param port: [required] The UDP port number on the host where the trap is to be sent. Valid range is 1 - 65535. 0 (zero) is not a valid port number. Default is 162.
+
:type port: int
-
status = data_model . property (
-
"status" , str ,
-
array = False , optional = True ,
-
documentation = None
+
"""
+
host = data_model . property (
+
"host" , str ,
+
array = False , optional = False ,
+
documentation = """The IP address or host name of the target network management station. """ ,
+
dictionaryType = None
)
-
-
symmetric_route_rules = data_model . property (
-
"symmetricRouteRules" , str ,
-
array = True , optional = True ,
-
documentation = None
+
community = data_model . property (
+
"community" , str ,
+
array = False , optional = False ,
+
documentation = """SNMP community string. """ ,
+
dictionaryType = None
)
-
-
up_and_running = data_model . property (
-
"upAndRunning" , bool ,
-
array = False , optional = True ,
-
documentation = None
+
port = data_model . property (
+
"port" , int ,
+
array = False , optional = False ,
+
documentation = """The UDP port number on the host where the trap is to be sent. Valid range is 1 - 65535. 0 (zero) is not a valid port number. Default is 162. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
host ,
+
community ,
+
port ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class GetSnmpTrapInfoResult ( data_model . DataObject ):
+
"""GetSnmpTrapInfoResult
-
[docs] class NewDrive ( data_model . DataObject ):
-
"""
+
:param trap_recipients: [required] List of hosts that are to receive the traps generated by the cluster.
+
:type trap_recipients: SnmpTrapRecipient
-
:param drive_id: [required] A unique identifier for this drive.
-
:type drive_id: int
-
"""
+
:param cluster_fault_traps_enabled: [required] If "true", when a cluster fault is logged a corresponding solidFireClusterFaultNotification is sent to the configured list of trap recipients.
+
:type cluster_fault_traps_enabled: bool
-
drive_id = data_model . property (
-
"driveID" , int ,
+
:param cluster_fault_resolved_traps_enabled: [required] If "true", when a cluster fault is logged a corresponding solidFireClusterFaultResolvedNotification is sent to the configured list of trap recipients.
+
:type cluster_fault_resolved_traps_enabled: bool
+
+
:param cluster_event_traps_enabled: [required] If "true", when a cluster fault is logged a corresponding solidFireClusterEventNotification is sent to the configured list of trap recipients.
+
:type cluster_event_traps_enabled: bool
+
+
"""
+
trap_recipients = data_model . property (
+
"trapRecipients" , SnmpTrapRecipient ,
+
array = True , optional = False ,
+
documentation = """List of hosts that are to receive the traps generated by the cluster. """ ,
+
dictionaryType = None
+
)
+
cluster_fault_traps_enabled = data_model . property (
+
"clusterFaultTrapsEnabled" , bool ,
+
array = False , optional = False ,
+
documentation = """If "true", when a cluster fault is logged a corresponding solidFireClusterFaultNotification is sent to the configured list of trap recipients. """ ,
+
dictionaryType = None
+
)
+
cluster_fault_resolved_traps_enabled = data_model . property (
+
"clusterFaultResolvedTrapsEnabled" , bool ,
+
array = False , optional = False ,
+
documentation = """If "true", when a cluster fault is logged a corresponding solidFireClusterFaultResolvedNotification is sent to the configured list of trap recipients. """ ,
+
dictionaryType = None
+
)
+
cluster_event_traps_enabled = data_model . property (
+
"clusterEventTrapsEnabled" , bool ,
array = False , optional = False ,
-
documentation = " \
-
A unique identifier for this drive. \
-
"
+
documentation = """If "true", when a cluster fault is logged a corresponding solidFireClusterEventNotification is sent to the configured list of trap recipients. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
trap_recipients ,
+
cluster_fault_traps_enabled ,
+
cluster_fault_resolved_traps_enabled ,
+
cluster_event_traps_enabled ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class ModifyVolumePairRequest ( data_model . DataObject ):
+
"""ModifyVolumePairRequest
+
ModifyVolumePair enables you to pause or restart replication between a pair of volumes.
-
[docs] class PairedCluster ( data_model . DataObject ):
-
"""
+
:param volume_id: [required] The ID of the volume to be modified.
+
:type volume_id: int
-
:param cluster_name: [required] Name of the other cluster in the pair
-
:type cluster_name: str
+
:param paused_manual: Specifies whether to pause or restart volume replication process. Valid values are: true: Pauses volume replication false: Restarts volume replication
+
:type paused_manual: bool
-
:param cluster_pair_id: [required] Unique ID given to each cluster in the
-
pair.
-
:type cluster_pair_id: int
+
:param mode: Specifies the volume replication mode. Possible values are: Async: Writes are acknowledged when they complete locally. The cluster does not wait for writes to be replicated to the target cluster. Sync: The source acknowledges the write when the data is stored locally and on the remote cluster. SnapshotsOnly: Only snapshots created on the source cluster are replicated. Active writes from the source volume are not replicated.
+
:type mode: str
-
:param cluster_pair_uuid: [required] Universally unique identifier.
-
:type cluster_pair_uuid: UUID
+
:param pause_limit: Internal use only.
+
:type pause_limit: int
-
:param latency: [required] Number, in milliseconds, of latency between
-
clusters.
-
:type latency: int
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the volume to be modified. """ ,
+
dictionaryType = None
+
)
+
paused_manual = data_model . property (
+
"pausedManual" , bool ,
+
array = False , optional = True ,
+
documentation = """Specifies whether to pause or restart volume replication process. Valid values are: true: Pauses volume replication false: Restarts volume replication """ ,
+
dictionaryType = None
+
)
+
mode = data_model . property (
+
"mode" , str ,
+
array = False , optional = True ,
+
documentation = """Specifies the volume replication mode. Possible values are: Async: Writes are acknowledged when they complete locally. The cluster does not wait for writes to be replicated to the target cluster. Sync: The source acknowledges the write when the data is stored locally and on the remote cluster. SnapshotsOnly: Only snapshots created on the source cluster are replicated. Active writes from the source volume are not replicated. """ ,
+
dictionaryType = None
+
)
+
pause_limit = data_model . property (
+
"pauseLimit" , int ,
+
array = False , optional = True ,
+
documentation = """Internal use only. """ ,
+
dictionaryType = None
+
)
-
:param mvip: [required] IP of the management connection for paired
-
clusters.
-
:type mvip: str
+
def __init__ ( self ,
+
volume_id ,
+
paused_manual = None ,
+
mode = None ,
+
pause_limit = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param status: [required] Can be one of the following:
+
[docs] class ModifyVolumePairResult ( data_model . DataObject ):
+
"""ModifyVolumePairResult
-
**Connected**
+
"""
-
**Misconfigured**
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
**Disconnected**
+
[docs] class AddInitiatorsToVolumeAccessGroupRequest ( data_model . DataObject ):
+
"""AddInitiatorsToVolumeAccessGroupRequest
+
AddInitiatorsToVolumeAccessGroup enables you
+
to add initiators to a specified volume access group.
-
:type status: str
+
:param volume_access_group_id: [required] The ID of the volume access group to modify.
+
:type volume_access_group_id: int
-
:param version: [required] The Element OS version of the other cluster in
-
the pair.
-
:type version: str
-
"""
+
:param initiators: [required] The list of initiators to add to the volume access group.
+
:type initiators: str
-
cluster_name = data_model . property (
-
"clusterName" , str ,
+
"""
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
array = False , optional = False ,
-
documentation = " \
-
Name of the other cluster in the pair \
-
"
+
documentation = """The ID of the volume access group to modify. """ ,
+
dictionaryType = None
)
-
-
cluster_pair_id = data_model . property (
-
"clusterPairID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Unique ID given to each cluster in the pair. \
-
"
+
initiators = data_model . property (
+
"initiators" , str ,
+
array = True , optional = False ,
+
documentation = """The list of initiators to add to the volume access group. """ ,
+
dictionaryType = None
)
-
cluster_pair_uuid = data_model . property (
-
"clusterPairUUID" , UUID ,
-
array = False , optional = False ,
-
documentation = " \
-
Universally unique identifier. \
-
"
+
def __init__ ( self ,
+
volume_access_group_id ,
+
initiators ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetIpmiConfigRequest ( data_model . DataObject ):
+
"""GetIpmiConfigRequest
+
GetIpmiConfig enables you to retrieve hardware sensor information from sensors that are in your node.
+
+
:param chassis_type: Displays information for each node chassis type. Valid values are: all: Returns sensor information for each chassis type. {chassis type}: Returns sensor information for a specified chassis type.
+
:type chassis_type: str
+
+
"""
+
chassis_type = data_model . property (
+
"chassisType" , str ,
+
array = False , optional = True ,
+
documentation = """Displays information for each node chassis type. Valid values are: all: Returns sensor information for each chassis type. {chassis type}: Returns sensor information for a specified chassis type. """ ,
+
dictionaryType = None
)
-
latency = data_model . property (
-
"latency" , int ,
+
def __init__ ( self ,
+
chassis_type = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetNvramInfoResult ( data_model . DataObject ):
+
"""GetNvramInfoResult
+
+
:param nvram_info: [required] Arrays of events and errors detected on the NVRAM card.
+
:type nvram_info: dict
+
+
"""
+
nvram_info = data_model . property (
+
"nvramInfo" , dict ,
array = False , optional = False ,
-
documentation = " \
-
Number, in milliseconds, of latency between clusters. \
-
"
+
documentation = """Arrays of events and errors detected on the NVRAM card. """ ,
+
dictionaryType = None
)
-
mvip = data_model . property (
-
"mvip" , str ,
+
def __init__ ( self ,
+
nvram_info ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class Account ( data_model . DataObject ):
+
"""Account
+
The object containing information about an account.
+
This object only includes "configured" information about the account, not any runtime or usage information.
+
+
:param account_id: [required] Unique AccountID for the account.
+
:type account_id: int
+
+
:param username: [required] User name for the account.
+
:type username: str
+
+
:param status: [required] Current status of the account.
+
:type status: str
+
+
:param volumes: [required] List of VolumeIDs for Volumes owned by this account.
+
:type volumes: int
+
+
:param initiator_secret: CHAP secret to use for the initiator.
+
:type initiator_secret: CHAPSecret
+
+
:param target_secret: CHAP secret to use for the target (mutual CHAP authentication).
+
:type target_secret: CHAPSecret
+
+
:param storage_container_id: The id of the storage container associated with the account
+
:type storage_container_id: UUID
+
+
:param attributes: List of Name/Value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
account_id = data_model . property (
+
"accountID" , int ,
array = False , optional = False ,
-
documentation = " \
-
IP of the management connection for paired clusters. \
-
"
+
documentation = """Unique AccountID for the account. """ ,
+
dictionaryType = None
+
)
+
username = data_model . property (
+
"username" , str ,
+
array = False , optional = False ,
+
documentation = """User name for the account. """ ,
+
dictionaryType = None
)
-
status = data_model . property (
"status" , str ,
array = False , optional = False ,
-
documentation = " \
-
Can be one of the following: \
-
\
-
\
-
**Connected** \
-
\
-
\
-
\
-
**Misconfigured** \
-
\
-
\
-
\
-
**Disconnected** \
-
\
-
"
+
documentation = """Current status of the account. """ ,
+
dictionaryType = None
+
)
+
volumes = data_model . property (
+
"volumes" , int ,
+
array = True , optional = False ,
+
documentation = """List of VolumeIDs for Volumes owned by this account. """ ,
+
dictionaryType = None
+
)
+
initiator_secret = data_model . property (
+
"initiatorSecret" , CHAPSecret ,
+
array = False , optional = True ,
+
documentation = """CHAP secret to use for the initiator. """ ,
+
dictionaryType = None
+
)
+
target_secret = data_model . property (
+
"targetSecret" , CHAPSecret ,
+
array = False , optional = True ,
+
documentation = """CHAP secret to use for the target (mutual CHAP authentication). """ ,
+
dictionaryType = None
+
)
+
storage_container_id = data_model . property (
+
"storageContainerID" , UUID ,
+
array = False , optional = True ,
+
documentation = """The id of the storage container associated with the account """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of Name/Value pairs in JSON object format. """ ,
+
dictionaryType = None
)
-
version = data_model . property (
-
"version" , str ,
+
def __init__ ( self ,
+
account_id ,
+
username ,
+
status ,
+
volumes ,
+
initiator_secret = None ,
+
target_secret = None ,
+
storage_container_id = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListAccountsResult ( data_model . DataObject ):
+
"""ListAccountsResult
+
+
:param accounts: [required] List of accounts.
+
:type accounts: Account
+
+
"""
+
accounts = data_model . property (
+
"accounts" , Account ,
+
array = True , optional = False ,
+
documentation = """List of accounts. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
accounts ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class RemoveClusterPairResult ( data_model . DataObject ):
+
"""RemoveClusterPairResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CreateSnapshotResult ( data_model . DataObject ):
+
"""CreateSnapshotResult
+
+
:param snapshot: [required]
+
:type snapshot: Snapshot
+
+
:param snapshot_id: [required] ID of the newly-created snapshot.
+
:type snapshot_id: int
+
+
:param checksum: [required] A string that represents the correct digits in the stored snapshot. This checksum can be used later to compare other snapshots to detect errors in the data.
+
:type checksum: str
+
+
"""
+
snapshot = data_model . property (
+
"snapshot" , Snapshot ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
+
array = False , optional = False ,
+
documentation = """ID of the newly-created snapshot. """ ,
+
dictionaryType = None
+
)
+
checksum = data_model . property (
+
"checksum" , str ,
array = False , optional = False ,
-
documentation = " \
-
The Element OS version of the other cluster in the pair. \
-
"
+
documentation = """A string that represents the correct digits in the stored snapshot. This checksum can be used later to compare other snapshots to detect errors in the data. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
snapshot ,
+
snapshot_id ,
+
checksum ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class GetClusterFullThresholdResult ( data_model . DataObject ):
+
"""GetClusterFullThresholdResult
-
[docs] class RemoteReplication ( data_model . DataObject ):
-
"""
-
Details on the volume replication.
+
:param block_fullness: [required] Current computed level of block fullness of the cluster. Possible values: stage1Happy: No alerts or error conditions. stage2Aware: 3 nodes of capacity available. stage3Low: 2 nodes of capacity available. stage4Critical: 1 node of capacity available. No new volumes or clones can be created. stage5CompletelyConsumed: Completely consumed. Cluster is read-only, iSCSI connection is maintained but all writes are suspended.
+
:type block_fullness: str
-
:param mode: [required] Volume replication mode.
+
:param fullness: [required] Reflects the highest level of fullness between "blockFullness" and "metadataFullness".
+
:type fullness: str
-
Possible values:
+
:param max_metadata_over_provision_factor: [required] A value representative of the number of times metadata space can be over provisioned relative to the amount of space available. For example, if there was enough metadata space to store 100 TiB of volumes and this number was set to 5, then 500 TiB worth of volumes could be created.
+
:type max_metadata_over_provision_factor: int
-
**Async**: Writes are acknowledged when they complete locally. The
-
cluster does not wait for writes to be replicated to the target
-
cluster.
+
:param metadata_fullness: [required] Current computed level of metadata fullness of the cluster.
+
:type metadata_fullness: str
-
**Sync**: Source acknowledges write when the data is stored locally and
-
on the remote cluster.
+
:param slice_reserve_used_threshold_pct: [required] Error condition; message sent to "Alerts" if the reserved slice utilization is greater than the sliceReserveUsedThresholdPct value returned.
+
:type slice_reserve_used_threshold_pct: int
-
**SnapshotsOnly**: Only snapshots created on the source cluster will be
-
replicated. Active writes from the source volume will not be
-
replicated.
+
:param stage2_aware_threshold: [required] Awareness condition: Value that is set for "Stage 2" cluster threshold level.
+
:type stage2_aware_threshold: int
+
:param stage2_block_threshold_bytes: [required] Number of bytes being used by the cluster at which a stage2 condition will exist.
+
:type stage2_block_threshold_bytes: int
+
:param stage3_block_threshold_bytes: [required] Number of bytes being used by the cluster at which a stage3 condition will exist.
+
:type stage3_block_threshold_bytes: int
-
:type mode: str
+
:param stage3_block_threshold_percent: [required] The percent value set for stage3. At this percent full, a warning will be posted in the Alerts log.
+
:type stage3_block_threshold_percent: int
-
:param pause_limit: [required] The number of occurring write ops before
-
auto-pausing, on a per volume pair level.
-
:type pause_limit: int
+
:param stage3_low_threshold: [required] Error condition; message sent to "Alerts" that capacity on a cluster is getting low.
+
:type stage3_low_threshold: int
-
:param remote_service_id: [required] The remote slice service ID.
-
:type remote_service_id: int
+
:param stage4_critical_threshold: [required] Error condition; message sent to "Alerts" that capacity on a cluster is critically low.
+
:type stage4_critical_threshold: int
-
:param resume_details: [required] Reserved for future use.
-
:type resume_details: str
+
:param stage4_block_threshold_bytes: [required] Number of bytes being used by the cluster at which a stage4 condition will exist.
+
:type stage4_block_threshold_bytes: int
-
:param snapshot_replication: [required] The details of snapshot
-
replication.
-
:type snapshot_replication: SnapshotReplication
+
:param stage5_block_threshold_bytes: [required] Number of bytes being used by the cluster at which a stage5 condition will exist.
+
:type stage5_block_threshold_bytes: int
-
:param state: [required] The state of the volume replication.
-
:type state: str
+
:param sum_total_cluster_bytes: [required] Physical capacity of the cluster measured in bytes.
+
:type sum_total_cluster_bytes: int
+
+
:param sum_total_metadata_cluster_bytes: [required] Total amount of space that can be used to store metadata.
+
:type sum_total_metadata_cluster_bytes: int
+
+
:param sum_used_cluster_bytes: [required] Number of bytes used on the cluster.
+
:type sum_used_cluster_bytes: int
+
+
:param sum_used_metadata_cluster_bytes: [required] Amount of space used on volume drives to store metadata.
+
:type sum_used_metadata_cluster_bytes: int
-
:param state_details: [required] Reserved for future use.
-
:type state_details: str
"""
+
block_fullness = data_model . property (
+
"blockFullness" , str ,
+
array = False , optional = False ,
+
documentation = """Current computed level of block fullness of the cluster. Possible values: stage1Happy: No alerts or error conditions. stage2Aware: 3 nodes of capacity available. stage3Low: 2 nodes of capacity available. stage4Critical: 1 node of capacity available. No new volumes or clones can be created. stage5CompletelyConsumed: Completely consumed. Cluster is read-only, iSCSI connection is maintained but all writes are suspended. """ ,
+
dictionaryType = None
+
)
+
fullness = data_model . property (
+
"fullness" , str ,
+
array = False , optional = False ,
+
documentation = """Reflects the highest level of fullness between "blockFullness" and "metadataFullness". """ ,
+
dictionaryType = None
+
)
+
max_metadata_over_provision_factor = data_model . property (
+
"maxMetadataOverProvisionFactor" , int ,
+
array = False , optional = False ,
+
documentation = """A value representative of the number of times metadata space can be over provisioned relative to the amount of space available. For example, if there was enough metadata space to store 100 TiB of volumes and this number was set to 5, then 500 TiB worth of volumes could be created. """ ,
+
dictionaryType = None
+
)
+
metadata_fullness = data_model . property (
+
"metadataFullness" , str ,
+
array = False , optional = False ,
+
documentation = """Current computed level of metadata fullness of the cluster. """ ,
+
dictionaryType = None
+
)
+
slice_reserve_used_threshold_pct = data_model . property (
+
"sliceReserveUsedThresholdPct" , int ,
+
array = False , optional = False ,
+
documentation = """Error condition; message sent to "Alerts" if the reserved slice utilization is greater than the sliceReserveUsedThresholdPct value returned. """ ,
+
dictionaryType = None
+
)
+
stage2_aware_threshold = data_model . property (
+
"stage2AwareThreshold" , int ,
+
array = False , optional = False ,
+
documentation = """Awareness condition: Value that is set for "Stage 2" cluster threshold level. """ ,
+
dictionaryType = None
+
)
+
stage2_block_threshold_bytes = data_model . property (
+
"stage2BlockThresholdBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Number of bytes being used by the cluster at which a stage2 condition will exist. """ ,
+
dictionaryType = None
+
)
+
stage3_block_threshold_bytes = data_model . property (
+
"stage3BlockThresholdBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Number of bytes being used by the cluster at which a stage3 condition will exist. """ ,
+
dictionaryType = None
+
)
+
stage3_block_threshold_percent = data_model . property (
+
"stage3BlockThresholdPercent" , int ,
+
array = False , optional = False ,
+
documentation = """The percent value set for stage3. At this percent full, a warning will be posted in the Alerts log. """ ,
+
dictionaryType = None
+
)
+
stage3_low_threshold = data_model . property (
+
"stage3LowThreshold" , int ,
+
array = False , optional = False ,
+
documentation = """Error condition; message sent to "Alerts" that capacity on a cluster is getting low. """ ,
+
dictionaryType = None
+
)
+
stage4_critical_threshold = data_model . property (
+
"stage4CriticalThreshold" , int ,
+
array = False , optional = False ,
+
documentation = """Error condition; message sent to "Alerts" that capacity on a cluster is critically low. """ ,
+
dictionaryType = None
+
)
+
stage4_block_threshold_bytes = data_model . property (
+
"stage4BlockThresholdBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Number of bytes being used by the cluster at which a stage4 condition will exist. """ ,
+
dictionaryType = None
+
)
+
stage5_block_threshold_bytes = data_model . property (
+
"stage5BlockThresholdBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Number of bytes being used by the cluster at which a stage5 condition will exist. """ ,
+
dictionaryType = None
+
)
+
sum_total_cluster_bytes = data_model . property (
+
"sumTotalClusterBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Physical capacity of the cluster measured in bytes. """ ,
+
dictionaryType = None
+
)
+
sum_total_metadata_cluster_bytes = data_model . property (
+
"sumTotalMetadataClusterBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Total amount of space that can be used to store metadata. """ ,
+
dictionaryType = None
+
)
+
sum_used_cluster_bytes = data_model . property (
+
"sumUsedClusterBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Number of bytes used on the cluster. """ ,
+
dictionaryType = None
+
)
+
sum_used_metadata_cluster_bytes = data_model . property (
+
"sumUsedMetadataClusterBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Amount of space used on volume drives to store metadata. """ ,
+
dictionaryType = None
+
)
-
mode = data_model . property (
-
"mode" , str ,
+
def __init__ ( self ,
+
block_fullness ,
+
fullness ,
+
max_metadata_over_provision_factor ,
+
metadata_fullness ,
+
slice_reserve_used_threshold_pct ,
+
stage2_aware_threshold ,
+
stage2_block_threshold_bytes ,
+
stage3_block_threshold_bytes ,
+
stage3_block_threshold_percent ,
+
stage3_low_threshold ,
+
stage4_critical_threshold ,
+
stage4_block_threshold_bytes ,
+
stage5_block_threshold_bytes ,
+
sum_total_cluster_bytes ,
+
sum_total_metadata_cluster_bytes ,
+
sum_used_cluster_bytes ,
+
sum_used_metadata_cluster_bytes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyStorageContainerRequest ( data_model . DataObject ):
+
"""ModifyStorageContainerRequest
+
ModifyStorageContainer enables you to make changes to an existing virtual volume storage container.
+
+
:param storage_container_id: [required] The unique ID of the virtual volume storage container to modify.
+
:type storage_container_id: UUID
+
+
:param initiator_secret: The new secret for CHAP authentication for the initiator.
+
:type initiator_secret: str
+
+
:param target_secret: The new secret for CHAP authentication for the target.
+
:type target_secret: str
+
+
"""
+
storage_container_id = data_model . property (
+
"storageContainerID" , UUID ,
+
array = False , optional = False ,
+
documentation = """The unique ID of the virtual volume storage container to modify. """ ,
+
dictionaryType = None
+
)
+
initiator_secret = data_model . property (
+
"initiatorSecret" , str ,
+
array = False , optional = True ,
+
documentation = """The new secret for CHAP authentication for the initiator. """ ,
+
dictionaryType = None
+
)
+
target_secret = data_model . property (
+
"targetSecret" , str ,
+
array = False , optional = True ,
+
documentation = """The new secret for CHAP authentication for the target. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
storage_container_id ,
+
initiator_secret = None ,
+
target_secret = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GroupSnapshotMembers ( data_model . DataObject ):
+
"""GroupSnapshotMembers
+
List of checksum, volumeIDs and snapshotIDs for each member of the group.
+
+
:param volume_id: [required] The source volume ID for the snapshot.
+
:type volume_id: int
+
+
:param snapshot_id: [required] Unique ID of a snapshot from which the new snapshot is made. The snapshotID passed must be a snapshot on the given volume.
+
:type snapshot_id: int
+
+
:param snapshot_uuid: [required] Universal Unique ID of an existing snapshot.
+
:type snapshot_uuid: str
+
+
:param checksum: [required] A string that represents the correct digits in the stored snapshot. This checksum can be used later to compare other snapshots to detect errors in the data.
+
:type checksum: str
+
+
:param attributes:
+
:type attributes: dict
+
+
:param create_time:
+
:type create_time: str
+
+
:param enable_remote_replication:
+
:type enable_remote_replication: bool
+
+
:param expiration_reason:
+
:type expiration_reason: str
+
+
:param expiration_time:
+
:type expiration_time: str
+
+
:param group_id:
+
:type group_id: int
+
+
:param group_snapshot_uuid:
+
:type group_snapshot_uuid: UUID
+
+
:param name:
+
:type name: str
+
+
:param remote_status:
+
:type remote_status: str
+
+
:param remote_statuses:
+
:type remote_statuses: dict
+
+
:param status:
+
:type status: str
+
+
:param total_size:
+
:type total_size: int
+
+
:param virtual_volume_id:
+
:type virtual_volume_id: int
+
+
:param volume_pair_uuid:
+
:type volume_pair_uuid: UUID
+
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """The source volume ID for the snapshot. """ ,
+
dictionaryType = None
+
)
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
+
array = False , optional = False ,
+
documentation = """Unique ID of a snapshot from which the new snapshot is made. The snapshotID passed must be a snapshot on the given volume. """ ,
+
dictionaryType = None
+
)
+
snapshot_uuid = data_model . property (
+
"snapshotUUID" , str ,
+
array = False , optional = False ,
+
documentation = """Universal Unique ID of an existing snapshot. """ ,
+
dictionaryType = None
+
)
+
checksum = data_model . property (
+
"checksum" , str ,
+
array = False , optional = False ,
+
documentation = """A string that represents the correct digits in the stored snapshot. This checksum can be used later to compare other snapshots to detect errors in the data. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
create_time = data_model . property (
+
"createTime" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
enable_remote_replication = data_model . property (
+
"enableRemoteReplication" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
expiration_reason = data_model . property (
+
"expirationReason" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
expiration_time = data_model . property (
+
"expirationTime" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
group_id = data_model . property (
+
"groupID" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
group_snapshot_uuid = data_model . property (
+
"groupSnapshotUUID" , UUID ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
remote_status = data_model . property (
+
"remoteStatus" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
remote_statuses = data_model . property (
+
"remoteStatuses" , dict ,
+
array = True , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
status = data_model . property (
+
"status" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
total_size = data_model . property (
+
"totalSize" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
virtual_volume_id = data_model . property (
+
"virtualVolumeID" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_pair_uuid = data_model . property (
+
"volumePairUUID" , UUID ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_id ,
+
snapshot_id ,
+
snapshot_uuid ,
+
checksum ,
+
attributes = None ,
+
create_time = None ,
+
enable_remote_replication = None ,
+
expiration_reason = None ,
+
expiration_time = None ,
+
group_id = None ,
+
group_snapshot_uuid = None ,
+
name = None ,
+
remote_status = None ,
+
remote_statuses = None ,
+
status = None ,
+
total_size = None ,
+
virtual_volume_id = None ,
+
volume_pair_uuid = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GroupSnapshot ( data_model . DataObject ):
+
"""GroupSnapshot
+
Group Snapshot object represents a point-in-time copy of a group of volumes.
+
+
:param group_snapshot_id: [required] Unique ID of the new group snapshot.
+
:type group_snapshot_id: int
+
+
:param group_snapshot_uuid: [required] UUID of the group snapshot.
+
:type group_snapshot_uuid: UUID
+
+
:param members: [required] List of volumeIDs and snapshotIDs for each member of the group.
+
:type members: GroupSnapshotMembers
+
+
:param name: [required] Name of the group snapshot, or, if none was given, the UTC formatted day and time on which the snapshot was created.
+
:type name: str
+
+
:param create_time: [required] The UTC formatted day and time on which the snapshot was created.
+
:type create_time: str
+
+
:param status: [required] Status of the snapshot. Possible values: Preparing: A snapshot that is being prepared for use and is not yet writable. Done: A snapshot that has finished being prepared and is now usable
+
:type status: str
+
+
:param attributes: [required] List of Name/Value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
group_snapshot_id = data_model . property (
+
"groupSnapshotID" , int ,
+
array = False , optional = False ,
+
documentation = """Unique ID of the new group snapshot. """ ,
+
dictionaryType = None
+
)
+
group_snapshot_uuid = data_model . property (
+
"groupSnapshotUUID" , UUID ,
+
array = False , optional = False ,
+
documentation = """UUID of the group snapshot. """ ,
+
dictionaryType = None
+
)
+
members = data_model . property (
+
"members" , GroupSnapshotMembers ,
+
array = True , optional = False ,
+
documentation = """List of volumeIDs and snapshotIDs for each member of the group. """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """Name of the group snapshot, or, if none was given, the UTC formatted day and time on which the snapshot was created. """ ,
+
dictionaryType = None
+
)
+
create_time = data_model . property (
+
"createTime" , str ,
+
array = False , optional = False ,
+
documentation = """The UTC formatted day and time on which the snapshot was created. """ ,
+
dictionaryType = None
+
)
+
status = data_model . property (
+
"status" , str ,
+
array = False , optional = False ,
+
documentation = """Status of the snapshot. Possible values: Preparing: A snapshot that is being prepared for use and is not yet writable. Done: A snapshot that has finished being prepared and is now usable """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = False ,
+
documentation = """List of Name/Value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
group_snapshot_id ,
+
group_snapshot_uuid ,
+
members ,
+
name ,
+
create_time ,
+
status ,
+
attributes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListGroupSnapshotsResult ( data_model . DataObject ):
+
"""ListGroupSnapshotsResult
+
+
:param group_snapshots: [required] List of Group Snapshots.
+
:type group_snapshots: GroupSnapshot
+
+
"""
+
group_snapshots = data_model . property (
+
"groupSnapshots" , GroupSnapshot ,
+
array = True , optional = False ,
+
documentation = """List of Group Snapshots. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
group_snapshots ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CreateVolumeAccessGroupRequest ( data_model . DataObject ):
+
"""CreateVolumeAccessGroupRequest
+
You can use CreateVolumeAccessGroup to create a new volume access group. When you create the volume access group, you need to give it a name, and you can optionally enter initiators and volumes. After you create the group, you can add volumes and initiator IQNs. Any initiator IQN that you add to the volume access group is able to access any volume in the group without CHAP authentication.
+
+
:param name: [required] The name for this volume access group. Not required to be unique, but recommended.
+
:type name: str
+
+
:param initiators: List of initiators to include in the volume access group. If unspecified, the access group's configured initiators are not modified.
+
:type initiators: str
+
+
:param volumes: List of volumes to initially include in the volume access group. If unspecified, the access group's volumes are not modified.
+
:type volumes: int
+
+
:param virtual_network_id: The ID of the SolidFire virtual network to associate the volume access group with.
+
:type virtual_network_id: int
+
+
:param virtual_network_tags: The ID of the SolidFire virtual network to associate the volume access group with.
+
:type virtual_network_tags: int
+
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """The name for this volume access group. Not required to be unique, but recommended. """ ,
+
dictionaryType = None
+
)
+
initiators = data_model . property (
+
"initiators" , str ,
+
array = True , optional = True ,
+
documentation = """List of initiators to include in the volume access group. If unspecified, the access group's configured initiators are not modified. """ ,
+
dictionaryType = None
+
)
+
volumes = data_model . property (
+
"volumes" , int ,
+
array = True , optional = True ,
+
documentation = """List of volumes to initially include in the volume access group. If unspecified, the access group's volumes are not modified. """ ,
+
dictionaryType = None
+
)
+
virtual_network_id = data_model . property (
+
"virtualNetworkID" , int ,
+
array = True , optional = True ,
+
documentation = """The ID of the SolidFire virtual network to associate the volume access group with. """ ,
+
dictionaryType = None
+
)
+
virtual_network_tags = data_model . property (
+
"virtualNetworkTags" , int ,
+
array = True , optional = True ,
+
documentation = """The ID of the SolidFire virtual network to associate the volume access group with. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
name ,
+
initiators = None ,
+
volumes = None ,
+
virtual_network_id = None ,
+
virtual_network_tags = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DeleteVolumeAccessGroupRequest ( data_model . DataObject ):
+
"""DeleteVolumeAccessGroupRequest
+
DeleteVolumeAccessGroup enables you to delete a
+
volume access group.
+
+
:param volume_access_group_id: [required] The ID of the volume access group to be deleted.
+
:type volume_access_group_id: int
+
+
"""
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the volume access group to be deleted. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_access_group_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ClearClusterFaultsRequest ( data_model . DataObject ):
+
"""ClearClusterFaultsRequest
+
You can use the ClearClusterFaults method to clear information about both current and previously detected faults. Both resolved
+
and unresolved faults can be cleared.
+
+
:param fault_types: Determines the types of faults cleared. Possible values are: current: Faults that are currently detected and have not been resolved. resolved: (Default) Faults that were previously detected and resolved. all: Both current and resolved faults are cleared. The fault status can be determined by the resolved field of the fault object.
+
:type fault_types: str
+
+
"""
+
fault_types = data_model . property (
+
"faultTypes" , str ,
+
array = False , optional = True ,
+
documentation = """Determines the types of faults cleared. Possible values are: current: Faults that are currently detected and have not been resolved. resolved: (Default) Faults that were previously detected and resolved. all: Both current and resolved faults are cleared. The fault status can be determined by the resolved field of the fault object. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
fault_types = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetVolumeEfficiencyRequest ( data_model . DataObject ):
+
"""GetVolumeEfficiencyRequest
+
GetVolumeEfficiency enables you to retrieve information about a volume. Only the volume you give as a parameter in this API method is used to compute the capacity.
+
+
:param volume_id: [required] Specifies the volume for which capacity is computed.
+
:type volume_id: int
+
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """Specifies the volume for which capacity is computed. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListClusterFaultsRequest ( data_model . DataObject ):
+
"""ListClusterFaultsRequest
+
ListClusterFaults enables you to retrieve information about any faults detected on the cluster. With this method, you can retrieve both current faults as well as faults that have been resolved. The system caches faults every 30 seconds.
+
+
:param best_practices: Specifies whether to include faults triggered by suboptimal system configuration. Possible values are: true false
+
:type best_practices: bool
+
+
:param fault_types: Determines the types of faults returned. Possible values are: current: List active, unresolved faults. resolved: List faults that were previously detected and resolved. all: (Default) List both current and resolved faults. You can see the fault status in the resolved field of the Cluster Fault object.
+
:type fault_types: str
+
+
"""
+
best_practices = data_model . property (
+
"bestPractices" , bool ,
+
array = False , optional = True ,
+
documentation = """Specifies whether to include faults triggered by suboptimal system configuration. Possible values are: true false """ ,
+
dictionaryType = None
+
)
+
fault_types = data_model . property (
+
"faultTypes" , str ,
+
array = False , optional = True ,
+
documentation = """Determines the types of faults returned. Possible values are: current: List active, unresolved faults. resolved: List faults that were previously detected and resolved. all: (Default) List both current and resolved faults. You can see the fault status in the resolved field of the Cluster Fault object. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
best_practices = None ,
+
fault_types = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyAccountRequest ( data_model . DataObject ):
+
"""ModifyAccountRequest
+
ModifyAccount enables you to modify an existing account.
+
When you lock an account, any existing connections from that account are immediately terminated. When you change an account's
+
CHAP settings, any existing connections remain active, and the new CHAP settings are used on subsequent connections or
+
reconnections.
+
To clear an account's attributes, specify {} for the attributes parameter.
+
+
:param account_id: [required] Specifies the AccountID for the account to be modified.
+
:type account_id: int
+
+
:param username: Specifies the username associated with the account. (Might be 1 to 64 characters in length).
+
:type username: str
+
+
:param status: Sets the status for the account. Possible values are: active: The account is active and connections are allowed. locked: The account is locked and connections are refused.
+
:type status: str
+
+
:param initiator_secret: Specifies the CHAP secret to use for the initiator. This secret must be 12-16 characters in length and should be impenetrable. The initiator CHAP secret must be unique and cannot be the same as the target CHAP secret.
+
:type initiator_secret: CHAPSecret
+
+
:param target_secret: Specifies the CHAP secret to use for the target (mutual CHAP authentication). This secret must be 12-16 characters in length and should be impenetrable. The target CHAP secret must be unique and cannot be the same as the initiator CHAP secret.
+
:type target_secret: CHAPSecret
+
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
account_id = data_model . property (
+
"accountID" , int ,
+
array = False , optional = False ,
+
documentation = """Specifies the AccountID for the account to be modified. """ ,
+
dictionaryType = None
+
)
+
username = data_model . property (
+
"username" , str ,
+
array = False , optional = True ,
+
documentation = """Specifies the username associated with the account. (Might be 1 to 64 characters in length). """ ,
+
dictionaryType = None
+
)
+
status = data_model . property (
+
"status" , str ,
+
array = False , optional = True ,
+
documentation = """Sets the status for the account. Possible values are: active: The account is active and connections are allowed. locked: The account is locked and connections are refused. """ ,
+
dictionaryType = None
+
)
+
initiator_secret = data_model . property (
+
"initiatorSecret" , CHAPSecret ,
+
array = False , optional = True ,
+
documentation = """Specifies the CHAP secret to use for the initiator. This secret must be 12-16 characters in length and should be impenetrable. The initiator CHAP secret must be unique and cannot be the same as the target CHAP secret. """ ,
+
dictionaryType = None
+
)
+
target_secret = data_model . property (
+
"targetSecret" , CHAPSecret ,
+
array = False , optional = True ,
+
documentation = """Specifies the CHAP secret to use for the target (mutual CHAP authentication). This secret must be 12-16 characters in length and should be impenetrable. The target CHAP secret must be unique and cannot be the same as the initiator CHAP secret. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
account_id ,
+
username = None ,
+
status = None ,
+
initiator_secret = None ,
+
target_secret = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DriveConfigInfo ( data_model . DataObject ):
+
"""DriveConfigInfo
+
+
:param canonical_name: [required]
+
:type canonical_name: str
+
+
:param connected: [required]
+
:type connected: bool
+
+
:param dev: [required]
+
:type dev: int
+
+
:param dev_path: [required]
+
:type dev_path: str
+
+
:param drive_type: [required]
+
:type drive_type: str
+
+
:param product: [required]
+
:type product: str
+
+
:param name: [required]
+
:type name: str
+
+
:param path: [required]
+
:type path: str
+
+
:param path_link: [required]
+
:type path_link: str
+
+
:param scsi_compat_id: [required]
+
:type scsi_compat_id: str
+
+
:param smart_ssd_write_capable:
+
:type smart_ssd_write_capable: bool
+
+
:param security_enabled: [required]
+
:type security_enabled: bool
+
+
:param security_frozen: [required]
+
:type security_frozen: bool
+
+
:param security_locked: [required]
+
:type security_locked: bool
+
+
:param security_supported: [required]
+
:type security_supported: bool
+
+
:param size: [required]
+
:type size: int
+
+
:param slot: [required]
+
:type slot: int
+
+
:param uuid: [required]
+
:type uuid: UUID
+
+
:param vendor: [required]
+
:type vendor: str
+
+
:param version: [required]
+
:type version: str
+
+
:param security_at_maximum: [required]
+
:type security_at_maximum: bool
+
+
:param serial: [required]
+
:type serial: str
+
+
:param scsi_state: [required]
+
:type scsi_state: str
+
+
"""
+
canonical_name = data_model . property (
+
"canonicalName" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
connected = data_model . property (
+
"connected" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
dev = data_model . property (
+
"dev" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
dev_path = data_model . property (
+
"devPath" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
drive_type = data_model . property (
+
"driveType" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
product = data_model . property (
+
"product" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
path = data_model . property (
+
"path" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
path_link = data_model . property (
+
"pathLink" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
scsi_compat_id = data_model . property (
+
"scsiCompatId" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
smart_ssd_write_capable = data_model . property (
+
"smartSsdWriteCapable" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
security_enabled = data_model . property (
+
"securityEnabled" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
security_frozen = data_model . property (
+
"securityFrozen" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
security_locked = data_model . property (
+
"securityLocked" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
security_supported = data_model . property (
+
"securitySupported" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
size = data_model . property (
+
"size" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
slot = data_model . property (
+
"slot" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
uuid = data_model . property (
+
"uuid" , UUID ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
vendor = data_model . property (
+
"vendor" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
version = data_model . property (
+
"version" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
security_at_maximum = data_model . property (
+
"securityAtMaximum" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
serial = data_model . property (
+
"serial" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
scsi_state = data_model . property (
+
"scsiState" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
canonical_name ,
+
connected ,
+
dev ,
+
dev_path ,
+
drive_type ,
+
product ,
+
name ,
+
path ,
+
path_link ,
+
scsi_compat_id ,
+
security_enabled ,
+
security_frozen ,
+
security_locked ,
+
security_supported ,
+
size ,
+
slot ,
+
uuid ,
+
vendor ,
+
version ,
+
security_at_maximum ,
+
serial ,
+
scsi_state ,
+
smart_ssd_write_capable = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DrivesConfigInfo ( data_model . DataObject ):
+
"""DrivesConfigInfo
+
+
:param drives: [required]
+
:type drives: DriveConfigInfo
+
+
:param num_block_actual: [required]
+
:type num_block_actual: int
+
+
:param num_block_expected: [required]
+
:type num_block_expected: int
+
+
:param num_slice_actual: [required]
+
:type num_slice_actual: int
+
+
:param num_slice_expected: [required]
+
:type num_slice_expected: int
+
+
:param num_total_actual: [required]
+
:type num_total_actual: int
+
+
:param num_total_expected: [required]
+
:type num_total_expected: int
+
+
"""
+
drives = data_model . property (
+
"drives" , DriveConfigInfo ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
num_block_actual = data_model . property (
+
"numBlockActual" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
num_block_expected = data_model . property (
+
"numBlockExpected" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
num_slice_actual = data_model . property (
+
"numSliceActual" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
num_slice_expected = data_model . property (
+
"numSliceExpected" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
num_total_actual = data_model . property (
+
"numTotalActual" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
num_total_expected = data_model . property (
+
"numTotalExpected" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
drives ,
+
num_block_actual ,
+
num_block_expected ,
+
num_slice_actual ,
+
num_slice_expected ,
+
num_total_actual ,
+
num_total_expected ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetDriveConfigResult ( data_model . DataObject ):
+
"""GetDriveConfigResult
+
+
:param drive_config: [required] Configuration information for the drives that are connected to the cluster
+
:type drive_config: DrivesConfigInfo
+
+
"""
+
drive_config = data_model . property (
+
"driveConfig" , DrivesConfigInfo ,
+
array = False , optional = False ,
+
documentation = """Configuration information for the drives that are connected to the cluster """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
drive_config ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CreateBackupTargetResult ( data_model . DataObject ):
+
"""CreateBackupTargetResult
+
+
:param backup_target_id: [required] Unique identifier assigned to the backup target.
+
:type backup_target_id: int
+
+
"""
+
backup_target_id = data_model . property (
+
"backupTargetID" , int ,
+
array = False , optional = False ,
+
documentation = """Unique identifier assigned to the backup target. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
backup_target_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class LunAssignment ( data_model . DataObject ):
+
"""LunAssignment
+
VolumeID and Lun assignment.
+
+
:param volume_id: [required] The volume ID assigned to the Lun.
+
:type volume_id: int
+
+
:param lun: [required] Correct LUN values are 0 - 16383. An exception will be seen if an incorrect LUN value is passed.
+
:type lun: int
+
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """The volume ID assigned to the Lun. """ ,
+
dictionaryType = None
+
)
+
lun = data_model . property (
+
"lun" , int ,
+
array = False , optional = False ,
+
documentation = """Correct LUN values are 0 - 16383. An exception will be seen if an incorrect LUN value is passed. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_id ,
+
lun ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyVolumeAccessGroupLunAssignmentsRequest ( data_model . DataObject ):
+
"""ModifyVolumeAccessGroupLunAssignmentsRequest
+
The ModifyVolumeAccessGroupLunAssignments
+
method enables you to define custom LUN assignments
+
for specific volumes. This method changes only LUN
+
values set on the lunAssignments parameter in the
+
volume access group. All other LUN assignments remain
+
unchanged. LUN assignment values must be unique for volumes in a volume access group. You cannot define duplicate LUN values within a volume access group. However, you can use the same LUN values again in different volume access groups.
+
Note: Correct LUN values are 0 through 16383. The system generates an exception if you pass a LUN value outside of this range. None of the specified LUN assignments are modified if there is an exception.
+
Caution: If you change a LUN assignment for a volume with active I/O, the I/O can be disrupted. You might need to change the server configuration before changing volume LUN assignments.
+
+
:param volume_access_group_id: [required] The ID of the volume access group for which the LUN assignments will be modified.
+
:type volume_access_group_id: int
+
+
:param lun_assignments: [required] The volume IDs with new assigned LUN values.
+
:type lun_assignments: LunAssignment
+
+
"""
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the volume access group for which the LUN assignments will be modified. """ ,
+
dictionaryType = None
+
)
+
lun_assignments = data_model . property (
+
"lunAssignments" , LunAssignment ,
+
array = True , optional = False ,
+
documentation = """The volume IDs with new assigned LUN values. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_access_group_id ,
+
lun_assignments ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class EventInfo ( data_model . DataObject ):
+
"""EventInfo
+
+
:param event_id: [required]
+
:type event_id: int
+
+
:param severity: [required]
+
:type severity: int
+
+
:param event_info_type: [required]
+
:type event_info_type: str
+
+
:param message: [required]
+
:type message: str
+
+
:param service_id: [required]
+
:type service_id: int
+
+
:param node_id: [required]
+
:type node_id: int
+
+
:param drive_id: [required]
+
:type drive_id: int
+
+
:param drive_ids: [required]
+
:type drive_ids: int
+
+
:param time_of_report: [required]
+
:type time_of_report: str
+
+
:param time_of_publish: [required]
+
:type time_of_publish: str
+
+
:param details:
+
:type details: str
+
+
"""
+
event_id = data_model . property (
+
"eventID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
severity = data_model . property (
+
"severity" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
event_info_type = data_model . property (
+
"eventInfoType" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
message = data_model . property (
+
"message" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
service_id = data_model . property (
+
"serviceID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
node_id = data_model . property (
+
"nodeID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
drive_id = data_model . property (
+
"driveID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
drive_ids = data_model . property (
+
"driveIDs" , int ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
time_of_report = data_model . property (
+
"timeOfReport" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
time_of_publish = data_model . property (
+
"timeOfPublish" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
details = data_model . property (
+
"details" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
event_id ,
+
severity ,
+
event_info_type ,
+
message ,
+
service_id ,
+
node_id ,
+
drive_id ,
+
drive_ids ,
+
time_of_report ,
+
time_of_publish ,
+
details = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListEventsResult ( data_model . DataObject ):
+
"""ListEventsResult
+
+
:param event_queue_type: [required]
+
:type event_queue_type: str
+
+
:param events: [required]
+
:type events: EventInfo
+
+
"""
+
event_queue_type = data_model . property (
+
"eventQueueType" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
events = data_model . property (
+
"events" , EventInfo ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
event_queue_type ,
+
events ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class StartBulkVolumeReadRequest ( data_model . DataObject ):
+
"""StartBulkVolumeReadRequest
+
StartBulkVolumeRead enables you to initialize a bulk volume read session on a specified volume. Only two bulk volume processes
+
can run simultaneously on a volume. When you initialize the session, data is read from a SolidFire storage volume for the purposes
+
of storing the data on an external backup source. The external data is accessed by a web server running on an SF-series node.
+
Communications and server interaction information for external data access is passed by a script running on the storage system.
+
At the start of a bulk volume read operation, a snapshot of the volume is made and the snapshot is deleted when the read is complete. You can also read a snapshot of the volume by entering the ID of the snapshot as a parameter. When you read a
+
previous snapshot, the system does not create a new snapshot of the volume or delete the previous snapshot when the
+
read completes.
+
Note: This process creates a new snapshot if the ID of an existing snapshot is not provided. Snapshots can be created if cluster fullness is at stage 2 or 3. Snapshots are not created when cluster fullness is at stage 4 or 5.
+
+
:param volume_id: [required] The ID of the volume to be read.
+
:type volume_id: int
+
+
:param format: [required] The format of the volume data. It can be either of the following formats: uncompressed: Every byte of the volume is returned without any compression. native: Opaque data is returned that is smaller and more efficiently stored and written on a subsequent bulk volume write.
+
:type format: str
+
+
:param snapshot_id: The ID of a previously created snapshot used for bulk volume reads. If no ID is entered, a snapshot of the current active volume image is made.
+
:type snapshot_id: int
+
+
:param script: The executable name of a script. If unspecified, the key and URL is necessary to access SF-series nodes. The script is run on the primary node and the key and URL is returned to the script so the local web server can be contacted.
+
:type script: str
+
+
:param script_parameters: JSON parameters to pass to the script.
+
:type script_parameters: dict
+
+
:param attributes: JSON attributes for the bulk volume job.
+
:type attributes: dict
+
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the volume to be read. """ ,
+
dictionaryType = None
+
)
+
format = data_model . property (
+
"format" , str ,
+
array = False , optional = False ,
+
documentation = """The format of the volume data. It can be either of the following formats: uncompressed: Every byte of the volume is returned without any compression. native: Opaque data is returned that is smaller and more efficiently stored and written on a subsequent bulk volume write. """ ,
+
dictionaryType = None
+
)
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
+
array = False , optional = True ,
+
documentation = """The ID of a previously created snapshot used for bulk volume reads. If no ID is entered, a snapshot of the current active volume image is made. """ ,
+
dictionaryType = None
+
)
+
script = data_model . property (
+
"script" , str ,
+
array = False , optional = True ,
+
documentation = """The executable name of a script. If unspecified, the key and URL is necessary to access SF-series nodes. The script is run on the primary node and the key and URL is returned to the script so the local web server can be contacted. """ ,
+
dictionaryType = None
+
)
+
script_parameters = data_model . property (
+
"scriptParameters" , dict ,
+
array = False , optional = True ,
+
documentation = """JSON parameters to pass to the script. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """JSON attributes for the bulk volume job. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_id ,
+
format ,
+
snapshot_id = None ,
+
script = None ,
+
script_parameters = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class RemoveVirtualNetworkRequest ( data_model . DataObject ):
+
"""RemoveVirtualNetworkRequest
+
RemoveVirtualNetwork enables you to remove a previously added virtual network.
+
Note: This method requires either the virtualNetworkID or the virtualNetworkTag as a parameter, but not both.
+
+
:param virtual_network_id: Network ID that identifies the virtual network to remove.
+
:type virtual_network_id: int
+
+
:param virtual_network_tag: Network tag that identifies the virtual network to remove.
+
:type virtual_network_tag: int
+
+
"""
+
virtual_network_id = data_model . property (
+
"virtualNetworkID" , int ,
+
array = False , optional = True ,
+
documentation = """Network ID that identifies the virtual network to remove. """ ,
+
dictionaryType = None
+
)
+
virtual_network_tag = data_model . property (
+
"virtualNetworkTag" , int ,
+
array = False , optional = True ,
+
documentation = """Network tag that identifies the virtual network to remove. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
virtual_network_id = None ,
+
virtual_network_tag = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListTestsResult ( data_model . DataObject ):
+
"""ListTestsResult
+
+
:param tests: [required] List of tests that can be performed on the node.
+
:type tests: str
+
+
"""
+
tests = data_model . property (
+
"tests" , str ,
+
array = False , optional = False ,
+
documentation = """List of tests that can be performed on the node. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
tests ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class RemoveAccountResult ( data_model . DataObject ):
+
"""RemoveAccountResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class TestDrivesRequest ( data_model . DataObject ):
+
"""TestDrivesRequest
+
You can use the TestDrives API method to run a hardware validation on all drives on the node. This method detects hardware
+
failures on the drives (if present) and reports them in the results of the validation tests.
+
You can only use the TestDrives method on nodes that are not "active" in a cluster.
+
Note: This test takes approximately 10 minutes.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
+
:param minutes: Specifies the number of minutes to run the test.
+
:type minutes: int
+
+
:param force: Required parameter to successfully test the drives on the node.
+
:type force: bool
+
+
"""
+
minutes = data_model . property (
+
"minutes" , int ,
+
array = False , optional = True ,
+
documentation = """Specifies the number of minutes to run the test. """ ,
+
dictionaryType = None
+
)
+
force = data_model . property (
+
"force" , bool ,
+
array = False , optional = True ,
+
documentation = """Required parameter to successfully test the drives on the node. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
minutes = None ,
+
force = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class AddressBlockParams ( data_model . DataObject ):
+
"""AddressBlockParams
+
Unique Range of IP addresses to include in the virtual network.
+
+
:param start: [required] Start of the IP address range.
+
:type start: str
+
+
:param size: [required] Number of IP addresses to include in the block.
+
:type size: int
+
+
:param available: Nuber of available blocks
+
:type available: str
+
+
"""
+
start = data_model . property (
+
"start" , str ,
+
array = False , optional = False ,
+
documentation = """Start of the IP address range. """ ,
+
dictionaryType = None
+
)
+
size = data_model . property (
+
"size" , int ,
+
array = False , optional = False ,
+
documentation = """Number of IP addresses to include in the block. """ ,
+
dictionaryType = None
+
)
+
available = data_model . property (
+
"available" , str ,
+
array = False , optional = True ,
+
documentation = """Nuber of available blocks """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
start ,
+
size ,
+
available = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyVirtualNetworkRequest ( data_model . DataObject ):
+
"""ModifyVirtualNetworkRequest
+
You can use ModifyVirtualNetwork to change the attributes of an existing virtual network. This method enables you to add or remove
+
address blocks, change the netmask, or modify the name or description of the virtual network. You can also use it to enable or
+
disable namespaces, as well as add or remove a gateway if namespaces are enabled on the virtual network.
+
Note: This method requires either the VirtualNetworkID or the VirtualNetworkTag as a parameter, but not both.
+
Caution: Enabling or disabling the Routable Storage VLANs functionality for an existing virtual network by changing the
+
"namespace" parameter disrupts any traffic handled by the virtual network. NetApp strongly recommends changing the
+
"namespace" parameter only during a scheduled maintenance window.
+
+
:param virtual_network_id: The unique identifier of the virtual network to modify. This is the virtual network ID assigned by the cluster. Note: This parameter is optional but either virtualNetworkID or virtualNetworkTag must be specified with this API method.
+
:type virtual_network_id: int
+
+
:param virtual_network_tag: The network tag that identifies the virtual network to modify. Note: This parameter is optional but either virtualNetworkID or virtualNetworkTag must be specified with this API method.
+
:type virtual_network_tag: int
+
+
:param name: The new name for the virtual network.
+
:type name: str
+
+
:param address_blocks: The new addressBlock to set for this virtual network. This might contain new address blocks to add to the existing object or omit unused address blocks that need to be removed. Alternatively, you can extend or reduce the size of existing address blocks. You can only increase the size of the starting addressBlocks for a virtual network object; you can never decrease it. Attributes for this parameter are: start: The start of the IP address range. (String) size: The number of IP addresses to include in the block. (Integer)
+
:type address_blocks: AddressBlockParams
+
+
:param netmask: New network mask for this virtual network.
+
:type netmask: str
+
+
:param svip: The storage virtual IP address for this virtual network. The svip for a virtual network cannot be changed. You must create a new virtual network to use a different svip address.
+
:type svip: str
+
+
:param gateway: The IP address of a gateway of the virtual network. This parameter is only valid if the "namespace" parameter is set to true.
+
:type gateway: str
+
+
:param namespace: When set to true, enables Routable Storage VLANs functionality by recreating the virtual network and configuring a namespace to contain it. When set to false, disables the VRF functionality for the virtual network. Changing this value disrupts traffic running through this virtual network.
+
:type namespace: bool
+
+
:param attributes: A new list of name-value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
virtual_network_id = data_model . property (
+
"virtualNetworkID" , int ,
+
array = False , optional = True ,
+
documentation = """The unique identifier of the virtual network to modify. This is the virtual network ID assigned by the cluster. Note: This parameter is optional but either virtualNetworkID or virtualNetworkTag must be specified with this API method. """ ,
+
dictionaryType = None
+
)
+
virtual_network_tag = data_model . property (
+
"virtualNetworkTag" , int ,
+
array = False , optional = True ,
+
documentation = """The network tag that identifies the virtual network to modify. Note: This parameter is optional but either virtualNetworkID or virtualNetworkTag must be specified with this API method. """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = True ,
+
documentation = """The new name for the virtual network. """ ,
+
dictionaryType = None
+
)
+
address_blocks = data_model . property (
+
"addressBlocks" , AddressBlockParams ,
+
array = True , optional = True ,
+
documentation = """The new addressBlock to set for this virtual network. This might contain new address blocks to add to the existing object or omit unused address blocks that need to be removed. Alternatively, you can extend or reduce the size of existing address blocks. You can only increase the size of the starting addressBlocks for a virtual network object; you can never decrease it. Attributes for this parameter are: start: The start of the IP address range. (String) size: The number of IP addresses to include in the block. (Integer) """ ,
+
dictionaryType = None
+
)
+
netmask = data_model . property (
+
"netmask" , str ,
+
array = False , optional = True ,
+
documentation = """New network mask for this virtual network. """ ,
+
dictionaryType = None
+
)
+
svip = data_model . property (
+
"svip" , str ,
+
array = False , optional = True ,
+
documentation = """The storage virtual IP address for this virtual network. The svip for a virtual network cannot be changed. You must create a new virtual network to use a different svip address. """ ,
+
dictionaryType = None
+
)
+
gateway = data_model . property (
+
"gateway" , str ,
+
array = False , optional = True ,
+
documentation = """The IP address of a gateway of the virtual network. This parameter is only valid if the "namespace" parameter is set to true. """ ,
+
dictionaryType = None
+
)
+
namespace = data_model . property (
+
"namespace" , bool ,
+
array = False , optional = True ,
+
documentation = """When set to true, enables Routable Storage VLANs functionality by recreating the virtual network and configuring a namespace to contain it. When set to false, disables the VRF functionality for the virtual network. Changing this value disrupts traffic running through this virtual network. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """A new list of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
virtual_network_id = None ,
+
virtual_network_tag = None ,
+
name = None ,
+
address_blocks = None ,
+
netmask = None ,
+
svip = None ,
+
gateway = None ,
+
namespace = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class VirtualVolumeStats ( data_model . DataObject ):
+
"""VirtualVolumeStats
+
Contains statistical data for an individual volume.
+
+
:param account_id: [required] AccountID of the volume owner.
+
:type account_id: int
+
+
:param actual_iops: Current actual IOPS to the volume in the last 500 milliseconds.
+
:type actual_iops: int
+
+
:param async_delay: The length of time since the volume was last synced with the remote cluster. If the volume is not paired, this is null. Note: A target volume in an active replication state always has an async delay of 0 (zero). Target volumes are system-aware during replication and assume async delay is accurate at all times.
+
:type async_delay: str
+
+
:param average_iopsize: Average size in bytes of recent I/O to the volume in the last 500 milliseconds.
+
:type average_iopsize: int
+
+
:param burst_iopscredit: The total number of IOP credits available to the user. When users are not using up to the max IOPS, credits are accrued.
+
:type burst_iopscredit: int
+
+
:param client_queue_depth: The number of outstanding read and write operations to the cluster.
+
:type client_queue_depth: int
+
+
:param desired_metadata_hosts: The volume services being migrated to if the volume metadata is getting migrated between volume services. A "null" value means the volume is not migrating.
+
:type desired_metadata_hosts: MetadataHosts
+
+
:param latency_usec: The observed latency time, in microseconds, to complete operations to a volume. A "0" (zero) value means there is no I/O to the volume.
+
:type latency_usec: int
+
+
:param metadata_hosts: The volume services on which the volume metadata resides.
+
:type metadata_hosts: MetadataHosts
+
+
:param non_zero_blocks: [required] The number of 4KiB blocks with data after the last garbage collection operation has completed.
+
:type non_zero_blocks: int
+
+
:param read_bytes: [required] Total bytes read by clients.
+
:type read_bytes: int
+
+
:param read_latency_usec: The average time, in microseconds, to complete read operations.
+
:type read_latency_usec: int
+
+
:param read_ops: [required] Total read operations.
+
:type read_ops: int
+
+
:param throttle: A floating value between 0 and 1 that represents how much the system is throttling clients below their max IOPS because of re-replication of data, transient errors and snapshots taken.
+
:type throttle: float
+
+
:param timestamp: [required] The current time in UTC.
+
:type timestamp: str
+
+
:param total_latency_usec: The average time, in microseconds, to complete read and write operations to a volume.
+
:type total_latency_usec: int
+
+
:param unaligned_reads: [required] For 512e volumes, the number of read operations that were not on a 4k sector boundary. High numbers of unaligned reads may indicate improper partition alignment.
+
:type unaligned_reads: int
+
+
:param unaligned_writes: [required] For 512e volumes, the number of write operations that were not on a 4k sector boundary. High numbers of unaligned writes may indicate improper partition alignment.
+
:type unaligned_writes: int
+
+
:param volume_access_groups: [required] List of volume access group(s) to which a volume beintegers.
+
:type volume_access_groups: int
+
+
:param volume_id: [required] Volume ID of the volume.
+
:type volume_id: int
+
+
:param volume_size: [required] Total provisioned capacity in bytes.
+
:type volume_size: int
+
+
:param volume_utilization: A floating value that describes how much the client is using the volume. Values: 0 = Client is not using the volume 1 = Client is using their max >1 = Client is using their burst
+
:type volume_utilization: float
+
+
:param write_bytes: [required] Total bytes written by clients.
+
:type write_bytes: int
+
+
:param write_latency_usec: The average time, in microseconds, to complete write operations.
+
:type write_latency_usec: int
+
+
:param write_ops: [required] Total write operations occurring on the volume.
+
:type write_ops: int
+
+
:param zero_blocks: [required] Total number of 4KiB blocks without data after the last round of garbage collection operation has completed.
+
:type zero_blocks: int
+
+
:param write_bytes_last_sample: The total number of bytes written to the volume during the last sample period.
+
:type write_bytes_last_sample: int
+
+
:param sample_period_msec: The length of the sample period in milliseconds.
+
:type sample_period_msec: int
+
+
:param read_bytes_last_sample: The total number of bytes read from the volume during the last sample period.
+
:type read_bytes_last_sample: int
+
+
:param read_ops_last_sample: The total number of read operations durin gth elast sample period.
+
:type read_ops_last_sample: int
+
+
:param write_ops_last_sample: The total number of write operations during the last sample period.
+
:type write_ops_last_sample: int
+
+
:param virtual_volume_id: If the volume of interest is associated with a virtual volume, this is the virtual volume ID.
+
:type virtual_volume_id: UUID
+
+
"""
+
account_id = data_model . property (
+
"accountID" , int ,
+
array = False , optional = False ,
+
documentation = """AccountID of the volume owner. """ ,
+
dictionaryType = None
+
)
+
actual_iops = data_model . property (
+
"actualIOPS" , int ,
+
array = False , optional = True ,
+
documentation = """Current actual IOPS to the volume in the last 500 milliseconds. """ ,
+
dictionaryType = None
+
)
+
async_delay = data_model . property (
+
"asyncDelay" , str ,
+
array = False , optional = True ,
+
documentation = """The length of time since the volume was last synced with the remote cluster. If the volume is not paired, this is null. Note: A target volume in an active replication state always has an async delay of 0 (zero). Target volumes are system-aware during replication and assume async delay is accurate at all times. """ ,
+
dictionaryType = None
+
)
+
average_iopsize = data_model . property (
+
"averageIOPSize" , int ,
+
array = False , optional = True ,
+
documentation = """Average size in bytes of recent I/O to the volume in the last 500 milliseconds. """ ,
+
dictionaryType = None
+
)
+
burst_iopscredit = data_model . property (
+
"burstIOPSCredit" , int ,
+
array = False , optional = True ,
+
documentation = """The total number of IOP credits available to the user. When users are not using up to the max IOPS, credits are accrued. """ ,
+
dictionaryType = None
+
)
+
client_queue_depth = data_model . property (
+
"clientQueueDepth" , int ,
+
array = False , optional = True ,
+
documentation = """The number of outstanding read and write operations to the cluster. """ ,
+
dictionaryType = None
+
)
+
desired_metadata_hosts = data_model . property (
+
"desiredMetadataHosts" , MetadataHosts ,
+
array = False , optional = True ,
+
documentation = """The volume services being migrated to if the volume metadata is getting migrated between volume services. A "null" value means the volume is not migrating. """ ,
+
dictionaryType = None
+
)
+
latency_usec = data_model . property (
+
"latencyUSec" , int ,
+
array = False , optional = True ,
+
documentation = """The observed latency time, in microseconds, to complete operations to a volume. A "0" (zero) value means there is no I/O to the volume. """ ,
+
dictionaryType = None
+
)
+
metadata_hosts = data_model . property (
+
"metadataHosts" , MetadataHosts ,
+
array = False , optional = True ,
+
documentation = """The volume services on which the volume metadata resides. """ ,
+
dictionaryType = None
+
)
+
non_zero_blocks = data_model . property (
+
"nonZeroBlocks" , int ,
+
array = False , optional = False ,
+
documentation = """The number of 4KiB blocks with data after the last garbage collection operation has completed. """ ,
+
dictionaryType = None
+
)
+
read_bytes = data_model . property (
+
"readBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Total bytes read by clients. """ ,
+
dictionaryType = None
+
)
+
read_latency_usec = data_model . property (
+
"readLatencyUSec" , int ,
+
array = False , optional = True ,
+
documentation = """The average time, in microseconds, to complete read operations. """ ,
+
dictionaryType = None
+
)
+
read_ops = data_model . property (
+
"readOps" , int ,
+
array = False , optional = False ,
+
documentation = """Total read operations. """ ,
+
dictionaryType = None
+
)
+
throttle = data_model . property (
+
"throttle" , float ,
+
array = False , optional = True ,
+
documentation = """A floating value between 0 and 1 that represents how much the system is throttling clients below their max IOPS because of re-replication of data, transient errors and snapshots taken. """ ,
+
dictionaryType = None
+
)
+
timestamp = data_model . property (
+
"timestamp" , str ,
+
array = False , optional = False ,
+
documentation = """The current time in UTC. """ ,
+
dictionaryType = None
+
)
+
total_latency_usec = data_model . property (
+
"totalLatencyUSec" , int ,
+
array = False , optional = True ,
+
documentation = """The average time, in microseconds, to complete read and write operations to a volume. """ ,
+
dictionaryType = None
+
)
+
unaligned_reads = data_model . property (
+
"unalignedReads" , int ,
+
array = False , optional = False ,
+
documentation = """For 512e volumes, the number of read operations that were not on a 4k sector boundary. High numbers of unaligned reads may indicate improper partition alignment. """ ,
+
dictionaryType = None
+
)
+
unaligned_writes = data_model . property (
+
"unalignedWrites" , int ,
+
array = False , optional = False ,
+
documentation = """For 512e volumes, the number of write operations that were not on a 4k sector boundary. High numbers of unaligned writes may indicate improper partition alignment. """ ,
+
dictionaryType = None
+
)
+
volume_access_groups = data_model . property (
+
"volumeAccessGroups" , int ,
+
array = True , optional = False ,
+
documentation = """List of volume access group(s) to which a volume beintegers. """ ,
+
dictionaryType = None
+
)
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """Volume ID of the volume. """ ,
+
dictionaryType = None
+
)
+
volume_size = data_model . property (
+
"volumeSize" , int ,
+
array = False , optional = False ,
+
documentation = """Total provisioned capacity in bytes. """ ,
+
dictionaryType = None
+
)
+
volume_utilization = data_model . property (
+
"volumeUtilization" , float ,
+
array = False , optional = True ,
+
documentation = """A floating value that describes how much the client is using the volume. Values: 0 = Client is not using the volume 1 = Client is using their max >1 = Client is using their burst """ ,
+
dictionaryType = None
+
)
+
write_bytes = data_model . property (
+
"writeBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Total bytes written by clients. """ ,
+
dictionaryType = None
+
)
+
write_latency_usec = data_model . property (
+
"writeLatencyUSec" , int ,
+
array = False , optional = True ,
+
documentation = """The average time, in microseconds, to complete write operations. """ ,
+
dictionaryType = None
+
)
+
write_ops = data_model . property (
+
"writeOps" , int ,
+
array = False , optional = False ,
+
documentation = """Total write operations occurring on the volume. """ ,
+
dictionaryType = None
+
)
+
zero_blocks = data_model . property (
+
"zeroBlocks" , int ,
+
array = False , optional = False ,
+
documentation = """Total number of 4KiB blocks without data after the last round of garbage collection operation has completed. """ ,
+
dictionaryType = None
+
)
+
write_bytes_last_sample = data_model . property (
+
"writeBytesLastSample" , int ,
+
array = False , optional = True ,
+
documentation = """The total number of bytes written to the volume during the last sample period. """ ,
+
dictionaryType = None
+
)
+
sample_period_msec = data_model . property (
+
"samplePeriodMSec" , int ,
+
array = False , optional = True ,
+
documentation = """The length of the sample period in milliseconds. """ ,
+
dictionaryType = None
+
)
+
read_bytes_last_sample = data_model . property (
+
"readBytesLastSample" , int ,
+
array = False , optional = True ,
+
documentation = """The total number of bytes read from the volume during the last sample period. """ ,
+
dictionaryType = None
+
)
+
read_ops_last_sample = data_model . property (
+
"readOpsLastSample" , int ,
+
array = False , optional = True ,
+
documentation = """The total number of read operations durin gth elast sample period. """ ,
+
dictionaryType = None
+
)
+
write_ops_last_sample = data_model . property (
+
"writeOpsLastSample" , int ,
+
array = False , optional = True ,
+
documentation = """The total number of write operations during the last sample period. """ ,
+
dictionaryType = None
+
)
+
virtual_volume_id = data_model . property (
+
"virtualVolumeID" , UUID ,
+
array = False , optional = True ,
+
documentation = """If the volume of interest is associated with a virtual volume, this is the virtual volume ID. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
account_id ,
+
non_zero_blocks ,
+
read_bytes ,
+
read_ops ,
+
timestamp ,
+
unaligned_reads ,
+
unaligned_writes ,
+
volume_access_groups ,
+
volume_id ,
+
volume_size ,
+
write_bytes ,
+
write_ops ,
+
zero_blocks ,
+
actual_iops = None ,
+
async_delay = None ,
+
average_iopsize = None ,
+
burst_iopscredit = None ,
+
client_queue_depth = None ,
+
desired_metadata_hosts = None ,
+
latency_usec = None ,
+
metadata_hosts = None ,
+
read_latency_usec = None ,
+
throttle = None ,
+
total_latency_usec = None ,
+
volume_utilization = None ,
+
write_latency_usec = None ,
+
write_bytes_last_sample = None ,
+
sample_period_msec = None ,
+
read_bytes_last_sample = None ,
+
read_ops_last_sample = None ,
+
write_ops_last_sample = None ,
+
virtual_volume_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVolumeStatsByVirtualVolumeResult ( data_model . DataObject ):
+
"""ListVolumeStatsByVirtualVolumeResult
+
+
:param volume_stats: [required]
+
:type volume_stats: VirtualVolumeStats
+
+
"""
+
volume_stats = data_model . property (
+
"volumeStats" , VirtualVolumeStats ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_stats ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVolumeStatsByVolumeAccessGroupResult ( data_model . DataObject ):
+
"""ListVolumeStatsByVolumeAccessGroupResult
+
+
:param volume_stats: [required] List of account activity information. Note: The volumeID member is 0 for each entry, as the values represent the summation of all volumes owned by the account.
+
:type volume_stats: VolumeStats
+
+
"""
+
volume_stats = data_model . property (
+
"volumeStats" , VolumeStats ,
+
array = True , optional = False ,
+
documentation = """List of account activity information. Note: The volumeID member is 0 for each entry, as the values represent the summation of all volumes owned by the account. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_stats ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetAccountResult ( data_model . DataObject ):
+
"""GetAccountResult
+
+
:param account: [required] Account details.
+
:type account: Account
+
+
"""
+
account = data_model . property (
+
"account" , Account ,
+
array = False , optional = False ,
+
documentation = """Account details. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
account ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetAccountByIDRequest ( data_model . DataObject ):
+
"""GetAccountByIDRequest
+
GetAccountByID enables you to return details about a specific account, given its accountID.
+
+
:param account_id: [required] Specifies the account for which details are gathered.
+
:type account_id: int
+
+
"""
+
account_id = data_model . property (
+
"accountID" , int ,
+
array = False , optional = False ,
+
documentation = """Specifies the account for which details are gathered. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
account_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class PurgeDeletedVolumeResult ( data_model . DataObject ):
+
"""PurgeDeletedVolumeResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DisableSnmpResult ( data_model . DataObject ):
+
"""DisableSnmpResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class RemoveClusterAdminResult ( data_model . DataObject ):
+
"""RemoveClusterAdminResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListEventsRequest ( data_model . DataObject ):
+
"""ListEventsRequest
+
ListEvents returns events detected on the cluster, sorted from oldest to newest.
+
+
:param max_events: Specifies the maximum number of events to return.
+
:type max_events: int
+
+
:param start_event_id: Identifies the beginning of a range of events to return.
+
:type start_event_id: int
+
+
:param end_event_id: Identifies the end of a range of events to return.
+
:type end_event_id: int
+
+
"""
+
max_events = data_model . property (
+
"maxEvents" , int ,
+
array = False , optional = True ,
+
documentation = """Specifies the maximum number of events to return. """ ,
+
dictionaryType = None
+
)
+
start_event_id = data_model . property (
+
"startEventID" , int ,
+
array = False , optional = True ,
+
documentation = """Identifies the beginning of a range of events to return. """ ,
+
dictionaryType = None
+
)
+
end_event_id = data_model . property (
+
"endEventID" , int ,
+
array = False , optional = True ,
+
documentation = """Identifies the end of a range of events to return. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
max_events = None ,
+
start_event_id = None ,
+
end_event_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class UpdateBulkVolumeStatusRequest ( data_model . DataObject ):
+
"""UpdateBulkVolumeStatusRequest
+
You can use UpdateBulkVolumeStatus in a script to update the status of a bulk volume job that you started with the
+
StartBulkVolumeRead or StartBulkVolumeWrite methods.
+
+
:param key: [required] The key assigned during initialization of a StartBulkVolumeRead or StartBulkVolumeWrite session.
+
:type key: str
+
+
:param status: [required] The status of the given bulk volume job. The system sets the status. Possible values are: running: Jobs that are still active. complete: Jobs that are done. failed: Jobs that failed.
+
:type status: str
+
+
:param percent_complete: The completed progress of the bulk volume job as a percentage value.
+
:type percent_complete: str
+
+
:param message: The message returned indicating the status of the bulk volume job after the job is complete.
+
:type message: str
+
+
:param attributes: JSON attributes; updates what is on the bulk volume job.
+
:type attributes: dict
+
+
"""
+
key = data_model . property (
+
"key" , str ,
+
array = False , optional = False ,
+
documentation = """The key assigned during initialization of a StartBulkVolumeRead or StartBulkVolumeWrite session. """ ,
+
dictionaryType = None
+
)
+
status = data_model . property (
+
"status" , str ,
+
array = False , optional = False ,
+
documentation = """The status of the given bulk volume job. The system sets the status. Possible values are: running: Jobs that are still active. complete: Jobs that are done. failed: Jobs that failed. """ ,
+
dictionaryType = None
+
)
+
percent_complete = data_model . property (
+
"percentComplete" , str ,
+
array = False , optional = True ,
+
documentation = """The completed progress of the bulk volume job as a percentage value. """ ,
+
dictionaryType = None
+
)
+
message = data_model . property (
+
"message" , str ,
+
array = False , optional = True ,
+
documentation = """The message returned indicating the status of the bulk volume job after the job is complete. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """JSON attributes; updates what is on the bulk volume job. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
key ,
+
status ,
+
percent_complete = None ,
+
message = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetIpmiConfigNodesResult ( data_model . DataObject ):
+
"""GetIpmiConfigNodesResult
+
+
:param node_id: [required]
+
:type node_id: int
+
+
:param result: [required]
+
:type result: dict
+
+
"""
+
node_id = data_model . property (
+
"nodeID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
result = data_model . property (
+
"result" , dict ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
node_id ,
+
result ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetIpmiConfigResult ( data_model . DataObject ):
+
"""GetIpmiConfigResult
+
+
:param nodes: [required]
+
:type nodes: GetIpmiConfigNodesResult
+
+
"""
+
nodes = data_model . property (
+
"nodes" , GetIpmiConfigNodesResult ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
nodes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class PhysicalAdapter ( data_model . DataObject ):
+
"""PhysicalAdapter
+
+
:param address:
+
:type address: str
+
+
:param mac_address:
+
:type mac_address: str
+
+
:param mac_address_permanent:
+
:type mac_address_permanent: str
+
+
:param mtu:
+
:type mtu: str
+
+
:param netmask:
+
:type netmask: str
+
+
:param network:
+
:type network: str
+
+
:param up_and_running:
+
:type up_and_running: bool
+
+
"""
+
address = data_model . property (
+
"address" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
mac_address = data_model . property (
+
"macAddress" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
mac_address_permanent = data_model . property (
+
"macAddressPermanent" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
mtu = data_model . property (
+
"mtu" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
netmask = data_model . property (
+
"netmask" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
network = data_model . property (
+
"network" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
up_and_running = data_model . property (
+
"upAndRunning" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
address = None ,
+
mac_address = None ,
+
mac_address_permanent = None ,
+
mtu = None ,
+
netmask = None ,
+
network = None ,
+
up_and_running = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class NetworkConfig ( data_model . DataObject ):
+
"""NetworkConfig
+
+
:param _default:
+
:type _default: bool
+
+
:param bond_master:
+
:type bond_master: str
+
+
:param virtual_network_tag:
+
:type virtual_network_tag: str
+
+
:param address:
+
:type address: str
+
+
:param auto:
+
:type auto: bool
+
+
:param bond_downdelay:
+
:type bond_downdelay: str
+
+
:param bond_fail_over_mac:
+
:type bond_fail_over_mac: str
+
+
:param bond_primary_reselect:
+
:type bond_primary_reselect: str
+
+
:param bond_lacp_rate:
+
:type bond_lacp_rate: str
+
+
:param bond_miimon:
+
:type bond_miimon: str
+
+
:param bond_mode:
+
:type bond_mode: str
+
+
:param bond_slaves:
+
:type bond_slaves: str
+
+
:param bond_updelay:
+
:type bond_updelay: str
+
+
:param dns_nameservers:
+
:type dns_nameservers: str
+
+
:param dns_search:
+
:type dns_search: str
+
+
:param family:
+
:type family: str
+
+
:param gateway:
+
:type gateway: str
+
+
:param mac_address:
+
:type mac_address: str
+
+
:param mac_address_permanent:
+
:type mac_address_permanent: str
+
+
:param method:
+
:type method: str
+
+
:param mtu:
+
:type mtu: str
+
+
:param netmask:
+
:type netmask: str
+
+
:param network:
+
:type network: str
+
+
:param physical:
+
:type physical: PhysicalAdapter
+
+
:param routes:
+
:type routes: dict
+
+
:param status:
+
:type status: str
+
+
:param symmetric_route_rules:
+
:type symmetric_route_rules: str
+
+
:param up_and_running:
+
:type up_and_running: bool
+
+
:param bond_xmit_hash_policy:
+
:type bond_xmit_hash_policy: str
+
+
:param bond_ad_num_ports:
+
:type bond_ad_num_ports: str
+
+
"""
+
_default = data_model . property (
+
"#default" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_master = data_model . property (
+
"bond-master" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
virtual_network_tag = data_model . property (
+
"virtualNetworkTag" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
address = data_model . property (
+
"address" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
auto = data_model . property (
+
"auto" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_downdelay = data_model . property (
+
"bond-downdelay" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_fail_over_mac = data_model . property (
+
"bond-fail_over_mac" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_primary_reselect = data_model . property (
+
"bond-primary_reselect" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_lacp_rate = data_model . property (
+
"bond-lacp_rate" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_miimon = data_model . property (
+
"bond-miimon" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_mode = data_model . property (
+
"bond-mode" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_slaves = data_model . property (
+
"bond-slaves" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_updelay = data_model . property (
+
"bond-updelay" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
dns_nameservers = data_model . property (
+
"dns-nameservers" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
dns_search = data_model . property (
+
"dns-search" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
family = data_model . property (
+
"family" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
gateway = data_model . property (
+
"gateway" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
mac_address = data_model . property (
+
"macAddress" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
mac_address_permanent = data_model . property (
+
"macAddressPermanent" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
method = data_model . property (
+
"method" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
mtu = data_model . property (
+
"mtu" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
netmask = data_model . property (
+
"netmask" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
network = data_model . property (
+
"network" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
physical = data_model . property (
+
"physical" , PhysicalAdapter ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
routes = data_model . property (
+
"routes" , dict ,
+
array = True , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
status = data_model . property (
+
"status" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
symmetric_route_rules = data_model . property (
+
"symmetricRouteRules" , str ,
+
array = True , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
up_and_running = data_model . property (
+
"upAndRunning" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_xmit_hash_policy = data_model . property (
+
"bond-xmit_hash_policy" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_ad_num_ports = data_model . property (
+
"bond-ad_num_ports" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
_default = None ,
+
bond_master = None ,
+
virtual_network_tag = None ,
+
address = None ,
+
auto = None ,
+
bond_downdelay = None ,
+
bond_fail_over_mac = None ,
+
bond_primary_reselect = None ,
+
bond_lacp_rate = None ,
+
bond_miimon = None ,
+
bond_mode = None ,
+
bond_slaves = None ,
+
bond_updelay = None ,
+
dns_nameservers = None ,
+
dns_search = None ,
+
family = None ,
+
gateway = None ,
+
mac_address = None ,
+
mac_address_permanent = None ,
+
method = None ,
+
mtu = None ,
+
netmask = None ,
+
network = None ,
+
physical = None ,
+
routes = None ,
+
status = None ,
+
symmetric_route_rules = None ,
+
up_and_running = None ,
+
bond_xmit_hash_policy = None ,
+
bond_ad_num_ports = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class Network ( data_model . DataObject ):
+
"""Network
+
+
:param bond10_g:
+
:type bond10_g: NetworkConfig
+
+
:param bond1_g:
+
:type bond1_g: NetworkConfig
+
+
:param eth0:
+
:type eth0: NetworkConfig
+
+
:param eth1:
+
:type eth1: NetworkConfig
+
+
:param eth2:
+
:type eth2: NetworkConfig
+
+
:param eth3:
+
:type eth3: NetworkConfig
+
+
:param lo:
+
:type lo: NetworkConfig
+
+
"""
+
bond10_g = data_model . property (
+
"Bond10G" , NetworkConfig ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond1_g = data_model . property (
+
"Bond1G" , NetworkConfig ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
eth0 = data_model . property (
+
"eth0" , NetworkConfig ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
eth1 = data_model . property (
+
"eth1" , NetworkConfig ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
eth2 = data_model . property (
+
"eth2" , NetworkConfig ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
eth3 = data_model . property (
+
"eth3" , NetworkConfig ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
lo = data_model . property (
+
"lo" , NetworkConfig ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
bond10_g = None ,
+
bond1_g = None ,
+
eth0 = None ,
+
eth1 = None ,
+
eth2 = None ,
+
eth3 = None ,
+
lo = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class Config ( data_model . DataObject ):
+
"""Config
+
+
:param cluster: [required]
+
:type cluster: ClusterConfig
+
+
:param network: [required]
+
:type network: Network
+
+
"""
+
cluster = data_model . property (
+
"cluster" , ClusterConfig ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
network = data_model . property (
+
"network" , Network ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
cluster ,
+
network ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SetConfigResult ( data_model . DataObject ):
+
"""SetConfigResult
+
+
:param config: [required] The new and current configuration for the node.
+
:type config: Config
+
+
"""
+
config = data_model . property (
+
"config" , Config ,
+
array = False , optional = False ,
+
documentation = """The new and current configuration for the node. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
config ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CancelCloneRequest ( data_model . DataObject ):
+
"""CancelCloneRequest
+
CancelClone enables you to stop an ongoing CloneVolume or CopyVolume process. When you cancel a group clone operation, the
+
system completes and removes the operation's associated asyncHandle.
+
+
:param clone_id: [required] The cloneID for the ongoing clone process.
+
:type clone_id: int
+
+
"""
+
clone_id = data_model . property (
+
"cloneID" , int ,
+
array = False , optional = False ,
+
documentation = """The cloneID for the ongoing clone process. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
clone_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SnmpNetwork ( data_model . DataObject ):
+
"""SnmpNetwork
+
The SNMP network object contains information about SNMP configuration for the cluster nodes. SNMP v3 is supported on SolidFire clusters.
+
+
:param access: [required] ro: read-only access.* rw: for read-write access. rosys: for read-only access to a restricted set of system information *SolidFire recommends that all networks other than the default "localhost" be set to "ro" access, because all SolidFire MIB objects are read-only.
+
:type access: str
+
+
:param cidr: [required] A CIDR network mask. This network mask must be an integer greater than or equal to 0, and less than or equal to 32. It must also not be equal to 31.
+
:type cidr: int
+
+
:param community: [required] SNMP community string.
+
:type community: str
+
+
:param network: [required] This parameter ainteger with the cidr variable is used to control which network the access and community string apply to. The special value of "default" is used to specify an entry that applies to all networks. The cidr mask is ignored when network value is either a host name or default.
+
:type network: str
+
+
"""
+
access = data_model . property (
+
"access" , str ,
+
array = False , optional = False ,
+
documentation = """ro: read-only access.* rw: for read-write access. rosys: for read-only access to a restricted set of system information *SolidFire recommends that all networks other than the default "localhost" be set to "ro" access, because all SolidFire MIB objects are read-only. """ ,
+
dictionaryType = None
+
)
+
cidr = data_model . property (
+
"cidr" , int ,
+
array = False , optional = False ,
+
documentation = """A CIDR network mask. This network mask must be an integer greater than or equal to 0, and less than or equal to 32. It must also not be equal to 31. """ ,
+
dictionaryType = None
+
)
+
community = data_model . property (
+
"community" , str ,
+
array = False , optional = False ,
+
documentation = """SNMP community string. """ ,
+
dictionaryType = None
+
)
+
network = data_model . property (
+
"network" , str ,
+
array = False , optional = False ,
+
documentation = """This parameter ainteger with the cidr variable is used to control which network the access and community string apply to. The special value of "default" is used to specify an entry that applies to all networks. The cidr mask is ignored when network value is either a host name or default. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
access ,
+
cidr ,
+
community ,
+
network ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SnmpV3UsmUser ( data_model . DataObject ):
+
"""SnmpV3UsmUser
+
The SNMP v3 usmUser object is used with the API method SetSnmpInfo to configure SNMP on the cluster.
+
+
:param access: [required] rouser: read-only access.* rwuser: for read-write access. rosys: for read-only access to a restricted set of system information *SolidFire recommends that all USM users be set to "rouser" access, because all SolidFire MIB objects are read-only.
+
:type access: str
+
+
:param name: [required] The name of the user. Must contain at least one character, but no more than 32 characters. Blank spaces are not allowed.
+
:type name: str
+
+
:param password: [required] The password of the user. Must be between 8 and 255 characters integer (inclusive). Blank spaces are not allowed. Required if "secLevel" is "auth" or "priv."
+
:type password: str
+
+
:param passphrase: [required] The passphrase of the user. Must be between 8 and 255 characters integer (inclusive). Blank spaces are not allowed. Required if "secLevel" is "priv."
+
:type passphrase: str
+
+
:param sec_level: [required] noauth: No password or passphrase is required. auth: A password is required for user access. priv: A password and passphrase is required for user access.
+
:type sec_level: str
+
+
"""
+
access = data_model . property (
+
"access" , str ,
+
array = False , optional = False ,
+
documentation = """rouser: read-only access.* rwuser: for read-write access. rosys: for read-only access to a restricted set of system information *SolidFire recommends that all USM users be set to "rouser" access, because all SolidFire MIB objects are read-only. """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """The name of the user. Must contain at least one character, but no more than 32 characters. Blank spaces are not allowed. """ ,
+
dictionaryType = None
+
)
+
password = data_model . property (
+
"password" , str ,
+
array = False , optional = False ,
+
documentation = """The password of the user. Must be between 8 and 255 characters integer (inclusive). Blank spaces are not allowed. Required if "secLevel" is "auth" or "priv." """ ,
+
dictionaryType = None
+
)
+
passphrase = data_model . property (
+
"passphrase" , str ,
+
array = False , optional = False ,
+
documentation = """The passphrase of the user. Must be between 8 and 255 characters integer (inclusive). Blank spaces are not allowed. Required if "secLevel" is "priv." """ ,
+
dictionaryType = None
+
)
+
sec_level = data_model . property (
+
"secLevel" , str ,
+
array = False , optional = False ,
+
documentation = """noauth: No password or passphrase is required. auth: A password is required for user access. priv: A password and passphrase is required for user access. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
access ,
+
name ,
+
password ,
+
passphrase ,
+
sec_level ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SetSnmpACLRequest ( data_model . DataObject ):
+
"""SetSnmpACLRequest
+
SetSnmpACL enables you to configure SNMP access permissions on the cluster nodes. The values you set with this interface apply to all
+
nodes in the cluster, and the values that are passed replace, in whole, all values set in any previous call to SetSnmpACL. Also note
+
that the values set with this interface replace all network or usmUsers values set with the older SetSnmpInfo.
+
+
:param networks: [required] List of networks and what type of access they have to the SNMP servers running on the cluster nodes. See SNMP Network Object for possible "networks" values. This parameter is required if SNMP v3 is disabled.
+
:type networks: SnmpNetwork
+
+
:param usm_users: [required] List of users and the type of access they have to the SNMP servers running on the cluster nodes.
+
:type usm_users: SnmpV3UsmUser
+
+
"""
+
networks = data_model . property (
+
"networks" , SnmpNetwork ,
+
array = True , optional = False ,
+
documentation = """List of networks and what type of access they have to the SNMP servers running on the cluster nodes. See SNMP Network Object for possible "networks" values. This parameter is required if SNMP v3 is disabled. """ ,
+
dictionaryType = None
+
)
+
usm_users = data_model . property (
+
"usmUsers" , SnmpV3UsmUser ,
+
array = True , optional = False ,
+
documentation = """List of users and the type of access they have to the SNMP servers running on the cluster nodes. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
networks ,
+
usm_users ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class TestDrivesResult ( data_model . DataObject ):
+
"""TestDrivesResult
+
+
:param details: [required]
+
:type details: str
+
+
:param duration: [required]
+
:type duration: str
+
+
:param result: [required]
+
:type result: str
+
+
"""
+
details = data_model . property (
+
"details" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
duration = data_model . property (
+
"duration" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
result = data_model . property (
+
"result" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
details ,
+
duration ,
+
result ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetVirtualVolumeCountResult ( data_model . DataObject ):
+
"""GetVirtualVolumeCountResult
+
+
:param count: [required] The number of virtual volumes currently in the system.
+
:type count: int
+
+
"""
+
count = data_model . property (
+
"count" , int ,
+
array = False , optional = False ,
+
documentation = """The number of virtual volumes currently in the system. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
count ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GroupCloneVolumeMember ( data_model . DataObject ):
+
"""GroupCloneVolumeMember
+
Represents the relationship between the source Volume and cloned Volume IDs.
+
+
:param volume_id: [required] The VolumeID of the cloned volume.
+
:type volume_id: int
+
+
:param src_volume_id: [required] The VolumeID of the source volume.
+
:type src_volume_id: int
+
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """The VolumeID of the cloned volume. """ ,
+
dictionaryType = None
+
)
+
src_volume_id = data_model . property (
+
"srcVolumeID" , int ,
+
array = False , optional = False ,
+
documentation = """The VolumeID of the source volume. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_id ,
+
src_volume_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CloneMultipleVolumesResult ( data_model . DataObject ):
+
"""CloneMultipleVolumesResult
+
+
:param async_handle: [required] A value returned from an asynchronous method call.
+
:type async_handle: int
+
+
:param group_clone_id: [required] Unique ID of the new group clone.
+
:type group_clone_id: int
+
+
:param members: [required] List of volumeIDs for the source and destination volume pairs.
+
:type members: GroupCloneVolumeMember
+
+
"""
+
async_handle = data_model . property (
+
"asyncHandle" , int ,
+
array = False , optional = False ,
+
documentation = """A value returned from an asynchronous method call. """ ,
+
dictionaryType = None
+
)
+
group_clone_id = data_model . property (
+
"groupCloneID" , int ,
+
array = False , optional = False ,
+
documentation = """Unique ID of the new group clone. """ ,
+
dictionaryType = None
+
)
+
members = data_model . property (
+
"members" , GroupCloneVolumeMember ,
+
array = True , optional = False ,
+
documentation = """List of volumeIDs for the source and destination volume pairs. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
async_handle ,
+
group_clone_id ,
+
members ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class VolumeQOS ( data_model . DataObject ):
+
"""VolumeQOS
+
Quality of Service (QoS) Result values are used on SolidFire volumes to provision performance expectations.
+
+
:param min_iops: [required] Desired minimum 4KB IOPS to guarantee. The allowed IOPS will only drop below this level if all volumes have been capped at their min IOPS value and there is still insufficient performance capacity.
+
:type min_iops: int
+
+
:param max_iops: [required] Desired maximum 4KB IOPS allowed over an extended period of time.
+
:type max_iops: int
+
+
:param burst_iops: [required] Maximum "peak" 4KB IOPS allowed for short periods of time. Allows for bursts of I/O activity over the normal max IOPS value.
+
:type burst_iops: int
+
+
:param burst_time: [required] The length of time burst IOPS is allowed. The value returned is represented in time units of seconds. Note: this value is calculated by the system based on IOPS set for QoS.
+
:type burst_time: int
+
+
:param curve: [required] The curve is a set of key-value pairs. The keys are I/O sizes in bytes. The values represent the cost performing an IOP at a specific I/O size. The curve is calculated relative to a 4096 byte operation set at 100 IOPS.
+
:type curve: dict
+
+
"""
+
min_iops = data_model . property (
+
"minIOPS" , int ,
+
array = False , optional = False ,
+
documentation = """Desired minimum 4KB IOPS to guarantee. The allowed IOPS will only drop below this level if all volumes have been capped at their min IOPS value and there is still insufficient performance capacity. """ ,
+
dictionaryType = None
+
)
+
max_iops = data_model . property (
+
"maxIOPS" , int ,
+
array = False , optional = False ,
+
documentation = """Desired maximum 4KB IOPS allowed over an extended period of time. """ ,
+
dictionaryType = None
+
)
+
burst_iops = data_model . property (
+
"burstIOPS" , int ,
+
array = False , optional = False ,
+
documentation = """Maximum "peak" 4KB IOPS allowed for short periods of time. Allows for bursts of I/O activity over the normal max IOPS value. """ ,
+
dictionaryType = None
+
)
+
burst_time = data_model . property (
+
"burstTime" , int ,
+
array = False , optional = False ,
+
documentation = """The length of time burst IOPS is allowed. The value returned is represented in time units of seconds. Note: this value is calculated by the system based on IOPS set for QoS. """ ,
+
dictionaryType = None
+
)
+
curve = data_model . property (
+
"curve" , dict ,
+
array = False , optional = False ,
+
documentation = """The curve is a set of key-value pairs. The keys are I/O sizes in bytes. The values represent the cost performing an IOP at a specific I/O size. The curve is calculated relative to a 4096 byte operation set at 100 IOPS. """ ,
+
dictionaryType = int
+
)
+
+
def __init__ ( self ,
+
min_iops ,
+
max_iops ,
+
burst_iops ,
+
burst_time ,
+
curve ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SnapshotReplication ( data_model . DataObject ):
+
"""SnapshotReplication
+
+
:param state: [required] The state of the snapshot replication.
+
:type state: str
+
+
:param state_details: [required] Reserved for future use.
+
:type state_details: str
+
+
"""
+
state = data_model . property (
+
"state" , str ,
+
array = False , optional = False ,
+
documentation = """The state of the snapshot replication. """ ,
+
dictionaryType = None
+
)
+
state_details = data_model . property (
+
"stateDetails" , str ,
+
array = False , optional = False ,
+
documentation = """Reserved for future use. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
state ,
+
state_details ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class RemoteReplication ( data_model . DataObject ):
+
"""RemoteReplication
+
Details on the volume replication.
+
+
:param mode: [required] Volume replication mode. Possible values: Async: Writes are acknowledged when they complete locally. The cluster does not wait for writes to be replicated to the target cluster. Sync: Source acknowledges write when the data is stored locally and on the remote cluster. SnapshotsOnly: Only snapshots created on the source cluster will be replicated. Active writes from the source volume will not be replicated.
+
:type mode: str
+
+
:param pause_limit: [required] The number of occurring write ops before auto-pausing, on a per volume pair level.
+
:type pause_limit: int
+
+
:param remote_service_id: [required] The remote slice service ID.
+
:type remote_service_id: int
+
+
:param resume_details: [required] Reserved for future use.
+
:type resume_details: str
+
+
:param snapshot_replication: [required] The details of snapshot replication.
+
:type snapshot_replication: SnapshotReplication
+
+
:param state: [required] The state of the volume replication.
+
:type state: str
+
+
:param state_details: [required] Reserved for future use.
+
:type state_details: str
+
+
"""
+
mode = data_model . property (
+
"mode" , str ,
+
array = False , optional = False ,
+
documentation = """Volume replication mode. Possible values: Async: Writes are acknowledged when they complete locally. The cluster does not wait for writes to be replicated to the target cluster. Sync: Source acknowledges write when the data is stored locally and on the remote cluster. SnapshotsOnly: Only snapshots created on the source cluster will be replicated. Active writes from the source volume will not be replicated. """ ,
+
dictionaryType = None
+
)
+
pause_limit = data_model . property (
+
"pauseLimit" , int ,
+
array = False , optional = False ,
+
documentation = """The number of occurring write ops before auto-pausing, on a per volume pair level. """ ,
+
dictionaryType = None
+
)
+
remote_service_id = data_model . property (
+
"remoteServiceID" , int ,
+
array = False , optional = False ,
+
documentation = """The remote slice service ID. """ ,
+
dictionaryType = None
+
)
+
resume_details = data_model . property (
+
"resumeDetails" , str ,
+
array = False , optional = False ,
+
documentation = """Reserved for future use. """ ,
+
dictionaryType = None
+
)
+
snapshot_replication = data_model . property (
+
"snapshotReplication" , SnapshotReplication ,
+
array = False , optional = False ,
+
documentation = """The details of snapshot replication. """ ,
+
dictionaryType = None
+
)
+
state = data_model . property (
+
"state" , str ,
+
array = False , optional = False ,
+
documentation = """The state of the volume replication. """ ,
+
dictionaryType = None
+
)
+
state_details = data_model . property (
+
"stateDetails" , str ,
+
array = False , optional = False ,
+
documentation = """Reserved for future use. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
mode ,
+
pause_limit ,
+
remote_service_id ,
+
resume_details ,
+
snapshot_replication ,
+
state ,
+
state_details ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class VolumePair ( data_model . DataObject ):
+
"""VolumePair
+
The Volume Pair Info is an object containing information about a volume that is paired on a remote cluster.
+
If the volume is not paired, this object is null.
+
+
:param cluster_pair_id: [required] The remote cluster a volume is paired with.
+
:type cluster_pair_id: int
+
+
:param remote_volume_id: [required] The VolumeID on the remote cluster a volume is paired with.
+
:type remote_volume_id: int
+
+
:param remote_slice_id: [required] The SliceID on the remote cluster a volume is paired with.
+
:type remote_slice_id: int
+
+
:param remote_volume_name: [required] The last-observed name of the volume on the remote cluster a volume is paired with.
+
:type remote_volume_name: str
+
+
:param volume_pair_uuid: [required] A UUID in canonical form.
+
:type volume_pair_uuid: UUID
+
+
:param remote_replication: [required] Details about the replication configuration for this volume pair.
+
:type remote_replication: RemoteReplication
+
+
"""
+
cluster_pair_id = data_model . property (
+
"clusterPairID" , int ,
+
array = False , optional = False ,
+
documentation = """The remote cluster a volume is paired with. """ ,
+
dictionaryType = None
+
)
+
remote_volume_id = data_model . property (
+
"remoteVolumeID" , int ,
+
array = False , optional = False ,
+
documentation = """The VolumeID on the remote cluster a volume is paired with. """ ,
+
dictionaryType = None
+
)
+
remote_slice_id = data_model . property (
+
"remoteSliceID" , int ,
+
array = False , optional = False ,
+
documentation = """The SliceID on the remote cluster a volume is paired with. """ ,
+
dictionaryType = None
+
)
+
remote_volume_name = data_model . property (
+
"remoteVolumeName" , str ,
+
array = False , optional = False ,
+
documentation = """The last-observed name of the volume on the remote cluster a volume is paired with. """ ,
+
dictionaryType = None
+
)
+
volume_pair_uuid = data_model . property (
+
"volumePairUUID" , UUID ,
+
array = False , optional = False ,
+
documentation = """A UUID in canonical form. """ ,
+
dictionaryType = None
+
)
+
remote_replication = data_model . property (
+
"remoteReplication" , RemoteReplication ,
+
array = False , optional = False ,
+
documentation = """Details about the replication configuration for this volume pair. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
cluster_pair_id ,
+
remote_volume_id ,
+
remote_slice_id ,
+
remote_volume_name ,
+
volume_pair_uuid ,
+
remote_replication ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class Volume ( data_model . DataObject ):
+
"""Volume
+
Volumes Info is an object containing information about a volume.
+
The return objects only include "configured" information about the volume and not runtime or usage information.
+
Information about paired volumes will also be returned.
+
+
:param volume_id: [required] Unique VolumeID for the volume.
+
:type volume_id: int
+
+
:param name: [required] Name of the volume as provided at creation time.
+
:type name: str
+
+
:param account_id: [required] Unique AccountID for the account.
+
:type account_id: int
+
+
:param create_time: [required] UTC formatted time the volume was created.
+
:type create_time: str
+
+
:param status: [required] Current status of the volume init: A volume that is being initialized and is not ready for connections. active: An active volume ready for connections.
+
:type status: str
+
+
:param access: [required] Access allowed for the volume readOnly: Only read operations are allowed. readWrite: Reads and writes are allowed. locked: No reads or writes are allowed. replicationTarget: Designated as a target volume in a replicated volume pair.
+
:type access: str
+
+
:param enable512e: [required] If "true", the volume provides 512 byte sector emulation.
+
:type enable512e: bool
+
+
:param iqn: Volume iSCSI Qualified Name.
+
:type iqn: str
+
+
:param scsi_euidevice_id: [required] Globally unique SCSI device identifier for the volume in EUI-64 based 16-byte format.
+
:type scsi_euidevice_id: str
+
+
:param scsi_naadevice_id: [required] Globally unique SCSI device identifier for the volume in NAA IEEE Registered Extended format.
+
:type scsi_naadevice_id: str
+
+
:param qos: [required] Quality of service settings for this volume.
+
:type qos: VolumeQOS
+
+
:param volume_access_groups: [required] List of volume access groups to which a volume beintegers.
+
:type volume_access_groups: int
+
+
:param volume_pairs: [required] Information about a paired volume. Available only if a volume is paired. @see VolumePairs for return values.
+
:type volume_pairs: VolumePair
+
+
:param delete_time: The time this volume was deleted. If this has no value, the volume has not yet been deleted.
+
:type delete_time: str
+
+
:param purge_time: The time this volume will be purged from the system. If this has no value, the volume has not yet been deleted (and is not scheduled for purging).
+
:type purge_time: str
+
+
:param slice_count: [required] The number of slices backing this volume. In the current software, this value will always be 1.
+
:type slice_count: int
+
+
:param total_size: [required] Total size of this volume in bytes.
+
:type total_size: int
+
+
:param block_size: [required] Size of the blocks on the volume.
+
:type block_size: int
+
+
:param virtual_volume_id: Virtual volume ID this volume backs.
+
:type virtual_volume_id: UUID
+
+
:param attributes: [required] List of Name/Value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """Unique VolumeID for the volume. """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """Name of the volume as provided at creation time. """ ,
+
dictionaryType = None
+
)
+
account_id = data_model . property (
+
"accountID" , int ,
+
array = False , optional = False ,
+
documentation = """Unique AccountID for the account. """ ,
+
dictionaryType = None
+
)
+
create_time = data_model . property (
+
"createTime" , str ,
+
array = False , optional = False ,
+
documentation = """UTC formatted time the volume was created. """ ,
+
dictionaryType = None
+
)
+
status = data_model . property (
+
"status" , str ,
+
array = False , optional = False ,
+
documentation = """Current status of the volume init: A volume that is being initialized and is not ready for connections. active: An active volume ready for connections. """ ,
+
dictionaryType = None
+
)
+
access = data_model . property (
+
"access" , str ,
+
array = False , optional = False ,
+
documentation = """Access allowed for the volume readOnly: Only read operations are allowed. readWrite: Reads and writes are allowed. locked: No reads or writes are allowed. replicationTarget: Designated as a target volume in a replicated volume pair. """ ,
+
dictionaryType = None
+
)
+
enable512e = data_model . property (
+
"enable512e" , bool ,
+
array = False , optional = False ,
+
documentation = """If "true", the volume provides 512 byte sector emulation. """ ,
+
dictionaryType = None
+
)
+
iqn = data_model . property (
+
"iqn" , str ,
+
array = False , optional = True ,
+
documentation = """Volume iSCSI Qualified Name. """ ,
+
dictionaryType = None
+
)
+
scsi_euidevice_id = data_model . property (
+
"scsiEUIDeviceID" , str ,
+
array = False , optional = False ,
+
documentation = """Globally unique SCSI device identifier for the volume in EUI-64 based 16-byte format. """ ,
+
dictionaryType = None
+
)
+
scsi_naadevice_id = data_model . property (
+
"scsiNAADeviceID" , str ,
+
array = False , optional = False ,
+
documentation = """Globally unique SCSI device identifier for the volume in NAA IEEE Registered Extended format. """ ,
+
dictionaryType = None
+
)
+
qos = data_model . property (
+
"qos" , VolumeQOS ,
+
array = False , optional = False ,
+
documentation = """Quality of service settings for this volume. """ ,
+
dictionaryType = None
+
)
+
volume_access_groups = data_model . property (
+
"volumeAccessGroups" , int ,
+
array = True , optional = False ,
+
documentation = """List of volume access groups to which a volume beintegers. """ ,
+
dictionaryType = None
+
)
+
volume_pairs = data_model . property (
+
"volumePairs" , VolumePair ,
+
array = True , optional = False ,
+
documentation = """Information about a paired volume. Available only if a volume is paired. @see VolumePairs for return values. """ ,
+
dictionaryType = None
+
)
+
delete_time = data_model . property (
+
"deleteTime" , str ,
+
array = False , optional = True ,
+
documentation = """The time this volume was deleted. If this has no value, the volume has not yet been deleted. """ ,
+
dictionaryType = None
+
)
+
purge_time = data_model . property (
+
"purgeTime" , str ,
+
array = False , optional = True ,
+
documentation = """The time this volume will be purged from the system. If this has no value, the volume has not yet been deleted (and is not scheduled for purging). """ ,
+
dictionaryType = None
+
)
+
slice_count = data_model . property (
+
"sliceCount" , int ,
+
array = False , optional = False ,
+
documentation = """The number of slices backing this volume. In the current software, this value will always be 1. """ ,
+
dictionaryType = None
+
)
+
total_size = data_model . property (
+
"totalSize" , int ,
+
array = False , optional = False ,
+
documentation = """Total size of this volume in bytes. """ ,
+
dictionaryType = None
+
)
+
block_size = data_model . property (
+
"blockSize" , int ,
+
array = False , optional = False ,
+
documentation = """Size of the blocks on the volume. """ ,
+
dictionaryType = None
+
)
+
virtual_volume_id = data_model . property (
+
"virtualVolumeID" , UUID ,
+
array = False , optional = True ,
+
documentation = """Virtual volume ID this volume backs. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = False ,
+
documentation = """List of Name/Value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_id ,
+
name ,
+
account_id ,
+
create_time ,
+
status ,
+
access ,
+
enable512e ,
+
scsi_euidevice_id ,
+
scsi_naadevice_id ,
+
qos ,
+
volume_access_groups ,
+
volume_pairs ,
+
slice_count ,
+
total_size ,
+
block_size ,
+
attributes ,
+
iqn = None ,
+
delete_time = None ,
+
purge_time = None ,
+
virtual_volume_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class QoS ( data_model . DataObject ):
+
"""QoS
+
Quality of Service (QoS) values are used on SolidFire volumes to provision performance expectations.
+
Minimum, maximum and burst QoS values can be set within the ranges specified in the QoS table below.
+
+
Volumes created without specified QoS values are created with the Default values listed below.
+
Default values can be found by running the GetDefaultQoS method.
+
+
minIOPS Min: 100/50 (v7.0/v8.0), Default: 100, Max: 15,000
+
maxIOPS Min: 100/50 (v7.0/v8.0), Default: 15,000, Max: 100,000
+
burstIOPS Min: 100/50 (v7.0/v8.0), Default: 15,000, Max: 100,000
+
+
:param min_iops: Desired minimum 4KB IOPS to guarantee. The allowed IOPS will only drop below this level if all volumes have been capped at their minimum IOPS value and there is still insufficient performance capacity.
+
:type min_iops: int
+
+
:param max_iops: Desired maximum 4KB IOPS allowed over an extended period of time.
+
:type max_iops: int
+
+
:param burst_iops: Maximum "peak" 4KB IOPS allowed for short periods of time. Allows for bursts of I/O activity over the normal max IOPS value.
+
:type burst_iops: int
+
+
:param burst_time: The length of time burst IOPS is allowed. The value returned is represented in time units of seconds. Note: this value is calculated by the system based on IOPS set for QoS.
+
:type burst_time: int
+
+
"""
+
min_iops = data_model . property (
+
"minIOPS" , int ,
+
array = False , optional = True ,
+
documentation = """Desired minimum 4KB IOPS to guarantee. The allowed IOPS will only drop below this level if all volumes have been capped at their minimum IOPS value and there is still insufficient performance capacity. """ ,
+
dictionaryType = None
+
)
+
max_iops = data_model . property (
+
"maxIOPS" , int ,
+
array = False , optional = True ,
+
documentation = """Desired maximum 4KB IOPS allowed over an extended period of time. """ ,
+
dictionaryType = None
+
)
+
burst_iops = data_model . property (
+
"burstIOPS" , int ,
+
array = False , optional = True ,
+
documentation = """Maximum "peak" 4KB IOPS allowed for short periods of time. Allows for bursts of I/O activity over the normal max IOPS value. """ ,
+
dictionaryType = None
+
)
+
burst_time = data_model . property (
+
"burstTime" , int ,
+
array = False , optional = True ,
+
documentation = """The length of time burst IOPS is allowed. The value returned is represented in time units of seconds. Note: this value is calculated by the system based on IOPS set for QoS. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
min_iops = None ,
+
max_iops = None ,
+
burst_iops = None ,
+
burst_time = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyVolumesResult ( data_model . DataObject ):
+
"""ModifyVolumesResult
+
+
:param volumes: [required]
+
:type volumes: Volume
+
+
:param qos:
+
:type qos: QoS
+
+
"""
+
volumes = data_model . property (
+
"volumes" , Volume ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
qos = data_model . property (
+
"qos" , QoS ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volumes ,
+
qos = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class EnableEncryptionAtRestResult ( data_model . DataObject ):
+
"""EnableEncryptionAtRestResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DeleteSnapshotRequest ( data_model . DataObject ):
+
"""DeleteSnapshotRequest
+
DeleteSnapshot enables you to delete a snapshot. A snapshot that is currently the "active" snapshot cannot be deleted. You must
+
rollback and make another snapshot "active" before the current snapshot can be deleted. For more details on rolling back snapshots, see RollbackToSnapshot.
+
+
:param snapshot_id: [required] The ID of the snapshot to be deleted.
+
:type snapshot_id: int
+
+
"""
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the snapshot to be deleted. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
snapshot_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetNetworkConfigResult ( data_model . DataObject ):
+
"""GetNetworkConfigResult
+
+
:param network: [required]
+
:type network: Network
+
+
"""
+
network = data_model . property (
+
"network" , Network ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
network ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class NetworkConfigParams ( data_model . DataObject ):
+
"""NetworkConfigParams
+
+
:param _default:
+
:type _default: bool
+
+
:param bond_master:
+
:type bond_master: str
+
+
:param virtual_network_tag:
+
:type virtual_network_tag: str
+
+
:param address:
+
:type address: str
+
+
:param auto:
+
:type auto: bool
+
+
:param bond_downdelay:
+
:type bond_downdelay: str
+
+
:param bond_fail_over_mac:
+
:type bond_fail_over_mac: str
+
+
:param bond_primary_reselect:
+
:type bond_primary_reselect: str
+
+
:param bond_lacp_rate:
+
:type bond_lacp_rate: str
+
+
:param bond_miimon:
+
:type bond_miimon: str
+
+
:param bond_mode:
+
:type bond_mode: str
+
+
:param bond_slaves:
+
:type bond_slaves: str
+
+
:param bond_updelay:
+
:type bond_updelay: str
+
+
:param dns_nameservers:
+
:type dns_nameservers: str
+
+
:param dns_search:
+
:type dns_search: str
+
+
:param family:
+
:type family: str
+
+
:param gateway:
+
:type gateway: str
+
+
:param mac_address:
+
:type mac_address: str
+
+
:param mac_address_permanent:
+
:type mac_address_permanent: str
+
+
:param method:
+
:type method: str
+
+
:param mtu:
+
:type mtu: str
+
+
:param netmask:
+
:type netmask: str
+
+
:param network:
+
:type network: str
+
+
:param physical:
+
:type physical: PhysicalAdapter
+
+
:param routes:
+
:type routes: dict
+
+
:param status:
+
:type status: str
+
+
:param symmetric_route_rules:
+
:type symmetric_route_rules: str
+
+
:param up_and_running:
+
:type up_and_running: bool
+
+
"""
+
_default = data_model . property (
+
"#default" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_master = data_model . property (
+
"bond-master" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
virtual_network_tag = data_model . property (
+
"virtualNetworkTag" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
address = data_model . property (
+
"address" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
auto = data_model . property (
+
"auto" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_downdelay = data_model . property (
+
"bond-downdelay" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_fail_over_mac = data_model . property (
+
"bond-fail_over_mac" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_primary_reselect = data_model . property (
+
"bond-primary_reselect" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_lacp_rate = data_model . property (
+
"bond-lacp_rate" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_miimon = data_model . property (
+
"bond-miimon" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_mode = data_model . property (
+
"bond-mode" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_slaves = data_model . property (
+
"bond-slaves" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond_updelay = data_model . property (
+
"bond-updelay" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
dns_nameservers = data_model . property (
+
"dns-nameservers" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
dns_search = data_model . property (
+
"dns-search" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
family = data_model . property (
+
"family" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
gateway = data_model . property (
+
"gateway" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
mac_address = data_model . property (
+
"macAddress" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
mac_address_permanent = data_model . property (
+
"macAddressPermanent" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
method = data_model . property (
+
"method" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
mtu = data_model . property (
+
"mtu" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
netmask = data_model . property (
+
"netmask" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
network = data_model . property (
+
"network" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
physical = data_model . property (
+
"physical" , PhysicalAdapter ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
routes = data_model . property (
+
"routes" , dict ,
+
array = True , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
status = data_model . property (
+
"status" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
symmetric_route_rules = data_model . property (
+
"symmetricRouteRules" , str ,
+
array = True , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
up_and_running = data_model . property (
+
"upAndRunning" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
_default = None ,
+
bond_master = None ,
+
virtual_network_tag = None ,
+
address = None ,
+
auto = None ,
+
bond_downdelay = None ,
+
bond_fail_over_mac = None ,
+
bond_primary_reselect = None ,
+
bond_lacp_rate = None ,
+
bond_miimon = None ,
+
bond_mode = None ,
+
bond_slaves = None ,
+
bond_updelay = None ,
+
dns_nameservers = None ,
+
dns_search = None ,
+
family = None ,
+
gateway = None ,
+
mac_address = None ,
+
mac_address_permanent = None ,
+
method = None ,
+
mtu = None ,
+
netmask = None ,
+
network = None ,
+
physical = None ,
+
routes = None ,
+
status = None ,
+
symmetric_route_rules = None ,
+
up_and_running = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class NetworkParams ( data_model . DataObject ):
+
"""NetworkParams
+
+
:param bond10_g:
+
:type bond10_g: NetworkConfigParams
+
+
:param bond1_g:
+
:type bond1_g: NetworkConfigParams
+
+
:param eth0:
+
:type eth0: NetworkConfigParams
+
+
:param eth1:
+
:type eth1: NetworkConfigParams
+
+
:param eth2:
+
:type eth2: NetworkConfigParams
+
+
:param eth3:
+
:type eth3: NetworkConfigParams
+
+
:param lo:
+
:type lo: NetworkConfigParams
+
+
"""
+
bond10_g = data_model . property (
+
"Bond10G" , NetworkConfigParams ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bond1_g = data_model . property (
+
"Bond1G" , NetworkConfigParams ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
eth0 = data_model . property (
+
"eth0" , NetworkConfigParams ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
eth1 = data_model . property (
+
"eth1" , NetworkConfigParams ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
eth2 = data_model . property (
+
"eth2" , NetworkConfigParams ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
eth3 = data_model . property (
+
"eth3" , NetworkConfigParams ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
lo = data_model . property (
+
"lo" , NetworkConfigParams ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
bond10_g = None ,
+
bond1_g = None ,
+
eth0 = None ,
+
eth1 = None ,
+
eth2 = None ,
+
eth3 = None ,
+
lo = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ConfigParams ( data_model . DataObject ):
+
"""ConfigParams
+
+
:param cluster: [required]
+
:type cluster: ClusterConfig
+
+
:param network: [required]
+
:type network: NetworkParams
+
+
"""
+
cluster = data_model . property (
+
"cluster" , ClusterConfig ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
network = data_model . property (
+
"network" , NetworkParams ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
cluster ,
+
network ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyClusterFullThresholdRequest ( data_model . DataObject ):
+
"""ModifyClusterFullThresholdRequest
+
You can use ModifyClusterFullThreshold to change the level at which the system generates an event when the storage cluster approaches a certain capacity utilization. You can use the threshold setting to indicate the acceptable amount of utilized block storage before the system generates a warning. For example, if you want to be alerted when the system reaches 3% below the "Error" level block storage utilization, enter a value of "3" for the stage3BlockThresholdPercent parameter. If this level is reached, the system sends an alert to the Event Log in the Cluster Management Console.
+
+
:param stage2_aware_threshold: The number of nodes of capacity remaining in the cluster before the system triggers a capacity notification.
+
:type stage2_aware_threshold: int
+
+
:param stage3_block_threshold_percent: The percentage of block storage utilization below the "Error" threshold that causes the system to trigger a cluster "Warning" alert.
+
:type stage3_block_threshold_percent: int
+
+
:param max_metadata_over_provision_factor: A value representative of the number of times metadata space can be overprovisioned relative to the amount of space available. For example, if there was enough metadata space to store 100 TiB of volumes and this number was set to 5, then 500 TiB worth of volumes can be created.
+
:type max_metadata_over_provision_factor: int
+
+
"""
+
stage2_aware_threshold = data_model . property (
+
"stage2AwareThreshold" , int ,
+
array = False , optional = True ,
+
documentation = """The number of nodes of capacity remaining in the cluster before the system triggers a capacity notification. """ ,
+
dictionaryType = None
+
)
+
stage3_block_threshold_percent = data_model . property (
+
"stage3BlockThresholdPercent" , int ,
+
array = False , optional = True ,
+
documentation = """The percentage of block storage utilization below the "Error" threshold that causes the system to trigger a cluster "Warning" alert. """ ,
+
dictionaryType = None
+
)
+
max_metadata_over_provision_factor = data_model . property (
+
"maxMetadataOverProvisionFactor" , int ,
+
array = False , optional = True ,
+
documentation = """A value representative of the number of times metadata space can be overprovisioned relative to the amount of space available. For example, if there was enough metadata space to store 100 TiB of volumes and this number was set to 5, then 500 TiB worth of volumes can be created. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
stage2_aware_threshold = None ,
+
stage3_block_threshold_percent = None ,
+
max_metadata_over_provision_factor = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class AddVirtualNetworkResult ( data_model . DataObject ):
+
"""AddVirtualNetworkResult
+
+
:param virtual_network_id: The virtual network ID of the new virtual network.
+
:type virtual_network_id: int
+
+
"""
+
virtual_network_id = data_model . property (
+
"virtualNetworkID" , int ,
+
array = False , optional = True ,
+
documentation = """The virtual network ID of the new virtual network. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
virtual_network_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CreateScheduleResult ( data_model . DataObject ):
+
"""CreateScheduleResult
+
+
:param schedule_id: [required]
+
:type schedule_id: int
+
+
"""
+
schedule_id = data_model . property (
+
"scheduleID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
schedule_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CompleteVolumePairingRequest ( data_model . DataObject ):
+
"""CompleteVolumePairingRequest
+
You can use the CompleteVolumePairing method to complete the pairing of two volumes.
+
+
:param volume_pairing_key: [required] The key returned from the StartVolumePairing method.
+
:type volume_pairing_key: str
+
+
:param volume_id: [required] The ID of the volume on which to complete the pairing process.
+
:type volume_id: int
+
+
"""
+
volume_pairing_key = data_model . property (
+
"volumePairingKey" , str ,
+
array = False , optional = False ,
+
documentation = """The key returned from the StartVolumePairing method. """ ,
+
dictionaryType = None
+
)
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the volume on which to complete the pairing process. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_pairing_key ,
+
volume_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class FibreChannelPortInfo ( data_model . DataObject ):
+
"""FibreChannelPortInfo
+
Fibre Channel Node Port Info object returns information about all Fibre Channel ports on a node, or for one node in the cluster. The same information is returned for all ports or port information for one node. This information is returned with the API method ListNodeFibreChannelPortInfo (in the SolidFire API Guide).
+
+
:param firmware: [required] The version of the firmware installed on the Fibre Channel port.
+
:type firmware: str
+
+
:param hba_port: [required] The ID of the individual HBA port.
+
:type hba_port: int
+
+
:param model: [required] Model of the HBA on the port.
+
:type model: str
+
+
:param n_port_id: [required] Unique SolidFire port node ID.
+
:type n_port_id: str
+
+
:param pci_slot: [required] Slot in which the pci card resides on the Fibre Channel node hardware.
+
:type pci_slot: int
+
+
:param serial: [required] Serial number on the Fibre Channel port.
+
:type serial: str
+
+
:param speed: [required] Speed of the HBA on the port.
+
:type speed: str
+
+
:param state: [required] Possible values: <strong>UnknownNotPresentOnlineOfflineBlockedBypassedDiagnosticsLinkdownErrorLoopbackDeleted</strong>
+
:type state: str
+
+
:param switch_wwn: [required] The World Wide Name of the Fibre Channel switch port.
+
:type switch_wwn: str
+
+
:param wwnn: [required] World Wide Node Name of the HBA node.
+
:type wwnn: str
+
+
:param wwpn: [required] World Wide Port Name assigned to the physical port of the HBA.
+
:type wwpn: str
+
+
"""
+
firmware = data_model . property (
+
"firmware" , str ,
+
array = False , optional = False ,
+
documentation = """The version of the firmware installed on the Fibre Channel port. """ ,
+
dictionaryType = None
+
)
+
hba_port = data_model . property (
+
"hbaPort" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the individual HBA port. """ ,
+
dictionaryType = None
+
)
+
model = data_model . property (
+
"model" , str ,
+
array = False , optional = False ,
+
documentation = """Model of the HBA on the port. """ ,
+
dictionaryType = None
+
)
+
n_port_id = data_model . property (
+
"nPortID" , str ,
+
array = False , optional = False ,
+
documentation = """Unique SolidFire port node ID. """ ,
+
dictionaryType = None
+
)
+
pci_slot = data_model . property (
+
"pciSlot" , int ,
+
array = False , optional = False ,
+
documentation = """Slot in which the pci card resides on the Fibre Channel node hardware. """ ,
+
dictionaryType = None
+
)
+
serial = data_model . property (
+
"serial" , str ,
+
array = False , optional = False ,
+
documentation = """Serial number on the Fibre Channel port. """ ,
+
dictionaryType = None
+
)
+
speed = data_model . property (
+
"speed" , str ,
+
array = False , optional = False ,
+
documentation = """Speed of the HBA on the port. """ ,
+
dictionaryType = None
+
)
+
state = data_model . property (
+
"state" , str ,
+
array = False , optional = False ,
+
documentation = """Possible values: <strong>UnknownNotPresentOnlineOfflineBlockedBypassedDiagnosticsLinkdownErrorLoopbackDeleted</strong> """ ,
+
dictionaryType = None
+
)
+
switch_wwn = data_model . property (
+
"switchWwn" , str ,
+
array = False , optional = False ,
+
documentation = """The World Wide Name of the Fibre Channel switch port. """ ,
+
dictionaryType = None
+
)
+
wwnn = data_model . property (
+
"wwnn" , str ,
+
array = False , optional = False ,
+
documentation = """World Wide Node Name of the HBA node. """ ,
+
dictionaryType = None
+
)
+
wwpn = data_model . property (
+
"wwpn" , str ,
+
array = False , optional = False ,
+
documentation = """World Wide Port Name assigned to the physical port of the HBA. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
firmware ,
+
hba_port ,
+
model ,
+
n_port_id ,
+
pci_slot ,
+
serial ,
+
speed ,
+
state ,
+
switch_wwn ,
+
wwnn ,
+
wwpn ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListNodeFibreChannelPortInfoResult ( data_model . DataObject ):
+
"""ListNodeFibreChannelPortInfoResult
+
List of fibre channel port info results grouped by node.
+
+
:param fibre_channel_ports: [required] List of all physical Fibre Channel ports.
+
:type fibre_channel_ports: FibreChannelPortInfo
+
+
"""
+
fibre_channel_ports = data_model . property (
+
"fibreChannelPorts" , FibreChannelPortInfo ,
+
array = True , optional = False ,
+
documentation = """List of all physical Fibre Channel ports. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
fibre_channel_ports ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyGroupSnapshotRequest ( data_model . DataObject ):
+
"""ModifyGroupSnapshotRequest
+
ModifyGroupSnapshot enables you to change the attributes of a group of snapshots. You can also use this method to enable snapshots created on the Read/Write (source) volume to be remotely replicated to a target SolidFire storage system.
+
+
:param group_snapshot_id: [required] Specifies the ID of the group of snapshots.
+
:type group_snapshot_id: int
+
+
:param expiration_time: Sets the time when the snapshot should be removed. If unspecified, the current time is used.
+
:type expiration_time: str
+
+
:param enable_remote_replication: Replicates the snapshot created to a remote cluster. Possible values are: true: The snapshot is replicated to remote storage. false: Default. The snapshot is not replicated.
+
:type enable_remote_replication: bool
+
+
"""
+
group_snapshot_id = data_model . property (
+
"groupSnapshotID" , int ,
+
array = False , optional = False ,
+
documentation = """Specifies the ID of the group of snapshots. """ ,
+
dictionaryType = None
+
)
+
expiration_time = data_model . property (
+
"expirationTime" , str ,
+
array = False , optional = True ,
+
documentation = """Sets the time when the snapshot should be removed. If unspecified, the current time is used. """ ,
+
dictionaryType = None
+
)
+
enable_remote_replication = data_model . property (
+
"enableRemoteReplication" , bool ,
+
array = False , optional = True ,
+
documentation = """Replicates the snapshot created to a remote cluster. Possible values are: true: The snapshot is replicated to remote storage. false: Default. The snapshot is not replicated. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
group_snapshot_id ,
+
expiration_time = None ,
+
enable_remote_replication = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class RemoveVolumesFromVolumeAccessGroupRequest ( data_model . DataObject ):
+
"""RemoveVolumesFromVolumeAccessGroupRequest
+
The RemoveVolumeFromVolumeAccessGroup method enables you to remove volumes from a volume access group.
+
+
:param volume_access_group_id: [required] The ID of the volume access group to remove volumes from.
+
:type volume_access_group_id: int
+
+
:param volumes: [required] The ID of the volume access group to remove volumes from.
+
:type volumes: int
+
+
"""
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the volume access group to remove volumes from. """ ,
+
dictionaryType = None
+
)
+
volumes = data_model . property (
+
"volumes" , int ,
+
array = True , optional = False ,
+
documentation = """The ID of the volume access group to remove volumes from. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_access_group_id ,
+
volumes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CreateGroupSnapshotResult ( data_model . DataObject ):
+
"""CreateGroupSnapshotResult
+
+
:param group_snapshot: [required]
+
:type group_snapshot: GroupSnapshot
+
+
:param group_snapshot_id: [required] Unique ID of the new group snapshot.
+
:type group_snapshot_id: int
+
+
:param members: [required] List of checksum, volumeIDs and snapshotIDs for each member of the group.
+
:type members: GroupSnapshotMembers
+
+
"""
+
group_snapshot = data_model . property (
+
"groupSnapshot" , GroupSnapshot ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
group_snapshot_id = data_model . property (
+
"groupSnapshotID" , int ,
+
array = False , optional = False ,
+
documentation = """Unique ID of the new group snapshot. """ ,
+
dictionaryType = None
+
)
+
members = data_model . property (
+
"members" , GroupSnapshotMembers ,
+
array = True , optional = False ,
+
documentation = """List of checksum, volumeIDs and snapshotIDs for each member of the group. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
group_snapshot ,
+
group_snapshot_id ,
+
members ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyGroupSnapshotResult ( data_model . DataObject ):
+
"""ModifyGroupSnapshotResult
+
+
:param group_snapshot: [required]
+
:type group_snapshot: GroupSnapshot
+
+
"""
+
group_snapshot = data_model . property (
+
"groupSnapshot" , GroupSnapshot ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
group_snapshot ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DeleteInitiatorsResult ( data_model . DataObject ):
+
"""DeleteInitiatorsResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListActiveVolumesResult ( data_model . DataObject ):
+
"""ListActiveVolumesResult
+
+
:param volumes: [required] List of active volumes.
+
:type volumes: Volume
+
+
"""
+
volumes = data_model . property (
+
"volumes" , Volume ,
+
array = True , optional = False ,
+
documentation = """List of active volumes. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volumes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetFeatureStatusRequest ( data_model . DataObject ):
+
"""GetFeatureStatusRequest
+
GetFeatureStatus enables you to retrieve the status of a cluster feature.
+
+
:param feature: Specifies the feature for which the status is returned. Valid value is: vvols: Retrieve status for the NetApp SolidFire VVols cluster feature.
+
:type feature: str
+
+
"""
+
feature = data_model . property (
+
"feature" , str ,
+
array = False , optional = True ,
+
documentation = """Specifies the feature for which the status is returned. Valid value is: vvols: Retrieve status for the NetApp SolidFire VVols cluster feature. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
feature = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class VolumeAccessGroupLunAssignments ( data_model . DataObject ):
+
"""VolumeAccessGroupLunAssignments
+
VolumeAccessGroup ID and Lun to be assigned to all volumes within it.
+
+
:param volume_access_group_id: [required] Unique volume access group ID for which the LUN assignments will be modified.
+
:type volume_access_group_id: int
+
+
:param lun_assignments: [required] The volume IDs with assigned LUN values.
+
:type lun_assignments: LunAssignment
+
+
:param deleted_lun_assignments: [required] The volume IDs with deleted LUN values.
+
:type deleted_lun_assignments: LunAssignment
+
+
"""
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
+
array = False , optional = False ,
+
documentation = """Unique volume access group ID for which the LUN assignments will be modified. """ ,
+
dictionaryType = None
+
)
+
lun_assignments = data_model . property (
+
"lunAssignments" , LunAssignment ,
+
array = True , optional = False ,
+
documentation = """The volume IDs with assigned LUN values. """ ,
+
dictionaryType = None
+
)
+
deleted_lun_assignments = data_model . property (
+
"deletedLunAssignments" , LunAssignment ,
+
array = True , optional = False ,
+
documentation = """The volume IDs with deleted LUN values. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_access_group_id ,
+
lun_assignments ,
+
deleted_lun_assignments ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyVolumeAccessGroupLunAssignmentsResult ( data_model . DataObject ):
+
"""ModifyVolumeAccessGroupLunAssignmentsResult
+
+
:param volume_access_group_lun_assignments: [required]
+
:type volume_access_group_lun_assignments: VolumeAccessGroupLunAssignments
+
+
"""
+
volume_access_group_lun_assignments = data_model . property (
+
"volumeAccessGroupLunAssignments" , VolumeAccessGroupLunAssignments ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_access_group_lun_assignments ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetStorageContainerEfficiencyResult ( data_model . DataObject ):
+
"""GetStorageContainerEfficiencyResult
+
+
:param compression: [required]
+
:type compression: float
+
+
:param deduplication: [required]
+
:type deduplication: float
+
+
:param missing_volumes: [required] The volumes that could not be queried for efficiency data. Missing volumes can be caused by the Garbage Collection (GC) cycle being less than an hour old, temporary loss of network connectivity, or restarted services since the GC cycle.
+
:type missing_volumes: int
+
+
:param thin_provisioning: [required]
+
:type thin_provisioning: float
+
+
:param timestamp: [required] The last time efficiency data was collected after Garbage Collection (GC).
+
:type timestamp: str
+
+
"""
+
compression = data_model . property (
+
"compression" , float ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
deduplication = data_model . property (
+
"deduplication" , float ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
missing_volumes = data_model . property (
+
"missingVolumes" , int ,
+
array = True , optional = False ,
+
documentation = """The volumes that could not be queried for efficiency data. Missing volumes can be caused by the Garbage Collection (GC) cycle being less than an hour old, temporary loss of network connectivity, or restarted services since the GC cycle. """ ,
+
dictionaryType = None
+
)
+
thin_provisioning = data_model . property (
+
"thinProvisioning" , float ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
timestamp = data_model . property (
+
"timestamp" , str ,
+
array = False , optional = False ,
+
documentation = """The last time efficiency data was collected after Garbage Collection (GC). """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
compression ,
+
deduplication ,
+
missing_volumes ,
+
thin_provisioning ,
+
timestamp ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class Initiator ( data_model . DataObject ):
+
"""Initiator
+
Object containing characteristics of each initiator
+
+
:param alias: [required] The friendly name assigned to this initiator. (String)
+
:type alias: str
+
+
:param initiator_id: [required] The numeric ID of the initiator that has been created. (Integer)
+
:type initiator_id: int
+
+
:param initiator_name: [required] The name of the initiator that has been created. (String)
+
:type initiator_name: str
+
+
:param volume_access_groups: [required] A list of volumeAccessGroupIDs to which this initiator beintegers. (Array of Integers)
+
:type volume_access_groups: int
+
+
:param attributes: [required] A set of JSON attributes assigned to this initiator. (JSON Object)
+
:type attributes: dict
+
+
"""
+
alias = data_model . property (
+
"alias" , str ,
+
array = False , optional = False ,
+
documentation = """The friendly name assigned to this initiator. (String) """ ,
+
dictionaryType = None
+
)
+
initiator_id = data_model . property (
+
"initiatorID" , int ,
+
array = False , optional = False ,
+
documentation = """The numeric ID of the initiator that has been created. (Integer) """ ,
+
dictionaryType = None
+
)
+
initiator_name = data_model . property (
+
"initiatorName" , str ,
+
array = False , optional = False ,
+
documentation = """The name of the initiator that has been created. (String) """ ,
+
dictionaryType = None
+
)
+
volume_access_groups = data_model . property (
+
"volumeAccessGroups" , int ,
+
array = True , optional = False ,
+
documentation = """A list of volumeAccessGroupIDs to which this initiator beintegers. (Array of Integers) """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = False ,
+
documentation = """A set of JSON attributes assigned to this initiator. (JSON Object) """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
alias ,
+
initiator_id ,
+
initiator_name ,
+
volume_access_groups ,
+
attributes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyInitiatorsResult ( data_model . DataObject ):
+
"""ModifyInitiatorsResult
+
+
:param initiators: [required] List of objects containing details about the modified initiators
+
:type initiators: Initiator
+
+
"""
+
initiators = data_model . property (
+
"initiators" , Initiator ,
+
array = True , optional = False ,
+
documentation = """List of objects containing details about the modified initiators """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
initiators ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SetSnmpACLResult ( data_model . DataObject ):
+
"""SetSnmpACLResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyVolumeRequest ( data_model . DataObject ):
+
"""ModifyVolumeRequest
+
ModifyVolume enables you to modify settings on an existing volume. You can make modifications to one volume at a time and
+
changes take place immediately. If you do not specify QoS values when you modify a volume, they remain the same as before the modification. You can retrieve
+
default QoS values for a newly created volume by running the GetDefaultQoS method.
+
When you need to increase the size of a volume that is being replicated, do so in the following order to prevent replication errors:
+
1. Increase the size of the "Replication Target" volume.
+
2. Increase the size of the source or "Read / Write" volume.
+
NetApp recommends that both the target and source volumes are the same size.
+
Note: If you change the "access" status to locked or target, all existing iSCSI connections are terminated.
+
+
:param volume_id: [required] VolumeID for the volume to be modified.
+
:type volume_id: int
+
+
:param account_id: AccountID to which the volume is reassigned. If unspecified, the previous account name is used.
+
:type account_id: int
+
+
:param access: Specifies the access allowed for the volume. Possible values are: readOnly: Only read operations are allowed. readWrite: Reads and writes are allowed. locked: No reads or writes are allowed. If not specified, the access value does not change. replicationTarget: Identify a volume as the target volume for a paired set of volumes. If the volume is not paired, the access status is locked. If a value is not specified, the access value does not change.
+
:type access: str
+
+
:param qos: New QoS settings for this volume. If not specified, the QoS settings are not changed.
+
:type qos: QoS
+
+
:param total_size: New size of the volume in bytes. 1000000000 is equal to 1GB. Size is rounded up to the nearest 1MB. This parameter can only be used to increase the size of a volume.
+
:type total_size: int
+
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """VolumeID for the volume to be modified. """ ,
+
dictionaryType = None
+
)
+
account_id = data_model . property (
+
"accountID" , int ,
+
array = False , optional = True ,
+
documentation = """AccountID to which the volume is reassigned. If unspecified, the previous account name is used. """ ,
+
dictionaryType = None
+
)
+
access = data_model . property (
+
"access" , str ,
+
array = False , optional = True ,
+
documentation = """Specifies the access allowed for the volume. Possible values are: readOnly: Only read operations are allowed. readWrite: Reads and writes are allowed. locked: No reads or writes are allowed. If not specified, the access value does not change. replicationTarget: Identify a volume as the target volume for a paired set of volumes. If the volume is not paired, the access status is locked. If a value is not specified, the access value does not change. """ ,
+
dictionaryType = None
+
)
+
qos = data_model . property (
+
"qos" , QoS ,
+
array = False , optional = True ,
+
documentation = """New QoS settings for this volume. If not specified, the QoS settings are not changed. """ ,
+
dictionaryType = None
+
)
+
total_size = data_model . property (
+
"totalSize" , int ,
+
array = False , optional = True ,
+
documentation = """New size of the volume in bytes. 1000000000 is equal to 1GB. Size is rounded up to the nearest 1MB. This parameter can only be used to increase the size of a volume. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_id ,
+
account_id = None ,
+
access = None ,
+
qos = None ,
+
total_size = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetAPIResult ( data_model . DataObject ):
+
"""GetAPIResult
+
+
:param current_version: [required]
+
:type current_version: float
+
+
:param supported_versions: [required]
+
:type supported_versions: float
+
+
"""
+
current_version = data_model . property (
+
"currentVersion" , float ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
supported_versions = data_model . property (
+
"supportedVersions" , float ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
current_version ,
+
supported_versions ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class AsyncHandle ( data_model . DataObject ):
+
"""AsyncHandle
+
+
:param async_result_id: [required] The ID of the result.
+
:type async_result_id: int
+
+
:param completed: [required] Returns true if it is completed and false if it isn't.
+
:type completed: bool
+
+
:param create_time: [required] The time at which the asyncronous result was created
+
:type create_time: str
+
+
:param last_update_time: [required] Time at which the result was last updated
+
:type last_update_time: str
+
+
:param result_type: [required] The type of result. Could be Clone, DriveAdd, etc.
+
:type result_type: str
+
+
:param success: [required] Returns whether the result was a success or failure.
+
:type success: bool
+
+
:param data: [required] Attributes related to the result
+
:type data: dict
+
+
"""
+
async_result_id = data_model . property (
+
"asyncResultID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the result. """ ,
+
dictionaryType = None
+
)
+
completed = data_model . property (
+
"completed" , bool ,
+
array = False , optional = False ,
+
documentation = """Returns true if it is completed and false if it isn't. """ ,
+
dictionaryType = None
+
)
+
create_time = data_model . property (
+
"createTime" , str ,
+
array = False , optional = False ,
+
documentation = """The time at which the asyncronous result was created """ ,
+
dictionaryType = None
+
)
+
last_update_time = data_model . property (
+
"lastUpdateTime" , str ,
+
array = False , optional = False ,
+
documentation = """Time at which the result was last updated """ ,
+
dictionaryType = None
+
)
+
result_type = data_model . property (
+
"resultType" , str ,
+
array = False , optional = False ,
+
documentation = """The type of result. Could be Clone, DriveAdd, etc. """ ,
+
dictionaryType = None
+
)
+
success = data_model . property (
+
"success" , bool ,
+
array = False , optional = False ,
+
documentation = """Returns whether the result was a success or failure. """ ,
+
dictionaryType = None
+
)
+
data = data_model . property (
+
"data" , dict ,
+
array = False , optional = False ,
+
documentation = """Attributes related to the result """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
async_result_id ,
+
completed ,
+
create_time ,
+
last_update_time ,
+
result_type ,
+
success ,
+
data ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListAsyncResultsResult ( data_model . DataObject ):
+
"""ListAsyncResultsResult
+
+
:param async_handles: [required] An array of serialized asynchronous method results.
+
:type async_handles: AsyncHandle
+
+
"""
+
async_handles = data_model . property (
+
"asyncHandles" , AsyncHandle ,
+
array = True , optional = False ,
+
documentation = """An array of serialized asynchronous method results. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
async_handles ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListSnapshotsResult ( data_model . DataObject ):
+
"""ListSnapshotsResult
+
+
:param snapshots: [required] Information about each snapshot for each volume. If volumeID is not provided, all snapshots for all volumes is returned. Snapshots that are in a group will be returned with a "groupID". Snapshots that are enabled for replication.
+
:type snapshots: Snapshot
+
+
"""
+
snapshots = data_model . property (
+
"snapshots" , Snapshot ,
+
array = True , optional = False ,
+
documentation = """Information about each snapshot for each volume. If volumeID is not provided, all snapshots for all volumes is returned. Snapshots that are in a group will be returned with a "groupID". Snapshots that are enabled for replication. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
snapshots ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVirtualNetworksRequest ( data_model . DataObject ):
+
"""ListVirtualNetworksRequest
+
ListVirtualNetworks enables you to list all configured virtual networks for the cluster. You can use this method to verify the virtual
+
network settings in the cluster.
+
There are no required parameters for this method. However, to filter the results, you can pass one or more VirtualNetworkID or
+
VirtualNetworkTag values.
+
+
:param virtual_network_id: Network ID to filter the list for a single virtual network.
+
:type virtual_network_id: int
+
+
:param virtual_network_tag: Network tag to filter the list for a single virtual network.
+
:type virtual_network_tag: int
+
+
:param virtual_network_ids: Network IDs to include in the list.
+
:type virtual_network_ids: int
+
+
:param virtual_network_tags: Network tag to include in the list.
+
:type virtual_network_tags: int
+
+
"""
+
virtual_network_id = data_model . property (
+
"virtualNetworkID" , int ,
+
array = False , optional = True ,
+
documentation = """Network ID to filter the list for a single virtual network. """ ,
+
dictionaryType = None
+
)
+
virtual_network_tag = data_model . property (
+
"virtualNetworkTag" , int ,
+
array = False , optional = True ,
+
documentation = """Network tag to filter the list for a single virtual network. """ ,
+
dictionaryType = None
+
)
+
virtual_network_ids = data_model . property (
+
"virtualNetworkIDs" , int ,
+
array = True , optional = True ,
+
documentation = """Network IDs to include in the list. """ ,
+
dictionaryType = None
+
)
+
virtual_network_tags = data_model . property (
+
"virtualNetworkTags" , int ,
+
array = True , optional = True ,
+
documentation = """Network tag to include in the list. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
virtual_network_id = None ,
+
virtual_network_tag = None ,
+
virtual_network_ids = None ,
+
virtual_network_tags = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListUtilitiesResult ( data_model . DataObject ):
+
"""ListUtilitiesResult
+
+
:param utilities: [required] List of utilities currently available to run on the node.
+
:type utilities: str
+
+
"""
+
utilities = data_model . property (
+
"utilities" , str ,
+
array = False , optional = False ,
+
documentation = """List of utilities currently available to run on the node. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
utilities ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class InvokeSFApiRequest ( data_model . DataObject ):
+
"""InvokeSFApiRequest
+
This will invoke any API method supported by the SolidFire API for the version and port the connection is using.
+
Returns a nested hashtable of key/value pairs that contain the result of the invoked method.
+
+
:param method: [required] The name of the method to invoke. This is case sensitive.
+
:type method: str
+
+
:param parameters: An object, normally a dictionary or hashtable of the key/value pairs, to be passed as the params for the method being invoked.
+
:type parameters: str
+
+
"""
+
method = data_model . property (
+
"method" , str ,
+
array = False , optional = False ,
+
documentation = """The name of the method to invoke. This is case sensitive. """ ,
+
dictionaryType = None
+
)
+
parameters = data_model . property (
+
"parameters" , str ,
+
array = False , optional = True ,
+
documentation = """An object, normally a dictionary or hashtable of the key/value pairs, to be passed as the params for the method being invoked. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
method ,
+
parameters = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetNodeHardwareInfoRequest ( data_model . DataObject ):
+
"""GetNodeHardwareInfoRequest
+
GetNodeHardwareInfo enables you to return all the hardware information and status for the node specified. This generally includes details about
+
manufacturers, vendors, versions, and other associated hardware identification information.
+
+
:param node_id: [required] The ID of the node for which hardware information is being requested. Information about a Fibre Channel node is returned if a Fibre Channel node is specified.
+
:type node_id: int
+
+
"""
+
node_id = data_model . property (
+
"nodeID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the node for which hardware information is being requested. Information about a Fibre Channel node is returned if a Fibre Channel node is specified. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
node_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVolumeStatsByVolumeResult ( data_model . DataObject ):
+
"""ListVolumeStatsByVolumeResult
+
+
:param volume_stats: [required] List of account activity information.
+
:type volume_stats: VolumeStats
+
+
"""
+
volume_stats = data_model . property (
+
"volumeStats" , VolumeStats ,
+
array = True , optional = False ,
+
documentation = """List of account activity information. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_stats ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CreateClusterRequest ( data_model . DataObject ):
+
"""CreateClusterRequest
+
The CreateCluster method enables you to initialize the node in a cluster that has ownership of the "mvip" and "svip" addresses. Each new cluster is initialized using the management IP (MIP) of the first node in the cluster. This method also automatically adds all the nodes being configured into the cluster. You only need to use this method once each time a new cluster is initialized.
+
Note: You need to log in to the node that is used as the master node for the cluster. After you log in, run the GetBootstrapConfig method on the node to get the IP addresses for the rest of the nodes that you want to include in the
+
cluster. Then, run the CreateCluster method.
+
+
:param accept_eula: Required to indicate your acceptance of the End User License Agreement when creating this cluster. To accept the EULA, set this parameter to true.
+
:type accept_eula: bool
+
+
:param mvip: [required] Floating (virtual) IP address for the cluster on the management network.
+
:type mvip: str
+
+
:param svip: [required] Floating (virtual) IP address for the cluster on the storage (iSCSI) network.
+
:type svip: str
+
+
:param rep_count: [required] Number of replicas of each piece of data to store in the cluster. Valid value is "2".
+
:type rep_count: int
+
+
:param username: [required] Username for the cluster admin.
+
:type username: str
+
+
:param password: [required] Initial password for the cluster admin account.
+
:type password: str
+
+
:param nodes: [required] CIP/SIP addresses of the initial set of nodes making up the cluster. This node's IP must be in the list.
+
:type nodes: str
+
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
accept_eula = data_model . property (
+
"acceptEula" , bool ,
+
array = False , optional = True ,
+
documentation = """Required to indicate your acceptance of the End User License Agreement when creating this cluster. To accept the EULA, set this parameter to true. """ ,
+
dictionaryType = None
+
)
+
mvip = data_model . property (
+
"mvip" , str ,
+
array = False , optional = False ,
+
documentation = """Floating (virtual) IP address for the cluster on the management network. """ ,
+
dictionaryType = None
+
)
+
svip = data_model . property (
+
"svip" , str ,
+
array = False , optional = False ,
+
documentation = """Floating (virtual) IP address for the cluster on the storage (iSCSI) network. """ ,
+
dictionaryType = None
+
)
+
rep_count = data_model . property (
+
"repCount" , int ,
+
array = False , optional = False ,
+
documentation = """Number of replicas of each piece of data to store in the cluster. Valid value is "2". """ ,
+
dictionaryType = None
+
)
+
username = data_model . property (
+
"username" , str ,
+
array = False , optional = False ,
+
documentation = """Username for the cluster admin. """ ,
+
dictionaryType = None
+
)
+
password = data_model . property (
+
"password" , str ,
+
array = False , optional = False ,
+
documentation = """Initial password for the cluster admin account. """ ,
+
dictionaryType = None
+
)
+
nodes = data_model . property (
+
"nodes" , str ,
+
array = True , optional = False ,
+
documentation = """CIP/SIP addresses of the initial set of nodes making up the cluster. This node's IP must be in the list. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
mvip ,
+
svip ,
+
rep_count ,
+
username ,
+
password ,
+
nodes ,
+
accept_eula = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetDriveHardwareInfoResult ( data_model . DataObject ):
+
"""GetDriveHardwareInfoResult
+
+
:param drive_hardware_info: [required]
+
:type drive_hardware_info: DriveHardwareInfo
+
+
"""
+
drive_hardware_info = data_model . property (
+
"driveHardwareInfo" , DriveHardwareInfo ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
drive_hardware_info ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetLdapConfigurationResult ( data_model . DataObject ):
+
"""GetLdapConfigurationResult
+
+
:param ldap_configuration: [required] List of the current LDAP configuration settings. This API call will not return the plain text of the search account password. Note: If LDAP authentication is currently disabled, all the returned settings will be empty with the exception of "authType", and "groupSearchType" which are set to "SearchAndBind" and "ActiveDirectory" respectively.
+
:type ldap_configuration: LdapConfiguration
+
+
"""
+
ldap_configuration = data_model . property (
+
"ldapConfiguration" , LdapConfiguration ,
+
array = False , optional = False ,
+
documentation = """List of the current LDAP configuration settings. This API call will not return the plain text of the search account password. Note: If LDAP authentication is currently disabled, all the returned settings will be empty with the exception of "authType", and "groupSearchType" which are set to "SearchAndBind" and "ActiveDirectory" respectively. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
ldap_configuration ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class RemoveBackupTargetResult ( data_model . DataObject ):
+
"""RemoveBackupTargetResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CreateGroupSnapshotRequest ( data_model . DataObject ):
+
"""CreateGroupSnapshotRequest
+
CreateGroupSnapshot enables you to create a point-in-time copy of a group of volumes. You can use this snapshot later as a backup or rollback to ensure the data on the group of volumes is consistent for the point in time that you created the snapshot.
+
Note: Creating a group snapshot is allowed if cluster fullness is at stage 2 or 3. Snapshots are not created when cluster fullness is at stage 4 or 5.
+
+
:param volumes: [required] Unique ID of the volume image from which to copy.
+
:type volumes: int
+
+
:param name: Name for the group snapshot. If unspecified, the date and time the group snapshot was taken is used.
+
:type name: str
+
+
:param enable_remote_replication: Replicates the snapshot created to remote storage. Possible values are: true: The snapshot is replicated to remote storage. false: Default. The snapshot is not replicated.
+
:type enable_remote_replication: bool
+
+
:param retention: Specifies the amount of time for which the snapshots are retained. The format is HH:mm:ss.
+
:type retention: str
+
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
volumes = data_model . property (
+
"volumes" , int ,
+
array = True , optional = False ,
+
documentation = """Unique ID of the volume image from which to copy. """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = True ,
+
documentation = """Name for the group snapshot. If unspecified, the date and time the group snapshot was taken is used. """ ,
+
dictionaryType = None
+
)
+
enable_remote_replication = data_model . property (
+
"enableRemoteReplication" , bool ,
+
array = False , optional = True ,
+
documentation = """Replicates the snapshot created to remote storage. Possible values are: true: The snapshot is replicated to remote storage. false: Default. The snapshot is not replicated. """ ,
+
dictionaryType = None
+
)
+
retention = data_model . property (
+
"retention" , str ,
+
array = False , optional = True ,
+
documentation = """Specifies the amount of time for which the snapshots are retained. The format is HH:mm:ss. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volumes ,
+
name = None ,
+
enable_remote_replication = None ,
+
retention = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetSystemStatusResult ( data_model . DataObject ):
+
"""GetSystemStatusResult
+
+
:param reboot_required: [required]
+
:type reboot_required: bool
+
+
"""
+
reboot_required = data_model . property (
+
"rebootRequired" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
reboot_required ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CopyVolumeResult ( data_model . DataObject ):
+
"""CopyVolumeResult
+
+
:param clone_id: [required]
+
:type clone_id: int
+
+
:param async_handle: [required] Handle value used to track the progress of the volume copy.
+
:type async_handle: int
+
+
"""
+
clone_id = data_model . property (
+
"cloneID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
async_handle = data_model . property (
+
"asyncHandle" , int ,
+
array = False , optional = False ,
+
documentation = """Handle value used to track the progress of the volume copy. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
clone_id ,
+
async_handle ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SetDefaultQoSResult ( data_model . DataObject ):
+
"""SetDefaultQoSResult
+
+
:param min_iops: [required] The minimum number of sustained IOPS that are provided by the cluster to a volume.
+
:type min_iops: int
+
+
:param max_iops: [required] The maximum number of sustained IOPS that are provided by the cluster to a volume.
+
:type max_iops: int
+
+
:param burst_iops: [required] The maximum number of IOPS allowed in a short burst scenario.
+
:type burst_iops: int
+
+
"""
+
min_iops = data_model . property (
+
"minIOPS" , int ,
+
array = False , optional = False ,
+
documentation = """The minimum number of sustained IOPS that are provided by the cluster to a volume. """ ,
+
dictionaryType = None
+
)
+
max_iops = data_model . property (
+
"maxIOPS" , int ,
+
array = False , optional = False ,
+
documentation = """The maximum number of sustained IOPS that are provided by the cluster to a volume. """ ,
+
dictionaryType = None
+
)
+
burst_iops = data_model . property (
+
"burstIOPS" , int ,
+
array = False , optional = False ,
+
documentation = """The maximum number of IOPS allowed in a short burst scenario. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
min_iops ,
+
max_iops ,
+
burst_iops ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifySnapshotRequest ( data_model . DataObject ):
+
"""ModifySnapshotRequest
+
ModifySnapshot enables you to change the attributes currently assigned to a snapshot. You can use this method to enable snapshots created on
+
the Read/Write (source) volume to be remotely replicated to a target SolidFire storage system.
+
+
:param snapshot_id: [required] Specifies the ID of the snapshot.
+
:type snapshot_id: int
+
+
:param expiration_time: Sets the time when the snapshot should be removed.
+
:type expiration_time: str
+
+
:param enable_remote_replication: Replicates the snapshot created to a remote cluster. Possible values are: true: The snapshot is replicated to remote storage. false: Default. The snapshot is not replicated.
+
:type enable_remote_replication: bool
+
+
"""
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
+
array = False , optional = False ,
+
documentation = """Specifies the ID of the snapshot. """ ,
+
dictionaryType = None
+
)
+
expiration_time = data_model . property (
+
"expirationTime" , str ,
+
array = False , optional = True ,
+
documentation = """Sets the time when the snapshot should be removed. """ ,
+
dictionaryType = None
+
)
+
enable_remote_replication = data_model . property (
+
"enableRemoteReplication" , bool ,
+
array = False , optional = True ,
+
documentation = """Replicates the snapshot created to a remote cluster. Possible values are: true: The snapshot is replicated to remote storage. false: Default. The snapshot is not replicated. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
snapshot_id ,
+
expiration_time = None ,
+
enable_remote_replication = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class NewDrive ( data_model . DataObject ):
+
"""NewDrive
+
+
:param drive_id: [required] A unique identifier for this drive.
+
:type drive_id: int
+
+
:param type: block or slice
+
:type type: str
+
+
"""
+
drive_id = data_model . property (
+
"driveID" , int ,
+
array = False , optional = False ,
+
documentation = """A unique identifier for this drive. """ ,
+
dictionaryType = None
+
)
+
type = data_model . property (
+
"type" , str ,
+
array = False , optional = True ,
+
documentation = """block or slice """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
drive_id ,
+
type = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CreateVolumeRequest ( data_model . DataObject ):
+
"""CreateVolumeRequest
+
CreateVolume enables you to create a new (empty) volume on the cluster. As soon as the volume creation is complete, the volume is
+
available for connection via iSCSI.
+
+
:param name: [required] The name of the volume access group (might be user specified). Not required to be unique, but recommended. Might be 1 to 64 characters in length.
+
:type name: str
+
+
:param account_id: [required] AccountID for the owner of this volume.
+
:type account_id: int
+
+
:param total_size: [required] Total size of the volume, in bytes. Size is rounded up to the nearest 1MB size.
+
:type total_size: int
+
+
:param enable512e: [required] Specifies whether 512e emulation is enabled or not. Possible values are: true: The volume provides 512-byte sector emulation. false: 512e emulation is not enabled.
+
:type enable512e: bool
+
+
:param qos: Initial quality of service settings for this volume. Default values are used if none are specified. Valid settings are: minIOPS maxIOPS burstIOPS You can get the default values for a volume by using the GetDefaultQoS method.
+
:type qos: QoS
+
+
:param attributes: The list of name-value pairs in JSON object format. Total attribute size must be less than 1000B, or 1KB, including JSON formatting characters.
+
:type attributes: dict
+
+
"""
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """The name of the volume access group (might be user specified). Not required to be unique, but recommended. Might be 1 to 64 characters in length. """ ,
+
dictionaryType = None
+
)
+
account_id = data_model . property (
+
"accountID" , int ,
+
array = False , optional = False ,
+
documentation = """AccountID for the owner of this volume. """ ,
+
dictionaryType = None
+
)
+
total_size = data_model . property (
+
"totalSize" , int ,
+
array = False , optional = False ,
+
documentation = """Total size of the volume, in bytes. Size is rounded up to the nearest 1MB size. """ ,
+
dictionaryType = None
+
)
+
enable512e = data_model . property (
+
"enable512e" , bool ,
+
array = False , optional = False ,
+
documentation = """Specifies whether 512e emulation is enabled or not. Possible values are: true: The volume provides 512-byte sector emulation. false: 512e emulation is not enabled. """ ,
+
dictionaryType = None
+
)
+
qos = data_model . property (
+
"qos" , QoS ,
+
array = False , optional = True ,
+
documentation = """Initial quality of service settings for this volume. Default values are used if none are specified. Valid settings are: minIOPS maxIOPS burstIOPS You can get the default values for a volume by using the GetDefaultQoS method. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """The list of name-value pairs in JSON object format. Total attribute size must be less than 1000B, or 1KB, including JSON formatting characters. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
name ,
+
account_id ,
+
total_size ,
+
enable512e ,
+
qos = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyClusterFullThresholdResult ( data_model . DataObject ):
+
"""ModifyClusterFullThresholdResult
+
+
:param block_fullness: [required] Current computed level of block fullness of the cluster. Possible values: stage1Happy: No alerts or error conditions. stage2Aware: 3 nodes of capacity available. stage3Low: 2 nodes of capacity available. stage4Critical: 1 node of capacity available. No new volumes or clones can be created. stage5CompletelyConsumed: Completely consumed. Cluster is read-only, iSCSI connection is maintained but all writes are suspended.
+
:type block_fullness: str
+
+
:param fullness: [required] Reflects the highest level of fullness between "blockFullness" and "metadataFullness".
+
:type fullness: str
+
+
:param max_metadata_over_provision_factor: [required] A value representative of the number of times metadata space can be over provisioned relative to the amount of space available. For example, if there was enough metadata space to store 100 TiB of volumes and this number was set to 5, then 500 TiB worth of volumes could be created.
+
:type max_metadata_over_provision_factor: int
+
+
:param metadata_fullness: [required] Current computed level of metadata fullness of the cluster.
+
:type metadata_fullness: str
+
+
:param slice_reserve_used_threshold_pct: [required] Error condition; message sent to "Alerts" if the reserved slice utilization is greater than the sliceReserveUsedThresholdPct value returned.
+
:type slice_reserve_used_threshold_pct: int
+
+
:param stage2_aware_threshold: [required] Awareness condition: Value that is set for "Stage 2" cluster threshold level.
+
:type stage2_aware_threshold: int
+
+
:param stage2_block_threshold_bytes: [required] Number of bytes being used by the cluster at which a stage2 condition will exist.
+
:type stage2_block_threshold_bytes: int
+
+
:param stage3_block_threshold_bytes: [required] Number of bytes being used by the cluster at which a stage3 condition will exist.
+
:type stage3_block_threshold_bytes: int
+
+
:param stage3_block_threshold_percent: [required] The percent value set for stage3. At this percent full, a warning will be posted in the Alerts log.
+
:type stage3_block_threshold_percent: int
+
+
:param stage3_low_threshold: [required] Error condition; message sent to "Alerts" that capacity on a cluster is getting low.
+
:type stage3_low_threshold: int
+
+
:param stage4_critical_threshold: [required] Error condition; message sent to "Alerts" that capacity on a cluster is critically low.
+
:type stage4_critical_threshold: int
+
+
:param stage4_block_threshold_bytes: [required] Number of bytes being used by the cluster at which a stage4 condition will exist.
+
:type stage4_block_threshold_bytes: int
+
+
:param stage5_block_threshold_bytes: [required] Number of bytes being used by the cluster at which a stage5 condition will exist.
+
:type stage5_block_threshold_bytes: int
+
+
:param sum_total_cluster_bytes: [required] Physical capacity of the cluster measured in bytes.
+
:type sum_total_cluster_bytes: int
+
+
:param sum_total_metadata_cluster_bytes: [required] Total amount of space that can be used to store metadata.
+
:type sum_total_metadata_cluster_bytes: int
+
+
:param sum_used_cluster_bytes: [required] Number of bytes used on the cluster.
+
:type sum_used_cluster_bytes: int
+
+
:param sum_used_metadata_cluster_bytes: [required] Amount of space used on volume drives to store metadata.
+
:type sum_used_metadata_cluster_bytes: int
+
+
"""
+
block_fullness = data_model . property (
+
"blockFullness" , str ,
+
array = False , optional = False ,
+
documentation = """Current computed level of block fullness of the cluster. Possible values: stage1Happy: No alerts or error conditions. stage2Aware: 3 nodes of capacity available. stage3Low: 2 nodes of capacity available. stage4Critical: 1 node of capacity available. No new volumes or clones can be created. stage5CompletelyConsumed: Completely consumed. Cluster is read-only, iSCSI connection is maintained but all writes are suspended. """ ,
+
dictionaryType = None
+
)
+
fullness = data_model . property (
+
"fullness" , str ,
+
array = False , optional = False ,
+
documentation = """Reflects the highest level of fullness between "blockFullness" and "metadataFullness". """ ,
+
dictionaryType = None
+
)
+
max_metadata_over_provision_factor = data_model . property (
+
"maxMetadataOverProvisionFactor" , int ,
+
array = False , optional = False ,
+
documentation = """A value representative of the number of times metadata space can be over provisioned relative to the amount of space available. For example, if there was enough metadata space to store 100 TiB of volumes and this number was set to 5, then 500 TiB worth of volumes could be created. """ ,
+
dictionaryType = None
+
)
+
metadata_fullness = data_model . property (
+
"metadataFullness" , str ,
+
array = False , optional = False ,
+
documentation = """Current computed level of metadata fullness of the cluster. """ ,
+
dictionaryType = None
+
)
+
slice_reserve_used_threshold_pct = data_model . property (
+
"sliceReserveUsedThresholdPct" , int ,
+
array = False , optional = False ,
+
documentation = """Error condition; message sent to "Alerts" if the reserved slice utilization is greater than the sliceReserveUsedThresholdPct value returned. """ ,
+
dictionaryType = None
+
)
+
stage2_aware_threshold = data_model . property (
+
"stage2AwareThreshold" , int ,
+
array = False , optional = False ,
+
documentation = """Awareness condition: Value that is set for "Stage 2" cluster threshold level. """ ,
+
dictionaryType = None
+
)
+
stage2_block_threshold_bytes = data_model . property (
+
"stage2BlockThresholdBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Number of bytes being used by the cluster at which a stage2 condition will exist. """ ,
+
dictionaryType = None
+
)
+
stage3_block_threshold_bytes = data_model . property (
+
"stage3BlockThresholdBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Number of bytes being used by the cluster at which a stage3 condition will exist. """ ,
+
dictionaryType = None
+
)
+
stage3_block_threshold_percent = data_model . property (
+
"stage3BlockThresholdPercent" , int ,
+
array = False , optional = False ,
+
documentation = """The percent value set for stage3. At this percent full, a warning will be posted in the Alerts log. """ ,
+
dictionaryType = None
+
)
+
stage3_low_threshold = data_model . property (
+
"stage3LowThreshold" , int ,
+
array = False , optional = False ,
+
documentation = """Error condition; message sent to "Alerts" that capacity on a cluster is getting low. """ ,
+
dictionaryType = None
+
)
+
stage4_critical_threshold = data_model . property (
+
"stage4CriticalThreshold" , int ,
+
array = False , optional = False ,
+
documentation = """Error condition; message sent to "Alerts" that capacity on a cluster is critically low. """ ,
+
dictionaryType = None
+
)
+
stage4_block_threshold_bytes = data_model . property (
+
"stage4BlockThresholdBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Number of bytes being used by the cluster at which a stage4 condition will exist. """ ,
+
dictionaryType = None
+
)
+
stage5_block_threshold_bytes = data_model . property (
+
"stage5BlockThresholdBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Number of bytes being used by the cluster at which a stage5 condition will exist. """ ,
+
dictionaryType = None
+
)
+
sum_total_cluster_bytes = data_model . property (
+
"sumTotalClusterBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Physical capacity of the cluster measured in bytes. """ ,
+
dictionaryType = None
+
)
+
sum_total_metadata_cluster_bytes = data_model . property (
+
"sumTotalMetadataClusterBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Total amount of space that can be used to store metadata. """ ,
+
dictionaryType = None
+
)
+
sum_used_cluster_bytes = data_model . property (
+
"sumUsedClusterBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Number of bytes used on the cluster. """ ,
+
dictionaryType = None
+
)
+
sum_used_metadata_cluster_bytes = data_model . property (
+
"sumUsedMetadataClusterBytes" , int ,
+
array = False , optional = False ,
+
documentation = """Amount of space used on volume drives to store metadata. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
block_fullness ,
+
fullness ,
+
max_metadata_over_provision_factor ,
+
metadata_fullness ,
+
slice_reserve_used_threshold_pct ,
+
stage2_aware_threshold ,
+
stage2_block_threshold_bytes ,
+
stage3_block_threshold_bytes ,
+
stage3_block_threshold_percent ,
+
stage3_low_threshold ,
+
stage4_critical_threshold ,
+
stage4_block_threshold_bytes ,
+
stage5_block_threshold_bytes ,
+
sum_total_cluster_bytes ,
+
sum_total_metadata_cluster_bytes ,
+
sum_used_cluster_bytes ,
+
sum_used_metadata_cluster_bytes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVolumesForAccountResult ( data_model . DataObject ):
+
"""ListVolumesForAccountResult
+
+
:param volumes: [required] List of volumes.
+
:type volumes: Volume
+
+
"""
+
volumes = data_model . property (
+
"volumes" , Volume ,
+
array = True , optional = False ,
+
documentation = """List of volumes. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volumes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class RollbackToSnapshotRequest ( data_model . DataObject ):
+
"""RollbackToSnapshotRequest
+
RollbackToSnapshot enables you to make an existing snapshot of the "active" volume image. This method creates a new snapshot
+
from an existing snapshot. The new snapshot becomes "active" and the existing snapshot is preserved until you delete it.
+
The previously "active" snapshot is deleted unless you set the parameter saveCurrentState to true.
+
Note: Creating a snapshot is allowed if cluster fullness is at stage 2 or 3. Snapshots are not created when cluster fullness is
+
at stage 4 or 5.
+
+
:param volume_id: [required] VolumeID for the volume.
+
:type volume_id: int
+
+
:param snapshot_id: [required] The ID of a previously created snapshot on the given volume.
+
:type snapshot_id: int
+
+
:param save_current_state: [required] Specifies whether to save an active volume image or delete it. Values are: true: The previous active volume image is kept. false: (default) The previous active volume image is deleted.
+
:type save_current_state: bool
+
+
:param name: Name for the snapshot. If unspecified, the name of the snapshot being rolled back to is used with "- copy" appended to the end of the name.
+
:type name: str
+
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """VolumeID for the volume. """ ,
+
dictionaryType = None
+
)
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of a previously created snapshot on the given volume. """ ,
+
dictionaryType = None
+
)
+
save_current_state = data_model . property (
+
"saveCurrentState" , bool ,
+
array = False , optional = False ,
+
documentation = """Specifies whether to save an active volume image or delete it. Values are: true: The previous active volume image is kept. false: (default) The previous active volume image is deleted. """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = True ,
+
documentation = """Name for the snapshot. If unspecified, the name of the snapshot being rolled back to is used with "- copy" appended to the end of the name. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_id ,
+
snapshot_id ,
+
save_current_state ,
+
name = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DeleteVolumesResult ( data_model . DataObject ):
+
"""DeleteVolumesResult
+
+
:param volumes: [required] Information about the newly deleted volume.
+
:type volumes: Volume
+
+
"""
+
volumes = data_model . property (
+
"volumes" , Volume ,
+
array = True , optional = False ,
+
documentation = """Information about the newly deleted volume. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volumes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyScheduleResult ( data_model . DataObject ):
+
"""ModifyScheduleResult
+
+
:param schedule:
+
:type schedule: Schedule
+
+
"""
+
schedule = data_model . property (
+
"schedule" , Schedule ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
schedule = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetSnmpACLResult ( data_model . DataObject ):
+
"""GetSnmpACLResult
+
+
:param networks: List of networks and what type of access they have to the SNMP servers running on the cluster nodes. Present if SNMP v3 is disabled.
+
:type networks: SnmpNetwork
+
+
:param usm_users: List of users and the type of access they have to the SNMP servers running on the cluster nodes. Present if SNMP v3 is enabled.
+
:type usm_users: SnmpV3UsmUser
+
+
"""
+
networks = data_model . property (
+
"networks" , SnmpNetwork ,
+
array = True , optional = True ,
+
documentation = """List of networks and what type of access they have to the SNMP servers running on the cluster nodes. Present if SNMP v3 is disabled. """ ,
+
dictionaryType = None
+
)
+
usm_users = data_model . property (
+
"usmUsers" , SnmpV3UsmUser ,
+
array = True , optional = True ,
+
documentation = """List of users and the type of access they have to the SNMP servers running on the cluster nodes. Present if SNMP v3 is enabled. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
networks = None ,
+
usm_users = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVolumeAccessGroupsRequest ( data_model . DataObject ):
+
"""ListVolumeAccessGroupsRequest
+
ListVolumeAccessGroups enables you to return
+
information about the volume access groups that are
+
currently in the system.
+
+
:param start_volume_access_group_id: The volume access group ID at which to begin the listing. If unspecified, there is no lower limit (implicitly 0).
+
:type start_volume_access_group_id: int
+
+
:param limit: The maximum number of results to return. This can be useful for paging.
+
:type limit: int
+
+
:param volume_access_groups: The list of ids of the volume access groups you wish to list
+
:type volume_access_groups: int
+
+
"""
+
start_volume_access_group_id = data_model . property (
+
"startVolumeAccessGroupID" , int ,
+
array = False , optional = True ,
+
documentation = """The volume access group ID at which to begin the listing. If unspecified, there is no lower limit (implicitly 0). """ ,
+
dictionaryType = None
+
)
+
limit = data_model . property (
+
"limit" , int ,
+
array = False , optional = True ,
+
documentation = """The maximum number of results to return. This can be useful for paging. """ ,
+
dictionaryType = None
+
)
+
volume_access_groups = data_model . property (
+
"volumeAccessGroups" , int ,
+
array = True , optional = True ,
+
documentation = """The list of ids of the volume access groups you wish to list """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
start_volume_access_group_id = None ,
+
limit = None ,
+
volume_access_groups = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SetClusterConfigRequest ( data_model . DataObject ):
+
"""SetClusterConfigRequest
+
The SetClusterConfig API method enables you to set the configuration this node uses to communicate with the cluster it is associated with. To see the states in which these objects can be modified, see Cluster Object Attributes. To display the current cluster
+
interface settings for a node, run the GetClusterConfig API method.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
+
:param cluster: [required] Objects that are changed for the cluster interface settings.
+
:type cluster: ClusterConfig
+
+
"""
+
cluster = data_model . property (
+
"cluster" , ClusterConfig ,
+
array = False , optional = False ,
+
documentation = """Objects that are changed for the cluster interface settings. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
cluster ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVirtualVolumeHostsRequest ( data_model . DataObject ):
+
"""ListVirtualVolumeHostsRequest
+
ListVirtualVolumeHosts returns a list of all virtual volume hosts known to the cluster. A virtual volume host is a VMware ESX host
+
that has initiated a session with the VASA API provider.
+
+
:param virtual_volume_host_ids: A list of virtual volume host IDs for which to retrieve information. If you omit this parameter, the method returns information about all virtual volume hosts.
+
:type virtual_volume_host_ids: UUID
+
+
"""
+
virtual_volume_host_ids = data_model . property (
+
"virtualVolumeHostIDs" , UUID ,
+
array = True , optional = True ,
+
documentation = """A list of virtual volume host IDs for which to retrieve information. If you omit this parameter, the method returns information about all virtual volume hosts. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
virtual_volume_host_ids = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class NodeStatsInfo ( data_model . DataObject ):
+
"""NodeStatsInfo
+
+
:param c_bytes_in: [required] Bytes in on the cluster interface.
+
:type c_bytes_in: int
+
+
:param c_bytes_out: [required] Bytes out on the cluster interface.
+
:type c_bytes_out: int
+
+
:param cpu: [required] CPU Usage %
+
:type cpu: int
+
+
:param m_bytes_in: [required] Bytes in on the management interface.
+
:type m_bytes_in: int
+
+
:param m_bytes_out: [required] Bytes out on the management interface.
+
:type m_bytes_out: int
+
+
:param network_utilization_cluster: [required] Network interface utilization (in %) for the cluster network interface.
+
:type network_utilization_cluster: int
+
+
:param network_utilization_storage: [required] Network interface utilization (in %) for the storage network interface.
+
:type network_utilization_storage: int
+
+
:param node_id: [required]
+
:type node_id: int
+
+
:param s_bytes_in: [required] Bytes in on the storage interface.
+
:type s_bytes_in: int
+
+
:param s_bytes_out: [required] Bytes out on the storage interface.
+
:type s_bytes_out: int
+
+
:param timestamp: [required] Current time in UTC format ISO 8691 date string.
+
:type timestamp: str
+
+
:param used_memory: [required] Total memory usage in bytes.
+
:type used_memory: int
+
+
"""
+
c_bytes_in = data_model . property (
+
"cBytesIn" , int ,
+
array = False , optional = False ,
+
documentation = """Bytes in on the cluster interface. """ ,
+
dictionaryType = None
+
)
+
c_bytes_out = data_model . property (
+
"cBytesOut" , int ,
+
array = False , optional = False ,
+
documentation = """Bytes out on the cluster interface. """ ,
+
dictionaryType = None
+
)
+
cpu = data_model . property (
+
"cpu" , int ,
+
array = False , optional = False ,
+
documentation = """CPU Usage % """ ,
+
dictionaryType = None
+
)
+
m_bytes_in = data_model . property (
+
"mBytesIn" , int ,
+
array = False , optional = False ,
+
documentation = """Bytes in on the management interface. """ ,
+
dictionaryType = None
+
)
+
m_bytes_out = data_model . property (
+
"mBytesOut" , int ,
+
array = False , optional = False ,
+
documentation = """Bytes out on the management interface. """ ,
+
dictionaryType = None
+
)
+
network_utilization_cluster = data_model . property (
+
"networkUtilizationCluster" , int ,
+
array = False , optional = False ,
+
documentation = """Network interface utilization (in %) for the cluster network interface. """ ,
+
dictionaryType = None
+
)
+
network_utilization_storage = data_model . property (
+
"networkUtilizationStorage" , int ,
+
array = False , optional = False ,
+
documentation = """Network interface utilization (in %) for the storage network interface. """ ,
+
dictionaryType = None
+
)
+
node_id = data_model . property (
+
"nodeID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
s_bytes_in = data_model . property (
+
"sBytesIn" , int ,
+
array = False , optional = False ,
+
documentation = """Bytes in on the storage interface. """ ,
+
dictionaryType = None
+
)
+
s_bytes_out = data_model . property (
+
"sBytesOut" , int ,
+
array = False , optional = False ,
+
documentation = """Bytes out on the storage interface. """ ,
+
dictionaryType = None
+
)
+
timestamp = data_model . property (
+
"timestamp" , str ,
+
array = False , optional = False ,
+
documentation = """Current time in UTC format ISO 8691 date string. """ ,
+
dictionaryType = None
+
)
+
used_memory = data_model . property (
+
"usedMemory" , int ,
+
array = False , optional = False ,
+
documentation = """Total memory usage in bytes. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
c_bytes_in ,
+
c_bytes_out ,
+
cpu ,
+
m_bytes_in ,
+
m_bytes_out ,
+
network_utilization_cluster ,
+
network_utilization_storage ,
+
node_id ,
+
s_bytes_in ,
+
s_bytes_out ,
+
timestamp ,
+
used_memory ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class NodeStatsNodes ( data_model . DataObject ):
+
"""NodeStatsNodes
+
+
:param nodes: [required] Node activity information for a single node.
+
:type nodes: NodeStatsInfo
+
+
"""
+
nodes = data_model . property (
+
"nodes" , NodeStatsInfo ,
+
array = True , optional = False ,
+
documentation = """Node activity information for a single node. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
nodes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListNodeStatsResult ( data_model . DataObject ):
+
"""ListNodeStatsResult
+
+
:param node_stats: [required] Node activity information for all nodes.
+
:type node_stats: NodeStatsNodes
+
+
"""
+
node_stats = data_model . property (
+
"nodeStats" , NodeStatsNodes ,
+
array = False , optional = False ,
+
documentation = """Node activity information for all nodes. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
node_stats ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class RemoveVirtualNetworkResult ( data_model . DataObject ):
+
"""RemoveVirtualNetworkResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListActiveVolumesRequest ( data_model . DataObject ):
+
"""ListActiveVolumesRequest
+
ListActiveVolumes enables you to return the list of active volumes currently in the system. The list of volumes is returned sorted in
+
VolumeID order and can be returned in multiple parts (pages).
+
+
:param start_volume_id: Starting VolumeID to return. If no volume exists with this VolumeID, the next volume by VolumeID order is used as the start of the list. To page through the list, pass the VolumeID of the last volume in the previous response + 1.
+
:type start_volume_id: int
+
+
:param limit: Maximum number of Volume Info objects to return. A value of 0 (zero) returns all volumes (unlimited).
+
:type limit: int
+
+
:param include_virtual_volumes: Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false.
+
:type include_virtual_volumes: bool
+
+
"""
+
start_volume_id = data_model . property (
+
"startVolumeID" , int ,
+
array = False , optional = True ,
+
documentation = """Starting VolumeID to return. If no volume exists with this VolumeID, the next volume by VolumeID order is used as the start of the list. To page through the list, pass the VolumeID of the last volume in the previous response + 1. """ ,
+
dictionaryType = None
+
)
+
limit = data_model . property (
+
"limit" , int ,
+
array = False , optional = True ,
+
documentation = """Maximum number of Volume Info objects to return. A value of 0 (zero) returns all volumes (unlimited). """ ,
+
dictionaryType = None
+
)
+
include_virtual_volumes = data_model . property (
+
"includeVirtualVolumes" , bool ,
+
array = False , optional = True ,
+
documentation = """Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
start_volume_id = None ,
+
limit = None ,
+
include_virtual_volumes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class VirtualVolumeInfo ( data_model . DataObject ):
+
"""VirtualVolumeInfo
+
+
:param virtual_volume_id: [required]
+
:type virtual_volume_id: UUID
+
+
:param parent_virtual_volume_id: [required]
+
:type parent_virtual_volume_id: UUID
+
+
:param storage_container: [required]
+
:type storage_container: StorageContainer
+
+
:param volume_id: [required]
+
:type volume_id: int
+
+
:param snapshot_id: [required]
+
:type snapshot_id: int
+
+
:param virtual_volume_type: [required]
+
:type virtual_volume_type: str
+
+
:param status: [required]
+
:type status: str
+
+
:param bindings: [required]
+
:type bindings: int
+
+
:param children: [required]
+
:type children: UUID
+
+
:param metadata: [required]
+
:type metadata: dict
+
+
:param snapshot_info:
+
:type snapshot_info: Snapshot
+
+
:param volume_info:
+
:type volume_info: Volume
+
+
:param descendants:
+
:type descendants: int
+
+
"""
+
virtual_volume_id = data_model . property (
+
"virtualVolumeID" , UUID ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
parent_virtual_volume_id = data_model . property (
+
"parentVirtualVolumeID" , UUID ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
storage_container = data_model . property (
+
"storageContainer" , StorageContainer ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
virtual_volume_type = data_model . property (
+
"virtualVolumeType" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
status = data_model . property (
+
"status" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bindings = data_model . property (
+
"bindings" , int ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
children = data_model . property (
+
"children" , UUID ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
metadata = data_model . property (
+
"metadata" , dict ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
snapshot_info = data_model . property (
+
"snapshotInfo" , Snapshot ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_info = data_model . property (
+
"volumeInfo" , Volume ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
descendants = data_model . property (
+
"descendants" , int ,
+
array = True , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
virtual_volume_id ,
+
parent_virtual_volume_id ,
+
storage_container ,
+
volume_id ,
+
snapshot_id ,
+
virtual_volume_type ,
+
status ,
+
bindings ,
+
children ,
+
metadata ,
+
snapshot_info = None ,
+
volume_info = None ,
+
descendants = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVirtualVolumesResult ( data_model . DataObject ):
+
"""ListVirtualVolumesResult
+
+
:param virtual_volumes: [required]
+
:type virtual_volumes: VirtualVolumeInfo
+
+
:param next_virtual_volume_id:
+
:type next_virtual_volume_id: UUID
+
+
"""
+
virtual_volumes = data_model . property (
+
"virtualVolumes" , VirtualVolumeInfo ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
next_virtual_volume_id = data_model . property (
+
"nextVirtualVolumeID" , UUID ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
virtual_volumes ,
+
next_virtual_volume_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetNtpInfoResult ( data_model . DataObject ):
+
"""GetNtpInfoResult
+
+
:param broadcastclient: [required] Indicates whether or not the nodes in the cluster are listening for broadcast NTP messages. Possible values: true false
+
:type broadcastclient: bool
+
+
:param servers: [required] List of NTP servers.
+
:type servers: str
+
+
"""
+
broadcastclient = data_model . property (
+
"broadcastclient" , bool ,
+
array = False , optional = False ,
+
documentation = """Indicates whether or not the nodes in the cluster are listening for broadcast NTP messages. Possible values: true false """ ,
+
dictionaryType = None
+
)
+
servers = data_model . property (
+
"servers" , str ,
+
array = True , optional = False ,
+
documentation = """List of NTP servers. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
broadcastclient ,
+
servers ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetDriveStatsRequest ( data_model . DataObject ):
+
"""GetDriveStatsRequest
+
GetDriveStats returns high-level activity measurements for a single drive. Values are cumulative from the addition of the drive to the
+
cluster. Some values are specific to block drives. You might not obtain statistical data for both block and metadata drives when you
+
run this method.
+
+
:param drive_id: [required] Specifies the drive for which statistics are gathered.
+
:type drive_id: int
+
+
"""
+
drive_id = data_model . property (
+
"driveID" , int ,
+
array = False , optional = False ,
+
documentation = """Specifies the drive for which statistics are gathered. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
drive_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListInitiatorsResult ( data_model . DataObject ):
+
"""ListInitiatorsResult
+
+
:param initiators: [required] List of the initiator information.
+
:type initiators: Initiator
+
+
"""
+
initiators = data_model . property (
+
"initiators" , Initiator ,
+
array = True , optional = False ,
+
documentation = """List of the initiator information. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
initiators ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SetDefaultQoSRequest ( data_model . DataObject ):
+
"""SetDefaultQoSRequest
+
SetDefaultQoS enables you to configure the default Quality of Service (QoS) values (measured in inputs and outputs per second, or
+
IOPS) for a volume. For more information about QoS in a SolidFire cluster, see the User Guide.
+
+
:param min_iops: The minimum number of sustained IOPS provided by the cluster to a volume.
+
:type min_iops: int
+
+
:param max_iops: The maximum number of sustained IOPS provided by the cluster to a volume.
+
:type max_iops: int
+
+
:param burst_iops: The maximum number of IOPS allowed in a short burst scenario.
+
:type burst_iops: int
+
+
"""
+
min_iops = data_model . property (
+
"minIOPS" , int ,
+
array = False , optional = True ,
+
documentation = """The minimum number of sustained IOPS provided by the cluster to a volume. """ ,
+
dictionaryType = None
+
)
+
max_iops = data_model . property (
+
"maxIOPS" , int ,
+
array = False , optional = True ,
+
documentation = """The maximum number of sustained IOPS provided by the cluster to a volume. """ ,
+
dictionaryType = None
+
)
+
burst_iops = data_model . property (
+
"burstIOPS" , int ,
+
array = False , optional = True ,
+
documentation = """The maximum number of IOPS allowed in a short burst scenario. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
min_iops = None ,
+
max_iops = None ,
+
burst_iops = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CreateScheduleRequest ( data_model . DataObject ):
+
"""CreateScheduleRequest
+
CreateSchedule enables you to schedule an automatic snapshot of a volume at a defined interval.
+
You can use the created snapshot later as a backup or rollback to ensure the data on a volume or group of volumes is consistent for
+
the point in time in which the snapshot was created.
+
If you schedule a snapshot to run at a time period that is not divisible by 5 minutes, the snapshot runs at the next time period
+
that is divisible by 5 minutes. For example, if you schedule a snapshot to run at 12:42:00 UTC, it runs at 12:45:00 UTC.
+
Note: You can create snapshots if cluster fullness is at stage 1, 2 or 3. You cannot create snapshots after cluster fullness reaches stage 4 or 5.
+
+
:param schedule: [required] The "Schedule" object will be used to create a new schedule. Do not set ScheduleID property, it will be ignored. Frequency property must be of type that inherits from Frequency. Valid types are: DaysOfMonthFrequency DaysOrWeekFrequency TimeIntervalFrequency
+
:type schedule: Schedule
+
+
"""
+
schedule = data_model . property (
+
"schedule" , Schedule ,
+
array = False , optional = False ,
+
documentation = """The "Schedule" object will be used to create a new schedule. Do not set ScheduleID property, it will be ignored. Frequency property must be of type that inherits from Frequency. Valid types are: DaysOfMonthFrequency DaysOrWeekFrequency TimeIntervalFrequency """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
schedule ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetLimitsResult ( data_model . DataObject ):
+
"""GetLimitsResult
+
Limits for the cluster
+
+
:param account_count_max: [required]
+
:type account_count_max: int
+
+
:param account_name_length_max: [required]
+
:type account_name_length_max: int
+
+
:param account_name_length_min: [required]
+
:type account_name_length_min: int
+
+
:param bulk_volume_jobs_per_node_max: [required]
+
:type bulk_volume_jobs_per_node_max: int
+
+
:param bulk_volume_jobs_per_volume_max: [required]
+
:type bulk_volume_jobs_per_volume_max: int
+
+
:param clone_jobs_per_volume_max: [required]
+
:type clone_jobs_per_volume_max: int
+
+
:param cluster_pairs_count_max: [required]
+
:type cluster_pairs_count_max: int
+
+
:param initiator_name_length_max: [required]
+
:type initiator_name_length_max: int
+
+
:param initiator_count_max: [required]
+
:type initiator_count_max: int
+
+
:param initiators_per_volume_access_group_count_max: [required]
+
:type initiators_per_volume_access_group_count_max: int
+
+
:param iscsi_sessions_from_fibre_channel_nodes_max: [required]
+
:type iscsi_sessions_from_fibre_channel_nodes_max: int
+
+
:param secret_length_max: [required]
+
:type secret_length_max: int
+
+
:param secret_length_min: [required]
+
:type secret_length_min: int
+
+
:param snapshot_name_length_max: [required]
+
:type snapshot_name_length_max: int
+
+
:param snapshots_per_volume_max: [required]
+
:type snapshots_per_volume_max: int
+
+
:param volume_access_group_count_max: [required]
+
:type volume_access_group_count_max: int
+
+
:param volume_access_group_lun_max: [required]
+
:type volume_access_group_lun_max: int
+
+
:param volume_access_group_name_length_max: [required]
+
:type volume_access_group_name_length_max: int
+
+
:param volume_access_group_name_length_min: [required]
+
:type volume_access_group_name_length_min: int
+
+
:param volume_access_groups_per_initiator_count_max: [required]
+
:type volume_access_groups_per_initiator_count_max: int
+
+
:param volume_access_groups_per_volume_count_max: [required]
+
:type volume_access_groups_per_volume_count_max: int
+
+
:param initiator_alias_length_max: [required]
+
:type initiator_alias_length_max: int
+
+
:param volume_burst_iopsmax: [required]
+
:type volume_burst_iopsmax: int
+
+
:param volume_burst_iopsmin: [required]
+
:type volume_burst_iopsmin: int
+
+
:param volume_count_max: [required]
+
:type volume_count_max: int
+
+
:param volume_max_iopsmax: [required]
+
:type volume_max_iopsmax: int
+
+
:param volume_max_iopsmin: [required]
+
:type volume_max_iopsmin: int
+
+
:param volume_min_iopsmax: [required]
+
:type volume_min_iopsmax: int
+
+
:param volume_min_iopsmin: [required]
+
:type volume_min_iopsmin: int
+
+
:param volume_name_length_max: [required]
+
:type volume_name_length_max: int
+
+
:param volume_name_length_min: [required]
+
:type volume_name_length_min: int
+
+
:param volume_size_max: [required]
+
:type volume_size_max: int
+
+
:param volume_size_min: [required]
+
:type volume_size_min: int
+
+
:param volumes_per_account_count_max: [required]
+
:type volumes_per_account_count_max: int
+
+
:param volumes_per_group_snapshot_max: [required]
+
:type volumes_per_group_snapshot_max: int
+
+
:param volumes_per_volume_access_group_count_max: [required]
+
:type volumes_per_volume_access_group_count_max: int
+
+
:param cluster_admin_account_max:
+
:type cluster_admin_account_max: int
+
+
:param fibre_channel_volume_access_max:
+
:type fibre_channel_volume_access_max: int
+
+
:param virtual_volumes_per_account_count_max:
+
:type virtual_volumes_per_account_count_max: int
+
+
:param virtual_volume_count_max:
+
:type virtual_volume_count_max: int
+
+
"""
+
account_count_max = data_model . property (
+
"accountCountMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
account_name_length_max = data_model . property (
+
"accountNameLengthMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
account_name_length_min = data_model . property (
+
"accountNameLengthMin" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bulk_volume_jobs_per_node_max = data_model . property (
+
"bulkVolumeJobsPerNodeMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bulk_volume_jobs_per_volume_max = data_model . property (
+
"bulkVolumeJobsPerVolumeMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
clone_jobs_per_volume_max = data_model . property (
+
"cloneJobsPerVolumeMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
cluster_pairs_count_max = data_model . property (
+
"clusterPairsCountMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
initiator_name_length_max = data_model . property (
+
"initiatorNameLengthMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
initiator_count_max = data_model . property (
+
"initiatorCountMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
initiators_per_volume_access_group_count_max = data_model . property (
+
"initiatorsPerVolumeAccessGroupCountMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
iscsi_sessions_from_fibre_channel_nodes_max = data_model . property (
+
"iscsiSessionsFromFibreChannelNodesMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
secret_length_max = data_model . property (
+
"secretLengthMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
secret_length_min = data_model . property (
+
"secretLengthMin" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
snapshot_name_length_max = data_model . property (
+
"snapshotNameLengthMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
snapshots_per_volume_max = data_model . property (
+
"snapshotsPerVolumeMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_access_group_count_max = data_model . property (
+
"volumeAccessGroupCountMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_access_group_lun_max = data_model . property (
+
"volumeAccessGroupLunMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_access_group_name_length_max = data_model . property (
+
"volumeAccessGroupNameLengthMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_access_group_name_length_min = data_model . property (
+
"volumeAccessGroupNameLengthMin" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_access_groups_per_initiator_count_max = data_model . property (
+
"volumeAccessGroupsPerInitiatorCountMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_access_groups_per_volume_count_max = data_model . property (
+
"volumeAccessGroupsPerVolumeCountMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
initiator_alias_length_max = data_model . property (
+
"initiatorAliasLengthMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_burst_iopsmax = data_model . property (
+
"volumeBurstIOPSMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_burst_iopsmin = data_model . property (
+
"volumeBurstIOPSMin" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_count_max = data_model . property (
+
"volumeCountMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_max_iopsmax = data_model . property (
+
"volumeMaxIOPSMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_max_iopsmin = data_model . property (
+
"volumeMaxIOPSMin" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_min_iopsmax = data_model . property (
+
"volumeMinIOPSMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_min_iopsmin = data_model . property (
+
"volumeMinIOPSMin" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_name_length_max = data_model . property (
+
"volumeNameLengthMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_name_length_min = data_model . property (
+
"volumeNameLengthMin" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_size_max = data_model . property (
+
"volumeSizeMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_size_min = data_model . property (
+
"volumeSizeMin" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volumes_per_account_count_max = data_model . property (
+
"volumesPerAccountCountMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volumes_per_group_snapshot_max = data_model . property (
+
"volumesPerGroupSnapshotMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volumes_per_volume_access_group_count_max = data_model . property (
+
"volumesPerVolumeAccessGroupCountMax" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
cluster_admin_account_max = data_model . property (
+
"clusterAdminAccountMax" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
fibre_channel_volume_access_max = data_model . property (
+
"fibreChannelVolumeAccessMax" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
virtual_volumes_per_account_count_max = data_model . property (
+
"virtualVolumesPerAccountCountMax" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
virtual_volume_count_max = data_model . property (
+
"virtualVolumeCountMax" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
account_count_max ,
+
account_name_length_max ,
+
account_name_length_min ,
+
bulk_volume_jobs_per_node_max ,
+
bulk_volume_jobs_per_volume_max ,
+
clone_jobs_per_volume_max ,
+
cluster_pairs_count_max ,
+
initiator_name_length_max ,
+
initiator_count_max ,
+
initiators_per_volume_access_group_count_max ,
+
iscsi_sessions_from_fibre_channel_nodes_max ,
+
secret_length_max ,
+
secret_length_min ,
+
snapshot_name_length_max ,
+
snapshots_per_volume_max ,
+
volume_access_group_count_max ,
+
volume_access_group_lun_max ,
+
volume_access_group_name_length_max ,
+
volume_access_group_name_length_min ,
+
volume_access_groups_per_initiator_count_max ,
+
volume_access_groups_per_volume_count_max ,
+
initiator_alias_length_max ,
+
volume_burst_iopsmax ,
+
volume_burst_iopsmin ,
+
volume_count_max ,
+
volume_max_iopsmax ,
+
volume_max_iopsmin ,
+
volume_min_iopsmax ,
+
volume_min_iopsmin ,
+
volume_name_length_max ,
+
volume_name_length_min ,
+
volume_size_max ,
+
volume_size_min ,
+
volumes_per_account_count_max ,
+
volumes_per_group_snapshot_max ,
+
volumes_per_volume_access_group_count_max ,
+
cluster_admin_account_max = None ,
+
fibre_channel_volume_access_max = None ,
+
virtual_volumes_per_account_count_max = None ,
+
virtual_volume_count_max = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DeleteVolumeAccessGroupResult ( data_model . DataObject ):
+
"""DeleteVolumeAccessGroupResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class RemoveBackupTargetRequest ( data_model . DataObject ):
+
"""RemoveBackupTargetRequest
+
RemoveBackupTarget allows you to delete backup targets.
+
+
:param backup_target_id: [required] The unique target ID of the target to remove.
+
:type backup_target_id: int
+
+
"""
+
backup_target_id = data_model . property (
+
"backupTargetID" , int ,
+
array = False , optional = False ,
+
documentation = """The unique target ID of the target to remove. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
backup_target_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DisableEncryptionAtRestResult ( data_model . DataObject ):
+
"""DisableEncryptionAtRestResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetHardwareConfigResult ( data_model . DataObject ):
+
"""GetHardwareConfigResult
+
+
:param hardware_config: [required] List of hardware information and current settings.
+
:type hardware_config: dict
+
+
"""
+
hardware_config = data_model . property (
+
"hardwareConfig" , dict ,
+
array = False , optional = False ,
+
documentation = """List of hardware information and current settings. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
hardware_config ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVolumesResult ( data_model . DataObject ):
+
"""ListVolumesResult
+
+
:param volumes: [required] List of volumes.
+
:type volumes: Volume
+
+
"""
+
volumes = data_model . property (
+
"volumes" , Volume ,
+
array = True , optional = False ,
+
documentation = """List of volumes. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volumes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetVolumeAccessGroupLunAssignmentsRequest ( data_model . DataObject ):
+
"""GetVolumeAccessGroupLunAssignmentsRequest
+
The GetVolumeAccessGroupLunAssignments
+
method enables you to retrieve details on LUN mappings
+
of a specified volume access group.
+
+
:param volume_access_group_id: [required] The unique volume access group ID used to return information.
+
:type volume_access_group_id: int
+
+
"""
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
+
array = False , optional = False ,
+
documentation = """The unique volume access group ID used to return information. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_access_group_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListDeletedVolumesResult ( data_model . DataObject ):
+
"""ListDeletedVolumesResult
+
+
:param volumes: [required] List of deleted volumes.
+
:type volumes: Volume
+
+
"""
+
volumes = data_model . property (
+
"volumes" , Volume ,
+
array = True , optional = False ,
+
documentation = """List of deleted volumes. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volumes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class TestConnectEnsembleRequest ( data_model . DataObject ):
+
"""TestConnectEnsembleRequest
+
The TestConnectEnsemble API method enables you to verify connectivity with a specified database ensemble. By default, it uses the ensemble for the cluster that the node is associated with. Alternatively, you can provide a different ensemble to test connectivity with.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
+
:param ensemble: Uses a comma-separated list of ensemble node cluster IP addresses to test connectivity. This parameter is optional.
+
:type ensemble: str
+
+
"""
+
ensemble = data_model . property (
+
"ensemble" , str ,
+
array = False , optional = True ,
+
documentation = """Uses a comma-separated list of ensemble node cluster IP addresses to test connectivity. This parameter is optional. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
ensemble = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class Service ( data_model . DataObject ):
+
"""Service
+
+
:param service_id: [required] Unique identifier for this service.
+
:type service_id: int
+
+
:param service_type: [required]
+
:type service_type: str
+
+
:param node_id: [required] The node this service resides on.
+
:type node_id: int
+
+
:param associated_bv: This service's associated bulk volume service. This will only be set if the service type is a slice service.
+
:type associated_bv: int
+
+
:param associated_ts: This service's associated transport service. This will only be set if the service type is a slice service.
+
:type associated_ts: int
+
+
:param associated_vs: This service's associated volume service. This will only be set if the service type is a slice service.
+
:type associated_vs: int
+
+
:param async_result_ids: [required] The list of asynchronous jobs currently running for this service.
+
:type async_result_ids: int
+
+
:param drive_id: If this service resides on a drive, the ID of that drive.
+
:type drive_id: int
+
+
:param first_time_startup: [required] Has this service started successfully? When a new drive is added to the system, the created service will initially have a value of false here. After the service has started, this value will be set to true. This can be used to check if the service has ever started.
+
:type first_time_startup: bool
+
+
:param ipc_port: [required] The port used for intra-cluster communication. This will be in the 4000-4100 range.
+
:type ipc_port: int
+
+
:param iscsi_port: [required] The port used for iSCSI traffic. This will only be set if the service type is a transport service.
+
:type iscsi_port: int
+
+
:param status: [required]
+
:type status: str
+
+
:param started_drive_ids: [required]
+
:type started_drive_ids: int
+
+
:param drive_ids: [required]
+
:type drive_ids: int
+
+
"""
+
service_id = data_model . property (
+
"serviceID" , int ,
+
array = False , optional = False ,
+
documentation = """Unique identifier for this service. """ ,
+
dictionaryType = None
+
)
+
service_type = data_model . property (
+
"serviceType" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
node_id = data_model . property (
+
"nodeID" , int ,
+
array = False , optional = False ,
+
documentation = """The node this service resides on. """ ,
+
dictionaryType = None
+
)
+
associated_bv = data_model . property (
+
"associatedBV" , int ,
+
array = False , optional = True ,
+
documentation = """This service's associated bulk volume service. This will only be set if the service type is a slice service. """ ,
+
dictionaryType = None
+
)
+
associated_ts = data_model . property (
+
"associatedTS" , int ,
+
array = False , optional = True ,
+
documentation = """This service's associated transport service. This will only be set if the service type is a slice service. """ ,
+
dictionaryType = None
+
)
+
associated_vs = data_model . property (
+
"associatedVS" , int ,
+
array = False , optional = True ,
+
documentation = """This service's associated volume service. This will only be set if the service type is a slice service. """ ,
+
dictionaryType = None
+
)
+
async_result_ids = data_model . property (
+
"asyncResultIDs" , int ,
+
array = True , optional = False ,
+
documentation = """The list of asynchronous jobs currently running for this service. """ ,
+
dictionaryType = None
+
)
+
drive_id = data_model . property (
+
"driveID" , int ,
+
array = False , optional = True ,
+
documentation = """If this service resides on a drive, the ID of that drive. """ ,
+
dictionaryType = None
+
)
+
first_time_startup = data_model . property (
+
"firstTimeStartup" , bool ,
+
array = False , optional = False ,
+
documentation = """Has this service started successfully? When a new drive is added to the system, the created service will initially have a value of false here. After the service has started, this value will be set to true. This can be used to check if the service has ever started. """ ,
+
dictionaryType = None
+
)
+
ipc_port = data_model . property (
+
"ipcPort" , int ,
+
array = False , optional = False ,
+
documentation = """The port used for intra-cluster communication. This will be in the 4000-4100 range. """ ,
+
dictionaryType = None
+
)
+
iscsi_port = data_model . property (
+
"iscsiPort" , int ,
+
array = False , optional = False ,
+
documentation = """The port used for iSCSI traffic. This will only be set if the service type is a transport service. """ ,
+
dictionaryType = None
+
)
+
status = data_model . property (
+
"status" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
started_drive_ids = data_model . property (
+
"startedDriveIDs" , int ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
drive_ids = data_model . property (
+
"driveIDs" , int ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
service_id ,
+
service_type ,
+
node_id ,
+
async_result_ids ,
+
first_time_startup ,
+
ipc_port ,
+
iscsi_port ,
+
status ,
+
started_drive_ids ,
+
drive_ids ,
+
associated_bv = None ,
+
associated_ts = None ,
+
associated_vs = None ,
+
drive_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
+
+
[docs] class VirtualNetworkAddress ( data_model . DataObject ):
+
"""VirtualNetworkAddress
+
+
:param virtual_network_id: [required] SolidFire unique identifier for a virtual network.
+
:type virtual_network_id: int
+
+
:param address: [required] Virtual Network Address.
+
:type address: str
+
+
"""
+
virtual_network_id = data_model . property (
+
"virtualNetworkID" , int ,
+
array = False , optional = False ,
+
documentation = """SolidFire unique identifier for a virtual network. """ ,
+
dictionaryType = None
+
)
+
address = data_model . property (
+
"address" , str ,
+
array = False , optional = False ,
+
documentation = """Virtual Network Address. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
virtual_network_id ,
+
address ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class Node ( data_model . DataObject ):
+
"""Node
+
A node refers to an individual machine in a cluster.
+
Each active node hosts a master service, which is responsible for managing the drives and other services on its node.
+
After a node is made active, its drives will become available for addition to the cluster.
+
+
:param node_id: [required] The unique identifier for this node.
+
:type node_id: int
+
+
:param associated_master_service_id: [required] The master service responsible for controlling other services on this node.
+
:type associated_master_service_id: int
+
+
:param associated_fservice_id: [required]
+
:type associated_fservice_id: int
+
+
:param fibre_channel_target_port_group:
+
:type fibre_channel_target_port_group: str
+
+
:param name: [required]
+
:type name: str
+
+
:param platform_info: [required] Information about the platform this node is.
+
:type platform_info: Platform
+
+
:param software_version: [required] The version of SolidFire software this node is currently running.
+
:type software_version: str
+
+
:param cip: [required] IP address used for both intra- and inter-cluster communication.
+
:type cip: str
+
+
:param cipi: [required] The machine's name for the "cip" interface.
+
:type cipi: str
+
+
:param mip: [required] IP address used for cluster management (hosting the API and web site).
+
:type mip: str
+
+
:param mipi: [required] The machine's name for the "mip" interface.
+
:type mipi: str
+
+
:param sip: [required] IP address used for iSCSI traffic.
+
:type sip: str
+
+
:param sipi: [required] The machine's name for the "sip" interface.
+
:type sipi: str
+
+
:param uuid: [required] UUID of node.
+
:type uuid: UUID
+
+
:param virtual_networks: [required]
+
:type virtual_networks: VirtualNetworkAddress
+
+
:param attributes: [required]
+
:type attributes: dict
+
+
"""
+
node_id = data_model . property (
+
"nodeID" , int ,
+
array = False , optional = False ,
+
documentation = """The unique identifier for this node. """ ,
+
dictionaryType = None
+
)
+
associated_master_service_id = data_model . property (
+
"associatedMasterServiceID" , int ,
+
array = False , optional = False ,
+
documentation = """The master service responsible for controlling other services on this node. """ ,
+
dictionaryType = None
+
)
+
associated_fservice_id = data_model . property (
+
"associatedFServiceID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
fibre_channel_target_port_group = data_model . property (
+
"fibreChannelTargetPortGroup" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
platform_info = data_model . property (
+
"platformInfo" , Platform ,
+
array = False , optional = False ,
+
documentation = """Information about the platform this node is. """ ,
+
dictionaryType = None
+
)
+
software_version = data_model . property (
+
"softwareVersion" , str ,
+
array = False , optional = False ,
+
documentation = """The version of SolidFire software this node is currently running. """ ,
+
dictionaryType = None
+
)
+
cip = data_model . property (
+
"cip" , str ,
+
array = False , optional = False ,
+
documentation = """IP address used for both intra- and inter-cluster communication. """ ,
+
dictionaryType = None
+
)
+
cipi = data_model . property (
+
"cipi" , str ,
+
array = False , optional = False ,
+
documentation = """The machine's name for the "cip" interface. """ ,
+
dictionaryType = None
+
)
+
mip = data_model . property (
+
"mip" , str ,
+
array = False , optional = False ,
+
documentation = """IP address used for cluster management (hosting the API and web site). """ ,
+
dictionaryType = None
+
)
+
mipi = data_model . property (
+
"mipi" , str ,
+
array = False , optional = False ,
+
documentation = """The machine's name for the "mip" interface. """ ,
+
dictionaryType = None
+
)
+
sip = data_model . property (
+
"sip" , str ,
+
array = False , optional = False ,
+
documentation = """IP address used for iSCSI traffic. """ ,
+
dictionaryType = None
+
)
+
sipi = data_model . property (
+
"sipi" , str ,
+
array = False , optional = False ,
+
documentation = """The machine's name for the "sip" interface. """ ,
+
dictionaryType = None
+
)
+
uuid = data_model . property (
+
"uuid" , UUID ,
+
array = False , optional = False ,
+
documentation = """UUID of node. """ ,
+
dictionaryType = None
+
)
+
virtual_networks = data_model . property (
+
"virtualNetworks" , VirtualNetworkAddress ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
node_id ,
+
associated_master_service_id ,
+
associated_fservice_id ,
+
name ,
+
platform_info ,
+
software_version ,
+
cip ,
+
cipi ,
+
mip ,
+
mipi ,
+
sip ,
+
sipi ,
+
uuid ,
+
virtual_networks ,
+
attributes ,
+
fibre_channel_target_port_group = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class Drive ( data_model . DataObject ):
+
"""Drive
+
+
:param drive_id: [required] A unique identifier for this drive.
+
:type drive_id: int
+
+
:param node_id: [required] The node this drive is located. If the drive has been physically removed from the node, this is where it was last seen.
+
:type node_id: int
+
+
:param assigned_service: If this drive is hosting a service, the identifier for that service.
+
:type assigned_service: int
+
+
:param async_result_ids: [required] The list of asynchronous jobs currently running on the drive (for example: a secure erase job).
+
:type async_result_ids: int
+
+
:param capacity: [required] The raw capacity of this drive in bytes.
+
:type capacity: int
+
+
:param serial: [required] The manufacturer's serial number for this drive.
+
:type serial: str
+
+
:param slot: Slot number in the server chassis where this drive is located. If the drive has been physically removed from the node, this will not have a value.
+
:type slot: int
+
+
:param drive_status: [required] The current status of this drive.
+
:type drive_status: str
+
+
:param drive_type: [required] The type of this drive.
+
:type drive_type: str
+
+
:param reserved_slice_file_capacity:
+
:type reserved_slice_file_capacity: int
+
+
:param customer_slice_file_capacity:
+
:type customer_slice_file_capacity: int
+
+
:param attributes: [required] List of Name/Value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
drive_id = data_model . property (
+
"driveID" , int ,
+
array = False , optional = False ,
+
documentation = """A unique identifier for this drive. """ ,
+
dictionaryType = None
+
)
+
node_id = data_model . property (
+
"nodeID" , int ,
+
array = False , optional = False ,
+
documentation = """The node this drive is located. If the drive has been physically removed from the node, this is where it was last seen. """ ,
+
dictionaryType = None
+
)
+
assigned_service = data_model . property (
+
"assignedService" , int ,
+
array = False , optional = True ,
+
documentation = """If this drive is hosting a service, the identifier for that service. """ ,
+
dictionaryType = None
+
)
+
async_result_ids = data_model . property (
+
"asyncResultIDs" , int ,
+
array = True , optional = False ,
+
documentation = """The list of asynchronous jobs currently running on the drive (for example: a secure erase job). """ ,
+
dictionaryType = None
+
)
+
capacity = data_model . property (
+
"capacity" , int ,
+
array = False , optional = False ,
+
documentation = """The raw capacity of this drive in bytes. """ ,
+
dictionaryType = None
+
)
+
serial = data_model . property (
+
"serial" , str ,
+
array = False , optional = False ,
+
documentation = """The manufacturer's serial number for this drive. """ ,
+
dictionaryType = None
+
)
+
slot = data_model . property (
+
"slot" , int ,
+
array = False , optional = True ,
+
documentation = """Slot number in the server chassis where this drive is located. If the drive has been physically removed from the node, this will not have a value. """ ,
+
dictionaryType = None
+
)
+
drive_status = data_model . property (
+
"driveStatus" , str ,
+
array = False , optional = False ,
+
documentation = """The current status of this drive. """ ,
+
dictionaryType = None
+
)
+
drive_type = data_model . property (
+
"driveType" , str ,
+
array = False , optional = False ,
+
documentation = """The type of this drive. """ ,
+
dictionaryType = None
+
)
+
reserved_slice_file_capacity = data_model . property (
+
"reservedSliceFileCapacity" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
customer_slice_file_capacity = data_model . property (
+
"customerSliceFileCapacity" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = False ,
+
documentation = """List of Name/Value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
drive_id ,
+
node_id ,
+
async_result_ids ,
+
capacity ,
+
serial ,
+
drive_status ,
+
drive_type ,
+
attributes ,
+
assigned_service = None ,
+
slot = None ,
+
reserved_slice_file_capacity = None ,
+
customer_slice_file_capacity = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DetailedService ( data_model . DataObject ):
+
"""DetailedService
+
+
:param service: [required]
+
:type service: Service
+
+
:param node: [required]
+
:type node: Node
+
+
:param drive:
+
:type drive: Drive
+
+
:param drives: [required]
+
:type drives: Drive
+
+
"""
+
service = data_model . property (
+
"service" , Service ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
node = data_model . property (
+
"node" , Node ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
drive = data_model . property (
+
"drive" , Drive ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
drives = data_model . property (
+
"drives" , Drive ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
service ,
+
node ,
+
drives ,
+
drive = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListServicesResult ( data_model . DataObject ):
+
"""ListServicesResult
+
+
:param services: [required]
+
:type services: DetailedService
+
+
"""
+
services = data_model . property (
+
"services" , DetailedService ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
services ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyVolumesRequest ( data_model . DataObject ):
+
"""ModifyVolumesRequest
+
ModifyVolumes allows you to configure up to 500 existing volumes at one time. Changes take place immediately.
+
If ModifyVolumes fails to modify any of the specified volumes, none of the specified volumes are changed.
+
If you do not specify QoS values when you modify volumes, the QoS values for each volume remain unchanged.
+
You can retrieve default QoS values for a newly created volume by running the GetDefaultQoS method.
+
When you need to increase the size of volumes that are being replicated, do so in the following order
+
to prevent replication errors:
+
Increase the size of the "Replication Target" volume.
+
Increase the size of the source or "Read / Write" volume.
+
Recommend that both the target and source volumes be the same size.
+
NOTE: If you change access status to locked or replicationTarget all existing iSCSI connections are terminated.
+
+
:param volume_ids: [required] A list of volumeIDs for the volumes to be modified.
+
:type volume_ids: int
+
+
:param account_id: AccountID to which the volume is reassigned. If none is specified, the previous account name is used.
+
:type account_id: int
+
+
:param access: Access allowed for the volume. Possible values:readOnly: Only read operations are allowed.readWrite: Reads and writes are allowed.locked: No reads or writes are allowed.If not specified, the access value does not change.replicationTarget: Identify a volume as the target volume for a paired set of volumes. If the volume is not paired, the access status is locked.If a value is not specified, the access value does not change.
+
:type access: str
+
+
:param qos: New quality of service settings for this volume.If not specified, the QoS settings are not changed.
+
:type qos: QoS
+
+
:param total_size: New size of the volume in bytes. 1000000000 is equal to 1GB. Size is rounded up to the nearest 1MB in size. This parameter can only be used to increase the size of a volume.
+
:type total_size: int
+
+
:param attributes: List of name/value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
volume_ids = data_model . property (
+
"volumeIDs" , int ,
+
array = True , optional = False ,
+
documentation = """A list of volumeIDs for the volumes to be modified. """ ,
+
dictionaryType = None
+
)
+
account_id = data_model . property (
+
"accountID" , int ,
+
array = False , optional = True ,
+
documentation = """AccountID to which the volume is reassigned. If none is specified, the previous account name is used. """ ,
+
dictionaryType = None
+
)
+
access = data_model . property (
+
"access" , str ,
+
array = False , optional = True ,
+
documentation = """Access allowed for the volume. Possible values:readOnly: Only read operations are allowed.readWrite: Reads and writes are allowed.locked: No reads or writes are allowed.If not specified, the access value does not change.replicationTarget: Identify a volume as the target volume for a paired set of volumes. If the volume is not paired, the access status is locked.If a value is not specified, the access value does not change. """ ,
+
dictionaryType = None
+
)
+
qos = data_model . property (
+
"qos" , QoS ,
+
array = False , optional = True ,
+
documentation = """New quality of service settings for this volume.If not specified, the QoS settings are not changed. """ ,
+
dictionaryType = None
+
)
+
total_size = data_model . property (
+
"totalSize" , int ,
+
array = False , optional = True ,
+
documentation = """New size of the volume in bytes. 1000000000 is equal to 1GB. Size is rounded up to the nearest 1MB in size. This parameter can only be used to increase the size of a volume. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name/value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_ids ,
+
account_id = None ,
+
access = None ,
+
qos = None ,
+
total_size = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SnmpSendTestTrapsResult ( data_model . DataObject ):
+
"""SnmpSendTestTrapsResult
+
+
:param status: [required]
+
:type status: str
+
+
"""
+
status = data_model . property (
+
"status" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
status ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class VirtualVolumeHost ( data_model . DataObject ):
+
"""VirtualVolumeHost
+
+
:param virtual_volume_host_id: [required]
+
:type virtual_volume_host_id: UUID
+
+
:param cluster_id: [required]
+
:type cluster_id: UUID
+
+
:param visible_protocol_endpoint_ids: [required]
+
:type visible_protocol_endpoint_ids: UUID
+
+
:param bindings: [required]
+
:type bindings: int
+
+
:param initiator_names: [required]
+
:type initiator_names: str
+
+
:param host_address: [required]
+
:type host_address: str
+
+
"""
+
virtual_volume_host_id = data_model . property (
+
"virtualVolumeHostID" , UUID ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
cluster_id = data_model . property (
+
"clusterID" , UUID ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
visible_protocol_endpoint_ids = data_model . property (
+
"visibleProtocolEndpointIDs" , UUID ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
bindings = data_model . property (
+
"bindings" , int ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
initiator_names = data_model . property (
+
"initiatorNames" , str ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
host_address = data_model . property (
+
"hostAddress" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
virtual_volume_host_id ,
+
cluster_id ,
+
visible_protocol_endpoint_ids ,
+
bindings ,
+
initiator_names ,
+
host_address ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVirtualVolumeHostsResult ( data_model . DataObject ):
+
"""ListVirtualVolumeHostsResult
+
+
:param hosts: [required] List of known ESX hosts.
+
:type hosts: VirtualVolumeHost
+
+
"""
+
hosts = data_model . property (
+
"hosts" , VirtualVolumeHost ,
+
array = True , optional = False ,
+
documentation = """List of known ESX hosts. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
hosts ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DriveHardware ( data_model . DataObject ):
+
"""DriveHardware
+
+
:param canonical_name: [required]
+
:type canonical_name: str
+
+
:param connected: [required]
+
:type connected: bool
+
+
:param dev: [required]
+
:type dev: int
+
+
:param dev_path: [required]
+
:type dev_path: str
+
+
:param drive_type: [required]
+
:type drive_type: str
+
+
:param life_remaining_percent: [required]
+
:type life_remaining_percent: int
+
+
:param lifetime_read_bytes: [required]
+
:type lifetime_read_bytes: int
+
+
:param lifetime_write_bytes: [required]
+
:type lifetime_write_bytes: int
+
+
:param name: [required]
+
:type name: str
+
+
:param path: [required]
+
:type path: str
+
+
:param path_link: [required]
+
:type path_link: str
+
+
:param power_on_hours: [required]
+
:type power_on_hours: int
+
+
:param product: [required]
+
:type product: str
+
+
:param reallocated_sectors: [required]
+
:type reallocated_sectors: int
+
+
:param reserve_capacity_percent: [required]
+
:type reserve_capacity_percent: int
+
+
:param scsi_compat_id: [required]
+
:type scsi_compat_id: str
+
+
:param scsi_state: [required]
+
:type scsi_state: str
+
+
:param security_at_maximum: [required]
+
:type security_at_maximum: bool
+
+
:param security_enabled: [required]
+
:type security_enabled: bool
+
+
:param security_frozen: [required]
+
:type security_frozen: bool
+
+
:param security_locked: [required]
+
:type security_locked: bool
+
+
:param security_supported: [required]
+
:type security_supported: bool
+
+
:param serial: [required]
+
:type serial: str
+
+
:param size: [required]
+
:type size: int
+
+
:param slot: [required]
+
:type slot: int
+
+
:param smart_ssd_write_capable:
+
:type smart_ssd_write_capable: bool
+
+
:param uuid: [required]
+
:type uuid: UUID
+
+
:param vendor: [required]
+
:type vendor: str
+
+
:param version: [required]
+
:type version: str
+
+
"""
+
canonical_name = data_model . property (
+
"canonicalName" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
connected = data_model . property (
+
"connected" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
dev = data_model . property (
+
"dev" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
dev_path = data_model . property (
+
"devPath" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
drive_type = data_model . property (
+
"driveType" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
life_remaining_percent = data_model . property (
+
"lifeRemainingPercent" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
lifetime_read_bytes = data_model . property (
+
"lifetimeReadBytes" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
lifetime_write_bytes = data_model . property (
+
"lifetimeWriteBytes" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
path = data_model . property (
+
"path" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
path_link = data_model . property (
+
"pathLink" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
power_on_hours = data_model . property (
+
"powerOnHours" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
product = data_model . property (
+
"product" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
reallocated_sectors = data_model . property (
+
"reallocatedSectors" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
reserve_capacity_percent = data_model . property (
+
"reserveCapacityPercent" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
scsi_compat_id = data_model . property (
+
"scsiCompatId" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
scsi_state = data_model . property (
+
"scsiState" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
security_at_maximum = data_model . property (
+
"securityAtMaximum" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
security_enabled = data_model . property (
+
"securityEnabled" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
security_frozen = data_model . property (
+
"securityFrozen" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
security_locked = data_model . property (
+
"securityLocked" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
security_supported = data_model . property (
+
"securitySupported" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
serial = data_model . property (
+
"serial" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
size = data_model . property (
+
"size" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
slot = data_model . property (
+
"slot" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
smart_ssd_write_capable = data_model . property (
+
"smartSsdWriteCapable" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
uuid = data_model . property (
+
"uuid" , UUID ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
vendor = data_model . property (
+
"vendor" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
version = data_model . property (
+
"version" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
canonical_name ,
+
connected ,
+
dev ,
+
dev_path ,
+
drive_type ,
+
life_remaining_percent ,
+
lifetime_read_bytes ,
+
lifetime_write_bytes ,
+
name ,
+
path ,
+
path_link ,
+
power_on_hours ,
+
product ,
+
reallocated_sectors ,
+
reserve_capacity_percent ,
+
scsi_compat_id ,
+
scsi_state ,
+
security_at_maximum ,
+
security_enabled ,
+
security_frozen ,
+
security_locked ,
+
security_supported ,
+
serial ,
+
size ,
+
slot ,
+
uuid ,
+
vendor ,
+
version ,
+
smart_ssd_write_capable = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DrivesHardware ( data_model . DataObject ):
+
"""DrivesHardware
+
+
:param drive_hardware: [required]
+
:type drive_hardware: DriveHardware
+
+
"""
+
drive_hardware = data_model . property (
+
"driveHardware" , DriveHardware ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
drive_hardware ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class NodeDriveHardware ( data_model . DataObject ):
+
"""NodeDriveHardware
+
+
:param node_id: [required]
+
:type node_id: int
+
+
:param result: [required]
+
:type result: DrivesHardware
+
+
"""
+
node_id = data_model . property (
+
"nodeID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
result = data_model . property (
+
"result" , DrivesHardware ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
node_id ,
+
result ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListDriveHardwareResult ( data_model . DataObject ):
+
"""ListDriveHardwareResult
+
+
:param nodes: [required]
+
:type nodes: NodeDriveHardware
+
+
"""
+
nodes = data_model . property (
+
"nodes" , NodeDriveHardware ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
nodes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CloneMultipleVolumeParams ( data_model . DataObject ):
+
"""CloneMultipleVolumeParams
+
+
:param volume_id: [required] Required parameter for "volumes" array: volumeID.
+
:type volume_id: int
+
+
:param access: Access settings for the new volume. readOnly: Only read operations are allowed. readWrite: Reads and writes are allowed. locked: No reads or writes are allowed. replicationTarget: Identify a volume as the target volume for a paired set of volumes. If the volume is not paired, the access status is locked. If unspecified, the access settings of the clone will be the same as the source.
+
:type access: str
+
+
:param name: New name for the clone.
+
:type name: str
+
+
:param new_account_id: Account ID for the new volume.
+
:type new_account_id: int
+
+
:param new_size: New size Total size of the volume, in bytes. Size is rounded up to the nearest 1MB size.
+
:type new_size: int
+
+
:param attributes: List of Name/Value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """Required parameter for "volumes" array: volumeID. """ ,
+
dictionaryType = None
+
)
+
access = data_model . property (
+
"access" , str ,
+
array = False , optional = True ,
+
documentation = """Access settings for the new volume. readOnly: Only read operations are allowed. readWrite: Reads and writes are allowed. locked: No reads or writes are allowed. replicationTarget: Identify a volume as the target volume for a paired set of volumes. If the volume is not paired, the access status is locked. If unspecified, the access settings of the clone will be the same as the source. """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = True ,
+
documentation = """New name for the clone. """ ,
+
dictionaryType = None
+
)
+
new_account_id = data_model . property (
+
"newAccountID" , int ,
+
array = False , optional = True ,
+
documentation = """Account ID for the new volume. """ ,
+
dictionaryType = None
+
)
+
new_size = data_model . property (
+
"newSize" , int ,
+
array = False , optional = True ,
+
documentation = """New size Total size of the volume, in bytes. Size is rounded up to the nearest 1MB size. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of Name/Value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_id ,
+
access = None ,
+
name = None ,
+
new_account_id = None ,
+
new_size = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SetSnmpTrapInfoRequest ( data_model . DataObject ):
+
"""SetSnmpTrapInfoRequest
+
You can use SetSnmpTrapInfo to enable and disable the generation of cluster SNMP notifications (traps) and to specify the set of network host computers that receive the notifications. The values you pass with each SetSnmpTrapInfo method call replace all values set in any previous call to SetSnmpTrapInfo.
+
+
:param trap_recipients: [required] List of hosts that are to receive the traps generated by the Cluster Master. At least one object is required if any one of the trap types is enabled.
+
:type trap_recipients: SnmpTrapRecipient
+
+
:param cluster_fault_traps_enabled: [required] If the value is set to true, a corresponding solidFireClusterFaultNotification is sent to the configured list of trap recipients when a cluster fault is logged. The default value is false.
+
:type cluster_fault_traps_enabled: bool
+
+
:param cluster_fault_resolved_traps_enabled: [required] If the value is set to true, a corresponding solidFireClusterFaultResolvedNotification is sent to the configured list of trap recipients when a cluster fault is resolved. The default value is false.
+
:type cluster_fault_resolved_traps_enabled: bool
+
+
:param cluster_event_traps_enabled: [required] If the value is set to true, a corresponding solidFireClusterEventNotification is sent to the configured list of trap recipients when a cluster event is logged. The default value is false.
+
:type cluster_event_traps_enabled: bool
+
+
"""
+
trap_recipients = data_model . property (
+
"trapRecipients" , SnmpTrapRecipient ,
+
array = True , optional = False ,
+
documentation = """List of hosts that are to receive the traps generated by the Cluster Master. At least one object is required if any one of the trap types is enabled. """ ,
+
dictionaryType = None
+
)
+
cluster_fault_traps_enabled = data_model . property (
+
"clusterFaultTrapsEnabled" , bool ,
+
array = False , optional = False ,
+
documentation = """If the value is set to true, a corresponding solidFireClusterFaultNotification is sent to the configured list of trap recipients when a cluster fault is logged. The default value is false. """ ,
+
dictionaryType = None
+
)
+
cluster_fault_resolved_traps_enabled = data_model . property (
+
"clusterFaultResolvedTrapsEnabled" , bool ,
+
array = False , optional = False ,
+
documentation = """If the value is set to true, a corresponding solidFireClusterFaultResolvedNotification is sent to the configured list of trap recipients when a cluster fault is resolved. The default value is false. """ ,
+
dictionaryType = None
+
)
+
cluster_event_traps_enabled = data_model . property (
+
"clusterEventTrapsEnabled" , bool ,
+
array = False , optional = False ,
+
documentation = """If the value is set to true, a corresponding solidFireClusterEventNotification is sent to the configured list of trap recipients when a cluster event is logged. The default value is false. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
trap_recipients ,
+
cluster_fault_traps_enabled ,
+
cluster_fault_resolved_traps_enabled ,
+
cluster_event_traps_enabled ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVolumeStatsRequest ( data_model . DataObject ):
+
"""ListVolumeStatsRequest
+
ListVolumeStats returns high-level activity measurements for a single volume, list of volumes, or all volumes (if you omit the volumeIDs parameter). Measurement values are cumulative from the creation of the volume.
+
+
:param volume_ids: A list of volume IDs of volumes from which to retrieve activity information.
+
:type volume_ids: int
+
+
"""
+
volume_ids = data_model . property (
+
"volumeIDs" , int ,
+
array = True , optional = True ,
+
documentation = """A list of volume IDs of volumes from which to retrieve activity information. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_ids = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CreateVolumeAccessGroupResult ( data_model . DataObject ):
+
"""CreateVolumeAccessGroupResult
+
+
:param volume_access_group_id: [required] The ID for the newly-created volume access group.
+
:type volume_access_group_id: int
+
+
:param volume_access_group:
+
:type volume_access_group: VolumeAccessGroup
+
+
"""
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID for the newly-created volume access group. """ ,
+
dictionaryType = None
+
)
+
volume_access_group = data_model . property (
+
"volumeAccessGroup" , VolumeAccessGroup ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_access_group_id ,
+
volume_access_group = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVolumeStatsResult ( data_model . DataObject ):
+
"""ListVolumeStatsResult
+
+
:param volume_stats: [required] List of volume activity information.
+
:type volume_stats: VolumeStats
+
+
"""
+
volume_stats = data_model . property (
+
"volumeStats" , VolumeStats ,
+
array = True , optional = False ,
+
documentation = """List of volume activity information. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_stats ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class AddedNode ( data_model . DataObject ):
+
"""AddedNode
+
+
:param node_id:
+
:type node_id: int
+
+
:param pending_node_id: [required]
+
:type pending_node_id: int
+
+
:param active_node_key:
+
:type active_node_key: str
+
+
:param assigned_node_id:
+
:type assigned_node_id: int
+
+
:param async_handle:
+
:type async_handle: int
+
+
:param cip:
+
:type cip: str
+
+
:param mip:
+
:type mip: str
+
+
:param platform_info:
+
:type platform_info: Platform
+
+
:param sip:
+
:type sip: str
+
+
:param software_version:
+
:type software_version: str
+
+
"""
+
node_id = data_model . property (
+
"nodeID" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
pending_node_id = data_model . property (
+
"pendingNodeID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
active_node_key = data_model . property (
+
"activeNodeKey" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
assigned_node_id = data_model . property (
+
"assignedNodeID" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
async_handle = data_model . property (
+
"asyncHandle" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
cip = data_model . property (
+
"cip" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
mip = data_model . property (
+
"mip" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
platform_info = data_model . property (
+
"platformInfo" , Platform ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
sip = data_model . property (
+
"sip" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
software_version = data_model . property (
+
"softwareVersion" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
pending_node_id ,
+
node_id = None ,
+
active_node_key = None ,
+
assigned_node_id = None ,
+
async_handle = None ,
+
cip = None ,
+
mip = None ,
+
platform_info = None ,
+
sip = None ,
+
software_version = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class AddNodesResult ( data_model . DataObject ):
+
"""AddNodesResult
+
+
:param auto_install:
+
:type auto_install: bool
+
+
:param nodes: [required] An array of objects mapping the previous "pendingNodeID" to the "nodeID".
+
:type nodes: AddedNode
+
+
"""
+
auto_install = data_model . property (
+
"autoInstall" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
nodes = data_model . property (
+
"nodes" , AddedNode ,
+
array = True , optional = False ,
+
documentation = """An array of objects mapping the previous "pendingNodeID" to the "nodeID". """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
nodes ,
+
auto_install = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class FeatureObject ( data_model . DataObject ):
+
"""FeatureObject
+
+
:param enabled: [required] True if the feature is enabled, otherwise false.
+
:type enabled: bool
+
+
:param feature: [required] The name of the feature.
+
:type feature: str
+
+
"""
+
enabled = data_model . property (
+
"enabled" , bool ,
+
array = False , optional = False ,
+
documentation = """True if the feature is enabled, otherwise false. """ ,
+
dictionaryType = None
+
)
+
feature = data_model . property (
+
"feature" , str ,
+
array = False , optional = False ,
+
documentation = """The name of the feature. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
enabled ,
+
feature ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetFeatureStatusResult ( data_model . DataObject ):
+
"""GetFeatureStatusResult
+
+
:param features: [required] An array of feature objects indicating the feature name and its status.
+
:type features: FeatureObject
+
+
"""
+
features = data_model . property (
+
"features" , FeatureObject ,
+
array = True , optional = False ,
+
documentation = """An array of feature objects indicating the feature name and its status. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
features ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListActivePairedVolumesResult ( data_model . DataObject ):
+
"""ListActivePairedVolumesResult
+
+
:param volumes: [required] Volume information for the paired volumes.
+
:type volumes: Volume
+
+
"""
+
volumes = data_model . property (
+
"volumes" , Volume ,
+
array = True , optional = False ,
+
documentation = """Volume information for the paired volumes. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volumes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class PendingActiveNode ( data_model . DataObject ):
+
"""PendingActiveNode
+
+
:param active_node_key: [required]
+
:type active_node_key: str
+
+
:param assigned_node_id: [required]
+
:type assigned_node_id: int
+
+
:param async_handle: [required]
+
:type async_handle: int
+
+
:param cip: [required]
+
:type cip: str
+
+
:param mip: [required]
+
:type mip: str
+
+
:param pending_node_id: [required]
+
:type pending_node_id: int
+
+
:param platform_info: [required]
+
:type platform_info: Platform
+
+
:param sip: [required]
+
:type sip: str
+
+
:param software_version: [required]
+
:type software_version: str
+
+
"""
+
active_node_key = data_model . property (
+
"activeNodeKey" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
assigned_node_id = data_model . property (
+
"assignedNodeID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
async_handle = data_model . property (
+
"asyncHandle" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
cip = data_model . property (
+
"cip" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
mip = data_model . property (
+
"mip" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
pending_node_id = data_model . property (
+
"pendingNodeID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
platform_info = data_model . property (
+
"platformInfo" , Platform ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
sip = data_model . property (
+
"sip" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
software_version = data_model . property (
+
"softwareVersion" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
active_node_key ,
+
assigned_node_id ,
+
async_handle ,
+
cip ,
+
mip ,
+
pending_node_id ,
+
platform_info ,
+
sip ,
+
software_version ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListPendingActiveNodesResult ( data_model . DataObject ):
+
"""ListPendingActiveNodesResult
+
+
:param pending_active_nodes: [required] List of objects detailing information about all PendingActive nodes in the system.
+
:type pending_active_nodes: PendingActiveNode
+
+
"""
+
pending_active_nodes = data_model . property (
+
"pendingActiveNodes" , PendingActiveNode ,
+
array = True , optional = False ,
+
documentation = """List of objects detailing information about all PendingActive nodes in the system. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
pending_active_nodes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class LoggingServer ( data_model . DataObject ):
+
"""LoggingServer
+
+
:param host: [required] Hostname or IP address of the log server.
+
:type host: str
+
+
:param port: [required] Port number that the log server is listening on.
+
:type port: int
+
+
"""
+
host = data_model . property (
+
"host" , str ,
+
array = False , optional = False ,
+
documentation = """Hostname or IP address of the log server. """ ,
+
dictionaryType = None
+
)
+
port = data_model . property (
+
"port" , int ,
+
array = False , optional = False ,
+
documentation = """Port number that the log server is listening on. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
host ,
+
port ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ResetNodeRequest ( data_model . DataObject ):
+
"""ResetNodeRequest
+
The ResetNode API method enables you to reset a node to the factory settings. All data, packages (software upgrades, and so on),
+
configurations, and log files are deleted from the node when you call this method. However, network settings for the node are
+
preserved during this operation. Nodes that are participating in a cluster cannot be reset to the factory settings.
+
The ResetNode API can only be used on nodes that are in an "Available" state. It cannot be used on nodes that are "Active" in a
+
cluster, or in a "Pending" state.
+
Caution: This method clears any data that is on the node. Exercise caution when using this method.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
+
:param build: [required] Specifies the URL to a remote Element software image to which the node will be reset.
+
:type build: str
+
+
:param force: [required] Required parameter to successfully reset the node.
+
:type force: bool
+
+
"""
+
build = data_model . property (
+
"build" , str ,
+
array = False , optional = False ,
+
documentation = """Specifies the URL to a remote Element software image to which the node will be reset. """ ,
+
dictionaryType = None
+
)
+
force = data_model . property (
+
"force" , bool ,
+
array = False , optional = False ,
+
documentation = """Required parameter to successfully reset the node. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
build ,
+
force ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ClusterAdmin ( data_model . DataObject ):
+
"""ClusterAdmin
+
+
:param auth_method: [required]
+
:type auth_method: str
+
+
:param access: [required]
+
:type access: str
+
+
:param cluster_admin_id: [required]
+
:type cluster_admin_id: int
+
+
:param username: [required]
+
:type username: str
+
+
:param attributes: List of Name/Value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
auth_method = data_model . property (
+
"authMethod" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
access = data_model . property (
+
"access" , str ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
cluster_admin_id = data_model . property (
+
"clusterAdminID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
username = data_model . property (
+
"username" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of Name/Value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
auth_method ,
+
access ,
+
cluster_admin_id ,
+
username ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListClusterAdminsResult ( data_model . DataObject ):
+
"""ListClusterAdminsResult
+
+
:param cluster_admins: [required] Information about the cluster admin.
+
:type cluster_admins: ClusterAdmin
+
+
"""
+
cluster_admins = data_model . property (
+
"clusterAdmins" , ClusterAdmin ,
+
array = True , optional = False ,
+
documentation = """Information about the cluster admin. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
cluster_admins ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SyncJob ( data_model . DataObject ):
+
"""SyncJob
+
+
:param bytes_per_second: [required]
+
:type bytes_per_second: float
+
+
:param current_bytes: [required]
+
:type current_bytes: int
+
+
:param dst_service_id: [required]
+
:type dst_service_id: int
+
+
:param elapsed_time: [required]
+
:type elapsed_time: float
+
+
:param percent_complete: [required]
+
:type percent_complete: float
+
+
:param remaining_time: [required]
+
:type remaining_time: float
+
+
:param slice_id: [required]
+
:type slice_id: int
+
+
:param src_service_id: [required]
+
:type src_service_id: int
+
+
:param total_bytes: [required]
+
:type total_bytes: int
+
+
:param type: [required]
+
:type type: str
+
+
:param clone_id: [required]
+
:type clone_id: int
+
+
:param dst_volume_id: [required]
+
:type dst_volume_id: int
+
+
:param node_id: [required]
+
:type node_id: int
+
+
:param snapshot_id: [required]
+
:type snapshot_id: int
+
+
:param src_volume_id: [required]
+
:type src_volume_id: int
+
+
:param blocks_per_second: [required]
+
:type blocks_per_second: float
+
+
:param stage: [required]
+
:type stage: str
+
+
"""
+
bytes_per_second = data_model . property (
+
"bytesPerSecond" , float ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
current_bytes = data_model . property (
+
"currentBytes" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
dst_service_id = data_model . property (
+
"dstServiceID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
elapsed_time = data_model . property (
+
"elapsedTime" , float ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
percent_complete = data_model . property (
+
"percentComplete" , float ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
remaining_time = data_model . property (
+
"remainingTime" , float ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
slice_id = data_model . property (
+
"sliceID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
src_service_id = data_model . property (
+
"srcServiceID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
total_bytes = data_model . property (
+
"totalBytes" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
type = data_model . property (
+
"type" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
clone_id = data_model . property (
+
"cloneID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
dst_volume_id = data_model . property (
+
"dstVolumeID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
node_id = data_model . property (
+
"nodeID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
src_volume_id = data_model . property (
+
"srcVolumeID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
blocks_per_second = data_model . property (
+
"blocksPerSecond" , float ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
stage = data_model . property (
+
"stage" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
bytes_per_second ,
+
current_bytes ,
+
dst_service_id ,
+
elapsed_time ,
+
percent_complete ,
+
remaining_time ,
+
slice_id ,
+
src_service_id ,
+
total_bytes ,
+
type ,
+
clone_id ,
+
dst_volume_id ,
+
node_id ,
+
snapshot_id ,
+
src_volume_id ,
+
blocks_per_second ,
+
stage ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListSyncJobsResult ( data_model . DataObject ):
+
"""ListSyncJobsResult
+
+
:param sync_jobs: [required]
+
:type sync_jobs: SyncJob
+
+
"""
+
sync_jobs = data_model . property (
+
"syncJobs" , SyncJob ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
sync_jobs ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DisableLdapAuthenticationResult ( data_model . DataObject ):
+
"""DisableLdapAuthenticationResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SetSnmpInfoRequest ( data_model . DataObject ):
+
"""SetSnmpInfoRequest
+
SetSnmpInfo enables you to configure SNMP version 2 and version 3 on cluster nodes. The values you set with this interface apply to
+
all nodes in the cluster, and the values that are passed replace, in whole, all values set in any previous call to SetSnmpInfo.
+
Note: SetSnmpInfo is deprecated. Use the EnableSnmp and SetSnmpACL methods instead.
+
+
:param networks: List of networks and what type of access they have to the SNMP servers running on the cluster nodes. See the SNMP Network Object for possible "networks" values. This parameter is required only for SNMP v2.
+
:type networks: SnmpNetwork
+
+
:param enabled: If set to true, SNMP is enabled on each node in the cluster.
+
:type enabled: bool
+
+
:param snmp_v3_enabled: If set to true, SNMP v3 is enabled on each node in the cluster.
+
:type snmp_v3_enabled: bool
+
+
:param usm_users: If SNMP v3 is enabled, this value must be passed in place of the networks parameter. This parameter is required only for SNMP v3.
+
:type usm_users: SnmpV3UsmUser
+
+
"""
+
networks = data_model . property (
+
"networks" , SnmpNetwork ,
+
array = True , optional = True ,
+
documentation = """List of networks and what type of access they have to the SNMP servers running on the cluster nodes. See the SNMP Network Object for possible "networks" values. This parameter is required only for SNMP v2. """ ,
+
dictionaryType = None
+
)
+
enabled = data_model . property (
+
"enabled" , bool ,
+
array = False , optional = True ,
+
documentation = """If set to true, SNMP is enabled on each node in the cluster. """ ,
+
dictionaryType = None
+
)
+
snmp_v3_enabled = data_model . property (
+
"snmpV3Enabled" , bool ,
+
array = False , optional = True ,
+
documentation = """If set to true, SNMP v3 is enabled on each node in the cluster. """ ,
+
dictionaryType = None
+
)
+
usm_users = data_model . property (
+
"usmUsers" , SnmpV3UsmUser ,
+
array = True , optional = True ,
+
documentation = """If SNMP v3 is enabled, this value must be passed in place of the networks parameter. This parameter is required only for SNMP v3. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
networks = None ,
+
enabled = None ,
+
snmp_v3_enabled = None ,
+
usm_users = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetNodeStatsRequest ( data_model . DataObject ):
+
"""GetNodeStatsRequest
+
GetNodeStats enables you to retrieve the high-level activity measurements for a single node.
+
+
:param node_id: [required] Specifies the node for which statistics are gathered.
+
:type node_id: int
+
+
"""
+
node_id = data_model . property (
+
"nodeID" , int ,
+
array = False , optional = False ,
+
documentation = """Specifies the node for which statistics are gathered. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
node_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetBackupTargetRequest ( data_model . DataObject ):
+
"""GetBackupTargetRequest
+
GetBackupTarget enables you to return information about a specific backup target that you have created.
+
+
:param backup_target_id: [required] The unique identifier assigned to the backup target.
+
:type backup_target_id: int
+
+
"""
+
backup_target_id = data_model . property (
+
"backupTargetID" , int ,
+
array = False , optional = False ,
+
documentation = """The unique identifier assigned to the backup target. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
backup_target_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SetLoginSessionInfoResult ( data_model . DataObject ):
+
"""SetLoginSessionInfoResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CompleteClusterPairingResult ( data_model . DataObject ):
+
"""CompleteClusterPairingResult
+
+
:param cluster_pair_id: [required] Unique identifier for the cluster pair.
+
:type cluster_pair_id: int
+
+
"""
+
cluster_pair_id = data_model . property (
+
"clusterPairID" , int ,
+
array = False , optional = False ,
+
documentation = """Unique identifier for the cluster pair. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
cluster_pair_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetDriveHardwareInfoRequest ( data_model . DataObject ):
+
"""GetDriveHardwareInfoRequest
+
GetDriveHardwareInfo returns all the hardware information for the given drive. This generally includes details about manufacturers, vendors, versions, and
+
other associated hardware identification information.
+
+
:param drive_id: [required] DriveID for the drive information requested. You can get DriveIDs by using the ListDrives method.
+
:type drive_id: int
+
+
"""
+
drive_id = data_model . property (
+
"driveID" , int ,
+
array = False , optional = False ,
+
documentation = """DriveID for the drive information requested. You can get DriveIDs by using the ListDrives method. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
drive_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class TestConnectSvipDetails ( data_model . DataObject ):
+
"""TestConnectSvipDetails
+
+
:param ping_bytes: [required] Details of the ping tests with 56 Bytes and 1500 Bytes.
+
:type ping_bytes: dict
+
+
:param svip: [required] The SVIP tested against.
+
:type svip: str
+
+
:param connected: [required] Whether the test could connect to the MVIP.
+
:type connected: bool
+
+
"""
+
ping_bytes = data_model . property (
+
"pingBytes" , dict ,
+
array = False , optional = False ,
+
documentation = """Details of the ping tests with 56 Bytes and 1500 Bytes. """ ,
+
dictionaryType = None
+
)
+
svip = data_model . property (
+
"svip" , str ,
+
array = False , optional = False ,
+
documentation = """The SVIP tested against. """ ,
+
dictionaryType = None
+
)
+
connected = data_model . property (
+
"connected" , bool ,
+
array = False , optional = False ,
+
documentation = """Whether the test could connect to the MVIP. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
ping_bytes ,
+
svip ,
+
connected ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class TestConnectSvipResult ( data_model . DataObject ):
+
"""TestConnectSvipResult
+
+
:param details: [required] Information about the test operation
+
:type details: TestConnectSvipDetails
+
+
:param duration: [required] The length of time required to run the test.
+
:type duration: str
+
+
:param result: [required] The results of the entire test
+
:type result: str
+
+
"""
+
details = data_model . property (
+
"details" , TestConnectSvipDetails ,
+
array = False , optional = False ,
+
documentation = """Information about the test operation """ ,
+
dictionaryType = None
+
)
+
duration = data_model . property (
+
"duration" , str ,
+
array = False , optional = False ,
+
documentation = """The length of time required to run the test. """ ,
+
dictionaryType = None
+
)
+
result = data_model . property (
+
"result" , str ,
+
array = False , optional = False ,
+
documentation = """The results of the entire test """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
details ,
+
duration ,
+
result ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CloneVolumeResult ( data_model . DataObject ):
+
"""CloneVolumeResult
+
+
:param volume: The resulting volume
+
:type volume: Volume
+
+
:param clone_id: [required] The ID of the newly-created clone.
+
:type clone_id: int
+
+
:param volume_id: [required] The volume ID of the newly-created clone.
+
:type volume_id: int
+
+
:param async_handle: [required] Handle value used to track the progress of the clone.
+
:type async_handle: int
+
+
"""
+
volume = data_model . property (
+
"volume" , Volume ,
+
array = False , optional = True ,
+
documentation = """The resulting volume """ ,
+
dictionaryType = None
+
)
+
clone_id = data_model . property (
+
"cloneID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the newly-created clone. """ ,
+
dictionaryType = None
+
)
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """The volume ID of the newly-created clone. """ ,
+
dictionaryType = None
+
)
+
async_handle = data_model . property (
+
"asyncHandle" , int ,
+
array = False , optional = False ,
+
documentation = """Handle value used to track the progress of the clone. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
clone_id ,
+
volume_id ,
+
async_handle ,
+
volume = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class RemoveNodesResult ( data_model . DataObject ):
+
"""RemoveNodesResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyInitiatorsRequest ( data_model . DataObject ):
+
"""ModifyInitiatorsRequest
+
ModifyInitiators enables you to change the attributes of one or more existing initiators. You cannot change the name of an existing
+
initiator. If you need to change the name of an initiator, delete it first with DeleteInitiators and create a new one with
+
CreateInitiators.
+
If ModifyInitiators fails to change one of the initiators provided in the parameter, the method returns an error and does not modify
+
any initiators (no partial completion is possible).
+
+
:param initiators: [required] A list of objects containing characteristics of each initiator to modify. Values are: initiatorID: (Required) The ID of the initiator to modify. (Integer) alias: (Optional) A new friendly name to assign to the initiator. (String) attributes: (Optional) A new set of JSON attributes to assign to the initiator. (JSON Object) volumeAccessGroupID: (Optional) The ID of the volume access group into to which the initiator should be added. If the initiator was previously in a different volume access group, it is removed from the old volume access group. If this key is present but null, the initiator is removed from its current volume access group, but not placed in any new volume access group. (Integer)
+
:type initiators: ModifyInitiator
+
+
"""
+
initiators = data_model . property (
+
"initiators" , ModifyInitiator ,
+
array = True , optional = False ,
+
documentation = """A list of objects containing characteristics of each initiator to modify. Values are: initiatorID: (Required) The ID of the initiator to modify. (Integer) alias: (Optional) A new friendly name to assign to the initiator. (String) attributes: (Optional) A new set of JSON attributes to assign to the initiator. (JSON Object) volumeAccessGroupID: (Optional) The ID of the volume access group into to which the initiator should be added. If the initiator was previously in a different volume access group, it is removed from the old volume access group. If this key is present but null, the initiator is removed from its current volume access group, but not placed in any new volume access group. (Integer) """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
initiators ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class PendingNode ( data_model . DataObject ):
+
"""PendingNode
+
A "pending node" is one that has not yet joined the cluster.
+
It can be added to a cluster using the AddNode method.
+
+
:param pending_node_id: [required]
+
:type pending_node_id: int
+
+
:param assigned_node_id: [required]
+
:type assigned_node_id: int
+
+
:param name: [required] The host name for this node.
+
:type name: str
+
+
:param compatible: [required]
+
:type compatible: bool
+
+
:param platform_info: [required] Information about the platform this node is.
+
:type platform_info: Platform
+
+
:param cip: [required] IP address used for both intra- and inter-cluster communication.
+
:type cip: str
+
+
:param cipi: [required] The machine's name for the "cip" interface.
+
:type cipi: str
+
+
:param mip: [required] IP address used for cluster management (hosting the API and web site).
+
:type mip: str
+
+
:param mipi: [required] The machine's name for the "mip" interface.
+
:type mipi: str
+
+
:param sip: [required] IP address used for iSCSI traffic.
+
:type sip: str
+
+
:param sipi: [required] The machine's name for the "sip" interface.
+
:type sipi: str
+
+
:param software_version: [required] The version of SolidFire software this node is currently running.
+
:type software_version: str
+
+
:param uuid: [required] UUID of node.
+
:type uuid: UUID
+
+
"""
+
pending_node_id = data_model . property (
+
"pendingNodeID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
assigned_node_id = data_model . property (
+
"assignedNodeID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """The host name for this node. """ ,
+
dictionaryType = None
+
)
+
compatible = data_model . property (
+
"compatible" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
platform_info = data_model . property (
+
"platformInfo" , Platform ,
+
array = False , optional = False ,
+
documentation = """Information about the platform this node is. """ ,
+
dictionaryType = None
+
)
+
cip = data_model . property (
+
"cip" , str ,
+
array = False , optional = False ,
+
documentation = """IP address used for both intra- and inter-cluster communication. """ ,
+
dictionaryType = None
+
)
+
cipi = data_model . property (
+
"cipi" , str ,
+
array = False , optional = False ,
+
documentation = """The machine's name for the "cip" interface. """ ,
+
dictionaryType = None
+
)
+
mip = data_model . property (
+
"mip" , str ,
+
array = False , optional = False ,
+
documentation = """IP address used for cluster management (hosting the API and web site). """ ,
+
dictionaryType = None
+
)
+
mipi = data_model . property (
+
"mipi" , str ,
+
array = False , optional = False ,
+
documentation = """The machine's name for the "mip" interface. """ ,
+
dictionaryType = None
+
)
+
sip = data_model . property (
+
"sip" , str ,
+
array = False , optional = False ,
+
documentation = """IP address used for iSCSI traffic. """ ,
+
dictionaryType = None
+
)
+
sipi = data_model . property (
+
"sipi" , str ,
+
array = False , optional = False ,
+
documentation = """The machine's name for the "sip" interface. """ ,
+
dictionaryType = None
+
)
+
software_version = data_model . property (
+
"softwareVersion" , str ,
+
array = False , optional = False ,
+
documentation = """The version of SolidFire software this node is currently running. """ ,
+
dictionaryType = None
+
)
+
uuid = data_model . property (
+
"uuid" , UUID ,
+
array = False , optional = False ,
+
documentation = """UUID of node. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
pending_node_id ,
+
assigned_node_id ,
+
name ,
+
compatible ,
+
platform_info ,
+
cip ,
+
cipi ,
+
mip ,
+
mipi ,
+
sip ,
+
sipi ,
+
software_version ,
+
uuid ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListPendingNodesResult ( data_model . DataObject ):
+
"""ListPendingNodesResult
+
+
:param pending_nodes: [required]
+
:type pending_nodes: PendingNode
+
+
"""
+
pending_nodes = data_model . property (
+
"pendingNodes" , PendingNode ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
pending_nodes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CreateInitiator ( data_model . DataObject ):
+
"""CreateInitiator
+
Object containing characteristics of each new initiator.
+
+
:param name: [required] (Required) The name of the initiator (IQN or WWPN) to create. (String)
+
:type name: str
+
+
:param alias: (Optional) The friendly name to assign to this initiator. (String)
+
:type alias: str
+
+
:param volume_access_group_id: (Optional) The ID of the volume access group to which this newly created initiator will be added. (Integer)
+
:type volume_access_group_id: int
+
+
:param attributes: (Optional) A set of JSON attributes assigned to this initiator. (JSON Object)
+
:type attributes: dict
+
+
"""
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """(Required) The name of the initiator (IQN or WWPN) to create. (String) """ ,
+
dictionaryType = None
+
)
+
alias = data_model . property (
+
"alias" , str ,
+
array = False , optional = True ,
+
documentation = """(Optional) The friendly name to assign to this initiator. (String) """ ,
+
dictionaryType = None
+
)
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
+
array = False , optional = True ,
+
documentation = """(Optional) The ID of the volume access group to which this newly created initiator will be added. (Integer) """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """(Optional) A set of JSON attributes assigned to this initiator. (JSON Object) """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
name ,
+
alias = None ,
+
volume_access_group_id = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CreateInitiatorsRequest ( data_model . DataObject ):
+
"""CreateInitiatorsRequest
+
CreateInitiators enables you to create multiple new initiator IQNs or World Wide Port Names (WWPNs) and optionally assign them
+
aliases and attributes. When you use CreateInitiators to create new initiators, you can also add them to volume access groups.
+
If CreateInitiators fails to create one of the initiators provided in the parameter, the method returns an error and does not create
+
any initiators (no partial completion is possible).
+
+
:param initiators: [required] A list of objects containing characteristics of each new initiator. Values are: name: (Required) The name of the initiator (IQN or WWPN) to create. (String) alias: (Optional) The friendly name to assign to this initiator. (String) attributes: (Optional) A set of JSON attributes to assign to this initiator. (JSON Object) volumeAccessGroupID: (Optional) The ID of the volume access group into to which this newly created initiator will be added. (Integer)
+
:type initiators: CreateInitiator
+
+
"""
+
initiators = data_model . property (
+
"initiators" , CreateInitiator ,
+
array = True , optional = False ,
+
documentation = """A list of objects containing characteristics of each new initiator. Values are: name: (Required) The name of the initiator (IQN or WWPN) to create. (String) alias: (Optional) The friendly name to assign to this initiator. (String) attributes: (Optional) A set of JSON attributes to assign to this initiator. (JSON Object) volumeAccessGroupID: (Optional) The ID of the volume access group into to which this newly created initiator will be added. (Integer) """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
initiators ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class NodeWaitingToJoin ( data_model . DataObject ):
+
"""NodeWaitingToJoin
+
+
:param name:
+
:type name: str
+
+
:param version: [required]
+
:type version: str
+
+
:param node_id:
+
:type node_id: int
+
+
:param pending_node_id:
+
:type pending_node_id: int
+
+
:param mip:
+
:type mip: str
+
+
:param cip:
+
:type cip: str
+
+
:param sip:
+
:type sip: str
+
+
:param compatible: [required]
+
:type compatible: bool
+
+
:param chassis_type:
+
:type chassis_type: str
+
+
:param hostname:
+
:type hostname: str
+
+
:param node_type:
+
:type node_type: str
+
+
"""
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
version = data_model . property (
+
"version" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
node_id = data_model . property (
+
"nodeID" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
pending_node_id = data_model . property (
+
"pendingNodeID" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
mip = data_model . property (
+
"mip" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
cip = data_model . property (
+
"cip" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
sip = data_model . property (
+
"sip" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
compatible = data_model . property (
+
"compatible" , bool ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
chassis_type = data_model . property (
+
"chassisType" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
hostname = data_model . property (
+
"hostname" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
node_type = data_model . property (
+
"nodeType" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
version ,
+
compatible ,
+
name = None ,
+
node_id = None ,
+
pending_node_id = None ,
+
mip = None ,
+
cip = None ,
+
sip = None ,
+
chassis_type = None ,
+
hostname = None ,
+
node_type = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetBootstrapConfigResult ( data_model . DataObject ):
+
"""GetBootstrapConfigResult
+
+
:param cluster_name: [required] Name of the cluster.
+
:type cluster_name: str
+
+
:param node_name: [required] Name of the node.
+
:type node_name: str
+
+
:param nodes: [required] List of descriptions for each node that is actively waiting to join this cluster: compatible - Indicates if the listed node is compatible with the node the API call was executed against. name - IP address of each node. version - version of SolidFire Element software currently installed on the node.
+
:type nodes: NodeWaitingToJoin
+
+
:param version: [required] Version of the SolidFire Element software currently installed.
+
:type version: str
+
+
"""
+
cluster_name = data_model . property (
+
"clusterName" , str ,
+
array = False , optional = False ,
+
documentation = """Name of the cluster. """ ,
+
dictionaryType = None
+
)
+
node_name = data_model . property (
+
"nodeName" , str ,
+
array = False , optional = False ,
+
documentation = """Name of the node. """ ,
+
dictionaryType = None
+
)
+
nodes = data_model . property (
+
"nodes" , NodeWaitingToJoin ,
+
array = True , optional = False ,
+
documentation = """List of descriptions for each node that is actively waiting to join this cluster: compatible - Indicates if the listed node is compatible with the node the API call was executed against. name - IP address of each node. version - version of SolidFire Element software currently installed on the node. """ ,
+
dictionaryType = None
+
)
+
version = data_model . property (
+
"version" , str ,
+
array = False , optional = False ,
+
documentation = """Version of the SolidFire Element software currently installed. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
cluster_name ,
+
node_name ,
+
nodes ,
+
version ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class AddDrivesRequest ( data_model . DataObject ):
+
"""AddDrivesRequest
+
AddDrives enables you to add one or more available drives to the cluster, enabling the drives to host a portion of the cluster's data.
+
When you add a node to the cluster or install new drives in an existing node, the new drives are marked as "available" and must be
+
added via AddDrives before they can be utilized. Use the ListDrives method to display drives that are "available" to be added. When
+
you add multiple drives, it is more efficient to add them in a single AddDrives method call rather than multiple individual methods
+
with a single drive each. This reduces the amount of data balancing that must occur to stabilize the storage load on the cluster.
+
When you add a drive, the system automatically determines the "type" of drive it should be.
+
The method is asynchronous and returns immediately. However, it can take some time for the data in the cluster to be rebalanced
+
using the newly added drives. As the new drives are syncing on the system, you can use the ListSyncJobs method to see how the
+
drives are being rebalanced and the progress of adding the new drive. You can also use the GetAsyncResult method to query the
+
method's returned asyncHandle.
+
+
:param drives: [required] Returns information about each drive to be added to the cluster. Possible values are: driveID: The ID of the drive to add. (Integer) type: (Optional) The type of drive to add. Valid values are "slice" or "block". If omitted, the system assigns the correct type. (String)
+
:type drives: NewDrive
+
+
:param force_during_upgrade: Allows the user to force the addition of drives during an upgrade.
+
:type force_during_upgrade: bool
+
+
"""
+
drives = data_model . property (
+
"drives" , NewDrive ,
+
array = True , optional = False ,
+
documentation = """Returns information about each drive to be added to the cluster. Possible values are: driveID: The ID of the drive to add. (Integer) type: (Optional) The type of drive to add. Valid values are "slice" or "block". If omitted, the system assigns the correct type. (String) """ ,
+
dictionaryType = None
+
)
+
force_during_upgrade = data_model . property (
+
"forceDuringUpgrade" , bool ,
+
array = False , optional = True ,
+
documentation = """Allows the user to force the addition of drives during an upgrade. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
drives ,
+
force_during_upgrade = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class RemoveVolumePairRequest ( data_model . DataObject ):
+
"""RemoveVolumePairRequest
+
RemoveVolumePair enables you to remove the remote pairing between two volumes. Use this method on both the source and target volumes that are paired together. When you remove the volume pairing information, data is no longer replicated to or from the volume.
+
+
:param volume_id: [required] The ID of the volume on which to stop the replication process.
+
:type volume_id: int
+
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the volume on which to stop the replication process. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetVolumeAccessGroupLunAssignmentsResult ( data_model . DataObject ):
+
"""GetVolumeAccessGroupLunAssignmentsResult
+
+
:param volume_access_group_lun_assignments: [required] List of all physical Fibre Channel ports, or a port for a single node.
+
:type volume_access_group_lun_assignments: VolumeAccessGroupLunAssignments
+
+
"""
+
volume_access_group_lun_assignments = data_model . property (
+
"volumeAccessGroupLunAssignments" , VolumeAccessGroupLunAssignments ,
+
array = False , optional = False ,
+
documentation = """List of all physical Fibre Channel ports, or a port for a single node. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_access_group_lun_assignments ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class EnableLdapAuthenticationRequest ( data_model . DataObject ):
+
"""EnableLdapAuthenticationRequest
+
The EnableLdapAuthentication method enables you to configure an LDAP directory connection to use for LDAP authentication to a cluster. Users that are members of the LDAP directory can then log in to the storage system using their LDAP credentials.
+
+
:param auth_type: Identifies which user authentication method to use. Must be one of the following: DirectBind SearchAndBind
+
:type auth_type: str
+
+
:param group_search_base_dn: The base DN of the tree to start the group search (will do a subtree search from here).
+
:type group_search_base_dn: str
+
+
:param group_search_custom_filter: For use with the CustomFilter search type, an LDAP filter to use to return the DNs of a users groups. The string can have placeholder text of %USERNAME% and %USERDN% to be replaced with their username and full userDN as needed.
+
:type group_search_custom_filter: str
+
+
:param group_search_type: Controls the default group search filter used, and must be one of the following: NoGroups: No group support. ActiveDirectory: Nested membership of all of a users AD groups. MemberDN: MemberDN style groups (single level).
+
:type group_search_type: str
+
+
:param search_bind_dn: A fully qualified DN to log in with to perform an LDAP search for the user (needs read access to the LDAP directory).
+
:type search_bind_dn: str
+
+
:param search_bind_password: The password for the searchBindDN account used for searching.
+
:type search_bind_password: str
+
+
:param server_uris: [required] A comma-separated list of LDAP server URIs (examples: "ldap://1.2.3.4" and ldaps://1.2.3.4:123")
+
:type server_uris: str
+
+
:param user_dntemplate: A string that is used to form a fully qualified user DN. The string should have the placeholder text %USERNAME%, which is replaced with the username of the authenticating user.
+
:type user_dntemplate: str
+
+
:param user_search_base_dn: The base DN of the tree to start the search (will do a subtree search from here).
+
:type user_search_base_dn: str
+
+
:param user_search_filter: The LDAP filter to use. The string should have the placeholder text %USERNAME% which is replaced with the username of the authenticating user. Example: (&(objectClass=person)(sAMAccountName=%USERNAME%)) will use the sAMAccountName field in Active Directory to match the username entered at cluster login.
+
:type user_search_filter: str
+
+
"""
+
auth_type = data_model . property (
+
"authType" , str ,
+
array = False , optional = True ,
+
documentation = """Identifies which user authentication method to use. Must be one of the following: DirectBind SearchAndBind """ ,
+
dictionaryType = None
+
)
+
group_search_base_dn = data_model . property (
+
"groupSearchBaseDN" , str ,
+
array = False , optional = True ,
+
documentation = """The base DN of the tree to start the group search (will do a subtree search from here). """ ,
+
dictionaryType = None
+
)
+
group_search_custom_filter = data_model . property (
+
"groupSearchCustomFilter" , str ,
+
array = False , optional = True ,
+
documentation = """For use with the CustomFilter search type, an LDAP filter to use to return the DNs of a users groups. The string can have placeholder text of %USERNAME% and %USERDN% to be replaced with their username and full userDN as needed. """ ,
+
dictionaryType = None
+
)
+
group_search_type = data_model . property (
+
"groupSearchType" , str ,
+
array = False , optional = True ,
+
documentation = """Controls the default group search filter used, and must be one of the following: NoGroups: No group support. ActiveDirectory: Nested membership of all of a users AD groups. MemberDN: MemberDN style groups (single level). """ ,
+
dictionaryType = None
+
)
+
search_bind_dn = data_model . property (
+
"searchBindDN" , str ,
+
array = False , optional = True ,
+
documentation = """A fully qualified DN to log in with to perform an LDAP search for the user (needs read access to the LDAP directory). """ ,
+
dictionaryType = None
+
)
+
search_bind_password = data_model . property (
+
"searchBindPassword" , str ,
+
array = False , optional = True ,
+
documentation = """The password for the searchBindDN account used for searching. """ ,
+
dictionaryType = None
+
)
+
server_uris = data_model . property (
+
"serverURIs" , str ,
+
array = True , optional = False ,
+
documentation = """A comma-separated list of LDAP server URIs (examples: "ldap://1.2.3.4" and ldaps://1.2.3.4:123") """ ,
+
dictionaryType = None
+
)
+
user_dntemplate = data_model . property (
+
"userDNTemplate" , str ,
+
array = False , optional = True ,
+
documentation = """A string that is used to form a fully qualified user DN. The string should have the placeholder text %USERNAME%, which is replaced with the username of the authenticating user. """ ,
+
dictionaryType = None
+
)
+
user_search_base_dn = data_model . property (
+
"userSearchBaseDN" , str ,
+
array = False , optional = True ,
+
documentation = """The base DN of the tree to start the search (will do a subtree search from here). """ ,
+
dictionaryType = None
+
)
+
user_search_filter = data_model . property (
+
"userSearchFilter" , str ,
+
array = False , optional = True ,
+
documentation = """The LDAP filter to use. The string should have the placeholder text %USERNAME% which is replaced with the username of the authenticating user. Example: (&(objectClass=person)(sAMAccountName=%USERNAME%)) will use the sAMAccountName field in Active Directory to match the username entered at cluster login. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
server_uris ,
+
auth_type = None ,
+
group_search_base_dn = None ,
+
group_search_custom_filter = None ,
+
group_search_type = None ,
+
search_bind_dn = None ,
+
search_bind_password = None ,
+
user_dntemplate = None ,
+
user_search_base_dn = None ,
+
user_search_filter = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyClusterAdminRequest ( data_model . DataObject ):
+
"""ModifyClusterAdminRequest
+
You can use ModifyClusterAdmin to change the settings for a cluster admin or LDAP cluster admin. You cannot change access for the administrator cluster admin account.
+
+
:param cluster_admin_id: [required] ClusterAdminID for the cluster admin or LDAP cluster admin to modify.
+
:type cluster_admin_id: int
+
+
:param password: Password used to authenticate this cluster admin.
+
:type password: str
+
+
:param access: Controls which methods this cluster admin can use. For more details, see Access Control in the Element API Reference Guide.
+
:type access: str
+
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
cluster_admin_id = data_model . property (
+
"clusterAdminID" , int ,
+
array = False , optional = False ,
+
documentation = """ClusterAdminID for the cluster admin or LDAP cluster admin to modify. """ ,
+
dictionaryType = None
+
)
+
password = data_model . property (
+
"password" , str ,
+
array = False , optional = True ,
+
documentation = """Password used to authenticate this cluster admin. """ ,
+
dictionaryType = None
+
)
+
access = data_model . property (
+
"access" , str ,
+
array = True , optional = True ,
+
documentation = """Controls which methods this cluster admin can use. For more details, see Access Control in the Element API Reference Guide. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
cluster_admin_id ,
+
password = None ,
+
access = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListActivePairedVolumesRequest ( data_model . DataObject ):
+
"""ListActivePairedVolumesRequest
+
ListActivePairedVolumes enables you to list all the active volumes paired with a volume. This method returns information about volumes with active and pending pairings.
+
+
:param start_volume_id: The beginning of the range of active paired volumes to return.
+
:type start_volume_id: int
+
+
:param limit: Maximum number of active paired volumes to return.
+
:type limit: int
+
+
"""
+
start_volume_id = data_model . property (
+
"startVolumeID" , int ,
+
array = False , optional = True ,
+
documentation = """The beginning of the range of active paired volumes to return. """ ,
+
dictionaryType = None
+
)
+
limit = data_model . property (
+
"limit" , int ,
+
array = False , optional = True ,
+
documentation = """Maximum number of active paired volumes to return. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
start_volume_id = None ,
+
limit = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListInitiatorsRequest ( data_model . DataObject ):
+
"""ListInitiatorsRequest
+
ListInitiators enables you to list initiator IQNs or World Wide Port Names (WWPNs).
+
+
:param start_initiator_id: The initiator ID at which to begin the listing. You can supply this parameter or the "initiators" parameter, but not both.
+
:type start_initiator_id: int
+
+
:param limit: The maximum number of initiator objects to return.
+
:type limit: int
+
+
:param initiators: A list of initiator IDs to retrieve. You can provide a value for this parameter or the "startInitiatorID" parameter, but not both.
+
:type initiators: int
+
+
"""
+
start_initiator_id = data_model . property (
+
"startInitiatorID" , int ,
+
array = False , optional = True ,
+
documentation = """The initiator ID at which to begin the listing. You can supply this parameter or the "initiators" parameter, but not both. """ ,
+
dictionaryType = None
+
)
+
limit = data_model . property (
+
"limit" , int ,
+
array = False , optional = True ,
+
documentation = """The maximum number of initiator objects to return. """ ,
+
dictionaryType = None
+
)
+
initiators = data_model . property (
+
"initiators" , int ,
+
array = True , optional = True ,
+
documentation = """A list of initiator IDs to retrieve. You can provide a value for this parameter or the "startInitiatorID" parameter, but not both. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
start_initiator_id = None ,
+
limit = None ,
+
initiators = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class FibreChannelPortList ( data_model . DataObject ):
+
"""FibreChannelPortList
+
List of all Fibre Channel ports.
+
+
:param fibre_channel_ports: [required] List of all physical Fibre Channel ports.
+
:type fibre_channel_ports: FibreChannelPortInfo
+
+
"""
+
fibre_channel_ports = data_model . property (
+
"fibreChannelPorts" , FibreChannelPortInfo ,
+
array = True , optional = False ,
+
documentation = """List of all physical Fibre Channel ports. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
fibre_channel_ports ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class FibreChannelPortInfoResult ( data_model . DataObject ):
+
"""FibreChannelPortInfoResult
+
Used to return information about the Fibre Channel ports.
+
+
:param result: [required] Used to return information about the Fibre Channel ports.
+
:type result: FibreChannelPortList
+
+
"""
+
result = data_model . property (
+
"result" , FibreChannelPortList ,
+
array = False , optional = False ,
+
documentation = """Used to return information about the Fibre Channel ports. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
result ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListFibreChannelPortInfoResult ( data_model . DataObject ):
+
"""ListFibreChannelPortInfoResult
+
ListFibreChannelPortInfoResult is used to return information about the Fibre Channel ports.
+
+
:param fibre_channel_port_info: [required] Used to return information about the Fibre Channel ports.
+
:type fibre_channel_port_info: dict
+
+
"""
+
fibre_channel_port_info = data_model . property (
+
"fibreChannelPortInfo" , dict ,
+
array = False , optional = False ,
+
documentation = """Used to return information about the Fibre Channel ports. """ ,
+
dictionaryType = FibreChannelPortInfoResult
+
)
+
+
def __init__ ( self ,
+
fibre_channel_port_info ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetConfigResult ( data_model . DataObject ):
+
"""GetConfigResult
+
+
:param config: [required] The details of the cluster. Values returned in "config": cluster- Cluster information that identifies how the node communicates with the cluster it is associated with. (Object) network - Network information for bonding and Ethernet connections. (Object)
+
:type config: Config
+
+
"""
+
config = data_model . property (
+
"config" , Config ,
+
array = False , optional = False ,
+
documentation = """The details of the cluster. Values returned in "config": cluster- Cluster information that identifies how the node communicates with the cluster it is associated with. (Object) network - Network information for bonding and Ethernet connections. (Object) """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
config ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class RemoveDrivesRequest ( data_model . DataObject ):
+
"""RemoveDrivesRequest
+
You can use RemoveDrives to proactively remove drives that are part of the cluster. You might want to use this method when
+
reducing cluster capacity or preparing to replace drives nearing the end of their service life. Any data on the drives is removed and
+
migrated to other drives in the cluster before the drive is removed from the cluster. This is an asynchronous method. Depending on
+
the total capacity of the drives being removed, it might take several minutes to migrate all of the data. Use the GetAsyncResult
+
method to check the status of the remove operation.
+
When removing multiple drives, use a single RemoveDrives method call rather than multiple individual methods with a single drive
+
each. This reduces the amount of data balancing that must occur to even stabilize the storage load on the cluster.
+
You can also remove drives with a "failed" status using RemoveDrives. When you remove a drive with a "failed" status it is not
+
returned to an "available" or active status. The drive is unavailable for use in the cluster.
+
Use the ListDrives method to obtain the driveIDs for the drives you want to remove.
+
+
:param drives: [required] List of driveIDs to remove from the cluster.
+
:type drives: int
+
+
:param force_during_upgrade: If you want to remove a drive during upgrade, this must be set to true.
+
:type force_during_upgrade: bool
+
+
"""
+
drives = data_model . property (
+
"drives" , int ,
+
array = True , optional = False ,
+
documentation = """List of driveIDs to remove from the cluster. """ ,
+
dictionaryType = None
+
)
+
force_during_upgrade = data_model . property (
+
"forceDuringUpgrade" , bool ,
+
array = False , optional = True ,
+
documentation = """If you want to remove a drive during upgrade, this must be set to true. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
drives ,
+
force_during_upgrade = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyVolumeAccessGroupRequest ( data_model . DataObject ):
+
"""ModifyVolumeAccessGroupRequest
+
You can use ModifyVolumeAccessGroup to update initiators and add or remove volumes from a volume access group. If a specified initiator or volume is a duplicate of what currently exists, the volume access group is left as-is. If you do not specify a value for volumes or initiators, the current list of initiators and volumes is not changed.
+
+
:param volume_access_group_id: [required] The ID of the volume access group to modify.
+
:type volume_access_group_id: int
+
+
:param virtual_network_id: The ID of the SolidFire virtual network to associate the volume access group with.
+
:type virtual_network_id: int
+
+
:param virtual_network_tags: The ID of the SolidFire virtual network to associate the volume access group with.
+
:type virtual_network_tags: int
+
+
:param name: The new name for this volume access group. Not required to be unique, but recommended.
+
:type name: str
+
+
:param initiators: List of initiators to include in the volume access group. If unspecified, the access group's configured initiators are not modified.
+
:type initiators: str
+
+
:param volumes: List of volumes to initially include in the volume access group. If unspecified, the access group's volumes are not modified.
+
:type volumes: int
+
+
:param delete_orphan_initiators: true: Delete initiator objects after they are removed from a volume access group. false: Do not delete initiator objects after they are removed from a volume access group.
+
:type delete_orphan_initiators: bool
+
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the volume access group to modify. """ ,
+
dictionaryType = None
+
)
+
virtual_network_id = data_model . property (
+
"virtualNetworkID" , int ,
+
array = True , optional = True ,
+
documentation = """The ID of the SolidFire virtual network to associate the volume access group with. """ ,
+
dictionaryType = None
+
)
+
virtual_network_tags = data_model . property (
+
"virtualNetworkTags" , int ,
+
array = True , optional = True ,
+
documentation = """The ID of the SolidFire virtual network to associate the volume access group with. """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = True ,
+
documentation = """The new name for this volume access group. Not required to be unique, but recommended. """ ,
+
dictionaryType = None
+
)
+
initiators = data_model . property (
+
"initiators" , str ,
+
array = True , optional = True ,
+
documentation = """List of initiators to include in the volume access group. If unspecified, the access group's configured initiators are not modified. """ ,
+
dictionaryType = None
+
)
+
volumes = data_model . property (
+
"volumes" , int ,
+
array = True , optional = True ,
+
documentation = """List of volumes to initially include in the volume access group. If unspecified, the access group's volumes are not modified. """ ,
+
dictionaryType = None
+
)
+
delete_orphan_initiators = data_model . property (
+
"deleteOrphanInitiators" , bool ,
+
array = False , optional = True ,
+
documentation = """true: Delete initiator objects after they are removed from a volume access group. false: Do not delete initiator objects after they are removed from a volume access group. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_access_group_id ,
+
virtual_network_id = None ,
+
virtual_network_tags = None ,
+
name = None ,
+
initiators = None ,
+
volumes = None ,
+
delete_orphan_initiators = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVolumesForAccountRequest ( data_model . DataObject ):
+
"""ListVolumesForAccountRequest
+
ListVolumesForAccount returns the list of active and (pending) deleted volumes for an account.
+
+
:param account_id: [required] Returns all volumes owned by this AccountID.
+
:type account_id: int
+
+
:param start_volume_id: The ID of the first volume to list. This can be useful for paging results. By default, this starts at the lowest VolumeID.
+
:type start_volume_id: int
+
+
:param limit: The maximum number of volumes to return from the API.
+
:type limit: int
+
+
:param include_virtual_volumes: Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false.
+
:type include_virtual_volumes: bool
+
+
"""
+
account_id = data_model . property (
+
"accountID" , int ,
+
array = False , optional = False ,
+
documentation = """Returns all volumes owned by this AccountID. """ ,
+
dictionaryType = None
+
)
+
start_volume_id = data_model . property (
+
"startVolumeID" , int ,
+
array = False , optional = True ,
+
documentation = """The ID of the first volume to list. This can be useful for paging results. By default, this starts at the lowest VolumeID. """ ,
+
dictionaryType = None
+
)
+
limit = data_model . property (
+
"limit" , int ,
+
array = False , optional = True ,
+
documentation = """The maximum number of volumes to return from the API. """ ,
+
dictionaryType = None
+
)
+
include_virtual_volumes = data_model . property (
+
"includeVirtualVolumes" , bool ,
+
array = False , optional = True ,
+
documentation = """Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
account_id ,
+
start_volume_id = None ,
+
limit = None ,
+
include_virtual_volumes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetNodeHardwareInfoResult ( data_model . DataObject ):
+
"""GetNodeHardwareInfoResult
+
+
:param node_hardware_info: [required] Hardware information for the specified nodeID.
+
:type node_hardware_info: dict
+
+
"""
+
node_hardware_info = data_model . property (
+
"nodeHardwareInfo" , dict ,
+
array = False , optional = False ,
+
documentation = """Hardware information for the specified nodeID. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
node_hardware_info ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetVolumeAccessGroupEfficiencyRequest ( data_model . DataObject ):
+
"""GetVolumeAccessGroupEfficiencyRequest
+
GetVolumeAccessGroupEfficiency enables you to
+
retrieve efficiency information about a volume access
+
group. Only the volume access group you provide as the
+
parameter in this API method is used to compute the
+
capacity.
+
+
:param volume_access_group_id: [required] The volume access group for which capacity is computed.
+
:type volume_access_group_id: int
+
+
"""
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
+
array = False , optional = False ,
+
documentation = """The volume access group for which capacity is computed. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_access_group_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListAsyncResultsRequest ( data_model . DataObject ):
+
"""ListAsyncResultsRequest
+
You can use ListAsyncResults to list the results of all currently running and completed asynchronous methods on the system.
+
Querying asynchronous results with ListAsyncResults does not cause completed asyncHandles to expire; you can use GetAsyncResult
+
to query any of the asyncHandles returned by ListAsyncResults.
+
+
:param async_result_types: An optional list of types of results. You can use this list to restrict the results to only these types of operations. Possible values are: BulkVolume: Copy operations between volumes, such as backups or restores. Clone: Volume cloning operations. DriveRemoval: Operations involving the system copying data from a drive in preparation to remove it from the cluster. RtfiPendingNode: Operations involving the system installing compatible software on a node before adding it to the cluster
+
:type async_result_types: str
+
+
"""
+
async_result_types = data_model . property (
+
"asyncResultTypes" , str ,
+
array = True , optional = True ,
+
documentation = """An optional list of types of results. You can use this list to restrict the results to only these types of operations. Possible values are: BulkVolume: Copy operations between volumes, such as backups or restores. Clone: Volume cloning operations. DriveRemoval: Operations involving the system copying data from a drive in preparation to remove it from the cluster. RtfiPendingNode: Operations involving the system installing compatible software on a node before adding it to the cluster """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
async_result_types = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetClusterStateRequest ( data_model . DataObject ):
+
"""GetClusterStateRequest
+
The GetClusterState API method enables you to indicate if a node is part of a cluster or not. The three states are:
+
Available: Node has not been configured with a cluster name.
+
Pending: Node is pending for a specific named cluster and can be added.
+
Active: Node is an active member of a cluster and may not be added to another
+
cluster.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
+
:param force: [required] To run this command, the force parameter must be set to true.
+
:type force: bool
+
+
"""
+
force = data_model . property (
+
"force" , bool ,
+
array = False , optional = False ,
+
documentation = """To run this command, the force parameter must be set to true. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
force ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class PendingOperation ( data_model . DataObject ):
+
"""PendingOperation
+
+
:param pending: [required] true: operation is still in progress. false: operation is no integerer in progress.
+
:type pending: bool
+
+
:param operation: [required] Name of operation that is in progress or has completed.
+
:type operation: str
+
+
"""
+
pending = data_model . property (
+
"pending" , bool ,
+
array = False , optional = False ,
+
documentation = """true: operation is still in progress. false: operation is no integerer in progress. """ ,
+
dictionaryType = None
+
)
+
operation = data_model . property (
+
"operation" , str ,
+
array = False , optional = False ,
+
documentation = """Name of operation that is in progress or has completed. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
pending ,
+
operation ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetPendingOperationResult ( data_model . DataObject ):
+
"""GetPendingOperationResult
+
+
:param pending_operation: [required]
+
:type pending_operation: PendingOperation
+
+
"""
+
pending_operation = data_model . property (
+
"pendingOperation" , PendingOperation ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
pending_operation ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class AddressBlock ( data_model . DataObject ):
+
"""AddressBlock
+
Unique Range of IP addresses to include in the virtual network.
+
+
:param start: [required] Start of the IP address range.
+
:type start: str
+
+
:param size: [required] Number of IP addresses to include in the block.
+
:type size: int
+
+
:param available: [required] Nuber of available blocks
+
:type available: str
+
+
"""
+
start = data_model . property (
+
"start" , str ,
+
array = False , optional = False ,
+
documentation = """Start of the IP address range. """ ,
+
dictionaryType = None
+
)
+
size = data_model . property (
+
"size" , int ,
+
array = False , optional = False ,
+
documentation = """Number of IP addresses to include in the block. """ ,
+
dictionaryType = None
+
)
+
available = data_model . property (
+
"available" , str ,
+
array = False , optional = False ,
+
documentation = """Nuber of available blocks """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
start ,
+
size ,
+
available ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class VirtualNetwork ( data_model . DataObject ):
+
"""VirtualNetwork
+
+
:param virtual_network_id: [required] SolidFire unique identifier for a virtual network.
+
:type virtual_network_id: int
+
+
:param virtual_network_tag: [required] VLAN Tag identifier.
+
:type virtual_network_tag: int
+
+
:param address_blocks: [required] Range of address blocks currently assigned to the virtual network. available: Binary string in "1"s and "0"s. 1 equals the IP is available and 0 equals the IP is not available. The string is read from right to left with the digit to the far right being the first IP address in the list of addressBlocks. size: the size of this block of addresses. start: first IP address in the block.
+
:type address_blocks: AddressBlock
+
+
:param name: [required] The name assigned to the virtual network.
+
:type name: str
+
+
:param netmask: [required] IP address of the netmask for the virtual network.
+
:type netmask: str
+
+
:param svip: [required] Storage IP address for the virtual network.
+
:type svip: str
+
+
:param gateway:
+
:type gateway: str
+
+
:param namespace:
+
:type namespace: bool
+
+
:param attributes: List of Name/Value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
virtual_network_id = data_model . property (
+
"virtualNetworkID" , int ,
+
array = False , optional = False ,
+
documentation = """SolidFire unique identifier for a virtual network. """ ,
+
dictionaryType = None
+
)
+
virtual_network_tag = data_model . property (
+
"virtualNetworkTag" , int ,
+
array = False , optional = False ,
+
documentation = """VLAN Tag identifier. """ ,
+
dictionaryType = None
+
)
+
address_blocks = data_model . property (
+
"addressBlocks" , AddressBlock ,
+
array = True , optional = False ,
+
documentation = """Range of address blocks currently assigned to the virtual network. available: Binary string in "1"s and "0"s. 1 equals the IP is available and 0 equals the IP is not available. The string is read from right to left with the digit to the far right being the first IP address in the list of addressBlocks. size: the size of this block of addresses. start: first IP address in the block. """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """The name assigned to the virtual network. """ ,
+
dictionaryType = None
+
)
+
netmask = data_model . property (
+
"netmask" , str ,
+
array = False , optional = False ,
+
documentation = """IP address of the netmask for the virtual network. """ ,
+
dictionaryType = None
+
)
+
svip = data_model . property (
+
"svip" , str ,
+
array = False , optional = False ,
+
documentation = """Storage IP address for the virtual network. """ ,
+
dictionaryType = None
+
)
+
gateway = data_model . property (
+
"gateway" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
namespace = data_model . property (
+
"namespace" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of Name/Value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
virtual_network_id ,
+
virtual_network_tag ,
+
address_blocks ,
+
name ,
+
netmask ,
+
svip ,
+
gateway = None ,
+
namespace = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVirtualNetworksResult ( data_model . DataObject ):
+
"""ListVirtualNetworksResult
+
+
:param virtual_networks: [required] Object containing virtual network IP addresses.
+
:type virtual_networks: VirtualNetwork
+
+
"""
+
virtual_networks = data_model . property (
+
"virtualNetworks" , VirtualNetwork ,
+
array = True , optional = False ,
+
documentation = """Object containing virtual network IP addresses. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
virtual_networks ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class AddVirtualNetworkRequest ( data_model . DataObject ):
+
"""AddVirtualNetworkRequest
+
You can use the AddVirtualNetwork method to add a new virtual network to a cluster configuration. When you add a virtual network,
+
an interface for each node is created and each interface will require a virtual network IP address. The number of IP addresses you
+
specify as a parameter for this API method must be equal to or greater than the number of nodes in the cluster. The system bulk
+
provisions virtual network addresses and assigns them to individual nodes automatically. You do not need to assign virtual
+
network addresses to nodes manually.
+
Note: You can use AddVirtualNetwork only to create a new virtual network. If you want to make changes to an
+
existing virtual network, use ModifyVirtualNetwork.
+
Note: Virtual network parameters must be unique to each virtual network when setting the namespace parameter to false.
+
+
:param virtual_network_tag: [required] A unique virtual network (VLAN) tag. Supported values are 1 through 4094.The number zero (0) is not supported.
+
:type virtual_network_tag: int
+
+
:param name: [required] A user-defined name for the new virtual network.
+
:type name: str
+
+
:param address_blocks: [required] Unique range of IP addresses to include in the virtual network. Attributes for this parameter are: start: The start of the IP address range. (String) size: The number of IP addresses to include in the block. (Integer)
+
:type address_blocks: AddressBlockParams
+
+
:param netmask: [required] Unique network mask for the virtual network being created.
+
:type netmask: str
+
+
:param svip: [required] Unique storage IP address for the virtual network being created.
+
:type svip: str
+
+
:param gateway: The IP address of a gateway of the virtual network. This parameter is only valid if the "namespace" parameter is set to true.
+
:type gateway: str
+
+
:param namespace: When set to true, enables the Routable Storage VLANs functionality by creating and configuring a namespace and the virtual network contained by it.
+
:type namespace: bool
+
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
virtual_network_tag = data_model . property (
+
"virtualNetworkTag" , int ,
+
array = False , optional = False ,
+
documentation = """A unique virtual network (VLAN) tag. Supported values are 1 through 4094.The number zero (0) is not supported. """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """A user-defined name for the new virtual network. """ ,
+
dictionaryType = None
+
)
+
address_blocks = data_model . property (
+
"addressBlocks" , AddressBlockParams ,
+
array = True , optional = False ,
+
documentation = """Unique range of IP addresses to include in the virtual network. Attributes for this parameter are: start: The start of the IP address range. (String) size: The number of IP addresses to include in the block. (Integer) """ ,
+
dictionaryType = None
+
)
+
netmask = data_model . property (
+
"netmask" , str ,
+
array = False , optional = False ,
+
documentation = """Unique network mask for the virtual network being created. """ ,
+
dictionaryType = None
+
)
+
svip = data_model . property (
+
"svip" , str ,
+
array = False , optional = False ,
+
documentation = """Unique storage IP address for the virtual network being created. """ ,
+
dictionaryType = None
+
)
+
gateway = data_model . property (
+
"gateway" , str ,
+
array = False , optional = True ,
+
documentation = """The IP address of a gateway of the virtual network. This parameter is only valid if the "namespace" parameter is set to true. """ ,
+
dictionaryType = None
+
)
+
namespace = data_model . property (
+
"namespace" , bool ,
+
array = False , optional = True ,
+
documentation = """When set to true, enables the Routable Storage VLANs functionality by creating and configuring a namespace and the virtual network contained by it. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
virtual_network_tag ,
+
name ,
+
address_blocks ,
+
netmask ,
+
svip ,
+
gateway = None ,
+
namespace = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetNodeStatsResult ( data_model . DataObject ):
+
"""GetNodeStatsResult
+
+
:param node_stats: [required] Node activity information.
+
:type node_stats: NodeStatsInfo
+
+
"""
+
node_stats = data_model . property (
+
"nodeStats" , NodeStatsInfo ,
+
array = False , optional = False ,
+
documentation = """Node activity information. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
node_stats ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class VirtualVolumeBinding ( data_model . DataObject ):
+
"""VirtualVolumeBinding
+
+
:param protocol_endpoint_id: [required] The unique ID of the protocol endpoint.
+
:type protocol_endpoint_id: UUID
+
+
:param protocol_endpoint_in_band_id: [required] The scsiNAADeviceID of the protocol endpoint. For more information, see protocolEndpoint.
+
:type protocol_endpoint_in_band_id: str
+
+
:param protocol_endpoint_type: [required] The type of protocol endpoint. SCSI is the only value returned for the protocol endpoint type.
+
:type protocol_endpoint_type: str
+
+
:param virtual_volume_binding_id: [required] The unique ID of the virtual volume binding object.
+
:type virtual_volume_binding_id: int
+
+
:param virtual_volume_host_id: [required] The unique ID of the virtual volume host.
+
:type virtual_volume_host_id: UUID
+
+
:param virtual_volume_id: [required] The unique ID of the virtual volume.
+
:type virtual_volume_id: UUID
+
+
:param virtual_volume_secondary_id: [required] The secondary ID of the virtual volume.
+
:type virtual_volume_secondary_id: str
+
+
"""
+
protocol_endpoint_id = data_model . property (
+
"protocolEndpointID" , UUID ,
+
array = False , optional = False ,
+
documentation = """The unique ID of the protocol endpoint. """ ,
+
dictionaryType = None
+
)
+
protocol_endpoint_in_band_id = data_model . property (
+
"protocolEndpointInBandID" , str ,
+
array = False , optional = False ,
+
documentation = """The scsiNAADeviceID of the protocol endpoint. For more information, see protocolEndpoint. """ ,
+
dictionaryType = None
+
)
+
protocol_endpoint_type = data_model . property (
+
"protocolEndpointType" , str ,
+
array = False , optional = False ,
+
documentation = """The type of protocol endpoint. SCSI is the only value returned for the protocol endpoint type. """ ,
+
dictionaryType = None
+
)
+
virtual_volume_binding_id = data_model . property (
+
"virtualVolumeBindingID" , int ,
+
array = False , optional = False ,
+
documentation = """The unique ID of the virtual volume binding object. """ ,
+
dictionaryType = None
+
)
+
virtual_volume_host_id = data_model . property (
+
"virtualVolumeHostID" , UUID ,
+
array = False , optional = False ,
+
documentation = """The unique ID of the virtual volume host. """ ,
+
dictionaryType = None
+
)
+
virtual_volume_id = data_model . property (
+
"virtualVolumeID" , UUID ,
+
array = False , optional = False ,
+
documentation = """The unique ID of the virtual volume. """ ,
+
dictionaryType = None
+
)
+
virtual_volume_secondary_id = data_model . property (
+
"virtualVolumeSecondaryID" , str ,
+
array = False , optional = False ,
+
documentation = """The secondary ID of the virtual volume. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
protocol_endpoint_id ,
+
protocol_endpoint_in_band_id ,
+
protocol_endpoint_type ,
+
virtual_volume_binding_id ,
+
virtual_volume_host_id ,
+
virtual_volume_id ,
+
virtual_volume_secondary_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVirtualVolumeBindingsResult ( data_model . DataObject ):
+
"""ListVirtualVolumeBindingsResult
+
+
:param bindings: [required] Describes the VVol <-> Host binding.
+
:type bindings: VirtualVolumeBinding
+
+
"""
+
bindings = data_model . property (
+
"bindings" , VirtualVolumeBinding ,
+
array = True , optional = False ,
+
documentation = """Describes the VVol <-> Host binding. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
bindings ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class Signature ( data_model . DataObject ):
+
"""Signature
+
+
:param data: [required]
+
:type data: str
+
+
:param pubkey: [required]
+
:type pubkey: str
+
+
:param version: [required]
+
:type version: int
+
+
"""
+
data = data_model . property (
+
"data" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
pubkey = data_model . property (
+
"pubkey" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
version = data_model . property (
+
"version" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
data ,
+
pubkey ,
+
version ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class Origin ( data_model . DataObject ):
+
"""Origin
+
+
:param signature: [required]
+
:type signature: Signature
+
+
:param contract_date: [required]
+
:type contract_date: str
+
+
:param contract_name: [required]
+
:type contract_name: str
+
+
:param contract_quantity: [required]
+
:type contract_quantity: int
+
+
:param contract_type: [required]
+
:type contract_type: str
+
+
:param integrator: [required]
+
:type integrator: str
+
+
:param location: [required]
+
:type location: str
+
+
:param organization: [required]
+
:type organization: str
+
+
:param type: [required]
+
:type type: str
+
+
"""
+
signature = data_model . property (
+
"<signature>" , Signature ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
contract_date = data_model . property (
+
"contract-date" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
contract_name = data_model . property (
+
"contract-name" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
contract_quantity = data_model . property (
+
"contract-quantity" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
contract_type = data_model . property (
+
"contract-type" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
integrator = data_model . property (
+
"integrator" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
location = data_model . property (
+
"location" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
organization = data_model . property (
+
"organization" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
type = data_model . property (
+
"type" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
signature ,
+
contract_date ,
+
contract_name ,
+
contract_quantity ,
+
contract_type ,
+
integrator ,
+
location ,
+
organization ,
+
type ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetOriginNodeResult ( data_model . DataObject ):
+
"""GetOriginNodeResult
+
+
:param origin:
+
:type origin: Origin
+
+
"""
+
origin = data_model . property (
+
"origin" , Origin ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
origin = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetOriginNode ( data_model . DataObject ):
+
"""GetOriginNode
+
+
:param node_id: [required]
+
:type node_id: int
+
+
:param result: [required]
+
:type result: GetOriginNodeResult
+
+
"""
+
node_id = data_model . property (
+
"nodeID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
result = data_model . property (
+
"result" , GetOriginNodeResult ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
node_id ,
+
result ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetOriginResult ( data_model . DataObject ):
+
"""GetOriginResult
+
+
:param nodes: [required]
+
:type nodes: GetOriginNode
+
+
"""
+
nodes = data_model . property (
+
"nodes" , GetOriginNode ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
nodes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DeleteInitiatorsRequest ( data_model . DataObject ):
+
"""DeleteInitiatorsRequest
+
DeleteInitiators enables you to delete one or more initiators from the system (and from any associated volumes or volume access
+
groups).
+
If DeleteInitiators fails to delete one of the initiators provided in the parameter, the system returns an error and does not delete any
+
initiators (no partial completion is possible).
+
+
:param initiators: [required] An array of IDs of initiators to delete.
+
:type initiators: int
+
+
"""
+
initiators = data_model . property (
+
"initiators" , int ,
+
array = True , optional = False ,
+
documentation = """An array of IDs of initiators to delete. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
initiators ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CreateBackupTargetRequest ( data_model . DataObject ):
+
"""CreateBackupTargetRequest
+
CreateBackupTarget enables you to create and store backup target information so that you do not need to re-enter it each time a backup is created.
+
+
:param name: [required] The name of the backup target.
+
:type name: str
+
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """The name of the backup target. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
name ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetVolumeCountResult ( data_model . DataObject ):
+
"""GetVolumeCountResult
+
+
:param count: [required] The number of volumes currently in the system.
+
:type count: int
+
+
"""
+
count = data_model . property (
+
"count" , int ,
+
array = False , optional = False ,
+
documentation = """The number of volumes currently in the system. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
count ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CloneMultipleVolumesRequest ( data_model . DataObject ):
+
"""CloneMultipleVolumesRequest
+
CloneMultipleVolumes enables you to create a clone of a group of specified volumes. You can assign a consistent set of characteristics
+
to a group of multiple volumes when they are cloned together.
+
Before using groupSnapshotID to clone the volumes in a group snapshot, you must create the group snapshot by using the
+
CreateGroupSnapshot API method or the Element OS Web UI. Using groupSnapshotID is optional when cloning multiple volumes.
+
Note: Cloning multiple volumes is allowed if cluster fullness is at stage 2 or 3. Clones are not created when cluster fullness is
+
at stage 4 or 5.
+
+
:param volumes: [required] Unique ID for each volume to include in the clone. If optional parameters are not specified, the values are inherited from the source volumes. Required parameter for "volumes" array: volumeID Optional parameters for "volumes" array: access: Can be one of readOnly, readWrite, locked, or replicationTarget attributes: List of name-value pairs in JSON object format. name: New name for the clone. newAccountID: Account ID for the new volumes. newSize: New size Total size of the volume, in bytes. Size is rounded up to the nearest 1MB.
+
:type volumes: CloneMultipleVolumeParams
+
+
:param access: New default access method for the new volumes if not overridden by information passed in the volume's array.
+
:type access: str
+
+
:param group_snapshot_id: ID of the group snapshot to use as a basis for the clone.
+
:type group_snapshot_id: int
+
+
:param new_account_id: New account ID for the volumes if not overridden by information passed in the volumes array.
+
:type new_account_id: int
+
+
"""
+
volumes = data_model . property (
+
"volumes" , CloneMultipleVolumeParams ,
+
array = True , optional = False ,
+
documentation = """Unique ID for each volume to include in the clone. If optional parameters are not specified, the values are inherited from the source volumes. Required parameter for "volumes" array: volumeID Optional parameters for "volumes" array: access: Can be one of readOnly, readWrite, locked, or replicationTarget attributes: List of name-value pairs in JSON object format. name: New name for the clone. newAccountID: Account ID for the new volumes. newSize: New size Total size of the volume, in bytes. Size is rounded up to the nearest 1MB. """ ,
+
dictionaryType = None
+
)
+
access = data_model . property (
+
"access" , str ,
+
array = False , optional = True ,
+
documentation = """New default access method for the new volumes if not overridden by information passed in the volume's array. """ ,
+
dictionaryType = None
+
)
+
group_snapshot_id = data_model . property (
+
"groupSnapshotID" , int ,
+
array = False , optional = True ,
+
documentation = """ID of the group snapshot to use as a basis for the clone. """ ,
+
dictionaryType = None
+
)
+
new_account_id = data_model . property (
+
"newAccountID" , int ,
+
array = False , optional = True ,
+
documentation = """New account ID for the volumes if not overridden by information passed in the volumes array. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volumes ,
+
access = None ,
+
group_snapshot_id = None ,
+
new_account_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SetNtpInfoResult ( data_model . DataObject ):
+
"""SetNtpInfoResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyClusterAdminResult ( data_model . DataObject ):
+
"""ModifyClusterAdminResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class StartVolumePairingResult ( data_model . DataObject ):
+
"""StartVolumePairingResult
+
+
:param volume_pairing_key: [required] A string of characters that is used by the "CompleteVolumePairing" API method.
+
:type volume_pairing_key: str
+
+
"""
+
volume_pairing_key = data_model . property (
+
"volumePairingKey" , str ,
+
array = False , optional = False ,
+
documentation = """A string of characters that is used by the "CompleteVolumePairing" API method. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_pairing_key ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SetLoginSessionInfoRequest ( data_model . DataObject ):
+
"""SetLoginSessionInfoRequest
+
You can use SetLoginSessionInfo to set the period of time that a session's login authentication is valid. After the log in period elapses without activity on the system, the authentication expires. New login credentials are required for continued access to the cluster after the timeout period has elapsed.
+
+
:param timeout: [required] Cluster authentication expiration period. Formatted in HH:mm:ss. For example, 01:30:00, 00:90:00, and 00:00:5400 can be used to equal a 90 minute timeout period. The default value is 30 minutes.
+
:type timeout: str
+
+
"""
+
timeout = data_model . property (
+
"timeout" , str ,
+
array = False , optional = False ,
+
documentation = """Cluster authentication expiration period. Formatted in HH:mm:ss. For example, 01:30:00, 00:90:00, and 00:00:5400 can be used to equal a 90 minute timeout period. The default value is 30 minutes. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
timeout ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyAccountResult ( data_model . DataObject ):
+
"""ModifyAccountResult
+
+
:param account: [required]
+
:type account: Account
+
+
"""
+
account = data_model . property (
+
"account" , Account ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
account ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class NetworkInterface ( data_model . DataObject ):
+
"""NetworkInterface
+
+
:param address: [required] IP address of the network.
+
:type address: str
+
+
:param broadcast: [required] Address of NTP broadcast.
+
:type broadcast: str
+
+
:param mac_address: [required] Address used to configure the interface.
+
:type mac_address: str
+
+
:param mtu: [required] Packet size on the network interface.
+
:type mtu: int
+
+
:param name: [required] Name of the network interface.
+
:type name: str
+
+
:param netmask: [required] Netmask for the network interface.
+
:type netmask: str
+
+
:param status: [required] Status of the network.
+
:type status: str
+
+
:param type: [required] The type of network, ie, BondMaster.
+
:type type: str
+
+
:param virtual_network_tag: [required] Virtual Network Tag if on virtual network.
+
:type virtual_network_tag: int
+
+
:param namespace:
+
:type namespace: bool
+
+
"""
+
address = data_model . property (
+
"address" , str ,
+
array = False , optional = False ,
+
documentation = """IP address of the network. """ ,
+
dictionaryType = None
+
)
+
broadcast = data_model . property (
+
"broadcast" , str ,
+
array = False , optional = False ,
+
documentation = """Address of NTP broadcast. """ ,
+
dictionaryType = None
+
)
+
mac_address = data_model . property (
+
"macAddress" , str ,
+
array = False , optional = False ,
+
documentation = """Address used to configure the interface. """ ,
+
dictionaryType = None
+
)
+
mtu = data_model . property (
+
"mtu" , int ,
+
array = False , optional = False ,
+
documentation = """Packet size on the network interface. """ ,
+
dictionaryType = None
+
)
+
name = data_model . property (
+
"name" , str ,
+
array = False , optional = False ,
+
documentation = """Name of the network interface. """ ,
+
dictionaryType = None
+
)
+
netmask = data_model . property (
+
"netmask" , str ,
+
array = False , optional = False ,
+
documentation = """Netmask for the network interface. """ ,
+
dictionaryType = None
+
)
+
status = data_model . property (
+
"status" , str ,
+
array = False , optional = False ,
+
documentation = """Status of the network. """ ,
+
dictionaryType = None
+
)
+
type = data_model . property (
+
"type" , str ,
+
array = False , optional = False ,
+
documentation = """The type of network, ie, BondMaster. """ ,
+
dictionaryType = None
+
)
+
virtual_network_tag = data_model . property (
+
"virtualNetworkTag" , int ,
+
array = False , optional = False ,
+
documentation = """Virtual Network Tag if on virtual network. """ ,
+
dictionaryType = None
+
)
+
namespace = data_model . property (
+
"namespace" , bool ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
address ,
+
broadcast ,
+
mac_address ,
+
mtu ,
+
name ,
+
netmask ,
+
status ,
+
type ,
+
virtual_network_tag ,
+
namespace = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListNetworkInterfacesResult ( data_model . DataObject ):
+
"""ListNetworkInterfacesResult
+
+
:param interfaces: [required]
+
:type interfaces: NetworkInterface
+
+
"""
+
interfaces = data_model . property (
+
"interfaces" , NetworkInterface ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
interfaces ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetNvramInfoRequest ( data_model . DataObject ):
+
"""GetNvramInfoRequest
+
GetNvramInfo enables you to retrieve information from each node about the NVRAM card.
+
+
:param force: Required parameter to successfully run on all nodes in the cluster.
+
:type force: bool
+
+
"""
+
force = data_model . property (
+
"force" , bool ,
+
array = False , optional = True ,
+
documentation = """Required parameter to successfully run on all nodes in the cluster. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
force = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DriveStats ( data_model . DataObject ):
+
"""DriveStats
+
+
:param active_sessions:
+
:type active_sessions: int
+
+
:param drive_id:
+
:type drive_id: int
+
+
:param failed_die_count: [required]
+
:type failed_die_count: int
+
+
:param life_remaining_percent: [required]
+
:type life_remaining_percent: int
+
+
:param lifetime_read_bytes: [required]
+
:type lifetime_read_bytes: int
+
+
:param lifetime_write_bytes: [required]
+
:type lifetime_write_bytes: int
+
+
:param power_on_hours: [required]
+
:type power_on_hours: int
+
+
:param read_bytes: [required]
+
:type read_bytes: int
+
+
:param read_ops: [required]
+
:type read_ops: int
+
+
:param reallocated_sectors: [required]
+
:type reallocated_sectors: int
+
+
:param reserve_capacity_percent: [required]
+
:type reserve_capacity_percent: int
+
+
:param timestamp: [required]
+
:type timestamp: str
+
+
:param total_capacity: [required]
+
:type total_capacity: int
+
+
:param used_capacity:
+
:type used_capacity: int
+
+
:param used_memory: [required]
+
:type used_memory: int
+
+
:param write_bytes: [required]
+
:type write_bytes: int
+
+
:param write_ops: [required]
+
:type write_ops: int
+
+
"""
+
active_sessions = data_model . property (
+
"activeSessions" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
drive_id = data_model . property (
+
"driveID" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
failed_die_count = data_model . property (
+
"failedDieCount" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
life_remaining_percent = data_model . property (
+
"lifeRemainingPercent" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
lifetime_read_bytes = data_model . property (
+
"lifetimeReadBytes" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
lifetime_write_bytes = data_model . property (
+
"lifetimeWriteBytes" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
power_on_hours = data_model . property (
+
"powerOnHours" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
read_bytes = data_model . property (
+
"readBytes" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
read_ops = data_model . property (
+
"readOps" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
reallocated_sectors = data_model . property (
+
"reallocatedSectors" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
reserve_capacity_percent = data_model . property (
+
"reserveCapacityPercent" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
timestamp = data_model . property (
+
"timestamp" , str ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
total_capacity = data_model . property (
+
"totalCapacity" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
used_capacity = data_model . property (
+
"usedCapacity" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
used_memory = data_model . property (
+
"usedMemory" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
write_bytes = data_model . property (
+
"writeBytes" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
write_ops = data_model . property (
+
"writeOps" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
failed_die_count ,
+
life_remaining_percent ,
+
lifetime_read_bytes ,
+
lifetime_write_bytes ,
+
power_on_hours ,
+
read_bytes ,
+
read_ops ,
+
reallocated_sectors ,
+
reserve_capacity_percent ,
+
timestamp ,
+
total_capacity ,
+
used_memory ,
+
write_bytes ,
+
write_ops ,
+
active_sessions = None ,
+
drive_id = None ,
+
used_capacity = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListDriveStatsResult ( data_model . DataObject ):
+
"""ListDriveStatsResult
+
+
:param drive_stats: [required] List of drive activity information for each drive.
+
:type drive_stats: DriveStats
+
+
:param errors: [required] If there are errors retrieving information about a drive, this list contains the driveID and associated error message. Always present, and empty if there are no errors.
+
:type errors: dict
+
+
"""
+
drive_stats = data_model . property (
+
"driveStats" , DriveStats ,
+
array = True , optional = False ,
+
documentation = """List of drive activity information for each drive. """ ,
+
dictionaryType = None
+
)
+
errors = data_model . property (
+
"errors" , dict ,
+
array = True , optional = False ,
+
documentation = """If there are errors retrieving information about a drive, this list contains the driveID and associated error message. Always present, and empty if there are no errors. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
drive_stats ,
+
errors ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class EnableFeatureResult ( data_model . DataObject ):
+
"""EnableFeatureResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DeleteStorageContainersRequest ( data_model . DataObject ):
+
"""DeleteStorageContainersRequest
+
DeleteStorageContainers enables you to remove up to 2000 Virtual Volume (VVol) storage containers from the system at one time.
+
The storage containers you remove must not contain any VVols.
+
+
:param storage_container_ids: [required] A list of IDs of the storage containers to delete. You can specify up to 2000 IDs in the list.
+
:type storage_container_ids: UUID
+
+
"""
+
storage_container_ids = data_model . property (
+
"storageContainerIDs" , UUID ,
+
array = True , optional = False ,
+
documentation = """A list of IDs of the storage containers to delete. You can specify up to 2000 IDs in the list. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
storage_container_ids ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SetSnmpTrapInfoResult ( data_model . DataObject ):
+
"""SetSnmpTrapInfoResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ClusterCapacity ( data_model . DataObject ):
+
"""ClusterCapacity
+
High level capacity measurements for the entire cluster.
+
+
:param active_block_space: [required] The amount of space on the block drives. This includes additional information such as metadata entries and space which can be cleaned up.
+
:type active_block_space: int
+
+
:param active_sessions: [required] Number of active iSCSI sessions communicating with the cluster
+
:type active_sessions: int
+
+
:param average_iops: [required] Average IPS for the cluster since midnight Coordinated Universal Time (UTC).
+
:type average_iops: int
+
+
:param cluster_recent_iosize: [required] The average size of IOPS to all volumes in the cluster.
+
:type cluster_recent_iosize: int
+
+
:param current_iops: [required] Average IOPS for all volumes in the cluster over the last 5 seconds.
+
:type current_iops: int
+
+
:param max_iops: [required] Estimated maximum IOPS capability of the current cluster.
+
:type max_iops: int
+
+
:param max_over_provisionable_space: [required] The maximum amount of provisionable space. This is a computed value. You cannot create new volumes if the current provisioned space plus the new volume size would exceed this number: maxOverProvisionableSpace = maxProvisionedSpace * GetClusterFull
+
:type max_over_provisionable_space: int
+
+
:param max_provisioned_space: [required] The total amount of provisionable space if all volumes are 100% filled (no thin provisioned metadata).
+
:type max_provisioned_space: int
+
+
:param max_used_metadata_space: [required] The amount of bytes on volume drives used to store metadata.
+
:type max_used_metadata_space: int
+
+
:param max_used_space: [required] The total amount of space on all active block drives.
+
:type max_used_space: int
+
+
:param non_zero_blocks: [required] Total number of 4KiB blocks with data after the last garbage collection operation has completed.
+
:type non_zero_blocks: int
+
+
:param peak_active_sessions: [required] Peak number of iSCSI connections since midnight UTC.
+
:type peak_active_sessions: int
+
+
:param peak_iops: [required] The highest value for currentIOPS since midnight UTC.
+
:type peak_iops: int
+
+
:param provisioned_space: [required] Total amount of space provisioned in all volumes on the cluster.
+
:type provisioned_space: int
+
+
:param snapshot_non_zero_blocks: [required] Total number of 4KiB blocks in snapshots with data.
+
:type snapshot_non_zero_blocks: int
+
+
:param timestamp: [required] The date and time this cluster capacity sample was taken.
+
:type timestamp: str
+
+
:param total_ops: [required] The total number of I/O operations performed throughout the lifetime of the cluster
+
:type total_ops: int
+
+
:param unique_blocks: [required] The total number of blocks stored on the block drives. The value includes replicated blocks.
+
:type unique_blocks: int
+
+
:param unique_blocks_used_space: [required] The total amount of data the uniqueBlocks take up on the block drives. This number is always consistent with the uniqueBlocks value.
+
:type unique_blocks_used_space: int
+
+
:param used_metadata_space: [required] The total amount of bytes on volume drives used to store metadata
+
:type used_metadata_space: int
+
+
:param used_metadata_space_in_snapshots: [required] The amount of bytes on volume drives used for storing unique data in snapshots. This number provides an estimate of how much metadata space would be regained by deleting all snapshots on the system.
+
:type used_metadata_space_in_snapshots: int
+
+
:param used_space: [required] Total amount of space used by all block drives in the system.
+
:type used_space: int
+
+
:param zero_blocks: [required] Total number of 4KiB blocks without data after the last round of garabage collection operation has completed.
+
:type zero_blocks: int
+
+
"""
+
active_block_space = data_model . property (
+
"activeBlockSpace" , int ,
+
array = False , optional = False ,
+
documentation = """The amount of space on the block drives. This includes additional information such as metadata entries and space which can be cleaned up. """ ,
+
dictionaryType = None
+
)
+
active_sessions = data_model . property (
+
"activeSessions" , int ,
+
array = False , optional = False ,
+
documentation = """Number of active iSCSI sessions communicating with the cluster """ ,
+
dictionaryType = None
+
)
+
average_iops = data_model . property (
+
"averageIOPS" , int ,
+
array = False , optional = False ,
+
documentation = """Average IPS for the cluster since midnight Coordinated Universal Time (UTC). """ ,
+
dictionaryType = None
+
)
+
cluster_recent_iosize = data_model . property (
+
"clusterRecentIOSize" , int ,
+
array = False , optional = False ,
+
documentation = """The average size of IOPS to all volumes in the cluster. """ ,
+
dictionaryType = None
+
)
+
current_iops = data_model . property (
+
"currentIOPS" , int ,
+
array = False , optional = False ,
+
documentation = """Average IOPS for all volumes in the cluster over the last 5 seconds. """ ,
+
dictionaryType = None
+
)
+
max_iops = data_model . property (
+
"maxIOPS" , int ,
+
array = False , optional = False ,
+
documentation = """Estimated maximum IOPS capability of the current cluster. """ ,
+
dictionaryType = None
+
)
+
max_over_provisionable_space = data_model . property (
+
"maxOverProvisionableSpace" , int ,
+
array = False , optional = False ,
+
documentation = """The maximum amount of provisionable space. This is a computed value. You cannot create new volumes if the current provisioned space plus the new volume size would exceed this number: maxOverProvisionableSpace = maxProvisionedSpace * GetClusterFull """ ,
+
dictionaryType = None
+
)
+
max_provisioned_space = data_model . property (
+
"maxProvisionedSpace" , int ,
+
array = False , optional = False ,
+
documentation = """The total amount of provisionable space if all volumes are 100 % f illed (no thin provisioned metadata). """ ,
+
dictionaryType = None
+
)
+
max_used_metadata_space = data_model . property (
+
"maxUsedMetadataSpace" , int ,
+
array = False , optional = False ,
+
documentation = """The amount of bytes on volume drives used to store metadata. """ ,
+
dictionaryType = None
+
)
+
max_used_space = data_model . property (
+
"maxUsedSpace" , int ,
+
array = False , optional = False ,
+
documentation = """The total amount of space on all active block drives. """ ,
+
dictionaryType = None
+
)
+
non_zero_blocks = data_model . property (
+
"nonZeroBlocks" , int ,
+
array = False , optional = False ,
+
documentation = """Total number of 4KiB blocks with data after the last garbage collection operation has completed. """ ,
+
dictionaryType = None
+
)
+
peak_active_sessions = data_model . property (
+
"peakActiveSessions" , int ,
+
array = False , optional = False ,
+
documentation = """Peak number of iSCSI connections since midnight UTC. """ ,
+
dictionaryType = None
+
)
+
peak_iops = data_model . property (
+
"peakIOPS" , int ,
+
array = False , optional = False ,
+
documentation = """The highest value for currentIOPS since midnight UTC. """ ,
+
dictionaryType = None
+
)
+
provisioned_space = data_model . property (
+
"provisionedSpace" , int ,
+
array = False , optional = False ,
+
documentation = """Total amount of space provisioned in all volumes on the cluster. """ ,
+
dictionaryType = None
+
)
+
snapshot_non_zero_blocks = data_model . property (
+
"snapshotNonZeroBlocks" , int ,
+
array = False , optional = False ,
+
documentation = """Total number of 4KiB blocks in snapshots with data. """ ,
+
dictionaryType = None
+
)
+
timestamp = data_model . property (
+
"timestamp" , str ,
+
array = False , optional = False ,
+
documentation = """The date and time this cluster capacity sample was taken. """ ,
+
dictionaryType = None
+
)
+
total_ops = data_model . property (
+
"totalOps" , int ,
+
array = False , optional = False ,
+
documentation = """The total number of I/O operations performed throughout the lifetime of the cluster """ ,
+
dictionaryType = None
+
)
+
unique_blocks = data_model . property (
+
"uniqueBlocks" , int ,
array = False , optional = False ,
-
documentation = " \
-
Volume replication mode. \
-
\
-
\
-
\
-
Possible values: \
-
\
-
\
-
\
-
**Async**: Writes are acknowledged when they complete locally. The \
-
cluster does not wait for writes to be replicated to the target \
-
cluster. \
-
\
-
\
-
\
-
**Sync**: Source acknowledges write when the data is stored locally \
-
and on the remote cluster. \
-
\
-
\
-
\
-
**SnapshotsOnly**: Only snapshots created on the source cluster will \
-
be replicated. Active writes from the source volume will not be \
-
replicated. \
-
\
-
\
-
\
-
"
+
documentation = """The total number of blocks stored on the block drives. The value includes replicated blocks. """ ,
+
dictionaryType = None
)
-
-
pause_limit = data_model . property (
-
"pauseLimit" , int ,
+
unique_blocks_used_space = data_model . property (
+
"uniqueBlocksUsedSpace" , int ,
array = False , optional = False ,
-
documentation = " \
-
The number of occurring write ops before auto-pausing, on a per volume \
-
pair level. \
-
"
+
documentation = """The total amount of data the uniqueBlocks take up on the block drives. This number is always consistent with the uniqueBlocks value. """ ,
+
dictionaryType = None
)
-
-
remote_service_id = data_model . property (
-
"remoteServiceID" , int ,
+
used_metadata_space = data_model . property (
+
"usedMetadataSpace" , int ,
array = False , optional = False ,
-
documentation = " \
-
The remote slice service ID. \
-
"
+
documentation = """The total amount of bytes on volume drives used to store metadata """ ,
+
dictionaryType = None
)
-
-
resume_details = data_model . property (
-
"resumeDetails" , str ,
+
used_metadata_space_in_snapshots = data_model . property (
+
"usedMetadataSpaceInSnapshots" , int ,
array = False , optional = False ,
-
documentation = " \
-
Reserved for future use. \
-
"
+
documentation = """The amount of bytes on volume drives used for storing unique data in snapshots. This number provides an estimate of how much metadata space would be regained by deleting all snapshots on the system. """ ,
+
dictionaryType = None
)
-
-
snapshot_replication = data_model . property (
-
"snapshotReplication" , SnapshotReplication ,
+
used_space = data_model . property (
+
"usedSpace" , int ,
array = False , optional = False ,
-
documentation = " \
-
The details of snapshot replication. \
-
"
+
documentation = """Total amount of space used by all block drives in the system. """ ,
+
dictionaryType = None
)
+
zero_blocks = data_model . property (
+
"zeroBlocks" , int ,
+
array = False , optional = False ,
+
documentation = """Total number of 4KiB blocks without data after the last round of garabage collection operation has completed. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
active_block_space ,
+
active_sessions ,
+
average_iops ,
+
cluster_recent_iosize ,
+
current_iops ,
+
max_iops ,
+
max_over_provisionable_space ,
+
max_provisioned_space ,
+
max_used_metadata_space ,
+
max_used_space ,
+
non_zero_blocks ,
+
peak_active_sessions ,
+
peak_iops ,
+
provisioned_space ,
+
snapshot_non_zero_blocks ,
+
timestamp ,
+
total_ops ,
+
unique_blocks ,
+
unique_blocks_used_space ,
+
used_metadata_space ,
+
used_metadata_space_in_snapshots ,
+
used_space ,
+
zero_blocks ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetClusterCapacityResult ( data_model . DataObject ):
+
"""GetClusterCapacityResult
+
+
:param cluster_capacity: [required]
+
:type cluster_capacity: ClusterCapacity
-
state = data_model . property (
-
"state" , str ,
+
"""
+
cluster_capacity = data_model . property (
+
"clusterCapacity" , ClusterCapacity ,
array = False , optional = False ,
-
documentation = " \
-
The state of the volume replication. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
state_details = data_model . property (
-
"stateDetails" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Reserved for future use. \
-
"
+
def __init__ ( self ,
+
cluster_capacity ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListVolumeStatsByVirtualVolumeRequest ( data_model . DataObject ):
+
"""ListVolumeStatsByVirtualVolumeRequest
+
ListVolumeStatsByVirtualVolume enables you to list volume statistics for any volumes in the system that are associated with virtual volumes. Statistics are cumulative from the creation of the volume.
+
+
:param virtual_volume_ids: A list of one or more virtual volume IDs for which to retrieve information. If you specify this parameter, the method returns information about only these virtual volumes.
+
:type virtual_volume_ids: UUID
+
+
"""
+
virtual_volume_ids = data_model . property (
+
"virtualVolumeIDs" , UUID ,
+
array = True , optional = True ,
+
documentation = """A list of one or more virtual volume IDs for which to retrieve information. If you specify this parameter, the method returns information about only these virtual volumes. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
virtual_volume_ids = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class ListProtocolEndpointsRequest ( data_model . DataObject ):
+
"""ListProtocolEndpointsRequest
+
ListProtocolEndpoints enables you to retrieve information about all protocol endpoints in the cluster. Protocol endpoints govern
+
access to their associated virtual volume storage containers.
-
[docs] class ResetDrivesDetails ( data_model . DataObject ):
-
"""
+
:param protocol_endpoint_ids: A list of protocol endpoint IDs for which to retrieve information. If you omit this parameter, the method returns information about all protocol endpoints.
+
:type protocol_endpoint_ids: UUID
-
:param drives: [required] Details of a single drive that is being reset.
-
:type drives: ResetDriveDetails[]
"""
+
protocol_endpoint_ids = data_model . property (
+
"protocolEndpointIDs" , UUID ,
+
array = True , optional = True ,
+
documentation = """A list of protocol endpoint IDs for which to retrieve information. If you omit this parameter, the method returns information about all protocol endpoints. """ ,
+
dictionaryType = None
+
)
-
drives = data_model . property (
-
"drives" , ResetDriveDetails ,
-
array = True , optional = False ,
-
documentation = " \
-
Details of a single drive that is being reset. \
-
"
+
def __init__ ( self ,
+
protocol_endpoint_ids = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListSnapshotsRequest ( data_model . DataObject ):
+
"""ListSnapshotsRequest
+
ListSnapshots enables you to return the attributes of each snapshot taken on the volume. Information about snapshots that reside on the target cluster is displayed on the source cluster when this method is called from the source cluster.
+
+
:param volume_id: Retrieves snapshots for a volume. If volumeID is not provided, all snapshots for all volumes are returned.
+
:type volume_id: int
+
+
:param snapshot_id: Retrieves information for a specific snapshot ID.
+
:type snapshot_id: int
+
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = True ,
+
documentation = """Retrieves snapshots for a volume. If volumeID is not provided, all snapshots for all volumes are returned. """ ,
+
dictionaryType = None
+
)
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
+
array = False , optional = True ,
+
documentation = """Retrieves information for a specific snapshot ID. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
volume_id = None ,
+
snapshot_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class SetSnmpInfoResult ( data_model . DataObject ):
+
"""SetSnmpInfoResult
-
[docs] class SnmpV3UsmUser ( data_model . DataObject ):
-
"""
-
The SNMP v3 *usm_user* object is used with the API method *set_snmp_info*
-
to configure SNMP on the cluster.
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetClusterHardwareInfoRequest ( data_model . DataObject ):
+
"""GetClusterHardwareInfoRequest
+
You can use the GetClusterHardwareInfo method to retrieve the hardware status and information for all Fibre Channel nodes, iSCSI
+
nodes and drives in the cluster. This generally includes details about manufacturers, vendors, versions, and other associated hardware
+
identification information.
-
:param access: [required]
+
:param type: Includes only a certain type of hardware information in the response. Possible values are: drives: List only drive information in the response. nodes: List only node information in the response. all: Include both drive and node information in the response. If this parameter is omitted, a type of "all" is assumed.
+
:type type: str
-
**rouser**: read-only access.*
+
"""
+
type = data_model . property (
+
"type" , str ,
+
array = False , optional = True ,
+
documentation = """Includes only a certain type of hardware information in the response. Possible values are: drives: List only drive information in the response. nodes: List only node information in the response. all: Include both drive and node information in the response. If this parameter is omitted, a type of "all" is assumed. """ ,
+
dictionaryType = None
+
)
-
**rwuser**: for read-write access.
+
def __init__ ( self ,
+
type = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
**rosys**: for read-only access to a restricted set of system
-
information *SolidFire recommends that all USM users be set to
-
\"rouser\" access, because all SolidFire MIB objects are read-only.
+
[docs] class CloneVolumeRequest ( data_model . DataObject ):
+
"""CloneVolumeRequest
+
CloneVolume enables you to create a copy of a volume. This method is asynchronous and might take a variable amount of time to complete. The cloning process begins immediately when you make the CloneVolume request and is representative of the state of the volume when the API method is issued. You can use the GetAsyncResult method to determine when the cloning process is complete and the new volume is available for connections. You can use ListSyncJobs to see the progress of creating the clone.
+
Note: The initial attributes and QoS settings for the volume are inherited from the volume being cloned. You can change these settings with ModifyVolume.
+
Note: Cloned volumes do not inherit volume access group memberships from the source volume.
-
:type access: str
+
:param volume_id: [required] VolumeID for the volume to be cloned.
+
:type volume_id: int
-
:param name: [required] The name of the user. Must contain at least one
-
character, but no more than 32 characters. Blank spaces are not
-
allowed.
+
:param name: [required] The name of the new cloned volume. Might be 1 to 64 characters in length.
:type name: str
-
:param password: [required] The password of the user. Must be between 8 and
-
255 characters long (inclusive). Blank spaces are not allowed. Required
-
if \"secLevel\" is \"auth\" or \"priv.\"
-
:type password: str
+
:param new_account_id: AccountID for the owner of the new volume. If unspecified, the accountID of the owner of the volume being cloned is used.
+
:type new_account_id: int
-
:param passphrase: [required] The passphrase of the user. Must be between 8
-
and 255 characters long (inclusive). Blank spaces are not allowed.
-
Required if \"secLevel\" is \"priv.\"
-
:type passphrase: str
+
:param new_size: New size of the volume, in bytes. Might be greater or less than the size of the volume being cloned. If unspecified, the volume size is not changed. Size is rounded to the nearest 1MB.
+
:type new_size: int
-
:param sec_level: [required]
+
:param access: Specifies the level of access allowed for the new volume. Possible values are: readOnly: Only read operations are allowed. readWrite: Reads and writes are allowed. locked: No reads or writes are allowed. If unspecified, the level of access of the volume being cloned is used. replicationTarget: Identify a volume as the target volume for a paired set of volumes. If the volume is not paired, the access status is locked. If a value is not specified, the access value does not change.
+
:type access: str
-
**noauth**: No password or passphrase is required.
+
:param snapshot_id: ID of the snapshot that is used as the source of the clone. If no ID is provided, the current active volume is used.
+
:type snapshot_id: int
-
**auth**: A password is required for user access.
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
-
**priv**: A password and passphrase is required for user access.
+
:param enable512e: Should the volume provide 512-byte sector emulation?
+
:type enable512e: bool
-
:type sec_level: str
"""
-
-
access = data_model . property (
-
"access" , str ,
+
volume_id = data_model . property (
+
"volumeID" , int ,
array = False , optional = False ,
-
documentation = " \
-
\
-
\
-
**rouser**: read-only access.* \
-
\
-
\
-
\
-
**rwuser**: for read-write access. \
-
\
-
\
-
\
-
**rosys**: for read-only access to a restricted set of system \
-
information \
-
\
-
*SolidFire recommends that all USM users be set to \" rouser \" access, \
-
because all SolidFire MIB objects are read-only. \
-
"
+
documentation = """VolumeID for the volume to be cloned. """ ,
+
dictionaryType = None
)
-
name = data_model . property (
"name" , str ,
array = False , optional = False ,
-
documentation = " \
-
The name of the user. Must contain at least one character, but no more \
-
than 32 characters. Blank spaces are not allowed. \
-
"
+
documentation = """The name of the new cloned volume. Might be 1 to 64 characters in length. """ ,
+
dictionaryType = None
)
-
-
password = data_model . property (
-
"password" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The password of the user. Must be between 8 and 255 characters long \
-
(inclusive). Blank spaces are not allowed. Required if * \" sec_level \" * \
-
is \" auth \" or \" priv. \"\
-
"
+
new_account_id = data_model . property (
+
"newAccountID" , int ,
+
array = False , optional = True ,
+
documentation = """AccountID for the owner of the new volume. If unspecified, the accountID of the owner of the volume being cloned is used. """ ,
+
dictionaryType = None
)
-
-
passphrase = data_model . property (
-
"passphrase" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The passphrase of the user. Must be between 8 and 255 characters long \
-
(inclusive). Blank spaces are not allowed. Required if * \" sec_level \" * \
-
is \" priv. \"\
-
"
+
new_size = data_model . property (
+
"newSize" , int ,
+
array = False , optional = True ,
+
documentation = """New size of the volume, in bytes. Might be greater or less than the size of the volume being cloned. If unspecified, the volume size is not changed. Size is rounded to the nearest 1MB. """ ,
+
dictionaryType = None
+
)
+
access = data_model . property (
+
"access" , str ,
+
array = False , optional = True ,
+
documentation = """Specifies the level of access allowed for the new volume. Possible values are: readOnly: Only read operations are allowed. readWrite: Reads and writes are allowed. locked: No reads or writes are allowed. If unspecified, the level of access of the volume being cloned is used. replicationTarget: Identify a volume as the target volume for a paired set of volumes. If the volume is not paired, the access status is locked. If a value is not specified, the access value does not change. """ ,
+
dictionaryType = None
+
)
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
+
array = False , optional = True ,
+
documentation = """ID of the snapshot that is used as the source of the clone. If no ID is provided, the current active volume is used. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
)
+
enable512e = data_model . property (
+
"enable512e" , bool ,
+
array = False , optional = True ,
+
documentation = """Should the volume provide 512-byte sector emulation? """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_id ,
+
name ,
+
new_account_id = None ,
+
new_size = None ,
+
access = None ,
+
snapshot_id = None ,
+
attributes = None ,
+
enable512e = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class AddLdapClusterAdminResult ( data_model . DataObject ):
+
"""AddLdapClusterAdminResult
+
+
:param cluster_admin_id:
+
:type cluster_admin_id: int
-
sec_level = data_model . property (
-
"secLevel" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
\
-
\
-
**noauth**: No password or passphrase is required. \
-
\
-
\
-
\
-
**auth**: A password is required for user access. \
-
\
-
\
-
\
-
**priv**: A password and passphrase is required for user access. \
-
\
-
"
+
"""
+
cluster_admin_id = data_model . property (
+
"clusterAdminID" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
cluster_admin_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class ListAccountsRequest ( data_model . DataObject ):
+
"""ListAccountsRequest
+
ListAccounts returns the entire list of accounts, with optional paging support.
-
[docs] class AddedNode ( data_model . DataObject ):
-
"""
+
:param start_account_id: Starting AccountID to return. If no account exists with this AccountID, the next account by AccountID order is used as the start of the list. To page through the list, pass the AccountID of the last account in the previous response + 1.
+
:type start_account_id: int
-
:param node_id: [required]
-
:type node_id: int
+
:param limit: Maximum number of AccountInfo objects to return.
+
:type limit: int
-
:param pending_node_id: [required]
-
:type pending_node_id: int
-
"""
+
:param include_storage_containers: Includes storage containers in the response by default. To exclude storage containers, set to false.
+
:type include_storage_containers: bool
-
node_id = data_model . property (
-
"nodeID" , int ,
-
array = False , optional = False ,
-
documentation = None
+
"""
+
start_account_id = data_model . property (
+
"startAccountID" , int ,
+
array = False , optional = True ,
+
documentation = """Starting AccountID to return. If no account exists with this AccountID, the next account by AccountID order is used as the start of the list. To page through the list, pass the AccountID of the last account in the previous response + 1. """ ,
+
dictionaryType = None
)
-
-
pending_node_id = data_model . property (
-
"pendingNodeID" , int ,
-
array = False , optional = False ,
-
documentation = None
+
limit = data_model . property (
+
"limit" , int ,
+
array = False , optional = True ,
+
documentation = """Maximum number of AccountInfo objects to return. """ ,
+
dictionaryType = None
+
)
+
include_storage_containers = data_model . property (
+
"includeStorageContainers" , bool ,
+
array = False , optional = True ,
+
documentation = """Includes storage containers in the response by default. To exclude storage containers, set to false. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
start_account_id = None ,
+
limit = None ,
+
include_storage_containers = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class RollbackToSnapshotResult ( data_model . DataObject ):
+
"""RollbackToSnapshotResult
-
[docs] class BackupTarget ( data_model . DataObject ):
-
"""
-
The object containing information about a backup target.
+
:param snapshot:
+
:type snapshot: Snapshot
-
:param name: [required] Name for the backup target.
-
:type name: str
+
:param snapshot_id: ID of the newly-created snapshot.
+
:type snapshot_id: int
-
:param backup_target_id: [required] Unique identifier assigned to the
-
backup target.
-
:type backup_target_id: int
+
:param checksum: A string that represents the correct digits in the stored snapshot. This checksum can be used later to compare other snapshots to detect errors in the data.
+
:type checksum: str
-
:param attributes: (optional) List of Name/Value pairs in JSON object
-
format.
-
:type attributes: dict
"""
-
-
name = data_model . property (
-
"name" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Name for the backup target. \
-
"
+
snapshot = data_model . property (
+
"snapshot" , Snapshot ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
backup_target_id = data_model . property (
-
"backupTargetID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Unique identifier assigned to the backup target. \
-
"
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
+
array = False , optional = True ,
+
documentation = """ID of the newly-created snapshot. """ ,
+
dictionaryType = None
)
-
-
attributes = data_model . property (
-
"attributes" , dict ,
+
checksum = data_model . property (
+
"checksum" , str ,
array = False , optional = True ,
-
documentation = " \
-
List of Name/Value pairs in JSON object format. \
-
"
+
documentation = """A string that represents the correct digits in the stored snapshot. This checksum can be used later to compare other snapshots to detect errors in the data. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
-
-
[docs] class BulkVolumeJob ( data_model . DataObject ):
-
"""
-
-
:param bulk_volume_id: [required] The internal bulk volume job ID.
-
:type bulk_volume_id: int
-
-
:param create_time: [required] Timestamp created for the bulk volume job.
-
:type create_time: str
+
def __init__ ( self ,
+
snapshot = None ,
+
snapshot_id = None ,
+
checksum = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param elapsed_time: [required] The number of seconds since the job began.
-
:type elapsed_time: int
+
[docs] class RestoreDeletedVolumeResult ( data_model . DataObject ):
+
"""RestoreDeletedVolumeResult
-
:param format: [required] Format is either \"compressed\" or \"native\".
-
:type format: str
+
"""
-
:param key: [required] The unique key created by the bulk volume session.
-
:type key: str
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param percent_complete: [required] The completed percentage reported by
-
the operation.
-
:type percent_complete: int
+
[docs] class ListDeletedVolumesRequest ( data_model . DataObject ):
+
"""ListDeletedVolumesRequest
+
ListDeletedVolumes enables you to retrieve the list of volumes that have been marked for deletion and purged from the system.
-
:param remaining_time: [required] The estimated time remaining in seconds.
-
:type remaining_time: int
+
:param include_virtual_volumes: Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false.
+
:type include_virtual_volumes: bool
-
:param src_volume_id: [required] The source volume ID.
-
:type src_volume_id: int
+
"""
+
include_virtual_volumes = data_model . property (
+
"includeVirtualVolumes" , bool ,
+
array = False , optional = True ,
+
documentation = """Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false. """ ,
+
dictionaryType = None
+
)
-
:param status: [required] Can be one of the following:
+
def __init__ ( self ,
+
include_virtual_volumes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
**preparing**
+
[docs] class CompleteVolumePairingResult ( data_model . DataObject ):
+
"""CompleteVolumePairingResult
-
**active**
+
"""
-
**done**
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
**failed**
+
[docs] class TestConnectMvipRequest ( data_model . DataObject ):
+
"""TestConnectMvipRequest
+
The TestConnectMvip API method enables you to test the
+
management connection to the cluster. The test pings the MVIP and executes a simple API method to verify connectivity.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
-
:type status: str
+
:param mvip: If specified, tests the management connection of a different MVIP. You do not need to use this value when testing the connection to the target cluster. This parameter is optional.
+
:type mvip: str
-
:param script: [required] The name of the script if one is provided.
-
:type script: str
+
"""
+
mvip = data_model . property (
+
"mvip" , str ,
+
array = False , optional = True ,
+
documentation = """If specified, tests the management connection of a different MVIP. You do not need to use this value when testing the connection to the target cluster. This parameter is optional. """ ,
+
dictionaryType = None
+
)
-
:param snapshot_id: [required] ID of the snapshot if a snapshot is in the
-
source of the bulk volume job.
-
:type snapshot_id: int
+
def __init__ ( self ,
+
mvip = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param type: [required] Can be one of the following:
+
[docs] class TestLdapAuthenticationRequest ( data_model . DataObject ):
+
"""TestLdapAuthenticationRequest
+
The TestLdapAuthentication method enables you to validate the currently enabled LDAP authentication settings. If the configuration is
+
correct, the API call returns the group membership of the tested user.
-
**read**
+
:param username: [required] The username to be tested.
+
:type username: str
-
**write**
+
:param password: [required] The password for the username to be tested.
+
:type password: str
-
:type type: str
+
:param ldap_configuration: An ldapConfiguration object to be tested. If specified, the API call tests the provided configuration even if LDAP authentication is disabled.
+
:type ldap_configuration: LdapConfiguration
-
:param attributes: [required] JSON attributes on the bulk volume job.
-
:type attributes: dict
"""
-
-
bulk_volume_id = data_model . property (
-
"bulkVolumeID" , int ,
+
username = data_model . property (
+
"username" , str ,
array = False , optional = False ,
-
documentation = " \
-
The internal bulk volume job ID. \
-
"
+
documentation = """The username to be tested. """ ,
+
dictionaryType = None
)
-
-
create_time = data_model . property (
-
"createTime" , str ,
+
password = data_model . property (
+
"password" , str ,
array = False , optional = False ,
-
documentation = " \
-
Timestamp created for the bulk volume job. \
-
"
+
documentation = """The password for the username to be tested. """ ,
+
dictionaryType = None
)
-
-
elapsed_time = data_model . property (
-
"elapsedTime" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The number of seconds since the job began. \
-
"
+
ldap_configuration = data_model . property (
+
"ldapConfiguration" , LdapConfiguration ,
+
array = False , optional = True ,
+
documentation = """An ldapConfiguration object to be tested. If specified, the API call tests the provided configuration even if LDAP authentication is disabled. """ ,
+
dictionaryType = None
)
-
format = data_model . property (
-
"format" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Format is either \" compressed \" or \" native \" . \
-
"
-
)
+
def __init__ ( self ,
+
username ,
+
password ,
+
ldap_configuration = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
key = data_model . property (
-
"key" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The unique key created by the bulk volume session. \
-
"
-
)
+
[docs] class ListVirtualVolumeBindingsRequest ( data_model . DataObject ):
+
"""ListVirtualVolumeBindingsRequest
+
ListVirtualVolumeBindings returns a list of all virtual volumes in the cluster that are bound to protocol endpoints.
-
percent_complete = data_model . property (
-
"percentComplete" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The completed percentage reported by the operation. \
-
"
-
)
+
:param virtual_volume_binding_ids: A list of virtual volume binding IDs for which to retrieve information. If you omit this parameter, the method returns information about all virtual volume bindings.
+
:type virtual_volume_binding_ids: int
-
remaining_time = data_model . property (
-
"remainingTime" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The estimated time remaining in seconds. \
-
"
+
"""
+
virtual_volume_binding_ids = data_model . property (
+
"virtualVolumeBindingIDs" , int ,
+
array = True , optional = True ,
+
documentation = """A list of virtual volume binding IDs for which to retrieve information. If you omit this parameter, the method returns information about all virtual volume bindings. """ ,
+
dictionaryType = None
)
-
src_volume_id = data_model . property (
-
"srcVolumeID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The source volume ID. \
-
"
-
)
+
def __init__ ( self ,
+
virtual_volume_binding_ids = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
status = data_model . property (
-
"status" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Can be one of the following: \
-
\
-
\
-
**preparing** \
-
\
-
\
-
\
-
**active** \
-
\
-
\
-
\
-
**done** \
-
\
-
\
-
\
-
**failed** \
-
\
-
"
-
)
+
[docs] class AddClusterAdminRequest ( data_model . DataObject ):
+
"""AddClusterAdminRequest
+
You can use AddClusterAdmin to add a new cluster admin account. A cluster ddmin can manage the cluster using the API and management tools. Cluster admins are completely separate and unrelated to standard tenant accounts.
+
Each cluster admin can be restricted to a subset of the API. NetApp recommends using multiple cluster admin accounts for different users and applications. You should give each cluster admin the minimal permissions necessary; this reduces the potential impact of credential compromise.
+
You must accept the End User License Agreement (EULA) by setting the acceptEula parameter to true to add a cluster administrator account to the system.
-
script = data_model . property (
-
"script" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The name of the script if one is provided. \
-
"
-
)
+
:param username: [required] Unique username for this cluster admin. Must be between 1 and 1024 characters in length.
+
:type username: str
-
snapshot_id = data_model . property (
-
"snapshotID" , int ,
+
:param password: [required] Password used to authenticate this cluster admin.
+
:type password: str
+
+
:param access: [required] Controls which methods this cluster admin can use. For more details on the levels of access, see Access Control in the Element API Reference Guide.
+
:type access: str
+
+
:param accept_eula: Required to indicate your acceptance of the End User License Agreement when creating this cluster. To accept the EULA, set this parameter to true.
+
:type accept_eula: bool
+
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
username = data_model . property (
+
"username" , str ,
array = False , optional = False ,
-
documentation = " \
-
ID of the snapshot if a snapshot is in the source of the bulk volume \
-
job. \
-
"
+
documentation = """Unique username for this cluster admin. Must be between 1 and 1024 characters in length. """ ,
+
dictionaryType = None
)
-
-
type = data_model . property (
-
"type" , str ,
+
password = data_model . property (
+
"password" , str ,
array = False , optional = False ,
-
documentation = " \
-
Can be one of the following: \
-
\
-
\
-
**read** \
-
\
-
\
-
\
-
**write** \
-
\
-
"
+
documentation = """Password used to authenticate this cluster admin. """ ,
+
dictionaryType = None
+
)
+
access = data_model . property (
+
"access" , str ,
+
array = True , optional = False ,
+
documentation = """Controls which methods this cluster admin can use. For more details on the levels of access, see Access Control in the Element API Reference Guide. """ ,
+
dictionaryType = None
+
)
+
accept_eula = data_model . property (
+
"acceptEula" , bool ,
+
array = False , optional = True ,
+
documentation = """Required to indicate your acceptance of the End User License Agreement when creating this cluster. To accept the EULA, set this parameter to true. """ ,
+
dictionaryType = None
)
-
attributes = data_model . property (
"attributes" , dict ,
-
array = False , optional = False ,
-
documentation = " \
-
JSON attributes on the bulk volume job. \
-
"
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
username ,
+
password ,
+
access ,
+
accept_eula = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class ResetDriveDetails ( data_model . DataObject ):
+
"""ResetDriveDetails
-
[docs] class ClusterAdmin ( data_model . DataObject ):
-
"""
+
:param drive: [required] Drive name
+
:type drive: str
-
:param access: [required]
-
:type access: str[]
+
:param return_code: [required]
+
:type return_code: int
-
:param cluster_admin_id: [required]
-
:type cluster_admin_id: int
+
:param stderr: [required]
+
:type stderr: str
-
:param username: [required]
-
:type username: str
+
:param stdout: [required]
+
:type stdout: str
-
:param attributes: [required] List of Name/Value pairs in JSON object
-
format.
-
:type attributes: dict
"""
-
-
access = data_model . property (
-
"access" , str ,
-
array = True , optional = False ,
-
documentation = None
+
drive = data_model . property (
+
"drive" , str ,
+
array = False , optional = False ,
+
documentation = """Drive name """ ,
+
dictionaryType = None
)
-
-
cluster_admin_id = data_model . property (
-
"clusterAdminID" , int ,
+
return_code = data_model . property (
+
"returnCode" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
username = data_model . property (
-
"username" , str ,
+
stderr = data_model . property (
+
"stderr" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
attributes = data_model . property (
-
"attributes" , dict ,
+
stdout = data_model . property (
+
"stdout" , str ,
array = False , optional = False ,
-
documentation = " \
-
List of Name/Value pairs in JSON object format. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
-
-
[docs] class ClusterVersionInfo ( data_model . DataObject ):
-
"""
-
Version information for a node in the cluster.
+
def __init__ ( self ,
+
drive ,
+
return_code ,
+
stderr ,
+
stdout ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param node_id: [required]
-
:type node_id: int
+
[docs] class ResetDrivesDetails ( data_model . DataObject ):
+
"""ResetDrivesDetails
-
:param node_version: [required]
-
:type node_version: str
+
:param drives: [required] Details of a single drive that is being reset.
+
:type drives: ResetDriveDetails
-
:param node_internal_revision: [required]
-
:type node_internal_revision: str
"""
-
-
node_id = data_model . property (
-
"nodeID" , int ,
-
array = False , optional = False ,
-
documentation = None
+
drives = data_model . property (
+
"drives" , ResetDriveDetails ,
+
array = True , optional = False ,
+
documentation = """Details of a single drive that is being reset. """ ,
+
dictionaryType = None
)
-
node_version = data_model . property (
-
"nodeVersion" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
def __init__ ( self ,
+
drives ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
node_internal_revision = data_model . property (
-
"nodeInternalRevision" , str ,
+
[docs] class ResetDrivesResult ( data_model . DataObject ):
+
"""ResetDrivesResult
+
+
:param details: [required] Details of drives that are being reset.
+
:type details: ResetDrivesDetails
+
+
"""
+
details = data_model . property (
+
"details" , ResetDrivesDetails ,
array = False , optional = False ,
-
documentation = None
+
documentation = """Details of drives that are being reset. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
+
def __init__ ( self ,
+
details ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
[docs] class GroupCloneVolumeMember ( data_model . DataObject ):
-
"""
-
Represents the relationship between the source Volume and cloned Volume
-
IDs.
+
[docs] class RemoveAccountRequest ( data_model . DataObject ):
+
"""RemoveAccountRequest
+
RemoveAccount enables you to remove an existing account. You must delete and purge all volumes associated with the account
+
using DeleteVolume before you can remove the account. If volumes on the account are still pending deletion, you cannot use
+
RemoveAccount to remove the account.
-
:param volume_id: [required] The *volume_id* of the cloned volume.
-
:type volume_id: int
+
:param account_id: [required] Specifies the AccountID for the account to be removed.
+
:type account_id: int
-
:param src_volume_id: [required] The *volume_id* of the source volume.
-
:type src_volume_id: int
"""
-
-
volume_id = data_model . property (
-
"volumeID" , int ,
+
account_id = data_model . property (
+
"accountID" , int ,
array = False , optional = False ,
-
documentation = " \
-
The *volume_id* of the cloned volume. \
-
"
+
documentation = """Specifies the AccountID for the account to be removed. """ ,
+
dictionaryType = None
)
-
src_volume_id = data_model . property (
-
"srcVolumeID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The *volume_id* of the source volume. \
-
"
-
)
+
def __init__ ( self ,
+
account_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class RemoveVolumePairResult ( data_model . DataObject ):
+
"""RemoveVolumePairResult
+
"""
-
[docs] class LunAssignment ( data_model . DataObject ):
-
"""
-
*volume_id* and Lun assignment.
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param volume_id: [required] The volume ID assigned to the Lun.
-
:type volume_id: int
+
[docs] class ListSchedulesResult ( data_model . DataObject ):
+
"""ListSchedulesResult
-
:param lun: [required] Correct LUN values are 0 - 16383. An exception will
-
be seen if an incorrect LUN value is passed.
-
:type lun: int
-
"""
+
:param schedules: [required] The list of schedules currently on the cluster.
+
:type schedules: Schedule
-
volume_id = data_model . property (
-
"volumeID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The volume ID assigned to the Lun. \
-
"
+
"""
+
schedules = data_model . property (
+
"schedules" , Schedule ,
+
array = True , optional = False ,
+
documentation = """The list of schedules currently on the cluster. """ ,
+
dictionaryType = None
)
-
lun = data_model . property (
-
"lun" , int ,
+
def __init__ ( self ,
+
schedules ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class RemoveClusterPairRequest ( data_model . DataObject ):
+
"""RemoveClusterPairRequest
+
You can use the RemoveClusterPair method to close the open connections between two paired clusters.
+
Note: Before you remove a cluster pair, you must first remove all volume pairing to the clusters with the "RemoveVolumePair" API method.
+
+
:param cluster_pair_id: [required] Unique identifier used to pair two clusters.
+
:type cluster_pair_id: int
+
+
"""
+
cluster_pair_id = data_model . property (
+
"clusterPairID" , int ,
array = False , optional = False ,
-
documentation = " \
-
Correct LUN values are 0 - 16383. An exception will be seen if an \
-
incorrect LUN value is passed. \
-
"
+
documentation = """Unique identifier used to pair two clusters. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
cluster_pair_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class ClusterStats ( data_model . DataObject ):
+
"""ClusterStats
-
[docs] class Network ( data_model . DataObject ):
-
"""
+
:param cluster_utilization: [required] The amount of cluster capacity being utilized.
+
:type cluster_utilization: float
-
:param bond10_g: (optional)
-
:type bond10_g: NetworkConfig
+
:param client_queue_depth: [required]
+
:type client_queue_depth: int
-
:param bond1_g: (optional)
-
:type bond1_g: NetworkConfig
-
"""
+
:param read_bytes: [required] Total bytes read by clients.
+
:type read_bytes: int
-
bond10_g = data_model . property (
-
"Bond10G" , NetworkConfig ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
:param read_ops: [required] Total read operations.
+
:type read_ops: int
-
bond1_g = data_model . property (
-
"Bond1G" , NetworkConfig ,
-
array = False , optional = True ,
-
documentation = None
-
)
+
:param timestamp: [required] Current time in UTC format. ISO 8601 date string.
+
:type timestamp: str
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
:param write_bytes: [required] Total bytes written by clients.
+
:type write_bytes: int
+
:param write_ops: [required] Total write operations.
+
:type write_ops: int
-
[docs] class NodeStatsInfo ( data_model . DataObject ):
-
"""
+
:param actual_iops:
+
:type actual_iops: int
-
:param c_bytes_in: [required] Bytes in on the cluster interface.
-
:type c_bytes_in: int
+
:param average_iopsize:
+
:type average_iopsize: int
-
:param c_bytes_out: [required] Bytes out on the cluster interface.
-
:type c_bytes_out: int
+
:param latency_usec:
+
:type latency_usec: int
-
:param cpu: [required] CPU Usage %
-
:type cpu: int
+
:param read_bytes_last_sample:
+
:type read_bytes_last_sample: int
-
:param m_bytes_in: [required] Bytes in on the management interface.
-
:type m_bytes_in: int
+
:param read_latency_usec:
+
:type read_latency_usec: int
-
:param m_bytes_out: [required] Bytes out on the management interface.
-
:type m_bytes_out: int
+
:param read_ops_last_sample:
+
:type read_ops_last_sample: int
-
:param network_utilization_cluster: [required] Network interface
-
utilization (in %) for the cluster network interface.
-
:type network_utilization_cluster: int
+
:param sample_period_msec:
+
:type sample_period_msec: int
-
:param network_utilization_storage: [required] Network interface
-
utilization (in %) for the storage network interface.
-
:type network_utilization_storage: int
+
:param unaligned_reads:
+
:type unaligned_reads: int
-
:param node_id: [required]
-
:type node_id: int
+
:param unaligned_writes:
+
:type unaligned_writes: int
-
:param s_bytes_in: [required] Bytes in on the storage interface.
-
:type s_bytes_in: int
+
:param write_bytes_last_sample:
+
:type write_bytes_last_sample: int
-
:param s_bytes_out: [required] Bytes out on the storage interface.
-
:type s_bytes_out: int
+
:param write_latency_usec:
+
:type write_latency_usec: int
-
:param timestamp: [required] Current time in UTC format ISO 8691 date
-
string.
-
:type timestamp: str
+
:param write_ops_last_sample:
+
:type write_ops_last_sample: int
-
:param used_memory: [required] Total memory usage in bytes.
-
:type used_memory: int
"""
-
-
c_bytes_in = data_model . property (
-
"cBytesIn" , int ,
+
cluster_utilization = data_model . property (
+
"clusterUtilization" , float ,
array = False , optional = False ,
-
documentation = " \
-
Bytes in on the cluster interface. \
-
"
+
documentation = """The amount of cluster capacity being utilized. """ ,
+
dictionaryType = None
)
-
-
c_bytes_out = data_model . property (
-
"cBytesOut" , int ,
+
client_queue_depth = data_model . property (
+
"clientQueueDepth" , int ,
array = False , optional = False ,
-
documentation = " \
-
Bytes out on the cluster interface. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
cpu = data_model . property (
-
"cpu" , int ,
+
read_bytes = data_model . property (
+
"readBytes" , int ,
array = False , optional = False ,
-
documentation = " \
-
CPU Usage % \
-
"
+
documentation = """Total bytes read by clients. """ ,
+
dictionaryType = None
)
-
-
m_bytes_in = data_model . property (
-
"mBytesIn" , int ,
+
read_ops = data_model . property (
+
"readOps" , int ,
array = False , optional = False ,
-
documentation = " \
-
Bytes in on the management interface. \
-
"
+
documentation = """Total read operations. """ ,
+
dictionaryType = None
)
-
-
m_bytes_out = data_model . property (
-
"mBytesOut" , int ,
+
timestamp = data_model . property (
+
"timestamp" , str ,
array = False , optional = False ,
-
documentation = " \
-
Bytes out on the management interface. \
-
"
+
documentation = """Current time in UTC format. ISO 8601 date string. """ ,
+
dictionaryType = None
)
-
-
network_utilization_cluster = data_model . property (
-
"networkUtilizationCluster" , int ,
+
write_bytes = data_model . property (
+
"writeBytes" , int ,
array = False , optional = False ,
-
documentation = " \
-
Network interface utilization (in %) for the cluster network \
-
interface. \
-
"
+
documentation = """Total bytes written by clients. """ ,
+
dictionaryType = None
)
-
-
network_utilization_storage = data_model . property (
-
"networkUtilizationStorage" , int ,
+
write_ops = data_model . property (
+
"writeOps" , int ,
array = False , optional = False ,
-
documentation = " \
-
Network interface utilization (in %) for the storage network \
-
interface. \
-
"
+
documentation = """Total write operations. """ ,
+
dictionaryType = None
)
-
-
node_id = data_model . property (
-
"nodeID" , int ,
-
array = False , optional = False ,
-
documentation = None
+
actual_iops = data_model . property (
+
"actualIOPS" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
s_bytes_in = data_model . property (
-
"sBytesIn" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Bytes in on the storage interface. \
-
"
+
average_iopsize = data_model . property (
+
"averageIOPSize" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
s_bytes_out = data_model . property (
-
"sBytesOut" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Bytes out on the storage interface. \
-
"
+
latency_usec = data_model . property (
+
"latencyUSec" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
timestamp = data_model . property (
-
"timestamp" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Current time in UTC format ISO 8691 date string. \
-
"
+
read_bytes_last_sample = data_model . property (
+
"readBytesLastSample" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
used_memory = data_model . property (
-
"usedMemory" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Total memory usage in bytes. \
-
"
+
read_latency_usec = data_model . property (
+
"readLatencyUSec" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
-
-
[docs] class TestConnectMvipDetails ( data_model . DataObject ):
-
"""
-
-
:param ping_bytes: [required] Details of the ping tests with 56 Bytes and
-
1500 Bytes.
-
:type ping_bytes: str
-
-
:param mvip: [required] The MVIP tested against.
-
:type mvip: str
-
-
:param connected: [required] Whether the test could connect to the MVIP.
-
:type connected: bool
-
"""
-
-
ping_bytes = data_model . property (
-
"pingBytes" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Details of the ping tests with 56 Bytes and 1500 Bytes. \
-
"
+
read_ops_last_sample = data_model . property (
+
"readOpsLastSample" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
mvip = data_model . property (
-
"mvip" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The MVIP tested against. \
-
"
+
sample_period_msec = data_model . property (
+
"samplePeriodMsec" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
connected = data_model . property (
-
"connected" , bool ,
-
array = False , optional = False ,
-
documentation = " \
-
Whether the test could connect to the MVIP. \
-
"
+
unaligned_reads = data_model . property (
+
"unalignedReads" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
-
-
[docs] class TestConnectSvipDetails ( data_model . DataObject ):
-
"""
-
-
:param ping_bytes: [required] Details of the ping tests with 56 Bytes and
-
1500 Bytes.
-
:type ping_bytes: str
-
-
:param svip: [required] The SVIP tested against.
-
:type svip: str
-
-
:param connected: [required] Whether the test could connect to the MVIP.
-
:type connected: bool
-
"""
-
-
ping_bytes = data_model . property (
-
"pingBytes" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Details of the ping tests with 56 Bytes and 1500 Bytes. \
-
"
+
unaligned_writes = data_model . property (
+
"unalignedWrites" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
svip = data_model . property (
-
"svip" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The SVIP tested against. \
-
"
+
write_bytes_last_sample = data_model . property (
+
"writeBytesLastSample" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
write_latency_usec = data_model . property (
+
"writeLatencyUSec" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
+
write_ops_last_sample = data_model . property (
+
"writeOpsLastSample" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
cluster_utilization ,
+
client_queue_depth ,
+
read_bytes ,
+
read_ops ,
+
timestamp ,
+
write_bytes ,
+
write_ops ,
+
actual_iops = None ,
+
average_iopsize = None ,
+
latency_usec = None ,
+
read_bytes_last_sample = None ,
+
read_latency_usec = None ,
+
read_ops_last_sample = None ,
+
sample_period_msec = None ,
+
unaligned_reads = None ,
+
unaligned_writes = None ,
+
write_bytes_last_sample = None ,
+
write_latency_usec = None ,
+
write_ops_last_sample = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetClusterStatsResult ( data_model . DataObject ):
+
"""GetClusterStatsResult
+
+
:param cluster_stats: [required]
+
:type cluster_stats: ClusterStats
-
connected = data_model . property (
-
"connected" , bool ,
+
"""
+
cluster_stats = data_model . property (
+
"clusterStats" , ClusterStats ,
array = False , optional = False ,
-
documentation = " \
-
Whether the test could connect to the MVIP. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
-
-
[docs] class CloneMultipleVolumeParams ( data_model . DataObject ):
-
"""
-
-
:param volume_id: [required] Required parameter for \"volumes\" array:
-
volumeID.
-
:type volume_id: int
-
-
:param access: (optional) Access settings for the new volume.
+
def __init__ ( self ,
+
cluster_stats ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
**readOnly**: Only read operations are allowed.
+
[docs] class ListStorageContainersRequest ( data_model . DataObject ):
+
"""ListStorageContainersRequest
+
ListStorageContainers enables you to retrieve information about all virtual volume storage containers known to the system.
-
**readWrite**: Reads and writes are allowed.
+
:param storage_container_ids: A list of storage container IDs for which to retrieve information. If you omit this parameter, the method returns information about all storage containers in the system.
+
:type storage_container_ids: UUID
-
**locked**: No reads or writes are allowed.
+
"""
+
storage_container_ids = data_model . property (
+
"storageContainerIDs" , UUID ,
+
array = True , optional = True ,
+
documentation = """A list of storage container IDs for which to retrieve information. If you omit this parameter, the method returns information about all storage containers in the system. """ ,
+
dictionaryType = None
+
)
-
**replicationTarget**: Identify a volume as the target volume for a
-
paired set of volumes. If the volume is not paired, the access status
-
is locked.
+
def __init__ ( self ,
+
storage_container_ids = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
If unspecified, the access settings of the clone will be the same as
-
the source.
+
[docs] class RestartNetworkingRequest ( data_model . DataObject ):
+
"""RestartNetworkingRequest
+
The RestartNetworking API method enables you to restart the networking services on a node.
+
Warning: This method restarts all networking services on a node, causing temporary loss of networking connectivity.
+
Exercise caution when using this method.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
-
:type access: str
+
:param force: [required] Required parameter to successfully reset the node.
+
:type force: bool
-
:param name: (optional) New name for the clone.
-
:type name: str
+
"""
+
force = data_model . property (
+
"force" , bool ,
+
array = False , optional = False ,
+
documentation = """Required parameter to successfully reset the node. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
force ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CopyVolumeRequest ( data_model . DataObject ):
+
"""CopyVolumeRequest
+
CopyVolume enables you to overwrite the data contents of an existing volume with the data contents of another volume (or
+
snapshot). Attributes of the destination volume such as IQN, QoS settings, size, account, and volume access group membership are
+
not changed. The destination volume must already exist and must be the same size as the source volume.
+
NetApp strongly recommends that clients unmount the destination volume before the CopyVolume operation begins. If the
+
destination volume is modified during the copy operation, the changes will be lost.
+
This method is asynchronous and may take a variable amount of time to complete. You can use the GetAsyncResult method to
+
determine when the process has finished, and ListSyncJobs to see the progress of the copy.
+
+
:param volume_id: [required] VolumeID of the volume to be read from.
+
:type volume_id: int
-
:param new_account_id: (optional) Account ID for the new volume.
-
:type new_account_id: int
+
:param dst_volume_id: [required] VolumeID of the volume to be overwritten.
+
:type dst_volume_id: int
-
:param new_size: (optional) New size Total size of the volume, in bytes.
-
Size is rounded up to the nearest 1MB size.
-
:type new_size: int
+
:param snapshot_id: ID of the snapshot that is used as the source of the clone. If no ID is provided, the current active volume is used.
+
:type snapshot_id: int
-
:param attributes: (optional) List of Name/Value pairs in JSON object
-
format.
-
:type attributes: dict
"""
-
volume_id = data_model . property (
"volumeID" , int ,
array = False , optional = False ,
-
documentation = " \
-
Required parameter for \" volumes \" array: volumeID. \
-
"
+
documentation = """VolumeID of the volume to be read from. """ ,
+
dictionaryType = None
)
-
-
access = data_model . property (
-
"access" , str ,
-
array = False , optional = True ,
-
documentation = " \
-
Access settings for the new volume. \
-
\
-
\
-
**readOnly**: Only read operations are allowed. \
-
\
-
\
-
\
-
**readWrite**: Reads and writes are allowed. \
-
\
-
\
-
\
-
**locked**: No reads or writes are allowed. \
-
\
-
\
-
\
-
**replicationTarget**: Identify a volume as the target volume for \
-
a paired set of volumes. If the volume is not paired, the access \
-
status is locked. \
-
\
-
\
-
\
-
\
-
\
-
If unspecified, the access settings of the clone will be the same as \
-
the source. \
-
"
-
)
-
-
name = data_model . property (
-
"name" , str ,
-
array = False , optional = True ,
-
documentation = " \
-
New name for the clone. \
-
"
-
)
-
-
new_account_id = data_model . property (
-
"newAccountID" , int ,
-
array = False , optional = True ,
-
documentation = " \
-
Account ID for the new volume. \
-
"
-
)
-
-
new_size = data_model . property (
-
"newSize" , int ,
-
array = False , optional = True ,
-
documentation = " \
-
New size Total size of the volume, in bytes. Size is rounded up to the \
-
nearest 1MB size. \
-
"
+
dst_volume_id = data_model . property (
+
"dstVolumeID" , int ,
+
array = False , optional = False ,
+
documentation = """VolumeID of the volume to be overwritten. """ ,
+
dictionaryType = None
)
-
-
attributes = data_model . property (
-
"attributes" , dict ,
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
array = False , optional = True ,
-
documentation = " \
-
List of Name/Value pairs in JSON object format. \
-
"
+
documentation = """ID of the snapshot that is used as the source of the clone. If no ID is provided, the current active volume is used. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
+
def __init__ ( self ,
+
volume_id ,
+
dst_volume_id ,
+
snapshot_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
[docs] class DriveInfo ( data_model . DataObject ):
-
"""
+
[docs] class CreateStorageContainerResult ( data_model . DataObject ):
+
"""CreateStorageContainerResult
-
:param capacity: [required] Total capacity of the drive, in bytes.
-
:type capacity: int
+
:param storage_container: [required]
+
:type storage_container: StorageContainer
-
:param drive_id: [required] *drive_id* for this drive.
-
:type drive_id: int
+
"""
+
storage_container = data_model . property (
+
"storageContainer" , StorageContainer ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
-
:param node_id: [required] *node_id* where this drive is located.
-
:type node_id: int
+
def __init__ ( self ,
+
storage_container ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param serial: [required] Drive serial number.
-
:type serial: str
+
[docs] class RollbackToGroupSnapshotResult ( data_model . DataObject ):
+
"""RollbackToGroupSnapshotResult
-
:param slot: [required] Slot number in the server chassis where this drive
-
is located, or -1 if *satadimm* used for internal metadata drive.
-
:type slot: int
+
:param group_snapshot:
+
:type group_snapshot: GroupSnapshot
-
:param status: [required]
-
:type status: str
+
:param group_snapshot_id: Unique ID of the new group snapshot.
+
:type group_snapshot_id: int
-
:param type: [required]
-
:type type: str
+
:param members: List of checksum, volumeIDs and snapshotIDs for each member of the group.
+
:type members: GroupSnapshotMembers
-
:param attributes: [required] List of Name/Value pairs in JSON object
-
format.
-
:type attributes: dict
"""
-
-
capacity = data_model . property (
-
"capacity" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Total capacity of the drive, in bytes. \
-
"
-
)
-
-
drive_id = data_model . property (
-
"driveID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
*drive_id* for this drive. \
-
"
+
group_snapshot = data_model . property (
+
"groupSnapshot" , GroupSnapshot ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
node_id = data_model . property (
-
"nodeID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
*node_id* where this drive is located. \
-
"
+
group_snapshot_id = data_model . property (
+
"groupSnapshotID" , int ,
+
array = False , optional = True ,
+
documentation = """Unique ID of the new group snapshot. """ ,
+
dictionaryType = None
)
-
-
serial = data_model . property (
-
"serial" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Drive serial number. \
-
"
+
members = data_model . property (
+
"members" , GroupSnapshotMembers ,
+
array = True , optional = True ,
+
documentation = """List of checksum, volumeIDs and snapshotIDs for each member of the group. """ ,
+
dictionaryType = None
)
-
slot = data_model . property (
-
"slot" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Slot number in the server chassis where this drive is located, or -1 \
-
if *satadimm* used for internal metadata drive. \
-
"
-
)
+
def __init__ ( self ,
+
group_snapshot = None ,
+
group_snapshot_id = None ,
+
members = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
status = data_model . property (
-
"status" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
[docs] class RemoveClusterAdminRequest ( data_model . DataObject ):
+
"""RemoveClusterAdminRequest
+
You can use RemoveClusterAdmin to remove a Cluster Admin. You cannot remove the administrator cluster admin account.
-
type = data_model . property (
-
"type" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param cluster_admin_id: [required] ClusterAdminID for the cluster admin to remove.
+
:type cluster_admin_id: int
-
attributes = data_model . property (
-
"attributes" , dict ,
+
"""
+
cluster_admin_id = data_model . property (
+
"clusterAdminID" , int ,
array = False , optional = False ,
-
documentation = " \
-
List of Name/Value pairs in JSON object format. \
-
"
+
documentation = """ClusterAdminID for the cluster admin to remove. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
+
def __init__ ( self ,
+
cluster_admin_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
[docs] class FibreChannelSession ( data_model . DataObject ):
-
"""
-
*fibre_channel_session* contains information about each Fibre Channel
-
session that is visible to the cluster and what target ports it is visible
-
on.
+
[docs] class AddNodesRequest ( data_model . DataObject ):
+
"""AddNodesRequest
+
AddNodes enables you to add one or more new nodes to a cluster. When a node that is not configured starts up for the first time, you are prompted to configure the node. After you configure the node, it is registered as a "pending node" with the cluster.
+
Note: It might take several seconds after adding a new node for it to start up and register its drives as available.
-
:param initiator_wwpn: [required] The WWPN of the initiator which is logged
-
into the target port.
-
:type initiator_wwpn: str
+
:param pending_nodes: [required] List of pending NodeIDs for the nodes to be added. You can obtain the list of pending nodes using the ListPendingNodes method.
+
:type pending_nodes: int
-
:param node_id: [required] The node owning the Fibre Channel session.
-
:type node_id: int
+
:param auto_install: Whether these nodes should be autoinstalled
+
:type auto_install: bool
-
:param service_id: [required] The service ID of the *fservice* owning this
-
Fibre Channel session
-
:type service_id: int
+
"""
+
pending_nodes = data_model . property (
+
"pendingNodes" , int ,
+
array = True , optional = False ,
+
documentation = """ List of pending NodeIDs for the nodes to be added. You can obtain the list of pending nodes using the ListPendingNodes method. """ ,
+
dictionaryType = None
+
)
+
auto_install = data_model . property (
+
"autoInstall" , bool ,
+
array = False , optional = True ,
+
documentation = """Whether these nodes should be autoinstalled """ ,
+
dictionaryType = None
+
)
-
:param target_wwpn: [required] The WWPN of the target port involved in this
-
session.
-
:type target_wwpn: str
+
def __init__ ( self ,
+
pending_nodes ,
+
auto_install = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param volume_access_group_id: [required] The ID of the volume access group
-
to which the *initiator_wwpn* belongs. If not in a volume access group,
-
the value will be null.
-
:type volume_access_group_id: int
-
"""
+
[docs] class ListVolumeStatsByVolumeAccessGroupRequest ( data_model . DataObject ):
+
"""ListVolumeStatsByVolumeAccessGroupRequest
+
ListVolumeStatsByVolumeAccessGroup enables you to get total activity measurements for all of the volumes that are a member of the
+
specified volume access group(s).
-
initiator_wwpn = data_model . property (
-
"initiatorWWPN" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The WWPN of the initiator which is logged into the target port. \
-
"
-
)
+
:param volume_access_groups: An array of VolumeAccessGroupIDs for which volume activity is returned. If omitted, statistics for all volume access groups are returned.
+
:type volume_access_groups: int
-
node_id = data_model . property (
-
"nodeID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The node owning the Fibre Channel session. \
-
"
-
)
+
:param include_virtual_volumes: Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false.
+
:type include_virtual_volumes: bool
-
service_id = data_model . property (
-
"serviceID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The service ID of the *fservice* owning this Fibre Channel session \
-
"
+
"""
+
volume_access_groups = data_model . property (
+
"volumeAccessGroups" , int ,
+
array = True , optional = True ,
+
documentation = """An array of VolumeAccessGroupIDs for which volume activity is returned. If omitted, statistics for all volume access groups are returned. """ ,
+
dictionaryType = None
)
-
-
target_wwpn = data_model . property (
-
"targetWWPN" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The WWPN of the target port involved in this session. \
-
"
+
include_virtual_volumes = data_model . property (
+
"includeVirtualVolumes" , bool ,
+
array = False , optional = True ,
+
documentation = """Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false. """ ,
+
dictionaryType = None
)
-
volume_access_group_id = data_model . property (
-
"volumeAccessGroupID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The ID of the volume access group to which the *initiator_wwpn* \
-
belongs. If not in a volume access group, the value will be null. \
-
"
-
)
+
def __init__ ( self ,
+
volume_access_groups = None ,
+
include_virtual_volumes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class ListVirtualVolumesRequest ( data_model . DataObject ):
+
"""ListVirtualVolumesRequest
+
ListVirtualVolumes enables you to list the virtual volumes currently in the system. You can use this method to list all virtual volumes,
+
or only list a subset.
+
:param details: Specifies the level of detail about each virtual volume that is returned. Possible values are: true: Include more details about each virtual volume in the response. false: Include the standard level of detail about each virtual volume in the response.
+
:type details: bool
-
[docs] class GroupSnapshotMembers ( data_model . DataObject ):
-
"""
-
List of checksum, *volume_ids* and *snapshot_ids* for each member of the
-
group.
+
:param limit: The maximum number of virtual volumes to list.
+
:type limit: int
-
:param volume_id: [required] The source volume ID for the snapshot.
-
:type volume_id: int
+
:param recursive: Specifies whether to include information about the children of each virtual volume in the response. Possible values are: true: Include information about the children of each virtual volume in the response. false: Do not include information about the children of each virtual volume in the response.
+
:type recursive: bool
-
:param snapshot_id: [required] Unique ID of a snapshot from which the new
-
snapshot is made. The *snapshot_id* passed must be a snapshot on the
-
given volume.
-
:type snapshot_id: int
+
:param start_virtual_volume_id: The ID of the virtual volume at which to begin the list.
+
:type start_virtual_volume_id: UUID
-
:param snapshot_uuid: [required] Universal Unique ID of an existing
-
snapshot.
-
:type snapshot_uuid: str
+
:param virtual_volume_ids: A list of virtual volume IDs for which to retrieve information. If you specify this parameter, the method returns information about only these virtual volumes.
+
:type virtual_volume_ids: UUID
-
:param checksum: [required] A string that represents the correct digits in
-
the stored snapshot. This checksum can be used later to compare other
-
snapshots to detect errors in the data.
-
:type checksum: str
"""
-
-
volume_id = data_model . property (
-
"volumeID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The source volume ID for the snapshot. \
-
"
+
details = data_model . property (
+
"details" , bool ,
+
array = False , optional = True ,
+
documentation = """Specifies the level of detail about each virtual volume that is returned. Possible values are: true: Include more details about each virtual volume in the response. false: Include the standard level of detail about each virtual volume in the response. """ ,
+
dictionaryType = None
)
-
-
snapshot_id = data_model . property (
-
"snapshotID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Unique ID of a snapshot from which the new snapshot is made. \
-
The *snapshot_id* passed must be a snapshot on the given volume. \
-
"
+
limit = data_model . property (
+
"limit" , int ,
+
array = False , optional = True ,
+
documentation = """The maximum number of virtual volumes to list. """ ,
+
dictionaryType = None
)
-
-
snapshot_uuid = data_model . property (
-
"snapshotUUID" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Universal Unique ID of an existing snapshot. \
-
"
+
recursive = data_model . property (
+
"recursive" , bool ,
+
array = False , optional = True ,
+
documentation = """Specifies whether to include information about the children of each virtual volume in the response. Possible values are: true: Include information about the children of each virtual volume in the response. false: Do not include information about the children of each virtual volume in the response. """ ,
+
dictionaryType = None
)
-
-
checksum = data_model . property (
-
"checksum" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
A string that represents the correct digits in the stored snapshot. \
-
This checksum can be used later to compare other snapshots to detect \
-
errors in the data. \
-
"
+
start_virtual_volume_id = data_model . property (
+
"startVirtualVolumeID" , UUID ,
+
array = False , optional = True ,
+
documentation = """The ID of the virtual volume at which to begin the list. """ ,
+
dictionaryType = None
+
)
+
virtual_volume_ids = data_model . property (
+
"virtualVolumeIDs" , UUID ,
+
array = True , optional = True ,
+
documentation = """A list of virtual volume IDs for which to retrieve information. If you specify this parameter, the method returns information about only these virtual volumes. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
+
def __init__ ( self ,
+
details = None ,
+
limit = None ,
+
recursive = None ,
+
start_virtual_volume_id = None ,
+
virtual_volume_ids = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
[docs] class GroupSnapshot ( data_model . DataObject ):
-
"""
-
Group Snapshot object represents a point-in-time copy of a group of
-
volumes.
+
[docs] class BulkVolumeJob ( data_model . DataObject ):
+
"""BulkVolumeJob
-
:param group_snapshot_id: [required] Unique ID of the new group snapshot.
-
:type group_snapshot_id: int
+
:param bulk_volume_id: [required] The internal bulk volume job ID.
+
:type bulk_volume_id: int
-
:param group_snapshot_uuid: [required] UUID of the group snapshot.
-
:type group_snapshot_uuid: UUID
+
:param create_time: [required] Timestamp created for the bulk volume job.
+
:type create_time: str
-
:param members: [required] List of *volume_ids* and *snapshot_ids* for each
-
member of the group.
-
:type members: GroupSnapshotMembers[]
+
:param elapsed_time: [required] The number of seconds since the job began.
+
:type elapsed_time: int
-
:param name: [required] Name of the group snapshot, or, if none was given,
-
the UTC formatted day and time on which the snapshot was created.
-
:type name: str
+
:param format: [required] Format is either "compressed" or "native".
+
:type format: str
-
:param create_time: [required] The UTC formatted day and time on which the
-
snapshot was created.
-
:type create_time: str
+
:param key: [required] The unique key created by the bulk volume session.
+
:type key: str
-
:param status: [required] Status of the snapshot. Possible values:
+
:param percent_complete: [required] The completed percentage reported by the operation.
+
:type percent_complete: int
-
**Preparing**: A snapshot that is being prepared for use and is not yet
-
writable.
+
:param remaining_time: [required] The estimated time remaining in seconds.
+
:type remaining_time: int
-
**Done**: A snapshot that has finished being prepared and is now usable
+
:param src_volume_id: [required] The source volume ID.
+
:type src_volume_id: int
+
:param status: [required] Can be one of the following: preparing active done failed
:type status: str
-
:param attributes: [required] List of Name/Value pairs in JSON object
-
format.
+
:param script: The name of the script if one is provided.
+
:type script: str
+
+
:param snapshot_id: ID of the snapshot if a snapshot is in the source of the bulk volume job.
+
:type snapshot_id: int
+
+
:param type: [required] Can be one of the following: read write
+
:type type: str
+
+
:param attributes: [required] JSON attributes on the bulk volume job.
:type attributes: dict
-
"""
-
group_snapshot_id = data_model . property (
-
"groupSnapshotID" , int ,
+
"""
+
bulk_volume_id = data_model . property (
+
"bulkVolumeID" , int ,
array = False , optional = False ,
-
documentation = " \
-
Unique ID of the new group snapshot. \
-
"
+
documentation = """The internal bulk volume job ID. """ ,
+
dictionaryType = None
)
-
-
group_snapshot_uuid = data_model . property (
-
"groupSnapshotUUID" , UUID ,
+
create_time = data_model . property (
+
"createTime" , str ,
array = False , optional = False ,
-
documentation = " \
-
UUID of the group snapshot. \
-
"
+
documentation = """Timestamp created for the bulk volume job. """ ,
+
dictionaryType = None
)
-
-
members = data_model . property (
-
"members" , GroupSnapshotMembers ,
-
array = True , optional = False ,
-
documentation = " \
-
List of *volume_ids* and *snapshot_ids* for each member of the group. \
-
"
+
elapsed_time = data_model . property (
+
"elapsedTime" , int ,
+
array = False , optional = False ,
+
documentation = """The number of seconds since the job began. """ ,
+
dictionaryType = None
)
-
-
name = data_model . property (
-
"name" , str ,
+
format = data_model . property (
+
"format" , str ,
array = False , optional = False ,
-
documentation = " \
-
Name of the group snapshot, or, if none was given, the UTC formatted \
-
day and time on which the snapshot was created. \
-
"
+
documentation = """Format is either "compressed" or "native". """ ,
+
dictionaryType = None
)
-
-
create_time = data_model . property (
-
"createTime" , str ,
+
key = data_model . property (
+
"key" , str ,
array = False , optional = False ,
-
documentation = " \
-
The UTC formatted day and time on which the snapshot was created. \
-
"
+
documentation = """The unique key created by the bulk volume session. """ ,
+
dictionaryType = None
+
)
+
percent_complete = data_model . property (
+
"percentComplete" , int ,
+
array = False , optional = False ,
+
documentation = """The completed percentage reported by the operation. """ ,
+
dictionaryType = None
+
)
+
remaining_time = data_model . property (
+
"remainingTime" , int ,
+
array = False , optional = False ,
+
documentation = """The estimated time remaining in seconds. """ ,
+
dictionaryType = None
+
)
+
src_volume_id = data_model . property (
+
"srcVolumeID" , int ,
+
array = False , optional = False ,
+
documentation = """The source volume ID. """ ,
+
dictionaryType = None
)
-
status = data_model . property (
"status" , str ,
array = False , optional = False ,
-
documentation = " \
-
Status of the snapshot. \
-
Possible values: \
-
\
-
\
-
**Preparing**: A snapshot that is being prepared for use and is \
-
not yet writable. \
-
\
-
\
-
\
-
**Done**: A snapshot that has finished being prepared and is now \
-
usable \
-
\
-
"
+
documentation = """Can be one of the following: preparing active done failed """ ,
+
dictionaryType = None
+
)
+
script = data_model . property (
+
"script" , str ,
+
array = False , optional = True ,
+
documentation = """The name of the script if one is provided. """ ,
+
dictionaryType = None
+
)
+
snapshot_id = data_model . property (
+
"snapshotID" , int ,
+
array = False , optional = True ,
+
documentation = """ID of the snapshot if a snapshot is in the source of the bulk volume job. """ ,
+
dictionaryType = None
+
)
+
type = data_model . property (
+
"type" , str ,
+
array = False , optional = False ,
+
documentation = """Can be one of the following: read write """ ,
+
dictionaryType = None
)
-
attributes = data_model . property (
"attributes" , dict ,
array = False , optional = False ,
-
documentation = " \
-
List of Name/Value pairs in JSON object format. \
-
"
+
documentation = """JSON attributes on the bulk volume job. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
bulk_volume_id ,
+
create_time ,
+
elapsed_time ,
+
format ,
+
key ,
+
percent_complete ,
+
remaining_time ,
+
src_volume_id ,
+
status ,
+
type ,
+
attributes ,
+
script = None ,
+
snapshot_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListBulkVolumeJobsResult ( data_model . DataObject ):
+
"""ListBulkVolumeJobsResult
+
+
:param bulk_volume_jobs: [required] An array of information for each bulk volume job.
+
:type bulk_volume_jobs: BulkVolumeJob
+
+
"""
+
bulk_volume_jobs = data_model . property (
+
"bulkVolumeJobs" , BulkVolumeJob ,
+
array = True , optional = False ,
+
documentation = """An array of information for each bulk volume job. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
bulk_volume_jobs ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class TestPingResult ( data_model . DataObject ):
+
"""TestPingResult
-
+
def __init__ ( self ,
+
result ,
+
duration ,
+
details ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class GetSnmpInfoResult ( data_model . DataObject ):
+
"""GetSnmpInfoResult
-
[docs] class NodeDriveHardware ( data_model . DataObject ):
-
"""
+
:param networks: List of networks and access types enabled for SNMP. Note: "networks" will only be present if SNMP V3 is disabled.
+
:type networks: SnmpNetwork
-
:param node_id: [required]
-
:type node_id: int
+
:param enabled: [required] If the nodes in the cluster are configured for SNMP.
+
:type enabled: bool
-
:param result: [required]
-
:type result: DrivesHardware
-
"""
+
:param snmp_v3_enabled: [required] If the nodes in the cluster are configured for SNMP v3.
+
:type snmp_v3_enabled: bool
-
node_id = data_model . property (
-
"nodeID" , int ,
+
:param usm_users: If SNMP v3 is enabled, the values returned is a list of user access parameters for SNMP information from the cluster. This will be returned instead of the "networks" parameter.
+
:type usm_users: SnmpV3UsmUser
+
+
"""
+
networks = data_model . property (
+
"networks" , SnmpNetwork ,
+
array = True , optional = True ,
+
documentation = """List of networks and access types enabled for SNMP. Note: "networks" will only be present if SNMP V3 is disabled. """ ,
+
dictionaryType = None
+
)
+
enabled = data_model . property (
+
"enabled" , bool ,
array = False , optional = False ,
-
documentation = None
+
documentation = """If the nodes in the cluster are configured for SNMP. """ ,
+
dictionaryType = None
)
-
-
result = data_model . property (
-
"result" , DrivesHardware ,
+
snmp_v3_enabled = data_model . property (
+
"snmpV3Enabled" , bool ,
array = False , optional = False ,
-
documentation = None
+
documentation = """If the nodes in the cluster are configured for SNMP v3. """ ,
+
dictionaryType = None
+
)
+
usm_users = data_model . property (
+
"usmUsers" , SnmpV3UsmUser ,
+
array = True , optional = True ,
+
documentation = """If SNMP v3 is enabled, the values returned is a list of user access parameters for SNMP information from the cluster. This will be returned instead of the "networks" parameter. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
enabled ,
+
snmp_v3_enabled ,
+
networks = None ,
+
usm_users = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class ShutdownResult ( data_model . DataObject ):
+
"""ShutdownResult
-
[docs] class NodeStatsNodes ( data_model . DataObject ):
-
"""
+
:param failed: [required]
+
:type failed: int
-
:param nodes: [required] Node activity information for a single node.
-
:type nodes: NodeStatsInfo[]
-
"""
+
:param successful: [required]
+
:type successful: int
-
nodes = data_model . property (
-
"nodes" , NodeStatsInfo ,
+
"""
+
failed = data_model . property (
+
"failed" , int ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
successful = data_model . property (
+
"successful" , int ,
array = True , optional = False ,
-
documentation = " \
-
Node activity information for a single node. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
failed ,
+
successful ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class DeleteVolumeResult ( data_model . DataObject ):
+
"""DeleteVolumeResult
-
[docs] class Schedule ( data_model . DataObject ):
-
"""
-
Schedule is an object containing information about each schedule created to
-
autonomously make a snapshot of a volume. The return object includes
-
information for all schedules. If *schedule_id* is used to identify a
-
specific schedule then only information for that *schedule_id* is returned.
-
Schedules information is returned with the API method, see *list_schedules*
-
on the SolidFire API guide page 245.
+
:param volume:
+
:type volume: Volume
-
:param frequency: [required] Indicates the frequency of the schedule
-
occurrence. Set this to a type that inherits from Frequency.
+
"""
+
volume = data_model . property (
+
"volume" , Volume ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
-
Valid types are:
+
def __init__ ( self ,
+
volume = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
*day_of_week_frequency*
+
[docs] class GetScheduleResult ( data_model . DataObject ):
+
"""GetScheduleResult
-
*day_of_month_frequency*
+
:param schedule: [required] The schedule attributes.
+
:type schedule: Schedule
-
*time_interval_frequency*
+
"""
+
schedule = data_model . property (
+
"schedule" , Schedule ,
+
array = False , optional = False ,
+
documentation = """The schedule attributes. """ ,
+
dictionaryType = None
+
)
-
:type frequency: Frequency
+
def __init__ ( self ,
+
schedule ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param last_run_status: [required] Indicates the status of the last
-
scheduled snapshot.
+
[docs] class GetDriveStatsResult ( data_model . DataObject ):
+
"""GetDriveStatsResult
-
Valid values are:
+
:param drive_stats: [required]
+
:type drive_stats: DriveStats
-
Success
+
"""
+
drive_stats = data_model . property (
+
"driveStats" , DriveStats ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
-
Failed
+
def __init__ ( self ,
+
drive_stats ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:type last_run_status: str
+
[docs] class AddAccountRequest ( data_model . DataObject ):
+
"""AddAccountRequest
+
You can use AddAccount to add a new account to the system. You can create new volumes under the new account. The CHAP settings you specify for the account apply to all volumes owned by the account.
-
:param last_run_time_start: [required] Indicates the last time the schedule
-
started n ISO 8601 date string. Valid values are:
+
:param username: [required] Specifies the username for this account. (Might be 1 to 64 characters in length).
+
:type username: str
-
Success
+
:param initiator_secret: The CHAP secret to use for the initiator. This secret must be 12-16 characters in length and should be impenetrable. The initiator CHAP secret must be unique and cannot be the same as the target CHAP secret. If unspecified, a random secret is created.
+
:type initiator_secret: CHAPSecret
-
Failed
+
:param target_secret: The CHAP secret to use for the target (mutual CHAP authentication). This secret must be 12-16 characters in length and should be impenetrable. The target CHAP secret must be unique and cannot be the same as the initiator CHAP secret. If unspecified, a random secret is created.
+
:type target_secret: CHAPSecret
-
:type last_run_time_start: str
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
-
:param schedule_info: [required] Includes the unique name given to the
-
schedule, the retention period for the snapshot that was created, and
-
the volume ID of the volume from which the snapshot was created.
-
:type schedule_info: ScheduleInfo
+
"""
+
username = data_model . property (
+
"username" , str ,
+
array = False , optional = False ,
+
documentation = """Specifies the username for this account. (Might be 1 to 64 characters in length). """ ,
+
dictionaryType = None
+
)
+
initiator_secret = data_model . property (
+
"initiatorSecret" , CHAPSecret ,
+
array = False , optional = True ,
+
documentation = """The CHAP secret to use for the initiator. This secret must be 12-16 characters in length and should be impenetrable. The initiator CHAP secret must be unique and cannot be the same as the target CHAP secret. If unspecified, a random secret is created. """ ,
+
dictionaryType = None
+
)
+
target_secret = data_model . property (
+
"targetSecret" , CHAPSecret ,
+
array = False , optional = True ,
+
documentation = """The CHAP secret to use for the target (mutual CHAP authentication). This secret must be 12-16 characters in length and should be impenetrable. The target CHAP secret must be unique and cannot be the same as the initiator CHAP secret. If unspecified, a random secret is created. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
-
:param name: [required] Unique name assigned to the schedule.
-
:type name: str
+
def __init__ ( self ,
+
username ,
+
initiator_secret = None ,
+
target_secret = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param starting_date: [required] Indicates the date the first time the
-
schedule began of will begin. Formatted in UTC time.
-
:type starting_date: str
+
[docs] class SetConfigRequest ( data_model . DataObject ):
+
"""SetConfigRequest
+
The SetConfig API method enables you to set all the configuration information for the node. This includes the same information available via calls to SetClusterConfig and SetNetworkConfig in one API method.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
Caution: Changing the "bond-mode" on a node can cause a temporary loss of network connectivity. Exercise caution when using this method.
-
:param has_error: (optional) Indicates whether or not the schedule has
-
errors.
-
:type has_error: bool
+
:param config: [required] Objects that you want changed for the cluster interface settings.
+
:type config: ConfigParams
-
:param paused: (optional) Indicates whether or not the schedule is paused.
-
:type paused: bool
+
"""
+
config = data_model . property (
+
"config" , ConfigParams ,
+
array = False , optional = False ,
+
documentation = """Objects that you want changed for the cluster interface settings. """ ,
+
dictionaryType = None
+
)
-
:param recurring: (optional) Indicates whether or not the schedule is
-
recurring.
-
:type recurring: bool
+
def __init__ ( self ,
+
config ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param run_next_interval: (optional) Indicates whether or not the schedule
-
will run the next time the scheduler is active. When set to \"true\",
-
the schedule will run the next time the scheduler is active and then
-
reset back to \"false\".
-
:type run_next_interval: bool
+
[docs] class ListVolumeStatsByAccountRequest ( data_model . DataObject ):
+
"""ListVolumeStatsByAccountRequest
+
ListVolumeStatsByAccount returns high-level activity measurements for every account. Values are summed from all the volumes owned by the account.
-
:param schedule_id: (optional) Unique ID of the schedule
-
:type schedule_id: int
+
:param accounts: One or more account ids by which to filter the result.
+
:type accounts: int
-
:param to_be_deleted: (optional) Indicates if the schedule is marked for
-
deletion.
-
:type to_be_deleted: bool
-
"""
+
:param include_virtual_volumes: Includes virtual volumes in the response by default. To exclude virtual volumes, set to false.
+
:type include_virtual_volumes: bool
-
frequency = data_model . property (
-
"frequency" , Frequency ,
-
array = False , optional = False ,
-
documentation = " \
-
Indicates the frequency of the schedule occurrence. Set this to a type \
-
that inherits from Frequency. \
-
\
-
\
-
\
-
Valid types are: \
-
\
-
\
-
\
-
*day_of_week_frequency* \
-
\
-
\
-
\
-
*day_of_month_frequency* \
-
\
-
\
-
\
-
*time_interval_frequency* \
-
"
+
"""
+
accounts = data_model . property (
+
"accounts" , int ,
+
array = True , optional = True ,
+
documentation = """One or more account ids by which to filter the result. """ ,
+
dictionaryType = None
)
-
-
has_error = data_model . property (
-
"hasError" , bool ,
+
include_virtual_volumes = data_model . property (
+
"includeVirtualVolumes" , bool ,
array = False , optional = True ,
-
documentation = " \
-
Indicates whether or not the schedule has errors. \
-
"
+
documentation = """Includes virtual volumes in the response by default. To exclude virtual volumes, set to false. """ ,
+
dictionaryType = None
)
-
last_run_status = data_model . property (
-
"lastRunStatus" , str ,
+
def __init__ ( self ,
+
accounts = None ,
+
include_virtual_volumes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetAccountByNameRequest ( data_model . DataObject ):
+
"""GetAccountByNameRequest
+
GetAccountByName enables you to retrieve details about a specific account, given its username.
+
+
:param username: [required] Username for the account.
+
:type username: str
+
+
"""
+
username = data_model . property (
+
"username" , str ,
array = False , optional = False ,
-
documentation = " \
-
Indicates the status of the last scheduled snapshot. \
-
\
-
\
-
\
-
Valid values are: \
-
\
-
\
-
\
-
Success \
-
\
-
\
-
\
-
Failed \
-
"
-
)
-
-
last_run_time_start = data_model . property (
-
"lastRunTimeStart" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Indicates the last time the schedule started n ISO 8601 date string. \
-
Valid values are: \
-
\
-
\
-
\
-
Success \
-
\
-
\
-
\
-
Failed \
-
"
+
documentation = """Username for the account. """ ,
+
dictionaryType = None
)
-
paused = data_model . property (
-
"paused" , bool ,
-
array = False , optional = True ,
-
documentation = " \
-
Indicates whether or not the schedule is paused. \
-
"
-
)
+
def __init__ ( self ,
+
username ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
recurring = data_model . property (
-
"recurring" , bool ,
-
array = False , optional = True ,
-
documentation = " \
-
Indicates whether or not the schedule is recurring. \
-
"
-
)
+
[docs] class ShutdownRequest ( data_model . DataObject ):
+
"""ShutdownRequest
+
The Shutdown API method enables you to restart or shutdown a node that has not yet been added to a cluster. To use this method,
+
log in to the MIP for the pending node, and enter the "shutdown" method with either the "restart" or "halt" options.
-
run_next_interval = data_model . property (
-
"runNextInterval" , bool ,
-
array = False , optional = True ,
-
documentation = " \
-
Indicates whether or not the schedule will run the next time the \
-
scheduler is active. When set to \" true \" , the schedule will run the \
-
next time the scheduler is active and then reset back to \" false \" . \
-
"
-
)
+
:param nodes: [required] List of NodeIDs for the nodes to be shutdown.
+
:type nodes: int
-
schedule_id = data_model . property (
-
"scheduleID" , int ,
+
:param option: Specifies the action to take for the node shutdown. Possible values are: restart: Restarts the node. halt: Shuts down the node.
+
:type option: str
+
+
"""
+
nodes = data_model . property (
+
"nodes" , int ,
+
array = True , optional = False ,
+
documentation = """List of NodeIDs for the nodes to be shutdown. """ ,
+
dictionaryType = None
+
)
+
option = data_model . property (
+
"option" , str ,
array = False , optional = True ,
-
documentation = " \
-
Unique ID of the schedule \
-
"
+
documentation = """Specifies the action to take for the node shutdown. Possible values are: restart: Restarts the node. halt: Shuts down the node. """ ,
+
dictionaryType = None
)
-
schedule_info = data_model . property (
-
"scheduleInfo" , ScheduleInfo ,
-
array = False , optional = False ,
-
documentation = " \
-
Includes the unique name given to the schedule, the retention period \
-
for the snapshot that was created, and the volume ID of the volume \
-
from which the snapshot was created. \
-
"
-
)
+
def __init__ ( self ,
+
nodes ,
+
option = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
name = data_model . property (
-
"name" , str ,
+
[docs] class StartClusterPairingResult ( data_model . DataObject ):
+
"""StartClusterPairingResult
+
+
:param cluster_pairing_key: [required] A string of characters that is used by the "CompleteClusterPairing" API method.
+
:type cluster_pairing_key: str
+
+
:param cluster_pair_id: [required] Unique identifier for the cluster pair.
+
:type cluster_pair_id: int
+
+
"""
+
cluster_pairing_key = data_model . property (
+
"clusterPairingKey" , str ,
array = False , optional = False ,
-
documentation = " \
-
Unique name assigned to the schedule. \
-
"
+
documentation = """A string of characters that is used by the "CompleteClusterPairing" API method. """ ,
+
dictionaryType = None
)
-
-
starting_date = data_model . property (
-
"startingDate" , str ,
+
cluster_pair_id = data_model . property (
+
"clusterPairID" , int ,
array = False , optional = False ,
-
documentation = " \
-
Indicates the date the first time the schedule began of will begin. \
-
Formatted in UTC time. \
-
"
+
documentation = """Unique identifier for the cluster pair. """ ,
+
dictionaryType = None
)
-
to_be_deleted = data_model . property (
-
"toBeDeleted" , bool ,
+
def __init__ ( self ,
+
cluster_pairing_key ,
+
cluster_pair_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetEfficiencyResult ( data_model . DataObject ):
+
"""GetEfficiencyResult
+
+
:param compression: The amount of space being saved by compressing data on a single volume. Stated as a ratio where "1" means data has been stored without being compressed.
+
:type compression: float
+
+
:param deduplication: The amount of space being saved on a single volume by not duplicating data. Stated as a ratio.
+
:type deduplication: float
+
+
:param thin_provisioning: The ratio of space used to the amount of space allocated for storing data. Stated as a ratio.
+
:type thin_provisioning: float
+
+
:param timestamp: [required] The last time efficiency data was collected after Garbage Collection (GC). ISO 8601 data string.
+
:type timestamp: str
+
+
:param missing_volumes: [required] The volumes that could not be queried for efficiency data. Missing volumes can be caused by GC being less than hour old, temporary network loss or restarted services since the GC cycle.
+
:type missing_volumes: int
+
+
"""
+
compression = data_model . property (
+
"compression" , float ,
+
array = False , optional = True ,
+
documentation = """The amount of space being saved by compressing data on a single volume. Stated as a ratio where "1" means data has been stored without being compressed. """ ,
+
dictionaryType = None
+
)
+
deduplication = data_model . property (
+
"deduplication" , float ,
+
array = False , optional = True ,
+
documentation = """The amount of space being saved on a single volume by not duplicating data. Stated as a ratio. """ ,
+
dictionaryType = None
+
)
+
thin_provisioning = data_model . property (
+
"thinProvisioning" , float ,
array = False , optional = True ,
-
documentation = " \
-
Indicates if the schedule is marked for deletion. \
-
"
+
documentation = """The ratio of space used to the amount of space allocated for storing data. Stated as a ratio. """ ,
+
dictionaryType = None
+
)
+
timestamp = data_model . property (
+
"timestamp" , str ,
+
array = False , optional = False ,
+
documentation = """The last time efficiency data was collected after Garbage Collection (GC). ISO 8601 data string. """ ,
+
dictionaryType = None
+
)
+
missing_volumes = data_model . property (
+
"missingVolumes" , int ,
+
array = True , optional = False ,
+
documentation = """The volumes that could not be queried for efficiency data. Missing volumes can be caused by GC being less than hour old, temporary network loss or restarted services since the GC cycle. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
timestamp ,
+
missing_volumes ,
+
compression = None ,
+
deduplication = None ,
+
thin_provisioning = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class SupportBundleDetails ( data_model . DataObject ):
+
"""SupportBundleDetails
-
[docs] class VolumePair ( data_model . DataObject ):
-
"""
-
The Volume Pair Info is an object containing information about a volume
-
that is paired on a remote cluster.
-
If the volume is not paired, this object is null.
+
:param bundle_name: [required] The name specified in the 'CreateSupportBundle API method. If no name was specified, 'supportbundle' will be used.
+
:type bundle_name: str
-
:param cluster_pair_id: [required] The remote cluster a volume is paired
-
with.
-
:type cluster_pair_id: int
+
:param extra_args: [required] The arguments passed with this method.
+
:type extra_args: str
-
:param remote_volume_id: [required] The *volume_id* on the remote cluster a
-
volume is paired with.
-
:type remote_volume_id: int
+
:param files: [required] A list of the support bundle files that were created.
+
:type files: str
-
:param remote_slice_id: [required] The *slice_id* on the remote cluster a
-
volume is paired with.
-
:type remote_slice_id: int
+
:param url: [required] The URL that you can use to download the bundle file(s). Should correspond 1:1 with files list.
+
:type url: str
-
:param remote_volume_name: [required] The last-observed name of the volume
-
on the remote cluster a volume is paired with.
-
:type remote_volume_name: str
+
:param output: [required] The commands that were run and their output, with newlines replaced by HTML <br> elements.
+
:type output: str
-
:param volume_pair_uuid: [required] A UUID in canonical form.
-
:type volume_pair_uuid: UUID
+
:param timeout_sec: [required] The timeout specified for the support bundle creation process.
+
:type timeout_sec: int
-
:param remote_replication: [required] Details about the replication
-
configuration for this volume pair.
-
:type remote_replication: RemoteReplication
"""
-
-
cluster_pair_id = data_model . property (
-
"clusterPairID" , int ,
+
bundle_name = data_model . property (
+
"bundleName" , str ,
array = False , optional = False ,
-
documentation = " \
-
The remote cluster a volume is paired with. \
-
"
+
documentation = """The name specified in the 'CreateSupportBundle API method. If no name was specified, 'supportbundle' will be used. """ ,
+
dictionaryType = None
)
-
-
remote_volume_id = data_model . property (
-
"remoteVolumeID" , int ,
+
extra_args = data_model . property (
+
"extraArgs" , str ,
array = False , optional = False ,
-
documentation = " \
-
The *volume_id* on the remote cluster a volume is paired with. \
-
"
+
documentation = """The arguments passed with this method. """ ,
+
dictionaryType = None
)
-
-
remote_slice_id = data_model . property (
-
"remoteSliceID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The *slice_id* on the remote cluster a volume is paired with. \
-
"
+
files = data_model . property (
+
"files" , str ,
+
array = True , optional = False ,
+
documentation = """A list of the support bundle files that were created. """ ,
+
dictionaryType = None
)
-
-
remote_volume_name = data_model . property (
-
"remoteVolumeName" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The last-observed name of the volume on the remote cluster a volume is \
-
paired with. \
-
"
+
url = data_model . property (
+
"url" , str ,
+
array = True , optional = False ,
+
documentation = """The URL that you can use to download the bundle file(s). Should correspond 1:1 with files list. """ ,
+
dictionaryType = None
)
-
-
volume_pair_uuid = data_model . property (
-
"volumePairUUID" , UUID ,
+
output = data_model . property (
+
"output" , str ,
array = False , optional = False ,
-
documentation = " \
-
A UUID in canonical form. \
-
"
+
documentation = """The commands that were run and their output, with newlines replaced by HTML <br> elements. """ ,
+
dictionaryType = None
)
-
-
remote_replication = data_model . property (
-
"remoteReplication" , RemoteReplication ,
+
timeout_sec = data_model . property (
+
"timeoutSec" , int ,
array = False , optional = False ,
-
documentation = " \
-
Details about the replication configuration for this volume pair. \
-
"
+
documentation = """The timeout specified for the support bundle creation process. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
+
def __init__ ( self ,
+
bundle_name ,
+
extra_args ,
+
files ,
+
url ,
+
output ,
+
timeout_sec ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
[docs] class SoftwareVersionInfo ( data_model . DataObject ):
-
"""
-
-
:param current_version: [required]
-
:type current_version: str
+
[docs] class CreateSupportBundleResult ( data_model . DataObject ):
+
"""CreateSupportBundleResult
-
:param node_id: [required]
-
:type node_id: int
+
:param details: [required] The details of the support bundle.
+
:type details: SupportBundleDetails
-
:param package_name: [required]
-
:type package_name: str
+
:param duration: [required] The amount of time required to create the support bundle in the format HH:MM:SS.ssssss
+
:type duration: str
-
:param pending_version: [required]
-
:type pending_version: str
+
:param result: [required] Whether the support bundle creation passed of failed.
+
:type result: str
-
:param start_time: [required]
-
:type start_time: str
"""
-
-
current_version = data_model . property (
-
"currentVersion" , str ,
+
details = data_model . property (
+
"details" , SupportBundleDetails ,
array = False , optional = False ,
-
documentation = None
+
documentation = """The details of the support bundle. """ ,
+
dictionaryType = None
)
-
-
node_id = data_model . property (
-
"nodeID" , int ,
+
duration = data_model . property (
+
"duration" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """The amount of time required to create the support bundle in the format HH:MM:SS.ssssss """ ,
+
dictionaryType = None
)
-
-
package_name = data_model . property (
-
"packageName" , str ,
+
result = data_model . property (
+
"result" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """Whether the support bundle creation passed of failed. """ ,
+
dictionaryType = None
)
-
pending_version = data_model . property (
-
"pendingVersion" , str ,
+
def __init__ ( self ,
+
details ,
+
duration ,
+
result ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class SetRemoteLoggingHostsResult ( data_model . DataObject ):
+
"""SetRemoteLoggingHostsResult
+
+
"""
+
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class PurgeDeletedVolumeRequest ( data_model . DataObject ):
+
"""PurgeDeletedVolumeRequest
+
PurgeDeletedVolume immediately and permanently purges a volume that has been deleted. You must delete a volume using
+
DeleteVolume before it can be purged. Volumes are purged automatically after a period of time, so usage of this method is not
+
typically required.
+
+
:param volume_id: [required] The ID of the volume to be purged.
+
:type volume_id: int
+
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """The ID of the volume to be purged. """ ,
+
dictionaryType = None
)
-
start_time = data_model . property (
-
"startTime" , str ,
-
array = False , optional = False ,
-
documentation = None
+
def __init__ ( self ,
+
volume_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class CreateSupportBundleRequest ( data_model . DataObject ):
+
"""CreateSupportBundleRequest
+
CreateSupportBundle enables you to create a support bundle file under the node's directory. After creation, the bundle is stored on the node as a tar.gz file.
+
+
:param bundle_name: The unique name for the support bundle. If no name is provided, "supportbundle" and the node name are used as the filename.
+
:type bundle_name: str
+
+
:param extra_args: Passed to the sf_make_support_bundle script. You should use this parameter only at the request of NetApp SolidFire Support.
+
:type extra_args: str
+
+
:param timeout_sec: The number of seconds to allow the support bundle script to run before stopping. The default value is 1500 seconds.
+
:type timeout_sec: int
+
+
"""
+
bundle_name = data_model . property (
+
"bundleName" , str ,
+
array = False , optional = True ,
+
documentation = """The unique name for the support bundle. If no name is provided, "supportbundle" and the node name are used as the filename. """ ,
+
dictionaryType = None
+
)
+
extra_args = data_model . property (
+
"extraArgs" , str ,
+
array = False , optional = True ,
+
documentation = """Passed to the sf_make_support_bundle script. You should use this parameter only at the request of NetApp SolidFire Support. """ ,
+
dictionaryType = None
+
)
+
timeout_sec = data_model . property (
+
"timeoutSec" , int ,
+
array = False , optional = True ,
+
documentation = """The number of seconds to allow the support bundle script to run before stopping. The default value is 1500 seconds. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
bundle_name = None ,
+
extra_args = None ,
+
timeout_sec = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class AddDrivesResult ( data_model . DataObject ):
+
"""AddDrivesResult
+
+
:param async_handle:
+
:type async_handle: int
+
+
"""
+
async_handle = data_model . property (
+
"asyncHandle" , int ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
def __init__ ( self ,
+
async_handle = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
[docs] class VolumeAccessGroup ( data_model . DataObject ):
-
"""
-
A volume access group is a useful way of grouping volumes and initiators
-
together for ease of management.
+
[docs] class GetBackupTargetResult ( data_model . DataObject ):
+
"""GetBackupTargetResult
+
:param backup_target: [required] Object returned for backup target.
+
:type backup_target: BackupTarget
+
"""
+
backup_target = data_model . property (
+
"backupTarget" , BackupTarget ,
+
array = False , optional = False ,
+
documentation = """Object returned for backup target. """ ,
+
dictionaryType = None
+
)
+
def __init__ ( self ,
+
backup_target ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
Volume Access Group Limits:
+
[docs] class GetVolumeStatsRequest ( data_model . DataObject ):
+
"""GetVolumeStatsRequest
+
GetVolumeStats enables you to retrieve high-level activity measurements for a single volume. Values are cumulative from the creation of the volume.
+
:param volume_id: [required] Specifies the volume for which statistics are gathered.
+
:type volume_id: int
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """Specifies the volume for which statistics are gathered. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DeleteVolumeRequest ( data_model . DataObject ):
+
"""DeleteVolumeRequest
+
DeleteVolume marks an active volume for deletion. When marked, the volume is purged (permanently deleted) after the cleanup
+
interval elapses. After making a request to delete a volume, any active iSCSI connections to the volume are immediately terminated
+
and no further connections are allowed while the volume is in this state. A marked volume is not returned in target discovery
+
requests.
+
Any snapshots of a volume that has been marked for deletion are not affected. Snapshots are kept until the volume is purged from
+
the system.
+
If a volume is marked for deletion and has a bulk volume read or bulk volume write operation in progress, the bulk volume read or
+
write operation is stopped.
+
If the volume you delete is paired with a volume, replication between the paired volumes is suspended and no data is transferred
+
to it or from it while in a deleted state. The remote volume that the deleted volume was paired with enters into a PausedMisconfigured state and data is no longer sent to it or from the deleted volume. Until the deleted volume is purged, it can be restored and data transfers resume. If the deleted volume gets purged from the system, the volume it was paired with enters into a StoppedMisconfigured state and the volume pairing status is removed. The purged volume becomes permanently unavailable.
+
+
:param volume_id: [required] The ID of the volume to be deleted.
+
:type volume_id: int
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the volume to be deleted. """ ,
+
dictionaryType = None
+
)
-
- A volume access group can contain up to sixty-four initiator IQNs.
-
- An initiator can only belong to only one volume access group.
-
- A volume access group can contain up to two thousand volumes.
-
- Each volume access group can belong to a maximum of four other volume
-
access groups.
+
def __init__ ( self ,
+
volume_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param volume_access_group_id: [required] Unique ID for this volume access
-
group.
-
:type volume_access_group_id: int
+
[docs] class GetSnmpStateResult ( data_model . DataObject ):
+
"""GetSnmpStateResult
-
:param name: [required] Name of the volume access group.
-
:type name: str
+
:param enabled: [required] If the nodes in the cluster are configured for SNMP.
+
:type enabled: bool
-
:param initiators: [required] List of unique initiator names belonging to
-
the volume access group.
-
:type initiators: str[]
+
:param snmp_v3_enabled: [required] If the node in the cluster is configured for SNMP v3.
+
:type snmp_v3_enabled: bool
-
:param volumes: [required] List of volumes belonging to the volume access
-
group.
-
:type volumes: int[]
"""
-
-
volume_access_group_id = data_model . property (
-
"volumeAccessGroupID" , int ,
+
enabled = data_model . property (
+
"enabled" , bool ,
array = False , optional = False ,
-
documentation = " \
-
Unique ID for this volume access group. \
-
"
+
documentation = """If the nodes in the cluster are configured for SNMP. """ ,
+
dictionaryType = None
)
-
-
name = data_model . property (
-
"name" , str ,
+
snmp_v3_enabled = data_model . property (
+
"snmpV3Enabled" , bool ,
array = False , optional = False ,
-
documentation = " \
-
Name of the volume access group. \
-
"
-
)
-
-
initiators = data_model . property (
-
"initiators" , str ,
-
array = True , optional = False ,
-
documentation = " \
-
List of unique initiator names belonging to the volume access group. \
-
"
+
documentation = """If the node in the cluster is configured for SNMP v3. """ ,
+
dictionaryType = None
)
-
volumes = data_model . property (
-
"volumes" , int ,
-
array = True , optional = False ,
-
documentation = " \
-
List of volumes belonging to the volume access group. \
-
"
-
)
+
def __init__ ( self ,
+
enabled ,
+
snmp_v3_enabled ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class DeleteGroupSnapshotResult ( data_model . DataObject ):
+
"""DeleteGroupSnapshotResult
+
"""
-
[docs] class VolumeAccessGroupLunAssignments ( data_model . DataObject ):
-
"""
-
*volume_access_group* ID and Lun to be assigned to all volumes within it.
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param volume_access_group_id: [required] Unique volume access group ID for
-
which the LUN assignments will be modified.
-
:type volume_access_group_id: int
+
[docs] class SetNetworkConfigResult ( data_model . DataObject ):
+
"""SetNetworkConfigResult
-
:param lun_assignments: [required] The volume *ids* with assigned LUN
-
values.
-
:type lun_assignments: LunAssignment[]
+
:param network: [required]
+
:type network: Network
-
:param deleted_lun_assignments: [required] The volume *ids* with deleted
-
LUN values.
-
:type deleted_lun_assignments: LunAssignment[]
"""
-
-
volume_access_group_id = data_model . property (
-
"volumeAccessGroupID" , int ,
+
network = data_model . property (
+
"network" , Network ,
array = False , optional = False ,
-
documentation = " \
-
Unique volume access group ID for which the LUN assignments will be \
-
modified. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
lun_assignments = data_model . property (
-
"lunAssignments" , LunAssignment ,
-
array = True , optional = False ,
-
documentation = " \
-
The volume *ids* with assigned LUN values. \
-
"
-
)
+
def __init__ ( self ,
+
network ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
deleted_lun_assignments = data_model . property (
-
"deletedLunAssignments" , LunAssignment ,
-
array = True , optional = False ,
-
documentation = " \
-
The volume *ids* with deleted LUN values. \
-
"
+
[docs] class ModifyVolumeResult ( data_model . DataObject ):
+
"""ModifyVolumeResult
+
+
:param volume: Object containing information about the newly modified volume.
+
:type volume: Volume
+
+
"""
+
volume = data_model . property (
+
"volume" , Volume ,
+
array = False , optional = True ,
+
documentation = """Object containing information about the newly modified volume. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
volume = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class ListVolumeStatsByVolumeRequest ( data_model . DataObject ):
+
"""ListVolumeStatsByVolumeRequest
+
ListVolumeStatsByVolume returns high-level activity measurements for every volume, by volume. Values are cumulative from the
+
creation of the volume.
-
[docs] class Account ( data_model . DataObject ):
-
"""
-
The object containing information about an account.
-
This object only includes \"configured\" information about the account, not
-
any runtime or usage information.
+
:param include_virtual_volumes: Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false.
+
:type include_virtual_volumes: bool
-
:param account_id: [required] Unique *account_id* for the account.
-
:type account_id: int
+
"""
+
include_virtual_volumes = data_model . property (
+
"includeVirtualVolumes" , bool ,
+
array = False , optional = True ,
+
documentation = """Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false. """ ,
+
dictionaryType = None
+
)
-
:param username: [required] User name for the account.
-
:type username: str
+
def __init__ ( self ,
+
include_virtual_volumes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param status: [required] Current status of the account.
-
:type status: str
+
[docs] class FibreChannelSession ( data_model . DataObject ):
+
"""FibreChannelSession
+
FibreChannelSession contains information about each Fibre Channel session that is visible to the cluster and what target ports it is visible on.
-
:param volumes: [required] List of *volume_ids* for Volumes owned by this
-
account.
-
:type volumes: int[]
+
:param initiator_wwpn: [required] The WWPN of the initiator which is logged into the target port.
+
:type initiator_wwpn: str
-
:param initiator_secret: (optional) CHAP secret to use for the initiator.
-
:type initiator_secret: CHAPSecret
+
:param node_id: [required] The node owning the Fibre Channel session.
+
:type node_id: int
-
:param target_secret: (optional) CHAP secret to use for the target (mutual
-
CHAP authentication).
-
:type target_secret: CHAPSecret
+
:param service_id: [required] The service ID of the FService owning this Fibre Channel session
+
:type service_id: int
-
:param attributes: (optional) List of Name/Value pairs in JSON object
-
format.
-
:type attributes: dict
-
"""
+
:param target_wwpn: [required] The WWPN of the target port involved in this session.
+
:type target_wwpn: str
-
account_id = data_model . property (
-
"accountID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Unique *account_id* for the account. \
-
"
-
)
+
:param volume_access_group_id: The ID of the volume access group to which the initiatorWWPN beintegers. If not in a volume access group, the value will be null.
+
:type volume_access_group_id: int
-
username = data_model . property (
-
"username" , str ,
+
"""
+
initiator_wwpn = data_model . property (
+
"initiatorWWPN" , str ,
array = False , optional = False ,
-
documentation = " \
-
User name for the account. \
-
"
+
documentation = """The WWPN of the initiator which is logged into the target port. """ ,
+
dictionaryType = None
)
-
-
status = data_model . property (
-
"status" , str ,
+
node_id = data_model . property (
+
"nodeID" , int ,
array = False , optional = False ,
-
documentation = " \
-
Current status of the account. \
-
"
-
)
-
-
volumes = data_model . property (
-
"volumes" , int ,
-
array = True , optional = False ,
-
documentation = " \
-
List of *volume_ids* for Volumes owned by this account. \
-
"
+
documentation = """The node owning the Fibre Channel session. """ ,
+
dictionaryType = None
)
-
-
initiator_secret = data_model . property (
-
"initiatorSecret" , CHAPSecret ,
-
array = False , optional = True ,
-
documentation = " \
-
CHAP secret to use for the initiator. \
-
"
+
service_id = data_model . property (
+
"serviceID" , int ,
+
array = False , optional = False ,
+
documentation = """The service ID of the FService owning this Fibre Channel session """ ,
+
dictionaryType = None
)
-
-
target_secret = data_model . property (
-
"targetSecret" , CHAPSecret ,
-
array = False , optional = True ,
-
documentation = " \
-
CHAP secret to use for the target (mutual CHAP authentication). \
-
"
+
target_wwpn = data_model . property (
+
"targetWWPN" , str ,
+
array = False , optional = False ,
+
documentation = """The WWPN of the target port involved in this session. """ ,
+
dictionaryType = None
)
-
-
attributes = data_model . property (
-
"attributes" , dict ,
+
volume_access_group_id = data_model . property (
+
"volumeAccessGroupID" , int ,
array = False , optional = True ,
-
documentation = " \
-
List of Name/Value pairs in JSON object format. \
-
"
+
documentation = """The ID of the volume access group to which the initiatorWWPN beintegers. If not in a volume access group, the value will be null. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
+
def __init__ ( self ,
+
initiator_wwpn ,
+
node_id ,
+
service_id ,
+
target_wwpn ,
+
volume_access_group_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
[docs] class VirtualNetwork ( data_model . DataObject ):
-
"""
+
[docs] class ListFibreChannelSessionsResult ( data_model . DataObject ):
+
"""ListFibreChannelSessionsResult
+
Used to return information about the Fibre Channel sessions.
-
:param virtual_network_id: [required] SolidFire unique identifier for a
-
virtual network.
-
:type virtual_network_id: int
+
:param sessions: [required] A list of FibreChannelSession objects with information about the Fibre Channel session.
+
:type sessions: FibreChannelSession
-
:param virtual_network_tag: [required] VLAN Tag identifier.
-
:type virtual_network_tag: int
+
"""
+
sessions = data_model . property (
+
"sessions" , FibreChannelSession ,
+
array = True , optional = False ,
+
documentation = """A list of FibreChannelSession objects with information about the Fibre Channel session. """ ,
+
dictionaryType = None
+
)
-
:param address_blocks: [required] Range of address blocks currently
-
assigned to the virtual network.
+
def __init__ ( self ,
+
sessions ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
**available:** Binary string in \"1\"s and \"0\"s. 1 equals the IP is
-
available and 0 equals the IP is not available. The string is read from
-
right to left with the digit to the far right being the first IP
-
address in the list of addressBlocks.
+
[docs] class ListDriveStatsRequest ( data_model . DataObject ):
+
"""ListDriveStatsRequest
+
ListDriveStats enables you to retrieve high-level activity measurements for multiple drives in the cluster. By default, this method returns statistics for all drives in the cluster, and these measurements are cumulative from the addition of the drive to the cluster. Some values this method returns are specific to block drives, and some are specific to metadata drives.
-
**size:** the size of this block of addresses.
+
:param drives: Optional list of DriveIDs for which to return drive statistics. If you omit this parameter, measurements for all drives are returned.
+
:type drives: int
-
**start:** first IP address in the block.
+
"""
+
drives = data_model . property (
+
"drives" , int ,
+
array = True , optional = True ,
+
documentation = """Optional list of DriveIDs for which to return drive statistics. If you omit this parameter, measurements for all drives are returned. """ ,
+
dictionaryType = None
+
)
-
:type address_blocks: AddressBlock[]
+
def __init__ ( self ,
+
drives = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param name: [required] The name assigned to the virtual network.
-
:type name: str
+
[docs] class CancelCloneResult ( data_model . DataObject ):
+
"""CancelCloneResult
-
:param netmask: [required] IP address of the netmask for the virtual
-
network.
-
:type netmask: str
+
"""
-
:param svip: [required] Storage IP address for the virtual network.
-
:type svip: str
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param attributes: [required] List of Name/Value pairs in JSON object
-
format.
-
:type attributes: dict
+
[docs] class SetNetworkConfigRequest ( data_model . DataObject ):
+
"""SetNetworkConfigRequest
+
The SetNetworkConfig API method enables you to set the network configuration for a node. To display the current network settings for a node, run the GetNetworkConfig API method.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
+
Changing the "bond-mode" on a node can cause a temporary loss of network connectivity. Exercise caution when using this method.
-
:param gateway: (optional)
-
:type gateway: str
+
:param network: [required] An object containing node network settings to modify.
+
:type network: NetworkParams
-
:param namespace: (optional)
-
:type namespace: bool
"""
-
-
virtual_network_id = data_model . property (
-
"virtualNetworkID" , int ,
+
network = data_model . property (
+
"network" , NetworkParams ,
array = False , optional = False ,
-
documentation = " \
-
SolidFire unique identifier for a virtual network. \
-
"
+
documentation = """An object containing node network settings to modify. """ ,
+
dictionaryType = None
)
-
virtual_network_tag = data_model . property (
-
"virtualNetworkTag" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
VLAN Tag identifier. \
-
"
-
)
+
def __init__ ( self ,
+
network ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
address_blocks = data_model . property (
-
"addressBlocks" , AddressBlock ,
-
array = True , optional = False ,
-
documentation = " \
-
Range of address blocks currently assigned to the virtual network. \
-
\
-
\
-
**available:** Binary string in \" 1 \" s and \" 0 \" s. 1 equals the IP \
-
is available and 0 equals the IP is not available. The string is read \
-
from right to left with the digit to the far right being the first IP \
-
address in the list of addressBlocks. \
-
\
-
\
-
\
-
**size:** the size of this block of addresses. \
-
\
-
\
-
\
-
**start:** first IP address in the block. \
-
\
-
"
-
)
+
[docs] class SetClusterConfigResult ( data_model . DataObject ):
+
"""SetClusterConfigResult
-
name = data_model . property (
-
"name" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The name assigned to the virtual network. \
-
"
-
)
+
:param cluster: [required] Settings for the cluster. All new and current settings are returned.
+
:type cluster: ClusterConfig
-
netmask = data_model . property (
-
"netmask" , str ,
+
"""
+
cluster = data_model . property (
+
"cluster" , ClusterConfig ,
array = False , optional = False ,
-
documentation = " \
-
IP address of the netmask for the virtual network. \
-
"
+
documentation = """Settings for the cluster. All new and current settings are returned. """ ,
+
dictionaryType = None
)
-
svip = data_model . property (
-
"svip" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Storage IP address for the virtual network. \
-
"
-
)
+
def __init__ ( self ,
+
cluster ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
gateway = data_model . property (
-
"gateway" , str ,
-
array = False , optional = True ,
-
documentation = " \
-
\
-
"
-
)
+
[docs] class GetAccountEfficiencyRequest ( data_model . DataObject ):
+
"""GetAccountEfficiencyRequest
+
GetAccountEfficiency enables you to retrieve efficiency statistics about a volume account. This method returns efficiency information
+
only for the account you specify as a parameter.
-
namespace = data_model . property (
-
"namespace" , bool ,
-
array = False , optional = True ,
-
documentation = " \
-
\
-
"
-
)
+
:param account_id: [required] Specifies the volume account for which efficiency statistics are returned.
+
:type account_id: int
-
attributes = data_model . property (
-
"attributes" , dict ,
+
"""
+
account_id = data_model . property (
+
"accountID" , int ,
array = False , optional = False ,
-
documentation = " \
-
List of Name/Value pairs in JSON object format. \
-
"
+
documentation = """Specifies the volume account for which efficiency statistics are returned. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
-
-
[docs] class EventInfo ( data_model . DataObject ):
-
"""
-
-
:param event_id: [required]
-
:type event_id: int
+
def __init__ ( self ,
+
account_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param severity: [required]
-
:type severity: int
+
[docs] class RestartServicesRequest ( data_model . DataObject ):
+
"""RestartServicesRequest
+
The RestartServices API method enables you to restart the services on a node.
+
Caution: This method causes temporary node services interruption. Exercise caution when using this method.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
-
:param event_info_type: [required]
-
:type event_info_type: str
+
:param force: [required] Required parameter to successfully restart services on a node.
+
:type force: bool
-
:param message: [required]
-
:type message: str
+
:param service: Service name to be restarted.
+
:type service: str
-
:param service_id: [required]
-
:type service_id: int
+
:param action: Action to perform on the service (start, stop, restart).
+
:type action: str
-
:param node_id: [required]
-
:type node_id: int
+
"""
+
force = data_model . property (
+
"force" , bool ,
+
array = False , optional = False ,
+
documentation = """Required parameter to successfully restart services on a node. """ ,
+
dictionaryType = None
+
)
+
service = data_model . property (
+
"service" , str ,
+
array = False , optional = True ,
+
documentation = """Service name to be restarted. """ ,
+
dictionaryType = None
+
)
+
action = data_model . property (
+
"action" , str ,
+
array = False , optional = True ,
+
documentation = """Action to perform on the service (start, stop, restart). """ ,
+
dictionaryType = None
+
)
-
:param drive_id: [required]
-
:type drive_id: int
+
def __init__ ( self ,
+
force ,
+
service = None ,
+
action = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param time_of_report: [required]
-
:type time_of_report: str
+
[docs] class RemoveNodesRequest ( data_model . DataObject ):
+
"""RemoveNodesRequest
+
You can use RemoveNodes to remove one or more nodes that should no longer participate in the cluster. Before removing a node, you must remove all drives the node contains using the RemoveDrives method. You cannot remove a node until the RemoveDrives process has completed and all data has been migrated away from the node.
+
After you remove a node, it registers itself as a pending node. You can add the node again or shut it down (shutting the node down removes it from the Pending Node list).
-
:param time_of_publish: [required]
-
:type time_of_publish: str
+
:param nodes: [required] List of NodeIDs for the nodes to be removed.
+
:type nodes: int
-
:param details: [required]
-
:type details: str
"""
-
-
event_id = data_model . property (
-
"eventID" , int ,
-
array = False , optional = False ,
-
documentation = None
+
nodes = data_model . property (
+
"nodes" , int ,
+
array = True , optional = False ,
+
documentation = """List of NodeIDs for the nodes to be removed. """ ,
+
dictionaryType = None
)
-
severity = data_model . property (
-
"severity" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
def __init__ ( self ,
+
nodes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
event_info_type = data_model . property (
-
"eventInfoType" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
[docs] class CreateStorageContainerRequest ( data_model . DataObject ):
+
"""CreateStorageContainerRequest
+
CreateStorageContainer enables you to create a Virtual Volume (VVol) storage container. Storage containers are associated with a SolidFire storage system account, and are used for reporting and resource allocation. Storage containers can only be associated with virtual volumes. You need at least one storage container to use the Virtual Volumes feature.
-
message = data_model . property (
-
"message" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param name: [required] The name of the storage container. Follows SolidFire account naming restrictions.
+
:type name: str
-
service_id = data_model . property (
-
"serviceID" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param initiator_secret: The secret for CHAP authentication for the initiator.
+
:type initiator_secret: str
-
node_id = data_model . property (
-
"nodeID" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param target_secret: The secret for CHAP authentication for the target.
+
:type target_secret: str
-
drive_id = data_model . property (
-
"driveID" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param account_id: Non-storage container account that will become a storage container.
+
:type account_id: int
-
time_of_report = data_model . property (
-
"timeOfReport" , str ,
+
"""
+
name = data_model . property (
+
"name" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """The name of the storage container. Follows SolidFire account naming restrictions. """ ,
+
dictionaryType = None
)
-
-
time_of_publish = data_model . property (
-
"timeOfPublish" , str ,
-
array = False , optional = False ,
-
documentation = None
+
initiator_secret = data_model . property (
+
"initiatorSecret" , str ,
+
array = False , optional = True ,
+
documentation = """The secret for CHAP authentication for the initiator. """ ,
+
dictionaryType = None
)
+
target_secret = data_model . property (
+
"targetSecret" , str ,
+
array = False , optional = True ,
+
documentation = """The secret for CHAP authentication for the target. """ ,
+
dictionaryType = None
+
)
+
account_id = data_model . property (
+
"accountID" , int ,
+
array = False , optional = True ,
+
documentation = """Non-storage container account that will become a storage container. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
name ,
+
initiator_secret = None ,
+
target_secret = None ,
+
account_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListDriveHardwareRequest ( data_model . DataObject ):
+
"""ListDriveHardwareRequest
+
ListDriveHardware returns all the drives connected to a node. Use this method on individual nodes to return drive hardware
+
information or use this method on the cluster master node MVIP to see information for all the drives on all nodes.
+
Note: The "securitySupported": true line of the method response does not imply that the drives are capable of
+
encryption; only that the security status can be queried. If you have a node type with a model number ending in "-NE",
+
commands to enable security features on these drives will fail. See the EnableEncryptionAtRest method for more information.
+
+
:param force: [required] To run this command, the force parameter must be set to true.
+
:type force: bool
-
details = data_model . property (
-
"details" , str ,
+
"""
+
force = data_model . property (
+
"force" , bool ,
array = False , optional = False ,
-
documentation = None
+
documentation = """To run this command, the force parameter must be set to true. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
-
-
[docs] class ClusterConfig ( data_model . DataObject ):
-
"""
-
Cluster Config object returns information the node uses to communicate with
-
the cluster.
-
-
:param cipi: (optional) Network interface used for cluster communication.
-
:type cipi: str
-
-
:param cluster: (optional) Unique cluster name.
-
:type cluster: str
+
def __init__ ( self ,
+
force ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param ensemble: (optional) Nodes that are participating in the cluster.
-
:type ensemble: str[]
+
[docs] class ListVolumesRequest ( data_model . DataObject ):
+
"""ListVolumesRequest
+
The ListVolumes method enables you to retrieve a list of volumes that are in a cluster. You can specify the volumes you want to
+
return in the list by using the available parameters.
-
:param mipi: (optional) Network interface used for node management.
-
:type mipi: str
+
:param start_volume_id: Only volumes with an ID greater than or equal to this value are returned. Mutually exclusive with the volumeIDs parameter.
+
:type start_volume_id: int
-
:param name: (optional) Unique cluster name.
-
:type name: str
+
:param limit: Specifies the maximum number of volume results that are returned. Mutually exclusive with the volumeIDs parameter.
+
:type limit: int
-
:param node_id: (optional)
-
:type node_id: int
+
:param volume_status: Only volumes with a status equal to the status value are returned. Possible values are: creating snapshotting active deleted
+
:type volume_status: str
-
:param pending_node_id: (optional)
-
:type pending_node_id: int
+
:param accounts: Returns only the volumes owned by the accounts you specify here. Mutually exclusive with the volumeIDs parameter.
+
:type accounts: int
-
:param role: (optional) Identifies the role of the node
-
:type role: str
+
:param is_paired: Returns volumes that are paired or not paired. Possible values are: true: Returns all paired volumes. false: Returns all volumes that are not paired.
+
:type is_paired: bool
-
:param sipi: (optional) Network interface used for storage.
-
:type sipi: str
+
:param volume_ids: A list of volume IDs. If you supply this parameter, other parameters operate only on this set of volumes. Mutually exclusive with the accounts, startVolumeID, and limit parameters.
+
:type volume_ids: int
-
:param state: (optional)
-
:type state: str
-
"""
+
:param volume_name: Only volume object information matching the volume name is returned.
+
:type volume_name: str
-
cipi = data_model . property (
-
"cipi" , str ,
-
array = False , optional = True ,
-
documentation = " \
-
Network interface used for cluster communication. \
-
"
-
)
+
:param include_virtual_volumes: Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false.
+
:type include_virtual_volumes: bool
-
cluster = data_model . property (
-
"cluster" , str ,
+
"""
+
start_volume_id = data_model . property (
+
"startVolumeID" , int ,
array = False , optional = True ,
-
documentation = " \
-
Unique cluster name. \
-
"
+
documentation = """Only volumes with an ID greater than or equal to this value are returned. Mutually exclusive with the volumeIDs parameter. """ ,
+
dictionaryType = None
)
-
-
ensemble = data_model . property (
-
"ensemble" , str ,
-
array = True , optional = True ,
-
documentation = " \
-
Nodes that are participating in the cluster. \
-
"
-
)
-
-
mipi = data_model . property (
-
"mipi" , str ,
+
limit = data_model . property (
+
"limit" , int ,
array = False , optional = True ,
-
documentation = " \
-
Network interface used for node management. \
-
"
+
documentation = """Specifies the maximum number of volume results that are returned. Mutually exclusive with the volumeIDs parameter. """ ,
+
dictionaryType = None
)
-
-
name = data_model . property (
-
"name" , str ,
+
volume_status = data_model . property (
+
"volumeStatus" , str ,
array = False , optional = True ,
-
documentation = " \
-
Unique cluster name. \
-
"
+
documentation = """Only volumes with a status equal to the status value are returned. Possible values are: creating snapshotting active deleted """ ,
+
dictionaryType = None
)
-
-
node_id = data_model . property (
-
"nodeID" , int ,
-
array = False , optional = True ,
-
documentation = None
+
accounts = data_model . property (
+
"accounts" , int ,
+
array = True , optional = True ,
+
documentation = """Returns only the volumes owned by the accounts you specify here. Mutually exclusive with the volumeIDs parameter. """ ,
+
dictionaryType = None
)
-
-
pending_node_id = data_model . property (
-
"pendingNodeID" , int ,
+
is_paired = data_model . property (
+
"isPaired" , bool ,
array = False , optional = True ,
-
documentation = None
+
documentation = """Returns volumes that are paired or not paired. Possible values are: true: Returns all paired volumes. false: Returns all volumes that are not paired. """ ,
+
dictionaryType = None
)
-
-
role = data_model . property (
-
"role" , str ,
-
array = False , optional = True ,
-
documentation = " \
-
Identifies the role of the node \
-
"
+
volume_ids = data_model . property (
+
"volumeIDs" , int ,
+
array = True , optional = True ,
+
documentation = """A list of volume IDs. If you supply this parameter, other parameters operate only on this set of volumes. Mutually exclusive with the accounts, startVolumeID, and limit parameters. """ ,
+
dictionaryType = None
)
-
-
sipi = data_model . property (
-
"sipi" , str ,
+
volume_name = data_model . property (
+
"volumeName" , str ,
array = False , optional = True ,
-
documentation = " \
-
Network interface used for storage. \
-
"
+
documentation = """Only volume object information matching the volume name is returned. """ ,
+
dictionaryType = None
)
-
-
state = data_model . property (
-
"state" , str ,
+
include_virtual_volumes = data_model . property (
+
"includeVirtualVolumes" , bool ,
array = False , optional = True ,
-
documentation = None
-
)
-
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
+
documentation = """Specifies that virtual volumes are included in the response by default. To exclude virtual volumes, set to false. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
start_volume_id = None ,
+
limit = None ,
+
volume_status = None ,
+
accounts = None ,
+
is_paired = None ,
+
volume_ids = None ,
+
volume_name = None ,
+
include_virtual_volumes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class EnableSnmpResult ( data_model . DataObject ):
+
"""EnableSnmpResult
-
[docs] class ClusterInfo ( data_model . DataObject ):
-
"""
-
Cluster Info object returns information the node uses to communicate with
-
the cluster.
-
-
:param attributes: [required] List of Name/Value pairs in JSON object
-
format.
-
:type attributes: dict
+
"""
-
:param encryption_at_rest_state: [required] Encryption at rest state.
-
:type encryption_at_rest_state: str
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param ensemble: [required] Array of Node IP addresses that are
-
participating in the cluster.
-
:type ensemble: str[]
+
[docs] class CreateClusterResult ( data_model . DataObject ):
+
"""CreateClusterResult
-
:param mvip: [required] Management network interface.
-
:type mvip: str
+
"""
-
:param mvip_node_id: [required] Node holding the master MVIP address
-
:type mvip_node_id: int
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param name: [required] Unique cluster name.
-
:type name: str
+
[docs] class StartBulkVolumeWriteRequest ( data_model . DataObject ):
+
"""StartBulkVolumeWriteRequest
+
StartBulkVolumeWrite enables you to initialize a bulk volume write session on a specified volume. Only two bulk volume processes can run simultaneously on a volume. When you initialize the write session, data is written to a SolidFire storage volume from an external backup source. The external data is accessed by a web server running on an SF-series node. Communications and server
+
interaction information for external data access is passed by a script running on the storage system.
-
:param rep_count: [required] Number of replicas of each piece of data to
-
store in the cluster. Valid value is 2
-
:type rep_count: int
+
:param volume_id: [required] The ID of the volume to be written to.
+
:type volume_id: int
-
:param state: [required]
-
:type state: str
+
:param format: [required] The format of the volume data. It can be either of the following formats: uncompressed: Every byte of the volume is returned without any compression. native: Opaque data is returned that is smaller and more efficiently stored and written on a subsequent bulk volume write.
+
:type format: str
-
:param svip: [required] Storage virtual IP
-
:type svip: str
+
:param script: The executable name of a script. If unspecified, the key and URL are necessary to access SF-series nodes. The script runs on the primary node and the key and URL is returned to the script, so the local web server can be contacted.
+
:type script: str
-
:param svip_node_id: [required] Node holding the master SVIP address.
-
:type svip_node_id: int
+
:param script_parameters: JSON parameters to pass to the script.
+
:type script_parameters: dict
-
:param unique_id: [required] Unique ID for the cluster.
-
:type unique_id: str
+
:param attributes: JSON attributes for the bulk volume job.
+
:type attributes: dict
-
:param uuid: [required]
-
:type uuid: UUID
"""
-
-
attributes = data_model . property (
-
"attributes" , dict ,
+
volume_id = data_model . property (
+
"volumeID" , int ,
array = False , optional = False ,
-
documentation = " \
-
List of Name/Value pairs in JSON object format. \
-
"
+
documentation = """The ID of the volume to be written to. """ ,
+
dictionaryType = None
)
-
-
encryption_at_rest_state = data_model . property (
-
"encryptionAtRestState" , str ,
+
format = data_model . property (
+
"format" , str ,
array = False , optional = False ,
-
documentation = " \
-
Encryption at rest state. \
-
"
+
documentation = """The format of the volume data. It can be either of the following formats: uncompressed: Every byte of the volume is returned without any compression. native: Opaque data is returned that is smaller and more efficiently stored and written on a subsequent bulk volume write. """ ,
+
dictionaryType = None
)
-
-
ensemble = data_model . property (
-
"ensemble" , str ,
-
array = True , optional = False ,
-
documentation = " \
-
Array of Node IP addresses that are participating in the cluster. \
-
"
+
script = data_model . property (
+
"script" , str ,
+
array = False , optional = True ,
+
documentation = """The executable name of a script. If unspecified, the key and URL are necessary to access SF-series nodes. The script runs on the primary node and the key and URL is returned to the script, so the local web server can be contacted. """ ,
+
dictionaryType = None
)
-
-
mvip = data_model . property (
-
"mvip" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Management network interface. \
-
"
+
script_parameters = data_model . property (
+
"scriptParameters" , dict ,
+
array = False , optional = True ,
+
documentation = """JSON parameters to pass to the script. """ ,
+
dictionaryType = None
)
-
-
mvip_node_id = data_model . property (
-
"mvipNodeID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Node holding the master MVIP address \
-
"
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """JSON attributes for the bulk volume job. """ ,
+
dictionaryType = None
)
-
name = data_model . property (
-
"name" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Unique cluster name. \
-
"
-
)
+
def __init__ ( self ,
+
volume_id ,
+
format ,
+
script = None ,
+
script_parameters = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
rep_count = data_model . property (
-
"repCount" , int ,
+
[docs] class NodeStateInfo ( data_model . DataObject ):
+
"""NodeStateInfo
+
+
:param cluster: [required] Name of the cluster.
+
:type cluster: str
+
+
:param state: [required] <strong>Available:</strong> Node has not been configured with a cluster name.<br><strong>Pending:</strong> Node is pending for a specific named cluster and can be added.<br><strong>Active:</strong> Node is active and a member of a cluster and may not be added to another cluster.
+
:type state: str
+
+
"""
+
cluster = data_model . property (
+
"cluster" , str ,
array = False , optional = False ,
-
documentation = " \
-
Number of replicas of each piece of data to store in the cluster. \
-
Valid value is 2 \
-
"
+
documentation = """Name of the cluster. """ ,
+
dictionaryType = None
)
-
state = data_model . property (
"state" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """<strong>Available:</strong> Node has not been configured with a cluster name.<br><strong>Pending:</strong> Node is pending for a specific named cluster and can be added.<br><strong>Active:</strong> Node is active and a member of a cluster and may not be added to another cluster. """ ,
+
dictionaryType = None
)
-
svip = data_model . property (
-
"svip" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Storage virtual IP \
-
"
-
)
+
def __init__ ( self ,
+
cluster ,
+
state ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
svip_node_id = data_model . property (
-
"svipNodeID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Node holding the master SVIP address. \
-
"
-
)
+
[docs] class NodeStateResult ( data_model . DataObject ):
+
"""NodeStateResult
-
unique_id = data_model . property (
-
"uniqueID" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Unique ID for the cluster. \
-
"
-
)
+
:param node_id: [required] ID of the node.
+
:type node_id: int
-
uuid = data_model . property (
-
"uuid" , UUID ,
+
:param result: NodeStateInfo object.
+
:type result: NodeStateInfo
+
+
"""
+
node_id = data_model . property (
+
"nodeID" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ID of the node. """ ,
+
dictionaryType = None
+
)
+
result = data_model . property (
+
"result" , NodeStateInfo ,
+
array = False , optional = True ,
+
documentation = """NodeStateInfo object. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
+
def __init__ ( self ,
+
node_id ,
+
result = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
[docs] class PendingNode ( data_model . DataObject ):
-
"""
-
A \"pending node\" is one that has not yet joined the cluster.
-
It can be added to a cluster using the *add_node* method.
+
[docs] class GetClusterStateResult ( data_model . DataObject ):
+
"""GetClusterStateResult
-
:param pending_node_id: [required]
-
:type pending_node_id: int
+
:param nodes: Array of NodeStateResult objects for each node in the cluster.
+
:type nodes: NodeStateResult
-
:param assigned_node_id: [required]
-
:type assigned_node_id: int
+
:param cluster:
+
:type cluster: str
-
:param name: [required] The host name for this node.
-
:type name: str
+
:param state:
+
:type state: str
-
:param compatible: [required]
-
:type compatible: bool
+
"""
+
nodes = data_model . property (
+
"nodes" , NodeStateResult ,
+
array = True , optional = True ,
+
documentation = """Array of NodeStateResult objects for each node in the cluster. """ ,
+
dictionaryType = None
+
)
+
cluster = data_model . property (
+
"cluster" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
state = data_model . property (
+
"state" , str ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
nodes = None ,
+
cluster = None ,
+
state = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class DeleteVolumesRequest ( data_model . DataObject ):
+
"""DeleteVolumesRequest
+
DeleteVolumes marks multiple (up to 500) active volumes for deletion.
+
Once marked, the volumes are purged (permanently deleted) after the cleanup interval elapses.
+
The cleanup interval can be set in the SetClusterSettings method.
+
For more information on using this method, see SetClusterSettings on page 1.
+
After making a request to delete volumes, any active iSCSI connections to the volumes are immediately terminated
+
and no further connections are allowed while the volumes are in this state.
+
A marked volume is not returned in target discovery requests.
+
Any snapshots of a volume that has been marked for deletion are not affected.
+
Snapshots are kept until the volume is purged from the system.
+
If a volume is marked for deletion and has a bulk volume read or bulk volume write operation in progress,
+
the bulk volume read or write operation is stopped.
+
If the volumes you delete are paired with a volume, replication between the paired volumes is suspended
+
and no data is transferred to them or from them while in a deleted state.
+
The remote volumes the deleted volumes were paired with enter into a PausedMisconfigured state
+
and data is no longer sent to them or from the deleted volumes.
+
Until the deleted volumes are purged, they can be restored and data transfers resume.
+
If the deleted volumes are purged from the system, the volumes they were paired with enter into a
+
StoppedMisconfigured state and the volume pairing status is removed.
+
The purged volumes become permanently unavailable.
+
+
:param account_ids: A list of account IDs. All volumes from these accounts are deleted from the system.
+
:type account_ids: int
+
+
:param volume_access_group_ids: A list of volume access group IDs. All of the volumes from all of the volume access groups you specify in this list are deleted from the system.
+
:type volume_access_group_ids: int
+
+
:param volume_ids: The list of IDs of the volumes to delete from the system.
+
:type volume_ids: int
-
:param platform_info: [required] Information about the platform this node
-
is.
-
:type platform_info: Platform
+
"""
+
account_ids = data_model . property (
+
"accountIDs" , int ,
+
array = True , optional = True ,
+
documentation = """A list of account IDs. All volumes from these accounts are deleted from the system. """ ,
+
dictionaryType = None
+
)
+
volume_access_group_ids = data_model . property (
+
"volumeAccessGroupIDs" , int ,
+
array = True , optional = True ,
+
documentation = """A list of volume access group IDs. All of the volumes from all of the volume access groups you specify in this list are deleted from the system. """ ,
+
dictionaryType = None
+
)
+
volume_ids = data_model . property (
+
"volumeIDs" , int ,
+
array = True , optional = True ,
+
documentation = """The list of IDs of the volumes to delete from the system. """ ,
+
dictionaryType = None
+
)
-
:param cip: [required] IP address used for both intra- and inter-cluster
-
communication.
-
:type cip: str
+
def __init__ ( self ,
+
account_ids = None ,
+
volume_access_group_ids = None ,
+
volume_ids = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param cipi: [required] The machine's name for the \"cip\" interface.
-
:type cipi: str
+
[docs] class CreateInitiatorsResult ( data_model . DataObject ):
+
"""CreateInitiatorsResult
-
:param mip: [required] IP address used for cluster management (hosting the
-
API and web site).
-
:type mip: str
+
:param initiators: [required] List of objects containing details about the newly created initiators
+
:type initiators: Initiator
-
:param mipi: [required] The machine's name for the \"mip\" interface.
-
:type mipi: str
+
"""
+
initiators = data_model . property (
+
"initiators" , Initiator ,
+
array = True , optional = False ,
+
documentation = """List of objects containing details about the newly created initiators """ ,
+
dictionaryType = None
+
)
-
:param sip: [required] IP address used for iSCSI traffic.
-
:type sip: str
+
def __init__ ( self ,
+
initiators ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param sipi: [required] The machine's name for the \"sip\" interface.
-
:type sipi: str
+
[docs] class AddClusterAdminResult ( data_model . DataObject ):
+
"""AddClusterAdminResult
-
:param software_version: [required] The version of SolidFire software this
-
node is currently running.
-
:type software_version: str
+
:param cluster_admin_id: [required] ClusterAdminID for the newly created Cluster Admin.
+
:type cluster_admin_id: int
-
:param uuid: [required] UUID of node.
-
:type uuid: UUID
"""
-
-
pending_node_id = data_model . property (
-
"pendingNodeID" , int ,
+
cluster_admin_id = data_model . property (
+
"clusterAdminID" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ClusterAdminID for the newly created Cluster Admin. """ ,
+
dictionaryType = None
)
-
assigned_node_id = data_model . property (
-
"AssignedNodeID" , int ,
+
def __init__ ( self ,
+
cluster_admin_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ModifyBackupTargetRequest ( data_model . DataObject ):
+
"""ModifyBackupTargetRequest
+
ModifyBackupTarget enables you to change attributes of a backup target.
+
+
:param backup_target_id: [required] The unique target ID for the target to modify.
+
:type backup_target_id: int
+
+
:param name: The new name for the backup target.
+
:type name: str
+
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
+
+
"""
+
backup_target_id = data_model . property (
+
"backupTargetID" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """The unique target ID for the target to modify. """ ,
+
dictionaryType = None
)
-
name = data_model . property (
"name" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The host name for this node. \
-
"
-
)
-
-
compatible = data_model . property (
-
"compatible" , bool ,
-
array = False , optional = False ,
-
documentation = None
+
array = False , optional = True ,
+
documentation = """The new name for the backup target. """ ,
+
dictionaryType = None
)
-
-
platform_info = data_model . property (
-
"platformInfo" , Platform ,
-
array = False , optional = False ,
-
documentation = " \
-
Information about the platform this node is. \
-
"
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
)
-
cip = data_model . property (
-
"cip" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
IP address used for both intra- and inter-cluster communication. \
-
"
-
)
+
def __init__ ( self ,
+
backup_target_id ,
+
name = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
cipi = data_model . property (
-
"cipi" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The machine's name for the \" cip \" interface. \
-
"
-
)
+
[docs] class CompleteClusterPairingRequest ( data_model . DataObject ):
+
"""CompleteClusterPairingRequest
+
You can use the CompleteClusterPairing method with the encoded key received from the StartClusterPairing method to complete the cluster pairing process. The CompleteClusterPairing method is the second step in the cluster pairing process.
-
mip = data_model . property (
-
"mip" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
IP address used for cluster management (hosting the API and web site). \
-
"
-
)
+
:param cluster_pairing_key: [required] A string of characters that is returned from the "StartClusterPairing" API method.
+
:type cluster_pairing_key: str
-
mipi = data_model . property (
-
"mipi" , str ,
+
"""
+
cluster_pairing_key = data_model . property (
+
"clusterPairingKey" , str ,
array = False , optional = False ,
-
documentation = " \
-
The machine's name for the \" mip \" interface. \
-
"
+
documentation = """A string of characters that is returned from the "StartClusterPairing" API method. """ ,
+
dictionaryType = None
)
-
sip = data_model . property (
-
"sip" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
IP address used for iSCSI traffic. \
-
"
-
)
+
def __init__ ( self ,
+
cluster_pairing_key ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
sipi = data_model . property (
-
"sipi" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The machine's name for the \" sip \" interface. \
-
"
-
)
+
[docs] class GetCurrentClusterAdminResult ( data_model . DataObject ):
+
"""GetCurrentClusterAdminResult
-
software_version = data_model . property (
-
"softwareVersion" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
The version of SolidFire software this node is currently running. \
-
"
-
)
+
:param cluster_admin: [required] Information about all cluster and LDAP administrators that exist for a cluster.
+
:type cluster_admin: ClusterAdmin
-
uuid = data_model . property (
-
"uuid" , UUID ,
+
"""
+
cluster_admin = data_model . property (
+
"clusterAdmin" , ClusterAdmin ,
array = False , optional = False ,
-
documentation = " \
-
UUID of node. \
-
"
+
documentation = """Information about all cluster and LDAP administrators that exist for a cluster. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
+
def __init__ ( self ,
+
cluster_admin ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
[docs] class Snapshot ( data_model . DataObject ):
-
"""
-
Snapshots is an object containing information about each snapshot made for
-
a volume.
-
The return object includes information for the active snapshot as well as
-
each snapshot created for the volume.
-
-
:param snapshot_id: [required] Unique ID for this snapshot.
-
:type snapshot_id: int
+
[docs] class AddAccountResult ( data_model . DataObject ):
+
"""AddAccountResult
-
:param volume_id: [required] The volume this snapshot was taken of.
-
:type volume_id: int
+
:param account_id: [required] AccountID for the newly created Account.
+
:type account_id: int
-
:param name: [required] A name for this snapshot. It is not necessarily
-
unique.
-
:type name: str
+
:param account: The full account object
+
:type account: Account
-
:param checksum: [required] A string that represents the correct digits in
-
the stored snapshot. This checksum can be used later to compare other
-
snapshots to detect errors in the data.
-
:type checksum: str
+
"""
+
account_id = data_model . property (
+
"accountID" , int ,
+
array = False , optional = False ,
+
documentation = """AccountID for the newly created Account. """ ,
+
dictionaryType = None
+
)
+
account = data_model . property (
+
"account" , Account ,
+
array = False , optional = True ,
+
documentation = """The full account object """ ,
+
dictionaryType = None
+
)
-
:param enable_remote_replication: [required] Identifies if snapshot is
-
enabled for remote replication.
-
:type enable_remote_replication: bool
+
def __init__ ( self ,
+
account_id ,
+
account = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param expiration_reason: [required] Indicates how the snapshot expiration
-
was set. Possible values:
+
[docs] class DeleteStorageContainerResult ( data_model . DataObject ):
+
"""DeleteStorageContainerResult
-
**api**: expiration time was set by using the API.
+
"""
-
**none**: there is no expiration time set.
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
**test**: expiration time was set for testing.
+
[docs] class TestConnectSvipRequest ( data_model . DataObject ):
+
"""TestConnectSvipRequest
+
The TestConnectSvip API method enables you to test the storage connection to the cluster. The test pings the SVIP using ICMP packets, and when successful, connects as an iSCSI initiator.
+
Note: This method is available only through the per-node API endpoint 5.0 or later.
-
:type expiration_reason: str
+
:param svip: If specified, tests the storage connection of a different SVIP. You do not need to use this value when testing the connection to the target cluster. This parameter is optional.
+
:type svip: str
-
:param expiration_time: [required] The time at which this snapshot will
-
expire and be purged from the cluster.
-
:type expiration_time: str
+
"""
+
svip = data_model . property (
+
"svip" , str ,
+
array = False , optional = True ,
+
documentation = """If specified, tests the storage connection of a different SVIP. You do not need to use this value when testing the connection to the target cluster. This parameter is optional. """ ,
+
dictionaryType = None
+
)
-
:param remote_statuses: [required] Current remote status of the snapshot
-
*remote_status:* Possible values:
+
def __init__ ( self ,
+
svip = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
**Present**: Snapshot exists on a remote cluster
+
[docs] class SetRemoteLoggingHostsRequest ( data_model . DataObject ):
+
"""SetRemoteLoggingHostsRequest
+
SetRemoteLoggingHosts enables you to configure remote logging from the nodes in the storage cluster to a centralized log server or servers. Remote logging is performed over TCP using the default port 514. This API does not add to the existing logging hosts. Rather, it replaces what currently exists with new values specified by this API method. You can use GetRemoteLoggingHosts to determine what the current logging hosts are, and then use SetRemoteLoggingHosts to set the desired list of current and new logging hosts.
-
**Not Present**: Snapshot does not exist on remote cluster
+
:param remote_hosts: [required] A list of hosts to send log messages to.
+
:type remote_hosts: LoggingServer
-
**Syncing**: This is a target cluster and it is currently replicating
-
the snapshot
+
"""
+
remote_hosts = data_model . property (
+
"remoteHosts" , LoggingServer ,
+
array = True , optional = False ,
+
documentation = """A list of hosts to send log messages to. """ ,
+
dictionaryType = None
+
)
-
**Deleted**: This is a target cluster, the snapshot has been deleted,
-
and it still exists on the source.
+
def __init__ ( self ,
+
remote_hosts ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
**volumePairUUID**: universal identifier of the volume pair
+
[docs] class DriveInfo ( data_model . DataObject ):
+
"""DriveInfo
-
:type remote_statuses: str
+
:param capacity: [required] Total capacity of the drive, in bytes.
+
:type capacity: int
-
:param status: [required] Current status of the snapshot
+
:param drive_id: [required] DriveID for this drive.
+
:type drive_id: int
-
**Preparing**: A snapshot that is being prepared for use and is not yet
-
writable.
+
:param node_id: [required] NodeID where this drive is located.
+
:type node_id: int
-
**Done**: A snapshot that has finished being prepared and is now
-
usable.
+
:param serial: [required] Drive serial number.
+
:type serial: str
-
**Active**: This snapshot is the active branch.
+
:param slot: [required] Slot number in the server chassis where this drive is located, or -1 if SATADimm used for internal metadata drive.
+
:type slot: int
+
:param status: [required]
:type status: str
-
:param snapshot_uuid: [required] Universal Unique ID of an existing
-
snapshot.
-
:type snapshot_uuid: UUID
-
-
:param total_size: [required] Total size of this snapshot in bytes. It is
-
equivalent to *total_size* of the volume when this snapshot was taken.
-
:type total_size: int
-
-
:param group_snapshot_uuid: [required] The current \"members\" results
-
contains information about each snapshot in the group. Each of these
-
members will have a \"uuid\" parameter for the snapshot's UUID.
-
:type group_snapshot_uuid: UUID
-
-
:param create_time: [required] The time this snapshot was taken.
-
:type create_time: str
+
:param type: [required]
+
:type type: str
-
:param attributes: [required] List of Name/Value pairs in JSON object
-
format.
+
:param attributes: [required] List of Name/Value pairs in JSON object format.
:type attributes: dict
-
:param group_id: (optional) If present, the ID of the group this snapshot
-
is a part of. If not present, this snapshot is not part of a group.
-
:type group_id: int
"""
-
-
snapshot_id = data_model . property (
-
"snapshotID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Unique ID for this snapshot. \
-
"
-
)
-
-
volume_id = data_model . property (
-
"volumeID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The volume this snapshot was taken of. \
-
"
-
)
-
-
name = data_model . property (
-
"name" , str ,
+
capacity = data_model . property (
+
"capacity" , int ,
array = False , optional = False ,
-
documentation = " \
-
A name for this snapshot. \
-
It is not necessarily unique. \
-
"
+
documentation = """Total capacity of the drive, in bytes. """ ,
+
dictionaryType = None
)
-
-
checksum = data_model . property (
-
"checksum" , str ,
+
drive_id = data_model . property (
+
"driveID" , int ,
array = False , optional = False ,
-
documentation = " \
-
A string that represents the correct digits in the stored snapshot. \
-
This checksum can be used later to compare other snapshots to detect \
-
errors in the data. \
-
"
+
documentation = """DriveID for this drive. """ ,
+
dictionaryType = None
)
-
-
enable_remote_replication = data_model . property (
-
"enableRemoteReplication" , bool ,
+
node_id = data_model . property (
+
"nodeID" , int ,
array = False , optional = False ,
-
documentation = " \
-
Identifies if snapshot is enabled for remote replication. \
-
"
+
documentation = """NodeID where this drive is located. """ ,
+
dictionaryType = None
)
-
-
expiration_reason = data_model . property (
-
"expirationReason" , str ,
+
serial = data_model . property (
+
"serial" , str ,
array = False , optional = False ,
-
documentation = " \
-
Indicates how the snapshot expiration was set. Possible values: \
-
\
-
\
-
**api**: expiration time was set by using the API. \
-
\
-
\
-
\
-
**none**: there is no expiration time set. \
-
\
-
\
-
\
-
**test**: expiration time was set for testing. \
-
\
-
"
+
documentation = """Drive serial number. """ ,
+
dictionaryType = None
)
-
-
expiration_time = data_model . property (
-
"expirationTime" , str ,
+
slot = data_model . property (
+
"slot" , int ,
array = False , optional = False ,
-
documentation = " \
-
The time at which this snapshot will expire and be purged from the \
-
cluster. \
-
"
-
)
-
-
remote_statuses = data_model . property (
-
"remoteStatuses" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Current remote status of the snapshot *remote_status:* Possible \
-
values: \
-
\
-
\
-
**Present**: Snapshot exists on a remote cluster \
-
\
-
\
-
\
-
**Not Present**: Snapshot does not exist on remote cluster \
-
\
-
\
-
\
-
**Syncing**: This is a target cluster and it is currently \
-
replicating the snapshot \
-
\
-
\
-
\
-
**Deleted**: This is a target cluster, the snapshot has been \
-
deleted, and it still exists on the source. \
-
\
-
\
-
\
-
**volumePairUUID**: universal identifier of the volume pair \
-
\
-
"
+
documentation = """Slot number in the server chassis where this drive is located, or -1 if SATADimm used for internal metadata drive. """ ,
+
dictionaryType = None
)
-
status = data_model . property (
"status" , str ,
array = False , optional = False ,
-
documentation = " \
-
Current status of the snapshot \
-
\
-
\
-
**Preparing**: A snapshot that is being prepared for use and is \
-
not yet writable. \
-
\
-
\
-
\
-
**Done**: A snapshot that has finished being prepared and is now \
-
usable. \
-
\
-
\
-
\
-
**Active**: This snapshot is the active branch. \
-
\
-
"
-
)
-
-
snapshot_uuid = data_model . property (
-
"snapshotUUID" , UUID ,
-
array = False , optional = False ,
-
documentation = " \
-
Universal Unique ID of an existing snapshot. \
-
"
-
)
-
-
total_size = data_model . property (
-
"totalSize" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Total size of this snapshot in bytes. \
-
It is equivalent to *total_size* of the volume when this snapshot was \
-
taken. \
-
"
-
)
-
-
group_id = data_model . property (
-
"groupID" , int ,
-
array = False , optional = True ,
-
documentation = " \
-
If present, the ID of the group this snapshot is a part of. \
-
If not present, this snapshot is not part of a group. \
-
"
-
)
-
-
group_snapshot_uuid = data_model . property (
-
"groupSnapshotUUID" , UUID ,
-
array = False , optional = False ,
-
documentation = " \
-
The current \" members \" results contains information about each \
-
snapshot in the group. \
-
Each of these members will have a \" uuid \" parameter for the \
-
snapshot's UUID. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
create_time = data_model . property (
-
"createTime" , str ,
+
type = data_model . property (
+
"type" , str ,
array = False , optional = False ,
-
documentation = " \
-
The time this snapshot was taken. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
attributes = data_model . property (
"attributes" , dict ,
array = False , optional = False ,
-
documentation = " \
-
List of Name/Value pairs in JSON object format. \
-
"
+
documentation = """List of Name/Value pairs in JSON object format. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
-
-
[docs] class VolumeStats ( data_model . DataObject ):
-
"""
-
Contains statistical data for an individual volume.
-
-
:param account_id: [required] *account_id* of the volume owner.
-
:type account_id: int
-
-
:param actual_iops: [required] Current actual IOPS to the volume in the
-
last 500 milliseconds.
-
:type actual_iops: int
-
-
:param average_iopsize: [required] Average size in bytes of recent I/O to
-
the volume in the last 500 milliseconds.
-
:type average_iopsize: int
-
-
:param burst_iopscredit: [required] The total number of IOP credits
-
available to the user. When users are not using up to the max IOPS,
-
credits are accrued.
-
:type burst_iopscredit: int
-
-
:param client_queue_depth: [required] The number of outstanding read and
-
write operations to the cluster.
-
:type client_queue_depth: int
-
-
:param desired_metadata_hosts: [required] The volume services being
-
migrated to if the volume metadata is getting migrated between volume
-
services. A \"null\" value means the volume is not migrating.
-
:type desired_metadata_hosts: MetadataHosts
-
-
:param latency_usec: [required] The observed latency time, in microseconds,
-
to complete operations to a volume.
-
-
A \"0\" (zero) value means there is no I/O to the volume.
-
-
:type latency_usec: int
-
-
:param metadata_hosts: [required] The volume services on which the volume
-
metadata resides.
-
:type metadata_hosts: MetadataHosts
-
-
:param non_zero_blocks: [required] The number of 4KiB blocks with data
-
after the last garbage collection operation has completed.
-
:type non_zero_blocks: int
-
-
:param read_bytes: [required] Total bytes read by clients.
-
:type read_bytes: int
-
-
:param read_latency_usec: [required] The average time, in microseconds, to
-
complete read operations.
-
:type read_latency_usec: int
-
-
:param read_ops: [required] Total read operations.
-
:type read_ops: int
-
-
:param throttle: [required] A floating value between 0 and 1 that
-
represents how much the system is throttling clients below their max
-
IOPS because of re-replication of data, transient errors and snapshots
-
taken.
-
:type throttle: float
+
def __init__ ( self ,
+
capacity ,
+
drive_id ,
+
node_id ,
+
serial ,
+
slot ,
+
status ,
+
type ,
+
attributes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param timestamp: [required] The current time in UTC.
-
:type timestamp: str
+
[docs] class ListDrivesResult ( data_model . DataObject ):
+
"""ListDrivesResult
-
:param total_latency_usec: [required] The average time, in microseconds, to
-
complete read and write operations to a volume.
-
:type total_latency_usec: int
+
:param drives: [required] Information for the drives that are connected to the cluster.
+
:type drives: DriveInfo
-
:param unaligned_reads: [required] For 512e volumes, the number of read
-
operations that were not on a 4k sector boundary. High numbers of
-
unaligned reads may indicate improper partition alignment.
-
:type unaligned_reads: int
+
"""
+
drives = data_model . property (
+
"drives" , DriveInfo ,
+
array = True , optional = False ,
+
documentation = """Information for the drives that are connected to the cluster. """ ,
+
dictionaryType = None
+
)
-
:param unaligned_writes: [required] For 512e volumes, the number of write
-
operations that were not on a 4k sector boundary. High numbers of
-
unaligned writes may indicate improper partition alignment.
-
:type unaligned_writes: int
+
def __init__ ( self ,
+
drives ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param volume_access_groups: [required] List of volume access group(s) to
-
which a volume belongs.
-
:type volume_access_groups: int[]
+
[docs] class StartVolumePairingRequest ( data_model . DataObject ):
+
"""StartVolumePairingRequest
+
StartVolumePairing enables you to create an encoded key from a volume that is used to pair with another volume. The key that this
+
method creates is used in the CompleteVolumePairing API method to establish a volume pairing.
-
:param volume_id: [required] Volume ID of the volume.
+
:param volume_id: [required] The ID of the volume on which to start the pairing process.
:type volume_id: int
-
:param volume_size: [required] Total provisioned capacity in bytes.
-
:type volume_size: int
-
-
:param volume_utilization: [required] A floating value that describes how
-
much the client is using the volume.
+
:param mode: The mode of the volume on which to start the pairing process. The mode can only be set if the volume is the source volume. Possible values are: Async: (default if no mode parameter specified) Writes are acknowledged when they complete locally. The cluster does not wait for writes to be replicated to the target cluster. Sync: Source acknowledges write when the data is stored locally and on the remote cluster. SnapshotsOnly: Only snapshots created on the source cluster will be replicated. Active writes from the source volume are not replicated.
+
:type mode: str
-
Values:
+
"""
+
volume_id = data_model . property (
+
"volumeID" , int ,
+
array = False , optional = False ,
+
documentation = """The ID of the volume on which to start the pairing process. """ ,
+
dictionaryType = None
+
)
+
mode = data_model . property (
+
"mode" , str ,
+
array = False , optional = True ,
+
documentation = """The mode of the volume on which to start the pairing process. The mode can only be set if the volume is the source volume. Possible values are: Async: (default if no mode parameter specified) Writes are acknowledged when they complete locally. The cluster does not wait for writes to be replicated to the target cluster. Sync: Source acknowledges write when the data is stored locally and on the remote cluster. SnapshotsOnly: Only snapshots created on the source cluster will be replicated. Active writes from the source volume are not replicated. """ ,
+
dictionaryType = None
+
)
-
0 = Client is not using the volume
+
def __init__ ( self ,
+
volume_id ,
+
mode = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
1 = Client is using their max
+
[docs] class GetVolumeEfficiencyResult ( data_model . DataObject ):
+
"""GetVolumeEfficiencyResult
-
>1 = Client is using their burst
+
:param compression: The amount of space being saved by compressing data on a single volume. Stated as a ratio where "1" means data has been stored without being compressed.
+
:type compression: float
-
:type volume_utilization: float
+
:param deduplication: [required] The amount of space being saved on a single volume by not duplicating data. Stated as a ratio.
+
:type deduplication: float
-
:param write_bytes: [required] Total bytes written by clients.
-
:type write_bytes: int
+
:param missing_volumes: [required] The volumes that could not be queried for efficiency data. Missing volumes can be caused by GC being less than hour old, temporary network loss or restarted services since the GC cycle.
+
:type missing_volumes: int
-
:param write_latency_usec: [required] The average time, in microseconds, to
-
complete write operations.
-
:type write_latency_usec: int
+
:param thin_provisioning: [required] The ratio of space used to the amount of space allocated for storing data. Stated as a ratio.
+
:type thin_provisioning: float
-
:param write_ops: [required] Total write operations occurring on the
-
volume.
-
:type write_ops: int
+
:param timestamp: [required] The last time efficiency data was collected after Garbage Collection (GC).
+
:type timestamp: str
-
:param zero_blocks: [required] Total number of 4KiB blocks without data
-
after the last round of garbage collection operation has completed.
-
:type zero_blocks: int
+
"""
+
compression = data_model . property (
+
"compression" , float ,
+
array = False , optional = True ,
+
documentation = """The amount of space being saved by compressing data on a single volume. Stated as a ratio where "1" means data has been stored without being compressed. """ ,
+
dictionaryType = None
+
)
+
deduplication = data_model . property (
+
"deduplication" , float ,
+
array = False , optional = False ,
+
documentation = """The amount of space being saved on a single volume by not duplicating data. Stated as a ratio. """ ,
+
dictionaryType = None
+
)
+
missing_volumes = data_model . property (
+
"missingVolumes" , int ,
+
array = True , optional = False ,
+
documentation = """The volumes that could not be queried for efficiency data. Missing volumes can be caused by GC being less than hour old, temporary network loss or restarted services since the GC cycle. """ ,
+
dictionaryType = None
+
)
+
thin_provisioning = data_model . property (
+
"thinProvisioning" , float ,
+
array = False , optional = False ,
+
documentation = """The ratio of space used to the amount of space allocated for storing data. Stated as a ratio. """ ,
+
dictionaryType = None
+
)
+
timestamp = data_model . property (
+
"timestamp" , str ,
+
array = False , optional = False ,
+
documentation = """The last time efficiency data was collected after Garbage Collection (GC). """ ,
+
dictionaryType = None
+
)
-
:param async_delay: (optional) The length of time since the volume was last
-
synced with the remote cluster. If the volume is not paired, this is
-
null.
+
def __init__ ( self ,
+
deduplication ,
+
missing_volumes ,
+
thin_provisioning ,
+
timestamp ,
+
compression = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class ClusterVersionInfo ( data_model . DataObject ):
+
"""ClusterVersionInfo
+
Version information for a node in the cluster.
+
:param node_id: [required]
+
:type node_id: int
-
**Note**: A target volume in an active replication state always has an
-
async delay of 0 (zero).
+
:param node_version: [required]
+
:type node_version: str
-
Target volumes are system-aware during replication and assume async
-
delay is accurate at all times.
+
:param node_internal_revision: [required]
+
:type node_internal_revision: str
-
:type async_delay: str
"""
-
-
account_id = data_model . property (
-
"accountID" , int ,
+
node_id = data_model . property (
+
"nodeID" , int ,
array = False , optional = False ,
-
documentation = " \
-
*account_id* of the volume owner. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
actual_iops = data_model . property (
-
"actualIOPS" , int ,
+
node_version = data_model . property (
+
"nodeVersion" , str ,
array = False , optional = False ,
-
documentation = " \
-
Current actual IOPS to the volume in the last 500 milliseconds. \
-
"
-
)
-
-
async_delay = data_model . property (
-
"asyncDelay" , str ,
-
array = False , optional = True ,
-
documentation = " \
-
The length of time since the volume was last synced with the remote \
-
cluster. \
-
If the volume is not paired, this is null. \
-
\
-
\
-
\
-
\
-
\
-
\
-
**Note**: A target volume in an active replication state always \
-
has an async delay of 0 (zero). \
-
\
-
\
-
\
-
Target volumes are system-aware during replication and assume \
-
async delay is accurate at all times. \
-
\
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
average_iopsize = data_model . property (
-
"averageIOPSize" , int ,
+
node_internal_revision = data_model . property (
+
"nodeInternalRevision" , str ,
array = False , optional = False ,
-
documentation = " \
-
Average size in bytes of recent I/O to the volume in the last 500 \
-
milliseconds. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
burst_iopscredit = data_model . property (
-
"burstIOPSCredit" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The total number of IOP credits available to the user. \
-
When users are not using up to the max IOPS, credits are accrued. \
-
"
-
)
+
def __init__ ( self ,
+
node_id ,
+
node_version ,
+
node_internal_revision ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
client_queue_depth = data_model . property (
-
"clientQueueDepth" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The number of outstanding read and write operations to the cluster. \
-
"
-
)
+
[docs] class SoftwareVersionInfo ( data_model . DataObject ):
+
"""SoftwareVersionInfo
-
desired_metadata_hosts = data_model . property (
-
"desiredMetadataHosts" , MetadataHosts ,
-
array = False , optional = False ,
-
documentation = " \
-
The volume services being migrated to if the volume metadata is \
-
getting migrated between volume services. \
-
A \" null \" value means the volume is not migrating. \
-
"
-
)
+
:param current_version: [required]
+
:type current_version: str
-
latency_usec = data_model . property (
-
"latencyUSec" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The observed latency time, in microseconds, to complete operations to \
-
a volume. \
-
\
-
\
-
\
-
A \" 0 \" (zero) value means there is no I/O to the volume. \
-
"
-
)
+
:param node_id: [required]
+
:type node_id: int
-
metadata_hosts = data_model . property (
-
"metadataHosts" , MetadataHosts ,
-
array = False , optional = False ,
-
documentation = " \
-
The volume services on which the volume metadata resides. \
-
"
-
)
+
:param package_name: [required]
+
:type package_name: str
-
non_zero_blocks = data_model . property (
-
"nonZeroBlocks" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
The number of 4KiB blocks with data after the last garbage collection \
-
operation has completed. \
-
"
-
)
+
:param pending_version: [required]
+
:type pending_version: str
-
read_bytes = data_model . property (
-
"readBytes" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Total bytes read by clients. \
-
"
-
)
+
:param start_time: [required]
+
:type start_time: str
-
read_latency_usec = data_model . property (
-
"readLatencyUSec" , int ,
+
"""
+
current_version = data_model . property (
+
"currentVersion" , str ,
array = False , optional = False ,
-
documentation = " \
-
The average time, in microseconds, to complete read operations. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
read_ops = data_model . property (
-
"readOps" , int ,
+
node_id = data_model . property (
+
"nodeID" , int ,
array = False , optional = False ,
-
documentation = " \
-
Total read operations. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
throttle = data_model . property (
-
"throttle" , float ,
+
package_name = data_model . property (
+
"packageName" , str ,
array = False , optional = False ,
-
documentation = " \
-
A floating value between 0 and 1 that represents how much the system \
-
is throttling clients \
-
below their max IOPS because of re-replication of data, transient \
-
errors and snapshots taken. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
timestamp = data_model . property (
-
"timestamp" , str ,
+
pending_version = data_model . property (
+
"pendingVersion" , str ,
array = False , optional = False ,
-
documentation = " \
-
The current time in UTC. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
total_latency_usec = data_model . property (
-
"totalLatencyUSec" , int ,
+
start_time = data_model . property (
+
"startTime" , str ,
array = False , optional = False ,
-
documentation = " \
-
The average time, in microseconds, to complete read and write \
-
operations to a volume. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
unaligned_reads = data_model . property (
-
"unalignedReads" , int ,
+
def __init__ ( self ,
+
current_version ,
+
node_id ,
+
package_name ,
+
pending_version ,
+
start_time ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetClusterVersionInfoResult ( data_model . DataObject ):
+
"""GetClusterVersionInfoResult
+
+
:param cluster_apiversion: [required]
+
:type cluster_apiversion: str
+
+
:param cluster_version: [required]
+
:type cluster_version: str
+
+
:param cluster_version_info: [required]
+
:type cluster_version_info: ClusterVersionInfo
+
+
:param software_version_info: [required]
+
:type software_version_info: SoftwareVersionInfo
+
+
"""
+
cluster_apiversion = data_model . property (
+
"clusterAPIVersion" , str ,
array = False , optional = False ,
-
documentation = " \
-
For 512e volumes, the number of read operations that were not on a 4k \
-
sector boundary. \
-
High numbers of unaligned reads may indicate improper partition \
-
alignment. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
unaligned_writes = data_model . property (
-
"unalignedWrites" , int ,
+
cluster_version = data_model . property (
+
"clusterVersion" , str ,
array = False , optional = False ,
-
documentation = " \
-
For 512e volumes, the number of write operations that were not on a 4k \
-
sector boundary. \
-
High numbers of unaligned writes may indicate improper partition \
-
alignment. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
volume_access_groups = data_model . property (
-
"volumeAccessGroups" , int ,
+
cluster_version_info = data_model . property (
+
"clusterVersionInfo" , ClusterVersionInfo ,
array = True , optional = False ,
-
documentation = " \
-
List of volume access group(s) to which a volume belongs. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
volume_id = data_model . property (
-
"volumeID" , int ,
+
software_version_info = data_model . property (
+
"softwareVersionInfo" , SoftwareVersionInfo ,
array = False , optional = False ,
-
documentation = " \
-
Volume ID of the volume. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
volume_size = data_model . property (
-
"volumeSize" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Total provisioned capacity in bytes. \
-
"
-
)
+
def __init__ ( self ,
+
cluster_apiversion ,
+
cluster_version ,
+
cluster_version_info ,
+
software_version_info ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
volume_utilization = data_model . property (
-
"volumeUtilization" , float ,
-
array = False , optional = False ,
-
documentation = " \
-
A floating value that describes how much the client is using the \
-
volume. \
-
\
-
\
-
\
-
\
-
Values: \
-
\
-
\
-
\
-
0 = Client is not using the volume \
-
\
-
\
-
\
-
1 = Client is using their max \
-
\
-
\
-
\
-
>1 = Client is using their burst \
-
"
-
)
+
[docs] class IpmiInfo ( data_model . DataObject ):
+
"""IpmiInfo
-
write_bytes = data_model . property (
-
"writeBytes" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Total bytes written by clients. \
-
"
+
:param sensors: [required]
+
:type sensors: dict
+
+
"""
+
sensors = data_model . property (
+
"sensors" , dict ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
write_latency_usec = data_model . property (
-
"writeLatencyUSec" , int ,
+
def __init__ ( self ,
+
sensors ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetIpmiInfoNodesResultObject ( data_model . DataObject ):
+
"""GetIpmiInfoNodesResultObject
+
+
:param ipmi_info: [required]
+
:type ipmi_info: IpmiInfo
+
+
"""
+
ipmi_info = data_model . property (
+
"ipmiInfo" , IpmiInfo ,
array = False , optional = False ,
-
documentation = " \
-
The average time, in microseconds, to complete write operations. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
write_ops = data_model . property (
-
"writeOps" , int ,
+
def __init__ ( self ,
+
ipmi_info ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetIpmiInfoNodesResult ( data_model . DataObject ):
+
"""GetIpmiInfoNodesResult
+
+
:param node_id: [required]
+
:type node_id: int
+
+
:param result: [required]
+
:type result: GetIpmiInfoNodesResultObject
+
+
"""
+
node_id = data_model . property (
+
"nodeID" , int ,
array = False , optional = False ,
-
documentation = " \
-
Total write operations occurring on the volume. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
zero_blocks = data_model . property (
-
"zeroBlocks" , int ,
+
result = data_model . property (
+
"result" , GetIpmiInfoNodesResultObject ,
array = False , optional = False ,
-
documentation = " \
-
Total number of 4KiB blocks without data after the last round of \
-
garbage collection operation has completed. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
node_id ,
+
result ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class GetIpmiInfoResult ( data_model . DataObject ):
+
"""GetIpmiInfoResult
-
[docs] class ClusterFaultInfo ( data_model . DataObject ):
-
"""
+
:param nodes: [required] Detailed information from each sensor within a node.
+
:type nodes: GetIpmiInfoNodesResult
-
:param severity: [required]
-
:type severity: str
+
"""
+
nodes = data_model . property (
+
"nodes" , GetIpmiInfoNodesResult ,
+
array = True , optional = False ,
+
documentation = """Detailed information from each sensor within a node. """ ,
+
dictionaryType = None
+
)
-
:param type: [required]
-
:type type: str
+
def __init__ ( self ,
+
nodes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param code: [required]
-
:type code: str
+
[docs] class ResetDrivesRequest ( data_model . DataObject ):
+
"""ResetDrivesRequest
+
ResetDrives enables you to proactively initialize drives and remove all data currently residing on a drive. The drive can then be reused
+
in an existing node or used in an upgraded node. This method requires the force parameter to be included in the method call.
-
:param details: [required]
-
:type details: str
+
:param drives: [required] List of device names (not driveIDs) to reset.
+
:type drives: str
-
:param node_hardware_fault_id: [required]
-
:type node_hardware_fault_id: int
+
:param force: [required] Required parameter to successfully reset a drive.
+
:type force: bool
-
:param node_id: [required]
-
:type node_id: int
+
"""
+
drives = data_model . property (
+
"drives" , str ,
+
array = False , optional = False ,
+
documentation = """List of device names (not driveIDs) to reset. """ ,
+
dictionaryType = None
+
)
+
force = data_model . property (
+
"force" , bool ,
+
array = False , optional = False ,
+
documentation = """Required parameter to successfully reset a drive. """ ,
+
dictionaryType = None
+
)
-
:param service_id: [required]
-
:type service_id: int
+
def __init__ ( self ,
+
drives ,
+
force ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param drive_id: [required]
-
:type drive_id: int
+
[docs] class EnableLdapAuthenticationResult ( data_model . DataObject ):
+
"""EnableLdapAuthenticationResult
-
:param resolved: [required]
-
:type resolved: bool
+
"""
-
:param cluster_fault_id: [required]
-
:type cluster_fault_id: int
+
def __init__ ( self ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param date: [required]
-
:type date: str
+
[docs] class StartBulkVolumeReadResult ( data_model . DataObject ):
+
"""StartBulkVolumeReadResult
-
:param resolved_date: [required]
-
:type resolved_date: str
+
:param async_handle: [required] ID of the async process to be checked for completion.
+
:type async_handle: int
-
:param data: [required]
-
:type data: str
-
"""
+
:param key: [required] Opaque key uniquely identifying the session.
+
:type key: str
-
severity = data_model . property (
-
"severity" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param url: [required] URL to access the node's web server
+
:type url: str
-
type = data_model . property (
-
"type" , str ,
+
"""
+
async_handle = data_model . property (
+
"asyncHandle" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ID of the async process to be checked for completion. """ ,
+
dictionaryType = None
)
-
-
code = data_model . property (
-
"code" , str ,
+
key = data_model . property (
+
"key" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """Opaque key uniquely identifying the session. """ ,
+
dictionaryType = None
)
-
-
details = data_model . property (
-
"details" , str ,
+
url = data_model . property (
+
"url" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """URL to access the node's web server """ ,
+
dictionaryType = None
)
-
node_hardware_fault_id = data_model . property (
-
"nodeHardwareFaultID" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
def __init__ ( self ,
+
async_handle ,
+
key ,
+
url ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
node_id = data_model . property (
-
"nodeID" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
[docs] class TestLdapAuthenticationResult ( data_model . DataObject ):
+
"""TestLdapAuthenticationResult
-
service_id = data_model . property (
-
"serviceID" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param groups: [required] List of LDAP groups that the tested user is a member of.
+
:type groups: str
-
drive_id = data_model . property (
-
"driveID" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param user_dn: [required] The tested user's full LDAP distinguished name.
+
:type user_dn: str
-
resolved = data_model . property (
-
"resolved" , bool ,
-
array = False , optional = False ,
-
documentation = None
+
"""
+
groups = data_model . property (
+
"groups" , str ,
+
array = True , optional = False ,
+
documentation = """List of LDAP groups that the tested user is a member of. """ ,
+
dictionaryType = None
)
-
-
cluster_fault_id = data_model . property (
-
"clusterFaultID" , int ,
+
user_dn = data_model . property (
+
"userDN" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """The tested user's full LDAP distinguished name. """ ,
+
dictionaryType = None
)
-
date = data_model . property (
-
"date" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
def __init__ ( self ,
+
groups ,
+
user_dn ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
resolved_date = data_model . property (
-
"resolvedDate" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
[docs] class GetStorageContainerEfficiencyRequest ( data_model . DataObject ):
+
"""GetStorageContainerEfficiencyRequest
+
GetStorageContainerEfficiency enables you to retrieve efficiency information about a virtual volume storage container.
-
data = data_model . property (
-
"data" , str ,
+
:param storage_container_id: [required] The ID of the storage container for which to retrieve efficiency information.
+
:type storage_container_id: UUID
+
+
"""
+
storage_container_id = data_model . property (
+
"storageContainerID" , UUID ,
array = False , optional = False ,
-
documentation = None
+
documentation = """The ID of the storage container for which to retrieve efficiency information. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
storage_container_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class PurgeDeletedVolumesRequest ( data_model . DataObject ):
+
"""PurgeDeletedVolumesRequest
+
PurgeDeletedVolumes immediately and permanently purges volumes that have been deleted.
+
You can use this method to purge up to 500 volumes at one time.
+
You must delete volumes using DeleteVolumes before they can be purged.
+
Volumes are purged by the system automatically after a period of time, so usage of this method is not typically required.
-
[docs] class ISCSISession ( data_model . DataObject ):
-
"""
+
:param volume_ids: A list of volumeIDs of volumes to be purged from the system.
+
:type volume_ids: int
-
:param account_id: [required]
-
:type account_id: int
+
:param account_ids: A list of accountIDs. All of the volumes from all of the specified accounts are purged from the system.
+
:type account_ids: int
-
:param account_name: [required]
-
:type account_name: str
+
:param volume_access_group_ids: A list of volumeAccessGroupIDs. All of the volumes from all of the specified Volume Access Groups are purged from the system.
+
:type volume_access_group_ids: int
-
:param drive_id: [required]
-
:type drive_id: int
+
"""
+
volume_ids = data_model . property (
+
"volumeIDs" , int ,
+
array = True , optional = True ,
+
documentation = """A list of volumeIDs of volumes to be purged from the system. """ ,
+
dictionaryType = None
+
)
+
account_ids = data_model . property (
+
"accountIDs" , int ,
+
array = True , optional = True ,
+
documentation = """A list of accountIDs. All of the volumes from all of the specified accounts are purged from the system. """ ,
+
dictionaryType = None
+
)
+
volume_access_group_ids = data_model . property (
+
"volumeAccessGroupIDs" , int ,
+
array = True , optional = True ,
+
documentation = """A list of volumeAccessGroupIDs. All of the volumes from all of the specified Volume Access Groups are purged from the system. """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
volume_ids = None ,
+
account_ids = None ,
+
volume_access_group_ids = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class AddLdapClusterAdminRequest ( data_model . DataObject ):
+
"""AddLdapClusterAdminRequest
+
AddLdapClusterAdmin enables you to add a new LDAP cluster administrator user. An LDAP cluster administrator can manage the
+
cluster via the API and management tools. LDAP cluster admin accounts are completely separate and unrelated to standard tenant
+
accounts.
+
You can also use this method to add an LDAP group that has been defined in Active Directory. The access level that is given to the group is passed to the individual users in the LDAP group.
+
+
:param username: [required] The distinguished user name for the new LDAP cluster admin.
+
:type username: str
-
:param initiator_ip: [required]
-
:type initiator_ip: str
+
:param access: [required] Controls which methods this Cluster Admin can use. For more details on the levels of access, see the Access Control appendix in the SolidFire API Reference.
+
:type access: str
-
:param initiator_name: [required]
-
:type initiator_name: str
+
:param accept_eula: Accept the End User License Agreement. Set to true to add a cluster administrator account to the system. If omitted or set to false, the method call fails.
+
:type accept_eula: bool
-
:param node_id: [required]
-
:type node_id: int
+
:param attributes: List of name-value pairs in JSON object format.
+
:type attributes: dict
-
:param service_id: [required]
-
:type service_id: int
+
"""
+
username = data_model . property (
+
"username" , str ,
+
array = False , optional = False ,
+
documentation = """The distinguished user name for the new LDAP cluster admin. """ ,
+
dictionaryType = None
+
)
+
access = data_model . property (
+
"access" , str ,
+
array = True , optional = False ,
+
documentation = """Controls which methods this Cluster Admin can use. For more details on the levels of access, see the Access Control appendix in the SolidFire API Reference. """ ,
+
dictionaryType = None
+
)
+
accept_eula = data_model . property (
+
"acceptEula" , bool ,
+
array = False , optional = True ,
+
documentation = """Accept the End User License Agreement. Set to true to add a cluster administrator account to the system. If omitted or set to false, the method call fails. """ ,
+
dictionaryType = None
+
)
+
attributes = data_model . property (
+
"attributes" , dict ,
+
array = False , optional = True ,
+
documentation = """List of name-value pairs in JSON object format. """ ,
+
dictionaryType = None
+
)
-
:param session_id: [required]
-
:type session_id: int
+
def __init__ ( self ,
+
username ,
+
access ,
+
accept_eula = None ,
+
attributes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param target_name: [required]
-
:type target_name: str
+
[docs] class DeleteAllSupportBundlesResult ( data_model . DataObject ):
+
"""DeleteAllSupportBundlesResult
-
:param target_ip: [required]
-
:type target_ip: str
+
:param duration: [required]
+
:type duration: str
-
:param virtual_network_id: [required]
-
:type virtual_network_id: str
+
:param details: [required]
+
:type details: dict
-
:param volume_id: [required]
-
:type volume_id: int
-
"""
+
:param result: [required]
+
:type result: str
-
account_id = data_model . property (
-
"accountID" , int ,
+
"""
+
duration = data_model . property (
+
"duration" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
account_name = data_model . property (
-
"accountName" , str ,
+
details = data_model . property (
+
"details" , dict ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
drive_id = data_model . property (
-
"driveID" , int ,
+
result = data_model . property (
+
"result" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
initiator_ip = data_model . property (
-
"initiatorIP" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
def __init__ ( self ,
+
duration ,
+
details ,
+
result ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
initiator_name = data_model . property (
-
"initiatorName" , str ,
+
[docs] class CancelGroupCloneRequest ( data_model . DataObject ):
+
"""CancelGroupCloneRequest
+
CancelGroupClone enables you to stop an ongoing CloneMultipleVolumes process occurring on a group of volumes. When you cancel
+
a group clone operation, the system completes and removes the operation's associated asyncHandle.
+
+
:param group_clone_id: [required] The cloneID for the ongoing clone process.
+
:type group_clone_id: int
+
+
"""
+
group_clone_id = data_model . property (
+
"groupCloneID" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """The cloneID for the ongoing clone process. """ ,
+
dictionaryType = None
)
+
def __init__ ( self ,
+
group_clone_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class GetClusterMasterNodeIDResult ( data_model . DataObject ):
+
"""GetClusterMasterNodeIDResult
+
+
:param node_id: [required] ID of the master node.
+
:type node_id: int
+
+
"""
node_id = data_model . property (
"nodeID" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ID of the master node. """ ,
+
dictionaryType = None
)
-
service_id = data_model . property (
-
"serviceID" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
def __init__ ( self ,
+
node_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
session_id = data_model . property (
-
"sessionID" , int ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
[docs] class ListGroupSnapshotsRequest ( data_model . DataObject ):
+
"""ListGroupSnapshotsRequest
+
ListGroupSnapshots enables you to get information about all group snapshots that have been created.
-
target_name = data_model . property (
-
"targetName" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param volumes: An array of unique volume IDs to query. If you do not specify this parameter, all group snapshots on the cluster are included.
+
:type volumes: int
-
target_ip = data_model . property (
-
"targetIP" , str ,
-
array = False , optional = False ,
-
documentation = None
-
)
+
:param group_snapshot_id: Retrieves information for a specific group snapshot ID.
+
:type group_snapshot_id: int
-
virtual_network_id = data_model . property (
-
"virtualNetworkID" , str ,
-
array = False , optional = False ,
-
documentation = None
+
"""
+
volumes = data_model . property (
+
"volumes" , int ,
+
array = True , optional = True ,
+
documentation = """An array of unique volume IDs to query. If you do not specify this parameter, all group snapshots on the cluster are included. """ ,
+
dictionaryType = None
+
)
+
group_snapshot_id = data_model . property (
+
"groupSnapshotID" , int ,
+
array = False , optional = True ,
+
documentation = """Retrieves information for a specific group snapshot ID. """ ,
+
dictionaryType = None
)
-
volume_id = data_model . property (
-
"volumeID" , int ,
-
array = False , optional = False ,
-
documentation = None
+
def __init__ ( self ,
+
volumes = None ,
+
group_snapshot_id = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListAllNodesResult ( data_model . DataObject ):
+
"""ListAllNodesResult
+
+
:param nodes: [required]
+
:type nodes: Node
+
+
:param pending_nodes: [required]
+
:type pending_nodes: PendingNode
+
+
:param pending_active_nodes: List of objects detailing information about all PendingActive nodes in the system.
+
:type pending_active_nodes: PendingActiveNode
+
+
"""
+
nodes = data_model . property (
+
"nodes" , Node ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
pending_nodes = data_model . property (
+
"pendingNodes" , PendingNode ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
pending_active_nodes = data_model . property (
+
"pendingActiveNodes" , PendingActiveNode ,
+
array = True , optional = True ,
+
documentation = """List of objects detailing information about all PendingActive nodes in the system. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
nodes ,
+
pending_nodes ,
+
pending_active_nodes = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class ISCSISession ( data_model . DataObject ):
+
"""ISCSISession
-
[docs] class Node ( data_model . DataObject ):
-
"""
-
A node refers to an individual machine in a cluster.
-
Each active node hosts a master service, which is responsible for managing
-
the drives and other services on its node.
-
After a node is made active, its drives will become available for addition
-
to the cluster.
+
:param drive_ids:
+
:type drive_ids: int
-
:param node_id: [required] The unique identifier for this node.
-
:type node_id: int
+
:param account_id: [required]
+
:type account_id: int
-
:param associated_master_service_id: [required] The master service
-
responsible for controlling other services on this node.
-
:type associated_master_service_id: int
+
:param initiator:
+
:type initiator: Initiator
-
:param associated_fservice_id: [required]
-
:type associated_fservice_id: int
+
:param account_name: [required]
+
:type account_name: str
-
:param fibre_channel_target_port_group: [required]
-
:type fibre_channel_target_port_group: str
+
:param drive_id: [required]
+
:type drive_id: int
-
:param name: [required]
-
:type name: str
+
:param initiator_ip: [required]
+
:type initiator_ip: str
-
:param platform_info: [required] Information about the platform this node
-
is.
-
:type platform_info: Platform
+
:param initiator_port_name: [required]
+
:type initiator_port_name: str
-
:param software_version: [required] The version of SolidFire software this
-
node is currently running.
-
:type software_version: str
+
:param target_port_name: [required]
+
:type target_port_name: str
+
+
:param initiator_name: [required]
+
:type initiator_name: str
+
+
:param node_id: [required]
+
:type node_id: int
+
+
:param service_id: [required]
+
:type service_id: int
+
+
:param session_id: [required]
+
:type session_id: int
-
:param cip: [required] IP address used for both intra- and inter-cluster
-
communication.
-
:type cip: str
+
:param target_name: [required]
+
:type target_name: str
-
:param cipi: [required] The machine's name for the \"cip\" interface.
-
:type cipi: str
+
:param target_ip: [required]
+
:type target_ip: str
-
:param mip: [required] IP address used for cluster management (hosting the
-
API and web site).
-
:type mip: str
+
:param virtual_network_id: [required]
+
:type virtual_network_id: int
-
:param mipi: [required] The machine's name for the \"mip\" interface.
-
:type mipi: str
+
:param volume_id: [required]
+
:type volume_id: int
-
:param sip: [required] IP address used for iSCSI traffic.
-
:type sip: str
+
:param create_time: [required]
+
:type create_time: str
-
:param sipi: [required] The machine's name for the \"sip\" interface.
-
:type sipi: str
+
:param volume_instance: [required]
+
:type volume_instance: int
-
:param uuid: [required] UUID of node.
-
:type uuid: UUID
+
:param initiator_session_id: [required]
+
:type initiator_session_id: int
-
:param attributes: [required]
-
:type attributes: dict
"""
-
-
node_id = data_model . property (
-
"nodeID" , int ,
+
drive_ids = data_model . property (
+
"driveIDs" , int ,
+
array = True , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
account_id = data_model . property (
+
"accountID" , int ,
array = False , optional = False ,
-
documentation = " \
-
The unique identifier for this node. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
associated_master_service_id = data_model . property (
-
"associatedMasterServiceID" , int ,
+
initiator = data_model . property (
+
"initiator" , Initiator ,
+
array = False , optional = True ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
account_name = data_model . property (
+
"accountName" , str ,
array = False , optional = False ,
-
documentation = " \
-
The master service responsible for controlling other services on this \
-
node. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
associated_fservice_id = data_model . property (
-
"associatedFServiceID" , int ,
+
drive_id = data_model . property (
+
"driveID" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
fibre_channel_target_port_group = data_model . property (
-
"fibreChannelTargetPortGroup" , str ,
+
initiator_ip = data_model . property (
+
"initiatorIP" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
name = data_model . property (
-
"name" , str ,
+
initiator_port_name = data_model . property (
+
"initiatorPortName" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
platform_info = data_model . property (
-
"platformInfo" , Platform ,
+
target_port_name = data_model . property (
+
"targetPortName" , str ,
array = False , optional = False ,
-
documentation = " \
-
Information about the platform this node is. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
software_version = data_model . property (
-
"softwareVersion" , str ,
+
initiator_name = data_model . property (
+
"initiatorName" , str ,
array = False , optional = False ,
-
documentation = " \
-
The version of SolidFire software this node is currently running. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
cip = data_model . property (
-
"cip" , str ,
+
node_id = data_model . property (
+
"nodeID" , int ,
array = False , optional = False ,
-
documentation = " \
-
IP address used for both intra- and inter-cluster communication. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
cipi = data_model . property (
-
"cipi" , str ,
+
service_id = data_model . property (
+
"serviceID" , int ,
array = False , optional = False ,
-
documentation = " \
-
The machine's name for the \" cip \" interface. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
mip = data_model . property (
-
"mip" , str ,
+
session_id = data_model . property (
+
"sessionID" , int ,
array = False , optional = False ,
-
documentation = " \
-
IP address used for cluster management (hosting the API and web site). \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
mipi = data_model . property (
-
"mipi" , str ,
+
target_name = data_model . property (
+
"targetName" , str ,
array = False , optional = False ,
-
documentation = " \
-
The machine's name for the \" mip \" interface. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
sip = data_model . property (
-
"sip" , str ,
+
target_ip = data_model . property (
+
"targetIP" , str ,
array = False , optional = False ,
-
documentation = " \
-
IP address used for iSCSI traffic. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
sipi = data_model . property (
-
"sipi" , str ,
+
virtual_network_id = data_model . property (
+
"virtualNetworkID" , int ,
array = False , optional = False ,
-
documentation = " \
-
The machine's name for the \" sip \" interface. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
uuid = data_model . property (
-
"uuid" , UUID ,
+
volume_id = data_model . property (
+
"volumeID" , int ,
array = False , optional = False ,
-
documentation = " \
-
UUID of node. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
attributes = data_model . property (
-
"attributes" , dict ,
+
create_time = data_model . property (
+
"createTime" , str ,
array = False , optional = False ,
-
documentation = None
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
volume_instance = data_model . property (
+
"volumeInstance" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
initiator_session_id = data_model . property (
+
"initiatorSessionID" , int ,
+
array = False , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
+
)
+
+
def __init__ ( self ,
+
account_id ,
+
account_name ,
+
drive_id ,
+
initiator_ip ,
+
initiator_port_name ,
+
target_port_name ,
+
initiator_name ,
+
node_id ,
+
service_id ,
+
session_id ,
+
target_name ,
+
target_ip ,
+
virtual_network_id ,
+
volume_id ,
+
create_time ,
+
volume_instance ,
+
initiator_session_id ,
+
drive_ids = None ,
+
initiator = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class ListISCSISessionsResult ( data_model . DataObject ):
+
"""ListISCSISessionsResult
+
+
:param sessions: [required]
+
:type sessions: ISCSISession
+
+
"""
+
sessions = data_model . property (
+
"sessions" , ISCSISession ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
sessions ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
[docs] class GetAsyncResultRequest ( data_model . DataObject ):
+
"""GetAsyncResultRequest
+
You can use GetAsyncResult to retrieve the result of asynchronous method calls. Some method calls require some time to run, and
+
might not be finished when the system sends the initial response. To obtain the status or result of the method call, use
+
GetAsyncResult to poll the asyncHandle value returned by the method.
+
GetAsyncResult returns the overall status of the operation (in progress, completed, or error) in a standard fashion, but the actual
+
data returned for the operation depends on the original method call and the return data is documented with each method.
-
[docs] class Config ( data_model . DataObject ):
-
"""
+
:param async_handle: [required] A value that was returned from the original asynchronous method call.
+
:type async_handle: int
-
:param cluster: [required]
-
:type cluster: ClusterConfig
+
:param keep_result: If true, GetAsyncResult does not remove the asynchronous result upon returning it, enabling future queries to that asyncHandle.
+
:type keep_result: bool
-
:param network: [required]
-
:type network: Network
"""
-
-
cluster = data_model . property (
-
"cluster" , ClusterConfig ,
+
async_handle = data_model . property (
+
"asyncHandle" , int ,
array = False , optional = False ,
-
documentation = None
+
documentation = """A value that was returned from the original asynchronous method call. """ ,
+
dictionaryType = None
)
-
-
network = data_model . property (
-
"network" , Network ,
-
array = False , optional = False ,
-
documentation = None
+
keep_result = data_model . property (
+
"keepResult" , bool ,
+
array = False , optional = True ,
+
documentation = """If true, GetAsyncResult does not remove the asynchronous result upon returning it, enabling future queries to that asyncHandle. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
-
-
-
[docs] class Volume ( data_model . DataObject ):
-
"""
-
Volumes Info is an object containing information about a volume.
-
The return objects only include \"configured\" information about the volume
-
and not runtime or usage information.
-
Information about paired volumes will also be returned.
-
-
:param volume_id: [required] Unique *volume_id* for the volume.
-
:type volume_id: int
+
def __init__ ( self ,
+
async_handle ,
+
keep_result = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param name: [required] Name of the volume as provided at creation time.
-
:type name: str
+
[docs] class TestConnectMvipDetails ( data_model . DataObject ):
+
"""TestConnectMvipDetails
-
:param account_id: [required] Unique *account_id* for the account.
-
:type account_id: int
+
:param ping_bytes: [required] Details of the ping tests with 56 Bytes and 1500 Bytes.
+
:type ping_bytes: dict
-
:param create_time: [required] UTC formatted time the volume was created.
-
:type create_time: str
+
:param mvip: [required] The MVIP tested against.
+
:type mvip: str
-
:param status: [required] Current status of the volume init: A volume that
-
is being initialized and is not ready for connections. active: An
-
active volume ready for connections.
-
:type status: str
+
:param connected: [required] Whether the test could connect to the MVIP.
+
:type connected: bool
-
:param access: [required] Access allowed for the volume
+
"""
+
ping_bytes = data_model . property (
+
"pingBytes" , dict ,
+
array = False , optional = False ,
+
documentation = """Details of the ping tests with 56 Bytes and 1500 Bytes. """ ,
+
dictionaryType = None
+
)
+
mvip = data_model . property (
+
"mvip" , str ,
+
array = False , optional = False ,
+
documentation = """The MVIP tested against. """ ,
+
dictionaryType = None
+
)
+
connected = data_model . property (
+
"connected" , bool ,
+
array = False , optional = False ,
+
documentation = """Whether the test could connect to the MVIP. """ ,
+
dictionaryType = None
+
)
-
**readOnly**: Only read operations are allowed.
+
def __init__ ( self ,
+
ping_bytes ,
+
mvip ,
+
connected ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
**readWrite**: Reads and writes are allowed.
+
[docs] class TestConnectMvipResult ( data_model . DataObject ):
+
"""TestConnectMvipResult
-
**locked**: No reads or writes are allowed.
+
:param details: [required] Information about the test operation
+
:type details: TestConnectMvipDetails
-
**replicationTarget**: Designated as a target volume in a replicated
-
volume pair.
+
:param duration: [required] The length of time required to run the test.
+
:type duration: str
-
:type access: str
+
:param result: [required] The results of the entire test
+
:type result: str
-
:param enable512e: [required] If \"true\", the volume provides 512 byte
-
sector emulation.
-
:type enable512e: bool
+
"""
+
details = data_model . property (
+
"details" , TestConnectMvipDetails ,
+
array = False , optional = False ,
+
documentation = """Information about the test operation """ ,
+
dictionaryType = None
+
)
+
duration = data_model . property (
+
"duration" , str ,
+
array = False , optional = False ,
+
documentation = """The length of time required to run the test. """ ,
+
dictionaryType = None
+
)
+
result = data_model . property (
+
"result" , str ,
+
array = False , optional = False ,
+
documentation = """The results of the entire test """ ,
+
dictionaryType = None
+
)
-
:param iqn: [required] Volume iSCSI Qualified Name.
-
:type iqn: str
+
def __init__ ( self ,
+
details ,
+
duration ,
+
result ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param scsi_euidevice_id: [required] Globally unique SCSI device identifier
-
for the volume in EUI-64 based 16-byte format.
-
:type scsi_euidevice_id: str
+
[docs] class ListVolumeAccessGroupsResult ( data_model . DataObject ):
+
"""ListVolumeAccessGroupsResult
-
:param scsi_naadevice_id: [required] Globally unique SCSI device identifier
-
for the volume in NAA IEEE Registered Extended format.
-
:type scsi_naadevice_id: str
+
:param volume_access_groups: [required] A list of objects describing each volume access group.
+
:type volume_access_groups: VolumeAccessGroup
-
:param qos: [required] Quality of service settings for this volume.
-
:type qos: VolumeQOS
+
:param volume_access_groups_not_found: A list of volume access groups not found by the system. Present if you used the "volumeAccessGroups" parameter and the system was unable to find one or more volume access groups that you specified.
+
:type volume_access_groups_not_found: int
-
:param volume_access_groups: [required] List of volume access groups to
-
which a volume belongs.
-
:type volume_access_groups: int[]
+
"""
+
volume_access_groups = data_model . property (
+
"volumeAccessGroups" , VolumeAccessGroup ,
+
array = True , optional = False ,
+
documentation = """A list of objects describing each volume access group. """ ,
+
dictionaryType = None
+
)
+
volume_access_groups_not_found = data_model . property (
+
"volumeAccessGroupsNotFound" , int ,
+
array = True , optional = True ,
+
documentation = """A list of volume access groups not found by the system. Present if you used the "volumeAccessGroups" parameter and the system was unable to find one or more volume access groups that you specified. """ ,
+
dictionaryType = None
+
)
-
:param volume_pairs: [required] Information about a paired volume.
-
Available only if a volume is paired. @see *volume_pairs* for return
-
values.
-
:type volume_pairs: VolumePair[]
+
def __init__ ( self ,
+
volume_access_groups ,
+
volume_access_groups_not_found = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param slice_count: [required] The number of slices backing this volume. In
-
the current software, this value will always be 1.
-
:type slice_count: int
+
[docs] class ModifyScheduleRequest ( data_model . DataObject ):
+
"""ModifyScheduleRequest
+
ModifySchedule enables you to change the intervals at which a scheduled snapshot occurs. This allows for adjustment to the snapshot frequency and retention.
-
:param total_size: [required] Total size of this volume in bytes.
-
:type total_size: int
+
:param schedule: [required] The "Schedule" object will be used to modify an existing schedule. The ScheduleID property is required. Frequency property must be of type that inherits from Frequency. Valid types are: DaysOfMonthFrequency DaysOrWeekFrequency TimeIntervalFrequency
+
:type schedule: Schedule
-
:param block_size: [required] Size of the blocks on the volume.
-
:type block_size: int
+
"""
+
schedule = data_model . property (
+
"schedule" , Schedule ,
+
array = False , optional = False ,
+
documentation = """The "Schedule" object will be used to modify an existing schedule. The ScheduleID property is required. Frequency property must be of type that inherits from Frequency. Valid types are: DaysOfMonthFrequency DaysOrWeekFrequency TimeIntervalFrequency """ ,
+
dictionaryType = None
+
)
-
:param virtual_volume_id: [required] Virtual volume ID this volume backs.
-
:type virtual_volume_id: UUID
+
def __init__ ( self ,
+
schedule ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
:param attributes: [required] List of Name/Value pairs in JSON object
-
format.
-
:type attributes: dict
+
[docs] class AsyncHandleResult ( data_model . DataObject ):
+
"""AsyncHandleResult
-
:param delete_time: (optional) The time this volume was deleted. If this
-
has no value, the volume has not yet been deleted.
-
:type delete_time: str
+
:param async_handle: [required]
+
:type async_handle: int
-
:param purge_time: (optional) The time this volume will be purged from the
-
system. If this has no value, the volume has not yet been deleted (and
-
is not scheduled for purging).
-
:type purge_time: str
"""
-
-
volume_id = data_model . property (
-
"volumeID" , int ,
+
async_handle = data_model . property (
+
"asyncHandle" , int ,
array = False , optional = False ,
-
documentation = " \
-
Unique *volume_id* for the volume. \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
name = data_model . property (
-
"name" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Name of the volume as provided at creation time. \
-
"
-
)
+
def __init__ ( self ,
+
async_handle ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
account_id = data_model . property (
-
"accountID" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Unique *account_id* for the account. \
-
"
-
)
+
[docs] class GetScheduleRequest ( data_model . DataObject ):
+
"""GetScheduleRequest
+
You can use the GetSchedule method to retrieve information about a scheduled snapshot. You can see information about a specific
+
schedule if there are many snapshot schedules in the system. You also retrieve information about more than one schedule with this
+
method by specifying additional scheduleIDs in the parameter.
-
create_time = data_model . property (
-
"createTime" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
UTC formatted time the volume was created. \
-
"
-
)
+
:param schedule_id: [required] Specifies the unique ID of the schedule or multiple schedules to display.
+
:type schedule_id: int
-
status = data_model . property (
-
"status" , str ,
+
"""
+
schedule_id = data_model . property (
+
"scheduleID" , int ,
array = False , optional = False ,
-
documentation = " \
-
Current status of the volume \
-
init: A volume that is being initialized and is not ready for \
-
connections. \
-
active: An active volume ready for connections. \
-
"
+
documentation = """Specifies the unique ID of the schedule or multiple schedules to display. """ ,
+
dictionaryType = None
)
-
access = data_model . property (
-
"access" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Access allowed for the volume \
-
\
-
\
-
**readOnly**: Only read operations are allowed. \
-
\
-
\
-
\
-
**readWrite**: Reads and writes are allowed. \
-
\
-
\
-
\
-
**locked**: No reads or writes are allowed. \
-
\
-
\
-
\
-
**replicationTarget**: Designated as a target volume in a \
-
replicated volume pair. \
-
\
-
"
-
)
+
def __init__ ( self ,
+
schedule_id ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
enable512e = data_model . property (
-
"enable512e" , bool ,
-
array = False , optional = False ,
-
documentation = " \
-
If \" true \" , the volume provides 512 byte sector emulation. \
-
"
-
)
+
[docs] class ListActiveNodesResult ( data_model . DataObject ):
+
"""ListActiveNodesResult
-
iqn = data_model . property (
-
"iqn" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Volume iSCSI Qualified Name. \
-
"
-
)
+
:param nodes: [required]
+
:type nodes: Node
-
scsi_euidevice_id = data_model . property (
-
"scsiEUIDeviceID" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Globally unique SCSI device identifier for the volume in EUI-64 based \
-
16-byte format. \
-
"
+
"""
+
nodes = data_model . property (
+
"nodes" , Node ,
+
array = True , optional = False ,
+
documentation = """ """ ,
+
dictionaryType = None
)
-
scsi_naadevice_id = data_model . property (
-
"scsiNAADeviceID" , str ,
-
array = False , optional = False ,
-
documentation = " \
-
Globally unique SCSI device identifier for the volume in NAA IEEE \
-
Registered Extended format. \
-
"
-
)
+
def __init__ ( self ,
+
nodes ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
qos = data_model . property (
-
"qos" , VolumeQOS ,
-
array = False , optional = False ,
-
documentation = " \
-
Quality of service settings for this volume. \
-
"
-
)
+
[docs] class CreateVolumeResult ( data_model . DataObject ):
+
"""CreateVolumeResult
-
volume_access_groups = data_model . property (
-
"volumeAccessGroups" , int ,
-
array = True , optional = False ,
-
documentation = " \
-
List of volume access groups to which a volume belongs. \
-
"
-
)
+
:param volume:
+
:type volume: Volume
-
volume_pairs = data_model . property (
-
"volumePairs" , VolumePair ,
-
array = True , optional = False ,
-
documentation = " \
-
Information about a paired volume. \
-
Available only if a volume is paired. \
-
@see *volume_pairs* for return values. \
-
"
-
)
+
:param volume_id: [required] VolumeID for the newly created volume.
+
:type volume_id: int
-
delete_time = data_model . property (
-
"deleteTime" , str ,
-
array = False , optional = True ,
-
documentation = " \
-
The time this volume was deleted. \
-
If this has no value, the volume has not yet been deleted. \
-
"
-
)
+
:param curve: [required] The curve is a set of key-value pairs. The keys are I/O sizes in bytes. The values represent the cost performing an IOP at a specific I/O size. The curve is calculated relative to a 4096 byte operation set at 100 IOPS.
+
:type curve: dict
-
purge_time = data_model . property (
-
"purgeTime" , str ,
+
"""
+
volume = data_model . property (
+
"volume" , Volume ,
array = False , optional = True ,
-
documentation = " \
-
The time this volume will be purged from the system. \
-
If this has no value, the volume has not yet been deleted (and is not \
-
scheduled for purging). \
-
"
+
documentation = """ """ ,
+
dictionaryType = None
)
-
-
slice_count = data_model . property (
-
"sliceCount" , int ,
+
volume_id = data_model . property (
+
"volumeID" , int ,
array = False , optional = False ,
-
documentation = " \
-
The number of slices backing this volume. \
-
In the current software, this value will always be 1. \
-
"
+
documentation = """VolumeID for the newly created volume. """ ,
+
dictionaryType = None
)
-
-
total_size = data_model . property (
-
"totalSize" , int ,
+
curve = data_model . property (
+
"curve" , dict ,
array = False , optional = False ,
-
documentation = " \
-
Total size of this volume in bytes. \
-
"
+
documentation = """The curve is a set of key-value pairs. The keys are I/O sizes in bytes. The values represent the cost performing an IOP at a specific I/O size. The curve is calculated relative to a 4096 byte operation set at 100 IOPS. """ ,
+
dictionaryType = int
)
-
block_size = data_model . property (
-
"blockSize" , int ,
-
array = False , optional = False ,
-
documentation = " \
-
Size of the blocks on the volume. \
-
"
-
)
+
def __init__ ( self ,
+
volume_id ,
+
curve ,
+
volume = None ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
-
virtual_volume_id = data_model . property (
-
"virtualVolumeID" , UUID ,
-
array = False , optional = False ,
-
documentation = " \
-
Virtual volume ID this volume backs. \
-
"
+
[docs] class GetRemoteLoggingHostsResult ( data_model . DataObject ):
+
"""GetRemoteLoggingHostsResult
+
+
:param remote_hosts: [required] List of hosts to forward logging information to.
+
:type remote_hosts: LoggingServer
+
+
"""
+
remote_hosts = data_model . property (
+
"remoteHosts" , LoggingServer ,
+
array = True , optional = False ,
+
documentation = """List of hosts to forward logging information to. """ ,
+
dictionaryType = None
)
-
attributes = data_model . property (
-
"attributes" , dict ,
+
def __init__ ( self ,
+
remote_hosts ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
[docs] class EnableFeatureRequest ( data_model . DataObject ):
+
"""EnableFeatureRequest
+
You can use EnableFeature to enable cluster features that are disabled by default.
+
+
:param feature: [required] Indicates which feature to enable. Valid value is: vvols: Enable the NetApp SolidFire VVols cluster feature.
+
:type feature: str
+
+
"""
+
feature = data_model . property (
+
"feature" , str ,
array = False , optional = False ,
-
documentation = " \
-
List of Name/Value pairs in JSON object format. \
-
"
+
documentation = """Indicates which feature to enable. Valid value is: vvols: Enable the NetApp SolidFire VVols cluster feature. """ ,
+
dictionaryType = None
)
-
def __init__ ( self , ** kwargs ):
-
data_model . DataObject . __init__ ( self , ** kwargs )
+
def __init__ ( self ,
+
feature ):
+
kwargs = locals ()
+
del kwargs [ "self" ]
+
data_model . DataObject . __init__ ( self , ** kwargs )
+
+
+
@@ -6664,10 +20122,11 @@ Source code for solidfire.models
diff --git a/docs/_build/html/_modules/solidfire/util.html b/docs/_build/html/_modules/solidfire/util.html
index 23dee9b3..08b9404c 100644
--- a/docs/_build/html/_modules/solidfire/util.html
+++ b/docs/_build/html/_modules/solidfire/util.html
@@ -8,13 +8,15 @@
- solidfire.util — SolidFire Python SDK v1.1.0.91
+ solidfire.util — SolidFire Python SDK v1.4.0.271
+
+
@@ -34,7 +36,10 @@
-
+
+
+
@@ -44,6 +49,7 @@
+
@@ -66,7 +72,7 @@
- 1.1.0.91
+ 1.4.0.271
@@ -87,8 +93,11 @@
-
- SolidFire Python SDK
+
+
+
+
+ SolidFire Python SDK v1.2
Account Management Examples
Snapshot Scheduling Examples
solidfire package
@@ -104,8 +113,10 @@
-
- solidfire-sdk-python
+
+
+ solidfire-sdk-python
+
@@ -118,21 +129,38 @@
+
+
+
+
+
+
+
+
+
+
@@ -158,20 +186,40 @@
Source code for solidfire.util
"""
art = " \n "
- art += " \n "
- art += " ______________ ___ \n "
- art += " /__/__\__\__\__\ ___/__/ \n "
- art += " /_ /__/_\__\__\__\ ___/__/__/ \n "
- art += " /__/__/__/\__\__\__\/__/__/__/ \n "
- art += " /__/__/__/ \__\__\__\_/__/__/ \n "
- art += " /__/__/ \__\__\__\__/__/ \n "
- art += " /__/ \__\__\__\/__/ \n "
- art += " \n "
- art += " NetApp SolidFire Version {0} \n " . format ( version )
+ art += " \n "
+ art += " 77 \n "
+ art += " 7777 \n "
+ art += " 77 \n "
+ art += " == \n "
+ art += " 77IIIIIIIIIIIIIIIIII777 \n "
+ art += " =7 7= \n "
+ art += " 7 7 \n "
+ art += " =7 7= \n "
+ art += " =7 7= \n "
+ art += " =77 7777777777777777777 77= \n "
+ art += " 7777 777777777777777777777 7777 \n "
+ art += " 7777 7777777777777777777 7777 \n "
+ art += " =77 77= \n "
+ art += " =7 7= \n "
+ art += " 7 7 \n "
+ art += " 7= =7 \n "
+ art += " 77= =77 \n "
+ art += " =7777777777777777777= \n "
+ art += " \n "
+ art += " ====IIIIIIIIII===== \n "
+ art += " =77777= =77777= \n "
+ art += " =777= =777= \n "
+ art += " =777= =777= \n "
+ art += " \n "
+ art += " NetApp SolidFire Version {0} " \
+ " \n " . format ( version )
art += " \n "
return art
+
+
+
@@ -203,10 +251,11 @@ Source code for solidfire.util
diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt
new file mode 100644
index 00000000..c470cfc4
--- /dev/null
+++ b/docs/_build/html/_sources/index.rst.txt
@@ -0,0 +1,23 @@
+.. solidfire documentation master file, created by
+ sphinx-quickstart on Tue Feb 23 10:19:03 2016.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Welcome to solidfire's documentation!
+=====================================
+
+Contents:
+
+.. toctree::
+ :maxdepth: 4
+
+ solidfire
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
diff --git a/docs/_build/html/_sources/modules.rst.txt b/docs/_build/html/_sources/modules.rst.txt
new file mode 100644
index 00000000..2f2a2acb
--- /dev/null
+++ b/docs/_build/html/_sources/modules.rst.txt
@@ -0,0 +1,7 @@
+solidfire
+=========
+
+.. toctree::
+ :maxdepth: 2
+
+ solidfire
diff --git a/docs/_build/html/_sources/solidfire.adaptor.rst.txt b/docs/_build/html/_sources/solidfire.adaptor.rst.txt
new file mode 100644
index 00000000..e4065f4c
--- /dev/null
+++ b/docs/_build/html/_sources/solidfire.adaptor.rst.txt
@@ -0,0 +1,22 @@
+solidfire.adaptor package
+=========================
+
+Submodules
+----------
+
+solidfire.adaptor.schedule_adaptor module
+-----------------------------------------
+
+.. automodule:: solidfire.adaptor.schedule_adaptor
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+
+Module contents
+---------------
+
+.. automodule:: solidfire.adaptor
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/_build/html/_sources/solidfire.apiactual.rst.txt b/docs/_build/html/_sources/solidfire.apiactual.rst.txt
new file mode 100644
index 00000000..64ab0210
--- /dev/null
+++ b/docs/_build/html/_sources/solidfire.apiactual.rst.txt
@@ -0,0 +1,10 @@
+solidfire.apiactual package
+===========================
+
+Module contents
+---------------
+
+.. automodule:: solidfire.apiactual
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/_build/html/_sources/solidfire.common.rst.txt b/docs/_build/html/_sources/solidfire.common.rst.txt
new file mode 100644
index 00000000..6f18abea
--- /dev/null
+++ b/docs/_build/html/_sources/solidfire.common.rst.txt
@@ -0,0 +1,22 @@
+solidfire.common package
+========================
+
+Submodules
+----------
+
+solidfire.common.model module
+-----------------------------
+
+.. automodule:: solidfire.common.model
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+
+Module contents
+---------------
+
+.. automodule:: solidfire.common
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/_build/html/_sources/solidfire.custom.rst.txt b/docs/_build/html/_sources/solidfire.custom.rst.txt
new file mode 100644
index 00000000..341f8466
--- /dev/null
+++ b/docs/_build/html/_sources/solidfire.custom.rst.txt
@@ -0,0 +1,10 @@
+solidfire.custom package
+========================
+
+Module contents
+---------------
+
+.. automodule:: solidfire.custom
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/_build/html/_sources/solidfire.rst.txt b/docs/_build/html/_sources/solidfire.rst.txt
new file mode 100644
index 00000000..ecda4fa4
--- /dev/null
+++ b/docs/_build/html/_sources/solidfire.rst.txt
@@ -0,0 +1,57 @@
+.. toctree::
+
+.. include:: ../README.rst
+
+.. include:: ../examples/manage_accounts.rst
+
+.. include:: ../examples/snapshot_scheduling.rst
+
+solidfire package
+=================
+
+Subpackages
+-----------
+
+.. toctree::
+
+ solidfire.adaptor
+ solidfire.apiactual
+ solidfire.common
+ solidfire.custom
+ solidfire.util
+
+Submodules
+----------
+
+solidfire.factory module
+------------------------
+
+.. automodule:: solidfire.factory
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+solidfire.models module
+-----------------------
+
+.. automodule:: solidfire.models
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+solidfire.results module
+------------------------
+
+.. automodule:: solidfire.results
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+
+Module contents
+---------------
+
+.. automodule:: solidfire
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/_build/html/_sources/solidfire.util.rst.txt b/docs/_build/html/_sources/solidfire.util.rst.txt
new file mode 100644
index 00000000..835ec097
--- /dev/null
+++ b/docs/_build/html/_sources/solidfire.util.rst.txt
@@ -0,0 +1,10 @@
+solidfire.util package
+======================
+
+Module contents
+---------------
+
+.. automodule:: solidfire.util
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css
index c89fc7e9..dc88b5a2 100644
--- a/docs/_build/html/_static/basic.css
+++ b/docs/_build/html/_static/basic.css
@@ -4,7 +4,7 @@
*
* Sphinx stylesheet -- basic theme.
*
- * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@@ -52,6 +52,8 @@ div.sphinxsidebar {
width: 230px;
margin-left: -100%;
font-size: 90%;
+ word-wrap: break-word;
+ overflow-wrap : break-word;
}
div.sphinxsidebar ul {
@@ -83,10 +85,6 @@ div.sphinxsidebar #searchbox input[type="text"] {
width: 170px;
}
-div.sphinxsidebar #searchbox input[type="submit"] {
- width: 30px;
-}
-
img {
border: 0;
max-width: 100%;
@@ -124,6 +122,8 @@ ul.keywordmatches li.goodmatch a {
table.contentstable {
width: 90%;
+ margin-left: auto;
+ margin-right: auto;
}
table.contentstable p.biglink {
@@ -151,9 +151,14 @@ table.indextable td {
vertical-align: top;
}
-table.indextable dl, table.indextable dd {
+table.indextable ul {
margin-top: 0;
margin-bottom: 0;
+ list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+ padding-left: 0em;
}
table.indextable tr.pcap {
@@ -185,8 +190,22 @@ div.genindex-jumpbox {
padding: 0.4em;
}
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+ padding: 2px;
+ border-collapse: collapse;
+}
+
/* -- general body styles --------------------------------------------------- */
+div.body p, div.body dd, div.body li, div.body blockquote {
+ -moz-hyphens: auto;
+ -ms-hyphens: auto;
+ -webkit-hyphens: auto;
+ hyphens: auto;
+}
+
a.headerlink {
visibility: hidden;
}
@@ -212,10 +231,6 @@ div.body td {
text-align: left;
}
-.field-list ul {
- padding-left: 1em;
-}
-
.first {
margin-top: 0 !important;
}
@@ -332,10 +347,6 @@ table.docutils td, table.docutils th {
border-bottom: 1px solid #aaa;
}
-table.field-list td, table.field-list th {
- border: 0 !important;
-}
-
table.footnote td, table.footnote th {
border: 0 !important;
}
@@ -372,6 +383,20 @@ div.figure p.caption span.caption-number {
div.figure p.caption span.caption-text {
}
+/* -- field list styles ----------------------------------------------------- */
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
/* -- other body styles ----------------------------------------------------- */
@@ -422,15 +447,6 @@ dl.glossary dt {
font-size: 1.1em;
}
-.field-list ul {
- margin: 0;
- padding-left: 1em;
-}
-
-.field-list p {
- margin: 0;
-}
-
.optional {
font-size: 1.3em;
}
@@ -489,6 +505,13 @@ pre {
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
+span.pre {
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ -webkit-hyphens: none;
+ hyphens: none;
+}
+
td.linenos pre {
padding: 5px 0px;
border: 0;
@@ -580,6 +603,16 @@ span.eqno {
float: right;
}
+span.eqno a.headerlink {
+ position: relative;
+ left: 0px;
+ z-index: 1;
+}
+
+div.math:hover a.headerlink {
+ visibility: visible;
+}
+
/* -- printout stylesheet --------------------------------------------------- */
@media print {
diff --git a/docs/_build/html/_static/comment-bright.png b/docs/_build/html/_static/comment-bright.png
index 551517b8..15e27edb 100644
Binary files a/docs/_build/html/_static/comment-bright.png and b/docs/_build/html/_static/comment-bright.png differ
diff --git a/docs/_build/html/_static/comment-close.png b/docs/_build/html/_static/comment-close.png
index 09b54be4..4d91bcf5 100644
Binary files a/docs/_build/html/_static/comment-close.png and b/docs/_build/html/_static/comment-close.png differ
diff --git a/docs/_build/html/_static/comment.png b/docs/_build/html/_static/comment.png
index 92feb52b..dfbc0cbd 100644
Binary files a/docs/_build/html/_static/comment.png and b/docs/_build/html/_static/comment.png differ
diff --git a/docs/_build/html/_static/css/badge_only.css b/docs/_build/html/_static/css/badge_only.css
index 7e17fb14..6362912b 100644
--- a/docs/_build/html/_static/css/badge_only.css
+++ b/docs/_build/html/_static/css/badge_only.css
@@ -1,2 +1,2 @@
-.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:0.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}
+.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:0.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}
/*# sourceMappingURL=badge_only.css.map */
diff --git a/docs/_build/html/_static/css/theme.css b/docs/_build/html/_static/css/theme.css
index 7be93399..c1631d84 100644
--- a/docs/_build/html/_static/css/theme.css
+++ b/docs/_build/html/_static/css/theme.css
@@ -1,5 +1,5 @@
*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,.rst-content code,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:0.2em 0;background:#ccc;color:#000;padding:0.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,.rst-content .toctree-wrapper p.caption,h3{orphans:3;widows:3}h2,.rst-content .toctree-wrapper p.caption,h3{page-break-after:avoid}}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*!
- * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.2.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.2.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.2.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.wy-menu-vertical li span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.rst-content code.download span.pull-left:first-child,.pull-left.icon{margin-right:.3em}.fa.pull-right,.wy-menu-vertical li span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.rst-content code.download span.pull-right:first-child,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .rst-content p.caption .headerlink,.rst-content p.caption a .headerlink,a .rst-content tt.download span:first-child,.rst-content tt.download a span:first-child,a .rst-content code.download span:first-child,.rst-content code.download a span:first-child,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .btn span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.btn .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .rst-content p.caption .headerlink,.rst-content p.caption .btn .headerlink,.btn .rst-content tt.download span:first-child,.rst-content tt.download .btn span:first-child,.btn .rst-content code.download span:first-child,.rst-content code.download .btn span:first-child,.btn .icon,.nav .fa,.nav .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand,.nav .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .rst-content p.caption .headerlink,.rst-content p.caption .nav .headerlink,.nav .rst-content tt.download span:first-child,.rst-content tt.download .nav span:first-child,.nav .rst-content code.download span:first-child,.rst-content code.download .nav span:first-child,.nav .icon{display:inline}.btn .fa.fa-large,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .btn span.fa-large:first-child,.btn .rst-content code.download span.fa-large:first-child,.rst-content code.download .btn span.fa-large:first-child,.btn .fa-large.icon,.nav .fa.fa-large,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.nav .rst-content code.download span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.nav .fa-large.icon{line-height:0.9em}.btn .fa.fa-spin,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .btn span.fa-spin:first-child,.btn .rst-content code.download span.fa-spin:first-child,.rst-content code.download .btn span.fa-spin:first-child,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.nav .rst-content code.download span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.wy-menu-vertical li span.btn.toctree-expand:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.rst-content code.download span.btn:first-child:before,.btn.icon:before{opacity:0.5;-webkit-transition:opacity 0.05s ease-in;-moz-transition:opacity 0.05s ease-in;transition:opacity 0.05s ease-in}.btn.fa:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.rst-content code.download span.btn:first-child:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.rst-content tt.download .btn-mini span:first-child:before,.btn-mini .rst-content code.download span:first-child:before,.rst-content code.download .btn-mini span:first-child:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a{color:#2980B9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all 0.3s ease-in;-moz-transition:all 0.3s ease-in;transition:all 0.3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27AE60}.wy-tray-container li.wy-tray-item-info{background:#2980B9}.wy-tray-container li.wy-tray-item-warning{background:#E67E22}.wy-tray-container li.wy-tray-item-danger{background:#E74C3C}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27AE60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all 0.1s linear;-moz-transition:all 0.1s linear;transition:all 0.1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980B9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27AE60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#E74C3C !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#E67E22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980B9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9B59B6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980B9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980B9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 0.3125em 0;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#E74C3C}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{float:left;display:block;margin-right:2.35765%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:0.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:0.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}input[type="datetime-local"]{padding:0.34375em 0.625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:0.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129FEA}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#E74C3C;border:1px solid #E74C3C}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#E74C3C}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#E74C3C}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif}select,textarea{padding:0.5em 0.625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type="radio"][disabled],input[type="checkbox"][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{width:36px;height:12px;margin:12px 0;position:relative;border-radius:4px;background:#ccc;cursor:pointer;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.wy-switch:before{position:absolute;content:"";display:block;width:18px;height:18px;border-radius:4px;background:#999;left:-3px;top:-3px;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.wy-switch:after{content:"false";position:absolute;left:48px;display:block;font-size:12px;color:#ccc}.wy-switch.active{background:#1e8449}.wy-switch.active:before{left:24px;background:#27AE60}.wy-switch.active:after{content:"true"}.wy-switch.disabled,.wy-switch.active.disabled{cursor:not-allowed}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#E74C3C}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #E74C3C}.wy-control-group.wy-control-group-error textarea{border:solid 1px #E74C3C}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:0.5em 0.625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27AE60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#E74C3C}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#E67E22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980B9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:0.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0.3em;display:block}.wy-form label{margin-bottom:0.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:0.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px}.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980B9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9B59B6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#E67E22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980B9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27AE60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#E74C3C !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,.rst-content .toctree-wrapper p.caption,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2,.rst-content .toctree-wrapper p.caption{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}code,.rst-content tt,.rst-content code{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;color:#E74C3C;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{margin-bottom:0}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{margin-bottom:0}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{list-style:disc}.codeblock-example{border:1px solid #e1e4e5;border-bottom:none;padding:24px;padding-top:48px;font-weight:500;background:#fff;position:relative}.codeblock-example:after{content:"Example";position:absolute;top:0px;left:0px;background:#9B59B6;color:#fff;padding:6px 12px}.codeblock-example.prettyprint-example-only{border:1px solid #e1e4e5;margin-bottom:24px}.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight']{border:1px solid #e1e4e5;padding:0px;overflow-x:auto;background:#fff;margin:1px 0 24px 0}.codeblock div[class^='highlight'],pre.literal-block div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{border:none;background:none;margin:0}div[class^='highlight'] td.code{width:100%}.linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:12px;line-height:1.5;color:#d9d9d9}div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:12px;line-height:1.5;display:block;overflow:auto;color:#404040}@media print{.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'],div[class^='highlight'] pre{white-space:pre-wrap}}.hll{background-color:#ffc;margin:0 -12px;padding:0 12px;display:block}.c{color:#998;font-style:italic}.err{color:#a61717;background-color:#e3d2d2}.k{font-weight:bold}.o{font-weight:bold}.cm{color:#998;font-style:italic}.cp{color:#999;font-weight:bold}.c1{color:#998;font-style:italic}.cs{color:#999;font-weight:bold;font-style:italic}.gd{color:#000;background-color:#fdd}.gd .x{color:#000;background-color:#faa}.ge{font-style:italic}.gr{color:#a00}.gh{color:#999}.gi{color:#000;background-color:#dfd}.gi .x{color:#000;background-color:#afa}.go{color:#888}.gp{color:#555}.gs{font-weight:bold}.gu{color:purple;font-weight:bold}.gt{color:#a00}.kc{font-weight:bold}.kd{font-weight:bold}.kn{font-weight:bold}.kp{font-weight:bold}.kr{font-weight:bold}.kt{color:#458;font-weight:bold}.m{color:#099}.s{color:#d14}.n{color:#333}.na{color:teal}.nb{color:#0086b3}.nc{color:#458;font-weight:bold}.no{color:teal}.ni{color:purple}.ne{color:#900;font-weight:bold}.nf{color:#900;font-weight:bold}.nn{color:#555}.nt{color:navy}.nv{color:teal}.ow{font-weight:bold}.w{color:#bbb}.mf{color:#099}.mh{color:#099}.mi{color:#099}.mo{color:#099}.sb{color:#d14}.sc{color:#d14}.sd{color:#d14}.s2{color:#d14}.se{color:#d14}.sh{color:#d14}.si{color:#d14}.sx{color:#d14}.sr{color:#009926}.s1{color:#d14}.ss{color:#990073}.bp{color:#999}.vc{color:teal}.vg{color:teal}.vi{color:teal}.il{color:#099}.gc{color:#999;background-color:#EAF2F5}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs li code,.wy-breadcrumbs li .rst-content tt,.rst-content .wy-breadcrumbs li tt{padding:5px;border:none;background:none}.wy-breadcrumbs li code.literal,.wy-breadcrumbs li .rst-content tt.literal,.rst-content .wy-breadcrumbs li tt.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{height:32px;display:inline-block;line-height:32px;padding:0 1.618em;margin-bottom:0;display:block;font-weight:bold;text-transform:uppercase;font-size:80%;color:#555;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li code,.wy-menu-vertical li .rst-content tt,.rst-content .wy-menu-vertical li tt{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:0.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:0.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.on a:hover span.toctree-expand,.wy-menu-vertical li.current>a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand{display:block;font-size:0.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current li.toctree-l2>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>ul{display:none}.wy-menu-vertical li.toctree-l1.current li.toctree-l2.current>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current>ul{display:block}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{display:block;background:#c9c9c9;padding:0.4045em 4.045em}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3{font-size:0.9em}.wy-menu-vertical li.toctree-l3.current>a{background:#bdbdbd;padding:0.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{display:block;background:#bdbdbd;padding:0.4045em 5.663em;border-top:none;border-bottom:none}.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.toctree-l4{font-size:0.9em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical .local-toc li ul{display:block}.wy-menu-vertical li ul li a{margin-bottom:0;color:#b3b3b3;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:0.4045em 1.618em;display:block;position:relative;font-size:90%;color:#b3b3b3}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#b3b3b3}.wy-menu-vertical a:active{background-color:#2980B9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:0.809em;margin-bottom:0.809em;z-index:200;background-color:#2980B9;text-align:center;padding:0.809em;display:block;color:#fcfcfc;margin-bottom:0.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto 0.809em auto;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:0.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-side-nav-search>a img.logo,.wy-side-nav-search .wy-dropdown>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search>a.icon img.logo,.wy-side-nav-search .wy-dropdown>a.icon img.logo{margin-top:0.85em}.wy-side-nav-search>div.version{margin-top:-0.4045em;margin-bottom:0.809em;font-weight:normal;color:rgba(255,255,255,0.3)}.wy-nav .wy-menu-vertical header{color:#2980B9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980B9;color:#fff}[data-menu-wrap]{-webkit-transition:all 0.2s ease-in;-moz-transition:all 0.2s ease-in;transition:all 0.2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:left repeat-y #fcfcfc;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC);background-size:300px 1px}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980B9;color:#fff;padding:0.4045em 0.809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:#999}footer p{margin-bottom:12px}footer span.commit code,footer span.commit .rst-content tt,.rst-content footer span.commit tt{padding:0px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:1em;background:none;border:none;color:#999}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-side-scroll{width:auto}.wy-side-nav-search{width:auto}.wy-menu.wy-menu-vertical{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1400px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}.rst-content img{max-width:100%;height:auto !important}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure p.caption{font-style:italic}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img,.rst-content .section>a>img{margin-bottom:24px}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .line-block{margin-left:24px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto;display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content .toctree-wrapper p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink{display:none;visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content .toctree-wrapper p.caption .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content p.caption .headerlink:after{visibility:visible;content:"";font-family:FontAwesome;display:inline-block}.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content .toctree-wrapper p.caption:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink,.rst-content p.caption:hover .headerlink{display:inline-block}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#F1C40F;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:super;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:#999}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.docutils.citation tt,.rst-content table.docutils.citation code,.rst-content table.docutils.footnote tt,.rst-content table.docutils.footnote code{color:#555}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none;padding-top:5px}.rst-content table.field-list td>strong{display:inline-block;margin-top:3px}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left;padding-left:0}.rst-content tt,.rst-content tt,.rst-content code{color:#000;padding:2px 5px}.rst-content tt big,.rst-content tt em,.rst-content tt big,.rst-content code big,.rst-content tt em,.rst-content code em{font-size:100% !important;line-height:normal}.rst-content tt.literal,.rst-content tt.literal,.rst-content code.literal{color:#E74C3C}.rst-content tt.xref,a .rst-content tt,.rst-content tt.xref,.rst-content code.xref,a .rst-content tt,a .rst-content code{font-weight:bold;color:#404040}.rst-content a tt,.rst-content a tt,.rst-content a code{color:#2980B9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:inline-block;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980B9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:#555}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) code{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) code.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27AE60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}.rst-content tt.download,.rst-content code.download{background:inherit;padding:inherit;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{margin-right:4px}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}.math{text-align:center}@font-face{font-family:"Inconsolata";font-style:normal;font-weight:400;src:local("Inconsolata"),local("Inconsolata-Regular"),url(../fonts/Inconsolata-Regular.ttf) format("truetype")}@font-face{font-family:"Inconsolata";font-style:normal;font-weight:700;src:local("Inconsolata Bold"),local("Inconsolata-Bold"),url(../fonts/Inconsolata-Bold.ttf) format("truetype")}@font-face{font-family:"Lato";font-style:normal;font-weight:400;src:local("Lato Regular"),local("Lato-Regular"),url(../fonts/Lato-Regular.ttf) format("truetype")}@font-face{font-family:"Lato";font-style:normal;font-weight:700;src:local("Lato Bold"),local("Lato-Bold"),url(../fonts/Lato-Bold.ttf) format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:400;src:local("Roboto Slab Regular"),local("RobotoSlab-Regular"),url(../fonts/RobotoSlab-Regular.ttf) format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:700;src:local("Roboto Slab Bold"),local("RobotoSlab-Bold"),url(../fonts/RobotoSlab-Bold.ttf) format("truetype")}
+ */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.6.3");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff2?v=4.6.3") format("woff2"),url("../fonts/fontawesome-webfont.woff?v=4.6.3") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.6.3") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.wy-menu-vertical li span.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-left.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-left.toctree-expand,.rst-content .fa-pull-left.admonition-title,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content dl dt .fa-pull-left.headerlink,.rst-content p.caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.rst-content code.download span.fa-pull-left:first-child,.fa-pull-left.icon{margin-right:.3em}.fa.fa-pull-right,.wy-menu-vertical li span.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-right.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-right.toctree-expand,.rst-content .fa-pull-right.admonition-title,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content dl dt .fa-pull-right.headerlink,.rst-content p.caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.rst-content code.download span.fa-pull-right:first-child,.fa-pull-right.icon{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.wy-menu-vertical li span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.rst-content code.download span.pull-left:first-child,.pull-left.icon{margin-right:.3em}.fa.pull-right,.wy-menu-vertical li span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.rst-content code.download span.pull-right:first-child,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:""}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-signing:before,.fa-sign-language:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .rst-content p.caption .headerlink,.rst-content p.caption a .headerlink,a .rst-content tt.download span:first-child,.rst-content tt.download a span:first-child,a .rst-content code.download span:first-child,.rst-content code.download a span:first-child,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .btn span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.btn .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .rst-content p.caption .headerlink,.rst-content p.caption .btn .headerlink,.btn .rst-content tt.download span:first-child,.rst-content tt.download .btn span:first-child,.btn .rst-content code.download span:first-child,.rst-content code.download .btn span:first-child,.btn .icon,.nav .fa,.nav .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand,.nav .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .rst-content p.caption .headerlink,.rst-content p.caption .nav .headerlink,.nav .rst-content tt.download span:first-child,.rst-content tt.download .nav span:first-child,.nav .rst-content code.download span:first-child,.rst-content code.download .nav span:first-child,.nav .icon{display:inline}.btn .fa.fa-large,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .btn span.fa-large:first-child,.btn .rst-content code.download span.fa-large:first-child,.rst-content code.download .btn span.fa-large:first-child,.btn .fa-large.icon,.nav .fa.fa-large,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.nav .rst-content code.download span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.nav .fa-large.icon{line-height:0.9em}.btn .fa.fa-spin,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .btn span.fa-spin:first-child,.btn .rst-content code.download span.fa-spin:first-child,.rst-content code.download .btn span.fa-spin:first-child,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.nav .rst-content code.download span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.wy-menu-vertical li span.btn.toctree-expand:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.rst-content code.download span.btn:first-child:before,.btn.icon:before{opacity:0.5;-webkit-transition:opacity 0.05s ease-in;-moz-transition:opacity 0.05s ease-in;transition:opacity 0.05s ease-in}.btn.fa:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.rst-content code.download span.btn:first-child:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.rst-content tt.download .btn-mini span:first-child:before,.btn-mini .rst-content code.download span:first-child:before,.rst-content code.download .btn-mini span:first-child:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a{color:#2980B9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all 0.3s ease-in;-moz-transition:all 0.3s ease-in;transition:all 0.3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27AE60}.wy-tray-container li.wy-tray-item-info{background:#2980B9}.wy-tray-container li.wy-tray-item-warning{background:#E67E22}.wy-tray-container li.wy-tray-item-danger{background:#E74C3C}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27AE60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all 0.1s linear;-moz-transition:all 0.1s linear;transition:all 0.1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980B9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27AE60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#E74C3C !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#E67E22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980B9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9B59B6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980B9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980B9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 .3125em 0;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#E74C3C}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{float:left;display:block;margin-right:2.35765%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:0.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}input[type="datetime-local"]{padding:.34375em .625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129FEA}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#E74C3C;border:1px solid #E74C3C}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#E74C3C}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#E74C3C}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type="radio"][disabled],input[type="checkbox"][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{width:36px;height:12px;margin:12px 0;position:relative;border-radius:4px;background:#ccc;cursor:pointer;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.wy-switch:before{position:absolute;content:"";display:block;width:18px;height:18px;border-radius:4px;background:#999;left:-3px;top:-3px;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.wy-switch:after{content:"false";position:absolute;left:48px;display:block;font-size:12px;color:#ccc}.wy-switch.active{background:#1e8449}.wy-switch.active:before{left:24px;background:#27AE60}.wy-switch.active:after{content:"true"}.wy-switch.disabled,.wy-switch.active.disabled{cursor:not-allowed}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#E74C3C}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #E74C3C}.wy-control-group.wy-control-group-error textarea{border:solid 1px #E74C3C}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27AE60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#E74C3C}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#E67E22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980B9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:0.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0.3em;display:block}.wy-form label{margin-bottom:0.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:0.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px}.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980B9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9B59B6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#E67E22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980B9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27AE60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#E74C3C !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,.rst-content .toctree-wrapper p.caption,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2,.rst-content .toctree-wrapper p.caption{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}code,.rst-content tt,.rst-content code{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;color:#E74C3C;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{margin-bottom:0}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{margin-bottom:0}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{list-style:disc}.codeblock-example{border:1px solid #e1e4e5;border-bottom:none;padding:24px;padding-top:48px;font-weight:500;background:#fff;position:relative}.codeblock-example:after{content:"Example";position:absolute;top:0px;left:0px;background:#9B59B6;color:#fff;padding:6px 12px}.codeblock-example.prettyprint-example-only{border:1px solid #e1e4e5;margin-bottom:24px}.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight']{border:1px solid #e1e4e5;padding:0px;overflow-x:auto;background:#fff;margin:1px 0 24px 0}.codeblock div[class^='highlight'],pre.literal-block div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{border:none;background:none;margin:0}div[class^='highlight'] td.code{width:100%}.linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:12px;line-height:1.5;color:#d9d9d9}div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:12px;line-height:1.5;display:block;overflow:auto;color:#404040}@media print{.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'],div[class^='highlight'] pre{white-space:pre-wrap}}.hll{background-color:#ffc;margin:0 -12px;padding:0 12px;display:block}.c{color:#998;font-style:italic}.err{color:#a61717;background-color:#e3d2d2}.k{font-weight:bold}.o{font-weight:bold}.cm{color:#998;font-style:italic}.cp{color:#999;font-weight:bold}.c1{color:#998;font-style:italic}.cs{color:#999;font-weight:bold;font-style:italic}.gd{color:#000;background-color:#fdd}.gd .x{color:#000;background-color:#faa}.ge{font-style:italic}.gr{color:#a00}.gh{color:#999}.gi{color:#000;background-color:#dfd}.gi .x{color:#000;background-color:#afa}.go{color:#888}.gp{color:#555}.gs{font-weight:bold}.gu{color:purple;font-weight:bold}.gt{color:#a00}.kc{font-weight:bold}.kd{font-weight:bold}.kn{font-weight:bold}.kp{font-weight:bold}.kr{font-weight:bold}.kt{color:#458;font-weight:bold}.m{color:#099}.s{color:#d14}.n{color:#333}.na{color:teal}.nb{color:#0086b3}.nc{color:#458;font-weight:bold}.no{color:teal}.ni{color:purple}.ne{color:#900;font-weight:bold}.nf{color:#900;font-weight:bold}.nn{color:#555}.nt{color:navy}.nv{color:teal}.ow{font-weight:bold}.w{color:#bbb}.mf{color:#099}.mh{color:#099}.mi{color:#099}.mo{color:#099}.sb{color:#d14}.sc{color:#d14}.sd{color:#d14}.s2{color:#d14}.se{color:#d14}.sh{color:#d14}.si{color:#d14}.sx{color:#d14}.sr{color:#009926}.s1{color:#d14}.ss{color:#990073}.bp{color:#999}.vc{color:teal}.vg{color:teal}.vi{color:teal}.il{color:#099}.gc{color:#999;background-color:#EAF2F5}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs li code,.wy-breadcrumbs li .rst-content tt,.rst-content .wy-breadcrumbs li tt{padding:5px;border:none;background:none}.wy-breadcrumbs li code.literal,.wy-breadcrumbs li .rst-content tt.literal,.rst-content .wy-breadcrumbs li tt.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{height:32px;display:inline-block;line-height:32px;padding:0 1.618em;margin-bottom:0;display:block;font-weight:bold;text-transform:uppercase;font-size:80%;color:#555;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li code,.wy-menu-vertical li .rst-content tt,.rst-content .wy-menu-vertical li tt{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:0.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.on a:hover span.toctree-expand,.wy-menu-vertical li.current>a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand{display:block;font-size:0.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current li.toctree-l2>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>ul{display:none}.wy-menu-vertical li.toctree-l1.current li.toctree-l2.current>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current>ul{display:block}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{display:block;background:#c9c9c9;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3{font-size:0.9em}.wy-menu-vertical li.toctree-l3.current>a{background:#bdbdbd;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{display:block;background:#bdbdbd;padding:.4045em 5.663em;border-top:none;border-bottom:none}.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.toctree-l4{font-size:0.9em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical .local-toc li ul{display:block}.wy-menu-vertical li ul li a{margin-bottom:0;color:#b3b3b3;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#b3b3b3}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#b3b3b3}.wy-menu-vertical a:active{background-color:#2980B9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980B9;text-align:center;padding:.809em;display:block;color:#fcfcfc;margin-bottom:.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em auto;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-side-nav-search>a img.logo,.wy-side-nav-search .wy-dropdown>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search>a.icon img.logo,.wy-side-nav-search .wy-dropdown>a.icon img.logo{margin-top:0.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:normal;color:rgba(255,255,255,0.3)}.wy-nav .wy-menu-vertical header{color:#2980B9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980B9;color:#fff}[data-menu-wrap]{-webkit-transition:all 0.2s ease-in;-moz-transition:all 0.2s ease-in;transition:all 0.2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:left repeat-y #fcfcfc;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC);background-size:300px 1px}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980B9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:#999}footer p{margin-bottom:12px}footer span.commit code,footer span.commit .rst-content tt,.rst-content footer span.commit tt{padding:0px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:1em;background:none;border:none;color:#999}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:before,.rst-breadcrumbs-buttons:after{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-side-scroll{width:auto}.wy-side-nav-search{width:auto}.wy-menu.wy-menu-vertical{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1400px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content img{max-width:100%;height:auto !important}.rst-content .highlight>pre{line-height:normal}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure p.caption{font-style:italic}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img,.rst-content .section>a>img{margin-bottom:24px}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .line-block{margin-left:24px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto;display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content .toctree-wrapper p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink{display:none;visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content .toctree-wrapper p.caption .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content p.caption .headerlink:after{visibility:visible;content:"";font-family:FontAwesome;display:inline-block}.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content .toctree-wrapper p.caption:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink,.rst-content p.caption:hover .headerlink{display:inline-block}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#F1C40F;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:super;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:#999}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.docutils.citation tt,.rst-content table.docutils.citation code,.rst-content table.docutils.footnote tt,.rst-content table.docutils.footnote code{color:#555}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none;padding-top:5px}.rst-content table.field-list td>strong{display:inline-block;margin-top:3px}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left;padding-left:0}.rst-content tt,.rst-content tt,.rst-content code{color:#000;padding:2px 5px}.rst-content tt big,.rst-content tt em,.rst-content tt big,.rst-content code big,.rst-content tt em,.rst-content code em{font-size:100% !important;line-height:normal}.rst-content tt.literal,.rst-content tt.literal,.rst-content code.literal{color:#E74C3C}.rst-content tt.xref,a .rst-content tt,.rst-content tt.xref,.rst-content code.xref,a .rst-content tt,a .rst-content code{font-weight:bold;color:#404040}.rst-content a tt,.rst-content a tt,.rst-content a code{color:#2980B9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:inline-block;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980B9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:#555}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) code{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) code.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27AE60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}.rst-content tt.download,.rst-content code.download{background:inherit;padding:inherit;font-weight:normal;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content tt.download span:first-child,.rst-content code.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}.math{text-align:center}@font-face{font-family:"Inconsolata";font-style:normal;font-weight:400;src:local("Inconsolata"),local("Inconsolata-Regular"),url(../fonts/Inconsolata-Regular.ttf) format("truetype")}@font-face{font-family:"Inconsolata";font-style:normal;font-weight:700;src:local("Inconsolata Bold"),local("Inconsolata-Bold"),url(../fonts/Inconsolata-Bold.ttf) format("truetype")}@font-face{font-family:"Lato";font-style:normal;font-weight:400;src:local("Lato Regular"),local("Lato-Regular"),url(../fonts/Lato-Regular.ttf) format("truetype")}@font-face{font-family:"Lato";font-style:normal;font-weight:700;src:local("Lato Bold"),local("Lato-Bold"),url(../fonts/Lato-Bold.ttf) format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:400;src:local("Roboto Slab Regular"),local("RobotoSlab-Regular"),url(../fonts/RobotoSlab-Regular.ttf) format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:700;src:local("Roboto Slab Bold"),local("RobotoSlab-Bold"),url(../fonts/RobotoSlab-Bold.ttf) format("truetype")}
/*# sourceMappingURL=theme.css.map */
diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js
index e2e70cc2..56549772 100644
--- a/docs/_build/html/_static/doctools.js
+++ b/docs/_build/html/_static/doctools.js
@@ -4,7 +4,7 @@
*
* Sphinx JavaScript utilities for all documentation.
*
- * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@@ -124,6 +124,7 @@ var Documentation = {
this.fixFirefoxAnchorBug();
this.highlightSearchWords();
this.initIndexTable();
+
},
/**
@@ -252,6 +253,29 @@ var Documentation = {
});
var url = parts.join('/');
return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
+ },
+
+ initOnKeyListeners: function() {
+ $(document).keyup(function(event) {
+ var activeElementType = document.activeElement.tagName;
+ // don't navigate when in search box or textarea
+ if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') {
+ switch (event.keyCode) {
+ case 37: // left
+ var prevHref = $('link[rel="prev"]').prop('href');
+ if (prevHref) {
+ window.location.href = prevHref;
+ return false;
+ }
+ case 39: // right
+ var nextHref = $('link[rel="next"]').prop('href');
+ if (nextHref) {
+ window.location.href = nextHref;
+ return false;
+ }
+ }
+ }
+ });
}
};
@@ -260,4 +284,4 @@ _ = Documentation.gettext;
$(document).ready(function() {
Documentation.init();
-});
+});
\ No newline at end of file
diff --git a/docs/_build/html/_static/down-pressed.png b/docs/_build/html/_static/down-pressed.png
index 7c30d004..5756c8ca 100644
Binary files a/docs/_build/html/_static/down-pressed.png and b/docs/_build/html/_static/down-pressed.png differ
diff --git a/docs/_build/html/_static/down.png b/docs/_build/html/_static/down.png
index f48098a4..1b3bdad2 100644
Binary files a/docs/_build/html/_static/down.png and b/docs/_build/html/_static/down.png differ
diff --git a/docs/_build/html/_static/file.png b/docs/_build/html/_static/file.png
index 254c60bf..a858a410 100644
Binary files a/docs/_build/html/_static/file.png and b/docs/_build/html/_static/file.png differ
diff --git a/docs/_build/html/_static/fonts/Inconsolata-Bold.ttf b/docs/_build/html/_static/fonts/Inconsolata-Bold.ttf
index 58c9fef3..809c1f58 100644
Binary files a/docs/_build/html/_static/fonts/Inconsolata-Bold.ttf and b/docs/_build/html/_static/fonts/Inconsolata-Bold.ttf differ
diff --git a/docs/_build/html/_static/fonts/Inconsolata-Regular.ttf b/docs/_build/html/_static/fonts/Inconsolata-Regular.ttf
index a87ffba6..fc981ce7 100644
Binary files a/docs/_build/html/_static/fonts/Inconsolata-Regular.ttf and b/docs/_build/html/_static/fonts/Inconsolata-Regular.ttf differ
diff --git a/docs/_build/html/_static/fonts/Lato-Bold.ttf b/docs/_build/html/_static/fonts/Lato-Bold.ttf
index 74343694..1d23c706 100644
Binary files a/docs/_build/html/_static/fonts/Lato-Bold.ttf and b/docs/_build/html/_static/fonts/Lato-Bold.ttf differ
diff --git a/docs/_build/html/_static/fonts/Lato-Regular.ttf b/docs/_build/html/_static/fonts/Lato-Regular.ttf
index 04ea8efb..0f3d0f83 100644
Binary files a/docs/_build/html/_static/fonts/Lato-Regular.ttf and b/docs/_build/html/_static/fonts/Lato-Regular.ttf differ
diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.eot b/docs/_build/html/_static/fonts/fontawesome-webfont.eot
index 84677bc0..c7b00d2b 100644
Binary files a/docs/_build/html/_static/fonts/fontawesome-webfont.eot and b/docs/_build/html/_static/fonts/fontawesome-webfont.eot differ
diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.svg b/docs/_build/html/_static/fonts/fontawesome-webfont.svg
index d907b25a..8b66187f 100644
--- a/docs/_build/html/_static/fonts/fontawesome-webfont.svg
+++ b/docs/_build/html/_static/fonts/fontawesome-webfont.svg
@@ -147,14 +147,14 @@
-
+
-
+
@@ -169,7 +169,7 @@
-
+
@@ -178,7 +178,7 @@
-
+
@@ -219,8 +219,8 @@
-
-
+
+
@@ -275,7 +275,7 @@
-
+
@@ -362,8 +362,8 @@
-
-
+
+
@@ -399,7 +399,7 @@
-
+
@@ -410,9 +410,9 @@
-
-
-
+
+
+
@@ -438,7 +438,7 @@
-
+
@@ -454,12 +454,12 @@
-
+
-
+
@@ -483,13 +483,13 @@
-
-
+
+
-
+
@@ -513,8 +513,173 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.ttf b/docs/_build/html/_static/fonts/fontawesome-webfont.ttf
index 96a3639c..f221e50a 100644
Binary files a/docs/_build/html/_static/fonts/fontawesome-webfont.ttf and b/docs/_build/html/_static/fonts/fontawesome-webfont.ttf differ
diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.woff b/docs/_build/html/_static/fonts/fontawesome-webfont.woff
index 628b6a52..6e7483cf 100644
Binary files a/docs/_build/html/_static/fonts/fontawesome-webfont.woff and b/docs/_build/html/_static/fonts/fontawesome-webfont.woff differ
diff --git a/docs/_build/html/_static/jquery-3.1.0.js b/docs/_build/html/_static/jquery-3.1.0.js
new file mode 100644
index 00000000..f2fc2747
--- /dev/null
+++ b/docs/_build/html/_static/jquery-3.1.0.js
@@ -0,0 +1,10074 @@
+/*eslint-disable no-unused-vars*/
+/*!
+ * jQuery JavaScript Library v3.1.0
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2016-07-07T21:44Z
+ */
+( function( global, factory ) {
+
+ "use strict";
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var document = window.document;
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+
+
+ function DOMEval( code, doc ) {
+ doc = doc || document;
+
+ var script = doc.createElement( "script" );
+
+ script.text = code;
+ doc.head.appendChild( script ).parentNode.removeChild( script );
+ }
+/* global Symbol */
+// Defining this global in .eslintrc would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+
+
+var
+ version = "3.1.0",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android <=4.0 only
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([a-z])/g,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ each: function( callback ) {
+ return jQuery.each( this, callback );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map( this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ } ) );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor();
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[ 0 ] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+
+ // Only deal with non-null/undefined values
+ if ( ( options = arguments[ i ] ) != null ) {
+
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+ ( copyIsArray = jQuery.isArray( copy ) ) ) ) {
+
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray( src ) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject( src ) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend( {
+
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ isFunction: function( obj ) {
+ return jQuery.type( obj ) === "function";
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+
+ // As of jQuery 3.0, isNumeric is limited to
+ // strings and numbers (primitives or objects)
+ // that can be coerced to finite numbers (gh-2662)
+ var type = jQuery.type( obj );
+ return ( type === "number" || type === "string" ) &&
+
+ // parseFloat NaNs numeric-cast false positives ("")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ !isNaN( obj - parseFloat( obj ) );
+ },
+
+ isPlainObject: function( obj ) {
+ var proto, Ctor;
+
+ // Detect obvious negatives
+ // Use toString instead of jQuery.type to catch host objects
+ if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+ return false;
+ }
+
+ proto = getProto( obj );
+
+ // Objects with no prototype (e.g., `Object.create( null )`) are plain
+ if ( !proto ) {
+ return true;
+ }
+
+ // Objects with prototype are plain iff they were constructed by a global Object function
+ Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+ return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+ },
+
+ isEmptyObject: function( obj ) {
+
+ /* eslint-disable no-unused-vars */
+ // See https://github.com/eslint/eslint/issues/6125
+ var name;
+
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+
+ // Support: Android <=2.3 only (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call( obj ) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ DOMEval( code );
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Support: IE <=9 - 11, Edge 12 - 13
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ each: function( obj, callback ) {
+ var length, i = 0;
+
+ if ( isArrayLike( obj ) ) {
+ length = obj.length;
+ for ( ; i < length; i++ ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android <=4.0 only
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArrayLike( Object( arr ) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var length, value,
+ i = 0,
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArrayLike( elems ) ) {
+ length = elems.length;
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+ jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+ // Support: real iOS 8.2 only (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = !!obj && "length" in obj && obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.3.0
+ * https://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2016-01-04
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf as it's faster than native
+ // https://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+
+ // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + identifier + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + identifier + ")" ),
+ "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+ "TAG": new RegExp( "^(" + identifier + "|[*])" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+
+ // CSS escapes
+ // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // CSS string/identifier serialization
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
+ rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,
+ fcssescape = function( ch, asCodePoint ) {
+ if ( asCodePoint ) {
+
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+ if ( ch === "\0" ) {
+ return "\uFFFD";
+ }
+
+ // Control characters and (dependent upon position) numbers get escaped as code points
+ return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+ }
+
+ // Other potentially-special ASCII characters get backslash-escaped
+ return "\\" + ch;
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ },
+
+ disabledAncestor = addCombinator(
+ function( elem ) {
+ return elem.disabled === true;
+ },
+ { dir: "parentNode", next: "legend" }
+ );
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var m, i, elem, nid, match, groups, newSelector,
+ newContext = context && context.ownerDocument,
+
+ // nodeType defaults to 9, since context defaults to document
+ nodeType = context ? context.nodeType : 9;
+
+ results = results || [];
+
+ // Return early from calls with invalid selector or context
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ // Try to shortcut find operations (as opposed to filters) in HTML documents
+ if ( !seed ) {
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+ context = context || document;
+
+ if ( documentIsHTML ) {
+
+ // If the selector is sufficiently simple, try using a "get*By*" DOM method
+ // (excepting DocumentFragment context, where the methods don't exist)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+ // ID selector
+ if ( (m = match[1]) ) {
+
+ // Document context
+ if ( nodeType === 9 ) {
+ if ( (elem = context.getElementById( m )) ) {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+
+ // Element context
+ } else {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( newContext && (elem = newContext.getElementById( m )) &&
+ contains( context, elem ) &&
+ elem.id === m ) {
+
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Type selector
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Class selector
+ } else if ( (m = match[3]) && support.getElementsByClassName &&
+ context.getElementsByClassName ) {
+
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // Take advantage of querySelectorAll
+ if ( support.qsa &&
+ !compilerCache[ selector + " " ] &&
+ (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+
+ if ( nodeType !== 1 ) {
+ newContext = context;
+ newSelector = selector;
+
+ // qSA looks outside Element context, which is not what we want
+ // Thanks to Andrew Dupont for this workaround technique
+ // Support: IE <=8
+ // Exclude object elements
+ } else if ( context.nodeName.toLowerCase() !== "object" ) {
+
+ // Capture the context ID, setting it first if necessary
+ if ( (nid = context.getAttribute( "id" )) ) {
+ nid = nid.replace( rcssescape, fcssescape );
+ } else {
+ context.setAttribute( "id", (nid = expando) );
+ }
+
+ // Prefix every selector in the list
+ groups = tokenize( selector );
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = "#" + nid + " " + toSelector( groups[i] );
+ }
+ newSelector = groups.join( "," );
+
+ // Expand context for sibling selectors
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+ context;
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch ( qsaError ) {
+ } finally {
+ if ( nid === expando ) {
+ context.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+function assert( fn ) {
+ var el = document.createElement("fieldset");
+
+ try {
+ return !!fn( el );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( el.parentNode ) {
+ el.parentNode.removeChild( el );
+ }
+ // release memory in IE
+ el = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = arr.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ a.sourceIndex - b.sourceIndex;
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+function createDisabledPseudo( disabled ) {
+ // Known :disabled false positives:
+ // IE: *[disabled]:not(button, input, select, textarea, optgroup, option, menuitem, fieldset)
+ // not IE: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+ return function( elem ) {
+
+ // Check form elements and option elements for explicit disabling
+ return "label" in elem && elem.disabled === disabled ||
+ "form" in elem && elem.disabled === disabled ||
+
+ // Check non-disabled form elements for fieldset[disabled] ancestors
+ "form" in elem && elem.disabled === false && (
+ // Support: IE6-11+
+ // Ancestry is covered for us
+ elem.isDisabled === disabled ||
+
+ // Otherwise, assume any non- under fieldset[disabled] is disabled
+ /* jshint -W018 */
+ elem.isDisabled !== !disabled &&
+ ("label" in elem || !disabledAncestor( elem )) !== disabled
+ );
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, subWindow,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // Return early if doc is invalid or already selected
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Update global variables
+ document = doc;
+ docElem = document.documentElement;
+ documentIsHTML = !isXML( document );
+
+ // Support: IE 9-11, Edge
+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+ if ( preferredDoc !== document &&
+ (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
+
+ // Support: IE 11, Edge
+ if ( subWindow.addEventListener ) {
+ subWindow.addEventListener( "unload", unloadHandler, false );
+
+ // Support: IE 9 - 10 only
+ } else if ( subWindow.attachEvent ) {
+ subWindow.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert(function( el ) {
+ el.className = "i";
+ return !el.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( el ) {
+ el.appendChild( document.createComment("") );
+ return !el.getElementsByTagName("*").length;
+ });
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programmatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( el ) {
+ docElem.appendChild( el ).id = expando;
+ return !document.getElementsByName || !document.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var m = context.getElementById( id );
+ return m ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" &&
+ elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See https://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( el ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // https://bugs.jquery.com/ticket/12359
+ docElem.appendChild( el ).innerHTML = " " +
+ "" +
+ " ";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( el.querySelectorAll("[msallowcapture^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !el.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push("~=");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !el.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibling-combinator selector` fails
+ if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
+ });
+
+ assert(function( el ) {
+ el.innerHTML = " " +
+ " ";
+
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = document.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ el.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( el.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( el.querySelectorAll(":enabled").length !== 2 ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Support: IE9-11+
+ // IE's :disabled selector does not pick up the children of disabled fieldsets
+ docElem.appendChild( el ).disabled = true;
+ if ( el.querySelectorAll(":disabled").length !== 2 ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ el.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( el ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( el, "*" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( el, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully self-exclusive
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === document ? -1 :
+ b === document ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ !compilerCache[ expr + " " ] &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch (e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.escape = function( sel ) {
+ return (sel + "").replace( rcssescape, fcssescape );
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, uniqueCache, outerCache, node, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType,
+ diff = false;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) {
+
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+
+ // Seek `elem` from a previously-cached index
+
+ // ...in a gzip-friendly way
+ node = parent;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex && cache[ 2 ];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ } else {
+ // Use previously-cached element index if available
+ if ( useCache ) {
+ // ...in a gzip-friendly way
+ node = elem;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex;
+ }
+
+ // xml :nth-child(...)
+ // or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ if ( diff === false ) {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) &&
+ ++diff ) {
+
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ uniqueCache[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ // Don't keep the element (issue #299)
+ input[0] = null;
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": createDisabledPseudo( false ),
+ "disabled": createDisabledPseudo( true ),
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ skip = combinator.next,
+ key = skip || dir,
+ checkNonElements = base && key === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, uniqueCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+ if ( skip && skip === elem.nodeName.toLowerCase() ) {
+ elem = elem[ dir ] || elem;
+ } else if ( (oldCache = uniqueCache[ key ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ uniqueCache[ key ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context === document || context || outermost;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ if ( !context && elem.ownerDocument !== document ) {
+ setDocument( elem );
+ xml = !documentIsHTML;
+ }
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context || document, xml) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // `i` is now the count of elements visited above, and adding it to `matchedCount`
+ // makes the latter nonnegative.
+ matchedCount += i;
+
+ // Apply set filters to unmatched elements
+ // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+ // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+ // no element matchers and no seed.
+ // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+ // case, which will result in a "00" `matchedCount` that differs from `i` but is also
+ // numerically zero.
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is only one selector in the list and no seed
+ // (the latter of which guarantees us context)
+ if ( match.length === 1 ) {
+
+ // Reduce context if the leading compound selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( el ) {
+ // Should return 1, but returns 4 (following)
+ return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( el ) {
+ el.innerHTML = " ";
+ return el.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( el ) {
+ el.innerHTML = " ";
+ el.firstChild.setAttribute( "value", "" );
+ return el.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( el ) {
+ return el.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+
+// Deprecated
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
+
+
+
+
+var dir = function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+};
+
+
+var siblings = function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ return !!qualifier.call( elem, i, elem ) !== not;
+ } );
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ } );
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
+ } );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ } ) );
+};
+
+jQuery.fn.extend( {
+ find: function( selector ) {
+ var i, ret,
+ len = this.length,
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter( function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ } ) );
+ }
+
+ ret = this.pushStack( [] );
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ return len > 1 ? jQuery.uniqueSort( ret ) : ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], false ) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], true ) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ // Shortcut simple #id case for speed
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+ init = jQuery.fn.init = function( selector, context, root ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Method init() accepts an alternate rootjQuery
+ // so migrate can support jQuery.sub (gh-2101)
+ root = root || rootjQuery;
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[ 0 ] === "<" &&
+ selector[ selector.length - 1 ] === ">" &&
+ selector.length >= 3 ) {
+
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && ( match[ 1 ] || !context ) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[ 1 ] ) {
+ context = context instanceof jQuery ? context[ 0 ] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[ 1 ],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[ 2 ] );
+
+ if ( elem ) {
+
+ // Inject the element directly into the jQuery object
+ this[ 0 ] = elem;
+ this.length = 1;
+ }
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || root ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this[ 0 ] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return root.ready !== undefined ?
+ root.ready( selector ) :
+
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.fn.extend( {
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter( function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[ i ] ) ) {
+ return true;
+ }
+ }
+ } );
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ targets = typeof selectors !== "string" && jQuery( selectors );
+
+ // Positional selectors never match, since there's no _selection_ context
+ if ( !rneedsContext.test( selectors ) ) {
+ for ( ; i < l; i++ ) {
+ for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && ( targets ?
+ targets.index( cur ) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.uniqueSort(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ }
+} );
+
+function sibling( cur, dir ) {
+ while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each( {
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return siblings( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return siblings( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.uniqueSort( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+} );
+var rnotwhite = ( /\S+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+ var object = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ } );
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ createOptions( options ) :
+ jQuery.extend( {}, options );
+
+ var // Flag to know if list is currently firing
+ firing,
+
+ // Last fire value for non-forgettable lists
+ memory,
+
+ // Flag to know if list was already fired
+ fired,
+
+ // Flag to prevent firing
+ locked,
+
+ // Actual callback list
+ list = [],
+
+ // Queue of execution data for repeatable lists
+ queue = [],
+
+ // Index of currently firing callback (modified by add/remove as needed)
+ firingIndex = -1,
+
+ // Fire callbacks
+ fire = function() {
+
+ // Enforce single-firing
+ locked = options.once;
+
+ // Execute callbacks for all pending executions,
+ // respecting firingIndex overrides and runtime changes
+ fired = firing = true;
+ for ( ; queue.length; firingIndex = -1 ) {
+ memory = queue.shift();
+ while ( ++firingIndex < list.length ) {
+
+ // Run callback and check for early termination
+ if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+ options.stopOnFalse ) {
+
+ // Jump to end and forget the data so .add doesn't re-fire
+ firingIndex = list.length;
+ memory = false;
+ }
+ }
+ }
+
+ // Forget the data if we're done with it
+ if ( !options.memory ) {
+ memory = false;
+ }
+
+ firing = false;
+
+ // Clean up if we're done firing for good
+ if ( locked ) {
+
+ // Keep an empty list if we have data for future add calls
+ if ( memory ) {
+ list = [];
+
+ // Otherwise, this object is spent
+ } else {
+ list = "";
+ }
+ }
+ },
+
+ // Actual Callbacks object
+ self = {
+
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+
+ // If we have memory from a past run, we should fire after adding
+ if ( memory && !firing ) {
+ firingIndex = list.length - 1;
+ queue.push( memory );
+ }
+
+ ( function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ if ( jQuery.isFunction( arg ) ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
+
+ // Inspect recursively
+ add( arg );
+ }
+ } );
+ } )( arguments );
+
+ if ( memory && !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Remove a callback from the list
+ remove: function() {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+
+ // Handle firing indexes
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ } );
+ return this;
+ },
+
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ?
+ jQuery.inArray( fn, list ) > -1 :
+ list.length > 0;
+ },
+
+ // Remove all callbacks from the list
+ empty: function() {
+ if ( list ) {
+ list = [];
+ }
+ return this;
+ },
+
+ // Disable .fire and .add
+ // Abort any current/pending executions
+ // Clear all callbacks and values
+ disable: function() {
+ locked = queue = [];
+ list = memory = "";
+ return this;
+ },
+ disabled: function() {
+ return !list;
+ },
+
+ // Disable .fire
+ // Also disable .add unless we have memory (since it would have no effect)
+ // Abort any pending executions
+ lock: function() {
+ locked = queue = [];
+ if ( !memory && !firing ) {
+ list = memory = "";
+ }
+ return this;
+ },
+ locked: function() {
+ return !!locked;
+ },
+
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( !locked ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ queue.push( args );
+ if ( !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+function Identity( v ) {
+ return v;
+}
+function Thrower( ex ) {
+ throw ex;
+}
+
+function adoptValue( value, resolve, reject ) {
+ var method;
+
+ try {
+
+ // Check for promise aspect first to privilege synchronous behavior
+ if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
+ method.call( value ).done( resolve ).fail( reject );
+
+ // Other thenables
+ } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
+ method.call( value, resolve, reject );
+
+ // Other non-thenables
+ } else {
+
+ // Support: Android 4.0 only
+ // Strict mode functions invoked without .call/.apply get global-object context
+ resolve.call( undefined, value );
+ }
+
+ // For Promises/A+, convert exceptions into rejections
+ // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+ // Deferred#then to conditionally suppress rejection.
+ } catch ( value ) {
+
+ // Support: Android 4.0 only
+ // Strict mode functions invoked without .call/.apply get global-object context
+ reject.call( undefined, value );
+ }
+}
+
+jQuery.extend( {
+
+ Deferred: function( func ) {
+ var tuples = [
+
+ // action, add listener, callbacks,
+ // ... .then handlers, argument index, [final state]
+ [ "notify", "progress", jQuery.Callbacks( "memory" ),
+ jQuery.Callbacks( "memory" ), 2 ],
+ [ "resolve", "done", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), 0, "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ "catch": function( fn ) {
+ return promise.then( null, fn );
+ },
+
+ // Keep pipe for back-compat
+ pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+
+ return jQuery.Deferred( function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+
+ // Map tuples (progress, done, fail) to arguments (done, fail, progress)
+ var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+
+ // deferred.progress(function() { bind to newDefer or newDefer.notify })
+ // deferred.done(function() { bind to newDefer or newDefer.resolve })
+ // deferred.fail(function() { bind to newDefer or newDefer.reject })
+ deferred[ tuple[ 1 ] ]( function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .progress( newDefer.notify )
+ .done( newDefer.resolve )
+ .fail( newDefer.reject );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ](
+ this,
+ fn ? [ returned ] : arguments
+ );
+ }
+ } );
+ } );
+ fns = null;
+ } ).promise();
+ },
+ then: function( onFulfilled, onRejected, onProgress ) {
+ var maxDepth = 0;
+ function resolve( depth, deferred, handler, special ) {
+ return function() {
+ var that = this,
+ args = arguments,
+ mightThrow = function() {
+ var returned, then;
+
+ // Support: Promises/A+ section 2.3.3.3.3
+ // https://promisesaplus.com/#point-59
+ // Ignore double-resolution attempts
+ if ( depth < maxDepth ) {
+ return;
+ }
+
+ returned = handler.apply( that, args );
+
+ // Support: Promises/A+ section 2.3.1
+ // https://promisesaplus.com/#point-48
+ if ( returned === deferred.promise() ) {
+ throw new TypeError( "Thenable self-resolution" );
+ }
+
+ // Support: Promises/A+ sections 2.3.3.1, 3.5
+ // https://promisesaplus.com/#point-54
+ // https://promisesaplus.com/#point-75
+ // Retrieve `then` only once
+ then = returned &&
+
+ // Support: Promises/A+ section 2.3.4
+ // https://promisesaplus.com/#point-64
+ // Only check objects and functions for thenability
+ ( typeof returned === "object" ||
+ typeof returned === "function" ) &&
+ returned.then;
+
+ // Handle a returned thenable
+ if ( jQuery.isFunction( then ) ) {
+
+ // Special processors (notify) just wait for resolution
+ if ( special ) {
+ then.call(
+ returned,
+ resolve( maxDepth, deferred, Identity, special ),
+ resolve( maxDepth, deferred, Thrower, special )
+ );
+
+ // Normal processors (resolve) also hook into progress
+ } else {
+
+ // ...and disregard older resolution values
+ maxDepth++;
+
+ then.call(
+ returned,
+ resolve( maxDepth, deferred, Identity, special ),
+ resolve( maxDepth, deferred, Thrower, special ),
+ resolve( maxDepth, deferred, Identity,
+ deferred.notifyWith )
+ );
+ }
+
+ // Handle all other returned values
+ } else {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if ( handler !== Identity ) {
+ that = undefined;
+ args = [ returned ];
+ }
+
+ // Process the value(s)
+ // Default process is resolve
+ ( special || deferred.resolveWith )( that, args );
+ }
+ },
+
+ // Only normal processors (resolve) catch and reject exceptions
+ process = special ?
+ mightThrow :
+ function() {
+ try {
+ mightThrow();
+ } catch ( e ) {
+
+ if ( jQuery.Deferred.exceptionHook ) {
+ jQuery.Deferred.exceptionHook( e,
+ process.stackTrace );
+ }
+
+ // Support: Promises/A+ section 2.3.3.3.4.1
+ // https://promisesaplus.com/#point-61
+ // Ignore post-resolution exceptions
+ if ( depth + 1 >= maxDepth ) {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if ( handler !== Thrower ) {
+ that = undefined;
+ args = [ e ];
+ }
+
+ deferred.rejectWith( that, args );
+ }
+ }
+ };
+
+ // Support: Promises/A+ section 2.3.3.3.1
+ // https://promisesaplus.com/#point-57
+ // Re-resolve promises immediately to dodge false rejection from
+ // subsequent errors
+ if ( depth ) {
+ process();
+ } else {
+
+ // Call an optional hook to record the stack, in case of exception
+ // since it's otherwise lost when execution goes async
+ if ( jQuery.Deferred.getStackHook ) {
+ process.stackTrace = jQuery.Deferred.getStackHook();
+ }
+ window.setTimeout( process );
+ }
+ };
+ }
+
+ return jQuery.Deferred( function( newDefer ) {
+
+ // progress_handlers.add( ... )
+ tuples[ 0 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ jQuery.isFunction( onProgress ) ?
+ onProgress :
+ Identity,
+ newDefer.notifyWith
+ )
+ );
+
+ // fulfilled_handlers.add( ... )
+ tuples[ 1 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ jQuery.isFunction( onFulfilled ) ?
+ onFulfilled :
+ Identity
+ )
+ );
+
+ // rejected_handlers.add( ... )
+ tuples[ 2 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ jQuery.isFunction( onRejected ) ?
+ onRejected :
+ Thrower
+ )
+ );
+ } ).promise();
+ },
+
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 5 ];
+
+ // promise.progress = list.add
+ // promise.done = list.add
+ // promise.fail = list.add
+ promise[ tuple[ 1 ] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(
+ function() {
+
+ // state = "resolved" (i.e., fulfilled)
+ // state = "rejected"
+ state = stateString;
+ },
+
+ // rejected_callbacks.disable
+ // fulfilled_callbacks.disable
+ tuples[ 3 - i ][ 2 ].disable,
+
+ // progress_callbacks.lock
+ tuples[ 0 ][ 2 ].lock
+ );
+ }
+
+ // progress_handlers.fire
+ // fulfilled_handlers.fire
+ // rejected_handlers.fire
+ list.add( tuple[ 3 ].fire );
+
+ // deferred.notify = function() { deferred.notifyWith(...) }
+ // deferred.resolve = function() { deferred.resolveWith(...) }
+ // deferred.reject = function() { deferred.rejectWith(...) }
+ deferred[ tuple[ 0 ] ] = function() {
+ deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+ return this;
+ };
+
+ // deferred.notifyWith = list.fireWith
+ // deferred.resolveWith = list.fireWith
+ // deferred.rejectWith = list.fireWith
+ deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+ } );
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( singleValue ) {
+ var
+
+ // count of uncompleted subordinates
+ remaining = arguments.length,
+
+ // count of unprocessed arguments
+ i = remaining,
+
+ // subordinate fulfillment data
+ resolveContexts = Array( i ),
+ resolveValues = slice.call( arguments ),
+
+ // the master Deferred
+ master = jQuery.Deferred(),
+
+ // subordinate callback factory
+ updateFunc = function( i ) {
+ return function( value ) {
+ resolveContexts[ i ] = this;
+ resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( !( --remaining ) ) {
+ master.resolveWith( resolveContexts, resolveValues );
+ }
+ };
+ };
+
+ // Single- and empty arguments are adopted like Promise.resolve
+ if ( remaining <= 1 ) {
+ adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject );
+
+ // Use .then() to unwrap secondary thenables (cf. gh-3000)
+ if ( master.state() === "pending" ||
+ jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+
+ return master.then();
+ }
+ }
+
+ // Multiple arguments are aggregated like Promise.all array elements
+ while ( i-- ) {
+ adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ }
+
+ return master.promise();
+ }
+} );
+
+
+// These usually indicate a programmer mistake during development,
+// warn about them ASAP rather than swallowing them by default.
+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+jQuery.Deferred.exceptionHook = function( error, stack ) {
+
+ // Support: IE 8 - 9 only
+ // Console exists when dev tools are open, which can happen at any time
+ if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
+ window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
+ }
+};
+
+
+
+
+jQuery.readyException = function( error ) {
+ window.setTimeout( function() {
+ throw error;
+ } );
+};
+
+
+
+
+// The deferred used on DOM ready
+var readyList = jQuery.Deferred();
+
+jQuery.fn.ready = function( fn ) {
+
+ readyList
+ .then( fn )
+
+ // Wrap jQuery.readyException in a function so that the lookup
+ // happens at the time of error handling instead of callback
+ // registration.
+ .catch( function( error ) {
+ jQuery.readyException( error );
+ } );
+
+ return this;
+};
+
+jQuery.extend( {
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+ }
+} );
+
+jQuery.ready.then = readyList.then;
+
+// The ready event handler and self cleanup method
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed );
+ window.removeEventListener( "load", completed );
+ jQuery.ready();
+}
+
+// Catch cases where $(document).ready() is called
+// after the browser event has already occurred.
+// Support: IE <=9 - 10 only
+// Older IE sometimes signals "interactive" too soon
+if ( document.readyState === "complete" ||
+ ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ window.setTimeout( jQuery.ready );
+
+} else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed );
+}
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ access( elems, fn, i, key[ i ], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn(
+ elems[ i ], key, raw ?
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+var acceptData = function( owner ) {
+
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+ this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+ cache: function( owner ) {
+
+ // Check if the owner object already has a cache
+ var value = owner[ this.expando ];
+
+ // If not, create one
+ if ( !value ) {
+ value = {};
+
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return an empty object.
+ if ( acceptData( owner ) ) {
+
+ // If it is a node unlikely to be stringify-ed or looped over
+ // use plain assignment
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = value;
+
+ // Otherwise secure it in a non-enumerable property
+ // configurable must be true to allow the property to be
+ // deleted when data is removed
+ } else {
+ Object.defineProperty( owner, this.expando, {
+ value: value,
+ configurable: true
+ } );
+ }
+ }
+ }
+
+ return value;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ cache = this.cache( owner );
+
+ // Handle: [ owner, key, value ] args
+ // Always use camelCase key (gh-2257)
+ if ( typeof data === "string" ) {
+ cache[ jQuery.camelCase( data ) ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+
+ // Copy the properties one-by-one to the cache object
+ for ( prop in data ) {
+ cache[ jQuery.camelCase( prop ) ] = data[ prop ];
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ return key === undefined ?
+ this.cache( owner ) :
+
+ // Always use camelCase key (gh-2257)
+ owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
+ },
+ access: function( owner, key, value ) {
+
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+ return this.get( owner, key );
+ }
+
+ // When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i,
+ cache = owner[ this.expando ];
+
+ if ( cache === undefined ) {
+ return;
+ }
+
+ if ( key !== undefined ) {
+
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
+
+ // If key is an array of keys...
+ // We always set camelCase keys, so remove that.
+ key = key.map( jQuery.camelCase );
+ } else {
+ key = jQuery.camelCase( key );
+
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ key = key in cache ?
+ [ key ] :
+ ( key.match( rnotwhite ) || [] );
+ }
+
+ i = key.length;
+
+ while ( i-- ) {
+ delete cache[ key[ i ] ];
+ }
+ }
+
+ // Remove the expando if there's no more data
+ if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+ // Support: Chrome <=35 - 45
+ // Webkit & Blink performance suffers when deleting properties
+ // from DOM nodes, so set to undefined instead
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = undefined;
+ } else {
+ delete owner[ this.expando ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ var cache = owner[ this.expando ];
+ return cache !== undefined && !jQuery.isEmptyObject( cache );
+ }
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user" data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /[A-Z]/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? JSON.parse( data ) :
+ data;
+ } catch ( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ dataUser.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend( {
+ hasData: function( elem ) {
+ return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return dataUser.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ dataUser.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to dataPriv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return dataPriv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ dataPriv.remove( elem, name );
+ }
+} );
+
+jQuery.fn.extend( {
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = dataUser.get( elem );
+
+ if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE 11 only
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice( 5 ) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ dataPriv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each( function() {
+ dataUser.set( this, key );
+ } );
+ }
+
+ return access( this, function( value ) {
+ var data;
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+
+ // Attempt to get data from the cache
+ // The key will always be camelCased in Data
+ data = dataUser.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each( function() {
+
+ // We always store the camelCased key
+ dataUser.set( this, key, value );
+ } );
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each( function() {
+ dataUser.remove( this, key );
+ } );
+ }
+} );
+
+
+jQuery.extend( {
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = dataPriv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+ empty: jQuery.Callbacks( "once memory" ).add( function() {
+ dataPriv.remove( elem, [ type + "queue", key ] );
+ } )
+ } );
+ }
+} );
+
+jQuery.fn.extend( {
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[ 0 ], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each( function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ } );
+ },
+ dequeue: function( type ) {
+ return this.each( function() {
+ jQuery.dequeue( this, type );
+ } );
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHiddenWithinTree = function( elem, el ) {
+
+ // isHiddenWithinTree might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+
+ // Inline style trumps all
+ return elem.style.display === "none" ||
+ elem.style.display === "" &&
+
+ // Otherwise, check computed style
+ // Support: Firefox <=43 - 45
+ // Disconnected elements can have computed display: none, so first confirm that elem is
+ // in the document.
+ jQuery.contains( elem.ownerDocument, elem ) &&
+
+ jQuery.css( elem, "display" ) === "none";
+ };
+
+var swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+ var adjusted,
+ scale = 1,
+ maxIterations = 20,
+ currentValue = tween ?
+ function() {
+ return tween.cur();
+ } :
+ function() {
+ return jQuery.css( elem, prop, "" );
+ },
+ initial = currentValue(),
+ unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+ rcssNum.exec( jQuery.css( elem, prop ) );
+
+ if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+ // Trust units reported by jQuery.css
+ unit = unit || initialInUnit[ 3 ];
+
+ // Make sure we update the tween properties later on
+ valueParts = valueParts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ initialInUnit = +initial || 1;
+
+ do {
+
+ // If previous iteration zeroed out, double until we get *something*.
+ // Use string for doubling so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ initialInUnit = initialInUnit / scale;
+ jQuery.style( elem, prop, initialInUnit + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // Break the loop if scale is unchanged or perfect, or if we've just had enough.
+ } while (
+ scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
+ );
+ }
+
+ if ( valueParts ) {
+ initialInUnit = +initialInUnit || +initial || 0;
+
+ // Apply relative offset (+=/-=) if specified
+ adjusted = valueParts[ 1 ] ?
+ initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+ +valueParts[ 2 ];
+ if ( tween ) {
+ tween.unit = unit;
+ tween.start = initialInUnit;
+ tween.end = adjusted;
+ }
+ }
+ return adjusted;
+}
+
+
+var defaultDisplayMap = {};
+
+function getDefaultDisplay( elem ) {
+ var temp,
+ doc = elem.ownerDocument,
+ nodeName = elem.nodeName,
+ display = defaultDisplayMap[ nodeName ];
+
+ if ( display ) {
+ return display;
+ }
+
+ temp = doc.body.appendChild( doc.createElement( nodeName ) ),
+ display = jQuery.css( temp, "display" );
+
+ temp.parentNode.removeChild( temp );
+
+ if ( display === "none" ) {
+ display = "block";
+ }
+ defaultDisplayMap[ nodeName ] = display;
+
+ return display;
+}
+
+function showHide( elements, show ) {
+ var display, elem,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ // Determine new display value for elements that need to change
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ display = elem.style.display;
+ if ( show ) {
+
+ // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+ // check is required in this first loop unless we have a nonempty display value (either
+ // inline or about-to-be-restored)
+ if ( display === "none" ) {
+ values[ index ] = dataPriv.get( elem, "display" ) || null;
+ if ( !values[ index ] ) {
+ elem.style.display = "";
+ }
+ }
+ if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
+ values[ index ] = getDefaultDisplay( elem );
+ }
+ } else {
+ if ( display !== "none" ) {
+ values[ index ] = "none";
+
+ // Remember what we're overwriting
+ dataPriv.set( elem, "display", display );
+ }
+ }
+ }
+
+ // Set the display of the elements in a second loop to avoid constant reflow
+ for ( index = 0; index < length; index++ ) {
+ if ( values[ index ] != null ) {
+ elements[ index ].style.display = values[ index ];
+ }
+ }
+
+ return elements;
+}
+
+jQuery.fn.extend( {
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each( function() {
+ if ( isHiddenWithinTree( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ } );
+ }
+} );
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
+
+var rscriptType = ( /^$|\/(?:java|ecma)script/i );
+
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+ // Support: IE <=9 only
+ option: [ 1, "", " " ],
+
+ // XHTML parsers do not magically insert elements in the
+ // same way that tag soup parsers do. So we cannot shorten
+ // this by omitting or other required elements.
+ thead: [ 1, "" ],
+ col: [ 2, "" ],
+ tr: [ 2, "" ],
+ td: [ 3, "" ],
+
+ _default: [ 0, "", "" ]
+};
+
+// Support: IE <=9 only
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+
+ // Support: IE <=9 - 11 only
+ // Use typeof to avoid zero-argument method invocation on host objects (#15151)
+ var ret = typeof context.getElementsByTagName !== "undefined" ?
+ context.getElementsByTagName( tag || "*" ) :
+ typeof context.querySelectorAll !== "undefined" ?
+ context.querySelectorAll( tag || "*" ) :
+ [];
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ dataPriv.set(
+ elems[ i ],
+ "globalEval",
+ !refElements || dataPriv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+
+var rhtml = /<|?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( ( elem = nodes[ i++ ] ) ) {
+
+ // Skip elements already in the context collection (trac-4087)
+ if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+ if ( ignored ) {
+ ignored.push( elem );
+ }
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( ( elem = tmp[ j++ ] ) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+}
+
+
+( function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Android 4.0 - 4.3 only
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Android <=4.1 only
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE <=11 only
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+} )();
+var documentElement = document.documentElement;
+
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+// Support: IE <=9 only
+// See #13393 for more info
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ on( elem, type, selector, data, types[ type ], one );
+ }
+ return elem;
+ }
+
+ if ( data == null && fn == null ) {
+
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return elem;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return elem.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ } );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Ensure that invalid selectors throw exceptions at attach time
+ // Evaluate against documentElement in case elem is a non-element node (e.g., document)
+ if ( selector ) {
+ jQuery.find.matchesSelector( documentElement, selector );
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !( events = elemData.events ) ) {
+ events = elemData.events = {};
+ }
+ if ( !( eventHandle = elemData.handle ) ) {
+ eventHandle = elemData.handle = function( e ) {
+
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend( {
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join( "." )
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !( handlers = events[ type ] ) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup ||
+ special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+ if ( !elemData || !( events = elemData.events ) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[ 2 ] &&
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector ||
+ selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown ||
+ special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove data and the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ dataPriv.remove( elem, "handle events" );
+ }
+ },
+
+ dispatch: function( nativeEvent ) {
+
+ // Make a writable jQuery.Event from the native event object
+ var event = jQuery.event.fix( nativeEvent );
+
+ var i, j, ret, matched, handleObj, handlerQueue,
+ args = new Array( arguments.length ),
+ handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[ 0 ] = event;
+
+ for ( i = 1; i < arguments.length; i++ ) {
+ args[ i ] = arguments[ i ];
+ }
+
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( ( handleObj = matched.handlers[ j++ ] ) &&
+ !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+ // a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+ handleObj.handler ).apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( ( event.result = ret ) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Support: IE <=9
+ // Find delegate handlers
+ // Black-hole SVG instance trees (#13180)
+ //
+ // Support: Firefox <=42
+ // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
+ if ( delegateCount && cur.nodeType &&
+ ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't check non-elements (#13208)
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) > -1 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push( { elem: cur, handlers: matches } );
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
+ }
+
+ return handlerQueue;
+ },
+
+ addProp: function( name, hook ) {
+ Object.defineProperty( jQuery.Event.prototype, name, {
+ enumerable: true,
+ configurable: true,
+
+ get: jQuery.isFunction( hook ) ?
+ function() {
+ if ( this.originalEvent ) {
+ return hook( this.originalEvent );
+ }
+ } :
+ function() {
+ if ( this.originalEvent ) {
+ return this.originalEvent[ name ];
+ }
+ },
+
+ set: function( value ) {
+ Object.defineProperty( this, name, {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: value
+ } );
+ }
+ } );
+ },
+
+ fix: function( originalEvent ) {
+ return originalEvent[ jQuery.expando ] ?
+ originalEvent :
+ new jQuery.Event( originalEvent );
+ },
+
+ special: {
+ load: {
+
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+ // This "if" is needed for plain objects
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+
+ // Allow instantiation without the 'new' keyword
+ if ( !( this instanceof jQuery.Event ) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+
+ // Support: Android <=2.3 only
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Create target properties
+ // Support: Safari <=6 - 7 only
+ // Target should not be a text node (#504, #13143)
+ this.target = ( src.target && src.target.nodeType === 3 ) ?
+ src.target.parentNode :
+ src.target;
+
+ this.currentTarget = src.currentTarget;
+ this.relatedTarget = src.relatedTarget;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ constructor: jQuery.Event,
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+ isSimulated: false,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Includes all common event props including KeyEvent and MouseEvent specific props
+jQuery.each( {
+ altKey: true,
+ bubbles: true,
+ cancelable: true,
+ changedTouches: true,
+ ctrlKey: true,
+ detail: true,
+ eventPhase: true,
+ metaKey: true,
+ pageX: true,
+ pageY: true,
+ shiftKey: true,
+ view: true,
+ "char": true,
+ charCode: true,
+ key: true,
+ keyCode: true,
+ button: true,
+ buttons: true,
+ clientX: true,
+ clientY: true,
+ offsetX: true,
+ offsetY: true,
+ pointerId: true,
+ pointerType: true,
+ screenX: true,
+ screenY: true,
+ targetTouches: true,
+ toElement: true,
+ touches: true,
+
+ which: function( event ) {
+ var button = event.button;
+
+ // Add which for key events
+ if ( event.which == null && rkeyEvent.test( event.type ) ) {
+ return event.charCode != null ? event.charCode : event.keyCode;
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
+ return ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event.which;
+ }
+}, jQuery.event.addProp );
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mouseenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+} );
+
+jQuery.fn.extend( {
+
+ on: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn );
+ },
+ one: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ?
+ handleObj.origType + "." + handleObj.namespace :
+ handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each( function() {
+ jQuery.event.remove( this, types, fn, selector );
+ } );
+ }
+} );
+
+
+var
+
+ /* eslint-disable max-len */
+
+ // See https://github.com/eslint/eslint/issues/3229
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
+
+ /* eslint-enable */
+
+ // Support: IE <=10 - 11, Edge 12 - 13
+ // In IE/Edge using regex groups here causes severe slowdowns.
+ // See https://connect.microsoft.com/IE/feedback/details/1736512/
+ rnoInnerhtml = /
@@ -44,6 +49,7 @@
+
@@ -66,7 +72,7 @@
- 1.2.0.4
+ 1.4.0.271
@@ -87,8 +93,11 @@
-
+
+
@@ -5904,10 +5575,11 @@ Z
diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html
index 53f286a5..86e5b9c1 100644
--- a/docs/_build/html/index.html
+++ b/docs/_build/html/index.html
@@ -8,13 +8,15 @@
- Welcome to solidfire’s documentation! — SolidFire Python SDK v1.2.0.4
+ Welcome to solidfire’s documentation! — SolidFire Python SDK v1.4.0.271
+
+
@@ -34,8 +36,11 @@
-
-
+
+
+
+
@@ -44,6 +49,7 @@
+
@@ -66,7 +72,7 @@
- 1.2.0.4
+ 1.4.0.271
@@ -87,8 +93,11 @@
-
+
+
@@ -278,10 +305,11 @@ Indices and tables