Module cvpysdk.hac_clusters

File for performing hac cluster related operations on the commcell

HACClusters and HACCluster are 2 classes defined in this file

HACClusters: Class for representing all the hac clusters associated with the commcell

HACCluster: Class for a instance of a single hac cluster of the commcell

HACClusters

__init__()                          --  initialize object of HAC clusters class associated with
the commcell

__str()                             --  returns all the HAC clusters of the commcell

__repr__()                          --  returns the string to represent the instance

__get_item()                        --  returns the details of HAC cluster for given cloud name

_get_all_clusters()                 --  gets detail of all hac cluster associated to commcell

_response_not_success()             --  raise exception when response is not 200

get()                               --  return an HACCluster object for given cluster name

has_cluster()                       --  returns whether the hac cluster is present or not in
the commcell

add()                            --  creates a new hac cluster to the commcell

delete()                            --  deletes the hac cluster associated to commcell

refresh()                           --  refresh the hac clusters details associated with commcell

Hacclusters Attributes

**all_hac_clusters**                 --  returns the dictionary consisting of all the hac clusters
associated with the commcell and there details

HACCluster

__init__()                          --  initialize object of IndexPool class

__repr__()                          --  returns the string to represent the instance

_response_not_success()             --  raise exception when response is not 200

modify_node()                       --  methods to modify the HAC cluster node properties

node_info()                         --  returns a dict consisting details of node present in the cluster

refresh()                           --  refresh the index pool details associated with commcell

Haccluster Attributes

**cluster_id**                      --  returns the cluster id for HAC cluster

**cluster_name**                    --  returns the HAC cluster name

**cloud_id**                        --  returns HAC cluster cloud id

**node_names**                      --  returns a list of names of all HAC cluster nodes
Expand source code Browse git
# --------------------------------------------------------------------------
# Copyright Commvault Systems, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# --------------------------------------------------------------------------

"""File for performing hac cluster related operations on the commcell

HACClusters and HACCluster are 2 classes defined in this file

HACClusters:   Class for representing all the hac clusters associated with the commcell

HACCluster:    Class for a instance of a single hac cluster of the commcell


HACClusters
============

    __init__()                          --  initialize object of HAC clusters class associated with
    the commcell

    __str()                             --  returns all the HAC clusters of the commcell

    __repr__()                          --  returns the string to represent the instance

    __get_item()                        --  returns the details of HAC cluster for given cloud name

    _get_all_clusters()                 --  gets detail of all hac cluster associated to commcell

    _response_not_success()             --  raise exception when response is not 200

    get()                               --  return an HACCluster object for given cluster name

    has_cluster()                       --  returns whether the hac cluster is present or not in
    the commcell

    add()                            --  creates a new hac cluster to the commcell

    delete()                            --  deletes the hac cluster associated to commcell

    refresh()                           --  refresh the hac clusters details associated with commcell

HACClusters Attributes
-----------------------

    **all_hac_clusters**                 --  returns the dictionary consisting of all the hac clusters
    associated with the commcell and there details

HACCluster
============

    __init__()                          --  initialize object of IndexPool class

    __repr__()                          --  returns the string to represent the instance

    _response_not_success()             --  raise exception when response is not 200

    modify_node()                       --  methods to modify the HAC cluster node properties

    node_info()                         --  returns a dict consisting details of node present in the cluster

    refresh()                           --  refresh the index pool details associated with commcell

HACCluster Attributes
-----------------------

    **cluster_id**                      --  returns the cluster id for HAC cluster

    **cluster_name**                    --  returns the HAC cluster name

    **cloud_id**                        --  returns HAC cluster cloud id

    **node_names**                      --  returns a list of names of all HAC cluster nodes

"""

from copy import deepcopy
from .exception import SDKException
from .datacube.constants import IndexServerConstants


