Module cvpysdk.drorchestration.failovergroups

Main file for getting failover group related information

FailoverGroups and FailoverGroup are 2 classes defined in this file.

FailoverGroups: Class for getting information of all failover groups in the commcell

FailoverGroup: Class for a failover group that gives us all the live sync pairs associated to in, with addition to the clients/hypervisors associated

Failovergroups

FailoverGroupSourceTypes – Enum to represent all type of sources for failover groups FailoverGroupTypes – Enum to represent all types of failover groups DRReplicationTypes – Enum to represent all live sync types init(commcell_object) – Initialize the object of failovergroups class for commcell

str() – Returns the list of all failover groups

repr() – Returns the string for the instance of the FailoverGroups class

has_failover_group(failover_group_name) – Checks if failover group exists with the given name

get(failover_group_name) – Returns the FailoverGroup class object of the given name

refresh() – Refresh all failover groups created on the commcell

internal methods

_get_failover_groups() – Internal call to get information of all failover groups in commcell

properties

failover_groups – Returns the dictionary of all failover groups and their info

Failovergroup

init(commcell_object, failover_group_name) – Initialize object of FailoverGroup with the given name

repr() – Returns the name of the failover group for the object

str() – Returns the name of the all VM pairs for the failover group

refresh() – Refresh the failover group properties

internal methods

_get_failover_group_dict() – Gets the failover group information from FailoverGroups class

_get_failover_group_properties() – Get the failover group properties

properties

failover_group_id – The ID of the failover group

failover_group_name – The name of the failover group

replication_type – The DRReplicationTypes key for replication of failover group

group_type – The FailoverGroupTypes for operation of failover group

source_type – The FailoverGroupSourceTypes of source of failover group

is_client_group – Whether the VM pairs are part of a client group or not

replication_pairs – The ReplicationPairs class for failover group

vm_pair_ids – The ID of the replication pairs

vm_pairs – Returns the live sync pair objects for each VM pair of the group as a mapping of source VM name and VM pair object

replication_groups – The names of all replication groups associated to the failover group

source_client – The client object of the source client

source_agent – The agent object of the source client

source_instance – The instance object of the source client

destination_client – The client object of the destination client

destination_agent – The agent object of the destination client

destination_instance – The instance object of the destination instance

is_approval_required – Whether the approval is set in failover group or not

user_for_approval – Returns the name of the user set in failover group for approval

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 getting failover group related information

FailoverGroups and FailoverGroup are 2 classes defined in this file.

FailoverGroups:     Class for getting information of all failover groups in the commcell

FailoverGroup:      Class for a failover group that gives us all the live sync pairs associated to in,
                    with addition to the clients/hypervisors associated


FailoverGroups:
    FailoverGroupSourceTypes                    --  Enum to represent all type of sources for failover groups
    FailoverGroupTypes                          --  Enum to represent all types of failover groups
    DRReplicationTypes                          --  Enum to represent all live sync types
    __init__(commcell_object)                   --  Initialize the object of failovergroups class for commcell

    __str__()                                   --  Returns the list of all failover groups

    __repr__()                                  --  Returns the string for the instance of the FailoverGroups class

    has_failover_group(failover_group_name)     --  Checks if failover group exists with the given name

    get(failover_group_name)                    --  Returns the FailoverGroup class object of the given name

    refresh()                                   --  Refresh all failover groups created on the commcell

    #### internal methods ###
    _get_failover_groups()                      --  Internal call to get information of all failover groups in commcell

    ##### properties ######
    failover_groups                             --  Returns the dictionary of all failover groups and their info


FailoverGroup:
    __init__(commcell_object,
            failover_group_name)                --  Initialize object of FailoverGroup with the given name

    __repr__()                                  --  Returns the name of the failover group for the object

    __str__()                                   --  Returns the name of the all VM pairs for the failover group

    refresh()                                   --  Refresh the failover group properties

    ##### internal methods #####
    _get_failover_group_dict()                  --  Gets the failover group information from FailoverGroups class

    _get_failover_group_properties()            --  Get the failover group properties

    ##### properties #####
    failover_group_id                           --  The ID of the failover group

    failover_group_name                         --  The name of the failover group

    replication_type                            --  The DRReplicationTypes key for replication of failover group

    group_type                                  --  The FailoverGroupTypes for operation of failover group

    source_type                                 --  The FailoverGroupSourceTypes of source of failover group

    is_client_group                             --  Whether the VM pairs are part of a client group or not

    replication_pairs                           --  The ReplicationPairs class for failover group

    vm_pair_ids                                 --  The ID of the replication pairs

    vm_pairs                                    --  Returns the live sync pair objects for each VM pair of the group
                                                        as a mapping of source VM name and VM pair object

    replication_groups                          --  The names of all replication groups associated
                                                    to the failover group

    source_client                               --  The client object of the source client

    source_agent                                --  The agent object of the source client

    source_instance                             --  The instance object of the source client

    destination_client                          --  The client object of the destination client

    destination_agent                           --  The agent object of the destination client

    destination_instance                        --  The instance object of the destination instance

    is_approval_required                        --  Whether the approval is set in failover group or not

    user_for_approval                           --  Returns the name of the user set in failover group
                                                        for approval

