Module cvpysdk.drorchestration.replication_groups
Main file for performing replication group specific operations.
ReplicationGroups and ReplicationGroup are 2 classes defined in this file.
ReplicationGroups: Class for representing all the replication groups associated with a specific client
ReplicationGroup: Class for a single replication group selected for a client, and to perform operations on that replication group
Replicationgroups
ReplicationGroupType – Enum to denote all possible types of replication groups init(commcell_object) – Initialise object of ReplicationGroups class
str() – Returns all the replication groups
repr() – Returns the string for the instance of the ReplicationGroups class
has_replication_group( replication_group_name) – Checks if replication group exists with the given name
get(replication_group_name) – Returns the ReplicationGroup class object of the input replication name
delete(replication_group_name) – Delete replication group with replication group name
refresh() – Refresh all replication groups created on the commcell
internal methods
_get_replication_groups() – REST API call to get all replication groups in the commcell
properties
replication_groups() – Returns all replication groups in the commcell
Replicationgroup
init(commcell_object, replication_group_name) – Initialise object of ReplicationGroup with the specified replication group name
repr() – return the ReplicationGroup name
refresh() – Refresh the object properties
internal methods
_get_replication_group_dict() – Method to get replication group dictionary
_get_replication_group_properties() – Get the replication group properties
properties
group_name() – Returns the replication group name group_id() – Returns the replication group ID task_id() – Returns the ID of the task associated to replication group replication_type() – Returns the enum constant of the ReplicationGroupType zeal_group() – Returns a boolean to denote whether group is Zeal or backup-based
restore_options() – Returns a hypervisor specific set of restore options
is_dvdf_enabled() – Returns whether 'Deploy VM during failover' enabled is_warm_sync_enabled() – Returns whether 'Warm site recovery' is enabled
source_client() – Returns a client object of the source hypervisor destination_client() – Returns a client object of the destination hypervisor
source_agent() – Returns an agent object of the source client destination_agent() – Returns an agent object of the destination client
source_instance() – Returns an instance object of the source agent destination_instance() – Returns an instance object of the destination agent
subclient() – Returns the subclient object of the VM group associated with the replication group
live_sync_pairs() – Returns the list of source VM names that are already present in replication monitor vm_pairs() – Returns a dictionary of source VM names and LiveSyncVMPairs object mapping
is_enabled() – Returns a boolean to tell whether replication group is enabled or disabled group_frequency() – Returns the group frequency in minutes
copy_precedence_applicable – Returns a boolean whether the copy precedence is applicable or not
copy_for_replication() – Returns the copy precedence ID used for replication
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 replication group specific operations.
ReplicationGroups and ReplicationGroup are 2 classes defined in this file.
ReplicationGroups: Class for representing all the replication groups associated
with a specific client
ReplicationGroup: Class for a single replication group selected for a client,
and to perform operations on that replication group
ReplicationGroups:
ReplicationGroupType -- Enum to denote all possible types of replication groups
__init__(commcell_object) -- Initialise object of ReplicationGroups class
__str__() -- Returns all the replication groups
__repr__() -- Returns the string for the instance of the
ReplicationGroups class
has_replication_group(
replication_group_name) -- Checks if replication group exists with the given name
get(replication_group_name) -- Returns the ReplicationGroup class object of the input
replication name
delete(replication_group_name) -- Delete replication group with replication group name
refresh() -- Refresh all replication groups created on the commcell
#### internal methods ###
_get_replication_groups() -- REST API call to get all replication groups
in the commcell
##### properties ######
replication_groups() -- Returns all replication groups in the commcell
ReplicationGroup:
__init__(commcell_object,
replication_group_name) -- Initialise object of ReplicationGroup with the
specified replication group name
__repr__() -- return the ReplicationGroup name
refresh() -- Refresh the object properties
##### internal methods #####
_get_replication_group_dict() -- Method to get replication group dictionary
_get_replication_group_properties() -- Get the replication group properties
##### properties #####
group_name() -- Returns the replication group name
group_id() -- Returns the replication group ID
task_id() -- Returns the ID of the task associated to replication group
replication_type() -- Returns the enum constant of the ReplicationGroupType
zeal_group() -- Returns a boolean to denote whether group is Zeal
or backup-based
restore_options() -- Returns a hypervisor specific set of restore options
is_dvdf_enabled() -- Returns whether 'Deploy VM during failover' enabled
is_warm_sync_enabled() -- Returns whether 'Warm site recovery' is enabled
source_client() -- Returns a client object of the source hypervisor
destination_client() -- Returns a client object of the destination hypervisor
source_agent() -- Returns an agent object of the source client
destination_agent() -- Returns an agent object of the destination client
source_instance() -- Returns an instance object of the source agent
destination_instance() -- Returns an instance object of the destination agent
subclient() -- Returns the subclient object of the VM group associated
with the replication group
live_sync_pairs() -- Returns the list of source VM names that are already present in
replication monitor
vm_pairs() -- Returns a dictionary of source VM names
and LiveSyncVMPairs object mapping
is_enabled() -- Returns a boolean to tell whether replication group
is enabled or disabled
group_frequency() -- Returns the group frequency in minutes
copy_precedence_applicable -- Returns a boolean whether the copy precedence is applicable or
not
copy_for_replication() -- Returns the copy precedence ID used for replication
"""
from __future__ import absolute_import
from __future__ import unicode_literals
from enum import Enum
from ..constants import AppIDAType, AppIDAName
from .blr_pairs import BLRPairs
from ..exception import SDKException
class ReplicationGroups:
"""Class for getting all the replication groups in commcell."""
class ReplicationGroupType(Enum):
""" Enum to map Replication Group Types to integers"""
VSA_PERIODIC = 1
VSA_CONTINUOUS = 2
FILE_SYSTEM = 3
ORACLE = 4
SQL_SERVER = 5
SAP_HANA = 6
def __init__(self, commcell_object):
"""Initialize object of the Replication groups
Args:
commcell_object (Commcell) -- instance of the Commcell class
"""
self._commcell_object = commcell_object
self._services = commcell_object._services
self._replication_groups = None
self.refresh()
def __str__(self):
"""Representation string consisting of all replication groups in a formatted output
Returns:
str - string of all the replication groups
"""
representation_string = '{:^5}\t{:^20}\t{:^20}\n\n'.format(
'S. No.', 'Replication Group Id', 'Replication Group')
for index, replication_group in enumerate(self._replication_groups):
sub_str = '{:^5}\t{:20}\t{:20}\n'.format(
index + 1,
self._replication_groups[replication_group],
replication_group
)
representation_string += sub_str
return representation_string.strip()
def __repr__(self):
"""Representation string for the instance of the ReplicationGroups class."""
return "Replication Groups for Commserv: '{0}'".format(
self._commcell_object.commserv_name)
def has_replication_group(self, replication_group_name):
"""Checks if replication group exists or not
Args:
replication_group_name (str) -- name of the replication group
Returns:
bool - boolean output whether replication group exists or not
Raises:
SDKException:
if proper inputs are not provided
"""
if not isinstance(replication_group_name, str):
raise SDKException('ReplicationGroup', '101')
return self.replication_groups and replication_group_name.lower() in self.replication_groups
def get(self, replication_group_name):
"""Returns a replication group object of the specified replication group name.
Args:
replication_group_name (str) -- name of the replication group
Returns:
object - instance of the ReplicationGroup class for the given replication group name
Raises:
SDKException:
if proper inputs are not provided
If Replication group doesnt exists with given name
"""
if not isinstance(replication_group_name, str):
raise SDKException('ReplicationGroup', '101')
replication_group_name = replication_group_name.lower()
if self.has_replication_group(replication_group_name):
return ReplicationGroup(
self._commcell_object, replication_group_name)
raise SDKException(
'ReplicationGroup',
'102',
"Replication group doesn't exist with name: {0}".format(replication_group_name))
def delete(self, replication_group_name):
""" Deletes the specified replication group name.
Args:
replication_group_name (str) -- name of the replication group
Returns:
Raises:
SDKException:
if proper inputs are not provided
if response is empty
if response is not success
"""
if not isinstance(replication_group_name, str):
raise SDKException('ReplicationGroup', '101')
replication_group_name = replication_group_name.lower()
if self.has_replication_group(replication_group_name):
replication_group_dict = self.replication_groups.get(
replication_group_name.lower(), {})
if replication_group_dict:
if replication_group_dict.get('zealGroup'):
payload = {
"repGrpIds": [int(replication_group_dict.get('id'))],
"taskIds": [],
}
else:
payload = {
"repGrpIds": [],
"taskIds": [replication_group_dict.get('id')],
}
flag, response = self._commcell_object._cvpysdk_object.make_request(
method='POST',
url=self._services['DELETE_REPLICATION_GROUPS'],
payload=payload
)
if flag:
if response.json() and 'deleteGroupsResponse' in response.json():
if (response.json().get('deleteGroupsResponse', [{}])[0]
.get('response').get('errorMessage')):
error_message = (response.json().get('deleteGroupsResponse', {})
.get('response', {}).get('errorMessage'))
o_str = ('Failed to delete replication group: {0} \nError: "{1}"'
.format(replication_group_name, error_message))
raise SDKException('ReplicationGroup', '102', o_str)
self.refresh()
else:
raise SDKException('Response', '102')
else:
response_string = self._commcell_object._update_response_(
response.text)
raise SDKException('Response', '101', response_string)
else:
raise SDKException('ReplicationGroup', '101', 'Replication group information is empty')
else:
raise SDKException(
'ReplicationGroup', '102', 'No replication group exists with name: "{0}"'.format(
replication_group_name)
)
@property
def replication_groups(self):
""" return all replication groups
Args:
Returns: All the replication groups in the commcell
Raises:
"""
return self._replication_groups
def _get_replication_groups(self):
"""REST API call for all the replication groups in the commcell.
Args:
Returns:
dict - consists of all replication groups
{
"replication_group_name1": {id: '1', 'type': VSA_PERIODIC, 'zealGroup': true},
"replication_group_name2": {id: '2', 'type': VSA_CONTINUOUS, 'zealGroup': false}
}
Raises:
SDKException:
if response is empty
if response is not success
"""
flag, response = self._commcell_object._cvpysdk_object.make_request(
'GET', self._services['REPLICATION_GROUPS'])
if flag:
if response.json() and 'replicationGroups' in response.json():
replication_groups = {}
for group_dict in response.json()['replicationGroups']:
group_type = (self.ReplicationGroupType(group_dict.get('type'))
if group_dict.get('type') else None)
if group_dict.get('replicationGroup', {}).get('replicationGroupId'):
group_name = group_dict.get('replicationGroup', {}).get('replicationGroupName', '')
group_id = str(group_dict.get('replicationGroup', {}).get('replicationGroupId', 0))
zeal_group = True
else:
subtask_dict = group_dict.get('taskDetail', {}).get('subTasks')[0]
group_name = subtask_dict.get('subTask', {}).get('subTaskName', '')
group_id = str(group_dict.get('taskDetail', {}).get('task', {}).get('taskId', 0))
zeal_group = False
replication_groups[group_name.lower()] = {
'id': group_id,
'type': group_type,
'zealGroup': zeal_group,
}
return replication_groups
raise SDKException('Response', 102)
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
def refresh(self):
""" Refresh the replication groups created in the commcell.
Args:
Returns:
Raises:
"""
self._replication_groups = self._get_replication_groups()
class ReplicationGroup:
"""Class for all Replication groups related SDK"""
def __init__(self, commcell_object, replication_group_name):
"""Initialise the ReplicationGroup object for the given group name
Args:
commcell_object (Commcell) -- instance of the Commcell class
replication_group_name (str) -- name of the replication group
"""
self._commcell_object = commcell_object
self._services = commcell_object._services
self._replication_group_properties = None
self._group_name = replication_group_name.lower()
self._group_dict = self._get_replication_group_dict()
self._source_client = None
self._destination_client = None
self._source_agent = None
self._destination_agent = None
self._source_instance = None
self._destination_instance = None
self._subclient = None
self._vm_pairs = None
self.refresh()
def __repr__(self):
"""String representation of the instance of the replication group"""
representation_string = f'ReplicationGroup class instance for ' \
f'{"Zeal" if self.zeal_group else "Backup based"}' \
f' replication group: "{self.group_name}"'
return representation_string.format(self.group_name)
def __str__(self):
"""Strings showing all VM pairs of the replication group in a formatted output
Returns:
str - string of all VM pairs
"""
representation_string = '{:^5}\t{:^20}\t{:^20}\n\n'.format('Pair Id', 'Source VM', 'Destination VM')
for source_vm in self.vm_pairs:
sub_str = '{:^5}\t{:20}\t{:20}\n'.format(
self.vm_pairs[source_vm].vm_pair_id,
source_vm,
self.vm_pairs[source_vm].destination_vm
)
representation_string += sub_str
return representation_string.strip()
def _get_replication_group_dict(self):
""" Gets replication group dict from the ReplicationGroups class
Returns: (list) The list of replication groups dictionary objects
"""
rgs_obj = ReplicationGroups(self._commcell_object)
return rgs_obj.replication_groups.get(self._group_name)
def _get_replication_group_properties(self):
""" Gets replication group properties
Args:
Returns: Gets the replication group properties dict
Raises:
SDKException:
if response is empty
if response is not success
"""
if self.zeal_group:
flag, response = self._commcell_object._cvpysdk_object.make_request(
'GET', self._services['REPLICATION_GROUP_DETAILS'] % self.group_id)
else:
flag, response = self._commcell_object._cvpysdk_object.make_request(
'GET', self._services['LIVE_SYNC_DETAILS'] % self.group_id)
if flag:
if response.json().get('replicationInfo', {}).get('replicationTargets', {}).get('taskInfo'):
return response.json().get('replicationInfo', {}).get('replicationTargets', {}).get('taskInfo')[0]
if response.json().get('taskInfo'):
return response.json().get('taskInfo')
if self.replication_type == ReplicationGroups.ReplicationGroupType.VSA_CONTINUOUS:
return response.json().get('replicationGroupDetails', {}).get('taskDetail')
raise SDKException('Response', '102')
response_string = self._commcell_object._update_response_(response.text)
raise SDKException('Response', '101', response_string)
def refresh(self):
""" Refresh the replication group properties """
self._replication_group_properties = self._get_replication_group_properties()
self._vm_pairs = None
@property
def group_name(self):
"""Returns: (str) Returns the name of the replication group"""
return self._group_name
@property
def group_id(self):
"""Returns: (str) Returns the ID of the replication group (Zeal)/subtask(classic)"""
return str(self._group_dict.get('id'))
@property
def task_id(self):
"""Returns: (str) Returns the ID of the task associated to the replication group"""
return str(self._replication_group_properties.get('task', {}).get('taskId'))
@property
def replication_type(self):
"""
Returns: (enum) Returns the type of the replication group.
"""
return self._group_dict.get('type')
@property
def zeal_group(self):
"""Returns: (bool) True, if zeal replication group, false otherwise"""
return self._group_dict.get('zealGroup', False)
@property
def restore_options(self):
"""
Returns: (dict) The dictionary of restore options of the replication group
The dictionary structure depends on the vendor
"""
return (self._replication_group_properties.get('subTasks', [{}])[0]
.get('options', {}).get('restoreOptions', {}))
@property
def is_dvdf_enabled(self):
"""Returns: (bool) Whether deploy VM during failover is enabled or not"""
return (self.restore_options.get('virtualServerRstOption', {})
.get('diskLevelVMRestoreOption', {}).get('deployVmWhenFailover', False))
@property
def is_warm_sync_enabled(self):
"""Returns: (bool) Whether Warm sync is enabled or not"""
return (self.restore_options.get('virtualServerRstOption', {})
.get('diskLevelVMRestoreOption', {}).get('createVmsDuringFailover', False))
@property
def is_intelli_snap_enabled(self):
"""Returns: (bool) Whether Snapshot on source is utilised or not"""
return self.subclient.is_intelli_snap_enabled
@property
def source_client(self):
"""Returns: the client object of the source hypervisor"""
if not self._source_client:
client_id = self._replication_group_properties.get('associations', [{}])[0].get('clientId')
self._source_client = self._commcell_object.clients.get(int(client_id))
return self._source_client
@property
def destination_client(self):
"""Returns: (str) the client object for the destination hypervisor"""
if not self._destination_client:
client_id = (self.restore_options.get('virtualServerRstOption', {})
.get('vCenterInstance', {}).get('clientId'))
self._destination_client = self._commcell_object.clients.get(int(client_id))
return self._destination_client
@property
def source_agent(self):
"""Returns: the agent object of the source hypervisor"""
if not self._source_agent:
agent_name = self._replication_group_properties.get('associations', [{}])[0].get('appName')
if not agent_name:
app_id = self._replication_group_properties.get('associations', [{}])[0].get('applicationId')
agent_name = AppIDAName[AppIDAType(app_id).name].value
self._source_agent = self.source_client.agents.get(agent_name)
return self._source_agent
@property
def destination_agent(self):
"""Returns: the agent object of the destination hypervisor"""
if not self._destination_agent:
agent_name = self._replication_group_properties.get('associations', [{}])[0].get('appName')
if not agent_name:
app_id = self._replication_group_properties.get('associations', [{}])[0].get('applicationId')
agent_name = AppIDAName[AppIDAType(app_id).name].value
self._destination_agent = self.destination_client.agents.get(agent_name)
return self._destination_agent
@property
def source_instance(self):
"""Returns: (str) The source hypervisor's instance name"""
if not self._source_instance:
instance_name = self._replication_group_properties.get('associations', [{}])[0].get('instanceName')
self._source_instance = self.source_agent.instances.get(instance_name)
return self._source_instance
@property
def destination_instance(self):
"""Returns: (str) The destination hypervisor's instance name"""
if not self._destination_instance:
instance_name = (self.restore_options.get('virtualServerRstOption', {})
.get('vCenterInstance', {}).get('instanceName'))
# TODO : Depends on DR Layer changes : Workaround used
instance_name = 'Amazon Web Services' if instance_name == 'Amazon' else instance_name
self._destination_instance = self.destination_agent.instances.get(instance_name)
return self._destination_instance
@property
def subclient(self):
"""Returns: the subclient object of the replication group"""
if not self._subclient:
backupset_name = self._replication_group_properties.get('associations', [{}])[0].get('backupsetName')
backupset = self.source_instance.backupsets.get(backupset_name)
subclient_name = self._replication_group_properties.get('associations', [{}])[0].get('subclientName')
self._subclient = backupset.subclients.get(subclient_name)
return self._subclient
@property
def live_sync_pairs(self):
"""
Returns: A list of all source VM names for which live sync pair exists for a periodic replication group
eg: ["vm1", "vm2"]
"""
_live_sync_pairs = []
if self.replication_type == ReplicationGroups.ReplicationGroupType.VSA_PERIODIC:
live_sync_name = self.group_name.replace('_ReplicationPlan__ReplicationGroup', '')
live_sync = self.subclient.live_sync.get(live_sync_name)
live_sync.refresh()
_live_sync_pairs = list(live_sync.vm_pairs)
elif self.replication_type == ReplicationGroups.ReplicationGroupType.VSA_CONTINUOUS:
blr_pairs = BLRPairs(self._commcell_object, self.group_name)
blr_pairs.refresh()
_live_sync_pairs = [blr_pair.get('sourceName') for blr_pair in blr_pairs.blr_pairs.values()]
else:
raise SDKException('ReplicationGroup', '101', 'Implemented only for replication groups'
' of virtual server periodic')
return _live_sync_pairs
@property
def vm_pairs(self):
"""Returns: A dictionary of livesyncVM pairs/BLR pairs object
eg: {"src_vm1": LiveSyncVMPair, "src_vm2": LiveSyncVMPair}
"""
if not self._vm_pairs:
if self.replication_type == ReplicationGroups.ReplicationGroupType.VSA_PERIODIC:
live_sync_name = self.group_name.replace('_ReplicationPlan__ReplicationGroup', '')
live_sync = self.subclient.live_sync.get(live_sync_name)
self._vm_pairs = {source_vm: live_sync.get(source_vm)
for source_vm in live_sync.vm_pairs}
elif self.replication_type == ReplicationGroups.ReplicationGroupType.VSA_CONTINUOUS:
blr_pairs = BLRPairs(self._commcell_object, self.group_name)
self._vm_pairs = {pair_dict.get('sourceName'):
blr_pairs.get(pair_dict.get('sourceName'), pair_dict.get('destinationName'))
for pair_dict in blr_pairs.blr_pairs.values()}
else:
raise SDKException('ReplicationGroup', '101', 'Implemented only for replication groups'
' of virtual server periodic')
return self._vm_pairs
@property
def is_enabled(self):
"""Returns: (bool) Returns True if state of the replication group 'Enabled' else False"""
return not self._replication_group_properties.get('task', {}).get('taskFlags', {}).get('disabled', False)
@property
def group_frequency(self):
"""Returns: (int) The frequency in minutes at which the group is synced (only applicable for Zeal groups)"""
return self._replication_group_properties.get('pattern', {}).get('freq_interval', 0)
@property
def copy_precedence_applicable(self):
"""Returns: (bool) Whether the copy precedence is applicable or not"""
return (self.restore_options.get('browseOption', {}).get('mediaOption', {})
.get('copyPrecedence', {}).get('copyPrecedenceApplicable', False))
@property
def copy_for_replication(self):
"""Returns: (int) The ID of the copy used for the replication"""
# Copy for replication is only applicable is group has copy precedence enabled
return (self.restore_options.get('browseOption', {}).get('mediaOption', {})
.get('copyPrecedence', {}).get('copyPrecedence'))
@property
def recovery_target(self):
"""Returns: (str) The recovery target used for the replication"""
return (self.restore_options.get('virtualServerRstOption', {}).get('allocationPolicy', {})
.get('vmAllocPolicyName'))
@property
def intelli_snap_engine(self):
"""Returns: (str) Intelli Snap Engine Name"""
snap_engine_name = self.subclient.snapshot_engine_name if self.is_intelli_snap_enabled else ''
return snap_engine_name
Classes
class ReplicationGroup (commcell_object, replication_group_name)
-
Class for all Replication groups related SDK
Initialise the ReplicationGroup object for the given group name
Args
commcell_object (Commcell) – instance of the Commcell class replication_group_name (str) – name of the replication group
Expand source code Browse git
class ReplicationGroup: """Class for all Replication groups related SDK""" def __init__(self, commcell_object, replication_group_name): """Initialise the ReplicationGroup object for the given group name Args: commcell_object (Commcell) -- instance of the Commcell class replication_group_name (str) -- name of the replication group """ self._commcell_object = commcell_object self._services = commcell_object._services self._replication_group_properties = None self._group_name = replication_group_name.lower() self._group_dict = self._get_replication_group_dict() self._source_client = None self._destination_client = None self._source_agent = None self._destination_agent = None self._source_instance = None self._destination_instance = None self._subclient = None self._vm_pairs = None self.refresh() def __repr__(self): """String representation of the instance of the replication group""" representation_string = f'ReplicationGroup class instance for ' \ f'{"Zeal" if self.zeal_group else "Backup based"}' \ f' replication group: "{self.group_name}"' return representation_string.format(self.group_name) def __str__(self): """Strings showing all VM pairs of the replication group in a formatted output Returns: str - string of all VM pairs """ representation_string = '{:^5}\t{:^20}\t{:^20}\n\n'.format('Pair Id', 'Source VM', 'Destination VM') for source_vm in self.vm_pairs: sub_str = '{:^5}\t{:20}\t{:20}\n'.format( self.vm_pairs[source_vm].vm_pair_id, source_vm, self.vm_pairs[source_vm].destination_vm ) representation_string += sub_str return representation_string.strip() def _get_replication_group_dict(self): """ Gets replication group dict from the ReplicationGroups class Returns: (list) The list of replication groups dictionary objects """ rgs_obj = ReplicationGroups(self._commcell_object) return rgs_obj.replication_groups.get(self._group_name) def _get_replication_group_properties(self): """ Gets replication group properties Args: Returns: Gets the replication group properties dict Raises: SDKException: if response is empty if response is not success """ if self.zeal_group: flag, response = self._commcell_object._cvpysdk_object.make_request( 'GET', self._services['REPLICATION_GROUP_DETAILS'] % self.group_id) else: flag, response = self._commcell_object._cvpysdk_object.make_request( 'GET', self._services['LIVE_SYNC_DETAILS'] % self.group_id) if flag: if response.json().get('replicationInfo', {}).get('replicationTargets', {}).get('taskInfo'): return response.json().get('replicationInfo', {}).get('replicationTargets', {}).get('taskInfo')[0] if response.json().get('taskInfo'): return response.json().get('taskInfo') if self.replication_type == ReplicationGroups.ReplicationGroupType.VSA_CONTINUOUS: return response.json().get('replicationGroupDetails', {}).get('taskDetail') raise SDKException('Response', '102') response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) def refresh(self): """ Refresh the replication group properties """ self._replication_group_properties = self._get_replication_group_properties() self._vm_pairs = None @property def group_name(self): """Returns: (str) Returns the name of the replication group""" return self._group_name @property def group_id(self): """Returns: (str) Returns the ID of the replication group (Zeal)/subtask(classic)""" return str(self._group_dict.get('id')) @property def task_id(self): """Returns: (str) Returns the ID of the task associated to the replication group""" return str(self._replication_group_properties.get('task', {}).get('taskId')) @property def replication_type(self): """ Returns: (enum) Returns the type of the replication group. """ return self._group_dict.get('type') @property def zeal_group(self): """Returns: (bool) True, if zeal replication group, false otherwise""" return self._group_dict.get('zealGroup', False) @property def restore_options(self): """ Returns: (dict) The dictionary of restore options of the replication group The dictionary structure depends on the vendor """ return (self._replication_group_properties.get('subTasks', [{}])[0] .get('options', {}).get('restoreOptions', {})) @property def is_dvdf_enabled(self): """Returns: (bool) Whether deploy VM during failover is enabled or not""" return (self.restore_options.get('virtualServerRstOption', {}) .get('diskLevelVMRestoreOption', {}).get('deployVmWhenFailover', False)) @property def is_warm_sync_enabled(self): """Returns: (bool) Whether Warm sync is enabled or not""" return (self.restore_options.get('virtualServerRstOption', {}) .get('diskLevelVMRestoreOption', {}).get('createVmsDuringFailover', False)) @property def is_intelli_snap_enabled(self): """Returns: (bool) Whether Snapshot on source is utilised or not""" return self.subclient.is_intelli_snap_enabled @property def source_client(self): """Returns: the client object of the source hypervisor""" if not self._source_client: client_id = self._replication_group_properties.get('associations', [{}])[0].get('clientId') self._source_client = self._commcell_object.clients.get(int(client_id)) return self._source_client @property def destination_client(self): """Returns: (str) the client object for the destination hypervisor""" if not self._destination_client: client_id = (self.restore_options.get('virtualServerRstOption', {}) .get('vCenterInstance', {}).get('clientId')) self._destination_client = self._commcell_object.clients.get(int(client_id)) return self._destination_client @property def source_agent(self): """Returns: the agent object of the source hypervisor""" if not self._source_agent: agent_name = self._replication_group_properties.get('associations', [{}])[0].get('appName') if not agent_name: app_id = self._replication_group_properties.get('associations', [{}])[0].get('applicationId') agent_name = AppIDAName[AppIDAType(app_id).name].value self._source_agent = self.source_client.agents.get(agent_name) return self._source_agent @property def destination_agent(self): """Returns: the agent object of the destination hypervisor""" if not self._destination_agent: agent_name = self._replication_group_properties.get('associations', [{}])[0].get('appName') if not agent_name: app_id = self._replication_group_properties.get('associations', [{}])[0].get('applicationId') agent_name = AppIDAName[AppIDAType(app_id).name].value self._destination_agent = self.destination_client.agents.get(agent_name) return self._destination_agent @property def source_instance(self): """Returns: (str) The source hypervisor's instance name""" if not self._source_instance: instance_name = self._replication_group_properties.get('associations', [{}])[0].get('instanceName') self._source_instance = self.source_agent.instances.get(instance_name) return self._source_instance @property def destination_instance(self): """Returns: (str) The destination hypervisor's instance name""" if not self._destination_instance: instance_name = (self.restore_options.get('virtualServerRstOption', {}) .get('vCenterInstance', {}).get('instanceName')) # TODO : Depends on DR Layer changes : Workaround used instance_name = 'Amazon Web Services' if instance_name == 'Amazon' else instance_name self._destination_instance = self.destination_agent.instances.get(instance_name) return self._destination_instance @property def subclient(self): """Returns: the subclient object of the replication group""" if not self._subclient: backupset_name = self._replication_group_properties.get('associations', [{}])[0].get('backupsetName') backupset = self.source_instance.backupsets.get(backupset_name) subclient_name = self._replication_group_properties.get('associations', [{}])[0].get('subclientName') self._subclient = backupset.subclients.get(subclient_name) return self._subclient @property def live_sync_pairs(self): """ Returns: A list of all source VM names for which live sync pair exists for a periodic replication group eg: ["vm1", "vm2"] """ _live_sync_pairs = [] if self.replication_type == ReplicationGroups.ReplicationGroupType.VSA_PERIODIC: live_sync_name = self.group_name.replace('_ReplicationPlan__ReplicationGroup', '') live_sync = self.subclient.live_sync.get(live_sync_name) live_sync.refresh() _live_sync_pairs = list(live_sync.vm_pairs) elif self.replication_type == ReplicationGroups.ReplicationGroupType.VSA_CONTINUOUS: blr_pairs = BLRPairs(self._commcell_object, self.group_name) blr_pairs.refresh() _live_sync_pairs = [blr_pair.get('sourceName') for blr_pair in blr_pairs.blr_pairs.values()] else: raise SDKException('ReplicationGroup', '101', 'Implemented only for replication groups' ' of virtual server periodic') return _live_sync_pairs @property def vm_pairs(self): """Returns: A dictionary of livesyncVM pairs/BLR pairs object eg: {"src_vm1": LiveSyncVMPair, "src_vm2": LiveSyncVMPair} """ if not self._vm_pairs: if self.replication_type == ReplicationGroups.ReplicationGroupType.VSA_PERIODIC: live_sync_name = self.group_name.replace('_ReplicationPlan__ReplicationGroup', '') live_sync = self.subclient.live_sync.get(live_sync_name) self._vm_pairs = {source_vm: live_sync.get(source_vm) for source_vm in live_sync.vm_pairs} elif self.replication_type == ReplicationGroups.ReplicationGroupType.VSA_CONTINUOUS: blr_pairs = BLRPairs(self._commcell_object, self.group_name) self._vm_pairs = {pair_dict.get('sourceName'): blr_pairs.get(pair_dict.get('sourceName'), pair_dict.get('destinationName')) for pair_dict in blr_pairs.blr_pairs.values()} else: raise SDKException('ReplicationGroup', '101', 'Implemented only for replication groups' ' of virtual server periodic') return self._vm_pairs @property def is_enabled(self): """Returns: (bool) Returns True if state of the replication group 'Enabled' else False""" return not self._replication_group_properties.get('task', {}).get('taskFlags', {}).get('disabled', False) @property def group_frequency(self): """Returns: (int) The frequency in minutes at which the group is synced (only applicable for Zeal groups)""" return self._replication_group_properties.get('pattern', {}).get('freq_interval', 0) @property def copy_precedence_applicable(self): """Returns: (bool) Whether the copy precedence is applicable or not""" return (self.restore_options.get('browseOption', {}).get('mediaOption', {}) .get('copyPrecedence', {}).get('copyPrecedenceApplicable', False)) @property def copy_for_replication(self): """Returns: (int) The ID of the copy used for the replication""" # Copy for replication is only applicable is group has copy precedence enabled return (self.restore_options.get('browseOption', {}).get('mediaOption', {}) .get('copyPrecedence', {}).get('copyPrecedence')) @property def recovery_target(self): """Returns: (str) The recovery target used for the replication""" return (self.restore_options.get('virtualServerRstOption', {}).get('allocationPolicy', {}) .get('vmAllocPolicyName')) @property def intelli_snap_engine(self): """Returns: (str) Intelli Snap Engine Name""" snap_engine_name = self.subclient.snapshot_engine_name if self.is_intelli_snap_enabled else '' return snap_engine_name
Instance variables
var copy_for_replication
-
Returns: (int) The ID of the copy used for the replication
Expand source code Browse git
@property def copy_for_replication(self): """Returns: (int) The ID of the copy used for the replication""" # Copy for replication is only applicable is group has copy precedence enabled return (self.restore_options.get('browseOption', {}).get('mediaOption', {}) .get('copyPrecedence', {}).get('copyPrecedence'))
var copy_precedence_applicable
-
Returns: (bool) Whether the copy precedence is applicable or not
Expand source code Browse git
@property def copy_precedence_applicable(self): """Returns: (bool) Whether the copy precedence is applicable or not""" return (self.restore_options.get('browseOption', {}).get('mediaOption', {}) .get('copyPrecedence', {}).get('copyPrecedenceApplicable', False))
var destination_agent
-
Returns: the agent object of the destination hypervisor
Expand source code Browse git
@property def destination_agent(self): """Returns: the agent object of the destination hypervisor""" if not self._destination_agent: agent_name = self._replication_group_properties.get('associations', [{}])[0].get('appName') if not agent_name: app_id = self._replication_group_properties.get('associations', [{}])[0].get('applicationId') agent_name = AppIDAName[AppIDAType(app_id).name].value self._destination_agent = self.destination_client.agents.get(agent_name) return self._destination_agent
var destination_client
-
Returns: (str) the client object for the destination hypervisor
Expand source code Browse git
@property def destination_client(self): """Returns: (str) the client object for the destination hypervisor""" if not self._destination_client: client_id = (self.restore_options.get('virtualServerRstOption', {}) .get('vCenterInstance', {}).get('clientId')) self._destination_client = self._commcell_object.clients.get(int(client_id)) return self._destination_client
var destination_instance
-
Returns: (str) The destination hypervisor's instance name
Expand source code Browse git
@property def destination_instance(self): """Returns: (str) The destination hypervisor's instance name""" if not self._destination_instance: instance_name = (self.restore_options.get('virtualServerRstOption', {}) .get('vCenterInstance', {}).get('instanceName')) # TODO : Depends on DR Layer changes : Workaround used instance_name = 'Amazon Web Services' if instance_name == 'Amazon' else instance_name self._destination_instance = self.destination_agent.instances.get(instance_name) return self._destination_instance
var group_frequency
-
Returns: (int) The frequency in minutes at which the group is synced (only applicable for Zeal groups)
Expand source code Browse git
@property def group_frequency(self): """Returns: (int) The frequency in minutes at which the group is synced (only applicable for Zeal groups)""" return self._replication_group_properties.get('pattern', {}).get('freq_interval', 0)
var group_id
-
Returns: (str) Returns the ID of the replication group (Zeal)/subtask(classic)
Expand source code Browse git
@property def group_id(self): """Returns: (str) Returns the ID of the replication group (Zeal)/subtask(classic)""" return str(self._group_dict.get('id'))
var group_name
-
Returns: (str) Returns the name of the replication group
Expand source code Browse git
@property def group_name(self): """Returns: (str) Returns the name of the replication group""" return self._group_name
var intelli_snap_engine
-
Returns: (str) Intelli Snap Engine Name
Expand source code Browse git
@property def intelli_snap_engine(self): """Returns: (str) Intelli Snap Engine Name""" snap_engine_name = self.subclient.snapshot_engine_name if self.is_intelli_snap_enabled else '' return snap_engine_name
var is_dvdf_enabled
-
Returns: (bool) Whether deploy VM during failover is enabled or not
Expand source code Browse git
@property def is_dvdf_enabled(self): """Returns: (bool) Whether deploy VM during failover is enabled or not""" return (self.restore_options.get('virtualServerRstOption', {}) .get('diskLevelVMRestoreOption', {}).get('deployVmWhenFailover', False))
var is_enabled
-
Returns: (bool) Returns True if state of the replication group 'Enabled' else False
Expand source code Browse git
@property def is_enabled(self): """Returns: (bool) Returns True if state of the replication group 'Enabled' else False""" return not self._replication_group_properties.get('task', {}).get('taskFlags', {}).get('disabled', False)
var is_intelli_snap_enabled
-
Returns: (bool) Whether Snapshot on source is utilised or not
Expand source code Browse git
@property def is_intelli_snap_enabled(self): """Returns: (bool) Whether Snapshot on source is utilised or not""" return self.subclient.is_intelli_snap_enabled
var is_warm_sync_enabled
-
Returns: (bool) Whether Warm sync is enabled or not
Expand source code Browse git
@property def is_warm_sync_enabled(self): """Returns: (bool) Whether Warm sync is enabled or not""" return (self.restore_options.get('virtualServerRstOption', {}) .get('diskLevelVMRestoreOption', {}).get('createVmsDuringFailover', False))
var live_sync_pairs
-
Returns: A list of all source VM names for which live sync pair exists for a periodic replication group eg: ["vm1", "vm2"]
Expand source code Browse git
@property def live_sync_pairs(self): """ Returns: A list of all source VM names for which live sync pair exists for a periodic replication group eg: ["vm1", "vm2"] """ _live_sync_pairs = [] if self.replication_type == ReplicationGroups.ReplicationGroupType.VSA_PERIODIC: live_sync_name = self.group_name.replace('_ReplicationPlan__ReplicationGroup', '') live_sync = self.subclient.live_sync.get(live_sync_name) live_sync.refresh() _live_sync_pairs = list(live_sync.vm_pairs) elif self.replication_type == ReplicationGroups.ReplicationGroupType.VSA_CONTINUOUS: blr_pairs = BLRPairs(self._commcell_object, self.group_name) blr_pairs.refresh() _live_sync_pairs = [blr_pair.get('sourceName') for blr_pair in blr_pairs.blr_pairs.values()] else: raise SDKException('ReplicationGroup', '101', 'Implemented only for replication groups' ' of virtual server periodic') return _live_sync_pairs
var recovery_target
-
Returns: (str) The recovery target used for the replication
Expand source code Browse git
@property def recovery_target(self): """Returns: (str) The recovery target used for the replication""" return (self.restore_options.get('virtualServerRstOption', {}).get('allocationPolicy', {}) .get('vmAllocPolicyName'))
var replication_type
-
Returns: (enum) Returns the type of the replication group.
Expand source code Browse git
@property def replication_type(self): """ Returns: (enum) Returns the type of the replication group. """ return self._group_dict.get('type')
var restore_options
-
Returns: (dict) The dictionary of restore options of the replication group The dictionary structure depends on the vendor
Expand source code Browse git
@property def restore_options(self): """ Returns: (dict) The dictionary of restore options of the replication group The dictionary structure depends on the vendor """ return (self._replication_group_properties.get('subTasks', [{}])[0] .get('options', {}).get('restoreOptions', {}))
var source_agent
-
Returns: the agent object of the source hypervisor
Expand source code Browse git
@property def source_agent(self): """Returns: the agent object of the source hypervisor""" if not self._source_agent: agent_name = self._replication_group_properties.get('associations', [{}])[0].get('appName') if not agent_name: app_id = self._replication_group_properties.get('associations', [{}])[0].get('applicationId') agent_name = AppIDAName[AppIDAType(app_id).name].value self._source_agent = self.source_client.agents.get(agent_name) return self._source_agent
var source_client
-
Returns: the client object of the source hypervisor
Expand source code Browse git
@property def source_client(self): """Returns: the client object of the source hypervisor""" if not self._source_client: client_id = self._replication_group_properties.get('associations', [{}])[0].get('clientId') self._source_client = self._commcell_object.clients.get(int(client_id)) return self._source_client
var source_instance
-
Returns: (str) The source hypervisor's instance name
Expand source code Browse git
@property def source_instance(self): """Returns: (str) The source hypervisor's instance name""" if not self._source_instance: instance_name = self._replication_group_properties.get('associations', [{}])[0].get('instanceName') self._source_instance = self.source_agent.instances.get(instance_name) return self._source_instance
var subclient
-
Returns: the subclient object of the replication group
Expand source code Browse git
@property def subclient(self): """Returns: the subclient object of the replication group""" if not self._subclient: backupset_name = self._replication_group_properties.get('associations', [{}])[0].get('backupsetName') backupset = self.source_instance.backupsets.get(backupset_name) subclient_name = self._replication_group_properties.get('associations', [{}])[0].get('subclientName') self._subclient = backupset.subclients.get(subclient_name) return self._subclient
var task_id
-
Returns: (str) Returns the ID of the task associated to the replication group
Expand source code Browse git
@property def task_id(self): """Returns: (str) Returns the ID of the task associated to the replication group""" return str(self._replication_group_properties.get('task', {}).get('taskId'))
var vm_pairs
-
Returns: A dictionary of livesyncVM pairs/BLR pairs object eg: {"src_vm1": LiveSyncVMPair, "src_vm2": LiveSyncVMPair}
Expand source code Browse git
@property def vm_pairs(self): """Returns: A dictionary of livesyncVM pairs/BLR pairs object eg: {"src_vm1": LiveSyncVMPair, "src_vm2": LiveSyncVMPair} """ if not self._vm_pairs: if self.replication_type == ReplicationGroups.ReplicationGroupType.VSA_PERIODIC: live_sync_name = self.group_name.replace('_ReplicationPlan__ReplicationGroup', '') live_sync = self.subclient.live_sync.get(live_sync_name) self._vm_pairs = {source_vm: live_sync.get(source_vm) for source_vm in live_sync.vm_pairs} elif self.replication_type == ReplicationGroups.ReplicationGroupType.VSA_CONTINUOUS: blr_pairs = BLRPairs(self._commcell_object, self.group_name) self._vm_pairs = {pair_dict.get('sourceName'): blr_pairs.get(pair_dict.get('sourceName'), pair_dict.get('destinationName')) for pair_dict in blr_pairs.blr_pairs.values()} else: raise SDKException('ReplicationGroup', '101', 'Implemented only for replication groups' ' of virtual server periodic') return self._vm_pairs
var zeal_group
-
Returns: (bool) True, if zeal replication group, false otherwise
Expand source code Browse git
@property def zeal_group(self): """Returns: (bool) True, if zeal replication group, false otherwise""" return self._group_dict.get('zealGroup', False)
Methods
def refresh(self)
-
Refresh the replication group properties
Expand source code Browse git
def refresh(self): """ Refresh the replication group properties """ self._replication_group_properties = self._get_replication_group_properties() self._vm_pairs = None
class ReplicationGroups (commcell_object)
-
Class for getting all the replication groups in commcell.
Initialize object of the Replication groups
Args
commcell_object (Commcell) – instance of the Commcell class
Expand source code Browse git
class ReplicationGroups: """Class for getting all the replication groups in commcell.""" class ReplicationGroupType(Enum): """ Enum to map Replication Group Types to integers""" VSA_PERIODIC = 1 VSA_CONTINUOUS = 2 FILE_SYSTEM = 3 ORACLE = 4 SQL_SERVER = 5 SAP_HANA = 6 def __init__(self, commcell_object): """Initialize object of the Replication groups Args: commcell_object (Commcell) -- instance of the Commcell class """ self._commcell_object = commcell_object self._services = commcell_object._services self._replication_groups = None self.refresh() def __str__(self): """Representation string consisting of all replication groups in a formatted output Returns: str - string of all the replication groups """ representation_string = '{:^5}\t{:^20}\t{:^20}\n\n'.format( 'S. No.', 'Replication Group Id', 'Replication Group') for index, replication_group in enumerate(self._replication_groups): sub_str = '{:^5}\t{:20}\t{:20}\n'.format( index + 1, self._replication_groups[replication_group], replication_group ) representation_string += sub_str return representation_string.strip() def __repr__(self): """Representation string for the instance of the ReplicationGroups class.""" return "Replication Groups for Commserv: '{0}'".format( self._commcell_object.commserv_name) def has_replication_group(self, replication_group_name): """Checks if replication group exists or not Args: replication_group_name (str) -- name of the replication group Returns: bool - boolean output whether replication group exists or not Raises: SDKException: if proper inputs are not provided """ if not isinstance(replication_group_name, str): raise SDKException('ReplicationGroup', '101') return self.replication_groups and replication_group_name.lower() in self.replication_groups def get(self, replication_group_name): """Returns a replication group object of the specified replication group name. Args: replication_group_name (str) -- name of the replication group Returns: object - instance of the ReplicationGroup class for the given replication group name Raises: SDKException: if proper inputs are not provided If Replication group doesnt exists with given name """ if not isinstance(replication_group_name, str): raise SDKException('ReplicationGroup', '101') replication_group_name = replication_group_name.lower() if self.has_replication_group(replication_group_name): return ReplicationGroup( self._commcell_object, replication_group_name) raise SDKException( 'ReplicationGroup', '102', "Replication group doesn't exist with name: {0}".format(replication_group_name)) def delete(self, replication_group_name): """ Deletes the specified replication group name. Args: replication_group_name (str) -- name of the replication group Returns: Raises: SDKException: if proper inputs are not provided if response is empty if response is not success """ if not isinstance(replication_group_name, str): raise SDKException('ReplicationGroup', '101') replication_group_name = replication_group_name.lower() if self.has_replication_group(replication_group_name): replication_group_dict = self.replication_groups.get( replication_group_name.lower(), {}) if replication_group_dict: if replication_group_dict.get('zealGroup'): payload = { "repGrpIds": [int(replication_group_dict.get('id'))], "taskIds": [], } else: payload = { "repGrpIds": [], "taskIds": [replication_group_dict.get('id')], } flag, response = self._commcell_object._cvpysdk_object.make_request( method='POST', url=self._services['DELETE_REPLICATION_GROUPS'], payload=payload ) if flag: if response.json() and 'deleteGroupsResponse' in response.json(): if (response.json().get('deleteGroupsResponse', [{}])[0] .get('response').get('errorMessage')): error_message = (response.json().get('deleteGroupsResponse', {}) .get('response', {}).get('errorMessage')) o_str = ('Failed to delete replication group: {0} \nError: "{1}"' .format(replication_group_name, error_message)) raise SDKException('ReplicationGroup', '102', o_str) self.refresh() else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_( response.text) raise SDKException('Response', '101', response_string) else: raise SDKException('ReplicationGroup', '101', 'Replication group information is empty') else: raise SDKException( 'ReplicationGroup', '102', 'No replication group exists with name: "{0}"'.format( replication_group_name) ) @property def replication_groups(self): """ return all replication groups Args: Returns: All the replication groups in the commcell Raises: """ return self._replication_groups def _get_replication_groups(self): """REST API call for all the replication groups in the commcell. Args: Returns: dict - consists of all replication groups { "replication_group_name1": {id: '1', 'type': VSA_PERIODIC, 'zealGroup': true}, "replication_group_name2": {id: '2', 'type': VSA_CONTINUOUS, 'zealGroup': false} } Raises: SDKException: if response is empty if response is not success """ flag, response = self._commcell_object._cvpysdk_object.make_request( 'GET', self._services['REPLICATION_GROUPS']) if flag: if response.json() and 'replicationGroups' in response.json(): replication_groups = {} for group_dict in response.json()['replicationGroups']: group_type = (self.ReplicationGroupType(group_dict.get('type')) if group_dict.get('type') else None) if group_dict.get('replicationGroup', {}).get('replicationGroupId'): group_name = group_dict.get('replicationGroup', {}).get('replicationGroupName', '') group_id = str(group_dict.get('replicationGroup', {}).get('replicationGroupId', 0)) zeal_group = True else: subtask_dict = group_dict.get('taskDetail', {}).get('subTasks')[0] group_name = subtask_dict.get('subTask', {}).get('subTaskName', '') group_id = str(group_dict.get('taskDetail', {}).get('task', {}).get('taskId', 0)) zeal_group = False replication_groups[group_name.lower()] = { 'id': group_id, 'type': group_type, 'zealGroup': zeal_group, } return replication_groups raise SDKException('Response', 102) response_string = self._commcell_object._update_response_(response.text) raise SDKException('Response', '101', response_string) def refresh(self): """ Refresh the replication groups created in the commcell. Args: Returns: Raises: """ self._replication_groups = self._get_replication_groups()
Class variables
var ReplicationGroupType
-
Enum to map Replication Group Types to integers
Instance variables
var replication_groups
-
return all replication groups Args:
Returns: All the replication groups in the commcell
Raises:
Expand source code Browse git
@property def replication_groups(self): """ return all replication groups Args: Returns: All the replication groups in the commcell Raises: """ return self._replication_groups
Methods
def delete(self, replication_group_name)
-
Deletes the specified replication group name.
Args
replication_group_name (str) – name of the replication group
Returns
Raises
SDKException: if proper inputs are not provided if response is empty if response is not success
Expand source code Browse git
def delete(self, replication_group_name): """ Deletes the specified replication group name. Args: replication_group_name (str) -- name of the replication group Returns: Raises: SDKException: if proper inputs are not provided if response is empty if response is not success """ if not isinstance(replication_group_name, str): raise SDKException('ReplicationGroup', '101') replication_group_name = replication_group_name.lower() if self.has_replication_group(replication_group_name): replication_group_dict = self.replication_groups.get( replication_group_name.lower(), {}) if replication_group_dict: if replication_group_dict.get('zealGroup'): payload = { "repGrpIds": [int(replication_group_dict.get('id'))], "taskIds": [], } else: payload = { "repGrpIds": [], "taskIds": [replication_group_dict.get('id')], } flag, response = self._commcell_object._cvpysdk_object.make_request( method='POST', url=self._services['DELETE_REPLICATION_GROUPS'], payload=payload ) if flag: if response.json() and 'deleteGroupsResponse' in response.json(): if (response.json().get('deleteGroupsResponse', [{}])[0] .get('response').get('errorMessage')): error_message = (response.json().get('deleteGroupsResponse', {}) .get('response', {}).get('errorMessage')) o_str = ('Failed to delete replication group: {0} \nError: "{1}"' .format(replication_group_name, error_message)) raise SDKException('ReplicationGroup', '102', o_str) self.refresh() else: raise SDKException('Response', '102') else: response_string = self._commcell_object._update_response_( response.text) raise SDKException('Response', '101', response_string) else: raise SDKException('ReplicationGroup', '101', 'Replication group information is empty') else: raise SDKException( 'ReplicationGroup', '102', 'No replication group exists with name: "{0}"'.format( replication_group_name) )
def get(self, replication_group_name)
-
Returns a replication group object of the specified replication group name.
Args
replication_group_name (str) – name of the replication group
Returns
object - instance of the ReplicationGroup class for the given replication group name
Raises
SDKException: if proper inputs are not provided If Replication group doesnt exists with given name
Expand source code Browse git
def get(self, replication_group_name): """Returns a replication group object of the specified replication group name. Args: replication_group_name (str) -- name of the replication group Returns: object - instance of the ReplicationGroup class for the given replication group name Raises: SDKException: if proper inputs are not provided If Replication group doesnt exists with given name """ if not isinstance(replication_group_name, str): raise SDKException('ReplicationGroup', '101') replication_group_name = replication_group_name.lower() if self.has_replication_group(replication_group_name): return ReplicationGroup( self._commcell_object, replication_group_name) raise SDKException( 'ReplicationGroup', '102', "Replication group doesn't exist with name: {0}".format(replication_group_name))
def has_replication_group(self, replication_group_name)
-
Checks if replication group exists or not
Args
replication_group_name (str) – name of the replication group
Returns
bool - boolean output whether replication group exists or not
Raises
SDKException: if proper inputs are not provided
Expand source code Browse git
def has_replication_group(self, replication_group_name): """Checks if replication group exists or not Args: replication_group_name (str) -- name of the replication group Returns: bool - boolean output whether replication group exists or not Raises: SDKException: if proper inputs are not provided """ if not isinstance(replication_group_name, str): raise SDKException('ReplicationGroup', '101') return self.replication_groups and replication_group_name.lower() in self.replication_groups
def refresh(self)
-
Refresh the replication groups created in the commcell. Args:
Returns:
Raises:
Expand source code Browse git
def refresh(self): """ Refresh the replication groups created in the commcell. Args: Returns: Raises: """ self._replication_groups = self._get_replication_groups()