class HACClusters(object):
    """Class for representing all the HAC clusters associated with the commcell."""

    def __init__(self, commcell_object):
        """Initialize object of the HACClusters class

            Args:
                commcell_object (object)    --  instance of class Commcell

            Returns:
                object  -   instance of class HACClusters
        """
        self._commcell_object = commcell_object
        self._cvpysdk_object = commcell_object._cvpysdk_object
        self._services = commcell_object._services
        self._update_response_ = commcell_object._update_response_
        self._hac_group = None
        self._all_hac_clusters = None
        self.refresh()

    def __str__(self):
        """Representation string consisting of all HAC Clusters of the commcell.

                Returns:
                    str - string of all the HAC clusters associated with the commcell
        """
        representation_string = '{:^5}\t{:^20}\n\n'.format('S. No.', 'HAC Name')
        index = 1
        for hac_name in self.all_hac_clusters:
            representation_string += '{:^5}\t{:^20}\n'.format(
                index, hac_name)
            index += 1
        return representation_string

    def __repr__(self):
        """Representation string for the instance of the HACClusters class."""
        return "HACClusters class instance for Commcell: '{0}'".format(
            self._commcell_object.commserv_name
        )

    def __getitem__(self, value):
        """Returns the details of HAC cluster for given HAC name

            Args:
                value   (str)       --  name of HAC cluster

            Returns:
                dict    -   details of the HAC cluster

            Raises:
                HAC cluster not found
        """
        value = value.lower()
        if value.lower() in self.all_hac_clusters:
            return {"name": value.lower, "id": self.all_hac_clusters[value]}
        raise SDKException('HACClusters', '102')

    def _response_not_success(self, response):
        """Helper method to raise exception when response is not 200 (ok)

            Args:
                response    (object)    -   response object

            Raises:
                SDKException:
                    Response was not success
        """
        raise SDKException(
            'Response',
            '101',
            self._update_response_(
                response.text))

    def _get_all_clusters(self):
        """Gets details of all HAC clusters associated to the commcell"""
        if self._commcell_object.client_groups.has_clientgroup("HAC Cluster"):
            if self._hac_group is None:
                self._hac_group = self._commcell_object.client_groups.get("HAC Cluster")
            self._hac_group.refresh()
            for client_name in self._hac_group.associated_clients:
                client_obj = HACCluster(
                    self._commcell_object, client_name
                )
                self._all_hac_clusters[client_name.lower()] = int(client_obj.cloud_id)

    def has_cluster(self, hac_name):
        """Returns whether the HAC cluster with given name is present or not

            Args:
                hac_name    (str)       --  hac cluster name

            Returns:
                boolean     -   True if hac cluster is associated with the commcell
                else returns False

            Raises:
                SDKException:
                    Data type of the input(s) is not valid
        """
        if not isinstance(hac_name, str):
            raise SDKException('HACClusters', '101')
        return hac_name.lower() in self._all_hac_clusters

    def get(self, hac_name):
        """Returns instance of HACCluster class is cluster is found

            Args:
                hac_name        (str/int)   --      hac cluster name or id

            Returns:
                object          (HACCluster)   --  Instance of a single hac cluster

            Raises:
                SDKException:
                    Data type of the input(s) is not valid

                    HAC Cluster not found
        """
        if isinstance(hac_name, str):
            if hac_name.lower() in self.all_hac_clusters:
                return HACCluster(self._commcell_object, hac_name.lower())
        elif isinstance(hac_name, int):
            for cluster_name in self.all_hac_clusters:
                if int(self._all_hac_clusters[cluster_name]) == int(hac_name):
                    return HACCluster(self._commcell_object, cluster_name)
        else:
            raise SDKException('HACClusters', '101')
        raise SDKException("HACClusters", "102")

    def refresh(self):
        """Refreshes properties for HACClusters class"""
        self._commcell_object.clients.refresh()
        self._commcell_object.client_groups.refresh()
        self._all_hac_clusters = {}
        self._hac_group = None
        self._get_all_clusters()

    def add(self, cloud_name, cloud_node_names):
        """Creates a new HAC cluster

            Args:
                cloud_name      (str)       --  hac cluster cloud name
                cloud_node_names    (list)  --  string array of node names to be added to cluster

            Raises:
                SDKException:
                    Data type of the input(s) is not valid.

                    Response was not success.

                    Response was empty.

            Returns:
                Object  -   Instance of class HACCluster
        """
        if not (isinstance(cloud_name, str) and isinstance(cloud_node_names, list)):
            raise SDKException('HACClusters', '101')
        cloud_node_names = sorted(cloud_node_names)
        node_meta_infos = {
            'zkDataPort': '8091',
            'zkElectionPort': '8097',
            'zkListenerPort': '8090',
            'zkServerId': None,
            'zkDataDir': None
        }
        req_json = deepcopy(IndexServerConstants.REQUEST_JSON)
        del req_json['solrCloudInfo']
        del req_json['cloudMetaInfos']
        req_json['type'] = 6
        req_json['cloudInfoEntity'] = {
            "_type_": 169,
            "cloudName": cloud_name,
            "cloudDisplayName": cloud_name
        }
        server_id = 1
        for node_name in cloud_node_names:
            node_obj = self._commcell_object.clients.get(node_name)
            node_data = {
                "opType": IndexServerConstants.OPERATION_ADD,
                "status": 0,
                "nodeClientEntity": {
                    "_type_": 3,
                    "hostName": node_obj.client_hostname,
                    "clientName": node_name,
                    "clientId": int(node_obj.client_id)
                },
                "nodeMetaInfos": []
            }
            node_meta_infos['zkServerId'] = str(server_id)
            node_meta_infos['zkDataDir'] = node_obj.install_directory + "\\iDataAgent\\JobResults\\ZKData"
            for node_info in node_meta_infos:
                node_data['nodeMetaInfos'].append({
                    'name': node_info,
                    'value': node_meta_infos[node_info]
                })
            req_json['cloudNodes'].append(node_data)
            server_id += 1
        flag, response = self._cvpysdk_object.make_request(
            'POST', self._services['CLOUD_CREATE'], req_json
        )
        if flag:
            if response.json() and 'genericResp' in response.json():
                if response.json()['genericResp'] == {} and \
                        'cloudId' in response.json():
                    self.refresh()
                    return HACCluster(self._commcell_object, cloud_name)
                else:
                    o_str = 'Failed to create HAC Cluster. Error: "{0}"'.format(
                        response.json()['genericResp'])
                    raise SDKException('Response', '102', o_str)
            else:
                raise SDKException('Response', '102')
        else:
            self._response_not_success(response)

    def delete(self, cloud_name):
        """Deletes an existing HAC cluster

        Args:
            cloud_name  (str)   --  HAC cluster cloud name to be deleted

        Raises:
            SDKException:
                Data type of the input(s) is not valid.

                Response was not success.

                Response was empty.
        """
        if not isinstance(cloud_name, str):
            raise SDKException('HACCluster', '101')
        cloud_id = self.all_hac_clusters[cloud_name.lower()]
        req_json = IndexServerConstants.REQUEST_JSON.copy()
        req_json["opType"] = IndexServerConstants.OPERATION_DELETE
        req_json['cloudInfoEntity']['cloudId'] = cloud_id
        flag, response = self._cvpysdk_object.make_request(
            'POST', self._services['CLOUD_DELETE'], req_json
        )
        if flag:
            if response.json() and 'genericResp' in response.json() \
                    and 'errorCode' not in response.json()['genericResp']:
                self.refresh()
                return
            if response.json() and 'genericResp' in response.json():
                raise SDKException(
                    'Response', '102', response.json()['genericResp'].get(
                        'errorMessage', ''))
            raise SDKException('Response', '102')
        self._response_not_success(response)

    @property
    def all_hac_clusters(self):
        """Returns the details of all HAC clusters associated with commcell"""
        return self._all_hac_clusters