"""
from enum import Enum
from ..exception import SDKException
from .replication_pairs import ReplicationPairs


class FailoverGroups:
    """Class for getting all the failover groups in commcell."""

    class FailoverGroupSourceTypes(Enum):
        BACKUP = 0
        REPLICATION = 1
        TEMPLATES = 2

    class FailoverGroupTypes(Enum):
        """ Enum to map Failover Group Types to integers"""
        LIVE_MOUNT = 1
        LIVE_SYNC = 2
        RESTORE = 4
        LIVE_RECOVERY = 8
        FAILOVER = 16
        VIRTUAL_LAB = 32
        ORACLE_EBS_APP = 64
        GENERIC_ENTERPRISE_APP = 128
        TEST_FAILOVER = 256

    class DRReplicationTypes(Enum):
        """ Enum to map replication types to replication groups/failover groups"""
        LIVE_SYNC = 0
        LIVE_SYNC_DIRECT = 1
        LIVE_SYNC_IO = 2
        SNAP_ARRAY = 3

    def __init__(self, commcell_object):
        """Initialize object of the Failover groups
            Args:
                commcell_object (Commcell)  --  instance of the Commcell class
        """
        self._commcell_object = commcell_object
        self._services = commcell_object._services

        self._failover_groups = None

        self.refresh()

    def __str__(self):
        """Representation string consisting of all failover groups in a formatted output
            Returns:
                str - string of all the failover groups
        """
        representation_string = (f'{"S. No.":^5}\t'
                                 f'{"Failover Group Id":^20}\t'
                                 f'{"Failover Group":^20}\n\n')

        for index, failover_group in enumerate(self._failover_groups):
            sub_str = (f'{index + 1:^5}\t'
                       f'{self._failover_groups[failover_group]:20}\t'
                       f'{failover_group:20}\n')
            representation_string += sub_str

        return representation_string.strip()

    def __repr__(self):
        """Representation string for the instance of the FailoverGroups class."""
        return f"Failover Groups for Commserv: '{self._commcell_object.commserv_name}'"

    def has_failover_group(self, failover_group_name):
        """Checks if failover group exists or not

            Args:
                failover_group_name (str)  --  name of the failover group

            Returns:
                bool - boolean output whether failover group exists or not

            Raises:
                SDKException:
                    if proper inputs are not provided
        """
        if not isinstance(failover_group_name, str):
            raise SDKException('FailoverGroup', '101')

        return self.failover_groups and failover_group_name.lower() in self.failover_groups

    def get(self, failover_group_name):
        """Returns a failover group object of the specified failover group name.

            Args:
                failover_group_name (str)  --  name of the failover group

            Returns:
                object - instance of the FailoverGroup class for the given failover group name

            Raises:
                SDKException:
                    if proper inputs are not provided
                    If Failover group doesnt exists with given name
        """
        if not isinstance(failover_group_name, str):
            raise SDKException('FailoverGroup', '101')
        failover_group_name = failover_group_name.lower()
        if not self.has_failover_group(failover_group_name):
            raise SDKException('FailoverGroup', '103')
        return FailoverGroup(self._commcell_object, failover_group_name)

    @property
    def failover_groups(self):
        """ return all failover groups
        Args:

        Returns: (dict) All the failover groups in the commcell
                eg:
                {
                     "failover_group_name1": {id: '1', 'type': VSA_PERIODIC, 'operation_type': FAILOVER},
                     "failover_group_name2": {id: '2', 'type': VSA_CONTINUOUS, 'operation_type': FAILOVER}
                }
        Raises:
        """
        return self._failover_groups

    def _get_failover_groups(self):
        """REST API call for all the failover groups in the commcell.
            Args:

            Returns:
                dict - consists of all failover groups
                    {
                        "failover_group_name1": {
                            'id': '1',
                            'type': LIVE_SYNC,
                            'operation_type': FAILOVER,
                            'source_type': REPLICATION
                        },
                        "failover_group_name2": {
                            'id': '2',
                            'type': SNAP_ARRAY,
                            'operation_type': TEST_FAILOVER
                            'source_type': REPLICATION
                        }
                    }

            Raises:
                SDKException:
                    if response is empty
                    if response is not success
        """
        failover_groups = {}

        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'GET', (self._services['FAILOVER_GROUPS']
                    if self._commcell_object.commserv_version > 30
                    else self._services['DR_GROUPS']))
        if flag:
            if 'vApp' in response.json():
                for failover_group in response.json().get('vApp', []):
                    failover_group_id = str(failover_group.get('vAppEntity', {}).get('vAppId'))
                    failover_group_name = failover_group.get('vAppEntity', {}).get('vAppName', '').lower()
                    operation_type = self.FailoverGroupTypes(int(failover_group.get('operationType', 16)))
                    replication_type = self.DRReplicationTypes(int(failover_group.get('replicationType', 0)))
                    source_type = self.FailoverGroupSourceTypes(int(failover_group.get('source', 1)))
                    failover_groups[failover_group_name] = {
                        'id': failover_group_id,
                        'operation_type': operation_type,
                        'type': replication_type,
                        'source_type': source_type
                    }
                return failover_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 failover groups created in the commcell.
        Args:

        Returns:

        Raises:

        """
        self._failover_groups = self._get_failover_groups()


