Module cvpysdk.instances.cloudapps.cloud_storage_instance
File for operating on a cloud storage instance.
CloudStorageInstance is the only class defined in this file.
CloudStorageInstance: Derived class from CloudAppsInstance Base class, representing a Cloud Storage instance(S3,Azure,Oraclecloud and Openstack), and to perform operations on that instance
Cloudstorageinstance
_get_instance_properties() – Instance class method overwritten to add cloud apps instance properties as well
_generate_json() – Returns the JSON request to pass to the API as per the options selected by the user
restore_in_place() – restores the files/folders specified in the input paths list to the same location.
restore_out_of_place() – restores the files/folders specified in the input paths list to the input client, at the specified destination location.
restore_to_fs() – restores the files/folders specified in the input paths list to the input fs client, at the specified destination location.
_set_destination_options_json() – setter for cloud apps destination options in restore JSON
_set_restore_options_json() – setter for cloudapps restore options in restore JSON
_set_proxy_credential_json() – Method to construct the proxy credentials json for out of place restore
restore_using_proxy() – To perform restore to different cloud using proxy passing explicit credentials of destination cloud
Expand source code Browse git
# -*- coding: utf-8 -*-
# --------------------------------------------------------------------------
# Copyright Commvault Systems, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# --------------------------------------------------------------------------
""" File for operating on a cloud storage instance.
CloudStorageInstance is the only class defined in this file.
CloudStorageInstance: Derived class from CloudAppsInstance Base class, representing a
Cloud Storage instance(S3,Azure,Oraclecloud and Openstack), and to
perform operations on that instance
CloudStorageInstance:
_get_instance_properties() -- Instance class method overwritten to add cloud apps
instance properties as well
_generate_json() -- Returns the JSON request to pass to the API as per
the options selected by the user
restore_in_place() -- restores the files/folders specified in the
input paths list to the same location.
restore_out_of_place() -- restores the files/folders specified in the input
paths list to the input client,
at the specified destination location.
restore_to_fs() -- restores the files/folders specified in the input
paths list to the input fs client,
at the specified destination location.
_set_destination_options_json() -- setter for cloud apps destination options in
restore JSON
_set_restore_options_json() -- setter for cloudapps restore options in restore JSON
_set_proxy_credential_json() -- Method to construct the proxy credentials
json for out of place restore
restore_using_proxy() -- To perform restore to different cloud using
proxy passing explicit credentials of destination cloud
"""
from cvpysdk.instances.cainstance import CloudAppsInstance
from cvpysdk.client import Client
from cvpysdk.exception import SDKException
class CloudStorageInstance(CloudAppsInstance):
"""Class for representing an Instance of the cloud storage instance type."""
def __init__(self, agent_object, instance_name, instance_id=None):
"""Initializes the object of the CloudStorageInstance class.
Args:
agent_object (object) -- instance of the Agent class
instance_name (str) -- name of the instance
instance_id (str) -- id of the instance
default: None
Returns:
object - instance of the Instance class
"""
# Common Properties
self._ca_instance_type = None
self._access_node = None
# Google Cloud Properties
self._google_host_url = None
self._google_access_key = None
self._google_secret_key = None
self._host_url = None
self._access_keyid = None
self._secret_accesskey = None
self._account_name = None
self._access_key = None
self._server_name = None
self._username = None
self._endpointurl = None
self._set_cloud_destination_options_json = None
self._set_cloud_restore_options_json = None
super(
CloudStorageInstance,
self).__init__(
agent_object,
instance_name,
instance_id)
def _get_instance_properties(self):
"""Gets the properties of this instance"""
super(CloudStorageInstance, self)._get_instance_properties()
if 'cloudAppsInstance' in self._properties:
cloud_apps_instance = self._properties.get('cloudAppsInstance', {})
self._ca_instance_type = cloud_apps_instance['instanceType']
if 's3Instance' in cloud_apps_instance:
s3instance = cloud_apps_instance.get('s3Instance', {})
self._host_url = s3instance.get('hostURL', '')
self._access_keyid = s3instance.get('accessKeyId', '')
if 'azureInstance' in cloud_apps_instance:
azureinstance = cloud_apps_instance.get('azureInstance', {})
self._host_url = azureinstance.get('hostURL', '')
self._account_name = azureinstance.get('accountName', '')
self._access_key = azureinstance.get('accessKey', '')
if 'openStackInstance' in cloud_apps_instance:
openstackinstance = cloud_apps_instance.get('openStackInstance', {})
self._server_name = openstackinstance.get('serverName', '')
self._username = openstackinstance.get('credentials', {}).get('userName', '')
if 'oraCloudInstance' in cloud_apps_instance:
oraclecloudinstance = cloud_apps_instance.get('oraCloudInstance')
self._endpointurl = oraclecloudinstance.get('endpointURL', '')
self._username = oraclecloudinstance.get('user', {}).get('userName', '')
# Google Cloud Instance porperties
if 'googleCloudInstance' in cloud_apps_instance:
googlecloudinstance = cloud_apps_instance.get('googleCloudInstance', {})
self._google_host_url = googlecloudinstance.get('serverName', '')
self._google_access_key = googlecloudinstance.get('credentials', {}).get('userName', '')
# Ali Cloud
if 'alibabaInstance' in cloud_apps_instance:
alibabainstance = cloud_apps_instance.get('alibabaInstance', {})
self._host_url = alibabainstance.get('hostURL', '')
self._access_key = alibabainstance.get('accessKey', '')
# IBM Cloud
if 'ibmCosInstance' in cloud_apps_instance:
ibminstance = cloud_apps_instance.get('ibmCosInstance', {})
self._host_url = ibminstance.get('hostURL', '')
self._access_key = ibminstance.get('credentials', {}).get('username', '')
if 'generalCloudProperties' in cloud_apps_instance:
self._access_node = cloud_apps_instance.get(
'generalCloudProperties', {}).get(
'proxyServers', [{}])[0].get('clientName', cloud_apps_instance.get(
'generalCloudProperties', {}).get('memberServers', [{}])[
0].get('client', {}).get('clientName'))
@property
def google_host_url(self):
"""
Returns google cloud URL as read only attribute
Returns:
(str) - string representing host URL of goole cloud
"""
return self._google_host_url
@property
def google_access_key(self):
"""
Returns google cloud account access key as read only attribute
Returns:
(str) - string representing google cloud account access key
"""
return self._google_access_key
@property
def ca_instance_type(self):
"""Returns the CloudApps instance type as a read-only attribute."""
return self._ca_instance_type
@property
def host_url(self):
"""Returns the host URL property as a read-only attribute."""
return self._host_url
@property
def access_key(self):
"""Returns the access key property as a read-only attribute."""
return self._access_key
@property
def account_name(self):
"""Returns the account name as a read-only attribute."""
return self._account_name
@property
def access_keyid(self):
"""Returns the access key ID property as a read-only attribute."""
return self._access_keyid
@property
def server_name(self):
"""Returns the server name property as a read-only attribute."""
return self._server_name
@property
def username(self):
"""Returns the username property as a read-only attribute."""
return self._username
@property
def endpointurl(self):
"""Returns the endpoint URL property as a read-only attribute."""
return self._endpointurl
@property
def client_name(self):
"""
Returns client name of this instance
Returns:
(str) - client name as registered in the commcell
"""
return self._properties.get('instance', {}).get('clientName')
@property
def access_node(self):
"""Returns the access node of this instance as a read-only attribute."""
return self._access_node
def _generate_json(self, **kwargs):
"""Returns the JSON request to pass to the API as per the options selected by the user.
Args:
kwargs (list) -- list of options need to be set for restore
Returns:
dict - JSON request to pass to the API
"""
cloud_restore_json = super(
CloudStorageInstance,
self)._restore_json(
**kwargs)
restore_options = {}
if kwargs.get("restore_options"):
restore_options = kwargs["restore_options"]
for key in kwargs:
if not key == "restore_options":
restore_options[key] = kwargs[key]
else:
restore_options.update(kwargs)
self._set_destination_options_json(restore_options)
self._set_restore_options_json(restore_options)
self._set_common_options_json(restore_options)
cloud_restore_json["taskInfo"]["subTasks"][0]["options"]["restoreOptions"][
"destination"] = self._set_cloud_destination_options_json
cloud_restore_json["taskInfo"]["subTasks"][0]["options"]["restoreOptions"][
"cloudAppsRestoreOptions"] = self._set_cloud_restore_options_json
cloud_restore_json["taskInfo"]["subTasks"][0]["options"][
"restoreOptions"]["commonOptions"] = self._common_options_json
cloud_restore_json["taskInfo"]["associations"][0]["backupsetId"] = int(self._agent_object.backupsets.get(
'defaultBackupSet').backupset_id)
return cloud_restore_json
def restore_in_place(
self,
paths,
overwrite=True,
copy_precedence=None,
no_of_streams=2):
"""Restores the files/folders specified in the input paths list to the same location.
Args:
paths (list) -- list of full paths of files/folders to restore
overwrite (bool) -- unconditional overwrite files during restore
default: True
copy_precedence (int) -- copy precedence value of storage policy copy
default: None
no_of_streams (int) -- number of streams for restore
default : 2
Returns:
object - instance of the Job class for this restore job
Raises:
SDKException:
if paths is not a list
if failed to initialize job
if response is empty
if response is not success
"""
if not (isinstance(paths, list) and
isinstance(overwrite, bool)):
raise SDKException('Instance', '101')
request_json = self._generate_json(
paths=paths,
destination_client=self.client_name,
destination_instance_name=self.instance_name,
overwrite=overwrite,
in_place=True,
copy_precedence=copy_precedence,
restore_To_FileSystem=False,
no_of_streams=no_of_streams)
return self._process_restore_response(request_json)
def restore_out_of_place(
self,
paths,
destination_client,
destination_instance_name,
destination_path,
overwrite=True,
copy_precedence=None,
no_of_streams=2,
**kwargs):
"""Restores the files/folders specified in the input paths list to the input client,
at the specified destination location.
Args:
paths (list) -- list of full paths of files/folders to restore
destination_client (str) -- name of the client to which the files
are to be restored.
destination_instance_name(str) -- name of the instance to which the files
are to be restored.
destination_path (str) -- location where the files are to be restored
in the destination instance.
overwrite (bool) -- unconditional overwrite files during restore
default: True
copy_precedence (int) -- copy precedence value of storage policy copy
default: None
no_of_streams (int) -- number of streams for restore
default : 2
kwargs (dict) -- dict of keyword arguments as follows
from_time (str) -- time to retore the contents after
format: YYYY-MM-DD HH:MM:SS
default: None
to_time (str) -- time to retore the contents before
format: YYYY-MM-DD HH:MM:SS
default: None
no_image (bool) -- restore deleted items
default: False
Returns:
object - instance of the Job class for this restore job
Raises:
SDKException:
if client is not a string or Client object
if destination_path is not a string
if paths is not a list
if failed to initialize job
if response is empty
if response is not success
"""
if not ((isinstance(destination_client, str) or
isinstance(destination_client, Client)) and
isinstance(destination_instance_name, str) and
isinstance(destination_path, str) and
isinstance(paths, list) and
isinstance(overwrite, bool)):
raise SDKException('Instance', '101')
request_json = self._generate_json(
paths=paths,
destination_client=destination_client,
destination_instance_name=destination_instance_name,
destination_path=destination_path,
overwrite=overwrite,
in_place=False,
copy_precedence=copy_precedence,
no_of_streams=no_of_streams,
restore_To_FileSystem=False,
**kwargs)
return self._process_restore_response(request_json)
def restore_to_fs(
self,
paths,
destination_path,
destination_client=None,
overwrite=True,
copy_precedence=None,
no_of_streams=2):
"""Restores the files/folders specified in the input paths list to the input client,
at the specified destination location.
Args:
paths (list) -- list of full paths of files/folders to restore
destination_path (str) -- location where the files are to be restored
in the destination instance.
destination_client (str) -- name of the fs client to which the files
are to be restored.
default: None for restores to backup or proxy client.
overwrite (bool) -- unconditional overwrite files during restore
default: True
copy_precedence (int) -- copy precedence value of storage policy copy
default: None
no_of_streams (int) -- number of streams for restore
default : 2
Returns:
object - instance of the Job class for this restore job
Raises:
SDKException:
if client is not a string or client object
if destination_path is not a string
if paths is not a list
if failed to initialize job
if response is empty
if response is not success
"""
if not ((isinstance(destination_client, str) or
isinstance(destination_client, Client)) and
isinstance(destination_path, str) and
isinstance(paths, list) and
isinstance(overwrite, bool)):
raise SDKException('Instance', '101')
destination_appTypeId = int(
self._commcell_object.clients.get(destination_client).agents.get('file system').agent_id)
request_json = self._generate_json(
paths=paths,
destination_path=destination_path,
destination_client=destination_client,
overwrite=overwrite,
in_place=False,
copy_precedence=copy_precedence,
restore_To_FileSystem=True,
no_of_streams=no_of_streams,
destination_appTypeId=destination_appTypeId)
return self._process_restore_response(request_json)
def _set_destination_options_json(self, value):
"""setter for cloud apps destination options in restore JSON
Args:
value (dict) -- options needed to set the cloud apps destination parameters
Example:
value = {
"destination_proxy":False,
"restore_To_FileSystem" : False
"in_place" : False
"destination_path" : "/test/test1"
"destination_client" : "test_client"
"destination_instance_name" : "test_instance"
}
"""
proxy_option = value.get('destination_proxy', False)
if value.get("restore_To_FileSystem"):
self._set_cloud_destination_options_json = {
"isLegalHold": False,
"noOfStreams": value.get('no_of_streams', 2),
"inPlace": value.get("in_place", ""),
"destPath": [value.get("destination_path", "")],
"destClient": {
"clientName": value.get("destination_client", "")
}
}
else:
if value.get("destination_client"):
dest_client = value.get("destination_client", "")
else:
dest_client = self._agent_object._client_object.client_name
if value.get("destination_instance_name"):
dest_instance = value.get("destination_instance_name")
else:
dest_instance = self.instance_name
regular_instance_restore_json = {
"isLegalHold": False,
"noOfStreams": value.get('no_of_streams', 2),
"inPlace": value.get("in_place"),
"destPath": [value.get("destination_path")],
"destClient": {
"clientName": value.get("destination_client")
}
}
if not proxy_option:
destination_client_object = self._commcell_object.clients.get(dest_client)
destination_agent_object = destination_client_object.agents.get('cloud apps')
destination_instance_object = destination_agent_object.instances.get(dest_instance)
destination_instance_details = {
"destinationInstance": {
"instanceName": value.get("destination_instance_name"),
"instanceId": int(destination_instance_object.instance_id)}}
regular_instance_restore_json.update(
destination_instance_details)
self._set_cloud_destination_options_json = regular_instance_restore_json
def _set_restore_options_json(self, value):
"""setter for cloudapps restore options in restore JSON
Args:
value (dict) -- options needed to set the cloud apps restore parameters
Example:
value = {
"restore_To_FileSystem": True
}
"""
self._set_cloud_restore_options_json = {
"instanceType": int(self.ca_instance_type),
"cloudStorageRestoreOptions": {
"restoreToFileSystem": value.get("restore_To_FileSystem"),
"overrideCloudLogin": False,
"restoreDestination": {
"instanceType": int(self.ca_instance_type)
}
}
}
def _set_common_options_json(self, value):
"""
Setter for the Common options in restore JSON
Args:
value (dict) -- dict of common options
for restore json
"""
if not isinstance(value, dict):
raise SDKException('Instance', '101')
self._common_options_json = {
"overwriteFiles": True,
"unconditionalOverwrite": value.get("overwrite", False),
"stripLevelType": 1
}
def _set_proxy_credential_json(self, destination_cloud):
"""
Method to construct the proxy credentials json for out of place restore
Args:
destination_cloud (dict(dict)) -- dict of dict representing cross cloud credentials
Sample dict(dict) :
destination_cloud = {
'google_cloud': {
'google_host_url':'storage.googleapis.com',
'google_access_key':'xxxxxx',
'google_secret_key':'yyyyyy'
}
}
destination_cloud = {
'amazon_s3': {
's3_host_url':'s3.amazonaws.com',
's3_access_key':'xxxxxx',
's3_secret_key':'yyyyyy'
}
}
destination_cloud = {
'azure_blob': {
'azure_host_url':'blob.core.windows.net',
'azure_account_name':'xxxxxx',
'azure_access_key':'yyyyyy'
}
}
"""
if 'amazon_s3' in destination_cloud:
self._proxy_credential_json = {
"instanceType": 5,
"s3Instance": {
"hostURL": destination_cloud.get('amazon_s3', {}).get('s3_host_url', 's3.amazonaws.com'),
"accessKeyId": destination_cloud.get('amazon_s3', {}).get('s3_access_key', ""),
"secretAccessKey": destination_cloud.get('amazon_s3', {}).get('s3_secret_key', "")
}
}
elif 'google_cloud' in destination_cloud:
self._proxy_credential_json = {
"instanceType": 20,
"googleCloudInstance": {
"serverName": destination_cloud.get('google_cloud', {}).get('google_host_url',
'storage.googleapis.com'),
"credentials": {
"userName": destination_cloud.get('google_cloud', {}).get('google_access_key', ""),
"password": destination_cloud.get('google_cloud', {}).get('google_secret_key', "")
}
}
}
elif 'azure_blob' in destination_cloud:
self._proxy_credential_json = {
"instanceType": 6,
"azureInstance": {
"hostURL": destination_cloud.get('azure_blob', {}).get('azure_host_url', 'blob.core.windows.net'),
"accountName": destination_cloud.get('azure_blob', {}).get('azure_account_name', ""),
"accessKey": destination_cloud.get('azure_blob', {}).get('azure_access_key', "")
}
}
def restore_using_proxy(self,
paths,
destination_client_proxy,
destination_path,
overwrite=True,
copy_precedence=None,
destination_cloud=None):
"""
To perform restore to different cloud using
proxy passing explicit credentials of destination cloud
Args:
destination_client_proxy (str) -- name of proxy machine having cloud connector package
paths (list) -- list of full paths of files/folders to restore
destination_path (str) -- location where the files are to be restored
in the destination instance.
overwrite (bool) -- unconditional overwrite files during restore
default: True
copy_precedence (int) -- copy precedence value of storage policy copy
default: None
destination_cloud (dict(dict)) -- dict of dict representing cross cloud credentials
Sample dict(dict) :
destination_cloud = {
'google_cloud': {
'google_host_url':'storage.googleapis.com',
'google_access_key':'xxxxxx',
'google_secret_key':'yyyyyy'
}
}
destination_cloud = {
'amazon_s3': {
's3_host_url':'s3.amazonaws.com',
's3_access_key':'xxxxxx',
's3_secret_key':'yyyyyy'
}
}
destination_cloud = {
'azure_blob': {
'azure_host_url':'blob.core.windows.net',
'azure_account_name':'xxxxxx',
'azure_access_key':'yyyyyy'
}
}
Returns:
object - instance of the Job class for this restore job
Raises:
SDKException:
if destination cloud credentials empty
if destination cloud has more than one vendor details
if unsupported destination cloud for restore is chosen
if client is not a string or Client object
if destination_path is not a string
if paths is not a list
if failed to initialize job
if response is empty
if response is not success
"""
# Check if destination cloud credentials are empty
if destination_cloud is None:
raise SDKException(
'Instance',
'102',
'Destination Cloud Credentials empty')
if len(destination_cloud) > 1:
raise SDKException(
'Instance', '102', 'only one cloud vendor details can'
'be passed.Multiple entries not allowed')
cloud_vendors = ["google_cloud", "amazon_s3", "azure_blob"]
# Check if destination cloud falls within supported cloud vendors
cloud_vendors = ["google_cloud", "amazon_s3", "azure_blob"]
# Check if destination cloud falls within supported cloud vendors
dict_keys = list(destination_cloud.keys())
if dict_keys[0] not in cloud_vendors:
raise SDKException(
'Instance',
'102',
'Unsupported destination cloud for restore')
if not ((isinstance(destination_client_proxy, str) or
isinstance(destination_client_proxy, Client)) and
isinstance(destination_path, str) and
isinstance(paths, list) and
isinstance(overwrite, bool)):
raise SDKException('Instance', '101')
request_json = self._generate_json(
paths=paths,
destination_proxy=True,
destination_client=destination_client_proxy,
destination_instance_name=None,
destination_path=destination_path,
overwrite=overwrite,
in_place=False,
copy_precedence=copy_precedence,
restore_To_FileSystem=False)
self._set_proxy_credential_json(destination_cloud)
request_json["taskInfo"]["subTasks"][0]["options"][
"restoreOptions"]["cloudAppsRestoreOptions"]["cloudStorageRestoreOptions"][
"restoreDestination"] = self._proxy_credential_json
request_json["taskInfo"]["subTasks"][0]["options"]["restoreOptions"][
"cloudAppsRestoreOptions"]["cloudStorageRestoreOptions"]["overrideCloudLogin"] = True
request_json["taskInfo"]["subTasks"][0]["options"]["restoreOptions"][
"browseOption"]["backupset"].update({"backupsetName": "defaultBackupSet"})
request_json["taskInfo"]["associations"][0]["backupsetName"] = "defaultBackupSet"
return self._process_restore_response(request_json)
Classes
class CloudStorageInstance (agent_object, instance_name, instance_id=None)
-
Class for representing an Instance of the cloud storage instance type.
Initializes the object of the CloudStorageInstance class.
Args
agent_object (object) – instance of the Agent class
instance_name (str) – name of the instance
instance_id (str) – id of the instance default: None
Returns
object - instance of the Instance class
Expand source code Browse git
class CloudStorageInstance(CloudAppsInstance): """Class for representing an Instance of the cloud storage instance type.""" def __init__(self, agent_object, instance_name, instance_id=None): """Initializes the object of the CloudStorageInstance class. Args: agent_object (object) -- instance of the Agent class instance_name (str) -- name of the instance instance_id (str) -- id of the instance default: None Returns: object - instance of the Instance class """ # Common Properties self._ca_instance_type = None self._access_node = None # Google Cloud Properties self._google_host_url = None self._google_access_key = None self._google_secret_key = None self._host_url = None self._access_keyid = None self._secret_accesskey = None self._account_name = None self._access_key = None self._server_name = None self._username = None self._endpointurl = None self._set_cloud_destination_options_json = None self._set_cloud_restore_options_json = None super( CloudStorageInstance, self).__init__( agent_object, instance_name, instance_id) def _get_instance_properties(self): """Gets the properties of this instance""" super(CloudStorageInstance, self)._get_instance_properties() if 'cloudAppsInstance' in self._properties: cloud_apps_instance = self._properties.get('cloudAppsInstance', {}) self._ca_instance_type = cloud_apps_instance['instanceType'] if 's3Instance' in cloud_apps_instance: s3instance = cloud_apps_instance.get('s3Instance', {}) self._host_url = s3instance.get('hostURL', '') self._access_keyid = s3instance.get('accessKeyId', '') if 'azureInstance' in cloud_apps_instance: azureinstance = cloud_apps_instance.get('azureInstance', {}) self._host_url = azureinstance.get('hostURL', '') self._account_name = azureinstance.get('accountName', '') self._access_key = azureinstance.get('accessKey', '') if 'openStackInstance' in cloud_apps_instance: openstackinstance = cloud_apps_instance.get('openStackInstance', {}) self._server_name = openstackinstance.get('serverName', '') self._username = openstackinstance.get('credentials', {}).get('userName', '') if 'oraCloudInstance' in cloud_apps_instance: oraclecloudinstance = cloud_apps_instance.get('oraCloudInstance') self._endpointurl = oraclecloudinstance.get('endpointURL', '') self._username = oraclecloudinstance.get('user', {}).get('userName', '') # Google Cloud Instance porperties if 'googleCloudInstance' in cloud_apps_instance: googlecloudinstance = cloud_apps_instance.get('googleCloudInstance', {}) self._google_host_url = googlecloudinstance.get('serverName', '') self._google_access_key = googlecloudinstance.get('credentials', {}).get('userName', '') # Ali Cloud if 'alibabaInstance' in cloud_apps_instance: alibabainstance = cloud_apps_instance.get('alibabaInstance', {}) self._host_url = alibabainstance.get('hostURL', '') self._access_key = alibabainstance.get('accessKey', '') # IBM Cloud if 'ibmCosInstance' in cloud_apps_instance: ibminstance = cloud_apps_instance.get('ibmCosInstance', {}) self._host_url = ibminstance.get('hostURL', '') self._access_key = ibminstance.get('credentials', {}).get('username', '') if 'generalCloudProperties' in cloud_apps_instance: self._access_node = cloud_apps_instance.get( 'generalCloudProperties', {}).get( 'proxyServers', [{}])[0].get('clientName', cloud_apps_instance.get( 'generalCloudProperties', {}).get('memberServers', [{}])[ 0].get('client', {}).get('clientName')) @property def google_host_url(self): """ Returns google cloud URL as read only attribute Returns: (str) - string representing host URL of goole cloud """ return self._google_host_url @property def google_access_key(self): """ Returns google cloud account access key as read only attribute Returns: (str) - string representing google cloud account access key """ return self._google_access_key @property def ca_instance_type(self): """Returns the CloudApps instance type as a read-only attribute.""" return self._ca_instance_type @property def host_url(self): """Returns the host URL property as a read-only attribute.""" return self._host_url @property def access_key(self): """Returns the access key property as a read-only attribute.""" return self._access_key @property def account_name(self): """Returns the account name as a read-only attribute.""" return self._account_name @property def access_keyid(self): """Returns the access key ID property as a read-only attribute.""" return self._access_keyid @property def server_name(self): """Returns the server name property as a read-only attribute.""" return self._server_name @property def username(self): """Returns the username property as a read-only attribute.""" return self._username @property def endpointurl(self): """Returns the endpoint URL property as a read-only attribute.""" return self._endpointurl @property def client_name(self): """ Returns client name of this instance Returns: (str) - client name as registered in the commcell """ return self._properties.get('instance', {}).get('clientName') @property def access_node(self): """Returns the access node of this instance as a read-only attribute.""" return self._access_node def _generate_json(self, **kwargs): """Returns the JSON request to pass to the API as per the options selected by the user. Args: kwargs (list) -- list of options need to be set for restore Returns: dict - JSON request to pass to the API """ cloud_restore_json = super( CloudStorageInstance, self)._restore_json( **kwargs) restore_options = {} if kwargs.get("restore_options"): restore_options = kwargs["restore_options"] for key in kwargs: if not key == "restore_options": restore_options[key] = kwargs[key] else: restore_options.update(kwargs) self._set_destination_options_json(restore_options) self._set_restore_options_json(restore_options) self._set_common_options_json(restore_options) cloud_restore_json["taskInfo"]["subTasks"][0]["options"]["restoreOptions"][ "destination"] = self._set_cloud_destination_options_json cloud_restore_json["taskInfo"]["subTasks"][0]["options"]["restoreOptions"][ "cloudAppsRestoreOptions"] = self._set_cloud_restore_options_json cloud_restore_json["taskInfo"]["subTasks"][0]["options"][ "restoreOptions"]["commonOptions"] = self._common_options_json cloud_restore_json["taskInfo"]["associations"][0]["backupsetId"] = int(self._agent_object.backupsets.get( 'defaultBackupSet').backupset_id) return cloud_restore_json def restore_in_place( self, paths, overwrite=True, copy_precedence=None, no_of_streams=2): """Restores the files/folders specified in the input paths list to the same location. Args: paths (list) -- list of full paths of files/folders to restore overwrite (bool) -- unconditional overwrite files during restore default: True copy_precedence (int) -- copy precedence value of storage policy copy default: None no_of_streams (int) -- number of streams for restore default : 2 Returns: object - instance of the Job class for this restore job Raises: SDKException: if paths is not a list if failed to initialize job if response is empty if response is not success """ if not (isinstance(paths, list) and isinstance(overwrite, bool)): raise SDKException('Instance', '101') request_json = self._generate_json( paths=paths, destination_client=self.client_name, destination_instance_name=self.instance_name, overwrite=overwrite, in_place=True, copy_precedence=copy_precedence, restore_To_FileSystem=False, no_of_streams=no_of_streams) return self._process_restore_response(request_json) def restore_out_of_place( self, paths, destination_client, destination_instance_name, destination_path, overwrite=True, copy_precedence=None, no_of_streams=2, **kwargs): """Restores the files/folders specified in the input paths list to the input client, at the specified destination location. Args: paths (list) -- list of full paths of files/folders to restore destination_client (str) -- name of the client to which the files are to be restored. destination_instance_name(str) -- name of the instance to which the files are to be restored. destination_path (str) -- location where the files are to be restored in the destination instance. overwrite (bool) -- unconditional overwrite files during restore default: True copy_precedence (int) -- copy precedence value of storage policy copy default: None no_of_streams (int) -- number of streams for restore default : 2 kwargs (dict) -- dict of keyword arguments as follows from_time (str) -- time to retore the contents after format: YYYY-MM-DD HH:MM:SS default: None to_time (str) -- time to retore the contents before format: YYYY-MM-DD HH:MM:SS default: None no_image (bool) -- restore deleted items default: False Returns: object - instance of the Job class for this restore job Raises: SDKException: if client is not a string or Client object if destination_path is not a string if paths is not a list if failed to initialize job if response is empty if response is not success """ if not ((isinstance(destination_client, str) or isinstance(destination_client, Client)) and isinstance(destination_instance_name, str) and isinstance(destination_path, str) and isinstance(paths, list) and isinstance(overwrite, bool)): raise SDKException('Instance', '101') request_json = self._generate_json( paths=paths, destination_client=destination_client, destination_instance_name=destination_instance_name, destination_path=destination_path, overwrite=overwrite, in_place=False, copy_precedence=copy_precedence, no_of_streams=no_of_streams, restore_To_FileSystem=False, **kwargs) return self._process_restore_response(request_json) def restore_to_fs( self, paths, destination_path, destination_client=None, overwrite=True, copy_precedence=None, no_of_streams=2): """Restores the files/folders specified in the input paths list to the input client, at the specified destination location. Args: paths (list) -- list of full paths of files/folders to restore destination_path (str) -- location where the files are to be restored in the destination instance. destination_client (str) -- name of the fs client to which the files are to be restored. default: None for restores to backup or proxy client. overwrite (bool) -- unconditional overwrite files during restore default: True copy_precedence (int) -- copy precedence value of storage policy copy default: None no_of_streams (int) -- number of streams for restore default : 2 Returns: object - instance of the Job class for this restore job Raises: SDKException: if client is not a string or client object if destination_path is not a string if paths is not a list if failed to initialize job if response is empty if response is not success """ if not ((isinstance(destination_client, str) or isinstance(destination_client, Client)) and isinstance(destination_path, str) and isinstance(paths, list) and isinstance(overwrite, bool)): raise SDKException('Instance', '101') destination_appTypeId = int( self._commcell_object.clients.get(destination_client).agents.get('file system').agent_id) request_json = self._generate_json( paths=paths, destination_path=destination_path, destination_client=destination_client, overwrite=overwrite, in_place=False, copy_precedence=copy_precedence, restore_To_FileSystem=True, no_of_streams=no_of_streams, destination_appTypeId=destination_appTypeId) return self._process_restore_response(request_json) def _set_destination_options_json(self, value): """setter for cloud apps destination options in restore JSON Args: value (dict) -- options needed to set the cloud apps destination parameters Example: value = { "destination_proxy":False, "restore_To_FileSystem" : False "in_place" : False "destination_path" : "/test/test1" "destination_client" : "test_client" "destination_instance_name" : "test_instance" } """ proxy_option = value.get('destination_proxy', False) if value.get("restore_To_FileSystem"): self._set_cloud_destination_options_json = { "isLegalHold": False, "noOfStreams": value.get('no_of_streams', 2), "inPlace": value.get("in_place", ""), "destPath": [value.get("destination_path", "")], "destClient": { "clientName": value.get("destination_client", "") } } else: if value.get("destination_client"): dest_client = value.get("destination_client", "") else: dest_client = self._agent_object._client_object.client_name if value.get("destination_instance_name"): dest_instance = value.get("destination_instance_name") else: dest_instance = self.instance_name regular_instance_restore_json = { "isLegalHold": False, "noOfStreams": value.get('no_of_streams', 2), "inPlace": value.get("in_place"), "destPath": [value.get("destination_path")], "destClient": { "clientName": value.get("destination_client") } } if not proxy_option: destination_client_object = self._commcell_object.clients.get(dest_client) destination_agent_object = destination_client_object.agents.get('cloud apps') destination_instance_object = destination_agent_object.instances.get(dest_instance) destination_instance_details = { "destinationInstance": { "instanceName": value.get("destination_instance_name"), "instanceId": int(destination_instance_object.instance_id)}} regular_instance_restore_json.update( destination_instance_details) self._set_cloud_destination_options_json = regular_instance_restore_json def _set_restore_options_json(self, value): """setter for cloudapps restore options in restore JSON Args: value (dict) -- options needed to set the cloud apps restore parameters Example: value = { "restore_To_FileSystem": True } """ self._set_cloud_restore_options_json = { "instanceType": int(self.ca_instance_type), "cloudStorageRestoreOptions": { "restoreToFileSystem": value.get("restore_To_FileSystem"), "overrideCloudLogin": False, "restoreDestination": { "instanceType": int(self.ca_instance_type) } } } def _set_common_options_json(self, value): """ Setter for the Common options in restore JSON Args: value (dict) -- dict of common options for restore json """ if not isinstance(value, dict): raise SDKException('Instance', '101') self._common_options_json = { "overwriteFiles": True, "unconditionalOverwrite": value.get("overwrite", False), "stripLevelType": 1 } def _set_proxy_credential_json(self, destination_cloud): """ Method to construct the proxy credentials json for out of place restore Args: destination_cloud (dict(dict)) -- dict of dict representing cross cloud credentials Sample dict(dict) : destination_cloud = { 'google_cloud': { 'google_host_url':'storage.googleapis.com', 'google_access_key':'xxxxxx', 'google_secret_key':'yyyyyy' } } destination_cloud = { 'amazon_s3': { 's3_host_url':'s3.amazonaws.com', 's3_access_key':'xxxxxx', 's3_secret_key':'yyyyyy' } } destination_cloud = { 'azure_blob': { 'azure_host_url':'blob.core.windows.net', 'azure_account_name':'xxxxxx', 'azure_access_key':'yyyyyy' } } """ if 'amazon_s3' in destination_cloud: self._proxy_credential_json = { "instanceType": 5, "s3Instance": { "hostURL": destination_cloud.get('amazon_s3', {}).get('s3_host_url', 's3.amazonaws.com'), "accessKeyId": destination_cloud.get('amazon_s3', {}).get('s3_access_key', ""), "secretAccessKey": destination_cloud.get('amazon_s3', {}).get('s3_secret_key', "") } } elif 'google_cloud' in destination_cloud: self._proxy_credential_json = { "instanceType": 20, "googleCloudInstance": { "serverName": destination_cloud.get('google_cloud', {}).get('google_host_url', 'storage.googleapis.com'), "credentials": { "userName": destination_cloud.get('google_cloud', {}).get('google_access_key', ""), "password": destination_cloud.get('google_cloud', {}).get('google_secret_key', "") } } } elif 'azure_blob' in destination_cloud: self._proxy_credential_json = { "instanceType": 6, "azureInstance": { "hostURL": destination_cloud.get('azure_blob', {}).get('azure_host_url', 'blob.core.windows.net'), "accountName": destination_cloud.get('azure_blob', {}).get('azure_account_name', ""), "accessKey": destination_cloud.get('azure_blob', {}).get('azure_access_key', "") } } def restore_using_proxy(self, paths, destination_client_proxy, destination_path, overwrite=True, copy_precedence=None, destination_cloud=None): """ To perform restore to different cloud using proxy passing explicit credentials of destination cloud Args: destination_client_proxy (str) -- name of proxy machine having cloud connector package paths (list) -- list of full paths of files/folders to restore destination_path (str) -- location where the files are to be restored in the destination instance. overwrite (bool) -- unconditional overwrite files during restore default: True copy_precedence (int) -- copy precedence value of storage policy copy default: None destination_cloud (dict(dict)) -- dict of dict representing cross cloud credentials Sample dict(dict) : destination_cloud = { 'google_cloud': { 'google_host_url':'storage.googleapis.com', 'google_access_key':'xxxxxx', 'google_secret_key':'yyyyyy' } } destination_cloud = { 'amazon_s3': { 's3_host_url':'s3.amazonaws.com', 's3_access_key':'xxxxxx', 's3_secret_key':'yyyyyy' } } destination_cloud = { 'azure_blob': { 'azure_host_url':'blob.core.windows.net', 'azure_account_name':'xxxxxx', 'azure_access_key':'yyyyyy' } } Returns: object - instance of the Job class for this restore job Raises: SDKException: if destination cloud credentials empty if destination cloud has more than one vendor details if unsupported destination cloud for restore is chosen if client is not a string or Client object if destination_path is not a string if paths is not a list if failed to initialize job if response is empty if response is not success """ # Check if destination cloud credentials are empty if destination_cloud is None: raise SDKException( 'Instance', '102', 'Destination Cloud Credentials empty') if len(destination_cloud) > 1: raise SDKException( 'Instance', '102', 'only one cloud vendor details can' 'be passed.Multiple entries not allowed') cloud_vendors = ["google_cloud", "amazon_s3", "azure_blob"] # Check if destination cloud falls within supported cloud vendors cloud_vendors = ["google_cloud", "amazon_s3", "azure_blob"] # Check if destination cloud falls within supported cloud vendors dict_keys = list(destination_cloud.keys()) if dict_keys[0] not in cloud_vendors: raise SDKException( 'Instance', '102', 'Unsupported destination cloud for restore') if not ((isinstance(destination_client_proxy, str) or isinstance(destination_client_proxy, Client)) and isinstance(destination_path, str) and isinstance(paths, list) and isinstance(overwrite, bool)): raise SDKException('Instance', '101') request_json = self._generate_json( paths=paths, destination_proxy=True, destination_client=destination_client_proxy, destination_instance_name=None, destination_path=destination_path, overwrite=overwrite, in_place=False, copy_precedence=copy_precedence, restore_To_FileSystem=False) self._set_proxy_credential_json(destination_cloud) request_json["taskInfo"]["subTasks"][0]["options"][ "restoreOptions"]["cloudAppsRestoreOptions"]["cloudStorageRestoreOptions"][ "restoreDestination"] = self._proxy_credential_json request_json["taskInfo"]["subTasks"][0]["options"]["restoreOptions"][ "cloudAppsRestoreOptions"]["cloudStorageRestoreOptions"]["overrideCloudLogin"] = True request_json["taskInfo"]["subTasks"][0]["options"]["restoreOptions"][ "browseOption"]["backupset"].update({"backupsetName": "defaultBackupSet"}) request_json["taskInfo"]["associations"][0]["backupsetName"] = "defaultBackupSet" return self._process_restore_response(request_json)
Ancestors
Instance variables
var access_key
-
Returns the access key property as a read-only attribute.
Expand source code Browse git
@property def access_key(self): """Returns the access key property as a read-only attribute.""" return self._access_key
var access_keyid
-
Returns the access key ID property as a read-only attribute.
Expand source code Browse git
@property def access_keyid(self): """Returns the access key ID property as a read-only attribute.""" return self._access_keyid
var access_node
-
Returns the access node of this instance as a read-only attribute.
Expand source code Browse git
@property def access_node(self): """Returns the access node of this instance as a read-only attribute.""" return self._access_node
var account_name
-
Returns the account name as a read-only attribute.
Expand source code Browse git
@property def account_name(self): """Returns the account name as a read-only attribute.""" return self._account_name
var ca_instance_type
-
Returns the CloudApps instance type as a read-only attribute.
Expand source code Browse git
@property def ca_instance_type(self): """Returns the CloudApps instance type as a read-only attribute.""" return self._ca_instance_type
var client_name
-
Returns client name of this instance
Returns: (str) - client name as registered in the commcell
Expand source code Browse git
@property def client_name(self): """ Returns client name of this instance Returns: (str) - client name as registered in the commcell """ return self._properties.get('instance', {}).get('clientName')
var endpointurl
-
Returns the endpoint URL property as a read-only attribute.
Expand source code Browse git
@property def endpointurl(self): """Returns the endpoint URL property as a read-only attribute.""" return self._endpointurl
var google_access_key
-
Returns google cloud account access key as read only attribute
Returns
(str) - string representing google cloud account access key
Expand source code Browse git
@property def google_access_key(self): """ Returns google cloud account access key as read only attribute Returns: (str) - string representing google cloud account access key """ return self._google_access_key
var google_host_url
-
Returns google cloud URL as read only attribute
Returns
(str) - string representing host URL of goole cloud
Expand source code Browse git
@property def google_host_url(self): """ Returns google cloud URL as read only attribute Returns: (str) - string representing host URL of goole cloud """ return self._google_host_url
var host_url
-
Returns the host URL property as a read-only attribute.
Expand source code Browse git
@property def host_url(self): """Returns the host URL property as a read-only attribute.""" return self._host_url
var server_name
-
Returns the server name property as a read-only attribute.
Expand source code Browse git
@property def server_name(self): """Returns the server name property as a read-only attribute.""" return self._server_name
var username
-
Returns the username property as a read-only attribute.
Expand source code Browse git
@property def username(self): """Returns the username property as a read-only attribute.""" return self._username
Methods
def restore_in_place(self, paths, overwrite=True, copy_precedence=None, no_of_streams=2)
-
Restores the files/folders specified in the input paths list to the same location.
Args
paths (list) – list of full paths of files/folders to restore
overwrite (bool) – unconditional overwrite files during restore default: True
copy_precedence (int) – copy precedence value of storage policy copy default: None
no_of_streams (int) – number of streams for restore default : 2
Returns
object - instance of the Job class for this restore job
Raises
SDKException: if paths is not a list
if failed to initialize job if response is empty if response is not success
Expand source code Browse git
def restore_in_place( self, paths, overwrite=True, copy_precedence=None, no_of_streams=2): """Restores the files/folders specified in the input paths list to the same location. Args: paths (list) -- list of full paths of files/folders to restore overwrite (bool) -- unconditional overwrite files during restore default: True copy_precedence (int) -- copy precedence value of storage policy copy default: None no_of_streams (int) -- number of streams for restore default : 2 Returns: object - instance of the Job class for this restore job Raises: SDKException: if paths is not a list if failed to initialize job if response is empty if response is not success """ if not (isinstance(paths, list) and isinstance(overwrite, bool)): raise SDKException('Instance', '101') request_json = self._generate_json( paths=paths, destination_client=self.client_name, destination_instance_name=self.instance_name, overwrite=overwrite, in_place=True, copy_precedence=copy_precedence, restore_To_FileSystem=False, no_of_streams=no_of_streams) return self._process_restore_response(request_json)
def restore_out_of_place(self, paths, destination_client, destination_instance_name, destination_path, overwrite=True, copy_precedence=None, no_of_streams=2, **kwargs)
-
Restores the files/folders specified in the input paths list to the input client, at the specified destination location.
Args
paths (list) – list of full paths of files/folders to restore
destination_client (str) – name of the client to which the files are to be restored.
destination_instance_name(str) – name of the instance to which the files are to be restored.
destination_path (str) – location where the files are to be restored in the destination instance.
overwrite (bool) – unconditional overwrite files during restore default: True
copy_precedence (int) – copy precedence value of storage policy copy default: None
no_of_streams (int) – number of streams for restore default : 2
kwargs (dict) – dict of keyword arguments as follows
from_time (str) -- time to retore the contents after format: YYYY-MM-DD HH:MM:SS default: None to_time (str) -- time to retore the contents before format: YYYY-MM-DD HH:MM:SS default: None no_image (bool) -- restore deleted items default: False
Returns
object - instance of the Job class for this restore job
Raises
SDKException: if client is not a string or Client object
if destination_path is not a string if paths is not a list if failed to initialize job if response is empty if response is not success
Expand source code Browse git
def restore_out_of_place( self, paths, destination_client, destination_instance_name, destination_path, overwrite=True, copy_precedence=None, no_of_streams=2, **kwargs): """Restores the files/folders specified in the input paths list to the input client, at the specified destination location. Args: paths (list) -- list of full paths of files/folders to restore destination_client (str) -- name of the client to which the files are to be restored. destination_instance_name(str) -- name of the instance to which the files are to be restored. destination_path (str) -- location where the files are to be restored in the destination instance. overwrite (bool) -- unconditional overwrite files during restore default: True copy_precedence (int) -- copy precedence value of storage policy copy default: None no_of_streams (int) -- number of streams for restore default : 2 kwargs (dict) -- dict of keyword arguments as follows from_time (str) -- time to retore the contents after format: YYYY-MM-DD HH:MM:SS default: None to_time (str) -- time to retore the contents before format: YYYY-MM-DD HH:MM:SS default: None no_image (bool) -- restore deleted items default: False Returns: object - instance of the Job class for this restore job Raises: SDKException: if client is not a string or Client object if destination_path is not a string if paths is not a list if failed to initialize job if response is empty if response is not success """ if not ((isinstance(destination_client, str) or isinstance(destination_client, Client)) and isinstance(destination_instance_name, str) and isinstance(destination_path, str) and isinstance(paths, list) and isinstance(overwrite, bool)): raise SDKException('Instance', '101') request_json = self._generate_json( paths=paths, destination_client=destination_client, destination_instance_name=destination_instance_name, destination_path=destination_path, overwrite=overwrite, in_place=False, copy_precedence=copy_precedence, no_of_streams=no_of_streams, restore_To_FileSystem=False, **kwargs) return self._process_restore_response(request_json)
def restore_to_fs(self, paths, destination_path, destination_client=None, overwrite=True, copy_precedence=None, no_of_streams=2)
-
Restores the files/folders specified in the input paths list to the input client, at the specified destination location.
Args
paths (list) – list of full paths of files/folders to restore
destination_path (str) – location where the files are to be restored in the destination instance.
destination_client (str) – name of the fs client to which the files are to be restored. default: None for restores to backup or proxy client.
overwrite (bool) – unconditional overwrite files during restore default: True
copy_precedence (int) – copy precedence value of storage policy copy default: None
no_of_streams (int) – number of streams for restore default : 2
Returns
object - instance of the Job class for this restore job
Raises
SDKException: if client is not a string or client object
if destination_path is not a string if paths is not a list if failed to initialize job if response is empty if response is not success
Expand source code Browse git
def restore_to_fs( self, paths, destination_path, destination_client=None, overwrite=True, copy_precedence=None, no_of_streams=2): """Restores the files/folders specified in the input paths list to the input client, at the specified destination location. Args: paths (list) -- list of full paths of files/folders to restore destination_path (str) -- location where the files are to be restored in the destination instance. destination_client (str) -- name of the fs client to which the files are to be restored. default: None for restores to backup or proxy client. overwrite (bool) -- unconditional overwrite files during restore default: True copy_precedence (int) -- copy precedence value of storage policy copy default: None no_of_streams (int) -- number of streams for restore default : 2 Returns: object - instance of the Job class for this restore job Raises: SDKException: if client is not a string or client object if destination_path is not a string if paths is not a list if failed to initialize job if response is empty if response is not success """ if not ((isinstance(destination_client, str) or isinstance(destination_client, Client)) and isinstance(destination_path, str) and isinstance(paths, list) and isinstance(overwrite, bool)): raise SDKException('Instance', '101') destination_appTypeId = int( self._commcell_object.clients.get(destination_client).agents.get('file system').agent_id) request_json = self._generate_json( paths=paths, destination_path=destination_path, destination_client=destination_client, overwrite=overwrite, in_place=False, copy_precedence=copy_precedence, restore_To_FileSystem=True, no_of_streams=no_of_streams, destination_appTypeId=destination_appTypeId) return self._process_restore_response(request_json)
def restore_using_proxy(self, paths, destination_client_proxy, destination_path, overwrite=True, copy_precedence=None, destination_cloud=None)
-
To perform restore to different cloud using proxy passing explicit credentials of destination cloud
Args
destination_client_proxy (str) – name of proxy machine having cloud connector package
paths (list) – list of full paths of files/folders to restore
destination_path (str) – location where the files are to be restored in the destination instance.
overwrite (bool) – unconditional overwrite files during restore default: True
copy_precedence (int) – copy precedence value of storage policy copy default: None
destination_cloud (dict(dict)) – dict of dict representing cross cloud credentials
Sample dict(dict) :
destination_cloud = { 'google_cloud': { 'google_host_url':'storage.googleapis.com', 'google_access_key':'xxxxxx', 'google_secret_key':'yyyyyy' } }
destination_cloud = { 'amazon_s3': { 's3_host_url':'s3.amazonaws.com', 's3_access_key':'xxxxxx', 's3_secret_key':'yyyyyy' } } destination_cloud = { 'azure_blob': { 'azure_host_url':'blob.core.windows.net', 'azure_account_name':'xxxxxx', 'azure_access_key':'yyyyyy' } }
Returns
object - instance of the Job class for this restore job
Raises
SDKException:
if destination cloud credentials empty if destination cloud has more than one vendor details if unsupported destination cloud for restore is chosen if client is not a string or Client object if destination_path is not a string if paths is not a list if failed to initialize job if response is empty if response is not success
Expand source code Browse git
def restore_using_proxy(self, paths, destination_client_proxy, destination_path, overwrite=True, copy_precedence=None, destination_cloud=None): """ To perform restore to different cloud using proxy passing explicit credentials of destination cloud Args: destination_client_proxy (str) -- name of proxy machine having cloud connector package paths (list) -- list of full paths of files/folders to restore destination_path (str) -- location where the files are to be restored in the destination instance. overwrite (bool) -- unconditional overwrite files during restore default: True copy_precedence (int) -- copy precedence value of storage policy copy default: None destination_cloud (dict(dict)) -- dict of dict representing cross cloud credentials Sample dict(dict) : destination_cloud = { 'google_cloud': { 'google_host_url':'storage.googleapis.com', 'google_access_key':'xxxxxx', 'google_secret_key':'yyyyyy' } } destination_cloud = { 'amazon_s3': { 's3_host_url':'s3.amazonaws.com', 's3_access_key':'xxxxxx', 's3_secret_key':'yyyyyy' } } destination_cloud = { 'azure_blob': { 'azure_host_url':'blob.core.windows.net', 'azure_account_name':'xxxxxx', 'azure_access_key':'yyyyyy' } } Returns: object - instance of the Job class for this restore job Raises: SDKException: if destination cloud credentials empty if destination cloud has more than one vendor details if unsupported destination cloud for restore is chosen if client is not a string or Client object if destination_path is not a string if paths is not a list if failed to initialize job if response is empty if response is not success """ # Check if destination cloud credentials are empty if destination_cloud is None: raise SDKException( 'Instance', '102', 'Destination Cloud Credentials empty') if len(destination_cloud) > 1: raise SDKException( 'Instance', '102', 'only one cloud vendor details can' 'be passed.Multiple entries not allowed') cloud_vendors = ["google_cloud", "amazon_s3", "azure_blob"] # Check if destination cloud falls within supported cloud vendors cloud_vendors = ["google_cloud", "amazon_s3", "azure_blob"] # Check if destination cloud falls within supported cloud vendors dict_keys = list(destination_cloud.keys()) if dict_keys[0] not in cloud_vendors: raise SDKException( 'Instance', '102', 'Unsupported destination cloud for restore') if not ((isinstance(destination_client_proxy, str) or isinstance(destination_client_proxy, Client)) and isinstance(destination_path, str) and isinstance(paths, list) and isinstance(overwrite, bool)): raise SDKException('Instance', '101') request_json = self._generate_json( paths=paths, destination_proxy=True, destination_client=destination_client_proxy, destination_instance_name=None, destination_path=destination_path, overwrite=overwrite, in_place=False, copy_precedence=copy_precedence, restore_To_FileSystem=False) self._set_proxy_credential_json(destination_cloud) request_json["taskInfo"]["subTasks"][0]["options"][ "restoreOptions"]["cloudAppsRestoreOptions"]["cloudStorageRestoreOptions"][ "restoreDestination"] = self._proxy_credential_json request_json["taskInfo"]["subTasks"][0]["options"]["restoreOptions"][ "cloudAppsRestoreOptions"]["cloudStorageRestoreOptions"]["overrideCloudLogin"] = True request_json["taskInfo"]["subTasks"][0]["options"]["restoreOptions"][ "browseOption"]["backupset"].update({"backupsetName": "defaultBackupSet"}) request_json["taskInfo"]["associations"][0]["backupsetName"] = "defaultBackupSet" return self._process_restore_response(request_json)
Inherited members