class HACCluster(object):
    """Class to perform HAC cluster operations on a specific HAC cluster"""

    def __init__(self, commcell_object, cluster_name, cluster_id=None):
        """Initializes the HACCluster class object

            Args:
                commcell_object     (object)        --  Instance of commcell class
                cluster_name        (str)           --  HAC cluster cloud name
                cluster_id          (int)           --  HAC cluster cloud id
                    default: None

            Returns:
                object  -   instance of the HACCluster class
        """
        self.commcell = commcell_object
        self._cluster_name = cluster_name
        self._cluster_id = cluster_id
        self._cluster_properties = None
        self.cluster_client_obj = None
        self.cluster_nodes = None
        self.refresh()

    def __repr__(self):
        """Representation string for the instance of the HACCluster class."""
        return "HACCluster class instance for Commcell: '{0}'".format(
            self.commcell.commserv_name
        )

    def _response_not_success(self, response):
        """Helper method to raise exception when response is not 200 (ok)

                Raises:
                    SDKException:
                        Response was not success
        """
        raise SDKException(
            'Response',
            '101',
            self.commcell._update_response_(
                response.text))

    def refresh(self):
        """Refreshes properties of the HAC cluster"""
        self.commcell.clients.refresh()
        if not self.commcell.clients.has_client(self._cluster_name):
            raise SDKException('HACClusters', '102')
        self.cluster_client_obj = self.commcell.clients.get(self._cluster_name)
        self._cluster_id = self.cluster_client_obj.client_id
        self._cluster_properties = self.cluster_client_obj.\
            properties['pseudoClientInfo']['distributedClusterInstanceProperties']['clusterConfig']['cloudInfo']
        self.cluster_nodes = self._cluster_properties['cloudNodes']

    def modify_node(self, node_name, listener_port=None, data_port=None,
                    election_port=None, data_dir=None):
        """Methods to modify the hac cluster node properties

        Args:
            node_name       (str)       -   Client name for the node
            listener_port   (int/str)   -   zkListenerPort address to be updated
                default - None              Sample: '8090' or 8090
            data_port       (int/str)   -   zkDataPort address to be updated
                default - None              Sample: '8091' or 8091
            election_port   (int/str)   -   zkElectionPort address to be updated
                default - None              Sample: '8097' or 8097
            data_dir        (str)       -   zoo keeper data directory
                default - None

        Raises:
            SDKException:
                HAC zKeeper node not found

                Response was not success

        Returns:
            None

        """
        node_info = self.node_info(node_name)
        port_infos = {}
        node_meta_info = node_info['nodeMetaInfos']
        for meta_info in node_meta_info:
            port_infos[meta_info['name']] = meta_info['value']
        if listener_port:
            port_infos['ZKLISTENERPORT'] = str(listener_port)
        if election_port:
            port_infos['ZKELECTIONPORT'] = str(election_port)
        if data_port:
            port_infos['ZKDATAPORT'] = str(data_port)
        if data_dir:
            port_infos['ZKDATADIR'] = str(data_dir)
        req_json = {
            'cloudId': self.cloud_id,
            'nodes': [{
                'status': 1,
                'opType': IndexServerConstants.OPERATION_EDIT,
                'nodeClientEntity': {
                    'clientId': int(self.commcell.clients[node_name]['id']),
                    'hostName': self.commcell.clients[node_name]['hostname'],
                    'clientName': node_name
                },
                'nodeMetaInfos': [
                    {
                        "name": "zkListenerPort",
                        "value": port_infos['ZKLISTENERPORT']
                    },
                    {
                        "name": "zkDataPort",
                        "value": port_infos['ZKDATAPORT']
                    },
                    {
                        "name": "zkElectionPort",
                        "value": port_infos['ZKELECTIONPORT']
                    },
                    {
                        "name": "zkDataDir",
                        "value": port_infos['ZKDATADIR']
                    }]
            }]
        }
        flag, response = self.commcell._cvpysdk_object.make_request(
            'POST', self.commcell._services['CLOUD_NODE_UPDATE'],
            req_json
        )
        if flag:
            if response.json() is not None:
                if 'errorCode' not in response.json():
                    self.refresh()
                    return
        self._response_not_success(response)

    def node_info(self, node_name):
        """Returns the hac cluster node information

        Args:
            node_name       (str)   -   HAC cluster node name

        Returns:
            dict        -   dictionary containing details of the hac node

        Raises:
            SDKException:
                HAC zKeeper node not found

        """
        for node_info in self.cluster_nodes:
            if node_info['nodeClientEntity']['clientName'].lower() == node_name.lower():
                return node_info
        raise SDKException('HACCluster', '103')

    @property
    def cloud_id(self):
        """Returns HAC cluster cloud id"""
        return self._cluster_properties['cloudInfoEntity']['cloudId']

    @property
    def node_names(self):
        """Returns a list of HAC cluster node names"""
        result = []
        for node_info in self.cluster_nodes:
            result.append(node_info['nodeClientEntity']['clientName'])
        return result

    @property
    def cluster_id(self):
        """Returns the HAC cluster pseudo client id"""
        return self._cluster_id

    @property
    def cluster_name(self):
        """Returns the HAC cluster cloud name"""
        return self._cluster_name