class FailoverGroup:
    """ Class for representing a failover group """

    def __init__(self, commcell_object, failover_group_name):
        """Initialise the FailoverGroup object for the given group name
            Args:
                commcell_object (Commcell)      --  instance of the Commcell class
                failover_group_name (str)       --  name of the failover group
        """
        self._commcell_object = commcell_object
        self._services = commcell_object._services
        self._failover_group_properties = None

        self._failover_group_name = failover_group_name.lower()
        self._failover_group_dict = self._get_failover_group_dict()

        self._source_client = None
        self._destination_client = None
        self._destination_agent = None
        self._source_instance = None
        self._destination_instance = None

        self._replication_pairs = None

        self.refresh()

    def __repr__(self):
        """String representation of the instance of the failover group"""
        return f'FailoverGroup class instance for {self._failover_group_name}'

    def __str__(self):
        """Strings showing all VM pairs of the failover group in a formatted output
            Returns:
                str - string of all VM pairs
        """
        representation_string = f'{"Pair Id":^5}\t{"Source VM":^20}\t{"Destination VM":^20}\n\n'

        for source_vm in self.vm_pairs:
            sub_str = (f'{self.vm_pairs[source_vm].vm_pair_id:^5}\t'
                       f'{source_vm:20}\t'
                       f'{self.vm_pairs[source_vm].destination_vm:20}'
                       f'\n')
            representation_string += sub_str

        return representation_string.strip()

    def _get_failover_group_dict(self):
        """Get the failover group's basic information from FailoverGroups object for Commcell"""
        fgs_obj = FailoverGroups(self._commcell_object)
        return fgs_obj.failover_groups.get(self._failover_group_name)

    def _get_failover_group_properties(self):
        """ Gets failover group properties
            Args:

            Returns: Gets the failover group properties dict

            Raises:
                SDKException:
                    if response is empty

                    if response is not success
        """
        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'GET',
            (self._services['GET_FAILOVER_GROUP']
             if self._commcell_object.commserv_version > 30
             else self._services['GET_DR_GROUP']) % str(self.failover_group_id)
        )
        if flag:
            if 'vApp' in response.json():
                return response.json().get('vApp', [{}])[0]
            raise SDKException('Response', '102')
        response_string = self._commcell_object._update_response_(response.text)
        raise SDKException('Response', '101', response_string)

    def refresh(self):
        """ Refresh the failover group properties """
        self._failover_group_properties = self._get_failover_group_properties()
        self.replication_pairs.refresh()

    @property
    def failover_group_id(self):
        """Returns: (str) The ID of the failover group"""
        return self._failover_group_dict.get('id')

    @property
    def failover_group_name(self):
        """Returns: (str) The name of the failover group"""
        return self._failover_group_name

    @property
    def replication_type(self):
        """Returns: (DRReplicationTypes) The type of replication"""
        return self._failover_group_dict.get('type')

    @property
    def group_type(self):
        """Returns: (FailoverGroupTypes) The type of failover group"""
        return self._failover_group_dict.get('operation_type')

    @property
    def source_type(self):
        """Returns: (FailoverGroupSourceTypes) The type of failover group's source"""
        return self._failover_group_dict.get('source_type')

    @property
    def is_client_group(self):
        """Returns: (bool) Whether this failover group has a client group or not"""
        return self._failover_group_properties.get('isClientGroup')

    @property
    def replication_pairs(self):
        """
        Returns: (ReplicationPairs) Returns the ReplicationPairs object that belongs to this failover group
        Note: Implemented only for live sync failover groups
        """
        if not self._replication_pairs:
            if self.replication_type == FailoverGroups.DRReplicationTypes.LIVE_SYNC:
                self._replication_pairs = ReplicationPairs(self._commcell_object,
                                                           failover_group_id=self.failover_group_id)
        return self._replication_pairs

    @property
    def vm_pair_ids(self):
        """Returns: (List[str]) Returns the VM pair IDs that belong to this failover group"""
        return list(self.replication_pairs.replication_pairs)

    @property
    def vm_pairs(self):
        """
        Returns: (dict) The list of all live sync VM pairs
            eg:
                {
                    <source_vm1>: <Replication_pair_obj1>,
                    <source_vm2>: <Replication_pair_obj2>
                }
        """
        replication_pair_objects = {}
        for replication_pair_id, replication_pair_dict in self.replication_pairs.replication_pairs.items():
            source_vm_name = replication_pair_dict.get('source_vm')
            replication_pair_object = self.replication_pairs.get(replication_id=replication_pair_id)
            replication_pair_objects[source_vm_name] = replication_pair_object
        return replication_pair_objects

    @property
    def replication_groups(self):
        """Returns: (list) The list of all replication group names"""
        group_names = {vm_pair.replication_group_name for vm_pair in self.vm_pairs.values()}
        return list(group_names)

    @property
    def source_client(self):
        """Returns: (Client) The client object for the failover group's source hypervisor"""
        if not self._source_client:
            client_name = self._failover_group_properties.get('selectedEntities', [{}])[0].get('entityName', '')
            self._source_client = self._commcell_object.clients.get(client_name)
        return self._source_client

    @property
    def source_agent(self):
        """Returns: (Agent) The agent object for the source hypervisor"""
        return self.source_instance._agent_object

    @property
    def source_instance(self):
        """Returns: (Instance) The instance object for the source hypervisor"""
        if not self._source_instance:
            instance_id = self._failover_group_properties.get('selectedEntities', [{}])[0].get('instanceId', '')
            for agent_name in self.source_client.agents.all_agents:
                agent_object = self.source_client.agents.get(agent_name)
                for instance_name, inst_id in agent_object.instances.all_instances.items():
                    if inst_id == str(instance_id):
                        self._source_instance = agent_object.instances.get(instance_name)
                        return self._source_instance

        return self._source_instance

    @property
    def destination_client(self):
        """Returns: (Client) The client object for the failover group's destination hypervisor"""
        return self.destination_agent._client_object

    @property
    def destination_agent(self):
        """Returns: (Agent) The agent object for the destination hypervisor"""
        return self.destination_instance._agent_object

    @property
    def destination_instance(self):
        """Returns: (Instance) The instance object for the destination hypervisor"""
        if not self._destination_client:
            vm_pair = list(self.vm_pairs.values())[0]
            self._destination_instance = (vm_pair._subclient_object
                                          ._backupset_object._instance_object)
        return self._destination_instance

    @property
    def is_approval_required(self):
        """Returns bool:
            true : if approval set in failover group
            false: if approval not set in failover group
        """
        return self._failover_group_properties.get('approvalRequired')

    @property
    def user_for_approval(self):
        """Returns: user name set in failover group"""
        user_name = (self._failover_group_properties.get('usersForApproval', [{}])[0]
                     .get('userEntity', {}).get('userName', ''))
        return user_name

