Module cvpysdk.storage_pool
File for doing operations on an Storage Pools.
This module has classes defined for doing operations for Storage Pools:
#. Get the Id for the given Storage Pool
StoragePools
__init__(commcell_object) -- initializes object of the StoragePools class associated
with the commcell
__str__() -- returns all the storage pools associated with the commcell
__repr__() -- returns the string representation of an instance of this class
__len__() -- returns the number of storage pools added to the Commcell
__getitem__() -- returns the name of the storage pool for the given storage
pool Id or the details for the given storage pool name
_get_storage_pools() -- returns all storage pools added to the commcell
has_storage_pool() -- checks whether the storage pool with given name exists or not
get() -- returns StoragePool object of the storage pool for the
specified input name
add() -- Adds a storage pool, according to given input and returns
StoragePool object
add_azure_storage_pool() -- Adds new storage pool with provided name to the commcell
delete() -- deletes the specified storage pool
refresh() -- refresh the list of storage pools associated with the commcell
Attributes
**all_storage_pools** -- returns dict of all the storage pools on commcell
StoragePool
===========
init(commcell_object, storage_pool_name, storage_pool_id) – initialize the instance of StoragePool class for specific storage pool of commcell repr() – returns a string representation of the StoragePool instance _get_storage_pool_properties() – returns the properties of this storage pool
refresh() – Refresh the properties of the StoragePool
StoragePool instance attributes
storage_policy_name – returns the name of the StoragePool as seen on GUI
storage_policy_id – returns the storage pool id
TODO: check with MM API team to get the response in JSON
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 doing operations on an Storage Pools.
This module has classes defined for doing operations for Storage Pools:
#. Get the Id for the given Storage Pool
StoragePools
============
__init__(commcell_object) -- initializes object of the StoragePools class associated
with the commcell
__str__() -- returns all the storage pools associated with the commcell
__repr__() -- returns the string representation of an instance of this class
__len__() -- returns the number of storage pools added to the Commcell
__getitem__() -- returns the name of the storage pool for the given storage
pool Id or the details for the given storage pool name
_get_storage_pools() -- returns all storage pools added to the commcell
has_storage_pool() -- checks whether the storage pool with given name exists or not
get() -- returns StoragePool object of the storage pool for the
specified input name
add() -- Adds a storage pool, according to given input and returns
StoragePool object
add_azure_storage_pool() -- Adds new storage pool with provided name to the commcell
delete() -- deletes the specified storage pool
refresh() -- refresh the list of storage pools associated with the commcell
Attributes
----------
**all_storage_pools** -- returns dict of all the storage pools on commcell
StoragePool
===========
__init__(commcell_object,
storage_pool_name,
storage_pool_id) -- initialize the instance of StoragePool class for specific
storage pool of commcell
__repr__() -- returns a string representation of the
StoragePool instance
_get_storage_pool_properties() -- returns the properties of this storage pool
refresh() -- Refresh the properties of the StoragePool
StoragePool instance attributes
================================
**storage_policy_name** -- returns the name of the StoragePool as seen on GUI
**storage_policy_id** -- returns the storage pool id
# TODO: check with MM API team to get the response in JSON
"""
import copy
import xmltodict
from .exception import SDKException
# from .job import Job
from .storage import DiskLibrary
from .storage import MediaAgent
from .security.security_association import SecurityAssociation
from .constants import StoragePoolConstants
class StoragePools:
"""Class for doing operations on Storage Pools, like get storage poo ID."""
def __init__(self, commcell_object):
"""Initializes instance of the StoragePools class to perform operations on a storage pool.
Args:
commcell_object (object) -- instance of the Commcell class
Returns:
object - instance of the StoragePools class
"""
self._commcell_object = commcell_object
self._cvpysdk_object = commcell_object._cvpysdk_object
self._services = commcell_object._services
self._update_response_ = commcell_object._update_response_
self._add_storage_pool_api = self._services['ADD_STORAGE_POOL']
self._storage_pools_api = self._services['STORAGE_POOL']
self._storage_pools = None
self.refresh()
def __str__(self):
"""Representation string consisting of all storage pools present in the Commcell.
Returns:
str - string of all the storage pools associated with the commcell
"""
representation_string = '{:^5}\t{:^40}\n\n'.format('S. No.', 'Storage Pool')
for index, storage_pool in enumerate(self._storage_pools):
sub_str = '{:^5}\t{:40}\n'.format(index + 1, storage_pool)
representation_string += sub_str
return representation_string.strip()
def __repr__(self):
"""Returns the string representation of an instance of this class."""
return "StoragePools class instance for Commcell: '{0}'".format(
self._commcell_object.commserv_name
)
def __len__(self):
"""Returns the number of the storage pools added to the Commcell."""
return len(self.all_storage_pools)
def __getitem__(self, value):
"""Returns the name of the storage pool for the given storage pool ID or
the details of the storage pool for given storage pool Name.
Args:
value (str / int) -- Name or ID of the storage pool
Returns:
str - name of the storage pool, if the storage pool id was given
dict - dict of details of the storage pool, if storage pool name was given
Raises:
IndexError:
no storage pool exists with the given Name / Id
"""
value = str(value)
if value in self.all_storage_pools:
return self.all_storage_pools[value]
else:
try:
return list(filter(lambda x: x[1]['id'] == value, self.all_storage_pools.items()))[0][0]
except IndexError:
raise IndexError('No storage pool exists with the given Name / Id')
def _get_storage_pools(self):
"""Gets all the storage pools associated with the Commcell environment.
Returns:
dict - consists of all storage pools added to the commcell
{
"storage_pool1_name": storage_pool1_id,
"storage_pool2_name": storage_pool2_id
}
Raises:
SDKException:
if response is empty
if response is not success
"""
headers = self._commcell_object._headers.copy()
headers['Accept'] = 'application/xml'
flag, response = self._cvpysdk_object.make_request(
'GET', self._storage_pools_api, headers=headers
)
if flag:
storage_pools = {}
response = xmltodict.parse(response.text)['Api_GetStoragePoolListResp']
if response is None or response.get('storagePoolList') is None:
storage_pool_list = []
else:
storage_pool_list = response['storagePoolList']
if not isinstance(storage_pool_list, list):
storage_pool_list = [storage_pool_list]
if response:
for pool in storage_pool_list:
name = pool['storagePoolEntity']['@storagePoolName'].lower()
storage_pool_id = pool['storagePoolEntity']['@storagePoolId']
storage_pools[name] = storage_pool_id
return storage_pools
else:
response_string = self._update_response_(response.text)
raise SDKException('Response', '101', response_string)
@property
def all_storage_pools(self):
"""Returns dict of all the storage pools on this commcell
dict - consists of all storage pools added to the commcell
{
"storage_pool1_name": storage_pool1_id,
"storage_pool2_name": storage_pool2_id
}
"""
return self._storage_pools
def has_storage_pool(self, name):
"""Checks if a storage pool exists in the Commcell with the input storage pool name.
Args:
name (str) -- name of the storage pool
Returns:
bool - boolean output whether the storage pool exists in the commcell or not
"""
return self._storage_pools and name.lower() in self._storage_pools
def get(self, name):
"""Returns the id of the storage pool for the given storage pool name.
Args:
name (str) -- name of the storage pool to get the id of
Returns:
str - id of the storage pool for the given storage pool name
Raises:
SDKException:
if no storage pool exists with the given name
"""
name = name.lower()
if self.has_storage_pool(name):
return StoragePool(self._commcell_object, name, storage_pool_id=self._storage_pools[name])
else:
raise SDKException('StoragePool', '103')
def hyperscale_create_storage_pool(self, storage_pool_name, media_agents):
"""
Create new storage pool for hyperscale
Args:
storage_pool_name (string) -- Name of the storage pools to create
media_agents (List) -- List of 3 media agents with name's(str)
or instance of media agent's(object)
Example: ["ma1","ma2","ma3"]
Return:
flag, response -- response returned by the REST API call
"""
if not isinstance(media_agents, list):
raise SDKException('Storage', '101')
if not isinstance(storage_pool_name, str):
raise SDKException('Storage', '101')
mediagent_obj = []
for media_agent in media_agents:
if isinstance(media_agent, MediaAgent):
mediagent_obj.append(media_agent)
elif isinstance(media_agent, str):
mediagent_obj.append(self._commcell_object.media_agents.get(media_agent))
else:
raise SDKException('Storage', '103')
if len(mediagent_obj) <= 2:
raise SDKException('Storage', '102', "minimum 3 media agents are required")
request_xml = """<App_CreateStoragePolicyReq storagePolicyName="{0}" copyName="{0}_Primary" type="1"
numberOfCopies="1">
<storagePolicyCopyInfo>
<storagePolicyFlags scaleOutStoragePolicy="1"/>
</storagePolicyCopyInfo>
<storage>
<mediaAgent mediaAgentId="{4}" mediaAgentName="{1}" displayName="{1}"/>
</storage>
<storage>
<mediaAgent mediaAgentId="{5}" mediaAgentName="{2}" displayName="{2}"/>
</storage>
<storage>
<mediaAgent mediaAgentId="{6}" mediaAgentName="{3}" displayName="{3}"/>
</storage>
<scaleoutConfiguration configurationType="1"/>
</App_CreateStoragePolicyReq>
""".format(storage_pool_name, mediagent_obj[0].media_agent_name,
mediagent_obj[1].media_agent_name, mediagent_obj[2].media_agent_name,
mediagent_obj[0].media_agent_id, mediagent_obj[1].media_agent_id,
mediagent_obj[2].media_agent_id)
flag, response = self._commcell_object._cvpysdk_object.make_request(
'POST', self._add_storage_pool_api, request_xml
)
if flag:
if response.json():
error_code = response.json()['error']['errorCode']
if int(error_code) != 0:
error_message = response.json()['error']['errorMessage']
o_str = 'Failed to create storage pool\nError: "{0}"'
raise SDKException('StoragePool', '102', o_str.format(error_message))
else:
raise SDKException('Response', '102')
else:
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
self.refresh()
return self.get(storage_pool_name)
def add(self, storage_pool_name, mountpath, media_agent, ddb_ma, dedup_path):
"""
Adds a new storage pool to commcell
Args:
storage_pool_name (str) -- name of new storage pool to add
mountpath (str) -- mount path for the storage pool
media_agent (str/object)-- name or instance of media agent
ddb_ma (str/object)-- name or instance of dedupe media agent
dedup_path (str) -- path where the DDB should be stored
Returns:
StoragePool object if creation is successful
Raises:
Exception if creation is unsuccessful
"""
# from urllib.parse import urlencode
if ((dedup_path is not None and not isinstance(dedup_path, str)) or
not (isinstance(storage_pool_name, str) or not isinstance(mountpath, str))):
raise SDKException('Storage', '101')
# if isinstance(library, DiskLibrary):
# disk_library = library
# elif isinstance(library, str):
# disk_library = DiskLibrary(self._commcell_object, library)
# else:
# raise SDKException('Storage', '104')
if isinstance(media_agent, MediaAgent):
media_agent = media_agent
elif isinstance(media_agent, str):
media_agent = MediaAgent(self._commcell_object, media_agent)
else:
raise SDKException('Storage', '103')
if isinstance(ddb_ma, MediaAgent):
ddb_ma = ddb_ma
elif isinstance(ddb_ma, str):
ddb_ma = MediaAgent(self._commcell_object, ddb_ma)
else:
raise SDKException('Storage', '103')
request_json = {
"storagePolicyName": storage_pool_name,
"type": 1,
"copyName": "Primary",
"numberOfCopies": 1,
"storage": [
{
"path": mountpath,
"mediaAgent": {
"mediaAgentId": int(media_agent.media_agent_id),
"mediaAgentName": media_agent.media_agent_name
},
"credentials": {}
}
],
"storagePolicyCopyInfo": {
"copyType": 1,
"isFromGui": True,
"active": 1,
"isDefault": 1,
"dedupeFlags": {
"enableDASHFull": 1,
"hostGlobalDedupStore": 1,
"enableDeduplication": 1
},
"storagePolicyFlags": {
"blockLevelDedup": 1,
"enableGlobalDeduplication": 1
},
"DDBPartitionInfo": {
"maInfoList": [
{
"mediaAgent": {
"mediaAgentId": int(ddb_ma.media_agent_id),
"mediaAgentName": ddb_ma.media_agent_name
},
"subStoreList": [
{
"accessPath": {
"path": dedup_path
}
}
]
}
]
},
"library": {
"libraryName": mountpath,
},
"mediaAgent": {
"mediaAgentId": int(media_agent.media_agent_id),
"mediaAgentName": media_agent.media_agent_name
}
}
}
flag, response = self._commcell_object._cvpysdk_object.make_request(
'POST', self._add_storage_pool_api, request_json
)
if flag:
if response.json():
error_code = response.json()['error']['errorCode']
if int(error_code) != 0:
error_message = response.json()['error']['errorMessage']
o_str = 'Failed to create storage policy\nError: "{0}"'
raise SDKException('StoragePool', '102', o_str.format(error_message))
else:
raise SDKException('Response', '102')
else:
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
self.refresh()
return self.get(storage_pool_name)
def add_azure_storage_pool(self, storage_pool_name, container_name, media_agents, dedup_paths, **kwargs):
""" Adds new storage pool with provided name to the commcell
Args:
storage_pool_name (str) -- name of the storage pool to be created
container_name (str) -- container name to be used with storage pool
media_agents (list) -- list of media agent names to be used for storage pool
dedup_paths (list) -- list of paths for storing deduplication data
**kwargs (dict) -- dict of keyword arguments as follows
username (str) -- azure storage credential username
password (str) -- azure storage credential password
credential_name (str) -- Credential name to be used
Returns:
Azure storage policy object
Raises:
SDKException:
If invalid type arguments are passed
If Storage Pool with given name already exist
Response was not success.
Response was empty.
"""
username = kwargs.get("username", "")
password = kwargs.get("password", "")
credential_name = kwargs.get("credential_name", "")
if not (isinstance(storage_pool_name, str) and isinstance(container_name, str)
and isinstance(media_agents, list) and isinstance(dedup_paths, list)
and isinstance(username, str) and isinstance(password, str)
and isinstance(credential_name, str)):
raise SDKException('StoragePool', '101')
storage_pools = self._commcell_object.storage_pools
if storage_pools.has_storage_pool(storage_pool_name):
raise SDKException('StoragePool', '103')
request_json = copy.deepcopy(StoragePoolConstants.AZURE_STORAGE_REQ_JSON)
request_json["storagePolicyName"] = storage_pool_name
storage_policy_info = request_json["storagePolicyCopyInfo"]
storage_ma = self._commcell_object.media_agents.get(media_agents[0])
storage_policy_info["library"]["libraryName"] = container_name
storage_policy_info["mediaAgent"]["mediaAgentId"] = int(storage_ma.media_agent_id)
storage_policy_info["mediaAgent"]["mediaAgentName"] = storage_ma.media_agent_name
ddb_info = []
for (ma, ddb_path) in zip(media_agents, dedup_paths):
ma_ddb = copy.deepcopy(StoragePoolConstants.MA_INFO_LIST)
ma_info = self._commcell_object.media_agents.get(ma)
ma_ddb["mediaAgent"]["mediaAgentId"] = int(ma_info.media_agent_id)
ma_ddb["mediaAgent"]["mediaAgentName"] = ma_info.media_agent_name
ma_ddb["subStoreList"][0]["accessPath"]["path"] = ddb_path
ddb_info.append(ma_ddb)
storage_policy_info["DDBPartitionInfo"]["maInfoList"] = ddb_info
storage_info = request_json["storage"][0]
storage_info["path"] = container_name
storage_info["mediaAgent"]["mediaAgentId"] = int(storage_ma.media_agent_id)
storage_info["mediaAgent"]["mediaAgentName"] = storage_ma.media_agent_name
storage_info["credentials"]["userName"] = username
storage_info["credentials"]["password"] = password
credential = self._commcell_object.credentials.get(credential_name)
storage_info["savedCredential"]["credentialId"] = credential.credential_id
storage_info["savedCredential"]["credentialName"] = credential.credential_name
flag, response = self._commcell_object._cvpysdk_object.make_request(
'POST', self._add_storage_pool_api, request_json
)
if flag:
if response.json():
error_code = response.json().get('error', {}).get('errorCode', 0)
if int(error_code) != 0:
error_message = response.json()['error']['errorMessage']
o_str = 'Failed to create storage policy\nError: "{0}"'
raise SDKException('StoragePool', '102', o_str.format(error_message))
else:
raise SDKException('Response', '102')
else:
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
self.refresh()
return self.get(request_json["storagePolicyName"])
def delete(self, storage_pool_name):
"""deletes the specified storage pool.
Args:
storage_pool_name (str) -- name of the storage pool to delete
Raises:
SDKException:
if type of the storage pool name is not string
if failed to delete storage pool
if no storage pool exists with the given name
if response is empty
if response is not success
"""
if not isinstance(storage_pool_name, str):
raise SDKException('Storage', '101')
else:
storage_pool_name = storage_pool_name.lower()
if self.has_storage_pool(storage_pool_name):
storage_pool_id = self._storage_pools[storage_pool_name]
delete_storage_pool = self._services['DELETE_STORAGE_POOL'] % (storage_pool_id)
flag, response = self._cvpysdk_object.make_request('DELETE', delete_storage_pool)
if flag:
error_code = response.json()['error']['errorCode']
if int(error_code) != 0:
error_message = response.json()['error']['errorMessage']
o_str = f'Failed to delete storage pools {storage_pool_name}'
o_str += '\nError: "{0}"'.format(error_message)
raise SDKException('Storage', '102', o_str)
else:
# initialize the storage pool again
# so the storage pool object has all the storage pools
self.refresh()
# as part of storage pool we might delete library so initialize the libraries again
self._commcell_object.disk_libraries.refresh()
else:
response_string = self._update_response_(response.text)
raise SDKException('Response', '101', response_string)
else:
raise SDKException(
'Storage',
'102',
'No storage pool exists with name: {0}'.format(storage_pool_name)
)
def refresh(self):
"""Refresh the list of storage pools associated to the Commcell."""
self._storage_pools = self._get_storage_pools()
class StoragePool(object):
"""Class for individual storage pools"""
def __init__(self, commcell_object, storage_pool_name, storage_pool_id=None):
"""
Intitalise the Storage Pool classs instance
Args:
commcell_object (object) --instance of the Commcell class
storage_pool_name (string) -- Name of the storage pool
storage_pool_id (int) -- Storage pool id
Returns:
object - Instance of the StoragePool class
"""
self._storage_pool_name = storage_pool_name.lower()
self._commcell_object = commcell_object
self._storage_pool_properties = None
self._storage_pool_id = None
if storage_pool_id:
self._storage_pool_id = str(storage_pool_id)
else:
self._storage_pool_id = self._commcell_object.storage_pools.get(self._storage_pool_name).storage_pool_id
self._STORAGE_POOL = self._commcell_object._services['GET_STORAGE_POOL'] % (self.storage_pool_id)
self.refresh()
def __repr__(self):
"""String representation of the instance of this class"""
representation_string = "Storage Pool class Instance for {0}".format(self._storage_pool_name)
return representation_string
def _get_storage_pool_properties(self):
"""
Gets StoragePool properties
Raises:
SDKException:
if repsonse is empty
if response is not success
"""
flag, response = self._commcell_object._cvpysdk_object.make_request('GET', self._STORAGE_POOL)
if flag:
if response.json():
self._storage_pool_properties = response.json()
else:
raise SDKException('Response', '102')
else:
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
@property
def storage_pool_name(self):
"""Treats the storage_policy_name as a read only attribute"""
return self._storage_pool_name
@property
def storage_pool_id(self):
"""Treats id as a read only attribute"""
return self._storage_pool_id
@property
def storage_pool_properties(self):
"""Treats the storage_pool_properties as a read only attribute"""
return self._storage_pool_properties
@property
def global_policy_name(self):
"""Returns the global policy corresponding to the storage pool"""
return self._storage_pool_properties["storagePoolDetails"]["copyInfo"]["StoragePolicyCopy"]["storagePolicyName"]
def hyperscale_add_nodes(self, media_agents):
"""
Add 3 new nodes to an existing storage pool
args:
media_agents (List) -- List of 3 media agents with name's(str)
or instance of media agent's(object)
Example: ["ma1","ma2","ma3"]
Raises:
SDKException:
if add nodes to an existing storage pool fails
"""
if not isinstance(media_agents, list):
raise SDKException('Storage', '101')
mediagent_obj = []
for media_agent in media_agents:
if isinstance(media_agent, MediaAgent):
mediagent_obj.append(media_agent)
elif isinstance(media_agent, str):
mediagent_obj.append(self._commcell_object.media_agents.get(media_agent))
else:
raise SDKException('Storage', '103')
if len(mediagent_obj) <= 2:
raise SDKException('Storage', '102', "Minimum 3 MediaAgents required")
request_json = {
"scaleoutOperationType": 2,
"StoragePolicy": {
"storagePolicyName": "{0}".format(self.storage_pool_name),
},
"storage": [
{
"mediaAgent": {
"displayName": "{0}".format(mediagent_obj[0].media_agent_id),
"mediaAgentName": "{0}".format(mediagent_obj[0].media_agent_name)
}
},
{
"mediaAgent": {
"displayName": "{0}".format(mediagent_obj[1].media_agent_id),
"mediaAgentName": "{0}".format(mediagent_obj[1].media_agent_name)
}
},
{
"mediaAgent": {
"displayName": "{0}".format(mediagent_obj[2].media_agent_id),
"mediaAgentName": "{0}".format(mediagent_obj[2].media_agent_name)
}
}
],
"scaleoutConfiguration": {
"configurationType": 1
}
}
self._edit_storage_pool_api = self._commcell_object._services[
'EDIT_STORAGE_POOL']
flag, response = self._commcell_object._cvpysdk_object.make_request(
'POST', self._edit_storage_pool_api, request_json
)
if flag:
if response.json():
error_code = response.json()['errorCode']
if int(error_code) != 0:
error_message = response.json()['errorMessage']
o_str = 'Failed to add nodes to storage pool\nError: "{0}"'
raise SDKException('StoragePool', '102', o_str.format(error_message))
else:
raise SDKException('Response', '102')
else:
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
self.refresh()
def hyperscale_reconfigure_storage_pool(self, storage_pool_name):
"""
Reconfigures storage pool, for any failure during creation and expansion
args:
storage_pool_name (string) -- Name of the storage pools to reconfigure
Raises:
SDKException:
if reconfigure fails
"""
if not isinstance(storage_pool_name, str):
raise SDKException('Storage', '101')
request_json = {
"scaleoutOperationType": 4,
"StoragePolicy":
{
"storagePolicyName": "{0}".format(storage_pool_name),
"storagePolicyId": int("{0}".format(self.storage_pool_id))
}
}
self._edit_storage_pool_api = self._commcell_object._services[
'EDIT_STORAGE_POOL']
flag, response = self._commcell_object._cvpysdk_object.make_request(
'POST', self._edit_storage_pool_api, request_json
)
if flag:
if response.json():
error_code = response.json()['errorCode']
if int(error_code) != 0:
error_message = response.json()['errorMessage']
o_str = 'Failed to reconfigure storage pool\nError: "{0}"'
raise SDKException('StoragePool', '102', o_str.format(error_message))
else:
raise SDKException('Response', '102')
else:
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
self.refresh()
def hyperscale_replace_disk(self, disk_id, media_agent, storage_pool_name):
"""
Replace disk action, over a media agent which is part of storage pool
args:
disk_id (int) --> disk id for the disk to replace
media_agent (string/object) --> media agent name/ object
storage_pool_name (string) --> Name of the storage pools for replacemnet of disk
Raises:
SDKException:
if replace fails
"""
if isinstance(disk_id, str):
disk_id = int(disk_id)
elif not isinstance(disk_id, int):
raise SDKException('Storage', '101')
media_agent_obj = None
if isinstance(media_agent, str):
media_agent_obj = self._commcell_object.media_agents.get(media_agent)
elif isinstance(media_agent, MediaAgent):
media_agent_obj = media_agent
else:
raise SDKException('Storage', '103')
if not isinstance(storage_pool_name, str):
raise SDKException('Storage', '101')
request_json = {
"driveId": int("{0}".format(disk_id)),
"operationType": 1,
"mediaAgent": {
"_type_": 11,
"mediaAgentId": int("{0}".format(media_agent_obj.media_agent_id)),
"mediaAgentName": "{0}".format(media_agent_obj.media_agent_name)
},
"scaleoutStoragePool": {
"_type_": 160,
"storagePoolId": int("{0}".format(self.storage_pool_id)),
"storagePoolName": "{0}".format(self.storage_pool_name)
}
}
self._replace_disk_storage_pool_api = self._commcell_object._services[
'REPLACE_DISK_STORAGE_POOL']
flag, response = self._commcell_object._cvpysdk_object.make_request(
'POST', self._replace_disk_storage_pool_api, request_json
)
if flag:
if response.json():
error_code = response.json()['errorCode']
if int(error_code) != 0:
error_message = response.json()['errorMessage']
o_str = 'Failed to replace disk\nError: "{0}"'
raise SDKException('StoragePool', '102', o_str.format(error_message))
else:
raise SDKException('Response', '102')
else:
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
self.refresh()
def refresh(self):
"""Refreshes propery of the class object"""
self._get_storage_pool_properties()
def update_security_associations(self, associations_list, isUser=True, request_type=None, externalGroup=False):
"""
Adds the security association on the storage pool object
Args:
associations_list (list) -- list of users to be associated
Example:
associations_list = [
{
'user_name': user1,
'role_name': role1
},
{
'user_name': user2,
'role_name': role2
}
]
isUser (bool) -- True or False. set isUser = False, If associations_list made up of user groups
request_type (str) -- eg : 'OVERWRITE' or 'UPDATE' or 'DELETE', Default will be OVERWRITE operation
externalGroup (bool) -- True or False, set externalGroup = True. If Security associations is being done on External User Groups
Raises:
SDKException:
if association is not of List type
"""
if not isinstance(associations_list, list):
raise SDKException('StoragePool', '101')
SecurityAssociation(self._commcell_object, self)._add_security_association(associations_list,
user=isUser,
request_type=request_type,
externalGroup=externalGroup)
Classes
class StoragePool (commcell_object, storage_pool_name, storage_pool_id=None)
-
Class for individual storage pools
Intitalise the Storage Pool classs instance
Args
commcell_object (object) –instance of the Commcell class
storage_pool_name (string) – Name of the storage pool
storage_pool_id (int) – Storage pool id
Returns
object - Instance of the StoragePool class
Expand source code Browse git
class StoragePool(object): """Class for individual storage pools""" def __init__(self, commcell_object, storage_pool_name, storage_pool_id=None): """ Intitalise the Storage Pool classs instance Args: commcell_object (object) --instance of the Commcell class storage_pool_name (string) -- Name of the storage pool storage_pool_id (int) -- Storage pool id Returns: object - Instance of the StoragePool class """ self._storage_pool_name = storage_pool_name.lower() self._commcell_object = commcell_object self._storage_pool_properties = None self._storage_pool_id = None if storage_pool_id: self._storage_pool_id = str(storage_pool_id) else: self._storage_pool_id = self._commcell_object.storage_pools.get(self._storage_pool_name).storage_pool_id self._STORAGE_POOL = self._commcell_object._services['GET_STORAGE_POOL'] % (self.storage_pool_id) self.refresh() def __repr__(self): """String representation of the instance of this class""" representation_string = "Storage Pool class Instance for {0}".format(self._storage_pool_name) return representation_string def _get_storage_pool_properties(self): """ Gets StoragePool properties Raises: SDKException: if repsonse is empty if response is not success """ flag, response = self._commcell_object._cvpysdk_object.make_request('GET', self._STORAGE_POOL) if flag: if response.json(): self._storage_pool_properties = response.json() else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) @property def storage_pool_name(self): """Treats the storage_policy_name as a read only attribute""" return self._storage_pool_name @property def storage_pool_id(self): """Treats id as a read only attribute""" return self._storage_pool_id @property def storage_pool_properties(self): """Treats the storage_pool_properties as a read only attribute""" return self._storage_pool_properties @property def global_policy_name(self): """Returns the global policy corresponding to the storage pool""" return self._storage_pool_properties["storagePoolDetails"]["copyInfo"]["StoragePolicyCopy"]["storagePolicyName"] def hyperscale_add_nodes(self, media_agents): """ Add 3 new nodes to an existing storage pool args: media_agents (List) -- List of 3 media agents with name's(str) or instance of media agent's(object) Example: ["ma1","ma2","ma3"] Raises: SDKException: if add nodes to an existing storage pool fails """ if not isinstance(media_agents, list): raise SDKException('Storage', '101') mediagent_obj = [] for media_agent in media_agents: if isinstance(media_agent, MediaAgent): mediagent_obj.append(media_agent) elif isinstance(media_agent, str): mediagent_obj.append(self._commcell_object.media_agents.get(media_agent)) else: raise SDKException('Storage', '103') if len(mediagent_obj) <= 2: raise SDKException('Storage', '102', "Minimum 3 MediaAgents required") request_json = { "scaleoutOperationType": 2, "StoragePolicy": { "storagePolicyName": "{0}".format(self.storage_pool_name), }, "storage": [ { "mediaAgent": { "displayName": "{0}".format(mediagent_obj[0].media_agent_id), "mediaAgentName": "{0}".format(mediagent_obj[0].media_agent_name) } }, { "mediaAgent": { "displayName": "{0}".format(mediagent_obj[1].media_agent_id), "mediaAgentName": "{0}".format(mediagent_obj[1].media_agent_name) } }, { "mediaAgent": { "displayName": "{0}".format(mediagent_obj[2].media_agent_id), "mediaAgentName": "{0}".format(mediagent_obj[2].media_agent_name) } } ], "scaleoutConfiguration": { "configurationType": 1 } } self._edit_storage_pool_api = self._commcell_object._services[ 'EDIT_STORAGE_POOL'] flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._edit_storage_pool_api, request_json ) if flag: if response.json(): error_code = response.json()['errorCode'] if int(error_code) != 0: error_message = response.json()['errorMessage'] o_str = 'Failed to add nodes to storage pool\nError: "{0}"' raise SDKException('StoragePool', '102', o_str.format(error_message)) else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) self.refresh() def hyperscale_reconfigure_storage_pool(self, storage_pool_name): """ Reconfigures storage pool, for any failure during creation and expansion args: storage_pool_name (string) -- Name of the storage pools to reconfigure Raises: SDKException: if reconfigure fails """ if not isinstance(storage_pool_name, str): raise SDKException('Storage', '101') request_json = { "scaleoutOperationType": 4, "StoragePolicy": { "storagePolicyName": "{0}".format(storage_pool_name), "storagePolicyId": int("{0}".format(self.storage_pool_id)) } } self._edit_storage_pool_api = self._commcell_object._services[ 'EDIT_STORAGE_POOL'] flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._edit_storage_pool_api, request_json ) if flag: if response.json(): error_code = response.json()['errorCode'] if int(error_code) != 0: error_message = response.json()['errorMessage'] o_str = 'Failed to reconfigure storage pool\nError: "{0}"' raise SDKException('StoragePool', '102', o_str.format(error_message)) else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) self.refresh() def hyperscale_replace_disk(self, disk_id, media_agent, storage_pool_name): """ Replace disk action, over a media agent which is part of storage pool args: disk_id (int) --> disk id for the disk to replace media_agent (string/object) --> media agent name/ object storage_pool_name (string) --> Name of the storage pools for replacemnet of disk Raises: SDKException: if replace fails """ if isinstance(disk_id, str): disk_id = int(disk_id) elif not isinstance(disk_id, int): raise SDKException('Storage', '101') media_agent_obj = None if isinstance(media_agent, str): media_agent_obj = self._commcell_object.media_agents.get(media_agent) elif isinstance(media_agent, MediaAgent): media_agent_obj = media_agent else: raise SDKException('Storage', '103') if not isinstance(storage_pool_name, str): raise SDKException('Storage', '101') request_json = { "driveId": int("{0}".format(disk_id)), "operationType": 1, "mediaAgent": { "_type_": 11, "mediaAgentId": int("{0}".format(media_agent_obj.media_agent_id)), "mediaAgentName": "{0}".format(media_agent_obj.media_agent_name) }, "scaleoutStoragePool": { "_type_": 160, "storagePoolId": int("{0}".format(self.storage_pool_id)), "storagePoolName": "{0}".format(self.storage_pool_name) } } self._replace_disk_storage_pool_api = self._commcell_object._services[ 'REPLACE_DISK_STORAGE_POOL'] flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._replace_disk_storage_pool_api, request_json ) if flag: if response.json(): error_code = response.json()['errorCode'] if int(error_code) != 0: error_message = response.json()['errorMessage'] o_str = 'Failed to replace disk\nError: "{0}"' raise SDKException('StoragePool', '102', o_str.format(error_message)) else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) self.refresh() def refresh(self): """Refreshes propery of the class object""" self._get_storage_pool_properties() def update_security_associations(self, associations_list, isUser=True, request_type=None, externalGroup=False): """ Adds the security association on the storage pool object Args: associations_list (list) -- list of users to be associated Example: associations_list = [ { 'user_name': user1, 'role_name': role1 }, { 'user_name': user2, 'role_name': role2 } ] isUser (bool) -- True or False. set isUser = False, If associations_list made up of user groups request_type (str) -- eg : 'OVERWRITE' or 'UPDATE' or 'DELETE', Default will be OVERWRITE operation externalGroup (bool) -- True or False, set externalGroup = True. If Security associations is being done on External User Groups Raises: SDKException: if association is not of List type """ if not isinstance(associations_list, list): raise SDKException('StoragePool', '101') SecurityAssociation(self._commcell_object, self)._add_security_association(associations_list, user=isUser, request_type=request_type, externalGroup=externalGroup)
Instance variables
var global_policy_name
-
Returns the global policy corresponding to the storage pool
Expand source code Browse git
@property def global_policy_name(self): """Returns the global policy corresponding to the storage pool""" return self._storage_pool_properties["storagePoolDetails"]["copyInfo"]["StoragePolicyCopy"]["storagePolicyName"]
var storage_pool_id
-
Treats id as a read only attribute
Expand source code Browse git
@property def storage_pool_id(self): """Treats id as a read only attribute""" return self._storage_pool_id
var storage_pool_name
-
Treats the storage_policy_name as a read only attribute
Expand source code Browse git
@property def storage_pool_name(self): """Treats the storage_policy_name as a read only attribute""" return self._storage_pool_name
var storage_pool_properties
-
Treats the storage_pool_properties as a read only attribute
Expand source code Browse git
@property def storage_pool_properties(self): """Treats the storage_pool_properties as a read only attribute""" return self._storage_pool_properties
Methods
def hyperscale_add_nodes(self, media_agents)
-
Add 3 new nodes to an existing storage pool
args: media_agents (List) – List of 3 media agents with name's(str) or instance of media agent's(object)
Example: ["ma1","ma2","ma3"]
Raises
SDKException: if add nodes to an existing storage pool fails
Expand source code Browse git
def hyperscale_add_nodes(self, media_agents): """ Add 3 new nodes to an existing storage pool args: media_agents (List) -- List of 3 media agents with name's(str) or instance of media agent's(object) Example: ["ma1","ma2","ma3"] Raises: SDKException: if add nodes to an existing storage pool fails """ if not isinstance(media_agents, list): raise SDKException('Storage', '101') mediagent_obj = [] for media_agent in media_agents: if isinstance(media_agent, MediaAgent): mediagent_obj.append(media_agent) elif isinstance(media_agent, str): mediagent_obj.append(self._commcell_object.media_agents.get(media_agent)) else: raise SDKException('Storage', '103') if len(mediagent_obj) <= 2: raise SDKException('Storage', '102', "Minimum 3 MediaAgents required") request_json = { "scaleoutOperationType": 2, "StoragePolicy": { "storagePolicyName": "{0}".format(self.storage_pool_name), }, "storage": [ { "mediaAgent": { "displayName": "{0}".format(mediagent_obj[0].media_agent_id), "mediaAgentName": "{0}".format(mediagent_obj[0].media_agent_name) } }, { "mediaAgent": { "displayName": "{0}".format(mediagent_obj[1].media_agent_id), "mediaAgentName": "{0}".format(mediagent_obj[1].media_agent_name) } }, { "mediaAgent": { "displayName": "{0}".format(mediagent_obj[2].media_agent_id), "mediaAgentName": "{0}".format(mediagent_obj[2].media_agent_name) } } ], "scaleoutConfiguration": { "configurationType": 1 } } self._edit_storage_pool_api = self._commcell_object._services[ 'EDIT_STORAGE_POOL'] flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._edit_storage_pool_api, request_json ) if flag: if response.json(): error_code = response.json()['errorCode'] if int(error_code) != 0: error_message = response.json()['errorMessage'] o_str = 'Failed to add nodes to storage pool\nError: "{0}"' raise SDKException('StoragePool', '102', o_str.format(error_message)) else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) self.refresh()
def hyperscale_reconfigure_storage_pool(self, storage_pool_name)
-
Reconfigures storage pool, for any failure during creation and expansion
args: storage_pool_name (string) – Name of the storage pools to reconfigure
Raises
SDKException: if reconfigure fails
Expand source code Browse git
def hyperscale_reconfigure_storage_pool(self, storage_pool_name): """ Reconfigures storage pool, for any failure during creation and expansion args: storage_pool_name (string) -- Name of the storage pools to reconfigure Raises: SDKException: if reconfigure fails """ if not isinstance(storage_pool_name, str): raise SDKException('Storage', '101') request_json = { "scaleoutOperationType": 4, "StoragePolicy": { "storagePolicyName": "{0}".format(storage_pool_name), "storagePolicyId": int("{0}".format(self.storage_pool_id)) } } self._edit_storage_pool_api = self._commcell_object._services[ 'EDIT_STORAGE_POOL'] flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._edit_storage_pool_api, request_json ) if flag: if response.json(): error_code = response.json()['errorCode'] if int(error_code) != 0: error_message = response.json()['errorMessage'] o_str = 'Failed to reconfigure storage pool\nError: "{0}"' raise SDKException('StoragePool', '102', o_str.format(error_message)) else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) self.refresh()
def hyperscale_replace_disk(self, disk_id, media_agent, storage_pool_name)
-
Replace disk action, over a media agent which is part of storage pool args: disk_id (int) –> disk id for the disk to replace media_agent (string/object) –> media agent name/ object storage_pool_name (string) –> Name of the storage pools for replacemnet of disk Raises: SDKException: if replace fails
Expand source code Browse git
def hyperscale_replace_disk(self, disk_id, media_agent, storage_pool_name): """ Replace disk action, over a media agent which is part of storage pool args: disk_id (int) --> disk id for the disk to replace media_agent (string/object) --> media agent name/ object storage_pool_name (string) --> Name of the storage pools for replacemnet of disk Raises: SDKException: if replace fails """ if isinstance(disk_id, str): disk_id = int(disk_id) elif not isinstance(disk_id, int): raise SDKException('Storage', '101') media_agent_obj = None if isinstance(media_agent, str): media_agent_obj = self._commcell_object.media_agents.get(media_agent) elif isinstance(media_agent, MediaAgent): media_agent_obj = media_agent else: raise SDKException('Storage', '103') if not isinstance(storage_pool_name, str): raise SDKException('Storage', '101') request_json = { "driveId": int("{0}".format(disk_id)), "operationType": 1, "mediaAgent": { "_type_": 11, "mediaAgentId": int("{0}".format(media_agent_obj.media_agent_id)), "mediaAgentName": "{0}".format(media_agent_obj.media_agent_name) }, "scaleoutStoragePool": { "_type_": 160, "storagePoolId": int("{0}".format(self.storage_pool_id)), "storagePoolName": "{0}".format(self.storage_pool_name) } } self._replace_disk_storage_pool_api = self._commcell_object._services[ 'REPLACE_DISK_STORAGE_POOL'] flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._replace_disk_storage_pool_api, request_json ) if flag: if response.json(): error_code = response.json()['errorCode'] if int(error_code) != 0: error_message = response.json()['errorMessage'] o_str = 'Failed to replace disk\nError: "{0}"' raise SDKException('StoragePool', '102', o_str.format(error_message)) else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) self.refresh()
def refresh(self)
-
Refreshes propery of the class object
Expand source code Browse git
def refresh(self): """Refreshes propery of the class object""" self._get_storage_pool_properties()
def update_security_associations(self, associations_list, isUser=True, request_type=None, externalGroup=False)
-
Adds the security association on the storage pool object
Args
associations_list (list) – list of users to be associated Example: associations_list = [ { 'user_name': user1, 'role_name': role1 }, { 'user_name': user2, 'role_name': role2 } ]
isUser (bool) – True or False. set isUser = False, If associations_list made up of user groups request_type (str) – eg : 'OVERWRITE' or 'UPDATE' or 'DELETE', Default will be OVERWRITE operation externalGroup (bool) – True or False, set externalGroup = True. If Security associations is being done on External User Groups
Raises
SDKException: if association is not of List type
Expand source code Browse git
def update_security_associations(self, associations_list, isUser=True, request_type=None, externalGroup=False): """ Adds the security association on the storage pool object Args: associations_list (list) -- list of users to be associated Example: associations_list = [ { 'user_name': user1, 'role_name': role1 }, { 'user_name': user2, 'role_name': role2 } ] isUser (bool) -- True or False. set isUser = False, If associations_list made up of user groups request_type (str) -- eg : 'OVERWRITE' or 'UPDATE' or 'DELETE', Default will be OVERWRITE operation externalGroup (bool) -- True or False, set externalGroup = True. If Security associations is being done on External User Groups Raises: SDKException: if association is not of List type """ if not isinstance(associations_list, list): raise SDKException('StoragePool', '101') SecurityAssociation(self._commcell_object, self)._add_security_association(associations_list, user=isUser, request_type=request_type, externalGroup=externalGroup)
class StoragePools (commcell_object)
-
Class for doing operations on Storage Pools, like get storage poo ID.
Initializes instance of the StoragePools class to perform operations on a storage pool.
Args
commcell_object (object) – instance of the Commcell class
Returns
object - instance of the StoragePools class
Expand source code Browse git
class StoragePools: """Class for doing operations on Storage Pools, like get storage poo ID.""" def __init__(self, commcell_object): """Initializes instance of the StoragePools class to perform operations on a storage pool. Args: commcell_object (object) -- instance of the Commcell class Returns: object - instance of the StoragePools class """ self._commcell_object = commcell_object self._cvpysdk_object = commcell_object._cvpysdk_object self._services = commcell_object._services self._update_response_ = commcell_object._update_response_ self._add_storage_pool_api = self._services['ADD_STORAGE_POOL'] self._storage_pools_api = self._services['STORAGE_POOL'] self._storage_pools = None self.refresh() def __str__(self): """Representation string consisting of all storage pools present in the Commcell. Returns: str - string of all the storage pools associated with the commcell """ representation_string = '{:^5}\t{:^40}\n\n'.format('S. No.', 'Storage Pool') for index, storage_pool in enumerate(self._storage_pools): sub_str = '{:^5}\t{:40}\n'.format(index + 1, storage_pool) representation_string += sub_str return representation_string.strip() def __repr__(self): """Returns the string representation of an instance of this class.""" return "StoragePools class instance for Commcell: '{0}'".format( self._commcell_object.commserv_name ) def __len__(self): """Returns the number of the storage pools added to the Commcell.""" return len(self.all_storage_pools) def __getitem__(self, value): """Returns the name of the storage pool for the given storage pool ID or the details of the storage pool for given storage pool Name. Args: value (str / int) -- Name or ID of the storage pool Returns: str - name of the storage pool, if the storage pool id was given dict - dict of details of the storage pool, if storage pool name was given Raises: IndexError: no storage pool exists with the given Name / Id """ value = str(value) if value in self.all_storage_pools: return self.all_storage_pools[value] else: try: return list(filter(lambda x: x[1]['id'] == value, self.all_storage_pools.items()))[0][0] except IndexError: raise IndexError('No storage pool exists with the given Name / Id') def _get_storage_pools(self): """Gets all the storage pools associated with the Commcell environment. Returns: dict - consists of all storage pools added to the commcell { "storage_pool1_name": storage_pool1_id, "storage_pool2_name": storage_pool2_id } Raises: SDKException: if response is empty if response is not success """ headers = self._commcell_object._headers.copy() headers['Accept'] = 'application/xml' flag, response = self._cvpysdk_object.make_request( 'GET', self._storage_pools_api, headers=headers ) if flag: storage_pools = {} response = xmltodict.parse(response.text)['Api_GetStoragePoolListResp'] if response is None or response.get('storagePoolList') is None: storage_pool_list = [] else: storage_pool_list = response['storagePoolList'] if not isinstance(storage_pool_list, list): storage_pool_list = [storage_pool_list] if response: for pool in storage_pool_list: name = pool['storagePoolEntity']['@storagePoolName'].lower() storage_pool_id = pool['storagePoolEntity']['@storagePoolId'] storage_pools[name] = storage_pool_id return storage_pools else: response_string = self._update_response_(response.text) raise SDKException('Response', '101', response_string) @property def all_storage_pools(self): """Returns dict of all the storage pools on this commcell dict - consists of all storage pools added to the commcell { "storage_pool1_name": storage_pool1_id, "storage_pool2_name": storage_pool2_id } """ return self._storage_pools def has_storage_pool(self, name): """Checks if a storage pool exists in the Commcell with the input storage pool name. Args: name (str) -- name of the storage pool Returns: bool - boolean output whether the storage pool exists in the commcell or not """ return self._storage_pools and name.lower() in self._storage_pools def get(self, name): """Returns the id of the storage pool for the given storage pool name. Args: name (str) -- name of the storage pool to get the id of Returns: str - id of the storage pool for the given storage pool name Raises: SDKException: if no storage pool exists with the given name """ name = name.lower() if self.has_storage_pool(name): return StoragePool(self._commcell_object, name, storage_pool_id=self._storage_pools[name]) else: raise SDKException('StoragePool', '103') def hyperscale_create_storage_pool(self, storage_pool_name, media_agents): """ Create new storage pool for hyperscale Args: storage_pool_name (string) -- Name of the storage pools to create media_agents (List) -- List of 3 media agents with name's(str) or instance of media agent's(object) Example: ["ma1","ma2","ma3"] Return: flag, response -- response returned by the REST API call """ if not isinstance(media_agents, list): raise SDKException('Storage', '101') if not isinstance(storage_pool_name, str): raise SDKException('Storage', '101') mediagent_obj = [] for media_agent in media_agents: if isinstance(media_agent, MediaAgent): mediagent_obj.append(media_agent) elif isinstance(media_agent, str): mediagent_obj.append(self._commcell_object.media_agents.get(media_agent)) else: raise SDKException('Storage', '103') if len(mediagent_obj) <= 2: raise SDKException('Storage', '102', "minimum 3 media agents are required") request_xml = """<App_CreateStoragePolicyReq storagePolicyName="{0}" copyName="{0}_Primary" type="1" numberOfCopies="1"> <storagePolicyCopyInfo> <storagePolicyFlags scaleOutStoragePolicy="1"/> </storagePolicyCopyInfo> <storage> <mediaAgent mediaAgentId="{4}" mediaAgentName="{1}" displayName="{1}"/> </storage> <storage> <mediaAgent mediaAgentId="{5}" mediaAgentName="{2}" displayName="{2}"/> </storage> <storage> <mediaAgent mediaAgentId="{6}" mediaAgentName="{3}" displayName="{3}"/> </storage> <scaleoutConfiguration configurationType="1"/> </App_CreateStoragePolicyReq> """.format(storage_pool_name, mediagent_obj[0].media_agent_name, mediagent_obj[1].media_agent_name, mediagent_obj[2].media_agent_name, mediagent_obj[0].media_agent_id, mediagent_obj[1].media_agent_id, mediagent_obj[2].media_agent_id) flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._add_storage_pool_api, request_xml ) if flag: if response.json(): error_code = response.json()['error']['errorCode'] if int(error_code) != 0: error_message = response.json()['error']['errorMessage'] o_str = 'Failed to create storage pool\nError: "{0}"' raise SDKException('StoragePool', '102', o_str.format(error_message)) else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) self.refresh() return self.get(storage_pool_name) def add(self, storage_pool_name, mountpath, media_agent, ddb_ma, dedup_path): """ Adds a new storage pool to commcell Args: storage_pool_name (str) -- name of new storage pool to add mountpath (str) -- mount path for the storage pool media_agent (str/object)-- name or instance of media agent ddb_ma (str/object)-- name or instance of dedupe media agent dedup_path (str) -- path where the DDB should be stored Returns: StoragePool object if creation is successful Raises: Exception if creation is unsuccessful """ # from urllib.parse import urlencode if ((dedup_path is not None and not isinstance(dedup_path, str)) or not (isinstance(storage_pool_name, str) or not isinstance(mountpath, str))): raise SDKException('Storage', '101') # if isinstance(library, DiskLibrary): # disk_library = library # elif isinstance(library, str): # disk_library = DiskLibrary(self._commcell_object, library) # else: # raise SDKException('Storage', '104') if isinstance(media_agent, MediaAgent): media_agent = media_agent elif isinstance(media_agent, str): media_agent = MediaAgent(self._commcell_object, media_agent) else: raise SDKException('Storage', '103') if isinstance(ddb_ma, MediaAgent): ddb_ma = ddb_ma elif isinstance(ddb_ma, str): ddb_ma = MediaAgent(self._commcell_object, ddb_ma) else: raise SDKException('Storage', '103') request_json = { "storagePolicyName": storage_pool_name, "type": 1, "copyName": "Primary", "numberOfCopies": 1, "storage": [ { "path": mountpath, "mediaAgent": { "mediaAgentId": int(media_agent.media_agent_id), "mediaAgentName": media_agent.media_agent_name }, "credentials": {} } ], "storagePolicyCopyInfo": { "copyType": 1, "isFromGui": True, "active": 1, "isDefault": 1, "dedupeFlags": { "enableDASHFull": 1, "hostGlobalDedupStore": 1, "enableDeduplication": 1 }, "storagePolicyFlags": { "blockLevelDedup": 1, "enableGlobalDeduplication": 1 }, "DDBPartitionInfo": { "maInfoList": [ { "mediaAgent": { "mediaAgentId": int(ddb_ma.media_agent_id), "mediaAgentName": ddb_ma.media_agent_name }, "subStoreList": [ { "accessPath": { "path": dedup_path } } ] } ] }, "library": { "libraryName": mountpath, }, "mediaAgent": { "mediaAgentId": int(media_agent.media_agent_id), "mediaAgentName": media_agent.media_agent_name } } } flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._add_storage_pool_api, request_json ) if flag: if response.json(): error_code = response.json()['error']['errorCode'] if int(error_code) != 0: error_message = response.json()['error']['errorMessage'] o_str = 'Failed to create storage policy\nError: "{0}"' raise SDKException('StoragePool', '102', o_str.format(error_message)) else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) self.refresh() return self.get(storage_pool_name) def add_azure_storage_pool(self, storage_pool_name, container_name, media_agents, dedup_paths, **kwargs): """ Adds new storage pool with provided name to the commcell Args: storage_pool_name (str) -- name of the storage pool to be created container_name (str) -- container name to be used with storage pool media_agents (list) -- list of media agent names to be used for storage pool dedup_paths (list) -- list of paths for storing deduplication data **kwargs (dict) -- dict of keyword arguments as follows username (str) -- azure storage credential username password (str) -- azure storage credential password credential_name (str) -- Credential name to be used Returns: Azure storage policy object Raises: SDKException: If invalid type arguments are passed If Storage Pool with given name already exist Response was not success. Response was empty. """ username = kwargs.get("username", "") password = kwargs.get("password", "") credential_name = kwargs.get("credential_name", "") if not (isinstance(storage_pool_name, str) and isinstance(container_name, str) and isinstance(media_agents, list) and isinstance(dedup_paths, list) and isinstance(username, str) and isinstance(password, str) and isinstance(credential_name, str)): raise SDKException('StoragePool', '101') storage_pools = self._commcell_object.storage_pools if storage_pools.has_storage_pool(storage_pool_name): raise SDKException('StoragePool', '103') request_json = copy.deepcopy(StoragePoolConstants.AZURE_STORAGE_REQ_JSON) request_json["storagePolicyName"] = storage_pool_name storage_policy_info = request_json["storagePolicyCopyInfo"] storage_ma = self._commcell_object.media_agents.get(media_agents[0]) storage_policy_info["library"]["libraryName"] = container_name storage_policy_info["mediaAgent"]["mediaAgentId"] = int(storage_ma.media_agent_id) storage_policy_info["mediaAgent"]["mediaAgentName"] = storage_ma.media_agent_name ddb_info = [] for (ma, ddb_path) in zip(media_agents, dedup_paths): ma_ddb = copy.deepcopy(StoragePoolConstants.MA_INFO_LIST) ma_info = self._commcell_object.media_agents.get(ma) ma_ddb["mediaAgent"]["mediaAgentId"] = int(ma_info.media_agent_id) ma_ddb["mediaAgent"]["mediaAgentName"] = ma_info.media_agent_name ma_ddb["subStoreList"][0]["accessPath"]["path"] = ddb_path ddb_info.append(ma_ddb) storage_policy_info["DDBPartitionInfo"]["maInfoList"] = ddb_info storage_info = request_json["storage"][0] storage_info["path"] = container_name storage_info["mediaAgent"]["mediaAgentId"] = int(storage_ma.media_agent_id) storage_info["mediaAgent"]["mediaAgentName"] = storage_ma.media_agent_name storage_info["credentials"]["userName"] = username storage_info["credentials"]["password"] = password credential = self._commcell_object.credentials.get(credential_name) storage_info["savedCredential"]["credentialId"] = credential.credential_id storage_info["savedCredential"]["credentialName"] = credential.credential_name flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._add_storage_pool_api, request_json ) if flag: if response.json(): error_code = response.json().get('error', {}).get('errorCode', 0) if int(error_code) != 0: error_message = response.json()['error']['errorMessage'] o_str = 'Failed to create storage policy\nError: "{0}"' raise SDKException('StoragePool', '102', o_str.format(error_message)) else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) self.refresh() return self.get(request_json["storagePolicyName"]) def delete(self, storage_pool_name): """deletes the specified storage pool. Args: storage_pool_name (str) -- name of the storage pool to delete Raises: SDKException: if type of the storage pool name is not string if failed to delete storage pool if no storage pool exists with the given name if response is empty if response is not success """ if not isinstance(storage_pool_name, str): raise SDKException('Storage', '101') else: storage_pool_name = storage_pool_name.lower() if self.has_storage_pool(storage_pool_name): storage_pool_id = self._storage_pools[storage_pool_name] delete_storage_pool = self._services['DELETE_STORAGE_POOL'] % (storage_pool_id) flag, response = self._cvpysdk_object.make_request('DELETE', delete_storage_pool) if flag: error_code = response.json()['error']['errorCode'] if int(error_code) != 0: error_message = response.json()['error']['errorMessage'] o_str = f'Failed to delete storage pools {storage_pool_name}' o_str += '\nError: "{0}"'.format(error_message) raise SDKException('Storage', '102', o_str) else: # initialize the storage pool again # so the storage pool object has all the storage pools self.refresh() # as part of storage pool we might delete library so initialize the libraries again self._commcell_object.disk_libraries.refresh() else: response_string = self._update_response_(response.text) raise SDKException('Response', '101', response_string) else: raise SDKException( 'Storage', '102', 'No storage pool exists with name: {0}'.format(storage_pool_name) ) def refresh(self): """Refresh the list of storage pools associated to the Commcell.""" self._storage_pools = self._get_storage_pools()
Instance variables
var all_storage_pools
-
Returns dict of all the storage pools on this commcell
dict - consists of all storage pools added to the commcell
{ "storage_pool1_name": storage_pool1_id, "storage_pool2_name": storage_pool2_id }
Expand source code Browse git
@property def all_storage_pools(self): """Returns dict of all the storage pools on this commcell dict - consists of all storage pools added to the commcell { "storage_pool1_name": storage_pool1_id, "storage_pool2_name": storage_pool2_id } """ return self._storage_pools
Methods
def add(self, storage_pool_name, mountpath, media_agent, ddb_ma, dedup_path)
-
Adds a new storage pool to commcell
Args
storage_pool_name (str) – name of new storage pool to add
mountpath (str) – mount path for the storage pool
media_agent (str/object)– name or instance of media agent
ddb_ma (str/object)– name or instance of dedupe media agent
dedup_path (str) – path where the DDB should be stored
Returns
StoragePool object if creation is successful
Raises
Exception if creation is unsuccessful
Expand source code Browse git
def add(self, storage_pool_name, mountpath, media_agent, ddb_ma, dedup_path): """ Adds a new storage pool to commcell Args: storage_pool_name (str) -- name of new storage pool to add mountpath (str) -- mount path for the storage pool media_agent (str/object)-- name or instance of media agent ddb_ma (str/object)-- name or instance of dedupe media agent dedup_path (str) -- path where the DDB should be stored Returns: StoragePool object if creation is successful Raises: Exception if creation is unsuccessful """ # from urllib.parse import urlencode if ((dedup_path is not None and not isinstance(dedup_path, str)) or not (isinstance(storage_pool_name, str) or not isinstance(mountpath, str))): raise SDKException('Storage', '101') # if isinstance(library, DiskLibrary): # disk_library = library # elif isinstance(library, str): # disk_library = DiskLibrary(self._commcell_object, library) # else: # raise SDKException('Storage', '104') if isinstance(media_agent, MediaAgent): media_agent = media_agent elif isinstance(media_agent, str): media_agent = MediaAgent(self._commcell_object, media_agent) else: raise SDKException('Storage', '103') if isinstance(ddb_ma, MediaAgent): ddb_ma = ddb_ma elif isinstance(ddb_ma, str): ddb_ma = MediaAgent(self._commcell_object, ddb_ma) else: raise SDKException('Storage', '103') request_json = { "storagePolicyName": storage_pool_name, "type": 1, "copyName": "Primary", "numberOfCopies": 1, "storage": [ { "path": mountpath, "mediaAgent": { "mediaAgentId": int(media_agent.media_agent_id), "mediaAgentName": media_agent.media_agent_name }, "credentials": {} } ], "storagePolicyCopyInfo": { "copyType": 1, "isFromGui": True, "active": 1, "isDefault": 1, "dedupeFlags": { "enableDASHFull": 1, "hostGlobalDedupStore": 1, "enableDeduplication": 1 }, "storagePolicyFlags": { "blockLevelDedup": 1, "enableGlobalDeduplication": 1 }, "DDBPartitionInfo": { "maInfoList": [ { "mediaAgent": { "mediaAgentId": int(ddb_ma.media_agent_id), "mediaAgentName": ddb_ma.media_agent_name }, "subStoreList": [ { "accessPath": { "path": dedup_path } } ] } ] }, "library": { "libraryName": mountpath, }, "mediaAgent": { "mediaAgentId": int(media_agent.media_agent_id), "mediaAgentName": media_agent.media_agent_name } } } flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._add_storage_pool_api, request_json ) if flag: if response.json(): error_code = response.json()['error']['errorCode'] if int(error_code) != 0: error_message = response.json()['error']['errorMessage'] o_str = 'Failed to create storage policy\nError: "{0}"' raise SDKException('StoragePool', '102', o_str.format(error_message)) else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) self.refresh() return self.get(storage_pool_name)
def add_azure_storage_pool(self, storage_pool_name, container_name, media_agents, dedup_paths, **kwargs)
-
Adds new storage pool with provided name to the commcell
Args
storage_pool_name (str) – name of the storage pool to be created
container_name (str) – container name to be used with storage pool
media_agents (list) – list of media agent names to be used for storage pool
dedup_paths (list) – list of paths for storing deduplication data
**kwargs (dict) – dict of keyword arguments as follows username (str) – azure storage credential username password (str) – azure storage credential password credential_name (str) – Credential name to be used
Returns
Azure storage policy object
Raises
SDKException: If invalid type arguments are passed If Storage Pool with given name already exist Response was not success. Response was empty.
Expand source code Browse git
def add_azure_storage_pool(self, storage_pool_name, container_name, media_agents, dedup_paths, **kwargs): """ Adds new storage pool with provided name to the commcell Args: storage_pool_name (str) -- name of the storage pool to be created container_name (str) -- container name to be used with storage pool media_agents (list) -- list of media agent names to be used for storage pool dedup_paths (list) -- list of paths for storing deduplication data **kwargs (dict) -- dict of keyword arguments as follows username (str) -- azure storage credential username password (str) -- azure storage credential password credential_name (str) -- Credential name to be used Returns: Azure storage policy object Raises: SDKException: If invalid type arguments are passed If Storage Pool with given name already exist Response was not success. Response was empty. """ username = kwargs.get("username", "") password = kwargs.get("password", "") credential_name = kwargs.get("credential_name", "") if not (isinstance(storage_pool_name, str) and isinstance(container_name, str) and isinstance(media_agents, list) and isinstance(dedup_paths, list) and isinstance(username, str) and isinstance(password, str) and isinstance(credential_name, str)): raise SDKException('StoragePool', '101') storage_pools = self._commcell_object.storage_pools if storage_pools.has_storage_pool(storage_pool_name): raise SDKException('StoragePool', '103') request_json = copy.deepcopy(StoragePoolConstants.AZURE_STORAGE_REQ_JSON) request_json["storagePolicyName"] = storage_pool_name storage_policy_info = request_json["storagePolicyCopyInfo"] storage_ma = self._commcell_object.media_agents.get(media_agents[0]) storage_policy_info["library"]["libraryName"] = container_name storage_policy_info["mediaAgent"]["mediaAgentId"] = int(storage_ma.media_agent_id) storage_policy_info["mediaAgent"]["mediaAgentName"] = storage_ma.media_agent_name ddb_info = [] for (ma, ddb_path) in zip(media_agents, dedup_paths): ma_ddb = copy.deepcopy(StoragePoolConstants.MA_INFO_LIST) ma_info = self._commcell_object.media_agents.get(ma) ma_ddb["mediaAgent"]["mediaAgentId"] = int(ma_info.media_agent_id) ma_ddb["mediaAgent"]["mediaAgentName"] = ma_info.media_agent_name ma_ddb["subStoreList"][0]["accessPath"]["path"] = ddb_path ddb_info.append(ma_ddb) storage_policy_info["DDBPartitionInfo"]["maInfoList"] = ddb_info storage_info = request_json["storage"][0] storage_info["path"] = container_name storage_info["mediaAgent"]["mediaAgentId"] = int(storage_ma.media_agent_id) storage_info["mediaAgent"]["mediaAgentName"] = storage_ma.media_agent_name storage_info["credentials"]["userName"] = username storage_info["credentials"]["password"] = password credential = self._commcell_object.credentials.get(credential_name) storage_info["savedCredential"]["credentialId"] = credential.credential_id storage_info["savedCredential"]["credentialName"] = credential.credential_name flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._add_storage_pool_api, request_json ) if flag: if response.json(): error_code = response.json().get('error', {}).get('errorCode', 0) if int(error_code) != 0: error_message = response.json()['error']['errorMessage'] o_str = 'Failed to create storage policy\nError: "{0}"' raise SDKException('StoragePool', '102', o_str.format(error_message)) else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) self.refresh() return self.get(request_json["storagePolicyName"])
def delete(self, storage_pool_name)
-
deletes the specified storage pool.
Args
storage_pool_name (str) – name of the storage pool to delete
Raises
SDKException: if type of the storage pool name is not string
if failed to delete storage pool if no storage pool exists with the given name if response is empty if response is not success
Expand source code Browse git
def delete(self, storage_pool_name): """deletes the specified storage pool. Args: storage_pool_name (str) -- name of the storage pool to delete Raises: SDKException: if type of the storage pool name is not string if failed to delete storage pool if no storage pool exists with the given name if response is empty if response is not success """ if not isinstance(storage_pool_name, str): raise SDKException('Storage', '101') else: storage_pool_name = storage_pool_name.lower() if self.has_storage_pool(storage_pool_name): storage_pool_id = self._storage_pools[storage_pool_name] delete_storage_pool = self._services['DELETE_STORAGE_POOL'] % (storage_pool_id) flag, response = self._cvpysdk_object.make_request('DELETE', delete_storage_pool) if flag: error_code = response.json()['error']['errorCode'] if int(error_code) != 0: error_message = response.json()['error']['errorMessage'] o_str = f'Failed to delete storage pools {storage_pool_name}' o_str += '\nError: "{0}"'.format(error_message) raise SDKException('Storage', '102', o_str) else: # initialize the storage pool again # so the storage pool object has all the storage pools self.refresh() # as part of storage pool we might delete library so initialize the libraries again self._commcell_object.disk_libraries.refresh() else: response_string = self._update_response_(response.text) raise SDKException('Response', '101', response_string) else: raise SDKException( 'Storage', '102', 'No storage pool exists with name: {0}'.format(storage_pool_name) )
def get(self, name)
-
Returns the id of the storage pool for the given storage pool name.
Args
name (str) – name of the storage pool to get the id of
Returns
str - id of the storage pool for the given storage pool name
Raises
SDKException: if no storage pool exists with the given name
Expand source code Browse git
def get(self, name): """Returns the id of the storage pool for the given storage pool name. Args: name (str) -- name of the storage pool to get the id of Returns: str - id of the storage pool for the given storage pool name Raises: SDKException: if no storage pool exists with the given name """ name = name.lower() if self.has_storage_pool(name): return StoragePool(self._commcell_object, name, storage_pool_id=self._storage_pools[name]) else: raise SDKException('StoragePool', '103')
def has_storage_pool(self, name)
-
Checks if a storage pool exists in the Commcell with the input storage pool name.
Args
name (str) – name of the storage pool
Returns
bool - boolean output whether the storage pool exists in the commcell or not
Expand source code Browse git
def has_storage_pool(self, name): """Checks if a storage pool exists in the Commcell with the input storage pool name. Args: name (str) -- name of the storage pool Returns: bool - boolean output whether the storage pool exists in the commcell or not """ return self._storage_pools and name.lower() in self._storage_pools
def hyperscale_create_storage_pool(self, storage_pool_name, media_agents)
-
Create new storage pool for hyperscale
Args
storage_pool_name (string) – Name of the storage pools to create
media_agents (List) – List of 3 media agents with name's(str) or instance of media agent's(object)
Example
- ["ma1","ma2","ma3"]
Return
flag, response – response returned by the REST API call
Expand source code Browse git
def hyperscale_create_storage_pool(self, storage_pool_name, media_agents): """ Create new storage pool for hyperscale Args: storage_pool_name (string) -- Name of the storage pools to create media_agents (List) -- List of 3 media agents with name's(str) or instance of media agent's(object) Example: ["ma1","ma2","ma3"] Return: flag, response -- response returned by the REST API call """ if not isinstance(media_agents, list): raise SDKException('Storage', '101') if not isinstance(storage_pool_name, str): raise SDKException('Storage', '101') mediagent_obj = [] for media_agent in media_agents: if isinstance(media_agent, MediaAgent): mediagent_obj.append(media_agent) elif isinstance(media_agent, str): mediagent_obj.append(self._commcell_object.media_agents.get(media_agent)) else: raise SDKException('Storage', '103') if len(mediagent_obj) <= 2: raise SDKException('Storage', '102', "minimum 3 media agents are required") request_xml = """<App_CreateStoragePolicyReq storagePolicyName="{0}" copyName="{0}_Primary" type="1" numberOfCopies="1"> <storagePolicyCopyInfo> <storagePolicyFlags scaleOutStoragePolicy="1"/> </storagePolicyCopyInfo> <storage> <mediaAgent mediaAgentId="{4}" mediaAgentName="{1}" displayName="{1}"/> </storage> <storage> <mediaAgent mediaAgentId="{5}" mediaAgentName="{2}" displayName="{2}"/> </storage> <storage> <mediaAgent mediaAgentId="{6}" mediaAgentName="{3}" displayName="{3}"/> </storage> <scaleoutConfiguration configurationType="1"/> </App_CreateStoragePolicyReq> """.format(storage_pool_name, mediagent_obj[0].media_agent_name, mediagent_obj[1].media_agent_name, mediagent_obj[2].media_agent_name, mediagent_obj[0].media_agent_id, mediagent_obj[1].media_agent_id, mediagent_obj[2].media_agent_id) flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._add_storage_pool_api, request_xml ) if flag: if response.json(): error_code = response.json()['error']['errorCode'] if int(error_code) != 0: error_message = response.json()['error']['errorMessage'] o_str = 'Failed to create storage pool\nError: "{0}"' raise SDKException('StoragePool', '102', o_str.format(error_message)) else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) self.refresh() return self.get(storage_pool_name)
def refresh(self)
-
Refresh the list of storage pools associated to the Commcell.
Expand source code Browse git
def refresh(self): """Refresh the list of storage pools associated to the Commcell.""" self._storage_pools = self._get_storage_pools()