Classes

class HACCluster (commcell_object, cluster_name, cluster_id=None)

Class to perform HAC cluster operations on a specific HAC cluster

Initializes the HACCluster class object

Args

commcell_object (object) – Instance of commcell class cluster_name (str) – HAC cluster cloud name cluster_id (int) – HAC cluster cloud id default: None

Returns

object - instance of the HACCluster class

Expand source code Browse git
class HACCluster(object):
    """Class to perform HAC cluster operations on a specific HAC cluster"""

    def __init__(self, commcell_object, cluster_name, cluster_id=None):
        """Initializes the HACCluster class object

            Args:
                commcell_object     (object)        --  Instance of commcell class
                cluster_name        (str)           --  HAC cluster cloud name
                cluster_id          (int)           --  HAC cluster cloud id
                    default: None

            Returns:
                object  -   instance of the HACCluster class
        """
        self.commcell = commcell_object
        self._cluster_name = cluster_name
        self._cluster_id = cluster_id
        self._cluster_properties = None
        self.cluster_client_obj = None
        self.cluster_nodes = None
        self.refresh()

    def __repr__(self):
        """Representation string for the instance of the HACCluster class."""
        return "HACCluster class instance for Commcell: '{0}'".format(
            self.commcell.commserv_name
        )

    def _response_not_success(self, response):
        """Helper method to raise exception when response is not 200 (ok)

                Raises:
                    SDKException:
                        Response was not success
        """
        raise SDKException(
            'Response',
            '101',
            self.commcell._update_response_(
                response.text))

    def refresh(self):
        """Refreshes properties of the HAC cluster"""
        self.commcell.clients.refresh()
        if not self.commcell.clients.has_client(self._cluster_name):
            raise SDKException('HACClusters', '102')
        self.cluster_client_obj = self.commcell.clients.get(self._cluster_name)
        self._cluster_id = self.cluster_client_obj.client_id
        self._cluster_properties = self.cluster_client_obj.\
            properties['pseudoClientInfo']['distributedClusterInstanceProperties']['clusterConfig']['cloudInfo']
        self.cluster_nodes = self._cluster_properties['cloudNodes']

    def modify_node(self, node_name, listener_port=None, data_port=None,
                    election_port=None, data_dir=None):
        """Methods to modify the hac cluster node properties

        Args:
            node_name       (str)       -   Client name for the node
            listener_port   (int/str)   -   zkListenerPort address to be updated
                default - None              Sample: '8090' or 8090
            data_port       (int/str)   -   zkDataPort address to be updated
                default - None              Sample: '8091' or 8091
            election_port   (int/str)   -   zkElectionPort address to be updated
                default - None              Sample: '8097' or 8097
            data_dir        (str)       -   zoo keeper data directory
                default - None

        Raises:
            SDKException:
                HAC zKeeper node not found

                Response was not success

        Returns:
            None

        """
        node_info = self.node_info(node_name)
        port_infos = {}
        node_meta_info = node_info['nodeMetaInfos']
        for meta_info in node_meta_info:
            port_infos[meta_info['name']] = meta_info['value']
        if listener_port:
            port_infos['ZKLISTENERPORT'] = str(listener_port)
        if election_port:
            port_infos['ZKELECTIONPORT'] = str(election_port)
        if data_port:
            port_infos['ZKDATAPORT'] = str(data_port)
        if data_dir:
            port_infos['ZKDATADIR'] = str(data_dir)
        req_json = {
            'cloudId': self.cloud_id,
            'nodes': [{
                'status': 1,
                'opType': IndexServerConstants.OPERATION_EDIT,
                'nodeClientEntity': {
                    'clientId': int(self.commcell.clients[node_name]['id']),
                    'hostName': self.commcell.clients[node_name]['hostname'],
                    'clientName': node_name
                },
                'nodeMetaInfos': [
                    {
                        "name": "zkListenerPort",
                        "value": port_infos['ZKLISTENERPORT']
                    },
                    {
                        "name": "zkDataPort",
                        "value": port_infos['ZKDATAPORT']
                    },
                    {
                        "name": "zkElectionPort",
                        "value": port_infos['ZKELECTIONPORT']
                    },
                    {
                        "name": "zkDataDir",
                        "value": port_infos['ZKDATADIR']
                    }]
            }]
        }
        flag, response = self.commcell._cvpysdk_object.make_request(
            'POST', self.commcell._services['CLOUD_NODE_UPDATE'],
            req_json
        )
        if flag:
            if response.json() is not None:
                if 'errorCode' not in response.json():
                    self.refresh()
                    return
        self._response_not_success(response)

    def node_info(self, node_name):
        """Returns the hac cluster node information

        Args:
            node_name       (str)   -   HAC cluster node name

        Returns:
            dict        -   dictionary containing details of the hac node

        Raises:
            SDKException:
                HAC zKeeper node not found

        """
        for node_info in self.cluster_nodes:
            if node_info['nodeClientEntity']['clientName'].lower() == node_name.lower():
                return node_info
        raise SDKException('HACCluster', '103')

    @property
    def cloud_id(self):
        """Returns HAC cluster cloud id"""
        return self._cluster_properties['cloudInfoEntity']['cloudId']

    @property
    def node_names(self):
        """Returns a list of HAC cluster node names"""
        result = []
        for node_info in self.cluster_nodes:
            result.append(node_info['nodeClientEntity']['clientName'])
        return result

    @property
    def cluster_id(self):
        """Returns the HAC cluster pseudo client id"""
        return self._cluster_id

    @property
    def cluster_name(self):
        """Returns the HAC cluster cloud name"""
        return self._cluster_name