Classes

class FailoverGroup (commcell_object, failover_group_name)

Class for representing a failover group

Initialise the FailoverGroup object for the given group name

Args

commcell_object (Commcell) – instance of the Commcell class failover_group_name (str) – name of the failover group

Expand source code Browse git
class FailoverGroup:
    """ Class for representing a failover group """

    def __init__(self, commcell_object, failover_group_name):
        """Initialise the FailoverGroup object for the given group name
            Args:
                commcell_object (Commcell)      --  instance of the Commcell class
                failover_group_name (str)       --  name of the failover group
        """
        self._commcell_object = commcell_object
        self._services = commcell_object._services
        self._failover_group_properties = None

        self._failover_group_name = failover_group_name.lower()
        self._failover_group_dict = self._get_failover_group_dict()

        self._source_client = None
        self._destination_client = None
        self._destination_agent = None
        self._source_instance = None
        self._destination_instance = None

        self._replication_pairs = None

        self.refresh()

    def __repr__(self):
        """String representation of the instance of the failover group"""
        return f'FailoverGroup class instance for {self._failover_group_name}'

    def __str__(self):
        """Strings showing all VM pairs of the failover group in a formatted output
            Returns:
                str - string of all VM pairs
        """
        representation_string = f'{"Pair Id":^5}\t{"Source VM":^20}\t{"Destination VM":^20}\n\n'

        for source_vm in self.vm_pairs:
            sub_str = (f'{self.vm_pairs[source_vm].vm_pair_id:^5}\t'
                       f'{source_vm:20}\t'
                       f'{self.vm_pairs[source_vm].destination_vm:20}'
                       f'\n')
            representation_string += sub_str

        return representation_string.strip()

    def _get_failover_group_dict(self):
        """Get the failover group's basic information from FailoverGroups object for Commcell"""
        fgs_obj = FailoverGroups(self._commcell_object)
        return fgs_obj.failover_groups.get(self._failover_group_name)

    def _get_failover_group_properties(self):
        """ Gets failover group properties
            Args:

            Returns: Gets the failover group properties dict

            Raises:
                SDKException:
                    if response is empty

                    if response is not success
        """
        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'GET',
            (self._services['GET_FAILOVER_GROUP']
             if self._commcell_object.commserv_version > 30
             else self._services['GET_DR_GROUP']) % str(self.failover_group_id)
        )
        if flag:
            if 'vApp' in response.json():
                return response.json().get('vApp', [{}])[0]
            raise SDKException('Response', '102')
        response_string = self._commcell_object._update_response_(response.text)
        raise SDKException('Response', '101', response_string)

    def refresh(self):
        """ Refresh the failover group properties """
        self._failover_group_properties = self._get_failover_group_properties()
        self.replication_pairs.refresh()

    @property
    def failover_group_id(self):
        """Returns: (str) The ID of the failover group"""
        return self._failover_group_dict.get('id')

    @property
    def failover_group_name(self):
        """Returns: (str) The name of the failover group"""
        return self._failover_group_name

    @property
    def replication_type(self):
        """Returns: (DRReplicationTypes) The type of replication"""
        return self._failover_group_dict.get('type')

    @property
    def group_type(self):
        """Returns: (FailoverGroupTypes) The type of failover group"""
        return self._failover_group_dict.get('operation_type')

    @property
    def source_type(self):
        """Returns: (FailoverGroupSourceTypes) The type of failover group's source"""
        return self._failover_group_dict.get('source_type')

    @property
    def is_client_group(self):
        """Returns: (bool) Whether this failover group has a client group or not"""
        return self._failover_group_properties.get('isClientGroup')

    @property
    def replication_pairs(self):
        """
        Returns: (ReplicationPairs) Returns the ReplicationPairs object that belongs to this failover group
        Note: Implemented only for live sync failover groups
        """
        if not self._replication_pairs:
            if self.replication_type == FailoverGroups.DRReplicationTypes.LIVE_SYNC:
                self._replication_pairs = ReplicationPairs(self._commcell_object,
                                                           failover_group_id=self.failover_group_id)
        return self._replication_pairs

    @property
    def vm_pair_ids(self):
        """Returns: (List[str]) Returns the VM pair IDs that belong to this failover group"""
        return list(self.replication_pairs.replication_pairs)

    @property
    def vm_pairs(self):
        """
        Returns: (dict) The list of all live sync VM pairs
            eg:
                {
                    <source_vm1>: <Replication_pair_obj1>,
                    <source_vm2>: <Replication_pair_obj2>
                }
        """
        replication_pair_objects = {}
        for replication_pair_id, replication_pair_dict in self.replication_pairs.replication_pairs.items():
            source_vm_name = replication_pair_dict.get('source_vm')
            replication_pair_object = self.replication_pairs.get(replication_id=replication_pair_id)
            replication_pair_objects[source_vm_name] = replication_pair_object
        return replication_pair_objects

    @property
    def replication_groups(self):
        """Returns: (list) The list of all replication group names"""
        group_names = {vm_pair.replication_group_name for vm_pair in self.vm_pairs.values()}
        return list(group_names)

    @property
    def source_client(self):
        """Returns: (Client) The client object for the failover group's source hypervisor"""
        if not self._source_client:
            client_name = self._failover_group_properties.get('selectedEntities', [{}])[0].get('entityName', '')
            self._source_client = self._commcell_object.clients.get(client_name)
        return self._source_client

    @property
    def source_agent(self):
        """Returns: (Agent) The agent object for the source hypervisor"""
        return self.source_instance._agent_object

    @property
    def source_instance(self):
        """Returns: (Instance) The instance object for the source hypervisor"""
        if not self._source_instance:
            instance_id = self._failover_group_properties.get('selectedEntities', [{}])[0].get('instanceId', '')
            for agent_name in self.source_client.agents.all_agents:
                agent_object = self.source_client.agents.get(agent_name)
                for instance_name, inst_id in agent_object.instances.all_instances.items():
                    if inst_id == str(instance_id):
                        self._source_instance = agent_object.instances.get(instance_name)
                        return self._source_instance

        return self._source_instance

    @property
    def destination_client(self):
        """Returns: (Client) The client object for the failover group's destination hypervisor"""
        return self.destination_agent._client_object

    @property
    def destination_agent(self):
        """Returns: (Agent) The agent object for the destination hypervisor"""
        return self.destination_instance._agent_object

    @property
    def destination_instance(self):
        """Returns: (Instance) The instance object for the destination hypervisor"""
        if not self._destination_client:
            vm_pair = list(self.vm_pairs.values())[0]
            self._destination_instance = (vm_pair._subclient_object
                                          ._backupset_object._instance_object)
        return self._destination_instance

    @property
    def is_approval_required(self):
        """Returns bool:
            true : if approval set in failover group
            false: if approval not set in failover group
        """
        return self._failover_group_properties.get('approvalRequired')

    @property
    def user_for_approval(self):
        """Returns: user name set in failover group"""
        user_name = (self._failover_group_properties.get('usersForApproval', [{}])[0]
                     .get('userEntity', {}).get('userName', ''))
        return user_name

