Module cvpysdk.deployment.install

" Main file for performing the download operation

Download

__init__(commcell_object)        --  initialize commcell_object of Install class
associated with the commcell

repair_software                -- triggers Repair of the software on a specified
                                    client/client group

push_servicepack_and_hotfix()    --  installs the latest service pack in the client machine

install_software                 --  Installs the features selected on the machines selected
Expand source code Browse git
# -*- coding: utf-8 -*-

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

"""" Main file for performing the download operation

Download
========

    __init__(commcell_object)        --  initialize commcell_object of Install class
    associated with the commcell

    repair_software                -- triggers Repair of the software on a specified
                                        client/client group

    push_servicepack_and_hotfix()    --  installs the latest service pack in the client machine

    install_software                 --  Installs the features selected on the machines selected

"""

from ..job import Job
from ..exception import SDKException
from ..deployment.deploymentconstants import UnixDownloadFeatures, WindowsDownloadFeatures
from ..schedules import SchedulePattern, Schedules


class Install(object):
    """"class for installing software packages"""

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

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

            Returns:
                object - instance of the Install class

        """

        self.commcell_object = commcell_object
        self._services = commcell_object._services
        self._cvpysdk_object = commcell_object._cvpysdk_object

    def repair_software(self,
                        client=None,
                        client_group=None,
                        username=None,
                        password=None,
                        reboot_client=False):
        """triggers Repair of the software for a specified client machine

                Args:
                    client (str)               -- Client machine to re-install service pack on

                    client_group (str)         -- Client group to re-install service pack on
                                                            (eg : 'Media Agent')

                    username    (str)               -- username of the machine to re-install features on

                        default : None

                    password    (str)               -- base64 encoded password

                        default : None

                    reboot_client (bool)            -- boolean to specify whether to reboot the client
                    or not

                        default: False

                Returns:
                    object - instance of the Job class for this download job

                Raises:
                        SDKException:
                        if re-install job failed

                        if response is empty

                        if response is not success

        **NOTE:** repair_software can be used for client/ client_group not both; When both inputs are given only the
                  client computer will be repaired

        **NOTE:** If machine requires reboot and reboot is not selected, machine won't be updated

        **NOTE:** If machine requires login credentials and if not provided - client reinstallation might fail.

        """
        if (client is None) and (client_group is None):
            raise SDKException('Install', '100')

        if client:
            client_group = ""
            if not client in self.commcell_object.clients.all_clients:
                raise SDKException('Install', '101')

        elif client_group:
            client = ""
            if not client_group in self.commcell_object.client_groups.all_clientgroups:
                raise SDKException('Install', '102')

        request_json = {
            "taskInfo": {
                "task": {
                    "taskType": 1,
                    "initiatedFrom": 2,
                    "policyType": 0,
                    "taskFlags": {
                        "disabled": False
                    }
                },
                "subTasks": [
                    {
                        "subTaskOperation": 1,
                        "subTask": {
                            "subTaskType": 1,
                            "operationType": 4020
                        },
                        "options": {
                            "adminOpts": {
                                "clientInstallOption": {
                                    "installerOption": {
                                        "clientComposition": [
                                            {
                                                "packageDeliveryOption": 0
                                            }
                                        ]
                                    }
                                },
                                "updateOption": {
                                    "installUpdateOptions": 0,
                                    "restartExplorerPlugin": True,
                                    "rebootClient": reboot_client,
                                    "clientAndClientGroups": [
                                        {
                                            "clientGroupName": client_group,
                                            "clientName": client
                                        }
                                    ],
                                    "installUpdatesJobType": {
                                        "installType": 4,
                                        "upgradeClients": False,
                                        "undoUpdates": False,
                                        "installUpdates": False
                                    }
                                }
                            }
                        }
                    }
                ]
            }
        }

        if username:
            request_json["taskInfo"]["subTasks"][0]["options"]["adminOpts"]["clientInstallOption"]["clientAuthForJob"] \
                = {
                "password": password,
                "userName": username
            }

        flag, response = self._cvpysdk_object.make_request(
            'POST', self._services['CREATE_TASK'], request_json
        )

        if flag:
            if response.json():
                if "jobIds" in response.json():
                    return Job(self.commcell_object, response.json()['jobIds'][0])

                else:
                    raise SDKException('Install', '107')

            else:
                raise SDKException('Response', '102')
        else:
            raise SDKException('Response', '101')

    def push_servicepack_and_hotfix(
            self,
            client_computers=None,
            client_computer_groups=None,
            all_client_computers=False,
            all_client_computer_groups=False,
            reboot_client=False,
            run_db_maintenance=True,
            maintenance_release_only=False,
            **kwargs):
        """Installs the software packages on the clients

        Args:
            client_computers (list)               -- Client machines to install service pack on

            client_computer_groups (list)         -- Client groups to install service pack on

            all_client_computers (bool)           -- boolean to specify whether to install on
            all client computers or not

                default: False

            all_client _computer_groups (bool)    -- boolean to specify whether to install on all
            client computer groups or not

                default: False

            reboot_client (bool)                  -- boolean to specify whether to reboot the
            client or not

                default: False

            run_db_maintenance (bool)             -- boolean to specify whether to run db
            maintenance not

                default: True

            maintenance_release_only (bool)       -- for clients of feature releases lesser than CS, this option
            maintenance release of that client FR, if present in cache

            **kwargs: (dict) -- Key value pairs for supporting conditional initializations
                Supported -
                schedule_pattern (dict)           -- Request JSON for scheduling the operation

        Returns:
            object - instance of the Job/Task class for this download

        Raises:
                SDKException:
                    if schedule is not of type dictionary

                    if Download job failed

                    if response is empty

                    if response is not success

                    if another download job is already running

        **NOTE:** push_serivcepack_and_hotfixes cannot be used for revision upgrades

        """
        selected_clients = []
        selected_client_groups = []
        schedule_pattern = kwargs.get('schedule_pattern', None)
        if schedule_pattern:
            if not isinstance(schedule_pattern, dict):
                raise SDKException("Install", "101")
        if not any([all_client_computers,
                    all_client_computer_groups,
                    client_computers,
                    client_computer_groups]):
            raise SDKException('Install', '101')

        commcell_client_computers = self.commcell_object.clients.all_clients
        commcell_client_computer_groups = self.commcell_object.client_groups.all_clientgroups

        if client_computers is not None:
            client_computers = [x.lower() for x in client_computers]
            if not set(client_computers).issubset(commcell_client_computers):
                raise SDKException('Install', '102')

            selected_clients = [{'clientName': client} for client in client_computers]

        if client_computer_groups is not None:
            client_computer_groups = [x.lower() for x in client_computer_groups]
            if not set(client_computer_groups).issubset(commcell_client_computer_groups):
                raise SDKException('Install', '103')

            selected_client_groups = [{'clientGroupName': client}
                                      for client in client_computer_groups]

        if all_client_computers:
            selected_clients = [{"_type_": 2}]

        if all_client_computer_groups:
            selected_client_groups = [{"_type_": 27}]

        all_clients = selected_clients + selected_client_groups

        request_json = {
            "taskInfo": {
                "task": {
                    "taskType": 1,
                    "initiatedFrom": 2,
                    "policyType": 0,
                    "alert": {
                        "alertName": ""
                    },
                    "taskFlags": {
                        "isEdgeDrive": False,
                        "disabled": False
                    }
                },
                "subTasks": [
                    {
                        "subTaskOperation": 1,
                        "subTask": {
                            "subTaskType": 1,
                            "operationType": 4020
                        },
                        "options": {
                            "adminOpts": {
                                "updateOption": {
                                    "removeIntersectingDiag": True,
                                    "restartExplorerPlugin": True,
                                    "rebootClient": reboot_client,
                                    "runDBMaintenance": run_db_maintenance,
                                    "maintenanceReleaseOnly": maintenance_release_only,
                                    "clientAndClientGroups": all_clients,
                                    "installUpdatesJobType": {
                                        "upgradeClients": False,
                                        "undoUpdates": False,
                                        "installUpdates": True
                                    }
                                }
                            },
                        }
                    }
                ]
            }
        }

        if schedule_pattern:
            request_json = SchedulePattern().create_schedule(request_json, schedule_pattern)

        flag, response = self._cvpysdk_object.make_request(
            'POST', self._services['CREATE_TASK'], request_json
        )

        if flag:
            if response.json():
                if "jobIds" in response.json():
                    return Job(self.commcell_object, response.json()['jobIds'][0])

                elif schedule_pattern and "taskId" in response.json():
                    return Schedules(self.commcell_object).get(task_id=response.json()['taskId'])

                else:
                    raise SDKException('Install', '107')

            else:
                raise SDKException('Response', '102')
        else:
            raise SDKException('Response', '101')

    def install_software(
            self,
            client_computers=None,
            windows_features=None,
            unix_features=None,
            username=None,
            password=None,
            install_path=None,
            log_file_loc=None,
            client_group_name=None,
            storage_policy_name=None,
            sw_cache_client=None,
            **kwargs):
        """
        Installs the features selected on the given machines
        Args:

            client_computers    (list)      -- list of hostnames/IP address to install the
            features on

                default : None

            windows_features (list of enum) -- list of windows features to be installed

                default : None

            unix_features (list of enum)    -- list of unix features to be installed

                default : None

            username    (str)               -- username of the machine to install features on

                default : None

            password    (str)               -- base64 encoded password

                default : None

            install_path (str)              -- Install to a specified path on the client

                 default : None

            log_file_loc (str)              -- Install to a specified log path on the client

                 default : None

            client_group_name (list)        -- List of client groups for the client

                 default : None

            storage_policy_name (str)       -- Storage policy for the default subclient

                 default : None

            sw_cache_client (str)           -- Remote Cache Client Name/ Over-riding Software Cache

                default : None (Use CS Cache by default)

            **kwargs: (dict) -- Key value pairs for supporting conditional initializations
            Supported -
            install_flags (dict) - dictionary of install flag values
            Ex : install_flags = {"preferredIPFamily":2, "install32Base":True}

            db2_logs_location (dict) - dictionary of db2 logs location
            Ex: db2_logs_location = {
                                    "db2ArchivePath": "/opt/Archive/",
                                    "db2RetrievePath": "/opt/Retrieve/",
                                    "db2AuditErrorPath": "/opt/Audit/"
                            }
            index_cache_location (str) - Set index cache location for MA package
            Ex: index_cache_location = "/opt/IndexCache/"
            firewall_inputs (dict) - dictionary for firewall configuration
            Ex: firewall_inputs = {
                                  "enableFirewallConfig": True,
                                  "firewallConnectionType": 1,
                                  "httpProxyConfigurationType": 0,
                                  "proxyClientName": "Proxy_client_name",
                                  "proxyHostName": "Proxy_host_name",
                                  "portNumber": "port_number",
                                  "encryptedTunnel": "encrypted_tunnel"
                            }

            firewall_inputs can take the following values

            Ex 1: Client can open connection to CS
             firewall_inputs = {
                                  "enableFirewallConfig": True,
                                  "firewallConnectionType": 0,
                                  "proxyClientName": "",
                                  "proxyHostName": "",
                                  "portNumber": "port_number",
                                  "httpProxyConfigurationType": 0,
                                  "encryptedTunnel": True/False
                            }
            Ex 2: CS can open connection to Client
                 firewall_inputs = {
                                  "enableFirewallConfig": True,
                                  "firewallConnectionType": 1,
                                  "proxyClientName": "",
                                  "proxyHostName": "",
                                  "portNumber": "port_number",
                                  "httpProxyConfigurationType": 0,
                                  "encryptedTunnel": True/False
                            }

            Ex 3: Client can communicate to CS using Proxy
                 firewall_inputs = {
                                  "enableFirewallConfig": True,
                                  "firewallConnectionType": 2,
                                  "httpProxyConfigurationType": 0,
                                  "proxyClientName": "Proxy_client_name",
                                  "proxyHostName": "Proxy_host_name",
                                  "portNumber": "port_number",
                                  "encryptedTunnel": True/False
                            }
            webconsole_inputs (dict) - dictionary for webconsole configuration
            Ex: webconsole_inputs = {
                                        "webServerClientId": "webservername"
                                    }


        Returns:
                object - instance of the Job class for this install_software job

        Raises:
            SDKException:
                if install job failed

                if response is empty

                if response is not success

        Usage:

            -   UnixDownloadFeatures and WindowsDownloadFeatures enum is used for providing
                input to the install_software method, it can be imported by

                >>> from cvpysdk.deployment.deploymentconstants import UnixDownloadFeatures
                    from cvpysdk.deployment.deploymentconstants import WindowsDownloadFeatures

            -   sample method call

                >>> commcell_obj.install_software(
                                client_computers=[win_machine1, win_machine2],
                                windows_features=[WindowsDownloadFeatures.FILE_SYSTEM.value],
                                unix_features=None,
                                username='username',
                                password='password',
                                install_path='C:\\Temp,
                                log_file_loc='/var/log',
                                client_group_name=[My_Servers],
                                storage_policy_name='My_Storage_Policy',
                                install_flags={"preferredIPFamily":2})

                    **NOTE:** Either Unix or Windows clients_computers should be chosen and
                    not both

        """
        db2_install = False
        ma_install = False
        if windows_features:
            os_type = 0
            if WindowsDownloadFeatures.DB2_AGENT.value in windows_features:
                db2_install = True
            if WindowsDownloadFeatures.MEDIA_AGENT.value in windows_features:
                ma_install = True
            install_options = [{'osType': 'Windows', 'ComponentId': feature_id}
                               for feature_id in windows_features]

        elif unix_features:
            os_type = 1
            if UnixDownloadFeatures.DB2_AGENT.value in unix_features:
                db2_install = True
            if UnixDownloadFeatures.MEDIA_AGENT.value in unix_features:
                ma_install = True
            install_options = [{'osType': 'Unix', 'ComponentId': feature_id}
                               for feature_id in unix_features]

        else:
            raise SDKException('Install', '105')

        if client_computers:
            commcell_name = self.commcell_object.commserv_name

            client_details = []
            for client_name in client_computers:
                client_details.append(
                    {
                        "clientEntity": {
                            "clientId": 0,
                            "clientName": client_name,
                            "commCellName": commcell_name
                        }
                    })

        else:
            raise SDKException('Install', '106')

        if client_group_name:
            client_group_name = [x.lower() for x in client_group_name]
            if not set(client_group_name).issubset(self.commcell_object.client_groups.all_clientgroups):
                raise SDKException('Install', '103')
            selected_client_groups = [{'clientGroupName': client_group}
                                      for client_group in client_group_name]

        install_flags = kwargs.get('install_flags')
        db2_logs = kwargs.get('db2_logs_location', {})
        index_cache_location = kwargs.get('index_cache_location', None)
        firewall_inputs = kwargs.get('firewall_inputs', {})
        web_console_input = kwargs.get('webconsole_inputs', {})

        request_json = {
            "taskInfo": {
                "associations": [
                    {
                        "commCellId": 2
                    }
                ],
                "task": {
                    "taskType": 1,
                    "initiatedFrom": 1,
                    "taskFlags": {
                        "disabled": False
                    }
                },
                "subTasks": [
                    {
                        "subTask": {
                            "subTaskType": 1,
                            "operationType": 4026
                        },
                        "options": {
                            "adminOpts": {
                                "clientInstallOption": {
                                    "reuseADCredentials": False,
                                    "installOSType": os_type,
                                    "discoveryType": 0,
                                    "installerOption": {
                                        "requestType": 0,
                                        "Operationtype": 0,
                                        "CommServeHostName":
                                            self.commcell_object.commserv_name,
                                        "RemoteClient": False,
                                        "installFlags": {
                                            "allowMultipleInstances": kwargs.get('allowMultipleInstances', False),
                                            "restoreOnlyAgents": False,
                                            "killBrowserProcesses": True,
                                            "install32Base": install_flags.get('install32Base',
                                                                               False) if install_flags else False,
                                            "disableOSFirewall": False,
                                            "stopOracleServices": False,
                                            "skipClientsOfCS": False,
                                            "addToFirewallExclusion": True,
                                            "ignoreJobsRunning": False,
                                            "forceReboot": False,
                                            "overrideClientInfo": True,
                                            "preferredIPFamily": install_flags.get('preferredIPFamily',
                                                                                   1) if install_flags else 1,
                                            "firewallInstall": {
                                                "enableFirewallConfig": False,
                                                "firewallConnectionType": 0,
                                                "portNumber": 0
                                            }
                                        },
                                        "User": {
                                            "userName": "admin",
                                            "userId": 1
                                        },
                                        "clientComposition": [
                                            {
                                                "activateClient": True,
                                                "overrideSoftwareCache": True if sw_cache_client else False,
                                                "softwareCacheOrSrmProxyClient": {
                                                    "clientName": sw_cache_client if sw_cache_client else ""
                                                },
                                                "packageDeliveryOption": 0,
                                                "components": {
                                                    "commonInfo": {
                                                        "globalFilters": 2,
                                                        "storagePolicyToUse": {
                                                            "storagePolicyName": storage_policy_name if storage_policy_name else ""
                                                        }
                                                    },
                                                    "fileSystem": {
                                                        "configureForLaptopBackups": False
                                                    },
                                                    "componentInfo": install_options,
                                                    "webConsole": web_console_input
                                                },
                                                "clientInfo": {
                                                    "clientGroups": selected_client_groups if client_group_name else [],
                                                    "client": {
                                                        "evmgrcPort": 0,
                                                        "cvdPort": 0,
                                                        "installDirectory": install_path if install_path else ""
                                                    },
                                                    "clientProps": {
                                                        "logFilesLocation": log_file_loc if log_file_loc else ""
                                                    }
                                                }
                                            }
                                        ]
                                    },
                                    "clientDetails": client_details,
                                    "clientAuthForJob": {
                                        "password": password,
                                        "userName": username
                                    }
                                },
                                "updateOption": {
                                    "rebootClient": True
                                }
                            }
                        }
                    }
                ]
            }
        }

        if db2_install and db2_logs:
            request_json["taskInfo"]["subTasks"][0]["options"]["adminOpts"]["clientInstallOption"]["installerOption"][
                "clientComposition"][0]["components"]["db2"] = db2_logs

        if ma_install and index_cache_location:
            index_cache_dict = {
                "indexCacheDirectory": {
                    "path": index_cache_location
                }
            }
            request_json["taskInfo"]["subTasks"][0]["options"]["adminOpts"]["clientInstallOption"]["installerOption"][
                "clientComposition"][0]["components"]["mediaAgent"] = index_cache_dict

        if firewall_inputs:
            request_json["taskInfo"]["subTasks"][0]["options"]["adminOpts"]["clientInstallOption"]["installerOption"][
                "installFlags"]["firewallInstall"] = firewall_inputs


        flag, response = self._cvpysdk_object.make_request(
            'POST', self._services['CREATE_TASK'], request_json
        )

        if flag:
            if response.json():
                if "jobIds" in response.json():
                    return Job(self.commcell_object, response.json()['jobIds'][0])

                else:
                    raise SDKException('Install', '107')

            else:
                raise SDKException('Response', '102')
        else:
            raise SDKException('Response', '101')

Classes

class Install (commcell_object)

"class for installing software packages

Initialize object of the Install class.

Args

commcell_object (object) – instance of the Commcell class

Returns

object - instance of the Install class

Expand source code Browse git
class Install(object):
    """"class for installing software packages"""

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

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

            Returns:
                object - instance of the Install class

        """

        self.commcell_object = commcell_object
        self._services = commcell_object._services
        self._cvpysdk_object = commcell_object._cvpysdk_object

    def repair_software(self,
                        client=None,
                        client_group=None,
                        username=None,
                        password=None,
                        reboot_client=False):
        """triggers Repair of the software for a specified client machine

                Args:
                    client (str)               -- Client machine to re-install service pack on

                    client_group (str)         -- Client group to re-install service pack on
                                                            (eg : 'Media Agent')

                    username    (str)               -- username of the machine to re-install features on

                        default : None

                    password    (str)               -- base64 encoded password

                        default : None

                    reboot_client (bool)            -- boolean to specify whether to reboot the client
                    or not

                        default: False

                Returns:
                    object - instance of the Job class for this download job

                Raises:
                        SDKException:
                        if re-install job failed

                        if response is empty

                        if response is not success

        **NOTE:** repair_software can be used for client/ client_group not both; When both inputs are given only the
                  client computer will be repaired

        **NOTE:** If machine requires reboot and reboot is not selected, machine won't be updated

        **NOTE:** If machine requires login credentials and if not provided - client reinstallation might fail.

        """
        if (client is None) and (client_group is None):
            raise SDKException('Install', '100')

        if client:
            client_group = ""
            if not client in self.commcell_object.clients.all_clients:
                raise SDKException('Install', '101')

        elif client_group:
            client = ""
            if not client_group in self.commcell_object.client_groups.all_clientgroups:
                raise SDKException('Install', '102')

        request_json = {
            "taskInfo": {
                "task": {
                    "taskType": 1,
                    "initiatedFrom": 2,
                    "policyType": 0,
                    "taskFlags": {
                        "disabled": False
                    }
                },
                "subTasks": [
                    {
                        "subTaskOperation": 1,
                        "subTask": {
                            "subTaskType": 1,
                            "operationType": 4020
                        },
                        "options": {
                            "adminOpts": {
                                "clientInstallOption": {
                                    "installerOption": {
                                        "clientComposition": [
                                            {
                                                "packageDeliveryOption": 0
                                            }
                                        ]
                                    }
                                },
                                "updateOption": {
                                    "installUpdateOptions": 0,
                                    "restartExplorerPlugin": True,
                                    "rebootClient": reboot_client,
                                    "clientAndClientGroups": [
                                        {
                                            "clientGroupName": client_group,
                                            "clientName": client
                                        }
                                    ],
                                    "installUpdatesJobType": {
                                        "installType": 4,
                                        "upgradeClients": False,
                                        "undoUpdates": False,
                                        "installUpdates": False
                                    }
                                }
                            }
                        }
                    }
                ]
            }
        }

        if username:
            request_json["taskInfo"]["subTasks"][0]["options"]["adminOpts"]["clientInstallOption"]["clientAuthForJob"] \
                = {
                "password": password,
                "userName": username
            }

        flag, response = self._cvpysdk_object.make_request(
            'POST', self._services['CREATE_TASK'], request_json
        )

        if flag:
            if response.json():
                if "jobIds" in response.json():
                    return Job(self.commcell_object, response.json()['jobIds'][0])

                else:
                    raise SDKException('Install', '107')

            else:
                raise SDKException('Response', '102')
        else:
            raise SDKException('Response', '101')

    def push_servicepack_and_hotfix(
            self,
            client_computers=None,
            client_computer_groups=None,
            all_client_computers=False,
            all_client_computer_groups=False,
            reboot_client=False,
            run_db_maintenance=True,
            maintenance_release_only=False,
            **kwargs):
        """Installs the software packages on the clients

        Args:
            client_computers (list)               -- Client machines to install service pack on

            client_computer_groups (list)         -- Client groups to install service pack on

            all_client_computers (bool)           -- boolean to specify whether to install on
            all client computers or not

                default: False

            all_client _computer_groups (bool)    -- boolean to specify whether to install on all
            client computer groups or not

                default: False

            reboot_client (bool)                  -- boolean to specify whether to reboot the
            client or not

                default: False

            run_db_maintenance (bool)             -- boolean to specify whether to run db
            maintenance not

                default: True

            maintenance_release_only (bool)       -- for clients of feature releases lesser than CS, this option
            maintenance release of that client FR, if present in cache

            **kwargs: (dict) -- Key value pairs for supporting conditional initializations
                Supported -
                schedule_pattern (dict)           -- Request JSON for scheduling the operation

        Returns:
            object - instance of the Job/Task class for this download

        Raises:
                SDKException:
                    if schedule is not of type dictionary

                    if Download job failed

                    if response is empty

                    if response is not success

                    if another download job is already running

        **NOTE:** push_serivcepack_and_hotfixes cannot be used for revision upgrades

        """
        selected_clients = []
        selected_client_groups = []
        schedule_pattern = kwargs.get('schedule_pattern', None)
        if schedule_pattern:
            if not isinstance(schedule_pattern, dict):
                raise SDKException("Install", "101")
        if not any([all_client_computers,
                    all_client_computer_groups,
                    client_computers,
                    client_computer_groups]):
            raise SDKException('Install', '101')

        commcell_client_computers = self.commcell_object.clients.all_clients
        commcell_client_computer_groups = self.commcell_object.client_groups.all_clientgroups

        if client_computers is not None:
            client_computers = [x.lower() for x in client_computers]
            if not set(client_computers).issubset(commcell_client_computers):
                raise SDKException('Install', '102')

            selected_clients = [{'clientName': client} for client in client_computers]

        if client_computer_groups is not None:
            client_computer_groups = [x.lower() for x in client_computer_groups]
            if not set(client_computer_groups).issubset(commcell_client_computer_groups):
                raise SDKException('Install', '103')

            selected_client_groups = [{'clientGroupName': client}
                                      for client in client_computer_groups]

        if all_client_computers:
            selected_clients = [{"_type_": 2}]

        if all_client_computer_groups:
            selected_client_groups = [{"_type_": 27}]

        all_clients = selected_clients + selected_client_groups

        request_json = {
            "taskInfo": {
                "task": {
                    "taskType": 1,
                    "initiatedFrom": 2,
                    "policyType": 0,
                    "alert": {
                        "alertName": ""
                    },
                    "taskFlags": {
                        "isEdgeDrive": False,
                        "disabled": False
                    }
                },
                "subTasks": [
                    {
                        "subTaskOperation": 1,
                        "subTask": {
                            "subTaskType": 1,
                            "operationType": 4020
                        },
                        "options": {
                            "adminOpts": {
                                "updateOption": {
                                    "removeIntersectingDiag": True,
                                    "restartExplorerPlugin": True,
                                    "rebootClient": reboot_client,
                                    "runDBMaintenance": run_db_maintenance,
                                    "maintenanceReleaseOnly": maintenance_release_only,
                                    "clientAndClientGroups": all_clients,
                                    "installUpdatesJobType": {
                                        "upgradeClients": False,
                                        "undoUpdates": False,
                                        "installUpdates": True
                                    }
                                }
                            },
                        }
                    }
                ]
            }
        }

        if schedule_pattern:
            request_json = SchedulePattern().create_schedule(request_json, schedule_pattern)

        flag, response = self._cvpysdk_object.make_request(
            'POST', self._services['CREATE_TASK'], request_json
        )

        if flag:
            if response.json():
                if "jobIds" in response.json():
                    return Job(self.commcell_object, response.json()['jobIds'][0])

                elif schedule_pattern and "taskId" in response.json():
                    return Schedules(self.commcell_object).get(task_id=response.json()['taskId'])

                else:
                    raise SDKException('Install', '107')

            else:
                raise SDKException('Response', '102')
        else:
            raise SDKException('Response', '101')

    def install_software(
            self,
            client_computers=None,
            windows_features=None,
            unix_features=None,
            username=None,
            password=None,
            install_path=None,
            log_file_loc=None,
            client_group_name=None,
            storage_policy_name=None,
            sw_cache_client=None,
            **kwargs):
        """
        Installs the features selected on the given machines
        Args:

            client_computers    (list)      -- list of hostnames/IP address to install the
            features on

                default : None

            windows_features (list of enum) -- list of windows features to be installed

                default : None

            unix_features (list of enum)    -- list of unix features to be installed

                default : None

            username    (str)               -- username of the machine to install features on

                default : None

            password    (str)               -- base64 encoded password

                default : None

            install_path (str)              -- Install to a specified path on the client

                 default : None

            log_file_loc (str)              -- Install to a specified log path on the client

                 default : None

            client_group_name (list)        -- List of client groups for the client

                 default : None

            storage_policy_name (str)       -- Storage policy for the default subclient

                 default : None

            sw_cache_client (str)           -- Remote Cache Client Name/ Over-riding Software Cache

                default : None (Use CS Cache by default)

            **kwargs: (dict) -- Key value pairs for supporting conditional initializations
            Supported -
            install_flags (dict) - dictionary of install flag values
            Ex : install_flags = {"preferredIPFamily":2, "install32Base":True}

            db2_logs_location (dict) - dictionary of db2 logs location
            Ex: db2_logs_location = {
                                    "db2ArchivePath": "/opt/Archive/",
                                    "db2RetrievePath": "/opt/Retrieve/",
                                    "db2AuditErrorPath": "/opt/Audit/"
                            }
            index_cache_location (str) - Set index cache location for MA package
            Ex: index_cache_location = "/opt/IndexCache/"
            firewall_inputs (dict) - dictionary for firewall configuration
            Ex: firewall_inputs = {
                                  "enableFirewallConfig": True,
                                  "firewallConnectionType": 1,
                                  "httpProxyConfigurationType": 0,
                                  "proxyClientName": "Proxy_client_name",
                                  "proxyHostName": "Proxy_host_name",
                                  "portNumber": "port_number",
                                  "encryptedTunnel": "encrypted_tunnel"
                            }

            firewall_inputs can take the following values

            Ex 1: Client can open connection to CS
             firewall_inputs = {
                                  "enableFirewallConfig": True,
                                  "firewallConnectionType": 0,
                                  "proxyClientName": "",
                                  "proxyHostName": "",
                                  "portNumber": "port_number",
                                  "httpProxyConfigurationType": 0,
                                  "encryptedTunnel": True/False
                            }
            Ex 2: CS can open connection to Client
                 firewall_inputs = {
                                  "enableFirewallConfig": True,
                                  "firewallConnectionType": 1,
                                  "proxyClientName": "",
                                  "proxyHostName": "",
                                  "portNumber": "port_number",
                                  "httpProxyConfigurationType": 0,
                                  "encryptedTunnel": True/False
                            }

            Ex 3: Client can communicate to CS using Proxy
                 firewall_inputs = {
                                  "enableFirewallConfig": True,
                                  "firewallConnectionType": 2,
                                  "httpProxyConfigurationType": 0,
                                  "proxyClientName": "Proxy_client_name",
                                  "proxyHostName": "Proxy_host_name",
                                  "portNumber": "port_number",
                                  "encryptedTunnel": True/False
                            }
            webconsole_inputs (dict) - dictionary for webconsole configuration
            Ex: webconsole_inputs = {
                                        "webServerClientId": "webservername"
                                    }


        Returns:
                object - instance of the Job class for this install_software job

        Raises:
            SDKException:
                if install job failed

                if response is empty

                if response is not success

        Usage:

            -   UnixDownloadFeatures and WindowsDownloadFeatures enum is used for providing
                input to the install_software method, it can be imported by

                >>> from cvpysdk.deployment.deploymentconstants import UnixDownloadFeatures
                    from cvpysdk.deployment.deploymentconstants import WindowsDownloadFeatures

            -   sample method call

                >>> commcell_obj.install_software(
                                client_computers=[win_machine1, win_machine2],
                                windows_features=[WindowsDownloadFeatures.FILE_SYSTEM.value],
                                unix_features=None,
                                username='username',
                                password='password',
                                install_path='C:\\Temp,
                                log_file_loc='/var/log',
                                client_group_name=[My_Servers],
                                storage_policy_name='My_Storage_Policy',
                                install_flags={"preferredIPFamily":2})

                    **NOTE:** Either Unix or Windows clients_computers should be chosen and
                    not both

        """
        db2_install = False
        ma_install = False
        if windows_features:
            os_type = 0
            if WindowsDownloadFeatures.DB2_AGENT.value in windows_features:
                db2_install = True
            if WindowsDownloadFeatures.MEDIA_AGENT.value in windows_features:
                ma_install = True
            install_options = [{'osType': 'Windows', 'ComponentId': feature_id}
                               for feature_id in windows_features]

        elif unix_features:
            os_type = 1
            if UnixDownloadFeatures.DB2_AGENT.value in unix_features:
                db2_install = True
            if UnixDownloadFeatures.MEDIA_AGENT.value in unix_features:
                ma_install = True
            install_options = [{'osType': 'Unix', 'ComponentId': feature_id}
                               for feature_id in unix_features]

        else:
            raise SDKException('Install', '105')

        if client_computers:
            commcell_name = self.commcell_object.commserv_name

            client_details = []
            for client_name in client_computers:
                client_details.append(
                    {
                        "clientEntity": {
                            "clientId": 0,
                            "clientName": client_name,
                            "commCellName": commcell_name
                        }
                    })

        else:
            raise SDKException('Install', '106')

        if client_group_name:
            client_group_name = [x.lower() for x in client_group_name]
            if not set(client_group_name).issubset(self.commcell_object.client_groups.all_clientgroups):
                raise SDKException('Install', '103')
            selected_client_groups = [{'clientGroupName': client_group}
                                      for client_group in client_group_name]

        install_flags = kwargs.get('install_flags')
        db2_logs = kwargs.get('db2_logs_location', {})
        index_cache_location = kwargs.get('index_cache_location', None)
        firewall_inputs = kwargs.get('firewall_inputs', {})
        web_console_input = kwargs.get('webconsole_inputs', {})

        request_json = {
            "taskInfo": {
                "associations": [
                    {
                        "commCellId": 2
                    }
                ],
                "task": {
                    "taskType": 1,
                    "initiatedFrom": 1,
                    "taskFlags": {
                        "disabled": False
                    }
                },
                "subTasks": [
                    {
                        "subTask": {
                            "subTaskType": 1,
                            "operationType": 4026
                        },
                        "options": {
                            "adminOpts": {
                                "clientInstallOption": {
                                    "reuseADCredentials": False,
                                    "installOSType": os_type,
                                    "discoveryType": 0,
                                    "installerOption": {
                                        "requestType": 0,
                                        "Operationtype": 0,
                                        "CommServeHostName":
                                            self.commcell_object.commserv_name,
                                        "RemoteClient": False,
                                        "installFlags": {
                                            "allowMultipleInstances": kwargs.get('allowMultipleInstances', False),
                                            "restoreOnlyAgents": False,
                                            "killBrowserProcesses": True,
                                            "install32Base": install_flags.get('install32Base',
                                                                               False) if install_flags else False,
                                            "disableOSFirewall": False,
                                            "stopOracleServices": False,
                                            "skipClientsOfCS": False,
                                            "addToFirewallExclusion": True,
                                            "ignoreJobsRunning": False,
                                            "forceReboot": False,
                                            "overrideClientInfo": True,
                                            "preferredIPFamily": install_flags.get('preferredIPFamily',
                                                                                   1) if install_flags else 1,
                                            "firewallInstall": {
                                                "enableFirewallConfig": False,
                                                "firewallConnectionType": 0,
                                                "portNumber": 0
                                            }
                                        },
                                        "User": {
                                            "userName": "admin",
                                            "userId": 1
                                        },
                                        "clientComposition": [
                                            {
                                                "activateClient": True,
                                                "overrideSoftwareCache": True if sw_cache_client else False,
                                                "softwareCacheOrSrmProxyClient": {
                                                    "clientName": sw_cache_client if sw_cache_client else ""
                                                },
                                                "packageDeliveryOption": 0,
                                                "components": {
                                                    "commonInfo": {
                                                        "globalFilters": 2,
                                                        "storagePolicyToUse": {
                                                            "storagePolicyName": storage_policy_name if storage_policy_name else ""
                                                        }
                                                    },
                                                    "fileSystem": {
                                                        "configureForLaptopBackups": False
                                                    },
                                                    "componentInfo": install_options,
                                                    "webConsole": web_console_input
                                                },
                                                "clientInfo": {
                                                    "clientGroups": selected_client_groups if client_group_name else [],
                                                    "client": {
                                                        "evmgrcPort": 0,
                                                        "cvdPort": 0,
                                                        "installDirectory": install_path if install_path else ""
                                                    },
                                                    "clientProps": {
                                                        "logFilesLocation": log_file_loc if log_file_loc else ""
                                                    }
                                                }
                                            }
                                        ]
                                    },
                                    "clientDetails": client_details,
                                    "clientAuthForJob": {
                                        "password": password,
                                        "userName": username
                                    }
                                },
                                "updateOption": {
                                    "rebootClient": True
                                }
                            }
                        }
                    }
                ]
            }
        }

        if db2_install and db2_logs:
            request_json["taskInfo"]["subTasks"][0]["options"]["adminOpts"]["clientInstallOption"]["installerOption"][
                "clientComposition"][0]["components"]["db2"] = db2_logs

        if ma_install and index_cache_location:
            index_cache_dict = {
                "indexCacheDirectory": {
                    "path": index_cache_location
                }
            }
            request_json["taskInfo"]["subTasks"][0]["options"]["adminOpts"]["clientInstallOption"]["installerOption"][
                "clientComposition"][0]["components"]["mediaAgent"] = index_cache_dict

        if firewall_inputs:
            request_json["taskInfo"]["subTasks"][0]["options"]["adminOpts"]["clientInstallOption"]["installerOption"][
                "installFlags"]["firewallInstall"] = firewall_inputs


        flag, response = self._cvpysdk_object.make_request(
            'POST', self._services['CREATE_TASK'], request_json
        )

        if flag:
            if response.json():
                if "jobIds" in response.json():
                    return Job(self.commcell_object, response.json()['jobIds'][0])

                else:
                    raise SDKException('Install', '107')

            else:
                raise SDKException('Response', '102')
        else:
            raise SDKException('Response', '101')

Methods

def install_software(self, client_computers=None, windows_features=None, unix_features=None, username=None, password=None, install_path=None, log_file_loc=None, client_group_name=None, storage_policy_name=None, sw_cache_client=None, **kwargs)

Installs the features selected on the given machines

Args

client_computers (list) – list of hostnames/IP address to install the features on

default : None

windows_features (list of enum) – list of windows features to be installed

default : None

unix_features (list of enum) – list of unix features to be installed

default : None

username (str) – username of the machine to install features on

default : None

password (str) – base64 encoded password

default : None

install_path (str) – Install to a specified path on the client

 default : None

log_file_loc (str) – Install to a specified log path on the client

 default : None

client_group_name (list) – List of client groups for the client

 default : None

storage_policy_name (str) – Storage policy for the default subclient

 default : None

sw_cache_client (str) – Remote Cache Client Name/ Over-riding Software Cache

default : None (Use CS Cache by default)
**kwargs
(dict) – Key value pairs for supporting conditional initializations

Supported - install_flags (dict) - dictionary of install flag values Ex : install_flags = {"preferredIPFamily":2, "install32Base":True}

db2_logs_location (dict) - dictionary of db2 logs location
Ex
db2_logs_location = { "db2ArchivePath": "/opt/Archive/", "db2RetrievePath": "/opt/Retrieve/", "db2AuditErrorPath": "/opt/Audit/" }
index_cache_location (str) - Set index cache location for MA package
Ex
index_cache_location = "/opt/IndexCache/"
firewall_inputs (dict) - dictionary for firewall configuration
Ex
firewall_inputs = { "enableFirewallConfig": True, "firewallConnectionType": 1, "httpProxyConfigurationType": 0, "proxyClientName": "Proxy_client_name", "proxyHostName": "Proxy_host_name", "portNumber": "port_number", "encryptedTunnel": "encrypted_tunnel" }

firewall_inputs can take the following values

Ex 1: Client can open connection to CS firewall_inputs = { "enableFirewallConfig": True, "firewallConnectionType": 0, "proxyClientName": "", "proxyHostName": "", "portNumber": "port_number", "httpProxyConfigurationType": 0, "encryptedTunnel": True/False } Ex 2: CS can open connection to Client firewall_inputs = { "enableFirewallConfig": True, "firewallConnectionType": 1, "proxyClientName": "", "proxyHostName": "", "portNumber": "port_number", "httpProxyConfigurationType": 0, "encryptedTunnel": True/False }

Ex 3: Client can communicate to CS using Proxy
firewall_inputs = {
"enableFirewallConfig": True,
"firewallConnectionType": 2,
"httpProxyConfigurationType": 0,
"proxyClientName": "Proxy_client_name",
"proxyHostName": "Proxy_host_name",
"portNumber": "port_number",
"encryptedTunnel": True/False
}
webconsole_inputs (dict) - dictionary for webconsole configuration
Ex
webconsole_inputs = { "webServerClientId": "webservername" }

Returns

object - instance of the Job class for this install_software job

Raises

SDKException: if install job failed

if response is empty

if response is not success

Usage

  • UnixDownloadFeatures and WindowsDownloadFeatures enum is used for providing input to the install_software method, it can be imported by

    from cvpysdk.deployment.deploymentconstants import UnixDownloadFeatures from cvpysdk.deployment.deploymentconstants import WindowsDownloadFeatures

  • sample method call

    commcell_obj.install_software( client_computers=[win_machine1, win_machine2], windows_features=[WindowsDownloadFeatures.FILE_SYSTEM.value], unix_features=None, username='username', password='password', install_path='C:\Temp, log_file_loc='/var/log', client_group_name=[My_Servers], storage_policy_name='My_Storage_Policy', install_flags={"preferredIPFamily":2})

    **NOTE:** Either Unix or Windows clients_computers should be chosen and
    not both
    
Expand source code Browse git
def install_software(
        self,
        client_computers=None,
        windows_features=None,
        unix_features=None,
        username=None,
        password=None,
        install_path=None,
        log_file_loc=None,
        client_group_name=None,
        storage_policy_name=None,
        sw_cache_client=None,
        **kwargs):
    """
    Installs the features selected on the given machines
    Args:

        client_computers    (list)      -- list of hostnames/IP address to install the
        features on

            default : None

        windows_features (list of enum) -- list of windows features to be installed

            default : None

        unix_features (list of enum)    -- list of unix features to be installed

            default : None

        username    (str)               -- username of the machine to install features on

            default : None

        password    (str)               -- base64 encoded password

            default : None

        install_path (str)              -- Install to a specified path on the client

             default : None

        log_file_loc (str)              -- Install to a specified log path on the client

             default : None

        client_group_name (list)        -- List of client groups for the client

             default : None

        storage_policy_name (str)       -- Storage policy for the default subclient

             default : None

        sw_cache_client (str)           -- Remote Cache Client Name/ Over-riding Software Cache

            default : None (Use CS Cache by default)

        **kwargs: (dict) -- Key value pairs for supporting conditional initializations
        Supported -
        install_flags (dict) - dictionary of install flag values
        Ex : install_flags = {"preferredIPFamily":2, "install32Base":True}

        db2_logs_location (dict) - dictionary of db2 logs location
        Ex: db2_logs_location = {
                                "db2ArchivePath": "/opt/Archive/",
                                "db2RetrievePath": "/opt/Retrieve/",
                                "db2AuditErrorPath": "/opt/Audit/"
                        }
        index_cache_location (str) - Set index cache location for MA package
        Ex: index_cache_location = "/opt/IndexCache/"
        firewall_inputs (dict) - dictionary for firewall configuration
        Ex: firewall_inputs = {
                              "enableFirewallConfig": True,
                              "firewallConnectionType": 1,
                              "httpProxyConfigurationType": 0,
                              "proxyClientName": "Proxy_client_name",
                              "proxyHostName": "Proxy_host_name",
                              "portNumber": "port_number",
                              "encryptedTunnel": "encrypted_tunnel"
                        }

        firewall_inputs can take the following values

        Ex 1: Client can open connection to CS
         firewall_inputs = {
                              "enableFirewallConfig": True,
                              "firewallConnectionType": 0,
                              "proxyClientName": "",
                              "proxyHostName": "",
                              "portNumber": "port_number",
                              "httpProxyConfigurationType": 0,
                              "encryptedTunnel": True/False
                        }
        Ex 2: CS can open connection to Client
             firewall_inputs = {
                              "enableFirewallConfig": True,
                              "firewallConnectionType": 1,
                              "proxyClientName": "",
                              "proxyHostName": "",
                              "portNumber": "port_number",
                              "httpProxyConfigurationType": 0,
                              "encryptedTunnel": True/False
                        }

        Ex 3: Client can communicate to CS using Proxy
             firewall_inputs = {
                              "enableFirewallConfig": True,
                              "firewallConnectionType": 2,
                              "httpProxyConfigurationType": 0,
                              "proxyClientName": "Proxy_client_name",
                              "proxyHostName": "Proxy_host_name",
                              "portNumber": "port_number",
                              "encryptedTunnel": True/False
                        }
        webconsole_inputs (dict) - dictionary for webconsole configuration
        Ex: webconsole_inputs = {
                                    "webServerClientId": "webservername"
                                }


    Returns:
            object - instance of the Job class for this install_software job

    Raises:
        SDKException:
            if install job failed

            if response is empty

            if response is not success

    Usage:

        -   UnixDownloadFeatures and WindowsDownloadFeatures enum is used for providing
            input to the install_software method, it can be imported by

            >>> from cvpysdk.deployment.deploymentconstants import UnixDownloadFeatures
                from cvpysdk.deployment.deploymentconstants import WindowsDownloadFeatures

        -   sample method call

            >>> commcell_obj.install_software(
                            client_computers=[win_machine1, win_machine2],
                            windows_features=[WindowsDownloadFeatures.FILE_SYSTEM.value],
                            unix_features=None,
                            username='username',
                            password='password',
                            install_path='C:\\Temp,
                            log_file_loc='/var/log',
                            client_group_name=[My_Servers],
                            storage_policy_name='My_Storage_Policy',
                            install_flags={"preferredIPFamily":2})

                **NOTE:** Either Unix or Windows clients_computers should be chosen and
                not both

    """
    db2_install = False
    ma_install = False
    if windows_features:
        os_type = 0
        if WindowsDownloadFeatures.DB2_AGENT.value in windows_features:
            db2_install = True
        if WindowsDownloadFeatures.MEDIA_AGENT.value in windows_features:
            ma_install = True
        install_options = [{'osType': 'Windows', 'ComponentId': feature_id}
                           for feature_id in windows_features]

    elif unix_features:
        os_type = 1
        if UnixDownloadFeatures.DB2_AGENT.value in unix_features:
            db2_install = True
        if UnixDownloadFeatures.MEDIA_AGENT.value in unix_features:
            ma_install = True
        install_options = [{'osType': 'Unix', 'ComponentId': feature_id}
                           for feature_id in unix_features]

    else:
        raise SDKException('Install', '105')

    if client_computers:
        commcell_name = self.commcell_object.commserv_name

        client_details = []
        for client_name in client_computers:
            client_details.append(
                {
                    "clientEntity": {
                        "clientId": 0,
                        "clientName": client_name,
                        "commCellName": commcell_name
                    }
                })

    else:
        raise SDKException('Install', '106')

    if client_group_name:
        client_group_name = [x.lower() for x in client_group_name]
        if not set(client_group_name).issubset(self.commcell_object.client_groups.all_clientgroups):
            raise SDKException('Install', '103')
        selected_client_groups = [{'clientGroupName': client_group}
                                  for client_group in client_group_name]

    install_flags = kwargs.get('install_flags')
    db2_logs = kwargs.get('db2_logs_location', {})
    index_cache_location = kwargs.get('index_cache_location', None)
    firewall_inputs = kwargs.get('firewall_inputs', {})
    web_console_input = kwargs.get('webconsole_inputs', {})

    request_json = {
        "taskInfo": {
            "associations": [
                {
                    "commCellId": 2
                }
            ],
            "task": {
                "taskType": 1,
                "initiatedFrom": 1,
                "taskFlags": {
                    "disabled": False
                }
            },
            "subTasks": [
                {
                    "subTask": {
                        "subTaskType": 1,
                        "operationType": 4026
                    },
                    "options": {
                        "adminOpts": {
                            "clientInstallOption": {
                                "reuseADCredentials": False,
                                "installOSType": os_type,
                                "discoveryType": 0,
                                "installerOption": {
                                    "requestType": 0,
                                    "Operationtype": 0,
                                    "CommServeHostName":
                                        self.commcell_object.commserv_name,
                                    "RemoteClient": False,
                                    "installFlags": {
                                        "allowMultipleInstances": kwargs.get('allowMultipleInstances', False),
                                        "restoreOnlyAgents": False,
                                        "killBrowserProcesses": True,
                                        "install32Base": install_flags.get('install32Base',
                                                                           False) if install_flags else False,
                                        "disableOSFirewall": False,
                                        "stopOracleServices": False,
                                        "skipClientsOfCS": False,
                                        "addToFirewallExclusion": True,
                                        "ignoreJobsRunning": False,
                                        "forceReboot": False,
                                        "overrideClientInfo": True,
                                        "preferredIPFamily": install_flags.get('preferredIPFamily',
                                                                               1) if install_flags else 1,
                                        "firewallInstall": {
                                            "enableFirewallConfig": False,
                                            "firewallConnectionType": 0,
                                            "portNumber": 0
                                        }
                                    },
                                    "User": {
                                        "userName": "admin",
                                        "userId": 1
                                    },
                                    "clientComposition": [
                                        {
                                            "activateClient": True,
                                            "overrideSoftwareCache": True if sw_cache_client else False,
                                            "softwareCacheOrSrmProxyClient": {
                                                "clientName": sw_cache_client if sw_cache_client else ""
                                            },
                                            "packageDeliveryOption": 0,
                                            "components": {
                                                "commonInfo": {
                                                    "globalFilters": 2,
                                                    "storagePolicyToUse": {
                                                        "storagePolicyName": storage_policy_name if storage_policy_name else ""
                                                    }
                                                },
                                                "fileSystem": {
                                                    "configureForLaptopBackups": False
                                                },
                                                "componentInfo": install_options,
                                                "webConsole": web_console_input
                                            },
                                            "clientInfo": {
                                                "clientGroups": selected_client_groups if client_group_name else [],
                                                "client": {
                                                    "evmgrcPort": 0,
                                                    "cvdPort": 0,
                                                    "installDirectory": install_path if install_path else ""
                                                },
                                                "clientProps": {
                                                    "logFilesLocation": log_file_loc if log_file_loc else ""
                                                }
                                            }
                                        }
                                    ]
                                },
                                "clientDetails": client_details,
                                "clientAuthForJob": {
                                    "password": password,
                                    "userName": username
                                }
                            },
                            "updateOption": {
                                "rebootClient": True
                            }
                        }
                    }
                }
            ]
        }
    }

    if db2_install and db2_logs:
        request_json["taskInfo"]["subTasks"][0]["options"]["adminOpts"]["clientInstallOption"]["installerOption"][
            "clientComposition"][0]["components"]["db2"] = db2_logs

    if ma_install and index_cache_location:
        index_cache_dict = {
            "indexCacheDirectory": {
                "path": index_cache_location
            }
        }
        request_json["taskInfo"]["subTasks"][0]["options"]["adminOpts"]["clientInstallOption"]["installerOption"][
            "clientComposition"][0]["components"]["mediaAgent"] = index_cache_dict

    if firewall_inputs:
        request_json["taskInfo"]["subTasks"][0]["options"]["adminOpts"]["clientInstallOption"]["installerOption"][
            "installFlags"]["firewallInstall"] = firewall_inputs


    flag, response = self._cvpysdk_object.make_request(
        'POST', self._services['CREATE_TASK'], request_json
    )

    if flag:
        if response.json():
            if "jobIds" in response.json():
                return Job(self.commcell_object, response.json()['jobIds'][0])

            else:
                raise SDKException('Install', '107')

        else:
            raise SDKException('Response', '102')
    else:
        raise SDKException('Response', '101')
def push_servicepack_and_hotfix(self, client_computers=None, client_computer_groups=None, all_client_computers=False, all_client_computer_groups=False, reboot_client=False, run_db_maintenance=True, maintenance_release_only=False, **kwargs)

Installs the software packages on the clients

Args

client_computers (list) – Client machines to install service pack on

client_computer_groups (list) – Client groups to install service pack on

all_client_computers (bool) – boolean to specify whether to install on all client computers or not

default: False

all_client _computer_groups (bool) – boolean to specify whether to install on all client computer groups or not

default: False

reboot_client (bool) – boolean to specify whether to reboot the client or not

default: False

run_db_maintenance (bool) – boolean to specify whether to run db maintenance not

default: True

maintenance_release_only (bool) – for clients of feature releases lesser than CS, this option maintenance release of that client FR, if present in cache

**kwargs
(dict) – Key value pairs for supporting conditional initializations Supported - schedule_pattern (dict) – Request JSON for scheduling the operation

Returns

object - instance of the Job/Task class for this download

Raises

SDKException: if schedule is not of type dictionary

if Download job failed

if response is empty

if response is not success

if another download job is already running

NOTE: push_serivcepack_and_hotfixes cannot be used for revision upgrades

Expand source code Browse git
def push_servicepack_and_hotfix(
        self,
        client_computers=None,
        client_computer_groups=None,
        all_client_computers=False,
        all_client_computer_groups=False,
        reboot_client=False,
        run_db_maintenance=True,
        maintenance_release_only=False,
        **kwargs):
    """Installs the software packages on the clients

    Args:
        client_computers (list)               -- Client machines to install service pack on

        client_computer_groups (list)         -- Client groups to install service pack on

        all_client_computers (bool)           -- boolean to specify whether to install on
        all client computers or not

            default: False

        all_client _computer_groups (bool)    -- boolean to specify whether to install on all
        client computer groups or not

            default: False

        reboot_client (bool)                  -- boolean to specify whether to reboot the
        client or not

            default: False

        run_db_maintenance (bool)             -- boolean to specify whether to run db
        maintenance not

            default: True

        maintenance_release_only (bool)       -- for clients of feature releases lesser than CS, this option
        maintenance release of that client FR, if present in cache

        **kwargs: (dict) -- Key value pairs for supporting conditional initializations
            Supported -
            schedule_pattern (dict)           -- Request JSON for scheduling the operation

    Returns:
        object - instance of the Job/Task class for this download

    Raises:
            SDKException:
                if schedule is not of type dictionary

                if Download job failed

                if response is empty

                if response is not success

                if another download job is already running

    **NOTE:** push_serivcepack_and_hotfixes cannot be used for revision upgrades

    """
    selected_clients = []
    selected_client_groups = []
    schedule_pattern = kwargs.get('schedule_pattern', None)
    if schedule_pattern:
        if not isinstance(schedule_pattern, dict):
            raise SDKException("Install", "101")
    if not any([all_client_computers,
                all_client_computer_groups,
                client_computers,
                client_computer_groups]):
        raise SDKException('Install', '101')

    commcell_client_computers = self.commcell_object.clients.all_clients
    commcell_client_computer_groups = self.commcell_object.client_groups.all_clientgroups

    if client_computers is not None:
        client_computers = [x.lower() for x in client_computers]
        if not set(client_computers).issubset(commcell_client_computers):
            raise SDKException('Install', '102')

        selected_clients = [{'clientName': client} for client in client_computers]

    if client_computer_groups is not None:
        client_computer_groups = [x.lower() for x in client_computer_groups]
        if not set(client_computer_groups).issubset(commcell_client_computer_groups):
            raise SDKException('Install', '103')

        selected_client_groups = [{'clientGroupName': client}
                                  for client in client_computer_groups]

    if all_client_computers:
        selected_clients = [{"_type_": 2}]

    if all_client_computer_groups:
        selected_client_groups = [{"_type_": 27}]

    all_clients = selected_clients + selected_client_groups

    request_json = {
        "taskInfo": {
            "task": {
                "taskType": 1,
                "initiatedFrom": 2,
                "policyType": 0,
                "alert": {
                    "alertName": ""
                },
                "taskFlags": {
                    "isEdgeDrive": False,
                    "disabled": False
                }
            },
            "subTasks": [
                {
                    "subTaskOperation": 1,
                    "subTask": {
                        "subTaskType": 1,
                        "operationType": 4020
                    },
                    "options": {
                        "adminOpts": {
                            "updateOption": {
                                "removeIntersectingDiag": True,
                                "restartExplorerPlugin": True,
                                "rebootClient": reboot_client,
                                "runDBMaintenance": run_db_maintenance,
                                "maintenanceReleaseOnly": maintenance_release_only,
                                "clientAndClientGroups": all_clients,
                                "installUpdatesJobType": {
                                    "upgradeClients": False,
                                    "undoUpdates": False,
                                    "installUpdates": True
                                }
                            }
                        },
                    }
                }
            ]
        }
    }

    if schedule_pattern:
        request_json = SchedulePattern().create_schedule(request_json, schedule_pattern)

    flag, response = self._cvpysdk_object.make_request(
        'POST', self._services['CREATE_TASK'], request_json
    )

    if flag:
        if response.json():
            if "jobIds" in response.json():
                return Job(self.commcell_object, response.json()['jobIds'][0])

            elif schedule_pattern and "taskId" in response.json():
                return Schedules(self.commcell_object).get(task_id=response.json()['taskId'])

            else:
                raise SDKException('Install', '107')

        else:
            raise SDKException('Response', '102')
    else:
        raise SDKException('Response', '101')
def repair_software(self, client=None, client_group=None, username=None, password=None, reboot_client=False)

triggers Repair of the software for a specified client machine

    Args:
        client (str)               -- Client machine to re-install service pack on

        client_group (str)         -- Client group to re-install service pack on
                                                (eg : 'Media Agent')

        username    (str)               -- username of the machine to re-install features on

            default : None

        password    (str)               -- base64 encoded password

            default : None

        reboot_client (bool)            -- boolean to specify whether to reboot the client
        or not

            default: False

    Returns:
        object - instance of the Job class for this download job

    Raises:
            SDKException:
            if re-install job failed

            if response is empty

            if response is not success

NOTE: repair_software can be used for client/ client_group not both; When both inputs are given only the client computer will be repaired

NOTE: If machine requires reboot and reboot is not selected, machine won't be updated

NOTE: If machine requires login credentials and if not provided - client reinstallation might fail.

Expand source code Browse git
def repair_software(self,
                    client=None,
                    client_group=None,
                    username=None,
                    password=None,
                    reboot_client=False):
    """triggers Repair of the software for a specified client machine

            Args:
                client (str)               -- Client machine to re-install service pack on

                client_group (str)         -- Client group to re-install service pack on
                                                        (eg : 'Media Agent')

                username    (str)               -- username of the machine to re-install features on

                    default : None

                password    (str)               -- base64 encoded password

                    default : None

                reboot_client (bool)            -- boolean to specify whether to reboot the client
                or not

                    default: False

            Returns:
                object - instance of the Job class for this download job

            Raises:
                    SDKException:
                    if re-install job failed

                    if response is empty

                    if response is not success

    **NOTE:** repair_software can be used for client/ client_group not both; When both inputs are given only the
              client computer will be repaired

    **NOTE:** If machine requires reboot and reboot is not selected, machine won't be updated

    **NOTE:** If machine requires login credentials and if not provided - client reinstallation might fail.

    """
    if (client is None) and (client_group is None):
        raise SDKException('Install', '100')

    if client:
        client_group = ""
        if not client in self.commcell_object.clients.all_clients:
            raise SDKException('Install', '101')

    elif client_group:
        client = ""
        if not client_group in self.commcell_object.client_groups.all_clientgroups:
            raise SDKException('Install', '102')

    request_json = {
        "taskInfo": {
            "task": {
                "taskType": 1,
                "initiatedFrom": 2,
                "policyType": 0,
                "taskFlags": {
                    "disabled": False
                }
            },
            "subTasks": [
                {
                    "subTaskOperation": 1,
                    "subTask": {
                        "subTaskType": 1,
                        "operationType": 4020
                    },
                    "options": {
                        "adminOpts": {
                            "clientInstallOption": {
                                "installerOption": {
                                    "clientComposition": [
                                        {
                                            "packageDeliveryOption": 0
                                        }
                                    ]
                                }
                            },
                            "updateOption": {
                                "installUpdateOptions": 0,
                                "restartExplorerPlugin": True,
                                "rebootClient": reboot_client,
                                "clientAndClientGroups": [
                                    {
                                        "clientGroupName": client_group,
                                        "clientName": client
                                    }
                                ],
                                "installUpdatesJobType": {
                                    "installType": 4,
                                    "upgradeClients": False,
                                    "undoUpdates": False,
                                    "installUpdates": False
                                }
                            }
                        }
                    }
                }
            ]
        }
    }

    if username:
        request_json["taskInfo"]["subTasks"][0]["options"]["adminOpts"]["clientInstallOption"]["clientAuthForJob"] \
            = {
            "password": password,
            "userName": username
        }

    flag, response = self._cvpysdk_object.make_request(
        'POST', self._services['CREATE_TASK'], request_json
    )

    if flag:
        if response.json():
            if "jobIds" in response.json():
                return Job(self.commcell_object, response.json()['jobIds'][0])

            else:
                raise SDKException('Install', '107')

        else:
            raise SDKException('Response', '102')
    else:
        raise SDKException('Response', '101')