Instance variables

var cloud_id

Returns HAC cluster cloud id

Expand source code Browse git
@property
def cloud_id(self):
    """Returns HAC cluster cloud id"""
    return self._cluster_properties['cloudInfoEntity']['cloudId']
var cluster_id

Returns the HAC cluster pseudo client id

Expand source code Browse git
@property
def cluster_id(self):
    """Returns the HAC cluster pseudo client id"""
    return self._cluster_id
var cluster_name

Returns the HAC cluster cloud name

Expand source code Browse git
@property
def cluster_name(self):
    """Returns the HAC cluster cloud name"""
    return self._cluster_name
var node_names

Returns a list of HAC cluster node names

Expand source code Browse git
@property
def node_names(self):
    """Returns a list of HAC cluster node names"""
    result = []
    for node_info in self.cluster_nodes:
        result.append(node_info['nodeClientEntity']['clientName'])
    return result

Methods

def modify_node(self, node_name, listener_port=None, data_port=None, election_port=None, data_dir=None)

Methods to modify the hac cluster node properties

Args

node_name (str) - Client name for the node listener_port (int/str) - zkListenerPort address to be updated default - None Sample: '8090' or 8090 data_port (int/str) - zkDataPort address to be updated default - None Sample: '8091' or 8091 election_port (int/str) - zkElectionPort address to be updated default - None Sample: '8097' or 8097 data_dir (str) - zoo keeper data directory default - None

Raises

SDKException: HAC zKeeper node not found

Response was not success

Returns

None

Expand source code Browse git
def modify_node(self, node_name, listener_port=None, data_port=None,
                election_port=None, data_dir=None):
    """Methods to modify the hac cluster node properties

    Args:
        node_name       (str)       -   Client name for the node
        listener_port   (int/str)   -   zkListenerPort address to be updated
            default - None              Sample: '8090' or 8090
        data_port       (int/str)   -   zkDataPort address to be updated
            default - None              Sample: '8091' or 8091
        election_port   (int/str)   -   zkElectionPort address to be updated
            default - None              Sample: '8097' or 8097
        data_dir        (str)       -   zoo keeper data directory
            default - None

    Raises:
        SDKException:
            HAC zKeeper node not found

            Response was not success

    Returns:
        None

    """
    node_info = self.node_info(node_name)
    port_infos = {}
    node_meta_info = node_info['nodeMetaInfos']
    for meta_info in node_meta_info:
        port_infos[meta_info['name']] = meta_info['value']
    if listener_port:
        port_infos['ZKLISTENERPORT'] = str(listener_port)
    if election_port:
        port_infos['ZKELECTIONPORT'] = str(election_port)
    if data_port:
        port_infos['ZKDATAPORT'] = str(data_port)
    if data_dir:
        port_infos['ZKDATADIR'] = str(data_dir)
    req_json = {
        'cloudId': self.cloud_id,
        'nodes': [{
            'status': 1,
            'opType': IndexServerConstants.OPERATION_EDIT,
            'nodeClientEntity': {
                'clientId': int(self.commcell.clients[node_name]['id']),
                'hostName': self.commcell.clients[node_name]['hostname'],
                'clientName': node_name
            },
            'nodeMetaInfos': [
                {
                    "name": "zkListenerPort",
                    "value": port_infos['ZKLISTENERPORT']
                },
                {
                    "name": "zkDataPort",
                    "value": port_infos['ZKDATAPORT']
                },
                {
                    "name": "zkElectionPort",
                    "value": port_infos['ZKELECTIONPORT']
                },
                {
                    "name": "zkDataDir",
                    "value": port_infos['ZKDATADIR']
                }]
        }]
    }
    flag, response = self.commcell._cvpysdk_object.make_request(
        'POST', self.commcell._services['CLOUD_NODE_UPDATE'],
        req_json
    )
    if flag:
        if response.json() is not None:
            if 'errorCode' not in response.json():
                self.refresh()
                return
    self._response_not_success(response)
def node_info(self, node_name)

Returns the hac cluster node information

Args

node_name (str) - HAC cluster node name

Returns

dict - dictionary containing details of the hac node

Raises

SDKException: HAC zKeeper node not found