Instance variables

var destination_agent

Returns: (Agent) The agent object for the destination hypervisor

Expand source code Browse git
@property
def destination_agent(self):
    """Returns: (Agent) The agent object for the destination hypervisor"""
    return self.destination_instance._agent_object
var destination_client

Returns: (Client) The client object for the failover group's destination hypervisor

Expand source code Browse git
@property
def destination_client(self):
    """Returns: (Client) The client object for the failover group's destination hypervisor"""
    return self.destination_agent._client_object
var destination_instance

Returns: (Instance) The instance object for the destination hypervisor

Expand source code Browse git
@property
def destination_instance(self):
    """Returns: (Instance) The instance object for the destination hypervisor"""
    if not self._destination_client:
        vm_pair = list(self.vm_pairs.values())[0]
        self._destination_instance = (vm_pair._subclient_object
                                      ._backupset_object._instance_object)
    return self._destination_instance
var failover_group_id

Returns: (str) The ID of the failover group

Expand source code Browse git
@property
def failover_group_id(self):
    """Returns: (str) The ID of the failover group"""
    return self._failover_group_dict.get('id')
var failover_group_name

Returns: (str) The name of the failover group

Expand source code Browse git
@property
def failover_group_name(self):
    """Returns: (str) The name of the failover group"""
    return self._failover_group_name
