Module cvpysdk.storage
Main file for performing storage related operations on the commcell.
This file has all the classes related to Storage operations.
MediaAgents: Class for representing all the media agents attached to the commcell.
MediaAgent: Class for representing a single media agent attached to the commcell.
DiskLibraries: Class for representing all the disk libraries attached to the commcell.
DiskLibrary: Class for representing a single disk library associated with the commcell.
Mediaagents
init(commcell_object) – initialize the MediaAgents class instance for the commcell
str() – returns all the media agents associated with the commcell
repr() – returns the string for the instance of the MediaAgents class
_get_media_agents() – gets all the media agents of the commcell
all_media_agents() – returns all the media agents on the commcell
has_media_agent() – checks if a media agent exists with the given name or not
get(media_agent_name) – returns the instance of MediaAgent class of the media agent specified
delete(media_agent) – Deletes the media agent from the commcell.
refresh() – refresh the media agents associated with the commcell
Mediaagent
init(commcell_object, media_agent_name, media_agent_id) – initialize the instance of MediaAgent class for a specific media agent of the commcell
repr() – returns a string representation of the MediaAgent instance
_get_media_agent_id() – gets the id of the MediaAgent instance from commcell
_get_media_agent_properties() – returns media agent properties
_initialize_media_agent_properties() – initializes media agent properties
enable_power_management() – Enable VM Management (power management)
_perform_power_operation() – Performs power operation (power-on/power-off)
power_on() – Power-on MediaAgent if VM management is enabled
power_off() – Power-off MediaAgent if VM management is enabled
wait_for_power_status() – Waits till the expected power status is not achieved
media_agent_name() – returns media agent name
media_agent_id() – returns media agent id
is_online() – returns True is media agent is online
platform() – returns os info of the media agent
refresh() – refresh the properties of the media agent
change_index_cache() – runs catalog migration
index_cache_path() – returns index cache path of the media agent
index_cache_enabled() – returns index cache enabled status
set_state() – enables/disables media agent
mark_for_maintenance() – marks/unmarks media agent offline for maintenance
set_ransomware_protection() – set / unset ransomware protection on Windows MA
set_concurrent_lan() – set / unset concurrent LAN backup in Media agent properties.
is_power_management_enabled() – returns of power management is enabled or not
Libraries
init() – initialize the instance of Libraries class
_get_libraries – Gets all the libraries associated to the commcell specified by commcell object
has_library – Checks if a library exists in the commcell with the input library name
refresh – Refresh the libraries associated with the Commcell
Disklibraries
init(commcell_object) – initialize the DiskLibraries class instance for the commcell
str() – returns all the disk libraries associated with the commcell
repr() – returns the string for the instance of the DiskLibraries class
all_disk_libraries() – returns the dict of all the disk libraries on commcell
add() – adds a new disk library to the commcell
delete() – Deletes a disk library from commcell
get(library_name) – returns the instance of the DiskLibrary class for the library specified
Disklibrary
init(commcell_object, library_name, library_id) – initialize the instance of DiskLibrary class for a specific disk library of the commcell
repr() – returns a string representation of the DiskLibrary instance
_get_library_id() – gets the id of the DiskLibrary instance from commcell
move_mountpath() – To perform move mountpath operation
validate_mountpath() – To perform storage validation on mountpath
add_cloud_mount_path() – Adds a mount path to the cloud library
add_storage_accelerator_credential() – Add storage accelerator credential to the cloud mount path
add_mount_path() – adds the mount path on the local/ remote machine
set_mountpath_reserve_space() – to set reserve space on the mountpath
set_max_data_to_write_on_mount_path() – to set max data to write on the mountpath
change_device_access_type() – to change device access type
verify_media() – To perform verify media operation on media
set_mountpath_preferred_on_mediaagent() – Sets select preferred mountPath according to mediaagent setting on the library
_get_library_properties() – gets the disk library properties
_get_advanced_library_properties() – gets the advanced disk library properties
refresh() – Refresh the properties of this disk library.
DiskLibrary instance Attributes
**media_agents_associated** -- returns the media agents associated with the disk library
**library_properties** -- Returns the dictionary consisting of the full properties of the library
**advanced_library_properties** -- Returns the dictionary consisting of advanced library properites
**free_space** -- returns the free space on the library
**mountpath_usage** -- returns mountpath usage on library
Tapelibraries
init() – initialize the TapeLibrary class instance for the commcell
get() – Returns the TapeLibrary object of the specified library
delete() – Deletes the specified library
lock_mm_configuration() – Locks the MM config for tape library detection
unlock_mm_configuration() – Unlocks the MM config for tape library detection
__lock_unlock_mm_configuration() – Locks or unlocks the MM config for tape library detection
detect_tape_library() – Detect the tape library of the specified MediaAgent(s)
configure_tape_library() – Configure the specified tape library
Tapelibrary
init() – Initialize the TapeLibrary class instance
repr – returns the string for the instance of the TapeLibrary class
_get_library_id() – Returns the library ID
_get_library_properties() – gets the disk library properties
get_drive_list() – Returns the tape drive list of this tape library
refresh() – Refresh the properties of this tape library.
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.
# --------------------------------------------------------------------------
"""Main file for performing storage related operations on the commcell.
This file has all the classes related to Storage operations.
MediaAgents: Class for representing all the media agents attached to the commcell.
MediaAgent: Class for representing a single media agent attached to the commcell.
DiskLibraries: Class for representing all the disk libraries attached to the commcell.
DiskLibrary: Class for representing a single disk library associated with the commcell.
MediaAgents:
__init__(commcell_object) -- initialize the MediaAgents class instance for the commcell
__str__() -- returns all the media agents associated with the commcell
__repr__() -- returns the string for the instance of the MediaAgents class
_get_media_agents() -- gets all the media agents of the commcell
all_media_agents() -- returns all the media agents on the commcell
has_media_agent() -- checks if a media agent exists with the given name or not
get(media_agent_name) -- returns the instance of MediaAgent class
of the media agent specified
delete(media_agent) -- Deletes the media agent from the commcell.
refresh() -- refresh the media agents associated with the commcell
MediaAgent:
__init__(commcell_object,
media_agent_name,
media_agent_id) -- initialize the instance of MediaAgent class for a
specific media agent of the commcell
__repr__() -- returns a string representation of the
MediaAgent instance
_get_media_agent_id() -- gets the id of the MediaAgent instance from
commcell
_get_media_agent_properties() -- returns media agent properties
_initialize_media_agent_properties() -- initializes media agent properties
enable_power_management() -- Enable VM Management (power management)
_perform_power_operation() -- Performs power operation (power-on/power-off)
power_on() -- Power-on MediaAgent if VM management is enabled
power_off() -- Power-off MediaAgent if VM management is enabled
wait_for_power_status() -- Waits till the expected power status is not achieved
media_agent_name() -- returns media agent name
media_agent_id() -- returns media agent id
is_online() -- returns True is media agent is online
platform() -- returns os info of the media agent
refresh() -- refresh the properties of the media agent
change_index_cache() -- runs catalog migration
index_cache_path() -- returns index cache path of the media agent
index_cache_enabled() -- returns index cache enabled status
set_state() -- enables/disables media agent
mark_for_maintenance() -- marks/unmarks media agent offline for maintenance
set_ransomware_protection() -- set / unset ransomware protection on Windows MA
set_concurrent_lan() -- set / unset concurrent LAN backup in Media agent properties.
is_power_management_enabled() -- returns of power management is enabled or not
Libraries:
__init__() -- initialize the instance of Libraries class
_get_libraries -- Gets all the libraries associated to the commcell specified by commcell object
has_library -- Checks if a library exists in the commcell with the input library name
refresh -- Refresh the libraries associated with the Commcell
DiskLibraries:
__init__(commcell_object) -- initialize the DiskLibraries class instance for the commcell
__str__() -- returns all the disk libraries associated with the commcell
__repr__() -- returns the string for the instance of the DiskLibraries class
all_disk_libraries() -- returns the dict of all the disk libraries on commcell
add() -- adds a new disk library to the commcell
delete() -- Deletes a disk library from commcell
get(library_name) -- returns the instance of the DiskLibrary class
for the library specified
DiskLibrary:
__init__(commcell_object,
library_name,
library_id) -- initialize the instance of DiskLibrary class for a specific
disk library of the commcell
__repr__() -- returns a string representation of the DiskLibrary instance
_get_library_id() -- gets the id of the DiskLibrary instance from commcell
move_mountpath() -- To perform move mountpath operation
validate_mountpath() -- To perform storage validation on mountpath
add_cloud_mount_path() -- Adds a mount path to the cloud library
add_storage_accelerator_credential() -- Add storage accelerator credential to the cloud mount path
add_mount_path() -- adds the mount path on the local/ remote machine
set_mountpath_reserve_space() -- to set reserve space on the mountpath
set_max_data_to_write_on_mount_path() -- to set max data to write on the mountpath
change_device_access_type() -- to change device access type
verify_media() -- To perform verify media operation on media
set_mountpath_preferred_on_mediaagent() -- Sets select preferred mountPath according to mediaagent setting on the
library
_get_library_properties() -- gets the disk library properties
_get_advanced_library_properties() -- gets the advanced disk library properties
refresh() -- Refresh the properties of this disk library.
DiskLibrary instance Attributes
**media_agents_associated** -- returns the media agents associated with the disk library
**library_properties** -- Returns the dictionary consisting of the full properties of the library
**advanced_library_properties** -- Returns the dictionary consisting of advanced library properites
**free_space** -- returns the free space on the library
**mountpath_usage** -- returns mountpath usage on library
TapeLibraries:
__init__() -- initialize the TapeLibrary class instance for the commcell
get() -- Returns the TapeLibrary object of the specified library
delete() -- Deletes the specified library
lock_mm_configuration() -- Locks the MM config for tape library detection
unlock_mm_configuration() -- Unlocks the MM config for tape library detection
__lock_unlock_mm_configuration() -- Locks or unlocks the MM config for tape library detection
detect_tape_library() -- Detect the tape library of the specified MediaAgent(s)
configure_tape_library() -- Configure the specified tape library
TapeLibrary:
__init__() -- Initialize the TapeLibrary class instance
__repr__ -- returns the string for the instance of the TapeLibrary class
_get_library_id() -- Returns the library ID
_get_library_properties() -- gets the disk library properties
get_drive_list() -- Returns the tape drive list of this tape library
refresh() -- Refresh the properties of this tape library.
"""
from __future__ import absolute_import
from __future__ import unicode_literals
import uuid, time, json
from base64 import b64encode
from .exception import SDKException
class MediaAgents(object):
"""Class for getting all the media agents associated with the commcell."""
def __init__(self, commcell_object):
"""Initialize object of the MediaAgents class.
Args:
commcell_object (object) -- instance of the Commcell class
Returns:
object - instance of the MediaAgents class
"""
self._commcell_object = commcell_object
self._MEDIA_AGENTS = self._commcell_object._services['GET_MEDIA_AGENTS']
self._media_agents = None
self.refresh()
def __str__(self):
"""Representation string consisting of all media agents of the commcell.
Returns:
str - string of all the media agents associated with the commcell
"""
representation_string = '{:^5}\t{:^20}\n\n'.format('S. No.', 'Media Agent')
for index, media_agent in enumerate(self._media_agents):
sub_str = '{:^5}\t{:20}\n'.format(index + 1, media_agent)
representation_string += sub_str
return representation_string.strip()
def __repr__(self):
"""Representation string for the instance of the MediaAgents class."""
return "MediaAgents class instance for Commcell: '{0}'".format(
self._commcell_object.commserv_name
)
def _get_media_agents(self):
"""Gets all the media agents associated to the commcell specified by commcell object.
Returns:
dict - consists of all media agents of the commcell
{
"media_agent1_name": {
'id': media_agent1_id,
'os_info': media_agent1_os,
'is_online': media_agent1_status
},
"media_agent2_name": {
'id': media_agent2_id,
'os_info': media_agent2_os,
'is_online': media_agent2_status
}
}
Raises:
SDKException:
if response is empty
if response is not success
"""
flag, response = self._commcell_object._cvpysdk_object.make_request(
'GET', self._MEDIA_AGENTS
)
if flag:
if response.json() and 'mediaAgentList' in response.json():
media_agents = response.json()['mediaAgentList']
media_agents_dict = {}
for media_agent in media_agents:
temp_name = media_agent['mediaAgent']['mediaAgentName'].lower()
temp_id = str(media_agent['mediaAgent']['mediaAgentId']).lower()
temp_os = media_agent['osInfo']['OsDisplayInfo']['OSName']
temp_status = bool(media_agent['status'])
media_agents_dict[temp_name] = {
'id': temp_id,
'os_info': temp_os,
'is_online': temp_status
}
return media_agents_dict
else:
raise SDKException('Response', '102')
else:
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
@property
def all_media_agents(self):
"""Returns dict of all the media agents on this commcell
dict - consists of all media agents of the commcell
{
"media_agent1_name": {
'id': media_agent1_id,
'os_info': media_agent1_os,
'is_online': media_agent1_status
},
"media_agent2_name": {
'id': media_agent2_id,
'os_info': media_agent2_os,
'is_online': media_agent2_status
}
}
"""
return self._media_agents
def has_media_agent(self, media_agent_name):
"""Checks if a media agent exists in the commcell with the input media agent name.
Args:
media_agent_name (str) -- name of the media agent
Returns:
bool - boolean output whether the media agent exists in the commcell or not
Raises:
SDKException:
if type of the media agent name argument is not string
"""
if not isinstance(media_agent_name, str):
raise SDKException('Storage', '101')
return self._media_agents and media_agent_name.lower() in self._media_agents
def get(self, media_agent_name):
"""Returns a MediaAgent object of the specified media agent name.
Args:
media_agent_name (str) -- name of the media agent
Returns:
object - instance of the MediaAgent class for the given media agent name
Raises:
SDKException:
if type of the media agent name argument is not string
if no media agent exists with the given name
"""
if not isinstance(media_agent_name, str):
raise SDKException('Storage', '101')
else:
media_agent_name = media_agent_name.lower()
if self.has_media_agent(media_agent_name):
return MediaAgent(self._commcell_object,
media_agent_name,
self._media_agents[media_agent_name]['id'])
raise SDKException(
'Storage', '102', 'No media agent exists with name: {0}'.format(media_agent_name)
)
def delete(self, media_agent, force=False):
"""Deletes the media agent from the commcell.
Args:
media_agent (str) -- name of the Mediaagent to remove from the commcell
force (bool) -- True if you want to delete media agent forcefully.
Raises:
SDKException:
if type of the media agent name argument is not string
if failed to delete Media agent
if response is empty
if response is not success
if no media agent exists with the given name
"""
if not isinstance(media_agent, str):
raise SDKException('Storage', '101')
else:
media_agent = media_agent.lower()
if self.has_media_agent(media_agent):
mediagent_id = self.all_media_agents[media_agent]['id']
mediagent_delete_service = self._commcell_object._services['MEDIA_AGENT'] % (mediagent_id)
if force:
mediagent_delete_service += "?forceDelete=1"
flag, response = self._commcell_object._cvpysdk_object.make_request('DELETE', mediagent_delete_service)
error_code = 0
if flag:
if 'errorCode' in response.json():
o_str = 'Failed to delete mediaagent'
error_code = response.json()['errorCode']
if error_code == 0:
# initialize the mediaagents again
# so the mediaagents object has all the mediaagents
self.refresh()
else:
error_message = response.json()['errorMessage']
if error_message:
o_str += '\nError: "{0}"'.format(error_message)
raise SDKException('Storage', '102', o_str)
else:
raise SDKException('Response', '102')
else:
raise SDKException('Response', '101', self._commcell_object._update_response_(response.text))
else:
raise SDKException(
'Storage', '102', 'No Mediaagent exists with name: {0}'.format(media_agent)
)
def refresh(self):
"""Refresh the media agents associated with the Commcell."""
self._media_agents = self._get_media_agents()
class MediaAgent(object):
"""Class for a specific media agent."""
def __init__(self, commcell_object, media_agent_name, media_agent_id=None):
"""Initialise the MediaAgent object.
Args:
commcell_object (object) -- instance of the Commcell class
media_agent_name (str) -- name of the media agent
media_agent_id (str) -- id of the media agent
default: None
Returns:
object - instance of the MediaAgent class
"""
self._commcell_object = commcell_object
self._media_agent_name = media_agent_name.lower()
self._media_agent_info = None
if media_agent_id:
self._media_agent_id = str(media_agent_id)
else:
self._media_agent_id = self._get_media_agent_id()
self._MEDIA_AGENT = self._commcell_object._services['MEDIA_AGENT'] % (
self._media_agent_name
)
self._CLOUD_MEDIA_AGENT = self._commcell_object._services['CLOUD_MEDIA_AGENT'] % (
self._media_agent_id
)
self._CREATE_TASK = self._commcell_object._services['CREATE_TASK']
self._MEDIA_AGENTS = self._commcell_object._services['GET_MEDIA_AGENTS'] + "/{0}".format(
self.media_agent_id
)
self.refresh()
def __repr__(self):
"""String representation of the instance of this class."""
representation_string = 'MediaAgent class instance for MA: "{0}", of Commcell: "{1}"'
return representation_string.format(
self.media_agent_name, self._commcell_object.commserv_name
)
def _get_media_agent_id(self):
"""Gets the media agent id associated with this media agent.
Returns:
str - id associated with this media agent
"""
media_agents = MediaAgents(self._commcell_object)
return media_agents.get(self.media_agent_name).media_agent_id
def _get_media_agent_properties(self):
"""Returns the media agent properties of this media agent.
Returns:
dict - dictionary consisting of the properties of this client
Raises:
SDKException:
if response is empty
if response is not success
"""
flag, response = self._commcell_object._cvpysdk_object.make_request(
'GET', self._MEDIA_AGENTS
)
if flag:
if response.json() and 'mediaAgentList' in response.json():
self._media_agent_info = response.json()['mediaAgentList'][0]
return response.json()
else:
raise SDKException('Response', '102')
else:
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
def _initialize_media_agent_properties(self):
"""Initializes the properties for this Media Agent"""
self._status = None
self._platform = None
self._index_cache_enabled = None
self._index_cache = None
self._is_power_mgmt_allowed = None
self._is_power_mgmt_supported = None
self._is_power_management_enabled = None
self._power_management_controller_name = None
self._power_status = None
properties = self._get_media_agent_properties()
if properties['mediaAgentList']:
mediaagent_list = properties['mediaAgentList'][0]
else:
raise SDKException('Response', '102')
status = mediaagent_list.get('status')
if status == 1:
self._is_online = True
else:
self._is_online = False
if mediaagent_list['osInfo']['OsDisplayInfo']['OSName']:
platform = mediaagent_list['osInfo']['OsDisplayInfo']['OSName']
if 'windows' in platform.lower():
self._platform = 'WINDOWS'
elif 'unix' in platform.lower() or 'linux' in platform.lower():
self._platform = 'UNIX'
else:
self._platform = platform
if mediaagent_list['mediaAgentProps']['mediaAgentIdxCacheProps']['cacheEnabled']:
self._index_cache_enabled = mediaagent_list['mediaAgentProps'][
'mediaAgentIdxCacheProps']['cacheEnabled']
if mediaagent_list['mediaAgentProps']['mediaAgentIdxCacheProps']['cachePath']['path']:
self._index_cache = mediaagent_list['mediaAgentProps']['mediaAgentIdxCacheProps'
]['cachePath']['path']
if mediaagent_list['powerManagementInfo']['isPowerMgmtSupported']:
self._is_power_mgmt_supported = mediaagent_list['powerManagementInfo']['isPowerMgmtSupported']
if self._is_power_mgmt_supported:
if mediaagent_list['powerManagementInfo']['isPowerManagementEnabled']:
self._is_power_management_enabled = mediaagent_list['powerManagementInfo']['isPowerManagementEnabled']
if mediaagent_list['powerManagementInfo']['isPowerMgmtAllowed']:
self._is_power_mgmt_allowed = mediaagent_list['powerManagementInfo']['isPowerMgmtAllowed']
if mediaagent_list['powerManagementInfo']['powerStatus']:
self._power_status = mediaagent_list['powerManagementInfo']['powerStatus']
if mediaagent_list['powerManagementInfo']['selectedCloudController']['clientName']:
self._power_management_controller_name = mediaagent_list['powerManagementInfo']['selectedCloudController']['clientName']
def enable_power_management(self, pseudo_client_name):
"""
Enables power management using the provided cloud controller (pseudo client)
Args :
pseudo_client_name : VSA pseudo client to be used as cloud controller
Raises:
SDKException:
If response is not success
If Power management is not supported
"""
if self._is_power_mgmt_allowed:
client_obj = self._commcell_object._clients.get(pseudo_client_name)
pseudo_client_name_client_id = client_obj._get_client_id()
"""
payLoad = '<EVGui_SetCloudVMManagementInfoReq hostId="' + self.media_agent_id + '" useMediaAgent="1"> <powerManagementInfo isPowerManagementEnabled="1" > <selectedCloudController clientId="' + PseudoClientName_client_id + '" clientName="' + \
PseudoClientName + '"/></powerManagementInfo></EVGui_SetCloudVMManagementInfoReq>'
"""
payLoad = '<EVGui_SetCloudVMManagementInfoReq hostId="{0}" useMediaAgent="1"> <powerManagementInfo isPowerManagementEnabled="1" > <selectedCloudController clientId="{1}" clientName="{2}"/></powerManagementInfo></EVGui_SetCloudVMManagementInfoReq>'.format(
self.media_agent_id, pseudo_client_name_client_id, pseudo_client_name)
response = self._commcell_object._qoperation_execute(payLoad)
if response['errorCode'] != 0:
raise SDKException('Response', '102', str(response))
else:
raise SDKException('Storage', '102', "Power management is not supported")
def _perform_power_operation(self, operation):
"""
Performs power operation
Args :
self : Object
operation : Operation to perform
Raises:
SDKException:
If operation is not 1 or 0
If ower management is NOT enabled or NOT supported on MediaAgent
If API response is empty
If API response is not success
"""
if not operation in ("1", "0"):
raise SDKException('Response', '102',
"Invalid power operation type")
if self._is_power_management_enabled:
flag, response = self._commcell_object._cvpysdk_object.make_request(
'GET', self._CLOUD_MEDIA_AGENT + "/" + operation
)
if not flag:
raise SDKException('Response', '102',
str(response))
if response.json()['errorCode'] != 0:
raise SDKException('Response', '102', str(response))
else:
raise SDKException('Storage', '102',
'Power management is NOT enabled or NOT supported')
def power_on(self, wait_till_online=True):
"""
Power-on the MediaAgent
Args :
self : Object
wait_till_online :
True : Waits until the MediaAgent is online
False : Just submits the power-on request
"""
if self.current_power_status not in ["Starting", "Started", "Online"]:
self._perform_power_operation("1")
if wait_till_online == True and self.current_power_status != "Online":
self.wait_for_power_status("Online")
def power_off(self, wait_till_stopped=True):
"""
Power-off MediaAgent
Args :
self : Object
wait_till_stopped :
True : Waits until the MediaAgent is stopped
False : Just submits the power-off request
"""
if self.current_power_status not in ["Stopping", "Stopped"]:
self._perform_power_operation("0")
if wait_till_stopped == True and self.current_power_status != "Stopped":
self.wait_for_power_status("Stopped")
def wait_for_power_status(self, expected_power_status, time_out_sec=600):
"""
Waits until the expected power status not achieved
Args :
self : Object
expected_power_status : The expected power status as following.
Starting
Started
Online
Stopping
Stopped
time_out_sec : Maximum time to wait for the expected power status
Raises:
SDKException:
If time_out_sec is not an integer and time_out_sec not None
If expected power status is not achieved within time_out_sec time
"""
if time_out_sec != None:
if not isinstance(time_out_sec, int):
raise SDKException('Storage', '102',
'Expected an integer value for [time_out_sec]')
start_time = time.time()
while self.current_power_status != expected_power_status:
time.sleep(10)
if time_out_sec != None:
if time.time() - start_time > time_out_sec:
raise SDKException('Storage', '102',
'The expected power status is not achieved within expected time')
def change_index_cache(self, old_index_cache_path, new_index_cache_path):
"""
Begins a catalog migration job via the CreateTask end point.
Args :
old_index_cache_path - source index cache path
new_index_cache_path - destination index cache path
Returns :
Returns job object of catalog migration job
Raises:
SDKException:
if response is empty
if response is not success
"""
conf_guid = str(uuid.uuid4())
xml_options_string = '''<Indexing_IdxDirectoryConfiguration configurationGuid="{0}"
icdPath="{1}" maClientFocusName="{2}" maGuid="" oldIcdPath="{3}"
opType="0" />''' .format(
conf_guid, new_index_cache_path, self.media_agent_name, old_index_cache_path)
request_json = {
"taskInfo": {
"taskOperation": 1,
"task": {
"isEZOperation": False,
"description": "",
"ownerId": 1,
"runUserId": 1,
"taskType": 1,
"ownerName": "",
"alertName": "",
"sequenceNumber": 0,
"isEditing": False,
"GUID": "",
"isFromCommNetBrowserRootNode": False,
"initiatedFrom": 3,
"policyType": 0,
"associatedObjects": 0,
"taskName": "",
"taskFlags": {
"notRunnable": False,
"disabled": False
}
},
"subTasks": [
{
"subTaskOperation": 1,
"subTask": {
"subTaskOrder": 0,
"subTaskType": 1,
"flags": 0,
"operationType": 5018,
"subTaskId": 1
},
"options": {
"originalJobId": 0,
"adminOpts": {
"catalogMigrationOptions": {
"xmlOptions": xml_options_string,
"mediaAgent": {
"mediaAgentId": int(self._media_agent_id),
"_type_": 11
}
}
}
}
}
]
}
}
flag, response = self._commcell_object._cvpysdk_object.make_request(
'POST', self._CREATE_TASK, request_json
)
if flag:
if response.json() and 'jobIds' in response.json() and response.json()['jobIds'][0]:
response_json = response.json()
catalogmigration_jobid = response_json["jobIds"][0]
catalogmigration_job_obj = self._commcell_object.job_controller.get(
catalogmigration_jobid)
return catalogmigration_job_obj
else:
raise SDKException('Response', '102')
else:
raise SDKException('Response', '101')
def set_state(self, enable=True):
"""
disable the media agent by change in media agent properties.
Args:
enable - (bool)
True - Enable the media agent
False - Disable the media agent
Raises:
"exception" - if there is an empty response
- if there is an error in request execution
- if response status is failure
"""
if type(enable) != bool:
raise SDKException('Storage', '101')
media_id = int(self.media_agent_id)
request_json = {
"mediaAgentInfo": {
"mediaAgent": {
"mediaAgentId": media_id
},
"mediaAgentProps": {
"enableMA": enable
}
}
}
flag, response = self._commcell_object._cvpysdk_object.make_request(
'PUT', self._MEDIA_AGENTS, request_json
)
# check for response
# possible key errors if key not present in response, defaults set
if flag:
if response and response.json():
response = response.json()
if response.get('error', {}).get('errorCode', -1) != 0:
error_message = response.get('error', {}).get('errorString', '')
raise SDKException('Storage', '102', error_message)
else:
raise SDKException('Response', '102')
else:
raise SDKException('Response', '101')
def mark_for_maintenance(self, mark=False):
"""
mark the media agent offline for maintenance
Args:
mark - (bool)
True - mark the media agent for maintenance
False - UNMARK the media agent for maintenance
Raises:
"exception" - if there is an empty response
- if there is an error in request execution
- if response status is failure
"""
if type(mark) != bool:
raise SDKException('Storage', '101')
media_id = int(self.media_agent_id)
request_json = {
"mediaAgentInfo": {
"mediaAgent": {
"mediaAgentId": media_id
},
"mediaAgentProps": {
"markMAOfflineForMaintenance": mark
}
}
}
flag, response = self._commcell_object._cvpysdk_object.make_request(
'PUT', self._MEDIA_AGENTS, request_json
)
if flag:
if response and response.json():
response = response.json()
if response.get('error', {}).get('errorCode', -1) != 0:
error_message = response.get('error', {}).get('errorString', '')
raise SDKException('Storage', '102', error_message)
else:
raise SDKException('Response', '102')
else:
raise SDKException('Response', '101')
def set_ransomware_protection(self, status):
"""Enables / Disables the ransomware protection on Windows MediaAgent.
Args:
status (bool) -- True or False value to turn it on/off
True - ransomware protection on MediaAgent - ON
False - ransomware protection on MediaAgent - OFF
Returns:
None -- if operation performed successfully.
Raises:
Exception(Exception_Code, Exception_Message):
- if there is failure in executing the operation
"""
# this works only on WINDOWS MA
if self._platform != 'WINDOWS':
raise SDKException('Storage', '101')
if type(status) != bool:
raise SDKException('Storage', '101')
media_id = int(self.media_agent_id)
request_json = {
"mediaAgentInfo": {
"mediaAgent": {
"mediaAgentId": media_id
},
"mediaAgentProps": {
"isRansomwareProtected": status
}
}
}
flag, response = self._commcell_object._cvpysdk_object.make_request(
'PUT', self._MEDIA_AGENTS, request_json
)
if flag:
if response and response.json():
response = response.json()
if response.get('error', {}).get('errorCode', -1) != 0:
error_message = response.get('error', {}).get('errorString', '')
raise SDKException('Storage', '102', error_message)
else:
raise SDKException('Response', '102')
else:
raise SDKException('Response', '101')
def set_concurrent_lan(self, enable=True):
"""
disable / enable concurrent LAN backup in Media agent properties.
Args:
enable - (bool)
True - Enable concurent LAN Backup
False - Disable concurent LAN Backup
Returns:
None -- if operation performed successfully.
Raises:
SDKException:
- if there is failure in executing the operation
"""
if type(enable) != bool:
raise SDKException('Storage', '101')
media_id = int(self.media_agent_id)
request_json = {
"mediaAgentInfo": {
"mediaAgent": {
"mediaAgentId": media_id
},
"mediaAgentProps": {
"optimizeForConcurrentLANBackups": enable
}
}
}
flag, response = self._commcell_object._cvpysdk_object.make_request(
'PUT', self._MEDIA_AGENTS, request_json
)
if flag:
if response and response.json():
response = response.json()
if response.get('error', {}).get('errorCode', -1) != 0:
error_message = response.get('error', {}).get('errorString', '')
raise SDKException('Storage', '102', error_message)
else:
raise SDKException('Response', '102')
else:
raise SDKException('Response', '101')
@property
def name(self):
"""Returns the media agent display name"""
return self._media_agent_info['mediaAgent']['displayName']
@property
def media_agent_name(self):
"""Treats the media agent name as a read-only attribute."""
return self._media_agent_name
@property
def media_agent_id(self):
"""Treats the media agent id as a read-only attribute."""
return self._media_agent_id
@property
def is_online(self):
"""Treats the status as read-only attribute"""
return self._is_online
@property
def platform(self):
"""Treats the platform as read-only attribute"""
return self._platform
@property
def index_cache_path(self):
"""Treats the index cache path as a read-only attribute"""
return self._index_cache
@property
def index_cache_enabled(self):
"""Treats the cache enabled value as a read-only attribute"""
return self._index_cache_enabled
@property
def is_power_management_enabled(self):
""" Returns power management enable status"""
return self._is_power_management_enabled
@property
def current_power_status(self):
"""
Returns the power state of the MA.
Args :
self : Object
Returns :
str - Current power status of the MediaAgent as following
Starting : Power-on process in going on
Started : MA is powered-on successfully but still not synced with CS
Online : Powered-on and synced with CS. MA is ready to use.
Stopping : Power-off operation is going on.
Stopped : MA is powered-off
Unknown : MA power status is still not synced with cloud provider. MA discovery is going on or power state sync with happening with cloud provider or something is NOT right.
"""
self.refresh()
power_status = {0: 'Unknown', 1: 'Starting', 2: 'Started', 3: 'Online', 4: 'Stopping', 5: 'Stopped'}
return power_status.get(self._power_status)
def refresh(self):
"""Refresh the properties of the MediaAgent."""
self._initialize_media_agent_properties()
class Libraries(object):
""" Class for libraries"""
def __init__(self, commcell_object):
"""Initialize object of the DiskLibraries class.
Args:
commcell_object (object) -- instance of the Commcell class
Returns:
object - instance of the DiskLibraries class
"""
self._commcell_object = commcell_object
self._LIBRARY = self._commcell_object._services['LIBRARY']
self._libraries = None
self.refresh()
def _get_libraries(self):
"""Gets all the disk libraries associated to the commcell specified by commcell object.
Returns:
dict - consists of all disk libraries of the commcell
{
"disk_library1_name": disk_library1_id,
"disk_library2_name": disk_library2_id
}
Raises:
SDKException:
if response is empty
if response is not success
"""
flag, response = self._commcell_object._cvpysdk_object.make_request('GET', self._LIBRARY)
if flag:
if response.json() and 'response' in response.json():
libraries = response.json()['response']
libraries_dict = {}
for library in libraries:
temp_name = library['entityInfo']['name'].lower()
temp_id = str(library['entityInfo']['id']).lower()
libraries_dict[temp_name] = temp_id
return libraries_dict
else:
return {}
else:
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
def has_library(self, library_name):
"""Checks if a library exists in the commcell with the input library name.
Args:
library_name (str) -- name of the library
Returns:
bool - boolean output whether the library exists in the commcell or not
Raises:
SDKException:
if type of the library name argument is not string
"""
if not isinstance(library_name, str):
raise SDKException('Storage', '101')
return self._libraries and library_name.lower() in self._libraries
def refresh(self):
"""Refresh the disk libraries associated with the Commcell."""
self._libraries = self._get_libraries()
class DiskLibraries(Libraries):
"""Class for getting all the disk libraries associated with the commcell."""
def __init__(self, commcell_object):
super().__init__(commcell_object)
def __str__(self):
"""Representation string consisting of all disk libraries of the commcell.
Returns:
str - string of all the disk libraries associated with the commcell
"""
representation_string = '{:^5}\t{:^20}\n\n'.format('S. No.', 'Disk Library')
for index, library in enumerate(self._libraries):
sub_str = '{:^5}\t{:20}\n'.format(index + 1, library)
representation_string += sub_str
return representation_string.strip()
def __repr__(self):
"""Representation string for the instance of the DiskLibraries class."""
return "DiskLibraries class instance for Commcell: '{0}'".format(
self._commcell_object.commserv_name
)
@property
def all_disk_libraries(self):
"""Returns dict of all the disk libraries on this commcell
dict - consists of all disk libraries of the commcell
{
"disk_library1_name": disk_library1_id,
"disk_library2_name": disk_library2_id
}
"""
return self._libraries
def add(self, library_name, media_agent, mount_path, username="", password="", servertype=0,
saved_credential_name=""):
"""Adds a new Disk Library to the Commcell.
Args:
library_name (str) -- name of the new library to add
media_agent (str/object) -- name or instance of media agent to add the library to
mount_path (str) -- full path of the folder to mount the library at
username (str) -- username to access the mount path
default: ""
password (str) -- password to access the mount path
default: ""
servertype (int) -- provide cloud library server type
default 0, value 59 for HPstore
saved_credential_name (str) -- name of the saved credential
default: ""
Returns:
object - instance of the DiskLibrary class, if created successfully
Raises:
SDKException:
if type of the library name argument is not string
if type of the mount path argument is not string
if type of the username argument is not string
if type of the password argument is not string
if type of the media agent argument is not either string or MediaAgent instance
if failed to create disk library
if response is empty
if response is not success
"""
if not (isinstance(library_name, str) and
isinstance(mount_path, str) and
isinstance(username, str) and
isinstance(password, str)):
raise SDKException('Storage', '101')
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')
request_json = {
"isConfigRequired": 1,
"library": {
"mediaAgentId": int(media_agent.media_agent_id),
"libraryName": library_name,
"mountPath": mount_path,
"loginName": username,
"password": b64encode(password.encode()).decode(),
"opType": 1,
"savedCredential":{
"credentialName": saved_credential_name
}
}
}
if servertype > 0:
request_json["library"]["serverType"] = servertype
request_json["library"]["isCloud"] = 1
if saved_credential_name:
request_json["library"]["password"] = b64encode("XXXXX".encode()).decode()
if servertype == 59:
request_json["library"]["HybridCloudOption"] = {
"enableHybridCloud": "2", "diskLibrary": {"_type_": "9"}}
request_json["library"]["savedCredential"] = {"_type_": "9"}
flag, response = self._commcell_object._cvpysdk_object.make_request(
'POST', self._LIBRARY, request_json
)
if flag:
if response.json():
if 'library' in response.json():
library = response.json()['library']
# initialize the libraries again
# so the libraries object has all the libraries
self.refresh()
return DiskLibrary(
self._commcell_object,
library['libraryName'],
library_details=library)
elif 'errorCode' in response.json():
error_message = response.json()['errorMessage']
o_str = 'Failed to create disk library\nError: "{0}"'.format(error_message)
raise SDKException('Storage', '102', o_str)
else:
raise SDKException('Response', '102')
else:
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
def delete(self, library_name):
"""deletes the specified library.
Args:
library_name (str) -- name of the disk library to delete
Raises:
SDKException:
if type of the library name argument is not string
if no library exists with the given name
if response is incorrect
"""
if not isinstance(library_name, str):
raise SDKException('Storage', '101')
if not self.has_library(library_name):
raise SDKException('Storage',
'102',
'No library exists with name: {0}'.
format(library_name))
request_json = {
"EVGui_ConfigureStorageLibraryReq":
{
"isDeconfigLibrary": 1,
"library":
{
"opType": 2,
"libraryName": library_name
}
}
}
exec_command = self._commcell_object._services['EXECUTE_QCOMMAND']
flag, response = self._commcell_object._cvpysdk_object.make_request('POST', exec_command, request_json)
if flag:
if response.json():
if 'library' in response.json():
_response = response.json()['library']
if 'errorCode' in _response:
if _response['errorCode'] == 0:
self.refresh()
else:
raise SDKException('Storage', '102', _response['errorMessage'])
else:
if 'errorMessage' in response.json():
o_str = 'Error: ' + response.json()['errorMessage']
raise SDKException('Response', '102', o_str)
raise SDKException('Response', '102')
else:
raise SDKException('Response', '102')
else:
_stdout = 'Failed to delete library {0} with error: \n [{1}]'
_stderr = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', _stdout.format(library_name, _stderr))
def get(self, library_name, library_details=None):
"""Returns a DiskLibrary object of the specified disk library name.
Args:
library_name (str) -- name of the disk library
library_details (dict) -- dict containing mountpath and mediaagent details
Returns:
object - instance of the DiskLibrary class for the given library name
Raises:
SDKException:
if type of the library name argument is not string
if no disk library exists with the given name
"""
if not isinstance(library_name, str):
raise SDKException('Storage', '101')
else:
library_name = library_name.lower()
if self.has_library(library_name):
return DiskLibrary(self._commcell_object,
library_name,
self._libraries[library_name], library_details)
raise SDKException(
'Storage', '102', 'No disk library exists with name: {0}'.format(library_name)
)
class DiskLibrary(object):
"""Class for a specific disk library."""
def __init__(self, commcell_object, library_name, library_id=None, library_details=None):
"""Initialise the DiskLibrary object.
Args:
commcell_object (object) -- instance of the Commcell class
library_name (str) -- name of the disk library
library_id (str) -- id of the disk library
default: None
library_details (dict) -- dict containing mountpath and mediaagent details
default: None
Returns:
object - instance of the DiskLibrary class
"""
self._commcell_object = commcell_object
self._library_name = library_name.lower()
if library_id:
self._library_id = str(library_id)
else:
self._library_id = self._get_library_id()
self._library_properties_service = self._commcell_object._services[
'GET_LIBRARY_PROPERTIES'] % (self._library_id)
self._library_properties = self._get_library_properties()
self._advanced_library_properties = self._get_advanced_library_properties()
if library_details is not None:
self.mountpath = library_details.get('mountPath', None)
self.mediaagent = library_details.get('mediaAgentName', None)
def __repr__(self):
"""String representation of the instance of this class."""
representation_string = 'DiskLibrary class instance for library: "{0}" of Commcell: "{1}"'
return representation_string.format(
self.library_name, self._commcell_object.commserv_name
)
def move_mountpath(self, mountpath_id, source_device_path,
source_mediaagent_id, target_device_path, target_mediaagent_id,
target_device_id=0):
""" To perform move mountpath operation
Args:
mountpath_id (int) -- Mountpath Id that need to be moved.
source_device_path (str) -- Present Mountpath location
source_mediaagent_id (int) -- MediaAgent Id on which present mountpath exists
target_device_path (str) -- New Mountpath location
target_mediaagent_id (int) -- MediaAgent Id on which new mountpath exists
target_device_id (int) -- Device Id of target path if already exists
Returns:
instance of the Job class for this move mountpath job
Raises
Exception:
- if argument datatype is invalid
- if API response error code is not 0
- if response is empty
- if response code is not as expected
"""
if not (isinstance(mountpath_id, int) and
isinstance(source_mediaagent_id, int) and
isinstance(target_mediaagent_id, int) and
(isinstance(target_device_path, str) or target_device_id > 0) and
isinstance(source_device_path, str)):
raise SDKException('Storage', '101')
MOVE_MOUNTPATH_DETAILS = self._commcell_object._services['GET_MOVE_MOUNTPATH_DETAILS'] % (mountpath_id)
flag, response = self._commcell_object._cvpysdk_object.make_request('GET', MOVE_MOUNTPATH_DETAILS)
source_device_id = None
if flag:
if response.json():
if 'sourceDeviceInfo' in response.json():
source_device_id = response.json().get('sourceDeviceInfo').get('deviceId', None)
if not source_device_id:
raise SDKException('Storage', '102', 'Failed to get details of the mountpath for move')
else:
raise SDKException('Response', '102')
else:
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
request_json = {
'MPMoveOption': {
'mountPathMoveList': [{
'sourceDeviceId': source_device_id,
'sourcemediaAgentId': source_mediaagent_id,
'targetMediaAgentId': target_mediaagent_id,
}]
}
}
if target_device_id > 0:
request_json['MPMoveOption']['mountPathMoveList'][0]['targetDeviceId'] = target_device_id
else:
request_json['MPMoveOption']['mountPathMoveList'][0]['targetDevicePath'] = target_device_path
flag, response = self._commcell_object._cvpysdk_object.make_request(
'POST', self._commcell_object._services['MOVE_MOUNTPATH'], request_json)
if flag:
if response.json():
if "jobIds" in response.json():
if len(response.json()['jobIds']) == 1:
from cvpysdk.job import Job
return Job(self._commcell_object, response.json()['jobIds'][0])
else:
from cvpysdk.job import Job
mp_move_job_list = []
for job_id in response.json()['jobIds']:
mp_move_job_list.append(Job(self._commcell_object, job_id))
return mp_move_job_list
if "errorCode" in response.json():
error_message = response.json()['errorMessage']
o_str = 'Error: "{0}"'.format(error_message)
raise SDKException('Commcell', '105', o_str)
else:
raise SDKException('Commcell', '105')
else:
raise SDKException('Response', '102')
else:
raise SDKException('Response', '101', self._commcell_object._update_response_(response.text))
def validate_mountpath(self, mountpath_drive_id, media_agent):
""" To perform storage validation on mountpath
Args:
mountpath_drive_id (int) -- Drive Id of mountpath that need to be validate.
media_agent (str) -- MediaAgent on which Mountpath exists
Returns:
instance of the Job class for this storage validation job
Raises
Exception:
- if argument datatype is invalid
- if API response error code is not 0
- if response is empty
- if response code is not as expected
"""
if not (isinstance(mountpath_drive_id, int) and
isinstance(media_agent, str)):
raise SDKException('Storage', '101')
request_xml = """<TMMsg_CreateTaskReq>
<taskInfo taskOperation="1">
<task associatedObjects="0" description="Storage Validation - Automation" initiatedFrom="1"
isEZOperation="0" isEditing="0" isFromCommNetBrowserRootNode="0" ownerId="1" ownerName=""
policyType="0" runUserId="1" sequenceNumber="0" taskType="1">
<taskFlags notRunnable="0" />
</task>
<subTasks subTaskOperation="1">
<subTask flags="0" operationType="4013" subTaskId="1" subTaskOrder="0" subTaskType="1"/>
<options originalJobId="0">
<adminOpts>
<libraryOption operation="13" validationFlags="0" validattionReservedFlags="0">
<library libraryId="{0}" />
<mediaAgent mediaAgentName="{1}" />
<driveIds driveId="{2}" />
<validateDrive chunkSize="16384" chunksTillEnd="0" fileMarkerToStart="2"
numberOfChunks="2" threadCount="2" volumeBlockSize="64" />
</libraryOption> </adminOpts> </options> </subTasks> </taskInfo>
</TMMsg_CreateTaskReq>""".format(self.library_id, media_agent, mountpath_drive_id)
flag, response = self._commcell_object._cvpysdk_object.make_request(
'POST', self._commcell_object._services['CREATE_TASK'], request_xml
)
if flag:
if response.json():
if "jobIds" in response.json():
from cvpysdk.job import Job
return Job(self._commcell_object, response.json()['jobIds'][0])
if "errorCode" in response.json():
error_message = response.json()['errorMessage']
o_str = 'Error: "{0}"'.format(error_message)
raise SDKException('Commcell', '105', o_str)
else:
raise SDKException('Commcell', '105')
else:
raise SDKException('Response', '102')
else:
raise SDKException('Response', '101', self._commcell_object._update_response_(response.text))
def add_cloud_mount_path(self, mount_path, media_agent, username, password, server_type):
""" Adds a mount path to the cloud library
Args:
mount_path (str) -- cloud container or bucket.
media_agent (str) -- MediaAgent on which mountpath exists
username (str) -- Username to access the mount path in the format <Service Host>//<Account Name>
Eg: s3.us-west-1.amazonaws.com//MyAccessKeyID. For more information refer http://documentation.commvault.com/commvault/v11/article?p=97863.htm.
password (str) -- Password to access the mount path
server_type (int) -- provide cloud library server type
Eg: 3-Microsoft Azure Storage . For more information refer http://documentation.commvault.com/commvault/v11/article?p=97863.htm.
Returns:
None
Raises
Exception:
- if mountpath or mediaagent or username or password or servertype arguments dataype is invalid
- if servertype input data is incorrect
- if API response error code is not 0
- if response is empty
- if response code is not as expected
"""
if not (isinstance(mount_path, str) or isinstance(media_agent, str)
or isinstance(username, str) or isinstance(password, str)
or isinstance(server_type, int)):
raise SDKException('Storage', '101')
request_json = {
"isConfigRequired": 1,
"library": {
"opType": 4,
"isCloud": 1,
"mediaAgentName": media_agent,
"libraryName": self._library_name,
"mountPath": mount_path,
"loginName": username,
"password": b64encode(password.encode()).decode(),
"serverType": server_type
}
}
exec_command = self._commcell_object._services['LIBRARY']
flag, response = self._commcell_object._cvpysdk_object.make_request(
'POST', exec_command, request_json
)
if flag:
if response.json():
if 'library' in response.json():
_response = response.json()['library']
if 'errorCode' in _response:
if _response['errorCode'] != 0:
raise SDKException('Storage', '102', _response['errorMessage'])
else:
raise SDKException('Response', '102')
else:
raise SDKException('Response', '102')
else:
_stdout = 'Failed to add mount path [{0}] for library [{1}] with error: \n [{2}]'
_stderr = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', _stdout.format(mount_path,
self._library_name,
_stderr))
def add_storage_accelerator_credential(self, mount_path, saved_credential="", reset=False):
""" Add storage accelerator credential to the cloud mount path
Args:
mount_path (str) -- Mount path to which secondary credentials needs to be added
saved_credential (str) -- saved credential name
default: ""
reset (bool) -- reset storage accelerator credential
default: False
Raises
Exception:
- if mountpath datatype is invalid
- if API response error code is not 0
- if response is empty
- if response code is not as expected
"""
if not isinstance(mount_path, str):
raise SDKException('Storage', '101')
request_json = {
"library": {
"mediaAgentName": self.media_agent,
"libraryName": self._library_name,
"mountPath": mount_path,
"opType": 8
},
"libNewProp": {
"secondaryCredential": {
"credentialName": saved_credential
},
"resetSecondaryCredentials": reset
}
}
exec_command = self._commcell_object._services['LIBRARY']
flag, response = self._commcell_object._cvpysdk_object.make_request(
'POST', exec_command, request_json
)
if flag:
if response.json():
if 'library' in response.json():
_response = response.json()['library']
if 'errorCode' in _response:
if _response['errorCode'] != 0:
raise SDKException('Storage', '102', _response['errorMessage'])
else:
raise SDKException('Response', '102')
else:
raise SDKException('Response', '102')
else:
_stdout = 'Failed to add storage accelerator credential with error: \n [{0}]'
_stderr = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', _stdout.format(_stderr))
def _get_library_properties(self):
"""Gets the disk library properties.
Returns:
dict - dictionary consisting of the properties of this library
Raises:
SDKException:
if response is empty
if failed to get disk library properties
if response is not success
"""
flag, response = self._commcell_object._cvpysdk_object.make_request(
'GET', self._library_properties_service
)
if flag:
if response.json():
if 'libraryInfo' in response.json():
return response.json()['libraryInfo']
raise SDKException('Storage', '102', 'Failed to get disk Library properties')
raise SDKException('Response', '102')
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
def _get_advanced_library_properties(self):
"""Gets the advanced disk library properties.
Returns:
dict - dictionary consisting of the advanced properties of disk library
Raises:
SDKException:
if response is empty
if failed to get disk library properties
if response is not success
"""
flag, response = self._commcell_object._cvpysdk_object.make_request(
'GET', f"{self._library_properties_service}?propertylevel=20"
)
if flag:
if response.json():
if 'libraryInfo' in response.json():
return response.json()['libraryInfo']
raise SDKException('Storage', '102', 'Failed to get disk Library properties')
raise SDKException('Response', '102')
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
def _get_library_id(self):
"""Gets the library id associated with this disk library.
Returns:
str - id associated with this disk library
"""
libraries = DiskLibraries(self._commcell_object)
return libraries.get(self.library_name).library_id
def refresh(self):
"""Refresh the properties of this disk library."""
self._library_properties = self._get_library_properties()
self._advanced_library_properties = self._get_advanced_library_properties()
def add_mount_path(self, mount_path, media_agent, username='', password=''):
""" Adds a mount path [local/remote] to the disk library
Args:
mount_path (str) -- Mount path which needs to be added to disklibrary.
This could be a local or remote mount path on mediaagent
media_agent (str) -- MediaAgent on which mountpath exists
username (str) -- Username to access the mount path
password (str) -- Password to access the mount path
Returns:
None
Raises
Exception:
- if mountpath and mediaagent datatype is invalid
- if API response error code is not 0
- if response is empty
- if response code is not as expected
"""
if not isinstance(mount_path, str) or not isinstance(media_agent, str):
raise SDKException('Storage', '101')
request_json = {
"EVGui_ConfigureStorageLibraryReq":
{
"isConfigRequired": 1,
"library": {
"opType": 4,
"mediaAgentName": media_agent,
"libraryName": self._library_name,
"mountPath": mount_path,
"loginName": username,
"password": b64encode(password.encode()).decode(),
}
}
}
exec_command = self._commcell_object._services['EXECUTE_QCOMMAND']
flag, response = self._commcell_object._cvpysdk_object.make_request('POST',
exec_command,
request_json)
if flag:
if response.json():
if 'library' in response.json():
_response = response.json()['library']
if 'errorCode' in _response:
if _response['errorCode'] != 0:
raise SDKException('Storage', '102', _response['errorMessage'])
else:
raise SDKException('Response', '102')
else:
raise SDKException('Response', '102')
else:
_stdout = 'Failed to add mount path [{0}] for library [{1}] with error: \n [{2}]'
_stderr = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', _stdout.format(mount_path,
self._library_name,
_stderr))
def set_mountpath_reserve_space(self, mount_path, size):
"""
To set reserve space on the mountpath
Args:
mount_path (str) -- Mountpath
size (int) -- reserve space to be set in MB
"""
request_json = {
"EVGui_ConfigureStorageLibraryReq":
{
"isConfigRequired": 1,
"library": {
"opType": 8,
"mediaAgentName": self.media_agent,
"libraryName": self._library_name,
"mountPath": mount_path
},
"libNewProp":{
"reserveSpaceInMB": size
}
}
}
self._commcell_object.qoperation_execute(request_json)
def set_max_data_to_write_on_mount_path(self, mount_path, size):
"""
To set max data to write on the mountpath
Args:
mount_path (str) -- Folder path for this mount path.
size (int) -- max data to be consumed in MB
"""
request_json = {
"EVGui_ConfigureStorageLibraryReq":
{
"isConfigRequired": 1,
"library": {
"opType": 8,
"mediaAgentName": self.media_agent,
"libraryName": self._library_name,
"mountPath": mount_path
},
"libNewProp":{
"maxDataToWriteMB": size
}
}
}
self._commcell_object.qoperation_execute(request_json)
def change_device_access_type(self, mountpath_id, device_id, device_controller_id, media_agent_id,
device_access_type):
"""
To change device access type
Args:
mountpath_id (int) -- Mount Path Id
device_id (int) -- Device Id
device_controller_id (int) -- Device Controller Id
media_agent_id (int) -- Media Agent Id
device_access_type (int) -- Device access type
Regular:
Access type Value
Read 4
Read and Write 6
Preferred 8
IP:
Access type Value
Read 20
Read/ Write 22
Fibre Channel (FC)
Access type Value
Read 36
Read and Write 38
iSCSi
Access type Value
Read 132
Read and Write 134
"""
if not all([isinstance(mountpath_id, int), isinstance(device_id, int), isinstance(device_controller_id, int),
isinstance(media_agent_id, int), isinstance(device_access_type, int)]):
raise SDKException('Storage', '101')
request_json = {
"EVGui_MMDevicePathInfoReq":
{
"mountpathId": mountpath_id,
"infoList": {
"accessType": device_access_type,
"deviceId": device_id,
"deviceControllerId": device_controller_id,
"path": self.mount_path,
"enabled": 1,
"numWriters": -1,
"opType": 2,
"autoPickTransportType": 0,
"protocolType": 679,
"mediaAgent": {
"id": media_agent_id
}
}
}
}
self._commcell_object.qoperation_execute(request_json)
def verify_media(self, media_name, location_id):
"""
To perform verify media operation on media
Args:
media_name -- Barcode of the media
location_id -- Slot Id of the media on the library
"""
if not (isinstance(media_name, str) and
isinstance(location_id,int)):
raise SDKException('Storage', '101')
request_xml = f"""<TMMsg_CreateTaskReq>
<taskInfo>
<task taskType="1" />
<subTasks subTaskOperation="1">
<subTask operationType="4005" subTaskType="1"/>
<options>
<adminOpts>
<libraryOption operation="6">
<library _type_="9" libraryName="{self.library_name}"/>
<media _type_="46" mediaName="{media_name}"/>
<verifyMedia>
<location _type_="53" locationId="{location_id}"/>
</verifyMedia>
</libraryOption>
</adminOpts>
</options>
</subTasks>
</taskInfo>
</TMMsg_CreateTaskReq>"""
flag, response = self._commcell_object._cvpysdk_object.make_request(
'POST', self._commcell_object._services['CREATE_TASK'], request_xml
)
if flag:
if response.json():
if "jobIds" in response.json():
from cvpysdk.job import Job
return Job(self._commcell_object, response.json()['jobIds'][0])
if "errorCode" in response.json():
error_message = response.json()['errorMessage']
o_str = 'Error: "{0}"'.format(error_message)
raise SDKException('Storage', '102',o_str)
else:
raise SDKException('Response', '102')
else:
raise SDKException('Response', '102')
else:
raise SDKException('Response', '101', self._commcell_object._update_response_(response.text))
@property
def free_space(self):
"""Returns free space"""
return self._library_properties.get('magLibSummary', {}).get('totalFreeSpace').strip()
@property
def mountpath_usage(self):
"""Returns mount path usage"""
return self._library_properties.get('magLibSummary', {}).get('mountPathUsage').strip()
@mountpath_usage.setter
def mountpath_usage(self, value):
"""
Sets mount path usage on the library
Args:
value (str) -- option needed to set for mountpath usage
value: 'SPILL_AND_FILL' or 'FILL_AND_SPILL'
"""
if not isinstance(value, str):
raise SDKException('Storage', '101')
if value == 'SPILL_AND_FILL':
value = 1
elif value == 'FILL_AND_SPILL':
value = 2
else:
raise SDKException('Storage', '110')
request_json = {
"EVGui_ConfigureStorageLibraryReq":
{
"library": {
"opType": 32,
"libraryName": self.library_name
},
"libNewProp": {
"mountPathUsage": value
}
}
}
self._commcell_object.qoperation_execute(request_json)
def set_mountpath_preferred_on_mediaagent(self, value):
"""Sets select preferred mountPath according to mediaagent setting on the library.
Args:
value (bool) -- preferMountPathAccordingToMA value to be set on library (True/False)
Raises:
SDKException:
if failed to update
if the type of value input is not correct
"""
if not isinstance(value, bool):
raise SDKException('Storage', '101')
request_json = {
"EVGui_ConfigureStorageLibraryReq":
{
"isConfigRequired": 1,
"library": {
"opType": 32,
"libraryName": self.library_name
},
"libNewProp": {
"preferMountPathAccordingToMA": int(value)
}
}
}
self._commcell_object.qoperation_execute(request_json)
@property
def media_agents_associated(self):
""" Returns the media agents associated with the disk library """
mount_paths = self._library_properties.get('MountPathList')
media_agents = [mount_path.get('mountPathName').split('[')[1].split(']')[0] for mount_path in mount_paths if "mountPathName" in mount_path]
return list(set(media_agents))
@property
def name(self):
"""Returns library display name."""
return self._library_properties['MountPathList'][0]['mountPathSummary']['libraryName']
@property
def library_name(self):
"""Treats the library name as a read-only attribute."""
return self._library_name
@property
def library_id(self):
"""Treats the library id as a read-only attribute."""
return self._library_id
@property
def library_properties(self):
"""Returns the dictionary consisting of the full properties of the library"""
self.refresh()
return self._library_properties
@property
def advanced_library_properties(self):
"""Returns the dictionary consisting of the advanced properties of the library"""
self.refresh()
return self._advanced_library_properties
@property
def mount_path(self):
"""Treats the library id as a read-only attribute."""
return self.mountpath
@mount_path.setter
def mount_path(self, mount_path):
""" setter for mountpath"""
self.mountpath = mount_path
@property
def media_agent(self):
"""Treats the library id as a read-only attribute."""
return self.mediaagent
@media_agent.setter
def media_agent(self, media_agent):
"""setter for media agent"""
self.mediaagent = media_agent
def share_mount_path(self, new_media_agent, new_mount_path, **kwargs):
"""
Method to share a mountpath to a disklibrary
Args:
new_media_agent (str) -- Media agent which is accessing the shared mount path
new_mount_path (int) -- Mount path to be shared
\*\*kwargs (dict) -- Optional arguments
Available kwargs Options:
media_agent (str) -- Media agent associated with library
library_name (str) -- Name of the library which has the mount path
mount_path (str) -- Mount path to be shared
access_type (int) -- The access type of the shared mount path
Read Device Access = 4
Read/ Write Device Access = 6
Read Device Access with Preferred = 12
Read/Write Device Access with Preferred = 14
Data Server - IP Read = 20
Data Server - IP Read/ Write = 22
Data Server - FC Read = 36
Data Server - FC Read/ Write = 38
Data Server - iSCSI Read = 132
Data Server - iSCSI Read/ Write = 134
Note: For the Data Server device access type,
enter the local path provided in the library/mountPath
parameter in the libNewProp/mountPath parameter also.
username (str) -- Username to access the mount path, if UNC
password (str) -- Password to access the mount path, if UNC
Returns:
None
Raises
Exception:
- if any of the parameter's dataype is invalid
- if API response error code is not 0
- if response is empty
- if response code is not as expected
"""
media_agent = kwargs.get('media_agent', self.mediaagent)
library_name = kwargs.get('library_name', self.library_name)
mount_path = kwargs.get('mount_path', self.mountpath)
access_type = kwargs.get('access_type', 22)
username = kwargs.get('username', '')
password = kwargs.get('password', '')
self._EXECUTE = self._commcell_object._services['EXECUTE_QCOMMAND']
self.library = {
"opType": 64,
"mediaAgentName": media_agent,
"libraryName": library_name,
"mountPath": "%s" %
mount_path}
self.lib_new_prop = {
"deviceAccessType": access_type,
"password": password,
"loginName": username,
"mediaAgentName": new_media_agent,
"mountPath": "{}".format(new_mount_path),
"proxyPassword": ""}
request_json = {
"EVGui_ConfigureStorageLibraryReq":
{
"library": self.library,
"libNewProp": self.lib_new_prop
}
}
flag, response = self._commcell_object._cvpysdk_object.make_request(
'POST', self._EXECUTE, request_json
)
if flag:
response_string = self._commcell_object._update_response_(response.text)
if response.json():
if "library" in response.json():
response = response.json()["library"]
return response
else:
raise SDKException('Response', '102', response_string)
else:
raise SDKException('Response', '102', response_string)
else:
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
class RPStores(object):
def __init__(self, commcell):
"""Initialize object of the MediaAgents class.
Args:
commcell(object) -- instance of the Commcell class
Returns:
object - instance of the MediaAgents class
"""
self._commcell = commcell
self._rp_stores = None
self.refresh()
def _get_rp_stores(self):
xml = '<?xml version="1.0" encoding="UTF-8"?><EVGui_GetLibraryListWCReq libraryType="RPSTORE"/>'
response = self._commcell.execute_qcommand("qoperation execute", xml)
try:
if response.json().get('libraryList'):
return {library["library"]["libraryName"].lower(): library["MountPathList"][0]["rpStoreLibraryInfo"]
["rpStoreId"] for library in response.json()["libraryList"]}
return {}
except (KeyError, ValueError):
generic_msg = "Unable to fetch RPStore"
err_msg = response.json().get("errorMessage", generic_msg) if response.status_code == 200 else generic_msg
raise SDKException('Storage', '102', '{0}'.format(err_msg))
def add(self, name, path, storage, media_agent_name):
"""
Args:
name (str): Name of the RPStore
path (str): Path of the RPStore
storage (int): Storage Capacity of the RPStore in GB
media_agent_name(str) : Name of the media agent
Returns:
An instance of RPStore
"""
try:
assert self.has_rp_store(name) is False
except AssertionError:
raise SDKException("Storage", 102, "An RPStore already exists with the same name")
media_agents = MediaAgents(self._commcell)
try:
ma_id = media_agents.all_media_agents[media_agent_name]["id"]
except KeyError:
raise SDKException('Storage', '102', 'No media agent exists with name: {0}'.format(media_agent_name))
payload = {
"rpLibrary": {"maxSpacePerRPStoreGB": storage},
"storageLibrary": {
"mediaAgentId": int(ma_id),
"libraryName": name,
"mountPath": path
},
"opType": 1
}
flag, response = self._commcell._cvpysdk_object.make_request(
"POST", self._commcell._services["RPSTORE"], payload)
try:
return RPStore(self._commcell, name, response.json()["storageLibrary"]["libraryId"])
except KeyError:
generic_msg = "Unable to add RPStore"
err_msg = response.json().get("errorMessage", generic_msg) if flag else generic_msg
raise SDKException('Storage', '102', '{0}'.format(err_msg))
def has_rp_store(self, rpstore_name):
"""Validates if the given RPStore is present
Args:
rpstore_name (str): Name of the RPStore
Returns:
bool : True if present else False
"""
if not isinstance(rpstore_name, str):
raise SDKException('Storage', '101')
return rpstore_name.lower() in self._rp_stores
def get(self, rpstore_name):
"""Fetches the given RPStore
Args:
rpstore_name (str): Name of the RPStore
Returns:
An instance of the RPStore
"""
if not isinstance(rpstore_name, str):
raise SDKException('Storage', '101')
try:
return RPStore(self._commcell, rpstore_name, self._rp_stores[rpstore_name.lower()])
except KeyError:
raise SDKException('Storage', '102', 'No RPStore exists with name: {0}'.format(rpstore_name))
def refresh(self):
"""Refresh the media agents associated with the Commcell."""
self._rp_stores = self._get_rp_stores()
class RPStore(object):
def __init__(self, commcell, rpstore_name, rpstore_id):
self._commcell = commcell
self._rpstore_name = rpstore_name.lower()
self._rpstore_id = rpstore_id
@property
def rpstore_name(self):
return self._rpstore_name
@property
def rpstore_id(self):
return self._rpstore_id
class TapeLibraries(Libraries):
def __init__(self, commcell_object):
"""Initialize object of the DiskLibraries class.
Args:
commcell_object (object) -- instance of the Commcell class
Returns:
object - instance of the DiskLibraries class
"""
super().__init__(commcell_object)
self._commcell_object = commcell_object
self._DETECT_TAPE_LIBRARY = self._commcell_object._services['DETECT_TAPE_LIBRARY']
self._CONFIGURE_TAPE_LIBRARY = self._commcell_object._services['CONFIGURE_TAPE_LIBRARY']
self._LOCK_MM_CONFIGURATION = self._commcell_object._services['LOCK_MM_CONFIGURATION']
def __str__(self):
"""Representation string consisting of all tape libraries of the commcell.
Returns:
str - string of all the tape libraries associated with the commcell
"""
representation_string = '{:^5}\t{:^20}\n\n'.format('S. No.', 'Tape Library')
for index, library in enumerate(self._libraries):
sub_str = '{:^5}\t{:20}\n'.format(index + 1, library)
representation_string += sub_str
return representation_string.strip()
def __repr__(self):
"""Representation string for the instance of the TapeLibraries class."""
return "TapeLibraries class instance for Commcell: '{0}'".format(
self._commcell_object.commserv_name
)
def get(self, tape_library_name):
"""
Returns the object of TapeLibrary class of the specified library name
Args:
library_name (str) -- name of the library
Returns:
object - object of TapeLibrary class of the specified library name
Raises:
SDKException:
if type of the library name argument is not string
"""
if not isinstance(tape_library_name, str):
raise SDKException('Storage', '101')
else:
if self.has_library(tape_library_name):
tape_library_name = tape_library_name.lower()
return TapeLibrary(self._commcell_object, tape_library_name, self._libraries[tape_library_name])
def delete(self, tape_library_name):
"""
Deletes the specified library
Args:
tape_library_name (str) -- name of the library
Returns:
bool - returns true if the library deleted successfully
Raises:
SDKException:
if type of the library name argument is not string
if library does not exists
if its failed to delete the library
"""
if not isinstance(tape_library_name, str):
raise SDKException('Storage', '101')
if not self.has_library(tape_library_name):
raise SDKException('Storage', '101', "Invalid library name")
pay_load={
"isDeconfigLibrary": 1,
"library": {
"opType": 2,
"libraryName": tape_library_name
}
}
flag, response = self._commcell_object._cvpysdk_object.make_request('POST', self._LIBRARY, pay_load)
if not flag:
raise SDKException('Storage', '102', "Failed to DELETE the library")
self.refresh()
def __lock_unlock_mm_configuration(self, operation):
"""
Locks or unlocks the MM config for tape library detection
Args:
operation (int) -- operation type
1 : Lock
0 : Unlock
2: Force lock
Raises:
SDKException:
If API call is not successful
If API response is invalid
If errorCode is not part of response JSON
If lock/unlock operation fails
"""
if not isinstance(operation, int):
raise SDKException('Storage', '101', "Invalid Operation data type. Expected is integer")
if not operation in [0,1,2]:
raise SDKException('Storage', '101', "Invalid Operation type. Expected among [0,1,2] but received "+str(operation))
pay_load ={
"configLockUnlock": {
"lockType": operation
}
}
flag, response = self._commcell_object._cvpysdk_object.make_request('POST', self._LOCK_MM_CONFIGURATION, pay_load)
if flag :
if response and response.json():
if 'errorCode' in response.json():
if response.json()['errorCode'] != 0:
raise SDKException('Storage', '102', "Failed to lock the MM Config. errorMessage : "+response.json().get('errorMessage'))
else:
raise SDKException('Storage', '102',
"lock_unlock_mm_configuration :: Error code is not part of response JSON")
else:
raise SDKException('Response', '102', "Invalid response")
else:
raise SDKException('Response', '101', "API call is not successful")
def lock_mm_configuration(self, forceLock = False):
"""
Locks the MM config for tape library detection
Args:
forceLock (bool) -- True for force lock
"""
if forceLock:
self.__lock_unlock_mm_configuration(2)
return
self.__lock_unlock_mm_configuration(1)
def unlock_mm_configuration(self):
"""
Unlocks the MM config for tape library detection
"""
self.__lock_unlock_mm_configuration(0)
def detect_tape_library(self, mediaagents):
"""
Detect the tape libraries(s) of the provided MediaAgent(s)
Args:
mediaagents (list) -- The list of the mediaagent(s)
Returns:
JSON - JSON of the tape library detections response
Raises:
SDKException:
if its fails to detect
"""
pay_load ={
"autoDetect": True,
"mediaAgentIdList": mediaagents
}
try:
self.lock_mm_configuration()
flag, response = self._commcell_object._cvpysdk_object.make_request('POST', self._DETECT_TAPE_LIBRARY, pay_load )
finally:
self.unlock_mm_configuration()
if flag and response.json():
return response.json()
raise SDKException('Storage', '102', "Failed to detect library")
def configure_tape_library(self,tape_library_name, mediaagents):
"""
Configure the tape library
Args:
tape_library_name (str) -- name of the library
mediaagents(list) -- list of MediaAgents to use for configuration
Returns:
object - object of the TapeLibrary class for the specified tape library
Raises:
SDKException:
if fails to configure the tape library
"""
libraries=self.detect_tape_library(mediaagents)
flag=False
for lib in libraries['libraries']:
if lib['libraryName'] == tape_library_name:
drive_list=lib['drives']
pay_load= {
"driveList": drive_list,
"hdr": {
"tag": 0
}
}
flag, response = self._commcell_object._cvpysdk_object.make_request('POST', self._CONFIGURE_TAPE_LIBRARY,
pay_load)
break
if not flag:
raise SDKException('Storage', '102', "Failed to configure the library")
self.refresh()
tape_library_name = tape_library_name.lower()
for lib_name, lib_id in self._libraries.items():
if lib_name.startswith(tape_library_name + " "):
return self.get(lib_name)
class TapeLibrary(object):
def __init__(self, commcell_object, tape_library_name, tape_library_id=None):
"""Initialize object of the TapeLibrary class.
Args:
commcell_object (object) -- instance of the Commcell class
tape_library_name (string) -- name of the tape library
tape_library_id (int) -- tape library ID
Returns:
object - instance of the TapeLibrary class
"""
self._commcell_object = commcell_object
self._name = tape_library_name
if tape_library_id:
self._library_id = str(tape_library_id)
else:
self._library_id = self._get_library_id()
self._library_properties_service = self._commcell_object._services[
'GET_LIBRARY_PROPERTIES'] % (self._library_id)
self.library_properties = self._get_library_properties()
self._name = self.library_properties['library']['libraryName']
def __str__(self):
"""Representation string consisting of the specified tape library.
Returns:
str - string of all the tape library associated with the commcell
"""
representation_string = "TapeLibrary instance of library : {0}"
return representation_string.format(self._name)
def __repr__(self):
"""String representation of the TapeLibrary instance of this class."""
representation_string = 'TapeLibrary class instance for library: "{0}" of Commcell: "{1}"'
return representation_string.format(
self._name, self._commcell_object.commserv_name
)
def _get_library_id(self):
"""Gets the library id associated with this tape library.
Returns:
str - id associated with this tape library
"""
libraries = TapeLibraries(self._commcell_object)
return libraries.get(self.library_name).library_id
def get_drive_list(self):
"""
Returns the tape drive list of this tape library
Returns:
list - List of the drives of this tape library
"""
self.refresh()
drive_list=[]
if 'DriveList' in self.library_properties:
for drive in self.library_properties["DriveList"]:
drive_list.append(drive["driveName"])
return drive_list
def _get_library_properties(self):
"""Gets the tape library properties.
Returns:
dict - dictionary consisting of the properties of this library
Raises:
SDKException:
if response is empty
if failed to get tape library properties
if response is not success
"""
flag, response = self._commcell_object._cvpysdk_object.make_request(
'GET', self._library_properties_service
)
if flag:
if response.json():
if 'libraryInfo' in response.json():
return response.json()['libraryInfo']
raise SDKException('Storage', '102', 'Failed to get tape Library properties')
raise SDKException('Response', '102')
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
def refresh(self):
"""Refresh the properties of this tape library."""
self.library_properties = self._get_library_properties()
@property
def library_name(self):
"""Treats the library name as a read-only attribute."""
return self._name
@property
def library_id(self):
"""Treats the library ID as a read-only attribute."""
return self._library_id
Classes
class DiskLibraries (commcell_object)
-
Class for getting all the disk libraries associated with the commcell.
Initialize object of the DiskLibraries class.
Args
commcell_object (object) – instance of the Commcell class
Returns
object - instance of the DiskLibraries class
Expand source code Browse git
class DiskLibraries(Libraries): """Class for getting all the disk libraries associated with the commcell.""" def __init__(self, commcell_object): super().__init__(commcell_object) def __str__(self): """Representation string consisting of all disk libraries of the commcell. Returns: str - string of all the disk libraries associated with the commcell """ representation_string = '{:^5}\t{:^20}\n\n'.format('S. No.', 'Disk Library') for index, library in enumerate(self._libraries): sub_str = '{:^5}\t{:20}\n'.format(index + 1, library) representation_string += sub_str return representation_string.strip() def __repr__(self): """Representation string for the instance of the DiskLibraries class.""" return "DiskLibraries class instance for Commcell: '{0}'".format( self._commcell_object.commserv_name ) @property def all_disk_libraries(self): """Returns dict of all the disk libraries on this commcell dict - consists of all disk libraries of the commcell { "disk_library1_name": disk_library1_id, "disk_library2_name": disk_library2_id } """ return self._libraries def add(self, library_name, media_agent, mount_path, username="", password="", servertype=0, saved_credential_name=""): """Adds a new Disk Library to the Commcell. Args: library_name (str) -- name of the new library to add media_agent (str/object) -- name or instance of media agent to add the library to mount_path (str) -- full path of the folder to mount the library at username (str) -- username to access the mount path default: "" password (str) -- password to access the mount path default: "" servertype (int) -- provide cloud library server type default 0, value 59 for HPstore saved_credential_name (str) -- name of the saved credential default: "" Returns: object - instance of the DiskLibrary class, if created successfully Raises: SDKException: if type of the library name argument is not string if type of the mount path argument is not string if type of the username argument is not string if type of the password argument is not string if type of the media agent argument is not either string or MediaAgent instance if failed to create disk library if response is empty if response is not success """ if not (isinstance(library_name, str) and isinstance(mount_path, str) and isinstance(username, str) and isinstance(password, str)): raise SDKException('Storage', '101') 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') request_json = { "isConfigRequired": 1, "library": { "mediaAgentId": int(media_agent.media_agent_id), "libraryName": library_name, "mountPath": mount_path, "loginName": username, "password": b64encode(password.encode()).decode(), "opType": 1, "savedCredential":{ "credentialName": saved_credential_name } } } if servertype > 0: request_json["library"]["serverType"] = servertype request_json["library"]["isCloud"] = 1 if saved_credential_name: request_json["library"]["password"] = b64encode("XXXXX".encode()).decode() if servertype == 59: request_json["library"]["HybridCloudOption"] = { "enableHybridCloud": "2", "diskLibrary": {"_type_": "9"}} request_json["library"]["savedCredential"] = {"_type_": "9"} flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._LIBRARY, request_json ) if flag: if response.json(): if 'library' in response.json(): library = response.json()['library'] # initialize the libraries again # so the libraries object has all the libraries self.refresh() return DiskLibrary( self._commcell_object, library['libraryName'], library_details=library) elif 'errorCode' in response.json(): error_message = response.json()['errorMessage'] o_str = 'Failed to create disk library\nError: "{0}"'.format(error_message) raise SDKException('Storage', '102', o_str) else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) def delete(self, library_name): """deletes the specified library. Args: library_name (str) -- name of the disk library to delete Raises: SDKException: if type of the library name argument is not string if no library exists with the given name if response is incorrect """ if not isinstance(library_name, str): raise SDKException('Storage', '101') if not self.has_library(library_name): raise SDKException('Storage', '102', 'No library exists with name: {0}'. format(library_name)) request_json = { "EVGui_ConfigureStorageLibraryReq": { "isDeconfigLibrary": 1, "library": { "opType": 2, "libraryName": library_name } } } exec_command = self._commcell_object._services['EXECUTE_QCOMMAND'] flag, response = self._commcell_object._cvpysdk_object.make_request('POST', exec_command, request_json) if flag: if response.json(): if 'library' in response.json(): _response = response.json()['library'] if 'errorCode' in _response: if _response['errorCode'] == 0: self.refresh() else: raise SDKException('Storage', '102', _response['errorMessage']) else: if 'errorMessage' in response.json(): o_str = 'Error: ' + response.json()['errorMessage'] raise SDKException('Response', '102', o_str) raise SDKException('Response', '102') else: raise SDKException('Response', '102') else: _stdout = 'Failed to delete library {0} with error: \n [{1}]' _stderr = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', _stdout.format(library_name, _stderr)) def get(self, library_name, library_details=None): """Returns a DiskLibrary object of the specified disk library name. Args: library_name (str) -- name of the disk library library_details (dict) -- dict containing mountpath and mediaagent details Returns: object - instance of the DiskLibrary class for the given library name Raises: SDKException: if type of the library name argument is not string if no disk library exists with the given name """ if not isinstance(library_name, str): raise SDKException('Storage', '101') else: library_name = library_name.lower() if self.has_library(library_name): return DiskLibrary(self._commcell_object, library_name, self._libraries[library_name], library_details) raise SDKException( 'Storage', '102', 'No disk library exists with name: {0}'.format(library_name) )
Ancestors
Instance variables
var all_disk_libraries
-
Returns dict of all the disk libraries on this commcell
dict - consists of all disk libraries of the commcell { "disk_library1_name": disk_library1_id, "disk_library2_name": disk_library2_id }
Expand source code Browse git
@property def all_disk_libraries(self): """Returns dict of all the disk libraries on this commcell dict - consists of all disk libraries of the commcell { "disk_library1_name": disk_library1_id, "disk_library2_name": disk_library2_id } """ return self._libraries
Methods
def add(self, library_name, media_agent, mount_path, username='', password='', servertype=0, saved_credential_name='')
-
Adds a new Disk Library to the Commcell.
Args
library_name (str) – name of the new library to add
media_agent (str/object) – name or instance of media agent to add the library to
mount_path (str) – full path of the folder to mount the library at
username (str) – username to access the mount path default: ""
password (str) – password to access the mount path default: ""
servertype (int) – provide cloud library server type default 0, value 59 for HPstore
saved_credential_name (str) – name of the saved credential default: ""
Returns
object - instance of the DiskLibrary class, if created successfully
Raises
SDKException: if type of the library name argument is not string
if type of the mount path argument is not string if type of the username argument is not string if type of the password argument is not string if type of the media agent argument is not either string or MediaAgent instance if failed to create disk library if response is empty if response is not success
Expand source code Browse git
def add(self, library_name, media_agent, mount_path, username="", password="", servertype=0, saved_credential_name=""): """Adds a new Disk Library to the Commcell. Args: library_name (str) -- name of the new library to add media_agent (str/object) -- name or instance of media agent to add the library to mount_path (str) -- full path of the folder to mount the library at username (str) -- username to access the mount path default: "" password (str) -- password to access the mount path default: "" servertype (int) -- provide cloud library server type default 0, value 59 for HPstore saved_credential_name (str) -- name of the saved credential default: "" Returns: object - instance of the DiskLibrary class, if created successfully Raises: SDKException: if type of the library name argument is not string if type of the mount path argument is not string if type of the username argument is not string if type of the password argument is not string if type of the media agent argument is not either string or MediaAgent instance if failed to create disk library if response is empty if response is not success """ if not (isinstance(library_name, str) and isinstance(mount_path, str) and isinstance(username, str) and isinstance(password, str)): raise SDKException('Storage', '101') 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') request_json = { "isConfigRequired": 1, "library": { "mediaAgentId": int(media_agent.media_agent_id), "libraryName": library_name, "mountPath": mount_path, "loginName": username, "password": b64encode(password.encode()).decode(), "opType": 1, "savedCredential":{ "credentialName": saved_credential_name } } } if servertype > 0: request_json["library"]["serverType"] = servertype request_json["library"]["isCloud"] = 1 if saved_credential_name: request_json["library"]["password"] = b64encode("XXXXX".encode()).decode() if servertype == 59: request_json["library"]["HybridCloudOption"] = { "enableHybridCloud": "2", "diskLibrary": {"_type_": "9"}} request_json["library"]["savedCredential"] = {"_type_": "9"} flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._LIBRARY, request_json ) if flag: if response.json(): if 'library' in response.json(): library = response.json()['library'] # initialize the libraries again # so the libraries object has all the libraries self.refresh() return DiskLibrary( self._commcell_object, library['libraryName'], library_details=library) elif 'errorCode' in response.json(): error_message = response.json()['errorMessage'] o_str = 'Failed to create disk library\nError: "{0}"'.format(error_message) raise SDKException('Storage', '102', o_str) else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string)
def delete(self, library_name)
-
deletes the specified library.
Args
library_name (str) – name of the disk library to delete
Raises
SDKException: if type of the library name argument is not string if no library exists with the given name if response is incorrect
Expand source code Browse git
def delete(self, library_name): """deletes the specified library. Args: library_name (str) -- name of the disk library to delete Raises: SDKException: if type of the library name argument is not string if no library exists with the given name if response is incorrect """ if not isinstance(library_name, str): raise SDKException('Storage', '101') if not self.has_library(library_name): raise SDKException('Storage', '102', 'No library exists with name: {0}'. format(library_name)) request_json = { "EVGui_ConfigureStorageLibraryReq": { "isDeconfigLibrary": 1, "library": { "opType": 2, "libraryName": library_name } } } exec_command = self._commcell_object._services['EXECUTE_QCOMMAND'] flag, response = self._commcell_object._cvpysdk_object.make_request('POST', exec_command, request_json) if flag: if response.json(): if 'library' in response.json(): _response = response.json()['library'] if 'errorCode' in _response: if _response['errorCode'] == 0: self.refresh() else: raise SDKException('Storage', '102', _response['errorMessage']) else: if 'errorMessage' in response.json(): o_str = 'Error: ' + response.json()['errorMessage'] raise SDKException('Response', '102', o_str) raise SDKException('Response', '102') else: raise SDKException('Response', '102') else: _stdout = 'Failed to delete library {0} with error: \n [{1}]' _stderr = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', _stdout.format(library_name, _stderr))
def get(self, library_name, library_details=None)
-
Returns a DiskLibrary object of the specified disk library name.
Args
library_name (str) – name of the disk library
library_details (dict) – dict containing mountpath and mediaagent details
Returns
object - instance of the DiskLibrary class for the given library name
Raises
SDKException: if type of the library name argument is not string
if no disk library exists with the given name
Expand source code Browse git
def get(self, library_name, library_details=None): """Returns a DiskLibrary object of the specified disk library name. Args: library_name (str) -- name of the disk library library_details (dict) -- dict containing mountpath and mediaagent details Returns: object - instance of the DiskLibrary class for the given library name Raises: SDKException: if type of the library name argument is not string if no disk library exists with the given name """ if not isinstance(library_name, str): raise SDKException('Storage', '101') else: library_name = library_name.lower() if self.has_library(library_name): return DiskLibrary(self._commcell_object, library_name, self._libraries[library_name], library_details) raise SDKException( 'Storage', '102', 'No disk library exists with name: {0}'.format(library_name) )
Inherited members
class DiskLibrary (commcell_object, library_name, library_id=None, library_details=None)
-
Class for a specific disk library.
Initialise the DiskLibrary object.
Args
commcell_object (object) – instance of the Commcell class
library_name (str) – name of the disk library
library_id (str) – id of the disk library default: None
library_details (dict) – dict containing mountpath and mediaagent details default: None
Returns
object - instance of the DiskLibrary class
Expand source code Browse git
class DiskLibrary(object): """Class for a specific disk library.""" def __init__(self, commcell_object, library_name, library_id=None, library_details=None): """Initialise the DiskLibrary object. Args: commcell_object (object) -- instance of the Commcell class library_name (str) -- name of the disk library library_id (str) -- id of the disk library default: None library_details (dict) -- dict containing mountpath and mediaagent details default: None Returns: object - instance of the DiskLibrary class """ self._commcell_object = commcell_object self._library_name = library_name.lower() if library_id: self._library_id = str(library_id) else: self._library_id = self._get_library_id() self._library_properties_service = self._commcell_object._services[ 'GET_LIBRARY_PROPERTIES'] % (self._library_id) self._library_properties = self._get_library_properties() self._advanced_library_properties = self._get_advanced_library_properties() if library_details is not None: self.mountpath = library_details.get('mountPath', None) self.mediaagent = library_details.get('mediaAgentName', None) def __repr__(self): """String representation of the instance of this class.""" representation_string = 'DiskLibrary class instance for library: "{0}" of Commcell: "{1}"' return representation_string.format( self.library_name, self._commcell_object.commserv_name ) def move_mountpath(self, mountpath_id, source_device_path, source_mediaagent_id, target_device_path, target_mediaagent_id, target_device_id=0): """ To perform move mountpath operation Args: mountpath_id (int) -- Mountpath Id that need to be moved. source_device_path (str) -- Present Mountpath location source_mediaagent_id (int) -- MediaAgent Id on which present mountpath exists target_device_path (str) -- New Mountpath location target_mediaagent_id (int) -- MediaAgent Id on which new mountpath exists target_device_id (int) -- Device Id of target path if already exists Returns: instance of the Job class for this move mountpath job Raises Exception: - if argument datatype is invalid - if API response error code is not 0 - if response is empty - if response code is not as expected """ if not (isinstance(mountpath_id, int) and isinstance(source_mediaagent_id, int) and isinstance(target_mediaagent_id, int) and (isinstance(target_device_path, str) or target_device_id > 0) and isinstance(source_device_path, str)): raise SDKException('Storage', '101') MOVE_MOUNTPATH_DETAILS = self._commcell_object._services['GET_MOVE_MOUNTPATH_DETAILS'] % (mountpath_id) flag, response = self._commcell_object._cvpysdk_object.make_request('GET', MOVE_MOUNTPATH_DETAILS) source_device_id = None if flag: if response.json(): if 'sourceDeviceInfo' in response.json(): source_device_id = response.json().get('sourceDeviceInfo').get('deviceId', None) if not source_device_id: raise SDKException('Storage', '102', 'Failed to get details of the mountpath for move') else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) request_json = { 'MPMoveOption': { 'mountPathMoveList': [{ 'sourceDeviceId': source_device_id, 'sourcemediaAgentId': source_mediaagent_id, 'targetMediaAgentId': target_mediaagent_id, }] } } if target_device_id > 0: request_json['MPMoveOption']['mountPathMoveList'][0]['targetDeviceId'] = target_device_id else: request_json['MPMoveOption']['mountPathMoveList'][0]['targetDevicePath'] = target_device_path flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._commcell_object._services['MOVE_MOUNTPATH'], request_json) if flag: if response.json(): if "jobIds" in response.json(): if len(response.json()['jobIds']) == 1: from cvpysdk.job import Job return Job(self._commcell_object, response.json()['jobIds'][0]) else: from cvpysdk.job import Job mp_move_job_list = [] for job_id in response.json()['jobIds']: mp_move_job_list.append(Job(self._commcell_object, job_id)) return mp_move_job_list if "errorCode" in response.json(): error_message = response.json()['errorMessage'] o_str = 'Error: "{0}"'.format(error_message) raise SDKException('Commcell', '105', o_str) else: raise SDKException('Commcell', '105') else: raise SDKException('Response', '102') else: raise SDKException('Response', '101', self._commcell_object._update_response_(response.text)) def validate_mountpath(self, mountpath_drive_id, media_agent): """ To perform storage validation on mountpath Args: mountpath_drive_id (int) -- Drive Id of mountpath that need to be validate. media_agent (str) -- MediaAgent on which Mountpath exists Returns: instance of the Job class for this storage validation job Raises Exception: - if argument datatype is invalid - if API response error code is not 0 - if response is empty - if response code is not as expected """ if not (isinstance(mountpath_drive_id, int) and isinstance(media_agent, str)): raise SDKException('Storage', '101') request_xml = """<TMMsg_CreateTaskReq> <taskInfo taskOperation="1"> <task associatedObjects="0" description="Storage Validation - Automation" initiatedFrom="1" isEZOperation="0" isEditing="0" isFromCommNetBrowserRootNode="0" ownerId="1" ownerName="" policyType="0" runUserId="1" sequenceNumber="0" taskType="1"> <taskFlags notRunnable="0" /> </task> <subTasks subTaskOperation="1"> <subTask flags="0" operationType="4013" subTaskId="1" subTaskOrder="0" subTaskType="1"/> <options originalJobId="0"> <adminOpts> <libraryOption operation="13" validationFlags="0" validattionReservedFlags="0"> <library libraryId="{0}" /> <mediaAgent mediaAgentName="{1}" /> <driveIds driveId="{2}" /> <validateDrive chunkSize="16384" chunksTillEnd="0" fileMarkerToStart="2" numberOfChunks="2" threadCount="2" volumeBlockSize="64" /> </libraryOption> </adminOpts> </options> </subTasks> </taskInfo> </TMMsg_CreateTaskReq>""".format(self.library_id, media_agent, mountpath_drive_id) flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._commcell_object._services['CREATE_TASK'], request_xml ) if flag: if response.json(): if "jobIds" in response.json(): from cvpysdk.job import Job return Job(self._commcell_object, response.json()['jobIds'][0]) if "errorCode" in response.json(): error_message = response.json()['errorMessage'] o_str = 'Error: "{0}"'.format(error_message) raise SDKException('Commcell', '105', o_str) else: raise SDKException('Commcell', '105') else: raise SDKException('Response', '102') else: raise SDKException('Response', '101', self._commcell_object._update_response_(response.text)) def add_cloud_mount_path(self, mount_path, media_agent, username, password, server_type): """ Adds a mount path to the cloud library Args: mount_path (str) -- cloud container or bucket. media_agent (str) -- MediaAgent on which mountpath exists username (str) -- Username to access the mount path in the format <Service Host>//<Account Name> Eg: s3.us-west-1.amazonaws.com//MyAccessKeyID. For more information refer http://documentation.commvault.com/commvault/v11/article?p=97863.htm. password (str) -- Password to access the mount path server_type (int) -- provide cloud library server type Eg: 3-Microsoft Azure Storage . For more information refer http://documentation.commvault.com/commvault/v11/article?p=97863.htm. Returns: None Raises Exception: - if mountpath or mediaagent or username or password or servertype arguments dataype is invalid - if servertype input data is incorrect - if API response error code is not 0 - if response is empty - if response code is not as expected """ if not (isinstance(mount_path, str) or isinstance(media_agent, str) or isinstance(username, str) or isinstance(password, str) or isinstance(server_type, int)): raise SDKException('Storage', '101') request_json = { "isConfigRequired": 1, "library": { "opType": 4, "isCloud": 1, "mediaAgentName": media_agent, "libraryName": self._library_name, "mountPath": mount_path, "loginName": username, "password": b64encode(password.encode()).decode(), "serverType": server_type } } exec_command = self._commcell_object._services['LIBRARY'] flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', exec_command, request_json ) if flag: if response.json(): if 'library' in response.json(): _response = response.json()['library'] if 'errorCode' in _response: if _response['errorCode'] != 0: raise SDKException('Storage', '102', _response['errorMessage']) else: raise SDKException('Response', '102') else: raise SDKException('Response', '102') else: _stdout = 'Failed to add mount path [{0}] for library [{1}] with error: \n [{2}]' _stderr = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', _stdout.format(mount_path, self._library_name, _stderr)) def add_storage_accelerator_credential(self, mount_path, saved_credential="", reset=False): """ Add storage accelerator credential to the cloud mount path Args: mount_path (str) -- Mount path to which secondary credentials needs to be added saved_credential (str) -- saved credential name default: "" reset (bool) -- reset storage accelerator credential default: False Raises Exception: - if mountpath datatype is invalid - if API response error code is not 0 - if response is empty - if response code is not as expected """ if not isinstance(mount_path, str): raise SDKException('Storage', '101') request_json = { "library": { "mediaAgentName": self.media_agent, "libraryName": self._library_name, "mountPath": mount_path, "opType": 8 }, "libNewProp": { "secondaryCredential": { "credentialName": saved_credential }, "resetSecondaryCredentials": reset } } exec_command = self._commcell_object._services['LIBRARY'] flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', exec_command, request_json ) if flag: if response.json(): if 'library' in response.json(): _response = response.json()['library'] if 'errorCode' in _response: if _response['errorCode'] != 0: raise SDKException('Storage', '102', _response['errorMessage']) else: raise SDKException('Response', '102') else: raise SDKException('Response', '102') else: _stdout = 'Failed to add storage accelerator credential with error: \n [{0}]' _stderr = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', _stdout.format(_stderr)) def _get_library_properties(self): """Gets the disk library properties. Returns: dict - dictionary consisting of the properties of this library Raises: SDKException: if response is empty if failed to get disk library properties if response is not success """ flag, response = self._commcell_object._cvpysdk_object.make_request( 'GET', self._library_properties_service ) if flag: if response.json(): if 'libraryInfo' in response.json(): return response.json()['libraryInfo'] raise SDKException('Storage', '102', 'Failed to get disk Library properties') raise SDKException('Response', '102') response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) def _get_advanced_library_properties(self): """Gets the advanced disk library properties. Returns: dict - dictionary consisting of the advanced properties of disk library Raises: SDKException: if response is empty if failed to get disk library properties if response is not success """ flag, response = self._commcell_object._cvpysdk_object.make_request( 'GET', f"{self._library_properties_service}?propertylevel=20" ) if flag: if response.json(): if 'libraryInfo' in response.json(): return response.json()['libraryInfo'] raise SDKException('Storage', '102', 'Failed to get disk Library properties') raise SDKException('Response', '102') response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) def _get_library_id(self): """Gets the library id associated with this disk library. Returns: str - id associated with this disk library """ libraries = DiskLibraries(self._commcell_object) return libraries.get(self.library_name).library_id def refresh(self): """Refresh the properties of this disk library.""" self._library_properties = self._get_library_properties() self._advanced_library_properties = self._get_advanced_library_properties() def add_mount_path(self, mount_path, media_agent, username='', password=''): """ Adds a mount path [local/remote] to the disk library Args: mount_path (str) -- Mount path which needs to be added to disklibrary. This could be a local or remote mount path on mediaagent media_agent (str) -- MediaAgent on which mountpath exists username (str) -- Username to access the mount path password (str) -- Password to access the mount path Returns: None Raises Exception: - if mountpath and mediaagent datatype is invalid - if API response error code is not 0 - if response is empty - if response code is not as expected """ if not isinstance(mount_path, str) or not isinstance(media_agent, str): raise SDKException('Storage', '101') request_json = { "EVGui_ConfigureStorageLibraryReq": { "isConfigRequired": 1, "library": { "opType": 4, "mediaAgentName": media_agent, "libraryName": self._library_name, "mountPath": mount_path, "loginName": username, "password": b64encode(password.encode()).decode(), } } } exec_command = self._commcell_object._services['EXECUTE_QCOMMAND'] flag, response = self._commcell_object._cvpysdk_object.make_request('POST', exec_command, request_json) if flag: if response.json(): if 'library' in response.json(): _response = response.json()['library'] if 'errorCode' in _response: if _response['errorCode'] != 0: raise SDKException('Storage', '102', _response['errorMessage']) else: raise SDKException('Response', '102') else: raise SDKException('Response', '102') else: _stdout = 'Failed to add mount path [{0}] for library [{1}] with error: \n [{2}]' _stderr = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', _stdout.format(mount_path, self._library_name, _stderr)) def set_mountpath_reserve_space(self, mount_path, size): """ To set reserve space on the mountpath Args: mount_path (str) -- Mountpath size (int) -- reserve space to be set in MB """ request_json = { "EVGui_ConfigureStorageLibraryReq": { "isConfigRequired": 1, "library": { "opType": 8, "mediaAgentName": self.media_agent, "libraryName": self._library_name, "mountPath": mount_path }, "libNewProp":{ "reserveSpaceInMB": size } } } self._commcell_object.qoperation_execute(request_json) def set_max_data_to_write_on_mount_path(self, mount_path, size): """ To set max data to write on the mountpath Args: mount_path (str) -- Folder path for this mount path. size (int) -- max data to be consumed in MB """ request_json = { "EVGui_ConfigureStorageLibraryReq": { "isConfigRequired": 1, "library": { "opType": 8, "mediaAgentName": self.media_agent, "libraryName": self._library_name, "mountPath": mount_path }, "libNewProp":{ "maxDataToWriteMB": size } } } self._commcell_object.qoperation_execute(request_json) def change_device_access_type(self, mountpath_id, device_id, device_controller_id, media_agent_id, device_access_type): """ To change device access type Args: mountpath_id (int) -- Mount Path Id device_id (int) -- Device Id device_controller_id (int) -- Device Controller Id media_agent_id (int) -- Media Agent Id device_access_type (int) -- Device access type Regular: Access type Value Read 4 Read and Write 6 Preferred 8 IP: Access type Value Read 20 Read/ Write 22 Fibre Channel (FC) Access type Value Read 36 Read and Write 38 iSCSi Access type Value Read 132 Read and Write 134 """ if not all([isinstance(mountpath_id, int), isinstance(device_id, int), isinstance(device_controller_id, int), isinstance(media_agent_id, int), isinstance(device_access_type, int)]): raise SDKException('Storage', '101') request_json = { "EVGui_MMDevicePathInfoReq": { "mountpathId": mountpath_id, "infoList": { "accessType": device_access_type, "deviceId": device_id, "deviceControllerId": device_controller_id, "path": self.mount_path, "enabled": 1, "numWriters": -1, "opType": 2, "autoPickTransportType": 0, "protocolType": 679, "mediaAgent": { "id": media_agent_id } } } } self._commcell_object.qoperation_execute(request_json) def verify_media(self, media_name, location_id): """ To perform verify media operation on media Args: media_name -- Barcode of the media location_id -- Slot Id of the media on the library """ if not (isinstance(media_name, str) and isinstance(location_id,int)): raise SDKException('Storage', '101') request_xml = f"""<TMMsg_CreateTaskReq> <taskInfo> <task taskType="1" /> <subTasks subTaskOperation="1"> <subTask operationType="4005" subTaskType="1"/> <options> <adminOpts> <libraryOption operation="6"> <library _type_="9" libraryName="{self.library_name}"/> <media _type_="46" mediaName="{media_name}"/> <verifyMedia> <location _type_="53" locationId="{location_id}"/> </verifyMedia> </libraryOption> </adminOpts> </options> </subTasks> </taskInfo> </TMMsg_CreateTaskReq>""" flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._commcell_object._services['CREATE_TASK'], request_xml ) if flag: if response.json(): if "jobIds" in response.json(): from cvpysdk.job import Job return Job(self._commcell_object, response.json()['jobIds'][0]) if "errorCode" in response.json(): error_message = response.json()['errorMessage'] o_str = 'Error: "{0}"'.format(error_message) raise SDKException('Storage', '102',o_str) else: raise SDKException('Response', '102') else: raise SDKException('Response', '102') else: raise SDKException('Response', '101', self._commcell_object._update_response_(response.text)) @property def free_space(self): """Returns free space""" return self._library_properties.get('magLibSummary', {}).get('totalFreeSpace').strip() @property def mountpath_usage(self): """Returns mount path usage""" return self._library_properties.get('magLibSummary', {}).get('mountPathUsage').strip() @mountpath_usage.setter def mountpath_usage(self, value): """ Sets mount path usage on the library Args: value (str) -- option needed to set for mountpath usage value: 'SPILL_AND_FILL' or 'FILL_AND_SPILL' """ if not isinstance(value, str): raise SDKException('Storage', '101') if value == 'SPILL_AND_FILL': value = 1 elif value == 'FILL_AND_SPILL': value = 2 else: raise SDKException('Storage', '110') request_json = { "EVGui_ConfigureStorageLibraryReq": { "library": { "opType": 32, "libraryName": self.library_name }, "libNewProp": { "mountPathUsage": value } } } self._commcell_object.qoperation_execute(request_json) def set_mountpath_preferred_on_mediaagent(self, value): """Sets select preferred mountPath according to mediaagent setting on the library. Args: value (bool) -- preferMountPathAccordingToMA value to be set on library (True/False) Raises: SDKException: if failed to update if the type of value input is not correct """ if not isinstance(value, bool): raise SDKException('Storage', '101') request_json = { "EVGui_ConfigureStorageLibraryReq": { "isConfigRequired": 1, "library": { "opType": 32, "libraryName": self.library_name }, "libNewProp": { "preferMountPathAccordingToMA": int(value) } } } self._commcell_object.qoperation_execute(request_json) @property def media_agents_associated(self): """ Returns the media agents associated with the disk library """ mount_paths = self._library_properties.get('MountPathList') media_agents = [mount_path.get('mountPathName').split('[')[1].split(']')[0] for mount_path in mount_paths if "mountPathName" in mount_path] return list(set(media_agents)) @property def name(self): """Returns library display name.""" return self._library_properties['MountPathList'][0]['mountPathSummary']['libraryName'] @property def library_name(self): """Treats the library name as a read-only attribute.""" return self._library_name @property def library_id(self): """Treats the library id as a read-only attribute.""" return self._library_id @property def library_properties(self): """Returns the dictionary consisting of the full properties of the library""" self.refresh() return self._library_properties @property def advanced_library_properties(self): """Returns the dictionary consisting of the advanced properties of the library""" self.refresh() return self._advanced_library_properties @property def mount_path(self): """Treats the library id as a read-only attribute.""" return self.mountpath @mount_path.setter def mount_path(self, mount_path): """ setter for mountpath""" self.mountpath = mount_path @property def media_agent(self): """Treats the library id as a read-only attribute.""" return self.mediaagent @media_agent.setter def media_agent(self, media_agent): """setter for media agent""" self.mediaagent = media_agent def share_mount_path(self, new_media_agent, new_mount_path, **kwargs): """ Method to share a mountpath to a disklibrary Args: new_media_agent (str) -- Media agent which is accessing the shared mount path new_mount_path (int) -- Mount path to be shared \*\*kwargs (dict) -- Optional arguments Available kwargs Options: media_agent (str) -- Media agent associated with library library_name (str) -- Name of the library which has the mount path mount_path (str) -- Mount path to be shared access_type (int) -- The access type of the shared mount path Read Device Access = 4 Read/ Write Device Access = 6 Read Device Access with Preferred = 12 Read/Write Device Access with Preferred = 14 Data Server - IP Read = 20 Data Server - IP Read/ Write = 22 Data Server - FC Read = 36 Data Server - FC Read/ Write = 38 Data Server - iSCSI Read = 132 Data Server - iSCSI Read/ Write = 134 Note: For the Data Server device access type, enter the local path provided in the library/mountPath parameter in the libNewProp/mountPath parameter also. username (str) -- Username to access the mount path, if UNC password (str) -- Password to access the mount path, if UNC Returns: None Raises Exception: - if any of the parameter's dataype is invalid - if API response error code is not 0 - if response is empty - if response code is not as expected """ media_agent = kwargs.get('media_agent', self.mediaagent) library_name = kwargs.get('library_name', self.library_name) mount_path = kwargs.get('mount_path', self.mountpath) access_type = kwargs.get('access_type', 22) username = kwargs.get('username', '') password = kwargs.get('password', '') self._EXECUTE = self._commcell_object._services['EXECUTE_QCOMMAND'] self.library = { "opType": 64, "mediaAgentName": media_agent, "libraryName": library_name, "mountPath": "%s" % mount_path} self.lib_new_prop = { "deviceAccessType": access_type, "password": password, "loginName": username, "mediaAgentName": new_media_agent, "mountPath": "{}".format(new_mount_path), "proxyPassword": ""} request_json = { "EVGui_ConfigureStorageLibraryReq": { "library": self.library, "libNewProp": self.lib_new_prop } } flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._EXECUTE, request_json ) if flag: response_string = self._commcell_object._update_response_(response.text) if response.json(): if "library" in response.json(): response = response.json()["library"] return response else: raise SDKException('Response', '102', response_string) else: raise SDKException('Response', '102', response_string) else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string)
Instance variables
var advanced_library_properties
-
Returns the dictionary consisting of the advanced properties of the library
Expand source code Browse git
@property def advanced_library_properties(self): """Returns the dictionary consisting of the advanced properties of the library""" self.refresh() return self._advanced_library_properties
var free_space
-
Returns free space
Expand source code Browse git
@property def free_space(self): """Returns free space""" return self._library_properties.get('magLibSummary', {}).get('totalFreeSpace').strip()
var library_id
-
Treats the library id as a read-only attribute.
Expand source code Browse git
@property def library_id(self): """Treats the library id as a read-only attribute.""" return self._library_id
var library_name
-
Treats the library name as a read-only attribute.
Expand source code Browse git
@property def library_name(self): """Treats the library name as a read-only attribute.""" return self._library_name
var library_properties
-
Returns the dictionary consisting of the full properties of the library
Expand source code Browse git
@property def library_properties(self): """Returns the dictionary consisting of the full properties of the library""" self.refresh() return self._library_properties
var media_agent
-
Treats the library id as a read-only attribute.
Expand source code Browse git
@property def media_agent(self): """Treats the library id as a read-only attribute.""" return self.mediaagent
var media_agents_associated
-
Returns the media agents associated with the disk library
Expand source code Browse git
@property def media_agents_associated(self): """ Returns the media agents associated with the disk library """ mount_paths = self._library_properties.get('MountPathList') media_agents = [mount_path.get('mountPathName').split('[')[1].split(']')[0] for mount_path in mount_paths if "mountPathName" in mount_path] return list(set(media_agents))
var mount_path
-
Treats the library id as a read-only attribute.
Expand source code Browse git
@property def mount_path(self): """Treats the library id as a read-only attribute.""" return self.mountpath
var mountpath_usage
-
Returns mount path usage
Expand source code Browse git
@property def mountpath_usage(self): """Returns mount path usage""" return self._library_properties.get('magLibSummary', {}).get('mountPathUsage').strip()
var name
-
Returns library display name.
Expand source code Browse git
@property def name(self): """Returns library display name.""" return self._library_properties['MountPathList'][0]['mountPathSummary']['libraryName']
Methods
def add_cloud_mount_path(self, mount_path, media_agent, username, password, server_type)
-
Adds a mount path to the cloud library
Args
mount_path (str) – cloud container or bucket.
media_agent (str) – MediaAgent on which mountpath exists
- username
(str)
– Username to access the mount path in the format
// Eg
- s3.us-west-1.amazonaws.com//MyAccessKeyID. For more information refer http://documentation.commvault.com/commvault/v11/article?p=97863.htm.
password (str) – Password to access the mount path
server_type (int) – provide cloud library server type Eg: 3-Microsoft Azure Storage . For more information refer http://documentation.commvault.com/commvault/v11/article?p=97863.htm.
Returns
None Raises Exception: - if mountpath or mediaagent or username or password or servertype arguments dataype is invalid
- if servertype input data is incorrect - if API response error code is not 0 - if response is empty - if response code is not as expected
Expand source code Browse git
def add_cloud_mount_path(self, mount_path, media_agent, username, password, server_type): """ Adds a mount path to the cloud library Args: mount_path (str) -- cloud container or bucket. media_agent (str) -- MediaAgent on which mountpath exists username (str) -- Username to access the mount path in the format <Service Host>//<Account Name> Eg: s3.us-west-1.amazonaws.com//MyAccessKeyID. For more information refer http://documentation.commvault.com/commvault/v11/article?p=97863.htm. password (str) -- Password to access the mount path server_type (int) -- provide cloud library server type Eg: 3-Microsoft Azure Storage . For more information refer http://documentation.commvault.com/commvault/v11/article?p=97863.htm. Returns: None Raises Exception: - if mountpath or mediaagent or username or password or servertype arguments dataype is invalid - if servertype input data is incorrect - if API response error code is not 0 - if response is empty - if response code is not as expected """ if not (isinstance(mount_path, str) or isinstance(media_agent, str) or isinstance(username, str) or isinstance(password, str) or isinstance(server_type, int)): raise SDKException('Storage', '101') request_json = { "isConfigRequired": 1, "library": { "opType": 4, "isCloud": 1, "mediaAgentName": media_agent, "libraryName": self._library_name, "mountPath": mount_path, "loginName": username, "password": b64encode(password.encode()).decode(), "serverType": server_type } } exec_command = self._commcell_object._services['LIBRARY'] flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', exec_command, request_json ) if flag: if response.json(): if 'library' in response.json(): _response = response.json()['library'] if 'errorCode' in _response: if _response['errorCode'] != 0: raise SDKException('Storage', '102', _response['errorMessage']) else: raise SDKException('Response', '102') else: raise SDKException('Response', '102') else: _stdout = 'Failed to add mount path [{0}] for library [{1}] with error: \n [{2}]' _stderr = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', _stdout.format(mount_path, self._library_name, _stderr))
- username
(str)
– Username to access the mount path in the format
def add_mount_path(self, mount_path, media_agent, username='', password='')
-
Adds a mount path [local/remote] to the disk library
Args
mount_path (str) – Mount path which needs to be added to disklibrary. This could be a local or remote mount path on mediaagent
media_agent (str) – MediaAgent on which mountpath exists
username (str) – Username to access the mount path
password (str) – Password to access the mount path
Returns
None Raises Exception: - if mountpath and mediaagent datatype is invalid
- if API response error code is not 0 - if response is empty - if response code is not as expected
Expand source code Browse git
def add_mount_path(self, mount_path, media_agent, username='', password=''): """ Adds a mount path [local/remote] to the disk library Args: mount_path (str) -- Mount path which needs to be added to disklibrary. This could be a local or remote mount path on mediaagent media_agent (str) -- MediaAgent on which mountpath exists username (str) -- Username to access the mount path password (str) -- Password to access the mount path Returns: None Raises Exception: - if mountpath and mediaagent datatype is invalid - if API response error code is not 0 - if response is empty - if response code is not as expected """ if not isinstance(mount_path, str) or not isinstance(media_agent, str): raise SDKException('Storage', '101') request_json = { "EVGui_ConfigureStorageLibraryReq": { "isConfigRequired": 1, "library": { "opType": 4, "mediaAgentName": media_agent, "libraryName": self._library_name, "mountPath": mount_path, "loginName": username, "password": b64encode(password.encode()).decode(), } } } exec_command = self._commcell_object._services['EXECUTE_QCOMMAND'] flag, response = self._commcell_object._cvpysdk_object.make_request('POST', exec_command, request_json) if flag: if response.json(): if 'library' in response.json(): _response = response.json()['library'] if 'errorCode' in _response: if _response['errorCode'] != 0: raise SDKException('Storage', '102', _response['errorMessage']) else: raise SDKException('Response', '102') else: raise SDKException('Response', '102') else: _stdout = 'Failed to add mount path [{0}] for library [{1}] with error: \n [{2}]' _stderr = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', _stdout.format(mount_path, self._library_name, _stderr))
def add_storage_accelerator_credential(self, mount_path, saved_credential='', reset=False)
-
Add storage accelerator credential to the cloud mount path
Args
mount_path (str) – Mount path to which secondary credentials needs to be added
saved_credential (str) – saved credential name default: ""
reset (bool) – reset storage accelerator credential default: False Raises Exception: - if mountpath datatype is invalid
- if API response error code is not 0 - if response is empty - if response code is not as expected
Expand source code Browse git
def add_storage_accelerator_credential(self, mount_path, saved_credential="", reset=False): """ Add storage accelerator credential to the cloud mount path Args: mount_path (str) -- Mount path to which secondary credentials needs to be added saved_credential (str) -- saved credential name default: "" reset (bool) -- reset storage accelerator credential default: False Raises Exception: - if mountpath datatype is invalid - if API response error code is not 0 - if response is empty - if response code is not as expected """ if not isinstance(mount_path, str): raise SDKException('Storage', '101') request_json = { "library": { "mediaAgentName": self.media_agent, "libraryName": self._library_name, "mountPath": mount_path, "opType": 8 }, "libNewProp": { "secondaryCredential": { "credentialName": saved_credential }, "resetSecondaryCredentials": reset } } exec_command = self._commcell_object._services['LIBRARY'] flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', exec_command, request_json ) if flag: if response.json(): if 'library' in response.json(): _response = response.json()['library'] if 'errorCode' in _response: if _response['errorCode'] != 0: raise SDKException('Storage', '102', _response['errorMessage']) else: raise SDKException('Response', '102') else: raise SDKException('Response', '102') else: _stdout = 'Failed to add storage accelerator credential with error: \n [{0}]' _stderr = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', _stdout.format(_stderr))
def change_device_access_type(self, mountpath_id, device_id, device_controller_id, media_agent_id, device_access_type)
-
To change device access type Args: mountpath_id (int) – Mount Path Id
device_id (int) -- Device Id device_controller_id (int) -- Device Controller Id media_agent_id (int) -- Media Agent Id device_access_type (int) -- Device access type Regular: Access type Value Read 4 Read and Write 6 Preferred 8 IP: Access type Value Read 20 Read/ Write 22 Fibre Channel (FC) Access type Value Read 36 Read and Write 38 iSCSi Access type Value Read 132 Read and Write 134
Expand source code Browse git
def change_device_access_type(self, mountpath_id, device_id, device_controller_id, media_agent_id, device_access_type): """ To change device access type Args: mountpath_id (int) -- Mount Path Id device_id (int) -- Device Id device_controller_id (int) -- Device Controller Id media_agent_id (int) -- Media Agent Id device_access_type (int) -- Device access type Regular: Access type Value Read 4 Read and Write 6 Preferred 8 IP: Access type Value Read 20 Read/ Write 22 Fibre Channel (FC) Access type Value Read 36 Read and Write 38 iSCSi Access type Value Read 132 Read and Write 134 """ if not all([isinstance(mountpath_id, int), isinstance(device_id, int), isinstance(device_controller_id, int), isinstance(media_agent_id, int), isinstance(device_access_type, int)]): raise SDKException('Storage', '101') request_json = { "EVGui_MMDevicePathInfoReq": { "mountpathId": mountpath_id, "infoList": { "accessType": device_access_type, "deviceId": device_id, "deviceControllerId": device_controller_id, "path": self.mount_path, "enabled": 1, "numWriters": -1, "opType": 2, "autoPickTransportType": 0, "protocolType": 679, "mediaAgent": { "id": media_agent_id } } } } self._commcell_object.qoperation_execute(request_json)
def move_mountpath(self, mountpath_id, source_device_path, source_mediaagent_id, target_device_path, target_mediaagent_id, target_device_id=0)
-
To perform move mountpath operation
Args
mountpath_id (int) – Mountpath Id that need to be moved.
source_device_path (str) – Present Mountpath location
source_mediaagent_id (int) – MediaAgent Id on which present mountpath exists
target_device_path (str) – New Mountpath location
target_mediaagent_id (int) – MediaAgent Id on which new mountpath exists
target_device_id (int) – Device Id of target path if already exists
Returns
instance of the Job class for this move mountpath job Raises Exception: - if argument datatype is invalid
- if API response error code is not 0 - if response is empty - if response code is not as expected
Expand source code Browse git
def move_mountpath(self, mountpath_id, source_device_path, source_mediaagent_id, target_device_path, target_mediaagent_id, target_device_id=0): """ To perform move mountpath operation Args: mountpath_id (int) -- Mountpath Id that need to be moved. source_device_path (str) -- Present Mountpath location source_mediaagent_id (int) -- MediaAgent Id on which present mountpath exists target_device_path (str) -- New Mountpath location target_mediaagent_id (int) -- MediaAgent Id on which new mountpath exists target_device_id (int) -- Device Id of target path if already exists Returns: instance of the Job class for this move mountpath job Raises Exception: - if argument datatype is invalid - if API response error code is not 0 - if response is empty - if response code is not as expected """ if not (isinstance(mountpath_id, int) and isinstance(source_mediaagent_id, int) and isinstance(target_mediaagent_id, int) and (isinstance(target_device_path, str) or target_device_id > 0) and isinstance(source_device_path, str)): raise SDKException('Storage', '101') MOVE_MOUNTPATH_DETAILS = self._commcell_object._services['GET_MOVE_MOUNTPATH_DETAILS'] % (mountpath_id) flag, response = self._commcell_object._cvpysdk_object.make_request('GET', MOVE_MOUNTPATH_DETAILS) source_device_id = None if flag: if response.json(): if 'sourceDeviceInfo' in response.json(): source_device_id = response.json().get('sourceDeviceInfo').get('deviceId', None) if not source_device_id: raise SDKException('Storage', '102', 'Failed to get details of the mountpath for move') else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) request_json = { 'MPMoveOption': { 'mountPathMoveList': [{ 'sourceDeviceId': source_device_id, 'sourcemediaAgentId': source_mediaagent_id, 'targetMediaAgentId': target_mediaagent_id, }] } } if target_device_id > 0: request_json['MPMoveOption']['mountPathMoveList'][0]['targetDeviceId'] = target_device_id else: request_json['MPMoveOption']['mountPathMoveList'][0]['targetDevicePath'] = target_device_path flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._commcell_object._services['MOVE_MOUNTPATH'], request_json) if flag: if response.json(): if "jobIds" in response.json(): if len(response.json()['jobIds']) == 1: from cvpysdk.job import Job return Job(self._commcell_object, response.json()['jobIds'][0]) else: from cvpysdk.job import Job mp_move_job_list = [] for job_id in response.json()['jobIds']: mp_move_job_list.append(Job(self._commcell_object, job_id)) return mp_move_job_list if "errorCode" in response.json(): error_message = response.json()['errorMessage'] o_str = 'Error: "{0}"'.format(error_message) raise SDKException('Commcell', '105', o_str) else: raise SDKException('Commcell', '105') else: raise SDKException('Response', '102') else: raise SDKException('Response', '101', self._commcell_object._update_response_(response.text))
def refresh(self)
-
Refresh the properties of this disk library.
Expand source code Browse git
def refresh(self): """Refresh the properties of this disk library.""" self._library_properties = self._get_library_properties() self._advanced_library_properties = self._get_advanced_library_properties()
def set_max_data_to_write_on_mount_path(self, mount_path, size)
-
To set max data to write on the mountpath
Args
mount_path (str) – Folder path for this mount path.
size (int) – max data to be consumed in MB
Expand source code Browse git
def set_max_data_to_write_on_mount_path(self, mount_path, size): """ To set max data to write on the mountpath Args: mount_path (str) -- Folder path for this mount path. size (int) -- max data to be consumed in MB """ request_json = { "EVGui_ConfigureStorageLibraryReq": { "isConfigRequired": 1, "library": { "opType": 8, "mediaAgentName": self.media_agent, "libraryName": self._library_name, "mountPath": mount_path }, "libNewProp":{ "maxDataToWriteMB": size } } } self._commcell_object.qoperation_execute(request_json)
def set_mountpath_preferred_on_mediaagent(self, value)
-
Sets select preferred mountPath according to mediaagent setting on the library.
Args
value (bool) – preferMountPathAccordingToMA value to be set on library (True/False)
Raises
SDKException: if failed to update
if the type of value input is not correct
Expand source code Browse git
def set_mountpath_preferred_on_mediaagent(self, value): """Sets select preferred mountPath according to mediaagent setting on the library. Args: value (bool) -- preferMountPathAccordingToMA value to be set on library (True/False) Raises: SDKException: if failed to update if the type of value input is not correct """ if not isinstance(value, bool): raise SDKException('Storage', '101') request_json = { "EVGui_ConfigureStorageLibraryReq": { "isConfigRequired": 1, "library": { "opType": 32, "libraryName": self.library_name }, "libNewProp": { "preferMountPathAccordingToMA": int(value) } } } self._commcell_object.qoperation_execute(request_json)
def set_mountpath_reserve_space(self, mount_path, size)
-
To set reserve space on the mountpath
Args
mount_path (str) – Mountpath
size (int) – reserve space to be set in MB
Expand source code Browse git
def set_mountpath_reserve_space(self, mount_path, size): """ To set reserve space on the mountpath Args: mount_path (str) -- Mountpath size (int) -- reserve space to be set in MB """ request_json = { "EVGui_ConfigureStorageLibraryReq": { "isConfigRequired": 1, "library": { "opType": 8, "mediaAgentName": self.media_agent, "libraryName": self._library_name, "mountPath": mount_path }, "libNewProp":{ "reserveSpaceInMB": size } } } self._commcell_object.qoperation_execute(request_json)
-
Method to share a mountpath to a disklibrary
Args
new_media_agent (str) – Media agent which is accessing the shared mount path
new_mount_path (int) – Mount path to be shared
**kwargs (dict) – Optional arguments
Available kwargs Options: media_agent (str) -- Media agent associated with library library_name (str) -- Name of the library which has the mount path mount_path (str) -- Mount path to be shared access_type (int) -- The access type of the shared mount path Read Device Access = 4 Read/ Write Device Access = 6 Read Device Access with Preferred = 12 Read/Write Device Access with Preferred = 14 Data Server - IP Read = 20 Data Server - IP Read/ Write = 22 Data Server - FC Read = 36 Data Server - FC Read/ Write = 38 Data Server - iSCSI Read = 132 Data Server - iSCSI Read/ Write = 134 Note: For the Data Server device access type, enter the local path provided in the library/mountPath parameter in the libNewProp/mountPath parameter also. username (str) -- Username to access the mount path, if UNC password (str) -- Password to access the mount path, if UNC
Returns
None Raises Exception: - if any of the parameter's dataype is invalid
- if API response error code is not 0 - if response is empty - if response code is not as expected
Expand source code Browse git
def share_mount_path(self, new_media_agent, new_mount_path, **kwargs): """ Method to share a mountpath to a disklibrary Args: new_media_agent (str) -- Media agent which is accessing the shared mount path new_mount_path (int) -- Mount path to be shared \*\*kwargs (dict) -- Optional arguments Available kwargs Options: media_agent (str) -- Media agent associated with library library_name (str) -- Name of the library which has the mount path mount_path (str) -- Mount path to be shared access_type (int) -- The access type of the shared mount path Read Device Access = 4 Read/ Write Device Access = 6 Read Device Access with Preferred = 12 Read/Write Device Access with Preferred = 14 Data Server - IP Read = 20 Data Server - IP Read/ Write = 22 Data Server - FC Read = 36 Data Server - FC Read/ Write = 38 Data Server - iSCSI Read = 132 Data Server - iSCSI Read/ Write = 134 Note: For the Data Server device access type, enter the local path provided in the library/mountPath parameter in the libNewProp/mountPath parameter also. username (str) -- Username to access the mount path, if UNC password (str) -- Password to access the mount path, if UNC Returns: None Raises Exception: - if any of the parameter's dataype is invalid - if API response error code is not 0 - if response is empty - if response code is not as expected """ media_agent = kwargs.get('media_agent', self.mediaagent) library_name = kwargs.get('library_name', self.library_name) mount_path = kwargs.get('mount_path', self.mountpath) access_type = kwargs.get('access_type', 22) username = kwargs.get('username', '') password = kwargs.get('password', '') self._EXECUTE = self._commcell_object._services['EXECUTE_QCOMMAND'] self.library = { "opType": 64, "mediaAgentName": media_agent, "libraryName": library_name, "mountPath": "%s" % mount_path} self.lib_new_prop = { "deviceAccessType": access_type, "password": password, "loginName": username, "mediaAgentName": new_media_agent, "mountPath": "{}".format(new_mount_path), "proxyPassword": ""} request_json = { "EVGui_ConfigureStorageLibraryReq": { "library": self.library, "libNewProp": self.lib_new_prop } } flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._EXECUTE, request_json ) if flag: response_string = self._commcell_object._update_response_(response.text) if response.json(): if "library" in response.json(): response = response.json()["library"] return response else: raise SDKException('Response', '102', response_string) else: raise SDKException('Response', '102', response_string) else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string)
def validate_mountpath(self, mountpath_drive_id, media_agent)
-
To perform storage validation on mountpath
Args
mountpath_drive_id (int) – Drive Id of mountpath that need to be validate.
media_agent (str) – MediaAgent on which Mountpath exists
Returns
instance of the Job class for this storage validation job Raises Exception: - if argument datatype is invalid
- if API response error code is not 0 - if response is empty - if response code is not as expected
Expand source code Browse git
def validate_mountpath(self, mountpath_drive_id, media_agent): """ To perform storage validation on mountpath Args: mountpath_drive_id (int) -- Drive Id of mountpath that need to be validate. media_agent (str) -- MediaAgent on which Mountpath exists Returns: instance of the Job class for this storage validation job Raises Exception: - if argument datatype is invalid - if API response error code is not 0 - if response is empty - if response code is not as expected """ if not (isinstance(mountpath_drive_id, int) and isinstance(media_agent, str)): raise SDKException('Storage', '101') request_xml = """<TMMsg_CreateTaskReq> <taskInfo taskOperation="1"> <task associatedObjects="0" description="Storage Validation - Automation" initiatedFrom="1" isEZOperation="0" isEditing="0" isFromCommNetBrowserRootNode="0" ownerId="1" ownerName="" policyType="0" runUserId="1" sequenceNumber="0" taskType="1"> <taskFlags notRunnable="0" /> </task> <subTasks subTaskOperation="1"> <subTask flags="0" operationType="4013" subTaskId="1" subTaskOrder="0" subTaskType="1"/> <options originalJobId="0"> <adminOpts> <libraryOption operation="13" validationFlags="0" validattionReservedFlags="0"> <library libraryId="{0}" /> <mediaAgent mediaAgentName="{1}" /> <driveIds driveId="{2}" /> <validateDrive chunkSize="16384" chunksTillEnd="0" fileMarkerToStart="2" numberOfChunks="2" threadCount="2" volumeBlockSize="64" /> </libraryOption> </adminOpts> </options> </subTasks> </taskInfo> </TMMsg_CreateTaskReq>""".format(self.library_id, media_agent, mountpath_drive_id) flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._commcell_object._services['CREATE_TASK'], request_xml ) if flag: if response.json(): if "jobIds" in response.json(): from cvpysdk.job import Job return Job(self._commcell_object, response.json()['jobIds'][0]) if "errorCode" in response.json(): error_message = response.json()['errorMessage'] o_str = 'Error: "{0}"'.format(error_message) raise SDKException('Commcell', '105', o_str) else: raise SDKException('Commcell', '105') else: raise SDKException('Response', '102') else: raise SDKException('Response', '101', self._commcell_object._update_response_(response.text))
def verify_media(self, media_name, location_id)
-
To perform verify media operation on media
Args
media_name – Barcode of the media
location_id – Slot Id of the media on the library
Expand source code Browse git
def verify_media(self, media_name, location_id): """ To perform verify media operation on media Args: media_name -- Barcode of the media location_id -- Slot Id of the media on the library """ if not (isinstance(media_name, str) and isinstance(location_id,int)): raise SDKException('Storage', '101') request_xml = f"""<TMMsg_CreateTaskReq> <taskInfo> <task taskType="1" /> <subTasks subTaskOperation="1"> <subTask operationType="4005" subTaskType="1"/> <options> <adminOpts> <libraryOption operation="6"> <library _type_="9" libraryName="{self.library_name}"/> <media _type_="46" mediaName="{media_name}"/> <verifyMedia> <location _type_="53" locationId="{location_id}"/> </verifyMedia> </libraryOption> </adminOpts> </options> </subTasks> </taskInfo> </TMMsg_CreateTaskReq>""" flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._commcell_object._services['CREATE_TASK'], request_xml ) if flag: if response.json(): if "jobIds" in response.json(): from cvpysdk.job import Job return Job(self._commcell_object, response.json()['jobIds'][0]) if "errorCode" in response.json(): error_message = response.json()['errorMessage'] o_str = 'Error: "{0}"'.format(error_message) raise SDKException('Storage', '102',o_str) else: raise SDKException('Response', '102') else: raise SDKException('Response', '102') else: raise SDKException('Response', '101', self._commcell_object._update_response_(response.text))
class Libraries (commcell_object)
-
Class for libraries
Initialize object of the DiskLibraries class.
Args
commcell_object (object) – instance of the Commcell class
Returns
object - instance of the DiskLibraries class
Expand source code Browse git
class Libraries(object): """ Class for libraries""" def __init__(self, commcell_object): """Initialize object of the DiskLibraries class. Args: commcell_object (object) -- instance of the Commcell class Returns: object - instance of the DiskLibraries class """ self._commcell_object = commcell_object self._LIBRARY = self._commcell_object._services['LIBRARY'] self._libraries = None self.refresh() def _get_libraries(self): """Gets all the disk libraries associated to the commcell specified by commcell object. Returns: dict - consists of all disk libraries of the commcell { "disk_library1_name": disk_library1_id, "disk_library2_name": disk_library2_id } Raises: SDKException: if response is empty if response is not success """ flag, response = self._commcell_object._cvpysdk_object.make_request('GET', self._LIBRARY) if flag: if response.json() and 'response' in response.json(): libraries = response.json()['response'] libraries_dict = {} for library in libraries: temp_name = library['entityInfo']['name'].lower() temp_id = str(library['entityInfo']['id']).lower() libraries_dict[temp_name] = temp_id return libraries_dict else: return {} else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) def has_library(self, library_name): """Checks if a library exists in the commcell with the input library name. Args: library_name (str) -- name of the library Returns: bool - boolean output whether the library exists in the commcell or not Raises: SDKException: if type of the library name argument is not string """ if not isinstance(library_name, str): raise SDKException('Storage', '101') return self._libraries and library_name.lower() in self._libraries def refresh(self): """Refresh the disk libraries associated with the Commcell.""" self._libraries = self._get_libraries()
Subclasses
Methods
def has_library(self, library_name)
-
Checks if a library exists in the commcell with the input library name.
Args
library_name (str) – name of the library
Returns
bool - boolean output whether the library exists in the commcell or not
Raises
SDKException: if type of the library name argument is not string
Expand source code Browse git
def has_library(self, library_name): """Checks if a library exists in the commcell with the input library name. Args: library_name (str) -- name of the library Returns: bool - boolean output whether the library exists in the commcell or not Raises: SDKException: if type of the library name argument is not string """ if not isinstance(library_name, str): raise SDKException('Storage', '101') return self._libraries and library_name.lower() in self._libraries
def refresh(self)
-
Refresh the disk libraries associated with the Commcell.
Expand source code Browse git
def refresh(self): """Refresh the disk libraries associated with the Commcell.""" self._libraries = self._get_libraries()
class MediaAgent (commcell_object, media_agent_name, media_agent_id=None)
-
Class for a specific media agent.
Initialise the MediaAgent object.
Args
commcell_object (object) – instance of the Commcell class
media_agent_name (str) – name of the media agent
media_agent_id (str) – id of the media agent default: None
Returns
object - instance of the MediaAgent class
Expand source code Browse git
class MediaAgent(object): """Class for a specific media agent.""" def __init__(self, commcell_object, media_agent_name, media_agent_id=None): """Initialise the MediaAgent object. Args: commcell_object (object) -- instance of the Commcell class media_agent_name (str) -- name of the media agent media_agent_id (str) -- id of the media agent default: None Returns: object - instance of the MediaAgent class """ self._commcell_object = commcell_object self._media_agent_name = media_agent_name.lower() self._media_agent_info = None if media_agent_id: self._media_agent_id = str(media_agent_id) else: self._media_agent_id = self._get_media_agent_id() self._MEDIA_AGENT = self._commcell_object._services['MEDIA_AGENT'] % ( self._media_agent_name ) self._CLOUD_MEDIA_AGENT = self._commcell_object._services['CLOUD_MEDIA_AGENT'] % ( self._media_agent_id ) self._CREATE_TASK = self._commcell_object._services['CREATE_TASK'] self._MEDIA_AGENTS = self._commcell_object._services['GET_MEDIA_AGENTS'] + "/{0}".format( self.media_agent_id ) self.refresh() def __repr__(self): """String representation of the instance of this class.""" representation_string = 'MediaAgent class instance for MA: "{0}", of Commcell: "{1}"' return representation_string.format( self.media_agent_name, self._commcell_object.commserv_name ) def _get_media_agent_id(self): """Gets the media agent id associated with this media agent. Returns: str - id associated with this media agent """ media_agents = MediaAgents(self._commcell_object) return media_agents.get(self.media_agent_name).media_agent_id def _get_media_agent_properties(self): """Returns the media agent properties of this media agent. Returns: dict - dictionary consisting of the properties of this client Raises: SDKException: if response is empty if response is not success """ flag, response = self._commcell_object._cvpysdk_object.make_request( 'GET', self._MEDIA_AGENTS ) if flag: if response.json() and 'mediaAgentList' in response.json(): self._media_agent_info = response.json()['mediaAgentList'][0] return response.json() else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) def _initialize_media_agent_properties(self): """Initializes the properties for this Media Agent""" self._status = None self._platform = None self._index_cache_enabled = None self._index_cache = None self._is_power_mgmt_allowed = None self._is_power_mgmt_supported = None self._is_power_management_enabled = None self._power_management_controller_name = None self._power_status = None properties = self._get_media_agent_properties() if properties['mediaAgentList']: mediaagent_list = properties['mediaAgentList'][0] else: raise SDKException('Response', '102') status = mediaagent_list.get('status') if status == 1: self._is_online = True else: self._is_online = False if mediaagent_list['osInfo']['OsDisplayInfo']['OSName']: platform = mediaagent_list['osInfo']['OsDisplayInfo']['OSName'] if 'windows' in platform.lower(): self._platform = 'WINDOWS' elif 'unix' in platform.lower() or 'linux' in platform.lower(): self._platform = 'UNIX' else: self._platform = platform if mediaagent_list['mediaAgentProps']['mediaAgentIdxCacheProps']['cacheEnabled']: self._index_cache_enabled = mediaagent_list['mediaAgentProps'][ 'mediaAgentIdxCacheProps']['cacheEnabled'] if mediaagent_list['mediaAgentProps']['mediaAgentIdxCacheProps']['cachePath']['path']: self._index_cache = mediaagent_list['mediaAgentProps']['mediaAgentIdxCacheProps' ]['cachePath']['path'] if mediaagent_list['powerManagementInfo']['isPowerMgmtSupported']: self._is_power_mgmt_supported = mediaagent_list['powerManagementInfo']['isPowerMgmtSupported'] if self._is_power_mgmt_supported: if mediaagent_list['powerManagementInfo']['isPowerManagementEnabled']: self._is_power_management_enabled = mediaagent_list['powerManagementInfo']['isPowerManagementEnabled'] if mediaagent_list['powerManagementInfo']['isPowerMgmtAllowed']: self._is_power_mgmt_allowed = mediaagent_list['powerManagementInfo']['isPowerMgmtAllowed'] if mediaagent_list['powerManagementInfo']['powerStatus']: self._power_status = mediaagent_list['powerManagementInfo']['powerStatus'] if mediaagent_list['powerManagementInfo']['selectedCloudController']['clientName']: self._power_management_controller_name = mediaagent_list['powerManagementInfo']['selectedCloudController']['clientName'] def enable_power_management(self, pseudo_client_name): """ Enables power management using the provided cloud controller (pseudo client) Args : pseudo_client_name : VSA pseudo client to be used as cloud controller Raises: SDKException: If response is not success If Power management is not supported """ if self._is_power_mgmt_allowed: client_obj = self._commcell_object._clients.get(pseudo_client_name) pseudo_client_name_client_id = client_obj._get_client_id() """ payLoad = '<EVGui_SetCloudVMManagementInfoReq hostId="' + self.media_agent_id + '" useMediaAgent="1"> <powerManagementInfo isPowerManagementEnabled="1" > <selectedCloudController clientId="' + PseudoClientName_client_id + '" clientName="' + \ PseudoClientName + '"/></powerManagementInfo></EVGui_SetCloudVMManagementInfoReq>' """ payLoad = '<EVGui_SetCloudVMManagementInfoReq hostId="{0}" useMediaAgent="1"> <powerManagementInfo isPowerManagementEnabled="1" > <selectedCloudController clientId="{1}" clientName="{2}"/></powerManagementInfo></EVGui_SetCloudVMManagementInfoReq>'.format( self.media_agent_id, pseudo_client_name_client_id, pseudo_client_name) response = self._commcell_object._qoperation_execute(payLoad) if response['errorCode'] != 0: raise SDKException('Response', '102', str(response)) else: raise SDKException('Storage', '102', "Power management is not supported") def _perform_power_operation(self, operation): """ Performs power operation Args : self : Object operation : Operation to perform Raises: SDKException: If operation is not 1 or 0 If ower management is NOT enabled or NOT supported on MediaAgent If API response is empty If API response is not success """ if not operation in ("1", "0"): raise SDKException('Response', '102', "Invalid power operation type") if self._is_power_management_enabled: flag, response = self._commcell_object._cvpysdk_object.make_request( 'GET', self._CLOUD_MEDIA_AGENT + "/" + operation ) if not flag: raise SDKException('Response', '102', str(response)) if response.json()['errorCode'] != 0: raise SDKException('Response', '102', str(response)) else: raise SDKException('Storage', '102', 'Power management is NOT enabled or NOT supported') def power_on(self, wait_till_online=True): """ Power-on the MediaAgent Args : self : Object wait_till_online : True : Waits until the MediaAgent is online False : Just submits the power-on request """ if self.current_power_status not in ["Starting", "Started", "Online"]: self._perform_power_operation("1") if wait_till_online == True and self.current_power_status != "Online": self.wait_for_power_status("Online") def power_off(self, wait_till_stopped=True): """ Power-off MediaAgent Args : self : Object wait_till_stopped : True : Waits until the MediaAgent is stopped False : Just submits the power-off request """ if self.current_power_status not in ["Stopping", "Stopped"]: self._perform_power_operation("0") if wait_till_stopped == True and self.current_power_status != "Stopped": self.wait_for_power_status("Stopped") def wait_for_power_status(self, expected_power_status, time_out_sec=600): """ Waits until the expected power status not achieved Args : self : Object expected_power_status : The expected power status as following. Starting Started Online Stopping Stopped time_out_sec : Maximum time to wait for the expected power status Raises: SDKException: If time_out_sec is not an integer and time_out_sec not None If expected power status is not achieved within time_out_sec time """ if time_out_sec != None: if not isinstance(time_out_sec, int): raise SDKException('Storage', '102', 'Expected an integer value for [time_out_sec]') start_time = time.time() while self.current_power_status != expected_power_status: time.sleep(10) if time_out_sec != None: if time.time() - start_time > time_out_sec: raise SDKException('Storage', '102', 'The expected power status is not achieved within expected time') def change_index_cache(self, old_index_cache_path, new_index_cache_path): """ Begins a catalog migration job via the CreateTask end point. Args : old_index_cache_path - source index cache path new_index_cache_path - destination index cache path Returns : Returns job object of catalog migration job Raises: SDKException: if response is empty if response is not success """ conf_guid = str(uuid.uuid4()) xml_options_string = '''<Indexing_IdxDirectoryConfiguration configurationGuid="{0}" icdPath="{1}" maClientFocusName="{2}" maGuid="" oldIcdPath="{3}" opType="0" />''' .format( conf_guid, new_index_cache_path, self.media_agent_name, old_index_cache_path) request_json = { "taskInfo": { "taskOperation": 1, "task": { "isEZOperation": False, "description": "", "ownerId": 1, "runUserId": 1, "taskType": 1, "ownerName": "", "alertName": "", "sequenceNumber": 0, "isEditing": False, "GUID": "", "isFromCommNetBrowserRootNode": False, "initiatedFrom": 3, "policyType": 0, "associatedObjects": 0, "taskName": "", "taskFlags": { "notRunnable": False, "disabled": False } }, "subTasks": [ { "subTaskOperation": 1, "subTask": { "subTaskOrder": 0, "subTaskType": 1, "flags": 0, "operationType": 5018, "subTaskId": 1 }, "options": { "originalJobId": 0, "adminOpts": { "catalogMigrationOptions": { "xmlOptions": xml_options_string, "mediaAgent": { "mediaAgentId": int(self._media_agent_id), "_type_": 11 } } } } } ] } } flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._CREATE_TASK, request_json ) if flag: if response.json() and 'jobIds' in response.json() and response.json()['jobIds'][0]: response_json = response.json() catalogmigration_jobid = response_json["jobIds"][0] catalogmigration_job_obj = self._commcell_object.job_controller.get( catalogmigration_jobid) return catalogmigration_job_obj else: raise SDKException('Response', '102') else: raise SDKException('Response', '101') def set_state(self, enable=True): """ disable the media agent by change in media agent properties. Args: enable - (bool) True - Enable the media agent False - Disable the media agent Raises: "exception" - if there is an empty response - if there is an error in request execution - if response status is failure """ if type(enable) != bool: raise SDKException('Storage', '101') media_id = int(self.media_agent_id) request_json = { "mediaAgentInfo": { "mediaAgent": { "mediaAgentId": media_id }, "mediaAgentProps": { "enableMA": enable } } } flag, response = self._commcell_object._cvpysdk_object.make_request( 'PUT', self._MEDIA_AGENTS, request_json ) # check for response # possible key errors if key not present in response, defaults set if flag: if response and response.json(): response = response.json() if response.get('error', {}).get('errorCode', -1) != 0: error_message = response.get('error', {}).get('errorString', '') raise SDKException('Storage', '102', error_message) else: raise SDKException('Response', '102') else: raise SDKException('Response', '101') def mark_for_maintenance(self, mark=False): """ mark the media agent offline for maintenance Args: mark - (bool) True - mark the media agent for maintenance False - UNMARK the media agent for maintenance Raises: "exception" - if there is an empty response - if there is an error in request execution - if response status is failure """ if type(mark) != bool: raise SDKException('Storage', '101') media_id = int(self.media_agent_id) request_json = { "mediaAgentInfo": { "mediaAgent": { "mediaAgentId": media_id }, "mediaAgentProps": { "markMAOfflineForMaintenance": mark } } } flag, response = self._commcell_object._cvpysdk_object.make_request( 'PUT', self._MEDIA_AGENTS, request_json ) if flag: if response and response.json(): response = response.json() if response.get('error', {}).get('errorCode', -1) != 0: error_message = response.get('error', {}).get('errorString', '') raise SDKException('Storage', '102', error_message) else: raise SDKException('Response', '102') else: raise SDKException('Response', '101') def set_ransomware_protection(self, status): """Enables / Disables the ransomware protection on Windows MediaAgent. Args: status (bool) -- True or False value to turn it on/off True - ransomware protection on MediaAgent - ON False - ransomware protection on MediaAgent - OFF Returns: None -- if operation performed successfully. Raises: Exception(Exception_Code, Exception_Message): - if there is failure in executing the operation """ # this works only on WINDOWS MA if self._platform != 'WINDOWS': raise SDKException('Storage', '101') if type(status) != bool: raise SDKException('Storage', '101') media_id = int(self.media_agent_id) request_json = { "mediaAgentInfo": { "mediaAgent": { "mediaAgentId": media_id }, "mediaAgentProps": { "isRansomwareProtected": status } } } flag, response = self._commcell_object._cvpysdk_object.make_request( 'PUT', self._MEDIA_AGENTS, request_json ) if flag: if response and response.json(): response = response.json() if response.get('error', {}).get('errorCode', -1) != 0: error_message = response.get('error', {}).get('errorString', '') raise SDKException('Storage', '102', error_message) else: raise SDKException('Response', '102') else: raise SDKException('Response', '101') def set_concurrent_lan(self, enable=True): """ disable / enable concurrent LAN backup in Media agent properties. Args: enable - (bool) True - Enable concurent LAN Backup False - Disable concurent LAN Backup Returns: None -- if operation performed successfully. Raises: SDKException: - if there is failure in executing the operation """ if type(enable) != bool: raise SDKException('Storage', '101') media_id = int(self.media_agent_id) request_json = { "mediaAgentInfo": { "mediaAgent": { "mediaAgentId": media_id }, "mediaAgentProps": { "optimizeForConcurrentLANBackups": enable } } } flag, response = self._commcell_object._cvpysdk_object.make_request( 'PUT', self._MEDIA_AGENTS, request_json ) if flag: if response and response.json(): response = response.json() if response.get('error', {}).get('errorCode', -1) != 0: error_message = response.get('error', {}).get('errorString', '') raise SDKException('Storage', '102', error_message) else: raise SDKException('Response', '102') else: raise SDKException('Response', '101') @property def name(self): """Returns the media agent display name""" return self._media_agent_info['mediaAgent']['displayName'] @property def media_agent_name(self): """Treats the media agent name as a read-only attribute.""" return self._media_agent_name @property def media_agent_id(self): """Treats the media agent id as a read-only attribute.""" return self._media_agent_id @property def is_online(self): """Treats the status as read-only attribute""" return self._is_online @property def platform(self): """Treats the platform as read-only attribute""" return self._platform @property def index_cache_path(self): """Treats the index cache path as a read-only attribute""" return self._index_cache @property def index_cache_enabled(self): """Treats the cache enabled value as a read-only attribute""" return self._index_cache_enabled @property def is_power_management_enabled(self): """ Returns power management enable status""" return self._is_power_management_enabled @property def current_power_status(self): """ Returns the power state of the MA. Args : self : Object Returns : str - Current power status of the MediaAgent as following Starting : Power-on process in going on Started : MA is powered-on successfully but still not synced with CS Online : Powered-on and synced with CS. MA is ready to use. Stopping : Power-off operation is going on. Stopped : MA is powered-off Unknown : MA power status is still not synced with cloud provider. MA discovery is going on or power state sync with happening with cloud provider or something is NOT right. """ self.refresh() power_status = {0: 'Unknown', 1: 'Starting', 2: 'Started', 3: 'Online', 4: 'Stopping', 5: 'Stopped'} return power_status.get(self._power_status) def refresh(self): """Refresh the properties of the MediaAgent.""" self._initialize_media_agent_properties()
Instance variables
var current_power_status
-
Returns the power state of the MA.
Args : self : Object Returns : str - Current power status of the MediaAgent as following Starting : Power-on process in going on Started : MA is powered-on successfully but still not synced with CS Online : Powered-on and synced with CS. MA is ready to use. Stopping : Power-off operation is going on. Stopped : MA is powered-off Unknown : MA power status is still not synced with cloud provider. MA discovery is going on or power state sync with happening with cloud provider or something is NOT right.
Expand source code Browse git
@property def current_power_status(self): """ Returns the power state of the MA. Args : self : Object Returns : str - Current power status of the MediaAgent as following Starting : Power-on process in going on Started : MA is powered-on successfully but still not synced with CS Online : Powered-on and synced with CS. MA is ready to use. Stopping : Power-off operation is going on. Stopped : MA is powered-off Unknown : MA power status is still not synced with cloud provider. MA discovery is going on or power state sync with happening with cloud provider or something is NOT right. """ self.refresh() power_status = {0: 'Unknown', 1: 'Starting', 2: 'Started', 3: 'Online', 4: 'Stopping', 5: 'Stopped'} return power_status.get(self._power_status)
var index_cache_enabled
-
Treats the cache enabled value as a read-only attribute
Expand source code Browse git
@property def index_cache_enabled(self): """Treats the cache enabled value as a read-only attribute""" return self._index_cache_enabled
var index_cache_path
-
Treats the index cache path as a read-only attribute
Expand source code Browse git
@property def index_cache_path(self): """Treats the index cache path as a read-only attribute""" return self._index_cache
var is_online
-
Treats the status as read-only attribute
Expand source code Browse git
@property def is_online(self): """Treats the status as read-only attribute""" return self._is_online
var is_power_management_enabled
-
Returns power management enable status
Expand source code Browse git
@property def is_power_management_enabled(self): """ Returns power management enable status""" return self._is_power_management_enabled
var media_agent_id
-
Treats the media agent id as a read-only attribute.
Expand source code Browse git
@property def media_agent_id(self): """Treats the media agent id as a read-only attribute.""" return self._media_agent_id
var media_agent_name
-
Treats the media agent name as a read-only attribute.
Expand source code Browse git
@property def media_agent_name(self): """Treats the media agent name as a read-only attribute.""" return self._media_agent_name
var name
-
Returns the media agent display name
Expand source code Browse git
@property def name(self): """Returns the media agent display name""" return self._media_agent_info['mediaAgent']['displayName']
var platform
-
Treats the platform as read-only attribute
Expand source code Browse git
@property def platform(self): """Treats the platform as read-only attribute""" return self._platform
Methods
def change_index_cache(self, old_index_cache_path, new_index_cache_path)
-
Begins a catalog migration job via the CreateTask end point.
Args : old_index_cache_path - source index cache path new_index_cache_path - destination index cache path Returns : Returns job object of catalog migration job Raises: SDKException: if response is empty if response is not success
Expand source code Browse git
def change_index_cache(self, old_index_cache_path, new_index_cache_path): """ Begins a catalog migration job via the CreateTask end point. Args : old_index_cache_path - source index cache path new_index_cache_path - destination index cache path Returns : Returns job object of catalog migration job Raises: SDKException: if response is empty if response is not success """ conf_guid = str(uuid.uuid4()) xml_options_string = '''<Indexing_IdxDirectoryConfiguration configurationGuid="{0}" icdPath="{1}" maClientFocusName="{2}" maGuid="" oldIcdPath="{3}" opType="0" />''' .format( conf_guid, new_index_cache_path, self.media_agent_name, old_index_cache_path) request_json = { "taskInfo": { "taskOperation": 1, "task": { "isEZOperation": False, "description": "", "ownerId": 1, "runUserId": 1, "taskType": 1, "ownerName": "", "alertName": "", "sequenceNumber": 0, "isEditing": False, "GUID": "", "isFromCommNetBrowserRootNode": False, "initiatedFrom": 3, "policyType": 0, "associatedObjects": 0, "taskName": "", "taskFlags": { "notRunnable": False, "disabled": False } }, "subTasks": [ { "subTaskOperation": 1, "subTask": { "subTaskOrder": 0, "subTaskType": 1, "flags": 0, "operationType": 5018, "subTaskId": 1 }, "options": { "originalJobId": 0, "adminOpts": { "catalogMigrationOptions": { "xmlOptions": xml_options_string, "mediaAgent": { "mediaAgentId": int(self._media_agent_id), "_type_": 11 } } } } } ] } } flag, response = self._commcell_object._cvpysdk_object.make_request( 'POST', self._CREATE_TASK, request_json ) if flag: if response.json() and 'jobIds' in response.json() and response.json()['jobIds'][0]: response_json = response.json() catalogmigration_jobid = response_json["jobIds"][0] catalogmigration_job_obj = self._commcell_object.job_controller.get( catalogmigration_jobid) return catalogmigration_job_obj else: raise SDKException('Response', '102') else: raise SDKException('Response', '101')
def enable_power_management(self, pseudo_client_name)
-
Enables power management using the provided cloud controller (pseudo client)
Args : pseudo_client_name : VSA pseudo client to be used as cloud controller Raises: SDKException: If response is not success If Power management is not supported
Expand source code Browse git
def enable_power_management(self, pseudo_client_name): """ Enables power management using the provided cloud controller (pseudo client) Args : pseudo_client_name : VSA pseudo client to be used as cloud controller Raises: SDKException: If response is not success If Power management is not supported """ if self._is_power_mgmt_allowed: client_obj = self._commcell_object._clients.get(pseudo_client_name) pseudo_client_name_client_id = client_obj._get_client_id() """ payLoad = '<EVGui_SetCloudVMManagementInfoReq hostId="' + self.media_agent_id + '" useMediaAgent="1"> <powerManagementInfo isPowerManagementEnabled="1" > <selectedCloudController clientId="' + PseudoClientName_client_id + '" clientName="' + \ PseudoClientName + '"/></powerManagementInfo></EVGui_SetCloudVMManagementInfoReq>' """ payLoad = '<EVGui_SetCloudVMManagementInfoReq hostId="{0}" useMediaAgent="1"> <powerManagementInfo isPowerManagementEnabled="1" > <selectedCloudController clientId="{1}" clientName="{2}"/></powerManagementInfo></EVGui_SetCloudVMManagementInfoReq>'.format( self.media_agent_id, pseudo_client_name_client_id, pseudo_client_name) response = self._commcell_object._qoperation_execute(payLoad) if response['errorCode'] != 0: raise SDKException('Response', '102', str(response)) else: raise SDKException('Storage', '102', "Power management is not supported")
def mark_for_maintenance(self, mark=False)
-
mark the media agent offline for maintenance Args: mark - (bool) True - mark the media agent for maintenance False - UNMARK the media agent for maintenance
Raises: "exception" - if there is an empty response - if there is an error in request execution - if response status is failure
Expand source code Browse git
def mark_for_maintenance(self, mark=False): """ mark the media agent offline for maintenance Args: mark - (bool) True - mark the media agent for maintenance False - UNMARK the media agent for maintenance Raises: "exception" - if there is an empty response - if there is an error in request execution - if response status is failure """ if type(mark) != bool: raise SDKException('Storage', '101') media_id = int(self.media_agent_id) request_json = { "mediaAgentInfo": { "mediaAgent": { "mediaAgentId": media_id }, "mediaAgentProps": { "markMAOfflineForMaintenance": mark } } } flag, response = self._commcell_object._cvpysdk_object.make_request( 'PUT', self._MEDIA_AGENTS, request_json ) if flag: if response and response.json(): response = response.json() if response.get('error', {}).get('errorCode', -1) != 0: error_message = response.get('error', {}).get('errorString', '') raise SDKException('Storage', '102', error_message) else: raise SDKException('Response', '102') else: raise SDKException('Response', '101')
def power_off(self, wait_till_stopped=True)
-
Power-off MediaAgent
Args : self : Object wait_till_stopped : True : Waits until the MediaAgent is stopped False : Just submits the power-off request
Expand source code Browse git
def power_off(self, wait_till_stopped=True): """ Power-off MediaAgent Args : self : Object wait_till_stopped : True : Waits until the MediaAgent is stopped False : Just submits the power-off request """ if self.current_power_status not in ["Stopping", "Stopped"]: self._perform_power_operation("0") if wait_till_stopped == True and self.current_power_status != "Stopped": self.wait_for_power_status("Stopped")
def power_on(self, wait_till_online=True)
-
Power-on the MediaAgent
Args : self : Object wait_till_online : True : Waits until the MediaAgent is online False : Just submits the power-on request
Expand source code Browse git
def power_on(self, wait_till_online=True): """ Power-on the MediaAgent Args : self : Object wait_till_online : True : Waits until the MediaAgent is online False : Just submits the power-on request """ if self.current_power_status not in ["Starting", "Started", "Online"]: self._perform_power_operation("1") if wait_till_online == True and self.current_power_status != "Online": self.wait_for_power_status("Online")
def refresh(self)
-
Refresh the properties of the MediaAgent.
Expand source code Browse git
def refresh(self): """Refresh the properties of the MediaAgent.""" self._initialize_media_agent_properties()
def set_concurrent_lan(self, enable=True)
-
disable / enable concurrent LAN backup in Media agent properties. Args: enable - (bool) True - Enable concurent LAN Backup False - Disable concurent LAN Backup
Returns
None – if operation performed successfully.
Raises
SDKException: - if there is failure in executing the operation
Expand source code Browse git
def set_concurrent_lan(self, enable=True): """ disable / enable concurrent LAN backup in Media agent properties. Args: enable - (bool) True - Enable concurent LAN Backup False - Disable concurent LAN Backup Returns: None -- if operation performed successfully. Raises: SDKException: - if there is failure in executing the operation """ if type(enable) != bool: raise SDKException('Storage', '101') media_id = int(self.media_agent_id) request_json = { "mediaAgentInfo": { "mediaAgent": { "mediaAgentId": media_id }, "mediaAgentProps": { "optimizeForConcurrentLANBackups": enable } } } flag, response = self._commcell_object._cvpysdk_object.make_request( 'PUT', self._MEDIA_AGENTS, request_json ) if flag: if response and response.json(): response = response.json() if response.get('error', {}).get('errorCode', -1) != 0: error_message = response.get('error', {}).get('errorString', '') raise SDKException('Storage', '102', error_message) else: raise SDKException('Response', '102') else: raise SDKException('Response', '101')
def set_ransomware_protection(self, status)
-
Enables / Disables the ransomware protection on Windows MediaAgent.
Args
status (bool) – True or False value to turn it on/off True - ransomware protection on MediaAgent - ON False - ransomware protection on MediaAgent - OFF
Returns
None – if operation performed successfully.
Raises
Exception(Exception_Code, Exception_Message): - if there is failure in executing the operation
Expand source code Browse git
def set_ransomware_protection(self, status): """Enables / Disables the ransomware protection on Windows MediaAgent. Args: status (bool) -- True or False value to turn it on/off True - ransomware protection on MediaAgent - ON False - ransomware protection on MediaAgent - OFF Returns: None -- if operation performed successfully. Raises: Exception(Exception_Code, Exception_Message): - if there is failure in executing the operation """ # this works only on WINDOWS MA if self._platform != 'WINDOWS': raise SDKException('Storage', '101') if type(status) != bool: raise SDKException('Storage', '101') media_id = int(self.media_agent_id) request_json = { "mediaAgentInfo": { "mediaAgent": { "mediaAgentId": media_id }, "mediaAgentProps": { "isRansomwareProtected": status } } } flag, response = self._commcell_object._cvpysdk_object.make_request( 'PUT', self._MEDIA_AGENTS, request_json ) if flag: if response and response.json(): response = response.json() if response.get('error', {}).get('errorCode', -1) != 0: error_message = response.get('error', {}).get('errorString', '') raise SDKException('Storage', '102', error_message) else: raise SDKException('Response', '102') else: raise SDKException('Response', '101')
def set_state(self, enable=True)
-
disable the media agent by change in media agent properties. Args: enable - (bool) True - Enable the media agent False - Disable the media agent
Raises: "exception" - if there is an empty response - if there is an error in request execution - if response status is failure
Expand source code Browse git
def set_state(self, enable=True): """ disable the media agent by change in media agent properties. Args: enable - (bool) True - Enable the media agent False - Disable the media agent Raises: "exception" - if there is an empty response - if there is an error in request execution - if response status is failure """ if type(enable) != bool: raise SDKException('Storage', '101') media_id = int(self.media_agent_id) request_json = { "mediaAgentInfo": { "mediaAgent": { "mediaAgentId": media_id }, "mediaAgentProps": { "enableMA": enable } } } flag, response = self._commcell_object._cvpysdk_object.make_request( 'PUT', self._MEDIA_AGENTS, request_json ) # check for response # possible key errors if key not present in response, defaults set if flag: if response and response.json(): response = response.json() if response.get('error', {}).get('errorCode', -1) != 0: error_message = response.get('error', {}).get('errorString', '') raise SDKException('Storage', '102', error_message) else: raise SDKException('Response', '102') else: raise SDKException('Response', '101')
def wait_for_power_status(self, expected_power_status, time_out_sec=600)
-
Waits until the expected power status not achieved
Args : self : Object expected_power_status : The expected power status as following. Starting Started Online Stopping Stopped time_out_sec : Maximum time to wait for the expected power status Raises: SDKException: If time_out_sec is not an integer and time_out_sec not None If expected power status is not achieved within time_out_sec time
Expand source code Browse git
def wait_for_power_status(self, expected_power_status, time_out_sec=600): """ Waits until the expected power status not achieved Args : self : Object expected_power_status : The expected power status as following. Starting Started Online Stopping Stopped time_out_sec : Maximum time to wait for the expected power status Raises: SDKException: If time_out_sec is not an integer and time_out_sec not None If expected power status is not achieved within time_out_sec time """ if time_out_sec != None: if not isinstance(time_out_sec, int): raise SDKException('Storage', '102', 'Expected an integer value for [time_out_sec]') start_time = time.time() while self.current_power_status != expected_power_status: time.sleep(10) if time_out_sec != None: if time.time() - start_time > time_out_sec: raise SDKException('Storage', '102', 'The expected power status is not achieved within expected time')
class MediaAgents (commcell_object)
-
Class for getting all the media agents associated with the commcell.
Initialize object of the MediaAgents class.
Args
commcell_object (object) – instance of the Commcell class
Returns
object - instance of the MediaAgents class
Expand source code Browse git
class MediaAgents(object): """Class for getting all the media agents associated with the commcell.""" def __init__(self, commcell_object): """Initialize object of the MediaAgents class. Args: commcell_object (object) -- instance of the Commcell class Returns: object - instance of the MediaAgents class """ self._commcell_object = commcell_object self._MEDIA_AGENTS = self._commcell_object._services['GET_MEDIA_AGENTS'] self._media_agents = None self.refresh() def __str__(self): """Representation string consisting of all media agents of the commcell. Returns: str - string of all the media agents associated with the commcell """ representation_string = '{:^5}\t{:^20}\n\n'.format('S. No.', 'Media Agent') for index, media_agent in enumerate(self._media_agents): sub_str = '{:^5}\t{:20}\n'.format(index + 1, media_agent) representation_string += sub_str return representation_string.strip() def __repr__(self): """Representation string for the instance of the MediaAgents class.""" return "MediaAgents class instance for Commcell: '{0}'".format( self._commcell_object.commserv_name ) def _get_media_agents(self): """Gets all the media agents associated to the commcell specified by commcell object. Returns: dict - consists of all media agents of the commcell { "media_agent1_name": { 'id': media_agent1_id, 'os_info': media_agent1_os, 'is_online': media_agent1_status }, "media_agent2_name": { 'id': media_agent2_id, 'os_info': media_agent2_os, 'is_online': media_agent2_status } } Raises: SDKException: if response is empty if response is not success """ flag, response = self._commcell_object._cvpysdk_object.make_request( 'GET', self._MEDIA_AGENTS ) if flag: if response.json() and 'mediaAgentList' in response.json(): media_agents = response.json()['mediaAgentList'] media_agents_dict = {} for media_agent in media_agents: temp_name = media_agent['mediaAgent']['mediaAgentName'].lower() temp_id = str(media_agent['mediaAgent']['mediaAgentId']).lower() temp_os = media_agent['osInfo']['OsDisplayInfo']['OSName'] temp_status = bool(media_agent['status']) media_agents_dict[temp_name] = { 'id': temp_id, 'os_info': temp_os, 'is_online': temp_status } return media_agents_dict else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) @property def all_media_agents(self): """Returns dict of all the media agents on this commcell dict - consists of all media agents of the commcell { "media_agent1_name": { 'id': media_agent1_id, 'os_info': media_agent1_os, 'is_online': media_agent1_status }, "media_agent2_name": { 'id': media_agent2_id, 'os_info': media_agent2_os, 'is_online': media_agent2_status } } """ return self._media_agents def has_media_agent(self, media_agent_name): """Checks if a media agent exists in the commcell with the input media agent name. Args: media_agent_name (str) -- name of the media agent Returns: bool - boolean output whether the media agent exists in the commcell or not Raises: SDKException: if type of the media agent name argument is not string """ if not isinstance(media_agent_name, str): raise SDKException('Storage', '101') return self._media_agents and media_agent_name.lower() in self._media_agents def get(self, media_agent_name): """Returns a MediaAgent object of the specified media agent name. Args: media_agent_name (str) -- name of the media agent Returns: object - instance of the MediaAgent class for the given media agent name Raises: SDKException: if type of the media agent name argument is not string if no media agent exists with the given name """ if not isinstance(media_agent_name, str): raise SDKException('Storage', '101') else: media_agent_name = media_agent_name.lower() if self.has_media_agent(media_agent_name): return MediaAgent(self._commcell_object, media_agent_name, self._media_agents[media_agent_name]['id']) raise SDKException( 'Storage', '102', 'No media agent exists with name: {0}'.format(media_agent_name) ) def delete(self, media_agent, force=False): """Deletes the media agent from the commcell. Args: media_agent (str) -- name of the Mediaagent to remove from the commcell force (bool) -- True if you want to delete media agent forcefully. Raises: SDKException: if type of the media agent name argument is not string if failed to delete Media agent if response is empty if response is not success if no media agent exists with the given name """ if not isinstance(media_agent, str): raise SDKException('Storage', '101') else: media_agent = media_agent.lower() if self.has_media_agent(media_agent): mediagent_id = self.all_media_agents[media_agent]['id'] mediagent_delete_service = self._commcell_object._services['MEDIA_AGENT'] % (mediagent_id) if force: mediagent_delete_service += "?forceDelete=1" flag, response = self._commcell_object._cvpysdk_object.make_request('DELETE', mediagent_delete_service) error_code = 0 if flag: if 'errorCode' in response.json(): o_str = 'Failed to delete mediaagent' error_code = response.json()['errorCode'] if error_code == 0: # initialize the mediaagents again # so the mediaagents object has all the mediaagents self.refresh() else: error_message = response.json()['errorMessage'] if error_message: o_str += '\nError: "{0}"'.format(error_message) raise SDKException('Storage', '102', o_str) else: raise SDKException('Response', '102') else: raise SDKException('Response', '101', self._commcell_object._update_response_(response.text)) else: raise SDKException( 'Storage', '102', 'No Mediaagent exists with name: {0}'.format(media_agent) ) def refresh(self): """Refresh the media agents associated with the Commcell.""" self._media_agents = self._get_media_agents()
Instance variables
var all_media_agents
-
Returns dict of all the media agents on this commcell
dict - consists of all media agents of the commcell { "media_agent1_name": {
'id': media_agent1_id, 'os_info': media_agent1_os, 'is_online': media_agent1_status }, "media_agent2_name": { 'id': media_agent2_id, 'os_info': media_agent2_os, 'is_online': media_agent2_status } }
Expand source code Browse git
@property def all_media_agents(self): """Returns dict of all the media agents on this commcell dict - consists of all media agents of the commcell { "media_agent1_name": { 'id': media_agent1_id, 'os_info': media_agent1_os, 'is_online': media_agent1_status }, "media_agent2_name": { 'id': media_agent2_id, 'os_info': media_agent2_os, 'is_online': media_agent2_status } } """ return self._media_agents
Methods
def delete(self, media_agent, force=False)
-
Deletes the media agent from the commcell.
Args
media_agent (str) – name of the Mediaagent to remove from the commcell
force (bool) – True if you want to delete media agent forcefully.
Raises
SDKException: if type of the media agent name argument is not string
if failed to delete Media agent if response is empty if response is not success if no media agent exists with the given name
Expand source code Browse git
def delete(self, media_agent, force=False): """Deletes the media agent from the commcell. Args: media_agent (str) -- name of the Mediaagent to remove from the commcell force (bool) -- True if you want to delete media agent forcefully. Raises: SDKException: if type of the media agent name argument is not string if failed to delete Media agent if response is empty if response is not success if no media agent exists with the given name """ if not isinstance(media_agent, str): raise SDKException('Storage', '101') else: media_agent = media_agent.lower() if self.has_media_agent(media_agent): mediagent_id = self.all_media_agents[media_agent]['id'] mediagent_delete_service = self._commcell_object._services['MEDIA_AGENT'] % (mediagent_id) if force: mediagent_delete_service += "?forceDelete=1" flag, response = self._commcell_object._cvpysdk_object.make_request('DELETE', mediagent_delete_service) error_code = 0 if flag: if 'errorCode' in response.json(): o_str = 'Failed to delete mediaagent' error_code = response.json()['errorCode'] if error_code == 0: # initialize the mediaagents again # so the mediaagents object has all the mediaagents self.refresh() else: error_message = response.json()['errorMessage'] if error_message: o_str += '\nError: "{0}"'.format(error_message) raise SDKException('Storage', '102', o_str) else: raise SDKException('Response', '102') else: raise SDKException('Response', '101', self._commcell_object._update_response_(response.text)) else: raise SDKException( 'Storage', '102', 'No Mediaagent exists with name: {0}'.format(media_agent) )
def get(self, media_agent_name)
-
Returns a MediaAgent object of the specified media agent name.
Args
media_agent_name (str) – name of the media agent
Returns
object - instance of the MediaAgent class for the given media agent name
Raises
SDKException: if type of the media agent name argument is not string
if no media agent exists with the given name
Expand source code Browse git
def get(self, media_agent_name): """Returns a MediaAgent object of the specified media agent name. Args: media_agent_name (str) -- name of the media agent Returns: object - instance of the MediaAgent class for the given media agent name Raises: SDKException: if type of the media agent name argument is not string if no media agent exists with the given name """ if not isinstance(media_agent_name, str): raise SDKException('Storage', '101') else: media_agent_name = media_agent_name.lower() if self.has_media_agent(media_agent_name): return MediaAgent(self._commcell_object, media_agent_name, self._media_agents[media_agent_name]['id']) raise SDKException( 'Storage', '102', 'No media agent exists with name: {0}'.format(media_agent_name) )
def has_media_agent(self, media_agent_name)
-
Checks if a media agent exists in the commcell with the input media agent name.
Args
media_agent_name (str) – name of the media agent
Returns
bool - boolean output whether the media agent exists in the commcell or not
Raises
SDKException: if type of the media agent name argument is not string
Expand source code Browse git
def has_media_agent(self, media_agent_name): """Checks if a media agent exists in the commcell with the input media agent name. Args: media_agent_name (str) -- name of the media agent Returns: bool - boolean output whether the media agent exists in the commcell or not Raises: SDKException: if type of the media agent name argument is not string """ if not isinstance(media_agent_name, str): raise SDKException('Storage', '101') return self._media_agents and media_agent_name.lower() in self._media_agents
def refresh(self)
-
Refresh the media agents associated with the Commcell.
Expand source code Browse git
def refresh(self): """Refresh the media agents associated with the Commcell.""" self._media_agents = self._get_media_agents()
class RPStore (commcell, rpstore_name, rpstore_id)
-
Expand source code Browse git
class RPStore(object): def __init__(self, commcell, rpstore_name, rpstore_id): self._commcell = commcell self._rpstore_name = rpstore_name.lower() self._rpstore_id = rpstore_id @property def rpstore_name(self): return self._rpstore_name @property def rpstore_id(self): return self._rpstore_id
Instance variables
var rpstore_id
-
Expand source code Browse git
@property def rpstore_id(self): return self._rpstore_id
var rpstore_name
-
Expand source code Browse git
@property def rpstore_name(self): return self._rpstore_name
class RPStores (commcell)
-
Initialize object of the MediaAgents class.
Args
commcell(object) – instance of the Commcell class
Returns
object - instance of the MediaAgents class
Expand source code Browse git
class RPStores(object): def __init__(self, commcell): """Initialize object of the MediaAgents class. Args: commcell(object) -- instance of the Commcell class Returns: object - instance of the MediaAgents class """ self._commcell = commcell self._rp_stores = None self.refresh() def _get_rp_stores(self): xml = '<?xml version="1.0" encoding="UTF-8"?><EVGui_GetLibraryListWCReq libraryType="RPSTORE"/>' response = self._commcell.execute_qcommand("qoperation execute", xml) try: if response.json().get('libraryList'): return {library["library"]["libraryName"].lower(): library["MountPathList"][0]["rpStoreLibraryInfo"] ["rpStoreId"] for library in response.json()["libraryList"]} return {} except (KeyError, ValueError): generic_msg = "Unable to fetch RPStore" err_msg = response.json().get("errorMessage", generic_msg) if response.status_code == 200 else generic_msg raise SDKException('Storage', '102', '{0}'.format(err_msg)) def add(self, name, path, storage, media_agent_name): """ Args: name (str): Name of the RPStore path (str): Path of the RPStore storage (int): Storage Capacity of the RPStore in GB media_agent_name(str) : Name of the media agent Returns: An instance of RPStore """ try: assert self.has_rp_store(name) is False except AssertionError: raise SDKException("Storage", 102, "An RPStore already exists with the same name") media_agents = MediaAgents(self._commcell) try: ma_id = media_agents.all_media_agents[media_agent_name]["id"] except KeyError: raise SDKException('Storage', '102', 'No media agent exists with name: {0}'.format(media_agent_name)) payload = { "rpLibrary": {"maxSpacePerRPStoreGB": storage}, "storageLibrary": { "mediaAgentId": int(ma_id), "libraryName": name, "mountPath": path }, "opType": 1 } flag, response = self._commcell._cvpysdk_object.make_request( "POST", self._commcell._services["RPSTORE"], payload) try: return RPStore(self._commcell, name, response.json()["storageLibrary"]["libraryId"]) except KeyError: generic_msg = "Unable to add RPStore" err_msg = response.json().get("errorMessage", generic_msg) if flag else generic_msg raise SDKException('Storage', '102', '{0}'.format(err_msg)) def has_rp_store(self, rpstore_name): """Validates if the given RPStore is present Args: rpstore_name (str): Name of the RPStore Returns: bool : True if present else False """ if not isinstance(rpstore_name, str): raise SDKException('Storage', '101') return rpstore_name.lower() in self._rp_stores def get(self, rpstore_name): """Fetches the given RPStore Args: rpstore_name (str): Name of the RPStore Returns: An instance of the RPStore """ if not isinstance(rpstore_name, str): raise SDKException('Storage', '101') try: return RPStore(self._commcell, rpstore_name, self._rp_stores[rpstore_name.lower()]) except KeyError: raise SDKException('Storage', '102', 'No RPStore exists with name: {0}'.format(rpstore_name)) def refresh(self): """Refresh the media agents associated with the Commcell.""" self._rp_stores = self._get_rp_stores()
Methods
def add(self, name, path, storage, media_agent_name)
-
Args
name (str): Name of the RPStore
path (str): Path of the RPStore
storage
:int
-
Storage Capacity of the RPStore in GB
media_agent_name(str) : Name of the media agent
Returns
An instance of RPStore
Expand source code Browse git
def add(self, name, path, storage, media_agent_name): """ Args: name (str): Name of the RPStore path (str): Path of the RPStore storage (int): Storage Capacity of the RPStore in GB media_agent_name(str) : Name of the media agent Returns: An instance of RPStore """ try: assert self.has_rp_store(name) is False except AssertionError: raise SDKException("Storage", 102, "An RPStore already exists with the same name") media_agents = MediaAgents(self._commcell) try: ma_id = media_agents.all_media_agents[media_agent_name]["id"] except KeyError: raise SDKException('Storage', '102', 'No media agent exists with name: {0}'.format(media_agent_name)) payload = { "rpLibrary": {"maxSpacePerRPStoreGB": storage}, "storageLibrary": { "mediaAgentId": int(ma_id), "libraryName": name, "mountPath": path }, "opType": 1 } flag, response = self._commcell._cvpysdk_object.make_request( "POST", self._commcell._services["RPSTORE"], payload) try: return RPStore(self._commcell, name, response.json()["storageLibrary"]["libraryId"]) except KeyError: generic_msg = "Unable to add RPStore" err_msg = response.json().get("errorMessage", generic_msg) if flag else generic_msg raise SDKException('Storage', '102', '{0}'.format(err_msg))
def get(self, rpstore_name)
-
Fetches the given RPStore
Args
rpstore_name (str): Name of the RPStore
Returns
An instance of the RPStore
Expand source code Browse git
def get(self, rpstore_name): """Fetches the given RPStore Args: rpstore_name (str): Name of the RPStore Returns: An instance of the RPStore """ if not isinstance(rpstore_name, str): raise SDKException('Storage', '101') try: return RPStore(self._commcell, rpstore_name, self._rp_stores[rpstore_name.lower()]) except KeyError: raise SDKException('Storage', '102', 'No RPStore exists with name: {0}'.format(rpstore_name))
def has_rp_store(self, rpstore_name)
-
Validates if the given RPStore is present
Args
rpstore_name (str): Name of the RPStore
Returns
bool
- True if present else False
Expand source code Browse git
def has_rp_store(self, rpstore_name): """Validates if the given RPStore is present Args: rpstore_name (str): Name of the RPStore Returns: bool : True if present else False """ if not isinstance(rpstore_name, str): raise SDKException('Storage', '101') return rpstore_name.lower() in self._rp_stores
def refresh(self)
-
Refresh the media agents associated with the Commcell.
Expand source code Browse git
def refresh(self): """Refresh the media agents associated with the Commcell.""" self._rp_stores = self._get_rp_stores()
class TapeLibraries (commcell_object)
-
Class for libraries
Initialize object of the DiskLibraries class.
Args
commcell_object (object) – instance of the Commcell class
Returns
object - instance of the DiskLibraries class
Expand source code Browse git
class TapeLibraries(Libraries): def __init__(self, commcell_object): """Initialize object of the DiskLibraries class. Args: commcell_object (object) -- instance of the Commcell class Returns: object - instance of the DiskLibraries class """ super().__init__(commcell_object) self._commcell_object = commcell_object self._DETECT_TAPE_LIBRARY = self._commcell_object._services['DETECT_TAPE_LIBRARY'] self._CONFIGURE_TAPE_LIBRARY = self._commcell_object._services['CONFIGURE_TAPE_LIBRARY'] self._LOCK_MM_CONFIGURATION = self._commcell_object._services['LOCK_MM_CONFIGURATION'] def __str__(self): """Representation string consisting of all tape libraries of the commcell. Returns: str - string of all the tape libraries associated with the commcell """ representation_string = '{:^5}\t{:^20}\n\n'.format('S. No.', 'Tape Library') for index, library in enumerate(self._libraries): sub_str = '{:^5}\t{:20}\n'.format(index + 1, library) representation_string += sub_str return representation_string.strip() def __repr__(self): """Representation string for the instance of the TapeLibraries class.""" return "TapeLibraries class instance for Commcell: '{0}'".format( self._commcell_object.commserv_name ) def get(self, tape_library_name): """ Returns the object of TapeLibrary class of the specified library name Args: library_name (str) -- name of the library Returns: object - object of TapeLibrary class of the specified library name Raises: SDKException: if type of the library name argument is not string """ if not isinstance(tape_library_name, str): raise SDKException('Storage', '101') else: if self.has_library(tape_library_name): tape_library_name = tape_library_name.lower() return TapeLibrary(self._commcell_object, tape_library_name, self._libraries[tape_library_name]) def delete(self, tape_library_name): """ Deletes the specified library Args: tape_library_name (str) -- name of the library Returns: bool - returns true if the library deleted successfully Raises: SDKException: if type of the library name argument is not string if library does not exists if its failed to delete the library """ if not isinstance(tape_library_name, str): raise SDKException('Storage', '101') if not self.has_library(tape_library_name): raise SDKException('Storage', '101', "Invalid library name") pay_load={ "isDeconfigLibrary": 1, "library": { "opType": 2, "libraryName": tape_library_name } } flag, response = self._commcell_object._cvpysdk_object.make_request('POST', self._LIBRARY, pay_load) if not flag: raise SDKException('Storage', '102', "Failed to DELETE the library") self.refresh() def __lock_unlock_mm_configuration(self, operation): """ Locks or unlocks the MM config for tape library detection Args: operation (int) -- operation type 1 : Lock 0 : Unlock 2: Force lock Raises: SDKException: If API call is not successful If API response is invalid If errorCode is not part of response JSON If lock/unlock operation fails """ if not isinstance(operation, int): raise SDKException('Storage', '101', "Invalid Operation data type. Expected is integer") if not operation in [0,1,2]: raise SDKException('Storage', '101', "Invalid Operation type. Expected among [0,1,2] but received "+str(operation)) pay_load ={ "configLockUnlock": { "lockType": operation } } flag, response = self._commcell_object._cvpysdk_object.make_request('POST', self._LOCK_MM_CONFIGURATION, pay_load) if flag : if response and response.json(): if 'errorCode' in response.json(): if response.json()['errorCode'] != 0: raise SDKException('Storage', '102', "Failed to lock the MM Config. errorMessage : "+response.json().get('errorMessage')) else: raise SDKException('Storage', '102', "lock_unlock_mm_configuration :: Error code is not part of response JSON") else: raise SDKException('Response', '102', "Invalid response") else: raise SDKException('Response', '101', "API call is not successful") def lock_mm_configuration(self, forceLock = False): """ Locks the MM config for tape library detection Args: forceLock (bool) -- True for force lock """ if forceLock: self.__lock_unlock_mm_configuration(2) return self.__lock_unlock_mm_configuration(1) def unlock_mm_configuration(self): """ Unlocks the MM config for tape library detection """ self.__lock_unlock_mm_configuration(0) def detect_tape_library(self, mediaagents): """ Detect the tape libraries(s) of the provided MediaAgent(s) Args: mediaagents (list) -- The list of the mediaagent(s) Returns: JSON - JSON of the tape library detections response Raises: SDKException: if its fails to detect """ pay_load ={ "autoDetect": True, "mediaAgentIdList": mediaagents } try: self.lock_mm_configuration() flag, response = self._commcell_object._cvpysdk_object.make_request('POST', self._DETECT_TAPE_LIBRARY, pay_load ) finally: self.unlock_mm_configuration() if flag and response.json(): return response.json() raise SDKException('Storage', '102', "Failed to detect library") def configure_tape_library(self,tape_library_name, mediaagents): """ Configure the tape library Args: tape_library_name (str) -- name of the library mediaagents(list) -- list of MediaAgents to use for configuration Returns: object - object of the TapeLibrary class for the specified tape library Raises: SDKException: if fails to configure the tape library """ libraries=self.detect_tape_library(mediaagents) flag=False for lib in libraries['libraries']: if lib['libraryName'] == tape_library_name: drive_list=lib['drives'] pay_load= { "driveList": drive_list, "hdr": { "tag": 0 } } flag, response = self._commcell_object._cvpysdk_object.make_request('POST', self._CONFIGURE_TAPE_LIBRARY, pay_load) break if not flag: raise SDKException('Storage', '102', "Failed to configure the library") self.refresh() tape_library_name = tape_library_name.lower() for lib_name, lib_id in self._libraries.items(): if lib_name.startswith(tape_library_name + " "): return self.get(lib_name)
Ancestors
Methods
def configure_tape_library(self, tape_library_name, mediaagents)
-
Configure the tape library
Args: tape_library_name (str) -- name of the library mediaagents(list) -- list of MediaAgents to use for configuration Returns: object - object of the TapeLibrary class for the specified tape library Raises: SDKException: if fails to configure the tape library
Expand source code Browse git
def configure_tape_library(self,tape_library_name, mediaagents): """ Configure the tape library Args: tape_library_name (str) -- name of the library mediaagents(list) -- list of MediaAgents to use for configuration Returns: object - object of the TapeLibrary class for the specified tape library Raises: SDKException: if fails to configure the tape library """ libraries=self.detect_tape_library(mediaagents) flag=False for lib in libraries['libraries']: if lib['libraryName'] == tape_library_name: drive_list=lib['drives'] pay_load= { "driveList": drive_list, "hdr": { "tag": 0 } } flag, response = self._commcell_object._cvpysdk_object.make_request('POST', self._CONFIGURE_TAPE_LIBRARY, pay_load) break if not flag: raise SDKException('Storage', '102', "Failed to configure the library") self.refresh() tape_library_name = tape_library_name.lower() for lib_name, lib_id in self._libraries.items(): if lib_name.startswith(tape_library_name + " "): return self.get(lib_name)
def delete(self, tape_library_name)
-
Deletes the specified library
Args: tape_library_name (str) -- name of the library Returns: bool - returns true if the library deleted successfully Raises: SDKException: if type of the library name argument is not string if library does not exists if its failed to delete the library
Expand source code Browse git
def delete(self, tape_library_name): """ Deletes the specified library Args: tape_library_name (str) -- name of the library Returns: bool - returns true if the library deleted successfully Raises: SDKException: if type of the library name argument is not string if library does not exists if its failed to delete the library """ if not isinstance(tape_library_name, str): raise SDKException('Storage', '101') if not self.has_library(tape_library_name): raise SDKException('Storage', '101', "Invalid library name") pay_load={ "isDeconfigLibrary": 1, "library": { "opType": 2, "libraryName": tape_library_name } } flag, response = self._commcell_object._cvpysdk_object.make_request('POST', self._LIBRARY, pay_load) if not flag: raise SDKException('Storage', '102', "Failed to DELETE the library") self.refresh()
def detect_tape_library(self, mediaagents)
-
Detect the tape libraries(s) of the provided MediaAgent(s)
Args: mediaagents (list) -- The list of the mediaagent(s) Returns: JSON - JSON of the tape library detections response Raises: SDKException: if its fails to detect
Expand source code Browse git
def detect_tape_library(self, mediaagents): """ Detect the tape libraries(s) of the provided MediaAgent(s) Args: mediaagents (list) -- The list of the mediaagent(s) Returns: JSON - JSON of the tape library detections response Raises: SDKException: if its fails to detect """ pay_load ={ "autoDetect": True, "mediaAgentIdList": mediaagents } try: self.lock_mm_configuration() flag, response = self._commcell_object._cvpysdk_object.make_request('POST', self._DETECT_TAPE_LIBRARY, pay_load ) finally: self.unlock_mm_configuration() if flag and response.json(): return response.json() raise SDKException('Storage', '102', "Failed to detect library")
def get(self, tape_library_name)
-
Returns the object of TapeLibrary class of the specified library name
Args: library_name (str) -- name of the library Returns: object - object of TapeLibrary class of the specified library name Raises: SDKException: if type of the library name argument is not string
Expand source code Browse git
def get(self, tape_library_name): """ Returns the object of TapeLibrary class of the specified library name Args: library_name (str) -- name of the library Returns: object - object of TapeLibrary class of the specified library name Raises: SDKException: if type of the library name argument is not string """ if not isinstance(tape_library_name, str): raise SDKException('Storage', '101') else: if self.has_library(tape_library_name): tape_library_name = tape_library_name.lower() return TapeLibrary(self._commcell_object, tape_library_name, self._libraries[tape_library_name])
def lock_mm_configuration(self, forceLock=False)
-
Locks the MM config for tape library detection
Args: forceLock (bool) -- True for force lock
Expand source code Browse git
def lock_mm_configuration(self, forceLock = False): """ Locks the MM config for tape library detection Args: forceLock (bool) -- True for force lock """ if forceLock: self.__lock_unlock_mm_configuration(2) return self.__lock_unlock_mm_configuration(1)
def unlock_mm_configuration(self)
-
Unlocks the MM config for tape library detection
Expand source code Browse git
def unlock_mm_configuration(self): """ Unlocks the MM config for tape library detection """ self.__lock_unlock_mm_configuration(0)
Inherited members
class TapeLibrary (commcell_object, tape_library_name, tape_library_id=None)
-
Initialize object of the TapeLibrary class.
Args
commcell_object (object) – instance of the Commcell class tape_library_name (string) – name of the tape library tape_library_id (int) – tape library ID
Returns
object - instance of the TapeLibrary class
Expand source code Browse git
class TapeLibrary(object): def __init__(self, commcell_object, tape_library_name, tape_library_id=None): """Initialize object of the TapeLibrary class. Args: commcell_object (object) -- instance of the Commcell class tape_library_name (string) -- name of the tape library tape_library_id (int) -- tape library ID Returns: object - instance of the TapeLibrary class """ self._commcell_object = commcell_object self._name = tape_library_name if tape_library_id: self._library_id = str(tape_library_id) else: self._library_id = self._get_library_id() self._library_properties_service = self._commcell_object._services[ 'GET_LIBRARY_PROPERTIES'] % (self._library_id) self.library_properties = self._get_library_properties() self._name = self.library_properties['library']['libraryName'] def __str__(self): """Representation string consisting of the specified tape library. Returns: str - string of all the tape library associated with the commcell """ representation_string = "TapeLibrary instance of library : {0}" return representation_string.format(self._name) def __repr__(self): """String representation of the TapeLibrary instance of this class.""" representation_string = 'TapeLibrary class instance for library: "{0}" of Commcell: "{1}"' return representation_string.format( self._name, self._commcell_object.commserv_name ) def _get_library_id(self): """Gets the library id associated with this tape library. Returns: str - id associated with this tape library """ libraries = TapeLibraries(self._commcell_object) return libraries.get(self.library_name).library_id def get_drive_list(self): """ Returns the tape drive list of this tape library Returns: list - List of the drives of this tape library """ self.refresh() drive_list=[] if 'DriveList' in self.library_properties: for drive in self.library_properties["DriveList"]: drive_list.append(drive["driveName"]) return drive_list def _get_library_properties(self): """Gets the tape library properties. Returns: dict - dictionary consisting of the properties of this library Raises: SDKException: if response is empty if failed to get tape library properties if response is not success """ flag, response = self._commcell_object._cvpysdk_object.make_request( 'GET', self._library_properties_service ) if flag: if response.json(): if 'libraryInfo' in response.json(): return response.json()['libraryInfo'] raise SDKException('Storage', '102', 'Failed to get tape Library properties') raise SDKException('Response', '102') response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) def refresh(self): """Refresh the properties of this tape library.""" self.library_properties = self._get_library_properties() @property def library_name(self): """Treats the library name as a read-only attribute.""" return self._name @property def library_id(self): """Treats the library ID as a read-only attribute.""" return self._library_id
Instance variables
var library_id
-
Treats the library ID as a read-only attribute.
Expand source code Browse git
@property def library_id(self): """Treats the library ID as a read-only attribute.""" return self._library_id
var library_name
-
Treats the library name as a read-only attribute.
Expand source code Browse git
@property def library_name(self): """Treats the library name as a read-only attribute.""" return self._name
Methods
def get_drive_list(self)
-
Returns the tape drive list of this tape library
Returns
list - List of the drives of this tape library
Expand source code Browse git
def get_drive_list(self): """ Returns the tape drive list of this tape library Returns: list - List of the drives of this tape library """ self.refresh() drive_list=[] if 'DriveList' in self.library_properties: for drive in self.library_properties["DriveList"]: drive_list.append(drive["driveName"]) return drive_list
def refresh(self)
-
Refresh the properties of this tape library.
Expand source code Browse git
def refresh(self): """Refresh the properties of this tape library.""" self.library_properties = self._get_library_properties()