Expand source code Browse git
def node_info(self, node_name):
    """Returns the hac cluster node information

    Args:
        node_name       (str)   -   HAC cluster node name

    Returns:
        dict        -   dictionary containing details of the hac node

    Raises:
        SDKException:
            HAC zKeeper node not found

    """
    for node_info in self.cluster_nodes:
        if node_info['nodeClientEntity']['clientName'].lower() == node_name.lower():
            return node_info
    raise SDKException('HACCluster', '103')
def refresh(self)

Refreshes properties of the HAC cluster

Expand source code Browse git
def refresh(self):
    """Refreshes properties of the HAC cluster"""
    self.commcell.clients.refresh()
    if not self.commcell.clients.has_client(self._cluster_name):
        raise SDKException('HACClusters', '102')
    self.cluster_client_obj = self.commcell.clients.get(self._cluster_name)
    self._cluster_id = self.cluster_client_obj.client_id
    self._cluster_properties = self.cluster_client_obj.\
        properties['pseudoClientInfo']['distributedClusterInstanceProperties']['clusterConfig']['cloudInfo']
    self.cluster_nodes = self._cluster_properties['cloudNodes']
class HACClusters (commcell_object)

Class for representing all the HAC clusters associated with the commcell.

Initialize object of the HACClusters class

Args

commcell_object (object) – instance of class Commcell

Returns

object - instance of class HACClusters

Expand source code Browse git
class HACClusters(object):
    """Class for representing all the HAC clusters associated with the commcell."""

    def __init__(self, commcell_object):
        """Initialize object of the HACClusters class

            Args:
                commcell_object (object)    --  instance of class Commcell

            Returns:
                object  -   instance of class HACClusters
        """
        self._commcell_object = commcell_object
        self._cvpysdk_object = commcell_object._cvpysdk_object
        self._services = commcell_object._services
        self._update_response_ = commcell_object._update_response_
        self._hac_group = None
        self._all_hac_clusters = None
        self.refresh()

    def __str__(self):
        """Representation string consisting of all HAC Clusters of the commcell.

                Returns:
                    str - string of all the HAC clusters associated with the commcell
        """
        representation_string = '{:^5}\t{:^20}\n\n'.format('S. No.', 'HAC Name')
        index = 1
        for hac_name in self.all_hac_clusters:
            representation_string += '{:^5}\t{:^20}\n'.format(
                index, hac_name)
            index += 1
        return representation_string

    def __repr__(self):
        """Representation string for the instance of the HACClusters class."""
        return "HACClusters class instance for Commcell: '{0}'".format(
            self._commcell_object.commserv_name
        )

    def __getitem__(self, value):
        """Returns the details of HAC cluster for given HAC name

            Args:
                value   (str)       --  name of HAC cluster

            Returns:
                dict    -   details of the HAC cluster

            Raises:
                HAC cluster not found
        """
        value = value.lower()
        if value.lower() in self.all_hac_clusters:
            return {"name": value.lower, "id": self.all_hac_clusters[value]}
        raise SDKException('HACClusters', '102')

    def _response_not_success(self, response):
        """Helper method to raise exception when response is not 200 (ok)

            Args:
                response    (object)    -   response object

            Raises:
                SDKException:
                    Response was not success
        """
        raise SDKException(
            'Response',
            '101',
            self._update_response_(
                response.text))

    def _get_all_clusters(self):
        """Gets details of all HAC clusters associated to the commcell"""
        if self._commcell_object.client_groups.has_clientgroup("HAC Cluster"):
            if self._hac_group is None:
                self._hac_group = self._commcell_object.client_groups.get("HAC Cluster")
            self._hac_group.refresh()
            for client_name in self._hac_group.associated_clients:
                client_obj = HACCluster(
                    self._commcell_object, client_name
                )
                self._all_hac_clusters[client_name.lower()] = int(client_obj.cloud_id)

    def has_cluster(self, hac_name):
        """Returns whether the HAC cluster with given name is present or not

            Args:
                hac_name    (str)       --  hac cluster name

            Returns:
                boolean     -   True if hac cluster is associated with the commcell
                else returns False

            Raises:
                SDKException:
                    Data type of the input(s) is not valid
        """
        if not isinstance(hac_name, str):
            raise SDKException('HACClusters', '101')
        return hac_name.lower() in self._all_hac_clusters

    def get(self, hac_name):
        """Returns instance of HACCluster class is cluster is found

            Args:
                hac_name        (str/int)   --      hac cluster name or id

            Returns:
                object          (HACCluster)   --  Instance of a single hac cluster

            Raises:
                SDKException:
                    Data type of the input(s) is not valid

                    HAC Cluster not found
        """
        if isinstance(hac_name, str):
            if hac_name.lower() in self.all_hac_clusters:
                return HACCluster(self._commcell_object, hac_name.lower())
        elif isinstance(hac_name, int):
            for cluster_name in self.all_hac_clusters:
                if int(self._all_hac_clusters[cluster_name]) == int(hac_name):
                    return HACCluster(self._commcell_object, cluster_name)
        else:
            raise SDKException('HACClusters', '101')
        raise SDKException("HACClusters", "102")

    def refresh(self):
        """Refreshes properties for HACClusters class"""
        self._commcell_object.clients.refresh()
        self._commcell_object.client_groups.refresh()
        self._all_hac_clusters = {}
        self._hac_group = None
        self._get_all_clusters()

    def add(self, cloud_name, cloud_node_names):
        """Creates a new HAC cluster

            Args:
                cloud_name      (str)       --  hac cluster cloud name
                cloud_node_names    (list)  --  string array of node names to be added to cluster

            Raises:
                SDKException:
                    Data type of the input(s) is not valid.

                    Response was not success.

                    Response was empty.

            Returns:
                Object  -   Instance of class HACCluster
        """
        if not (isinstance(cloud_name, str) and isinstance(cloud_node_names, list)):
            raise SDKException('HACClusters', '101')
        cloud_node_names = sorted(cloud_node_names)
        node_meta_infos = {
            'zkDataPort': '8091',
            'zkElectionPort': '8097',
            'zkListenerPort': '8090',
            'zkServerId': None,
            'zkDataDir': None
        }
        req_json = deepcopy(IndexServerConstants.REQUEST_JSON)
        del req_json['solrCloudInfo']
        del req_json['cloudMetaInfos']
        req_json['type'] = 6
        req_json['cloudInfoEntity'] = {
            "_type_": 169,
            "cloudName": cloud_name,
            "cloudDisplayName": cloud_name
        }
        server_id = 1
        for node_name in cloud_node_names:
            node_obj = self._commcell_object.clients.get(node_name)
            node_data = {
                "opType": IndexServerConstants.OPERATION_ADD,
                "status": 0,
                "nodeClientEntity": {
                    "_type_": 3,
                    "hostName": node_obj.client_hostname,
                    "clientName": node_name,
                    "clientId": int(node_obj.client_id)
                },
                "nodeMetaInfos": []
            }
            node_meta_infos['zkServerId'] = str(server_id)
            node_meta_infos['zkDataDir'] = node_obj.install_directory + "\\iDataAgent\\JobResults\\ZKData"
            for node_info in node_meta_infos:
                node_data['nodeMetaInfos'].append({
                    'name': node_info,
                    'value': node_meta_infos[node_info]
                })
            req_json['cloudNodes'].append(node_data)
            server_id += 1
        flag, response = self._cvpysdk_object.make_request(
            'POST', self._services['CLOUD_CREATE'], req_json
        )
        if flag:
            if response.json() and 'genericResp' in response.json():
                if response.json()['genericResp'] == {} and \
                        'cloudId' in response.json():
                    self.refresh()
                    return HACCluster(self._commcell_object, cloud_name)
                else:
                    o_str = 'Failed to create HAC Cluster. Error: "{0}"'.format(
                        response.json()['genericResp'])
                    raise SDKException('Response', '102', o_str)
            else:
                raise SDKException('Response', '102')
        else:
            self._response_not_success(response)

    def delete(self, cloud_name):
        """Deletes an existing HAC cluster

        Args:
            cloud_name  (str)   --  HAC cluster cloud name to be deleted

        Raises:
            SDKException:
                Data type of the input(s) is not valid.

                Response was not success.

                Response was empty.
        """
        if not isinstance(cloud_name, str):
            raise SDKException('HACCluster', '101')
        cloud_id = self.all_hac_clusters[cloud_name.lower()]
        req_json = IndexServerConstants.REQUEST_JSON.copy()
        req_json["opType"] = IndexServerConstants.OPERATION_DELETE
        req_json['cloudInfoEntity']['cloudId'] = cloud_id
        flag, response = self._cvpysdk_object.make_request(
            'POST', self._services['CLOUD_DELETE'], req_json
        )
        if flag:
            if response.json() and 'genericResp' in response.json() \
                    and 'errorCode' not in response.json()['genericResp']:
                self.refresh()
                return
            if response.json() and 'genericResp' in response.json():
                raise SDKException(
                    'Response', '102', response.json()['genericResp'].get(
                        'errorMessage', ''))
            raise SDKException('Response', '102')
        self._response_not_success(response)

    @property
    def all_hac_clusters(self):
        """Returns the details of all HAC clusters associated with commcell"""
        return self._all_hac_clusters