var group_type

Returns: (FailoverGroupTypes) The type of failover group

Expand source code Browse git
@property
def group_type(self):
    """Returns: (FailoverGroupTypes) The type of failover group"""
    return self._failover_group_dict.get('operation_type')
var is_approval_required

Returns bool: true : if approval set in failover group false: if approval not set in failover group

Expand source code Browse git
@property
def is_approval_required(self):
    """Returns bool:
        true : if approval set in failover group
        false: if approval not set in failover group
    """
    return self._failover_group_properties.get('approvalRequired')
var is_client_group

Returns: (bool) Whether this failover group has a client group or not

Expand source code Browse git
@property
def is_client_group(self):
    """Returns: (bool) Whether this failover group has a client group or not"""
    return self._failover_group_properties.get('isClientGroup')
var replication_groups

Returns: (list) The list of all replication group names

Expand source code Browse git
@property
def replication_groups(self):
    """Returns: (list) The list of all replication group names"""
    group_names = {vm_pair.replication_group_name for vm_pair in self.vm_pairs.values()}
    return list(group_names)
var replication_pairs

Returns: (ReplicationPairs) Returns the ReplicationPairs object that belongs to this failover group Note: Implemented only for live sync failover groups

Expand source code Browse git
@property
def replication_pairs(self):
    """
    Returns: (ReplicationPairs) Returns the ReplicationPairs object that belongs to this failover group
    Note: Implemented only for live sync failover groups
    """
    if not self._replication_pairs:
        if self.replication_type == FailoverGroups.DRReplicationTypes.LIVE_SYNC:
            self._replication_pairs = ReplicationPairs(self._commcell_object,
                                                       failover_group_id=self.failover_group_id)
    return self._replication_pairs
var replication_type

Returns: (DRReplicationTypes) The type of replication

Expand source code Browse git
@property
def replication_type(self):
    """Returns: (DRReplicationTypes) The type of replication"""
    return self._failover_group_dict.get('type')
var source_agent

Returns: (Agent) The agent object for the source hypervisor

Expand source code Browse git
@property
def source_agent(self):
    """Returns: (Agent) The agent object for the source hypervisor"""
    return self.source_instance._agent_object
var source_client

Returns: (Client) The client object for the failover group's source hypervisor

Expand source code Browse git
@property
def source_client(self):
    """Returns: (Client) The client object for the failover group's source hypervisor"""
    if not self._source_client:
        client_name = self._failover_group_properties.get('selectedEntities', [{}])[0].get('entityName', '')
        self._source_client = self._commcell_object.clients.get(client_name)
    return self._source_client
var source_instance

Returns: (Instance) The instance object for the source hypervisor

Expand source code Browse git
@property
def source_instance(self):
    """Returns: (Instance) The instance object for the source hypervisor"""
    if not self._source_instance:
        instance_id = self._failover_group_properties.get('selectedEntities', [{}])[0].get('instanceId', '')
        for agent_name in self.source_client.agents.all_agents:
            agent_object = self.source_client.agents.get(agent_name)
            for instance_name, inst_id in agent_object.instances.all_instances.items():
                if inst_id == str(instance_id):
                    self._source_instance = agent_object.instances.get(instance_name)
                    return self._source_instance

    return self._source_instance
var source_type

Returns: (FailoverGroupSourceTypes) The type of failover group's source

Expand source code Browse git
@property
def source_type(self):
    """Returns: (FailoverGroupSourceTypes) The type of failover group's source"""
    return self._failover_group_dict.get('source_type')
var user_for_approval

Returns: user name set in failover group