Instance variables

var all_hac_clusters

Returns the details of all HAC clusters associated with commcell

Expand source code Browse git
@property
def all_hac_clusters(self):
    """Returns the details of all HAC clusters associated with commcell"""
    return self._all_hac_clusters

Methods

def add(self, cloud_name, cloud_node_names)

Creates a new HAC cluster

Args

cloud_name (str) – hac cluster cloud name cloud_node_names (list) – string array of node names to be added to cluster

Raises

SDKException: Data type of the input(s) is not valid.

Response was not success.

Response was empty.

Returns

Object - Instance of class HACCluster

Expand source code Browse git
def add(self, cloud_name, cloud_node_names):
    """Creates a new HAC cluster

        Args:
            cloud_name      (str)       --  hac cluster cloud name
            cloud_node_names    (list)  --  string array of node names to be added to cluster

        Raises:
            SDKException:
                Data type of the input(s) is not valid.

                Response was not success.

                Response was empty.

        Returns:
            Object  -   Instance of class HACCluster
    """
    if not (isinstance(cloud_name, str) and isinstance(cloud_node_names, list)):
        raise SDKException('HACClusters', '101')
    cloud_node_names = sorted(cloud_node_names)
    node_meta_infos = {
        'zkDataPort': '8091',
        'zkElectionPort': '8097',
        'zkListenerPort': '8090',
        'zkServerId': None,
        'zkDataDir': None
    }
    req_json = deepcopy(IndexServerConstants.REQUEST_JSON)
    del req_json['solrCloudInfo']
    del req_json['cloudMetaInfos']
    req_json['type'] = 6
    req_json['cloudInfoEntity'] = {
        "_type_": 169,
        "cloudName": cloud_name,
        "cloudDisplayName": cloud_name
    }
    server_id = 1
    for node_name in cloud_node_names:
        node_obj = self._commcell_object.clients.get(node_name)
        node_data = {
            "opType": IndexServerConstants.OPERATION_ADD,
            "status": 0,
            "nodeClientEntity": {
                "_type_": 3,
                "hostName": node_obj.client_hostname,
                "clientName": node_name,
                "clientId": int(node_obj.client_id)
            },
            "nodeMetaInfos": []
        }
        node_meta_infos['zkServerId'] = str(server_id)
        node_meta_infos['zkDataDir'] = node_obj.install_directory + "\\iDataAgent\\JobResults\\ZKData"
        for node_info in node_meta_infos:
            node_data['nodeMetaInfos'].append({
                'name': node_info,
                'value': node_meta_infos[node_info]
            })
        req_json['cloudNodes'].append(node_data)
        server_id += 1
    flag, response = self._cvpysdk_object.make_request(
        'POST', self._services['CLOUD_CREATE'], req_json
    )
    if flag:
        if response.json() and 'genericResp' in response.json():
            if response.json()['genericResp'] == {} and \
                    'cloudId' in response.json():
                self.refresh()
                return HACCluster(self._commcell_object, cloud_name)
            else:
                o_str = 'Failed to create HAC Cluster. Error: "{0}"'.format(
                    response.json()['genericResp'])
                raise SDKException('Response', '102', o_str)
        else:
            raise SDKException('Response', '102')
    else:
        self._response_not_success(response)