Expand source code Browse git
@property
def user_for_approval(self):
    """Returns: user name set in failover group"""
    user_name = (self._failover_group_properties.get('usersForApproval', [{}])[0]
                 .get('userEntity', {}).get('userName', ''))
    return user_name
var vm_pair_ids

Returns: (List[str]) Returns the VM pair IDs that belong to this failover group

Expand source code Browse git
@property
def vm_pair_ids(self):
    """Returns: (List[str]) Returns the VM pair IDs that belong to this failover group"""
    return list(self.replication_pairs.replication_pairs)
var vm_pairs

Returns: (dict) The list of all live sync VM pairs eg: { : , : }

Expand source code Browse git
@property
def vm_pairs(self):
    """
    Returns: (dict) The list of all live sync VM pairs
        eg:
            {
                <source_vm1>: <Replication_pair_obj1>,
                <source_vm2>: <Replication_pair_obj2>
            }
    """
    replication_pair_objects = {}
    for replication_pair_id, replication_pair_dict in self.replication_pairs.replication_pairs.items():
        source_vm_name = replication_pair_dict.get('source_vm')
        replication_pair_object = self.replication_pairs.get(replication_id=replication_pair_id)
        replication_pair_objects[source_vm_name] = replication_pair_object
    return replication_pair_objects

Methods

def refresh(self)

Refresh the failover group properties

Expand source code Browse git
def refresh(self):
    """ Refresh the failover group properties """
    self._failover_group_properties = self._get_failover_group_properties()
    self.replication_pairs.refresh()
class FailoverGroups (commcell_object)

Class for getting all the failover groups in commcell.

Initialize object of the Failover groups

Args

commcell_object (Commcell) – instance of the Commcell class