def delete(self, cloud_name)

Deletes an existing HAC cluster

Args

cloud_name (str) – HAC cluster cloud name to be deleted

Raises

SDKException: Data type of the input(s) is not valid.

Response was not success.

Response was empty.
Expand source code Browse git
def delete(self, cloud_name):
    """Deletes an existing HAC cluster

    Args:
        cloud_name  (str)   --  HAC cluster cloud name to be deleted

    Raises:
        SDKException:
            Data type of the input(s) is not valid.

            Response was not success.

            Response was empty.
    """
    if not isinstance(cloud_name, str):
        raise SDKException('HACCluster', '101')
    cloud_id = self.all_hac_clusters[cloud_name.lower()]
    req_json = IndexServerConstants.REQUEST_JSON.copy()
    req_json["opType"] = IndexServerConstants.OPERATION_DELETE
    req_json['cloudInfoEntity']['cloudId'] = cloud_id
    flag, response = self._cvpysdk_object.make_request(
        'POST', self._services['CLOUD_DELETE'], req_json
    )
    if flag:
        if response.json() and 'genericResp' in response.json() \
                and 'errorCode' not in response.json()['genericResp']:
            self.refresh()
            return
        if response.json() and 'genericResp' in response.json():
            raise SDKException(
                'Response', '102', response.json()['genericResp'].get(
                    'errorMessage', ''))
        raise SDKException('Response', '102')
    self._response_not_success(response)
def get(self, hac_name)

Returns instance of HACCluster class is cluster is found

Args

hac_name (str/int) – hac cluster name or id

Returns

object (HACCluster) – Instance of a single hac cluster

Raises

SDKException: Data type of the input(s) is not valid

HAC Cluster not found
Expand source code Browse git
def get(self, hac_name):
    """Returns instance of HACCluster class is cluster is found

        Args:
            hac_name        (str/int)   --      hac cluster name or id

        Returns:
            object          (HACCluster)   --  Instance of a single hac cluster

        Raises:
            SDKException:
                Data type of the input(s) is not valid

                HAC Cluster not found
    """
    if isinstance(hac_name, str):
        if hac_name.lower() in self.all_hac_clusters:
            return HACCluster(self._commcell_object, hac_name.lower())
    elif isinstance(hac_name, int):
        for cluster_name in self.all_hac_clusters:
            if int(self._all_hac_clusters[cluster_name]) == int(hac_name):
                return HACCluster(self._commcell_object, cluster_name)
    else:
        raise SDKException('HACClusters', '101')
    raise SDKException("HACClusters", "102")
def has_cluster(self, hac_name)

Returns whether the HAC cluster with given name is present or not

Args

hac_name (str) – hac cluster name

Returns

boolean - True if hac cluster is associated with the commcell else returns False

Raises

SDKException: Data type of the input(s) is not valid

Expand source code Browse git
def has_cluster(self, hac_name):
    """Returns whether the HAC cluster with given name is present or not

        Args:
            hac_name    (str)       --  hac cluster name

        Returns:
            boolean     -   True if hac cluster is associated with the commcell
            else returns False

        Raises:
            SDKException:
                Data type of the input(s) is not valid
    """
    if not isinstance(hac_name, str):
        raise SDKException('HACClusters', '101')
    return hac_name.lower() in self._all_hac_clusters
def refresh(self)

Refreshes properties for HACClusters class

Expand source code Browse git
def refresh(self):
    """Refreshes properties for HACClusters class"""
    self._commcell_object.clients.refresh()
    self._commcell_object.client_groups.refresh()
    self._all_hac_clusters = {}
    self._hac_group = None
    self._get_all_clusters()