Expand source code Browse git
class FailoverGroups:
    """Class for getting all the failover groups in commcell."""

    class FailoverGroupSourceTypes(Enum):
        BACKUP = 0
        REPLICATION = 1
        TEMPLATES = 2

    class FailoverGroupTypes(Enum):
        """ Enum to map Failover Group Types to integers"""
        LIVE_MOUNT = 1
        LIVE_SYNC = 2
        RESTORE = 4
        LIVE_RECOVERY = 8
        FAILOVER = 16
        VIRTUAL_LAB = 32
        ORACLE_EBS_APP = 64
        GENERIC_ENTERPRISE_APP = 128
        TEST_FAILOVER = 256

    class DRReplicationTypes(Enum):
        """ Enum to map replication types to replication groups/failover groups"""
        LIVE_SYNC = 0
        LIVE_SYNC_DIRECT = 1
        LIVE_SYNC_IO = 2
        SNAP_ARRAY = 3

    def __init__(self, commcell_object):
        """Initialize object of the Failover groups
            Args:
                commcell_object (Commcell)  --  instance of the Commcell class
        """
        self._commcell_object = commcell_object
        self._services = commcell_object._services

        self._failover_groups = None

        self.refresh()

    def __str__(self):
        """Representation string consisting of all failover groups in a formatted output
            Returns:
                str - string of all the failover groups
        """
        representation_string = (f'{"S. No.":^5}\t'
                                 f'{"Failover Group Id":^20}\t'
                                 f'{"Failover Group":^20}\n\n')

        for index, failover_group in enumerate(self._failover_groups):
            sub_str = (f'{index + 1:^5}\t'
                       f'{self._failover_groups[failover_group]:20}\t'
                       f'{failover_group:20}\n')
            representation_string += sub_str

        return representation_string.strip()

    def __repr__(self):
        """Representation string for the instance of the FailoverGroups class."""
        return f"Failover Groups for Commserv: '{self._commcell_object.commserv_name}'"

    def has_failover_group(self, failover_group_name):
        """Checks if failover group exists or not

            Args:
                failover_group_name (str)  --  name of the failover group

            Returns:
                bool - boolean output whether failover group exists or not

            Raises:
                SDKException:
                    if proper inputs are not provided
        """
        if not isinstance(failover_group_name, str):
            raise SDKException('FailoverGroup', '101')

        return self.failover_groups and failover_group_name.lower() in self.failover_groups

    def get(self, failover_group_name):
        """Returns a failover group object of the specified failover group name.

            Args:
                failover_group_name (str)  --  name of the failover group

            Returns:
                object - instance of the FailoverGroup class for the given failover group name

            Raises:
                SDKException:
                    if proper inputs are not provided
                    If Failover group doesnt exists with given name
        """
        if not isinstance(failover_group_name, str):
            raise SDKException('FailoverGroup', '101')
        failover_group_name = failover_group_name.lower()
        if not self.has_failover_group(failover_group_name):
            raise SDKException('FailoverGroup', '103')
        return FailoverGroup(self._commcell_object, failover_group_name)

    @property
    def failover_groups(self):
        """ return all failover groups
        Args:

        Returns: (dict) All the failover groups in the commcell
                eg:
                {
                     "failover_group_name1": {id: '1', 'type': VSA_PERIODIC, 'operation_type': FAILOVER},
                     "failover_group_name2": {id: '2', 'type': VSA_CONTINUOUS, 'operation_type': FAILOVER}
                }
        Raises:
        """
        return self._failover_groups

    def _get_failover_groups(self):
        """REST API call for all the failover groups in the commcell.
            Args:

            Returns:
                dict - consists of all failover groups
                    {
                        "failover_group_name1": {
                            'id': '1',
                            'type': LIVE_SYNC,
                            'operation_type': FAILOVER,
                            'source_type': REPLICATION
                        },
                        "failover_group_name2": {
                            'id': '2',
                            'type': SNAP_ARRAY,
                            'operation_type': TEST_FAILOVER
                            'source_type': REPLICATION
                        }
                    }

            Raises:
                SDKException:
                    if response is empty
                    if response is not success
        """
        failover_groups = {}

        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'GET', (self._services['FAILOVER_GROUPS']
                    if self._commcell_object.commserv_version > 30
                    else self._services['DR_GROUPS']))
        if flag:
            if 'vApp' in response.json():
                for failover_group in response.json().get('vApp', []):
                    failover_group_id = str(failover_group.get('vAppEntity', {}).get('vAppId'))
                    failover_group_name = failover_group.get('vAppEntity', {}).get('vAppName', '').lower()
                    operation_type = self.FailoverGroupTypes(int(failover_group.get('operationType', 16)))
                    replication_type = self.DRReplicationTypes(int(failover_group.get('replicationType', 0)))
                    source_type = self.FailoverGroupSourceTypes(int(failover_group.get('source', 1)))
                    failover_groups[failover_group_name] = {
                        'id': failover_group_id,
                        'operation_type': operation_type,
                        'type': replication_type,
                        'source_type': source_type
                    }
                return failover_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 failover groups created in the commcell.
        Args:

        Returns:

        Raises:

        """
        self._failover_groups = self._get_failover_groups()

Class variables

var DRReplicationTypes

Enum to map replication types to replication groups/failover groups

var FailoverGroupSourceTypes

An enumeration.

var FailoverGroupTypes

Enum to map Failover Group Types to integers

Instance variables

var failover_groups

return all failover groups Args:

Returns: (dict) All the failover groups in the commcell eg: { "failover_group_name1": {id: '1', 'type': VSA_PERIODIC, 'operation_type': FAILOVER}, "failover_group_name2": {id: '2', 'type': VSA_CONTINUOUS, 'operation_type': FAILOVER} } Raises:

Expand source code Browse git
@property
def failover_groups(self):
    """ return all failover groups
    Args:

    Returns: (dict) All the failover groups in the commcell
            eg:
            {
                 "failover_group_name1": {id: '1', 'type': VSA_PERIODIC, 'operation_type': FAILOVER},
                 "failover_group_name2": {id: '2', 'type': VSA_CONTINUOUS, 'operation_type': FAILOVER}
            }
    Raises:
    """
    return self._failover_groups

Methods

def get(self, failover_group_name)

Returns a failover group object of the specified failover group name.

Args

failover_group_name (str) – name of the failover group

Returns

object - instance of the FailoverGroup class for the given failover group name

Raises

SDKException: if proper inputs are not provided If Failover group doesnt exists with given name

Expand source code Browse git
def get(self, failover_group_name):
    """Returns a failover group object of the specified failover group name.

        Args:
            failover_group_name (str)  --  name of the failover group

        Returns:
            object - instance of the FailoverGroup class for the given failover group name

        Raises:
            SDKException:
                if proper inputs are not provided
                If Failover group doesnt exists with given name
    """
    if not isinstance(failover_group_name, str):
        raise SDKException('FailoverGroup', '101')
    failover_group_name = failover_group_name.lower()
    if not self.has_failover_group(failover_group_name):
        raise SDKException('FailoverGroup', '103')
    return FailoverGroup(self._commcell_object, failover_group_name)
def has_failover_group(self, failover_group_name)

Checks if failover group exists or not

Args

failover_group_name (str) – name of the failover group

Returns

bool - boolean output whether failover group exists or not

Raises

SDKException: if proper inputs are not provided

Expand source code Browse git
def has_failover_group(self, failover_group_name):
    """Checks if failover group exists or not

        Args:
            failover_group_name (str)  --  name of the failover group

        Returns:
            bool - boolean output whether failover group exists or not

        Raises:
            SDKException:
                if proper inputs are not provided
    """
    if not isinstance(failover_group_name, str):
        raise SDKException('FailoverGroup', '101')

    return self.failover_groups and failover_group_name.lower() in self.failover_groups
def refresh(self)

Refresh the failover groups created in the commcell. Args:

Returns:

Raises:

Expand source code Browse git
def refresh(self):
    """ Refresh the failover groups created in the commcell.
    Args:

    Returns:

    Raises:

    """
    self._failover_groups = self._get_failover_groups()