Module cvpysdk.policies.schedule_policies

Main file for performing schedule policy related operations on the commcell.

This file has all the classes related to Schedule Policy operations.

SchedulePolicies: Class for representing all the Schedule Policies associated to the commcell.

SchedulePolicy: Class for representing Schedule Policy

Schedulepolicies

init(commcell_object) – initialize the SchedulePolicies instance for the commcell

str() – returns all the schedule policies associated with the commcell

repr() – returns a string for instance of the SchedulePolicies class

_get_policies() – gets all the schedule policies of the commcell

all_schedule_policies() – returns the dict of all the schedule policies on commcell

has_policy(policy_name) – checks if a schedule policy exists with the given name

subtasks_json() – gets the subtask in schedule policy JSON

schedule_json() – forms the schedule policy subtask with patterns and options for a schedule

add() – Adds a schedule policy

get() – Returns a schedule policy object of the specified schedule policy name

delete() – deletes the specified schedule policy name

refresh() – refresh the schedule policies associated with the commcell

_process_schedule_policy_response – processes the response received schedule policy creation request

Schedulepolicy

init(commcell_object) – Initialise the Schedule Policy class instance

_get_schedule_policy_id – Gets a schedule policy ID

policy_type – Gets the policy type of the schedule policy

_get_schedule_policy_properties – Gets the properties of this Schedule Policy

update_associations – Updates the schedule policy associations

all_schedules – returns all the schedules associated to the schedule policy

_update_pattern – Updates the schedule pattern for the provided schedule id

get_option – gets the schedule options for the provided option

_update_option – Updates the option for the provided schedule id

get_schedule – returns the subtask dict for the provided schedule id or name

add_schedule – Adds a new schedule to the schedule policy

modify_schedule – Modifies the schedule with the given schedule json inputs for the given schedule id or name

delete_schedule – Deletes the schedule from the schedule policy

update_app_groups – Update the appgroups for the provided schedule policy

_modify_schedule_policy_properties – Modifies the task properties of the schedule policy

_process_schedule_policy_update_response – processes the response received post update request

refresh – Refresh the properties of the Schedule Policy

enable – Enables a schedule policy

disable – Disables a schedule policy

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 schedule policy related operations on the commcell.

This file has all the classes related to Schedule Policy operations.

SchedulePolicies: Class for representing all the Schedule Policies associated to the commcell.

SchedulePolicy: Class for representing Schedule Policy

SchedulePolicies:
    __init__(commcell_object)    --  initialize the SchedulePolicies instance for the commcell

    __str__()                    --  returns all the schedule policies associated with the commcell

    __repr__()                   --  returns a string for instance of the SchedulePolicies class

    _get_policies()              --  gets all the schedule policies of the commcell

    all_schedule_policies()      --  returns the dict of all the schedule policies on commcell

    has_policy(policy_name)      --  checks if a schedule policy exists with the given name

    subtasks_json()              --  gets the subtask in schedule policy JSON

    schedule_json()              --  forms the schedule policy subtask with patterns and options for a schedule

    add()                        --  Adds a schedule policy

    get()                        --  Returns a schedule policy object of the specified schedule policy name

    delete()                     --  deletes the specified schedule policy name

    refresh()                    --  refresh the schedule policies associated with the commcell

    _process_schedule_policy_response -- processes the response received schedule policy creation request

SchedulePolicy:

     __init__(commcell_object)      --  Initialise the Schedule Policy class instance

     _get_schedule_policy_id        --   Gets a schedule policy ID

    policy_type                     --   Gets the policy type of the schedule policy

    _get_schedule_policy_properties -- Gets the properties of this Schedule Policy

    update_associations             --  Updates the schedule policy associations

    all_schedules                   -- returns all the schedules associated to the schedule policy

    _update_pattern                 -- Updates the schedule pattern for the provided schedule id

    get_option                      -- gets the schedule options for the provided option

    _update_option                  -- Updates the option for the provided schedule id

    get_schedule                    -- returns the subtask dict for the provided schedule id or name

    add_schedule                    -- Adds a new schedule to the schedule policy

    modify_schedule                 -- Modifies the schedule with the given schedule json inputs for the given schedule
                                       id or name

    delete_schedule                 -- Deletes the schedule from the schedule policy

    update_app_groups               -- Update the appgroups for the provided schedule policy

    _modify_schedule_policy_properties -- Modifies the task properties of the schedule policy

    _process_schedule_policy_update_response -- processes the response received post update request

    refresh                         -- Refresh the properties of the Schedule Policy

    enable                          -- Enables a schedule policy

    disable                         -- Disables a schedule policy



"""

from __future__ import absolute_import
from __future__ import unicode_literals

from ..exception import SDKException
from .schedule_options import ScheduleOptions
from ..schedules import SchedulePattern

class OperationType:
    """Operation Type for schedule policy associations and appGroups"""
    INCLUDE = 'include'
    EXCLUDE = 'exclude',
    DELETE = 'deleted'

class SchedulePolicies:
    """Class for getting all the schedule policies associated with the commcell."""

    policy_to_subtask_map = {

        'Data Protection': [2, 2], #[subtaskType, OperationType]
        'Auxiliary Copy': [1, 4003]
    }

    policy_types = {
        "Data Protection": 0,
        "Auxiliary Copy": 1,
        "Primary Storage Reports": 2,
        "Backup Copy": 3,
        "SRM Data Collection": 4,
        "Subclient Filter for BackupJob Report": 5,
        "Offline Content Indexing": 6,
        "Install Updates": 7,
        "Network Throttle": 8,
    }

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

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

            Returns:
                object - instance of the SchedulePolicies class
        """
        self._commcell_object = commcell_object
        self._POLICY = self._commcell_object._services['SCHEDULE_POLICY']
        self._CREATE_POLICY = self._commcell_object._services['CREATE_UPDATE_SCHEDULE_POLICY']
        self._policies = None
        self.refresh()

    def __str__(self):
        """Representation string consisting of all schedule policies of the commcell.

            Returns:
                str - string of all the schedule policies associated with the commcell
        """
        representation_string = '{:^5}\t{:^20}\n\n'.format('S. No.', 'Schedule Policy')

        for index, policy in enumerate(self._policies):
            sub_str = '{:^5}\t{:20}\n'.format(index + 1, policy)
            representation_string += sub_str

        return representation_string.strip()

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

    def _get_policies(self):
        """Gets all the schedule policies associated to the commcell specified by commcell object.

            Returns:
                dict - consists of all schedule policies of the commcell
                    {
                         "schedule_policy1_name": schedule_policy1_id,
                         "schedule_policy2_name": schedule_policy2_id
                    }

            Raises:
                SDKException:
                    if response is empty

                    if response is not success
        """
        flag, response = self._commcell_object._cvpysdk_object.make_request('GET', self._POLICY)

        if flag:
            if response and response.json():
                if response.json() and 'taskDetail' in response.json():
                    policies = response.json()['taskDetail']
                    policies_dict = {}

                    for policy in policies:
                        temp_name = policy['task']['taskName'].lower()
                        temp_id = str(policy['task']['taskId']).lower()
                        policies_dict[temp_name] = temp_id

                    return policies_dict
                else:
                    raise SDKException('Response', '102')
            else:
                return {}
        else:
            response_string = self._commcell_object._update_response_(response.text)
            raise SDKException('Response', '101', response_string)

    @property
    def all_schedule_policies(self):
        """Returns the schedule policies on this commcell

            dict - consists of all schedule policies of the commcell
                    {
                         "schedule_policy1_name": schedule_policy1_id,
                         "schedule_policy2_name": schedule_policy2_id
                    }
        """
        return self._policies

    def has_policy(self, policy_name):
        """Checks if a schedule policy exists in the commcell with the input schedule policy name.

            Args:
                policy_name (str)  --  name of the schedule policy

            Returns:
                bool - boolean output whether the schedule policy exists in the commcell or not

            Raises:
                SDKException:
                    if type of the schedule policy name argument is not string
        """
        if not isinstance(policy_name, str):
            raise SDKException('Storage', '101')

        return self._policies and policy_name.lower() in self._policies

    @staticmethod
    def subtasks_json(policy_type):
        """
        gets the subtask in schedule policy JSON
        Args:
            policy_type (str) -- Type of the schedule policy from 'policy_types' dict

        Returns:
            returns schedule policy Subtask
        """

        _backup_subtask = {
            "subTaskType": SchedulePolicies.policy_to_subtask_map[policy_type][0],
            "operationType": SchedulePolicies.policy_to_subtask_map[policy_type][1]
        }

        return _backup_subtask

    @staticmethod
    def schedule_json(policy_type, schedule_dict):
        """
            Returns the schedule json for the given schedule options and pattern

        Args:
            policy_type (str) -- Type of the schedule policy from 'policy_types' dict
            schedule_dict (dict) -- with the below format, check add() module for more documentation on the below dict

                                            {
                                                pattern : {},
                                                options: {}
                                            }

        Returns:
            Returns the schedule json for the given schedule options and pattern

        """
        schedule_options = ScheduleOptions(ScheduleOptions.policy_to_options_map[policy_type]
                                           ).options_json(schedule_dict.get('options', None))
        sub_task = SchedulePolicies.subtasks_json(policy_type)
        sub_task['subTaskName'] = schedule_dict.get('name', '')
        sub_task = {
            "subTaskOperation": 1,
            "subTask": sub_task,
            "options": schedule_options
        }

        freq_type = schedule_dict.get('pattern', {}).get('freq_type', 'daily')

        try:
            schedule_dict["pattern"]["freq_type"] = freq_type
        except KeyError:
            schedule_dict["pattern"] = {"freq_type": freq_type}

        task_json = SchedulePattern().create_schedule({'taskInfo':
                                                           {'subTasks': [sub_task]
                                                            }
                                                       }, schedule_dict.get('pattern'))
        return task_json.get('taskInfo').get('subTasks')[0]


    def add(self, name, policy_type, associations, schedules, agent_type=None):
        """

        Adds a schedule policy

        Args:
            name (str) -- Name of the Schedule Policy
            policy_type (str) -- Type of the schedule policy from 'policy_types' dict
            associations (str) -- List of schedule associations
            [
            {
                "clientName": "scheduleclient1"
            },
            {
                "clientGroupName": "scheduleclient2"
            }
            ]

            schedules (List) -- schedules to be associated to the schedule policy

            [
                {
                    pattern : {}, -- Please refer SchedulePattern.create_schedule in schedules.py for the types of
                                     pattern to be sent

                                     eg: {
                                            "freq_type": 'daily',
                                            "active_start_time": time_in_%H/%S (str),
                                            "repeat_days": days_to_repeat (int)
                                         }

                    options: {} -- Please refer ScheduleOptions.py classes for respective schedule options

                                    eg:  {
                                        "maxNumberOfStreams": 0,
                                        "useMaximumStreams": True,
                                        "useScallableResourceManagement": True,
                                        "totalJobsToProcess": 1000,
                                        "allCopies": True,
                                        "mediaAgent": {
                                            "mediaAgentName": "<ANY MEDIAAGENT>"
                                        }
                                    }
                }
            ]



            agent_type (List) -- Agent Types to be associated to the schedule policy

                      eg:    [
                                {
                                    "appGroupName": "Protected Files"
                                },
                                {
                                    "appGroupName": "Archived Files"
                                }
                            ]

        sample:

                    apptype = [{'appGroupName': 'DB2'}]
                    associations = [{'clientName': 'testclient'}]
                    schedule = [
                        {
                            'name': 'trying',
                            'pattern': {
                                            'freq_type': 'Daily'
                                        }
                        }
                    ]
                    commcellobj.schedule_policies.add('testsch1', 'Data Protection', associations, schedule, apptype)

        Returns: schedule policy object on successful completion

        Raises:

            SDKExceptions on wrong input types and failure to create schedule policy

        """

        if not isinstance(schedules, list):
            raise SDKException('Schedules', '102', 'schedules should be a list')

        sub_tasks = []
        for schedule in schedules:
            sub_tasks.append(self.schedule_json(policy_type, schedule))


        schedule_policy = {
            "taskInfo":
                {
                    "associations": associations,
                    "task":
                        {
                            "description": "", "taskType": 4, "initiatedFrom": 2,
                            "policyType": self.policy_types[policy_type],
                            "taskName": name,
                            "securityAssociations": {},
                            "taskSecurity": {},
                            "alert": {"alertName": ""},
                            "taskFlags": {"isEdgeDrive": False, "disabled": False}
                        },
                    "appGroup":
                        {
                            "appGroups": agent_type if agent_type else [],
                        },
                    "subTasks": sub_tasks

                }
        }
        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'POST', self._CREATE_POLICY, schedule_policy
        )
        output = self._process_schedule_policy_response(flag, response)
        self.refresh()

        if output[0]:
            return self.get(name)

        o_str = 'Failed to update properties of Schedule\nError: "{0}"'
        raise SDKException('Schedules', '102', o_str.format(output[2]))

    def get(self, schedule_policy_name, schedule_policy_id=None):
        """Returns a schedule policy object of the specified schedule policy name.

            Args:
                schedule_policy_name (str)  --  name of the Schedule Policy
                schedule_policy_id (int) -- id of the schedule Policy

            Sample: sch_pol_obj = commcellobj.schedule_policies.get('testschp')

            Returns:
                object - instance of the schedule policy class for the given schedule name

            Raises:
                SDKException:
                    if type of the schedule policy name argument is not string

                    if no schedule policy exists with the given name
        """

        if schedule_policy_name and not isinstance(schedule_policy_name, str):
            raise SDKException('Schedules', '102')

        if schedule_policy_id and not isinstance(schedule_policy_id, int):
            raise SDKException('Schedules', '102')

        schedule_policy_name = schedule_policy_name.lower()
        schedule_policy_id = self.all_schedule_policies.get(schedule_policy_name)
        if self.has_policy(schedule_policy_name):
            return SchedulePolicy(
                self._commcell_object, schedule_policy_name, schedule_policy_id
            )

        raise SDKException(
            'Schedules',
            '102',
            'No Schedule Policy exists with name: {0}'.format(schedule_policy_name))

    def delete(self, schedule_policy_name):
        """deletes the specified schedule policy name.

                    Args:
                        schedule_policy_name (str)  --  name of the Schedule Policy

                    Sample:  commcellobj.schedule_policies.delete('testschp')

                    Raises:
                        SDKException:
                            if type of the schedule policy name argument is not string
                            if no schedule policy exists with the given name
        """

        if schedule_policy_name and not isinstance(schedule_policy_name, str):
            raise SDKException('Schedules', '102')

        schedule_policy_name = schedule_policy_name.lower()
        schedule_policy_id = self.all_schedule_policies.get(schedule_policy_name)

        if schedule_policy_id:
            request_json = {
                "TMMsg_TaskOperationReq":
                    {
                        "opType": 3,
                        "taskEntities":
                            [
                                {
                                    "_type_": 69,
                                    "taskId": schedule_policy_id
                                }
                            ]
                    }
            }

            modify_schedule = self._commcell_object._services['EXECUTE_QCOMMAND']

            flag, response = self._commcell_object._cvpysdk_object.make_request(
                'POST', modify_schedule, request_json)

            if flag:
                if response.json():
                    if 'errorCode' in response.json():
                        if response.json()['errorCode'] == 0:
                            self.refresh()
                        else:
                            raise SDKException(
                                'Schedules', '102', response.json()['errorMessage'])
                else:
                    raise SDKException('Response', '102')
            else:
                response_string = self._commcell_object._update_response_(
                    response.text)
                exception_message = 'Failed to delete schedule policy\nError: "{0}"'.format(
                    response_string)

                raise SDKException('Schedules', '102', exception_message)
        else:
            raise SDKException(
                'Schedules', '102', 'No schedule policy exists for: {0}'.format(
                    schedule_policy_id)
            )

    def refresh(self):
        """Refresh the Schedule Policies associated with the Commcell."""
        self._policies = self._get_policies()

    def _process_schedule_policy_response(self, flag, response):
        """
        processes the response received post create request
        Args:
        flag: (bool) -- True or false based on response
        response: (dict) response from modify request
        Returns:
            flag: (Bool) -- based on success and failure
            error_code: (int) -- error_code from response
            error_message: (str) -- error_message from the response if any
        """

        if flag:
            if response.json():
                if "taskId" in response.json():
                    task_id = str(response.json()["taskId"])

                    if task_id:
                        return True, "0", ""

                elif "errorCode" in response.json():
                    error_code = str(response.json()['errorCode'])
                    error_message = response.json()['errorMessage']

                    if error_code == "0":
                        return True, "0", ""

                    if error_message:
                        return False, error_code, error_message
                    else:
                        return False, error_code, ""
                else:
                    raise SDKException('Response', '102')
            else:
                raise SDKException('Response', '102')
        else:
            response_string = self._commcell_object._update_response_(
                response.text)
            raise SDKException('Response', '101', response_string)

class SchedulePolicy:
    """Class for performing operations for a specific Schedule."""

    def __init__(self, commcell_obj, schedule_policy_name, schedule_policy_id=None):

        """Initialise the Schedule Policy class instance.

            Args:
                class_object (object)     --  instance of Class Object

                schedule_policy_name      (str)     --  name of the Schedule

                schedule_policy_id        (int)     --   task ids of the Schedule



            Returns:
                object - instance of the Schedule Policy class
        """

        self._commcell_object = commcell_obj

        self.schedule_policy_name = schedule_policy_name

        if schedule_policy_id:
            self.schedule_policy_id = schedule_policy_id
        else:
            self.schedule_policy_id = self._get_schedule_policy_id()


        self._SCHEDULE_POLICY = self._commcell_object._services['GET_SCHEDULE_POLICY'] % (
            self.schedule_policy_id)
        self._MODIFY_SCHEDULE_POLICY = self._commcell_object._services['CREATE_UPDATE_SCHEDULE_POLICY']

        self._associations = []
        self._subtasks = []
        self._app_groups = []
        self._task_json = {}
        self._task_name = None
        self._all_schedules = []
        self.refresh()

    def _get_schedule_policy_id(self):
        """
        Gets a schedule ID of the schedule policy
        Returns (int) -- schedule policy ID
        """
        schedule_policies = SchedulePolicies(self._commcell_object)
        return schedule_policies.get(self.schedule_policy_name).schedule_policy_id

    @property
    def policy_type(self):
        """
        Get the policy Type of the schedule policy

        Sample:  sch_pol_obj.policy_type

        Returns (str) -- Type of the schedule policy from 'policy_types' dict

        """
        return (
                list(
                SchedulePolicies.policy_types.keys())[
                list(
                    SchedulePolicies.policy_types.values()).index(self._task_json['policyType'])])


    def _get_schedule_policy_properties(self):
        """Gets the properties of this Schedule Policy.

            Returns:
                dict - dictionary consisting of the properties of this Schedule Policy

            Raises:
                SDKException:
                    if response is empty

                    if response is not success
        """
        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'GET', self._SCHEDULE_POLICY)

        if flag:
            if response.json() and 'taskInfo' in response.json():
                _task_info = response.json()['taskInfo']

                if 'associations' in _task_info:
                    self._associations = _task_info['associations']

                if 'task' in _task_info:
                    self._task_json = _task_info['task']

                self._app_groups = _task_info['appGroup'].get('appGroups')

                self._subtasks = _task_info['subTasks']

                for subtask in self._subtasks:
                    self._all_schedules.append({
                                                "schedule_name" : subtask["subTask"].get("subTaskName", ''),
                                                "schedule_id": subtask["subTask"]["subTaskId"]
                                                })


            else:
                raise SDKException('Response', '102')
        else:
            response_string = self._commcell_object._update_response_(
                response.text)
            raise SDKException('Response', '101', response_string)

    def update_associations(self, associations, operation_type):
        """
        Updates the schedule policy associations
        Args:
            associations (str) -- List of schedule associations
            [
            {
                "clientName": "scheduleclient1"
            },
            {
                "clientGroupName": "scheduleclient2"
            }
            ]
            operation_type (OperationType) -- Please check OperationType class present in this file

        Sample:
            associations = [{'clientName': 'client2'}]
            sch_pol_obj.update_associations(associations, OperationType.DELETE)

        """

        for app_group in associations:
            app_group["flags"] = {
                                    operation_type: True
                                 }
        self._associations = associations
        self._modify_schedule_policy_properties()

    @property
    def all_schedules(self):
        """
        Gets all the schedules of the schedule policy

        Sample:  sch_pol_obj.all_schedules

        Returns (dict) -- schedules in the below format

            {
                    "schedule_name" : (str),
                    "schedule_id": (int)
            }

        """
        return self._all_schedules


    def _update_pattern(self, schedule_id, pattern_dict):

        """

        Updates the schedule pattern for the provided schedule id (internal function)

        Args:
            schedule_id (int) -- id of the schedule
            pattern_dict (dict) -- Please refer SchedulePattern.create_schedule in schedules.py for the types of
                                     pattern to be sent

                                     eg: {
                                            "freq_type": 'daily',
                                            "active_start_time": time_in_%H/%S (str),
                                            "repeat_days": days_to_repeat (int)
                                         }


        """

        existing_pattern = {}

        for subtask in self._subtasks:
            if subtask["subTask"]["subTaskId"] == schedule_id:

                if 'pattern' in subtask:
                    existing_pattern = subtask['pattern']

                if 'options' in subtask:
                    _options = subtask['options']
                    if 'commonOpts' in _options:
                        if 'automaticSchedulePattern' in _options["commonOpts"]:
                            existing_pattern = _options[
                                "commonOpts"]['automaticSchedulePattern']

                    if 'backupOpts' in _options:
                        if 'dataOpt' in _options['backupOpts']:
                            if isinstance(existing_pattern, dict):
                                _data_opt = _options['backupOpts']['dataOpt']
                                existing_pattern.update(_data_opt)
                break


        task_json = SchedulePattern(existing_pattern).create_schedule({'taskInfo':
                                                                           {'subTasks': self._subtasks
                                                                            }
                                                                       }, pattern_dict, schedule_id)

        self._subtasks = task_json.get('taskInfo').get('subTasks')

    @staticmethod
    def get_option(option_dict, option):
        """
        gets the schedule options for the provided option
        Args:
            option_dict: the complete options dict
            option: option for which the dict has to be fetched

        Returns (dict) -- Option dict for the provided option

        """
        if isinstance(option_dict, dict) and option in option_dict:
            return option_dict[option]
        elif not isinstance(option_dict, dict):
            return None
        else:
            for value in option_dict.values():
                result = SchedulePolicy.get_option(value, option)
                if result is not None:
                    return result

    def _update_option(self, schedule_id, options):
        """
        Updates the option for the provided schedule id (internal)

        Args:
             schedule_id (int) -- id of the schedule
            options (dict) -- Please refer ScheduleOptions.py classes for respective schedule options

                                    eg:  {
                                        "maxNumberOfStreams": 0,
                                        "useMaximumStreams": True,
                                        "useScallableResourceManagement": True,
                                        "totalJobsToProcess": 1000,
                                        "allCopies": True,
                                        "mediaAgent": {
                                            "mediaAgentName": "<ANY MEDIAAGENT>"
                                        }
                                    }

        """

        option_allowed = ScheduleOptions.policy_to_options_map[self.policy_type]
        for subtask in self._subtasks:
            if subtask["subTask"]["subTaskId"] == schedule_id:
                if 'options' in subtask:
                    existing_options = self.get_option(subtask['options'], option_allowed)
                    if not existing_options:
                        raise SDKException('Schedules', '104')

                    subtask['options'] = ScheduleOptions(option_allowed, existing_options).options_json(options)
                    self._subtasks[self._subtasks.index(subtask)] = subtask
                    break

    def get_schedule(self, schedule_id=None, schedule_name=None):
        """
        returns the subtask dict for the provided schedule id or name
        Args:
            schedule_id (int) -- id of the schedule
            schedule_name (str) -- name of the schedule

        Sample:  sch_pol_obj.get_schedule(schedule_id=10)

        Returns (dict) -- subtask dict

        """
        if not schedule_name and not schedule_id:
            raise SDKException(
                'Schedules',
                '102',
                'Either Schedule Name or Schedule Id is needed')

        if schedule_name and not isinstance(schedule_name, str):
            raise SDKException('Schedules', '102')

        if schedule_id and not isinstance(schedule_id, int):
            raise SDKException('Schedules', '102')

        if schedule_name:
            search_dict = ("subTaskName", schedule_name)
        else:
            search_dict = ("subTaskId", schedule_id)

        for sub_task in self._subtasks:
            if search_dict in sub_task["subTask"].items():
                return sub_task

    def add_schedule(self, schedule_dict):
        """
        Adds a new schedule to the schedule policy
        Args:
            schedule_dict (dict) -- {
                    pattern : {}, -- Please refer SchedulePattern.create_schedule in schedules.py for the types of
                                     pattern to be sent

                                     eg: {
                                            "freq_type": 'daily',
                                            "active_start_time": time_in_%H/%S (str),
                                            "repeat_days": days_to_repeat (int)
                                         }

                    options: {} -- Please refer ScheduleOptions.py classes for respective schedule options

                                    eg:  {
                                        "maxNumberOfStreams": 0,
                                        "useMaximumStreams": True,
                                        "useScallableResourceManagement": True,
                                        "totalJobsToProcess": 1000,
                                        "allCopies": True,
                                        "mediaAgent": {
                                            "mediaAgentName": "<ANY MEDIAAGENT>"
                                        }
                                    }
                }

        Sample:

                sch_pol_obj.add_schedule({'pattern':{'freq_type': 'monthly'}})

        """
        sub_task = SchedulePolicies.schedule_json(self.policy_type, schedule_dict)
        sub_task["subTaskOperation"] = 2
        self._subtasks.append(sub_task)
        self._modify_schedule_policy_properties()

    def modify_schedule(self, schedule_json, schedule_id=None, schedule_name=None):
        """
        Modifies the schedule with the given schedule json inputs for the given schedule id or name
        Args:
            schedule_dict (dict) -- {
                    pattern : {}, -- Please refer SchedulePattern.create_schedule in schedules.py for the types of
                                     pattern to be sent

                                     eg: {
                                            "freq_type": 'daily',
                                            "active_start_time": time_in_%H/%S (str),
                                            "repeat_days": days_to_repeat (int)
                                         }

                    options: {} -- Please refer ScheduleOptions.py classes for respective schedule options

                                    eg:  {
                                        "maxNumberOfStreams": 0,
                                        "useMaximumStreams": True,
                                        "useScallableResourceManagement": True,
                                        "totalJobsToProcess": 1000,
                                        "allCopies": True,
                                        "mediaAgent": {
                                            "mediaAgentName": "<ANY MEDIAAGENT>"
                                        }
                                    }
                }
            schedule_id (int) -- id of the schedule
            schedule_name (str) -- name of the schedule

        Sample:
                Change Pattern:
                    sch_pol_obj.change_schedule({'pattern':{'freq_type': 'monthly'}}, schedule_id=77)

                Change Options:
                    sch_pol_obj.change_schedule({'options':{'maxNumberOfStreams': 10}}, schedule_id=77)

        """
        sub_task = self.get_schedule(schedule_id, schedule_name)
        if not sub_task:
            raise SDKException('Schedules', '105')
        if 'pattern' in schedule_json:
            self._update_pattern(sub_task["subTask"]["subTaskId"], schedule_json.get('pattern'))
        if 'options' in schedule_json:
            self._update_option(sub_task["subTask"]["subTaskId"], schedule_json.get('options'))
        self._modify_schedule_policy_properties()

    def delete_schedule(self, schedule_id=None, schedule_name=None):
        """
        Deletes the schedule from the schedule policy
        Args:
            schedule_id (int) -- id of the schedule
            schedule_name (str) -- name of the schedule

        Sample:
            sch_pol_obj.delete_schedule(schedule_name='testsch')

        """
        sub_task = self.get_schedule(schedule_id, schedule_name)
        if not sub_task:
            raise SDKException('Schedules', '105')
        sub_task["subTaskOperation"] = 3
        self._subtasks[self._subtasks.index(sub_task)] = sub_task
        self._modify_schedule_policy_properties()

    def update_app_groups(self, app_groups, operation_type):
        """
        Update the appgroups for the provided schedule policy
        Args:
            app_groups(List) -- Agent Types to be associated to the schedule policy

                      eg:    [
                                {
                                    "appGroupName": "Protected Files"
                                },
                                {
                                    "appGroupName": "Archived Files"
                                }
                            ]
            operation_type (OperationType) -- Please check OperationType class present in this file

        Sample:

            apptype = [{'appGroupName': 'DB2'}]
            sch_pol_obj.update_app_groups(apptype, OperationType.INCLUDE)

        """
        for app_group in app_groups:
            app_group["flags"] = {
                operation_type: True
            }
        self._app_groups = app_groups
        self._modify_schedule_policy_properties()

    def _modify_schedule_policy_properties(self):
        """
         Modifies the task properties of the schedule policy
        Exception:
            if modification of the schedule policy failed

        """
        request_json = {
            'taskInfo':
                {
                    'taskOperation': 1,
                    'associations': self._associations,
                    'task': self._task_json,
                    "appGroup":
                        {
                            "appGroups": self._app_groups if self._app_groups else [],
                        },
                    'subTasks': self._subtasks
                }
        }

        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'PUT', self._MODIFY_SCHEDULE_POLICY, request_json
        )
        output = self._process_schedule_policy_update_response(flag, response)
        self.refresh()

        if output[0]:
            return

        o_str = 'Failed to update properties of Schedule Policy\nError: "{0}"'
        raise SDKException('Schedules', '102', o_str.format(output[2]))

    def enable(self):
        """Enable a schedule policy.

                    Raises:
                        SDKException:
                            if failed to enable schedule policy

                            if response is empty

                            if response is not success
                """
        enable_request = self._commcell_object._services['ENABLE_SCHEDULE']
        request_text = "taskId={0}".format(self.schedule_policy_id)

        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'POST', enable_request, request_text)

        if flag:
            if response.json():
                error_code = str(response.json()['errorCode'])

                if error_code == "0":
                    return
                else:
                    error_message = 'Failed to enable Schedule Policy'

                    if 'errorMessage' in response.json():
                        error_message = "{0}\nError: {1}".format(error_message, response.json()['errorMessage'])

                    raise SDKException('Schedules', '102', error_message)

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

        response_string = self._commcell_object._update_response_(
            response.text)
        raise SDKException('Response', '101', response_string)

    def disable(self):
        """Disable a Schedule Policy.

            Raises:
                SDKException:
                    if failed to disable Schedule Policy

                    if response is empty

                    if response is not success
        """
        disable_request = self._commcell_object._services['DISABLE_SCHEDULE']

        request_text = "taskId={0}".format(self.schedule_policy_id)

        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'POST', disable_request, request_text)

        if flag:
            if response.json():
                error_code = str(response.json()['errorCode'])

                if error_code == "0":
                    return
                else:
                    error_message = 'Failed to disable Schedule Policy'

                    if 'errorMessage' in response.json():
                        error_message = "{0}\nError: {1}".format(error_message, response.json()['errorMessage'])

                    raise SDKException('Schedules', '102', error_message)

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

        response_string = self._commcell_object._update_response_(
            response.text)
        raise SDKException('Response', '101', response_string)

    def _process_schedule_policy_update_response(self, flag, response):
        """
        processes the response received post update request
        Args:
        flag: (bool) -- True or false based on response
        response: (dict) response from modify request
        Returns:
            flag: (Bool) -- based on success and failure
            error_code: (int) -- error_code from response
            error_message: (str) -- error_message from the response if any
        """
        task_id = None
        if flag:
            if response.json():
                if "taskId" in response.json():
                    task_id = str(response.json()["taskId"])

                    if task_id:
                        return True, "0", ""

                elif "errorCode" in response.json():
                    error_code = str(response.json()['errorCode'])
                    error_message = response.json()['errorMessage']

                    if error_code == "0":
                        return True, "0", ""

                    if error_message:
                        return False, error_code, error_message
                    else:
                        return False, error_code, ""
                else:
                    raise SDKException('Response', '102')
            else:
                raise SDKException('Response', '102')
        else:
            response_string = self._commcell_object._update_response_(
                response.text)
            raise SDKException('Response', '101', response_string)

    def refresh(self):
        """Refresh the properties of the Schedule Policy."""
        self._get_schedule_policy_properties()

Classes

class OperationType

Operation Type for schedule policy associations and appGroups

Expand source code Browse git
class OperationType:
    """Operation Type for schedule policy associations and appGroups"""
    INCLUDE = 'include'
    EXCLUDE = 'exclude',
    DELETE = 'deleted'

Class variables

var DELETE
var EXCLUDE
var INCLUDE
class SchedulePolicies (commcell_object)

Class for getting all the schedule policies associated with the commcell.

Initialize object of the SchedulePolicies class.

Args

commcell_object (object) – instance of the Commcell class

Returns

object - instance of the SchedulePolicies class

Expand source code Browse git
class SchedulePolicies:
    """Class for getting all the schedule policies associated with the commcell."""

    policy_to_subtask_map = {

        'Data Protection': [2, 2], #[subtaskType, OperationType]
        'Auxiliary Copy': [1, 4003]
    }

    policy_types = {
        "Data Protection": 0,
        "Auxiliary Copy": 1,
        "Primary Storage Reports": 2,
        "Backup Copy": 3,
        "SRM Data Collection": 4,
        "Subclient Filter for BackupJob Report": 5,
        "Offline Content Indexing": 6,
        "Install Updates": 7,
        "Network Throttle": 8,
    }

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

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

            Returns:
                object - instance of the SchedulePolicies class
        """
        self._commcell_object = commcell_object
        self._POLICY = self._commcell_object._services['SCHEDULE_POLICY']
        self._CREATE_POLICY = self._commcell_object._services['CREATE_UPDATE_SCHEDULE_POLICY']
        self._policies = None
        self.refresh()

    def __str__(self):
        """Representation string consisting of all schedule policies of the commcell.

            Returns:
                str - string of all the schedule policies associated with the commcell
        """
        representation_string = '{:^5}\t{:^20}\n\n'.format('S. No.', 'Schedule Policy')

        for index, policy in enumerate(self._policies):
            sub_str = '{:^5}\t{:20}\n'.format(index + 1, policy)
            representation_string += sub_str

        return representation_string.strip()

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

    def _get_policies(self):
        """Gets all the schedule policies associated to the commcell specified by commcell object.

            Returns:
                dict - consists of all schedule policies of the commcell
                    {
                         "schedule_policy1_name": schedule_policy1_id,
                         "schedule_policy2_name": schedule_policy2_id
                    }

            Raises:
                SDKException:
                    if response is empty

                    if response is not success
        """
        flag, response = self._commcell_object._cvpysdk_object.make_request('GET', self._POLICY)

        if flag:
            if response and response.json():
                if response.json() and 'taskDetail' in response.json():
                    policies = response.json()['taskDetail']
                    policies_dict = {}

                    for policy in policies:
                        temp_name = policy['task']['taskName'].lower()
                        temp_id = str(policy['task']['taskId']).lower()
                        policies_dict[temp_name] = temp_id

                    return policies_dict
                else:
                    raise SDKException('Response', '102')
            else:
                return {}
        else:
            response_string = self._commcell_object._update_response_(response.text)
            raise SDKException('Response', '101', response_string)

    @property
    def all_schedule_policies(self):
        """Returns the schedule policies on this commcell

            dict - consists of all schedule policies of the commcell
                    {
                         "schedule_policy1_name": schedule_policy1_id,
                         "schedule_policy2_name": schedule_policy2_id
                    }
        """
        return self._policies

    def has_policy(self, policy_name):
        """Checks if a schedule policy exists in the commcell with the input schedule policy name.

            Args:
                policy_name (str)  --  name of the schedule policy

            Returns:
                bool - boolean output whether the schedule policy exists in the commcell or not

            Raises:
                SDKException:
                    if type of the schedule policy name argument is not string
        """
        if not isinstance(policy_name, str):
            raise SDKException('Storage', '101')

        return self._policies and policy_name.lower() in self._policies

    @staticmethod
    def subtasks_json(policy_type):
        """
        gets the subtask in schedule policy JSON
        Args:
            policy_type (str) -- Type of the schedule policy from 'policy_types' dict

        Returns:
            returns schedule policy Subtask
        """

        _backup_subtask = {
            "subTaskType": SchedulePolicies.policy_to_subtask_map[policy_type][0],
            "operationType": SchedulePolicies.policy_to_subtask_map[policy_type][1]
        }

        return _backup_subtask

    @staticmethod
    def schedule_json(policy_type, schedule_dict):
        """
            Returns the schedule json for the given schedule options and pattern

        Args:
            policy_type (str) -- Type of the schedule policy from 'policy_types' dict
            schedule_dict (dict) -- with the below format, check add() module for more documentation on the below dict

                                            {
                                                pattern : {},
                                                options: {}
                                            }

        Returns:
            Returns the schedule json for the given schedule options and pattern

        """
        schedule_options = ScheduleOptions(ScheduleOptions.policy_to_options_map[policy_type]
                                           ).options_json(schedule_dict.get('options', None))
        sub_task = SchedulePolicies.subtasks_json(policy_type)
        sub_task['subTaskName'] = schedule_dict.get('name', '')
        sub_task = {
            "subTaskOperation": 1,
            "subTask": sub_task,
            "options": schedule_options
        }

        freq_type = schedule_dict.get('pattern', {}).get('freq_type', 'daily')

        try:
            schedule_dict["pattern"]["freq_type"] = freq_type
        except KeyError:
            schedule_dict["pattern"] = {"freq_type": freq_type}

        task_json = SchedulePattern().create_schedule({'taskInfo':
                                                           {'subTasks': [sub_task]
                                                            }
                                                       }, schedule_dict.get('pattern'))
        return task_json.get('taskInfo').get('subTasks')[0]


    def add(self, name, policy_type, associations, schedules, agent_type=None):
        """

        Adds a schedule policy

        Args:
            name (str) -- Name of the Schedule Policy
            policy_type (str) -- Type of the schedule policy from 'policy_types' dict
            associations (str) -- List of schedule associations
            [
            {
                "clientName": "scheduleclient1"
            },
            {
                "clientGroupName": "scheduleclient2"
            }
            ]

            schedules (List) -- schedules to be associated to the schedule policy

            [
                {
                    pattern : {}, -- Please refer SchedulePattern.create_schedule in schedules.py for the types of
                                     pattern to be sent

                                     eg: {
                                            "freq_type": 'daily',
                                            "active_start_time": time_in_%H/%S (str),
                                            "repeat_days": days_to_repeat (int)
                                         }

                    options: {} -- Please refer ScheduleOptions.py classes for respective schedule options

                                    eg:  {
                                        "maxNumberOfStreams": 0,
                                        "useMaximumStreams": True,
                                        "useScallableResourceManagement": True,
                                        "totalJobsToProcess": 1000,
                                        "allCopies": True,
                                        "mediaAgent": {
                                            "mediaAgentName": "<ANY MEDIAAGENT>"
                                        }
                                    }
                }
            ]



            agent_type (List) -- Agent Types to be associated to the schedule policy

                      eg:    [
                                {
                                    "appGroupName": "Protected Files"
                                },
                                {
                                    "appGroupName": "Archived Files"
                                }
                            ]

        sample:

                    apptype = [{'appGroupName': 'DB2'}]
                    associations = [{'clientName': 'testclient'}]
                    schedule = [
                        {
                            'name': 'trying',
                            'pattern': {
                                            'freq_type': 'Daily'
                                        }
                        }
                    ]
                    commcellobj.schedule_policies.add('testsch1', 'Data Protection', associations, schedule, apptype)

        Returns: schedule policy object on successful completion

        Raises:

            SDKExceptions on wrong input types and failure to create schedule policy

        """

        if not isinstance(schedules, list):
            raise SDKException('Schedules', '102', 'schedules should be a list')

        sub_tasks = []
        for schedule in schedules:
            sub_tasks.append(self.schedule_json(policy_type, schedule))


        schedule_policy = {
            "taskInfo":
                {
                    "associations": associations,
                    "task":
                        {
                            "description": "", "taskType": 4, "initiatedFrom": 2,
                            "policyType": self.policy_types[policy_type],
                            "taskName": name,
                            "securityAssociations": {},
                            "taskSecurity": {},
                            "alert": {"alertName": ""},
                            "taskFlags": {"isEdgeDrive": False, "disabled": False}
                        },
                    "appGroup":
                        {
                            "appGroups": agent_type if agent_type else [],
                        },
                    "subTasks": sub_tasks

                }
        }
        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'POST', self._CREATE_POLICY, schedule_policy
        )
        output = self._process_schedule_policy_response(flag, response)
        self.refresh()

        if output[0]:
            return self.get(name)

        o_str = 'Failed to update properties of Schedule\nError: "{0}"'
        raise SDKException('Schedules', '102', o_str.format(output[2]))

    def get(self, schedule_policy_name, schedule_policy_id=None):
        """Returns a schedule policy object of the specified schedule policy name.

            Args:
                schedule_policy_name (str)  --  name of the Schedule Policy
                schedule_policy_id (int) -- id of the schedule Policy

            Sample: sch_pol_obj = commcellobj.schedule_policies.get('testschp')

            Returns:
                object - instance of the schedule policy class for the given schedule name

            Raises:
                SDKException:
                    if type of the schedule policy name argument is not string

                    if no schedule policy exists with the given name
        """

        if schedule_policy_name and not isinstance(schedule_policy_name, str):
            raise SDKException('Schedules', '102')

        if schedule_policy_id and not isinstance(schedule_policy_id, int):
            raise SDKException('Schedules', '102')

        schedule_policy_name = schedule_policy_name.lower()
        schedule_policy_id = self.all_schedule_policies.get(schedule_policy_name)
        if self.has_policy(schedule_policy_name):
            return SchedulePolicy(
                self._commcell_object, schedule_policy_name, schedule_policy_id
            )

        raise SDKException(
            'Schedules',
            '102',
            'No Schedule Policy exists with name: {0}'.format(schedule_policy_name))

    def delete(self, schedule_policy_name):
        """deletes the specified schedule policy name.

                    Args:
                        schedule_policy_name (str)  --  name of the Schedule Policy

                    Sample:  commcellobj.schedule_policies.delete('testschp')

                    Raises:
                        SDKException:
                            if type of the schedule policy name argument is not string
                            if no schedule policy exists with the given name
        """

        if schedule_policy_name and not isinstance(schedule_policy_name, str):
            raise SDKException('Schedules', '102')

        schedule_policy_name = schedule_policy_name.lower()
        schedule_policy_id = self.all_schedule_policies.get(schedule_policy_name)

        if schedule_policy_id:
            request_json = {
                "TMMsg_TaskOperationReq":
                    {
                        "opType": 3,
                        "taskEntities":
                            [
                                {
                                    "_type_": 69,
                                    "taskId": schedule_policy_id
                                }
                            ]
                    }
            }

            modify_schedule = self._commcell_object._services['EXECUTE_QCOMMAND']

            flag, response = self._commcell_object._cvpysdk_object.make_request(
                'POST', modify_schedule, request_json)

            if flag:
                if response.json():
                    if 'errorCode' in response.json():
                        if response.json()['errorCode'] == 0:
                            self.refresh()
                        else:
                            raise SDKException(
                                'Schedules', '102', response.json()['errorMessage'])
                else:
                    raise SDKException('Response', '102')
            else:
                response_string = self._commcell_object._update_response_(
                    response.text)
                exception_message = 'Failed to delete schedule policy\nError: "{0}"'.format(
                    response_string)

                raise SDKException('Schedules', '102', exception_message)
        else:
            raise SDKException(
                'Schedules', '102', 'No schedule policy exists for: {0}'.format(
                    schedule_policy_id)
            )

    def refresh(self):
        """Refresh the Schedule Policies associated with the Commcell."""
        self._policies = self._get_policies()

    def _process_schedule_policy_response(self, flag, response):
        """
        processes the response received post create request
        Args:
        flag: (bool) -- True or false based on response
        response: (dict) response from modify request
        Returns:
            flag: (Bool) -- based on success and failure
            error_code: (int) -- error_code from response
            error_message: (str) -- error_message from the response if any
        """

        if flag:
            if response.json():
                if "taskId" in response.json():
                    task_id = str(response.json()["taskId"])

                    if task_id:
                        return True, "0", ""

                elif "errorCode" in response.json():
                    error_code = str(response.json()['errorCode'])
                    error_message = response.json()['errorMessage']

                    if error_code == "0":
                        return True, "0", ""

                    if error_message:
                        return False, error_code, error_message
                    else:
                        return False, error_code, ""
                else:
                    raise SDKException('Response', '102')
            else:
                raise SDKException('Response', '102')
        else:
            response_string = self._commcell_object._update_response_(
                response.text)
            raise SDKException('Response', '101', response_string)

Class variables

var policy_to_subtask_map
var policy_types

Static methods

def schedule_json(policy_type, schedule_dict)

Returns the schedule json for the given schedule options and pattern

Args

policy_type (str) – Type of the schedule policy from 'policy_types' dict schedule_dict (dict) – with the below format, check add() module for more documentation on the below dict

                            {
                                pattern : {},
                                options: {}
                            }

Returns

Returns the schedule json for the given schedule options and pattern

Expand source code Browse git
@staticmethod
def schedule_json(policy_type, schedule_dict):
    """
        Returns the schedule json for the given schedule options and pattern

    Args:
        policy_type (str) -- Type of the schedule policy from 'policy_types' dict
        schedule_dict (dict) -- with the below format, check add() module for more documentation on the below dict

                                        {
                                            pattern : {},
                                            options: {}
                                        }

    Returns:
        Returns the schedule json for the given schedule options and pattern

    """
    schedule_options = ScheduleOptions(ScheduleOptions.policy_to_options_map[policy_type]
                                       ).options_json(schedule_dict.get('options', None))
    sub_task = SchedulePolicies.subtasks_json(policy_type)
    sub_task['subTaskName'] = schedule_dict.get('name', '')
    sub_task = {
        "subTaskOperation": 1,
        "subTask": sub_task,
        "options": schedule_options
    }

    freq_type = schedule_dict.get('pattern', {}).get('freq_type', 'daily')

    try:
        schedule_dict["pattern"]["freq_type"] = freq_type
    except KeyError:
        schedule_dict["pattern"] = {"freq_type": freq_type}

    task_json = SchedulePattern().create_schedule({'taskInfo':
                                                       {'subTasks': [sub_task]
                                                        }
                                                   }, schedule_dict.get('pattern'))
    return task_json.get('taskInfo').get('subTasks')[0]
def subtasks_json(policy_type)

gets the subtask in schedule policy JSON

Args

policy_type (str) – Type of the schedule policy from 'policy_types' dict

Returns

returns schedule policy Subtask

Expand source code Browse git
@staticmethod
def subtasks_json(policy_type):
    """
    gets the subtask in schedule policy JSON
    Args:
        policy_type (str) -- Type of the schedule policy from 'policy_types' dict

    Returns:
        returns schedule policy Subtask
    """

    _backup_subtask = {
        "subTaskType": SchedulePolicies.policy_to_subtask_map[policy_type][0],
        "operationType": SchedulePolicies.policy_to_subtask_map[policy_type][1]
    }

    return _backup_subtask

Instance variables

var all_schedule_policies

Returns the schedule policies on this commcell

dict - consists of all schedule policies of the commcell { "schedule_policy1_name": schedule_policy1_id, "schedule_policy2_name": schedule_policy2_id }

Expand source code Browse git
@property
def all_schedule_policies(self):
    """Returns the schedule policies on this commcell

        dict - consists of all schedule policies of the commcell
                {
                     "schedule_policy1_name": schedule_policy1_id,
                     "schedule_policy2_name": schedule_policy2_id
                }
    """
    return self._policies

Methods

def add(self, name, policy_type, associations, schedules, agent_type=None)

Adds a schedule policy

Args

name (str) – Name of the Schedule Policy policy_type (str) – Type of the schedule policy from 'policy_types' dict associations (str) – List of schedule associations [ { "clientName": "scheduleclient1" }, { "clientGroupName": "scheduleclient2" } ]

schedules (List) – schedules to be associated to the schedule policy

[ { pattern : {}, – Please refer SchedulePattern.create_schedule in schedules.py for the types of pattern to be sent

                     eg: {
                            "freq_type": 'daily',
                            "active_start_time": time_in_%H/%S (str),
                            "repeat_days": days_to_repeat (int)
                         }

    options: {} -- Please refer ScheduleOptions.py classes for respective schedule options

                    eg:  {
                        "maxNumberOfStreams": 0,
                        "useMaximumStreams": True,
                        "useScallableResourceManagement": True,
                        "totalJobsToProcess": 1000,
                        "allCopies": True,
                        "mediaAgent": {
                            "mediaAgentName": "<ANY MEDIAAGENT>"
                        }
                    }
}

]

agent_type (List) – Agent Types to be associated to the schedule policy

      eg:    [
                {
                    "appGroupName": "Protected Files"
                },
                {
                    "appGroupName": "Archived Files"
                }
            ]

sample:

        apptype = [{'appGroupName': 'DB2'}]
        associations = [{'clientName': 'testclient'}]
        schedule = [
            {
                'name': 'trying',
                'pattern': {
                                'freq_type': 'Daily'
                            }
            }
        ]
        commcellobj.schedule_policies.add('testsch1', 'Data Protection', associations, schedule, apptype)

Returns: schedule policy object on successful completion

Raises

SDKExceptions on wrong input types and failure to create schedule policy

Expand source code Browse git
def add(self, name, policy_type, associations, schedules, agent_type=None):
    """

    Adds a schedule policy

    Args:
        name (str) -- Name of the Schedule Policy
        policy_type (str) -- Type of the schedule policy from 'policy_types' dict
        associations (str) -- List of schedule associations
        [
        {
            "clientName": "scheduleclient1"
        },
        {
            "clientGroupName": "scheduleclient2"
        }
        ]

        schedules (List) -- schedules to be associated to the schedule policy

        [
            {
                pattern : {}, -- Please refer SchedulePattern.create_schedule in schedules.py for the types of
                                 pattern to be sent

                                 eg: {
                                        "freq_type": 'daily',
                                        "active_start_time": time_in_%H/%S (str),
                                        "repeat_days": days_to_repeat (int)
                                     }

                options: {} -- Please refer ScheduleOptions.py classes for respective schedule options

                                eg:  {
                                    "maxNumberOfStreams": 0,
                                    "useMaximumStreams": True,
                                    "useScallableResourceManagement": True,
                                    "totalJobsToProcess": 1000,
                                    "allCopies": True,
                                    "mediaAgent": {
                                        "mediaAgentName": "<ANY MEDIAAGENT>"
                                    }
                                }
            }
        ]



        agent_type (List) -- Agent Types to be associated to the schedule policy

                  eg:    [
                            {
                                "appGroupName": "Protected Files"
                            },
                            {
                                "appGroupName": "Archived Files"
                            }
                        ]

    sample:

                apptype = [{'appGroupName': 'DB2'}]
                associations = [{'clientName': 'testclient'}]
                schedule = [
                    {
                        'name': 'trying',
                        'pattern': {
                                        'freq_type': 'Daily'
                                    }
                    }
                ]
                commcellobj.schedule_policies.add('testsch1', 'Data Protection', associations, schedule, apptype)

    Returns: schedule policy object on successful completion

    Raises:

        SDKExceptions on wrong input types and failure to create schedule policy

    """

    if not isinstance(schedules, list):
        raise SDKException('Schedules', '102', 'schedules should be a list')

    sub_tasks = []
    for schedule in schedules:
        sub_tasks.append(self.schedule_json(policy_type, schedule))


    schedule_policy = {
        "taskInfo":
            {
                "associations": associations,
                "task":
                    {
                        "description": "", "taskType": 4, "initiatedFrom": 2,
                        "policyType": self.policy_types[policy_type],
                        "taskName": name,
                        "securityAssociations": {},
                        "taskSecurity": {},
                        "alert": {"alertName": ""},
                        "taskFlags": {"isEdgeDrive": False, "disabled": False}
                    },
                "appGroup":
                    {
                        "appGroups": agent_type if agent_type else [],
                    },
                "subTasks": sub_tasks

            }
    }
    flag, response = self._commcell_object._cvpysdk_object.make_request(
        'POST', self._CREATE_POLICY, schedule_policy
    )
    output = self._process_schedule_policy_response(flag, response)
    self.refresh()

    if output[0]:
        return self.get(name)

    o_str = 'Failed to update properties of Schedule\nError: "{0}"'
    raise SDKException('Schedules', '102', o_str.format(output[2]))
def delete(self, schedule_policy_name)

deletes the specified schedule policy name.

Args

schedule_policy_name (str) – name of the Schedule Policy Sample: commcellobj.schedule_policies.delete('testschp')

Raises

SDKException: if type of the schedule policy name argument is not string if no schedule policy exists with the given name

Expand source code Browse git
def delete(self, schedule_policy_name):
    """deletes the specified schedule policy name.

                Args:
                    schedule_policy_name (str)  --  name of the Schedule Policy

                Sample:  commcellobj.schedule_policies.delete('testschp')

                Raises:
                    SDKException:
                        if type of the schedule policy name argument is not string
                        if no schedule policy exists with the given name
    """

    if schedule_policy_name and not isinstance(schedule_policy_name, str):
        raise SDKException('Schedules', '102')

    schedule_policy_name = schedule_policy_name.lower()
    schedule_policy_id = self.all_schedule_policies.get(schedule_policy_name)

    if schedule_policy_id:
        request_json = {
            "TMMsg_TaskOperationReq":
                {
                    "opType": 3,
                    "taskEntities":
                        [
                            {
                                "_type_": 69,
                                "taskId": schedule_policy_id
                            }
                        ]
                }
        }

        modify_schedule = self._commcell_object._services['EXECUTE_QCOMMAND']

        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'POST', modify_schedule, request_json)

        if flag:
            if response.json():
                if 'errorCode' in response.json():
                    if response.json()['errorCode'] == 0:
                        self.refresh()
                    else:
                        raise SDKException(
                            'Schedules', '102', response.json()['errorMessage'])
            else:
                raise SDKException('Response', '102')
        else:
            response_string = self._commcell_object._update_response_(
                response.text)
            exception_message = 'Failed to delete schedule policy\nError: "{0}"'.format(
                response_string)

            raise SDKException('Schedules', '102', exception_message)
    else:
        raise SDKException(
            'Schedules', '102', 'No schedule policy exists for: {0}'.format(
                schedule_policy_id)
        )
def get(self, schedule_policy_name, schedule_policy_id=None)

Returns a schedule policy object of the specified schedule policy name.

Args

schedule_policy_name (str) – name of the Schedule Policy schedule_policy_id (int) – id of the schedule Policy Sample: sch_pol_obj = commcellobj.schedule_policies.get('testschp')

Returns

object - instance of the schedule policy class for the given schedule name

Raises

SDKException: if type of the schedule policy name argument is not string

if no schedule policy exists with the given name
Expand source code Browse git
def get(self, schedule_policy_name, schedule_policy_id=None):
    """Returns a schedule policy object of the specified schedule policy name.

        Args:
            schedule_policy_name (str)  --  name of the Schedule Policy
            schedule_policy_id (int) -- id of the schedule Policy

        Sample: sch_pol_obj = commcellobj.schedule_policies.get('testschp')

        Returns:
            object - instance of the schedule policy class for the given schedule name

        Raises:
            SDKException:
                if type of the schedule policy name argument is not string

                if no schedule policy exists with the given name
    """

    if schedule_policy_name and not isinstance(schedule_policy_name, str):
        raise SDKException('Schedules', '102')

    if schedule_policy_id and not isinstance(schedule_policy_id, int):
        raise SDKException('Schedules', '102')

    schedule_policy_name = schedule_policy_name.lower()
    schedule_policy_id = self.all_schedule_policies.get(schedule_policy_name)
    if self.has_policy(schedule_policy_name):
        return SchedulePolicy(
            self._commcell_object, schedule_policy_name, schedule_policy_id
        )

    raise SDKException(
        'Schedules',
        '102',
        'No Schedule Policy exists with name: {0}'.format(schedule_policy_name))
def has_policy(self, policy_name)

Checks if a schedule policy exists in the commcell with the input schedule policy name.

Args

policy_name (str) – name of the schedule policy

Returns

bool - boolean output whether the schedule policy exists in the commcell or not

Raises

SDKException: if type of the schedule policy name argument is not string

Expand source code Browse git
def has_policy(self, policy_name):
    """Checks if a schedule policy exists in the commcell with the input schedule policy name.

        Args:
            policy_name (str)  --  name of the schedule policy

        Returns:
            bool - boolean output whether the schedule policy exists in the commcell or not

        Raises:
            SDKException:
                if type of the schedule policy name argument is not string
    """
    if not isinstance(policy_name, str):
        raise SDKException('Storage', '101')

    return self._policies and policy_name.lower() in self._policies
def refresh(self)

Refresh the Schedule Policies associated with the Commcell.

Expand source code Browse git
def refresh(self):
    """Refresh the Schedule Policies associated with the Commcell."""
    self._policies = self._get_policies()
class SchedulePolicy (commcell_obj, schedule_policy_name, schedule_policy_id=None)

Class for performing operations for a specific Schedule.

Initialise the Schedule Policy class instance.

Args

class_object (object) – instance of Class Object

schedule_policy_name (str) – name of the Schedule

schedule_policy_id (int) – task ids of the Schedule

Returns

object - instance of the Schedule Policy class

Expand source code Browse git
class SchedulePolicy:
    """Class for performing operations for a specific Schedule."""

    def __init__(self, commcell_obj, schedule_policy_name, schedule_policy_id=None):

        """Initialise the Schedule Policy class instance.

            Args:
                class_object (object)     --  instance of Class Object

                schedule_policy_name      (str)     --  name of the Schedule

                schedule_policy_id        (int)     --   task ids of the Schedule



            Returns:
                object - instance of the Schedule Policy class
        """

        self._commcell_object = commcell_obj

        self.schedule_policy_name = schedule_policy_name

        if schedule_policy_id:
            self.schedule_policy_id = schedule_policy_id
        else:
            self.schedule_policy_id = self._get_schedule_policy_id()


        self._SCHEDULE_POLICY = self._commcell_object._services['GET_SCHEDULE_POLICY'] % (
            self.schedule_policy_id)
        self._MODIFY_SCHEDULE_POLICY = self._commcell_object._services['CREATE_UPDATE_SCHEDULE_POLICY']

        self._associations = []
        self._subtasks = []
        self._app_groups = []
        self._task_json = {}
        self._task_name = None
        self._all_schedules = []
        self.refresh()

    def _get_schedule_policy_id(self):
        """
        Gets a schedule ID of the schedule policy
        Returns (int) -- schedule policy ID
        """
        schedule_policies = SchedulePolicies(self._commcell_object)
        return schedule_policies.get(self.schedule_policy_name).schedule_policy_id

    @property
    def policy_type(self):
        """
        Get the policy Type of the schedule policy

        Sample:  sch_pol_obj.policy_type

        Returns (str) -- Type of the schedule policy from 'policy_types' dict

        """
        return (
                list(
                SchedulePolicies.policy_types.keys())[
                list(
                    SchedulePolicies.policy_types.values()).index(self._task_json['policyType'])])


    def _get_schedule_policy_properties(self):
        """Gets the properties of this Schedule Policy.

            Returns:
                dict - dictionary consisting of the properties of this Schedule Policy

            Raises:
                SDKException:
                    if response is empty

                    if response is not success
        """
        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'GET', self._SCHEDULE_POLICY)

        if flag:
            if response.json() and 'taskInfo' in response.json():
                _task_info = response.json()['taskInfo']

                if 'associations' in _task_info:
                    self._associations = _task_info['associations']

                if 'task' in _task_info:
                    self._task_json = _task_info['task']

                self._app_groups = _task_info['appGroup'].get('appGroups')

                self._subtasks = _task_info['subTasks']

                for subtask in self._subtasks:
                    self._all_schedules.append({
                                                "schedule_name" : subtask["subTask"].get("subTaskName", ''),
                                                "schedule_id": subtask["subTask"]["subTaskId"]
                                                })


            else:
                raise SDKException('Response', '102')
        else:
            response_string = self._commcell_object._update_response_(
                response.text)
            raise SDKException('Response', '101', response_string)

    def update_associations(self, associations, operation_type):
        """
        Updates the schedule policy associations
        Args:
            associations (str) -- List of schedule associations
            [
            {
                "clientName": "scheduleclient1"
            },
            {
                "clientGroupName": "scheduleclient2"
            }
            ]
            operation_type (OperationType) -- Please check OperationType class present in this file

        Sample:
            associations = [{'clientName': 'client2'}]
            sch_pol_obj.update_associations(associations, OperationType.DELETE)

        """

        for app_group in associations:
            app_group["flags"] = {
                                    operation_type: True
                                 }
        self._associations = associations
        self._modify_schedule_policy_properties()

    @property
    def all_schedules(self):
        """
        Gets all the schedules of the schedule policy

        Sample:  sch_pol_obj.all_schedules

        Returns (dict) -- schedules in the below format

            {
                    "schedule_name" : (str),
                    "schedule_id": (int)
            }

        """
        return self._all_schedules


    def _update_pattern(self, schedule_id, pattern_dict):

        """

        Updates the schedule pattern for the provided schedule id (internal function)

        Args:
            schedule_id (int) -- id of the schedule
            pattern_dict (dict) -- Please refer SchedulePattern.create_schedule in schedules.py for the types of
                                     pattern to be sent

                                     eg: {
                                            "freq_type": 'daily',
                                            "active_start_time": time_in_%H/%S (str),
                                            "repeat_days": days_to_repeat (int)
                                         }


        """

        existing_pattern = {}

        for subtask in self._subtasks:
            if subtask["subTask"]["subTaskId"] == schedule_id:

                if 'pattern' in subtask:
                    existing_pattern = subtask['pattern']

                if 'options' in subtask:
                    _options = subtask['options']
                    if 'commonOpts' in _options:
                        if 'automaticSchedulePattern' in _options["commonOpts"]:
                            existing_pattern = _options[
                                "commonOpts"]['automaticSchedulePattern']

                    if 'backupOpts' in _options:
                        if 'dataOpt' in _options['backupOpts']:
                            if isinstance(existing_pattern, dict):
                                _data_opt = _options['backupOpts']['dataOpt']
                                existing_pattern.update(_data_opt)
                break


        task_json = SchedulePattern(existing_pattern).create_schedule({'taskInfo':
                                                                           {'subTasks': self._subtasks
                                                                            }
                                                                       }, pattern_dict, schedule_id)

        self._subtasks = task_json.get('taskInfo').get('subTasks')

    @staticmethod
    def get_option(option_dict, option):
        """
        gets the schedule options for the provided option
        Args:
            option_dict: the complete options dict
            option: option for which the dict has to be fetched

        Returns (dict) -- Option dict for the provided option

        """
        if isinstance(option_dict, dict) and option in option_dict:
            return option_dict[option]
        elif not isinstance(option_dict, dict):
            return None
        else:
            for value in option_dict.values():
                result = SchedulePolicy.get_option(value, option)
                if result is not None:
                    return result

    def _update_option(self, schedule_id, options):
        """
        Updates the option for the provided schedule id (internal)

        Args:
             schedule_id (int) -- id of the schedule
            options (dict) -- Please refer ScheduleOptions.py classes for respective schedule options

                                    eg:  {
                                        "maxNumberOfStreams": 0,
                                        "useMaximumStreams": True,
                                        "useScallableResourceManagement": True,
                                        "totalJobsToProcess": 1000,
                                        "allCopies": True,
                                        "mediaAgent": {
                                            "mediaAgentName": "<ANY MEDIAAGENT>"
                                        }
                                    }

        """

        option_allowed = ScheduleOptions.policy_to_options_map[self.policy_type]
        for subtask in self._subtasks:
            if subtask["subTask"]["subTaskId"] == schedule_id:
                if 'options' in subtask:
                    existing_options = self.get_option(subtask['options'], option_allowed)
                    if not existing_options:
                        raise SDKException('Schedules', '104')

                    subtask['options'] = ScheduleOptions(option_allowed, existing_options).options_json(options)
                    self._subtasks[self._subtasks.index(subtask)] = subtask
                    break

    def get_schedule(self, schedule_id=None, schedule_name=None):
        """
        returns the subtask dict for the provided schedule id or name
        Args:
            schedule_id (int) -- id of the schedule
            schedule_name (str) -- name of the schedule

        Sample:  sch_pol_obj.get_schedule(schedule_id=10)

        Returns (dict) -- subtask dict

        """
        if not schedule_name and not schedule_id:
            raise SDKException(
                'Schedules',
                '102',
                'Either Schedule Name or Schedule Id is needed')

        if schedule_name and not isinstance(schedule_name, str):
            raise SDKException('Schedules', '102')

        if schedule_id and not isinstance(schedule_id, int):
            raise SDKException('Schedules', '102')

        if schedule_name:
            search_dict = ("subTaskName", schedule_name)
        else:
            search_dict = ("subTaskId", schedule_id)

        for sub_task in self._subtasks:
            if search_dict in sub_task["subTask"].items():
                return sub_task

    def add_schedule(self, schedule_dict):
        """
        Adds a new schedule to the schedule policy
        Args:
            schedule_dict (dict) -- {
                    pattern : {}, -- Please refer SchedulePattern.create_schedule in schedules.py for the types of
                                     pattern to be sent

                                     eg: {
                                            "freq_type": 'daily',
                                            "active_start_time": time_in_%H/%S (str),
                                            "repeat_days": days_to_repeat (int)
                                         }

                    options: {} -- Please refer ScheduleOptions.py classes for respective schedule options

                                    eg:  {
                                        "maxNumberOfStreams": 0,
                                        "useMaximumStreams": True,
                                        "useScallableResourceManagement": True,
                                        "totalJobsToProcess": 1000,
                                        "allCopies": True,
                                        "mediaAgent": {
                                            "mediaAgentName": "<ANY MEDIAAGENT>"
                                        }
                                    }
                }

        Sample:

                sch_pol_obj.add_schedule({'pattern':{'freq_type': 'monthly'}})

        """
        sub_task = SchedulePolicies.schedule_json(self.policy_type, schedule_dict)
        sub_task["subTaskOperation"] = 2
        self._subtasks.append(sub_task)
        self._modify_schedule_policy_properties()

    def modify_schedule(self, schedule_json, schedule_id=None, schedule_name=None):
        """
        Modifies the schedule with the given schedule json inputs for the given schedule id or name
        Args:
            schedule_dict (dict) -- {
                    pattern : {}, -- Please refer SchedulePattern.create_schedule in schedules.py for the types of
                                     pattern to be sent

                                     eg: {
                                            "freq_type": 'daily',
                                            "active_start_time": time_in_%H/%S (str),
                                            "repeat_days": days_to_repeat (int)
                                         }

                    options: {} -- Please refer ScheduleOptions.py classes for respective schedule options

                                    eg:  {
                                        "maxNumberOfStreams": 0,
                                        "useMaximumStreams": True,
                                        "useScallableResourceManagement": True,
                                        "totalJobsToProcess": 1000,
                                        "allCopies": True,
                                        "mediaAgent": {
                                            "mediaAgentName": "<ANY MEDIAAGENT>"
                                        }
                                    }
                }
            schedule_id (int) -- id of the schedule
            schedule_name (str) -- name of the schedule

        Sample:
                Change Pattern:
                    sch_pol_obj.change_schedule({'pattern':{'freq_type': 'monthly'}}, schedule_id=77)

                Change Options:
                    sch_pol_obj.change_schedule({'options':{'maxNumberOfStreams': 10}}, schedule_id=77)

        """
        sub_task = self.get_schedule(schedule_id, schedule_name)
        if not sub_task:
            raise SDKException('Schedules', '105')
        if 'pattern' in schedule_json:
            self._update_pattern(sub_task["subTask"]["subTaskId"], schedule_json.get('pattern'))
        if 'options' in schedule_json:
            self._update_option(sub_task["subTask"]["subTaskId"], schedule_json.get('options'))
        self._modify_schedule_policy_properties()

    def delete_schedule(self, schedule_id=None, schedule_name=None):
        """
        Deletes the schedule from the schedule policy
        Args:
            schedule_id (int) -- id of the schedule
            schedule_name (str) -- name of the schedule

        Sample:
            sch_pol_obj.delete_schedule(schedule_name='testsch')

        """
        sub_task = self.get_schedule(schedule_id, schedule_name)
        if not sub_task:
            raise SDKException('Schedules', '105')
        sub_task["subTaskOperation"] = 3
        self._subtasks[self._subtasks.index(sub_task)] = sub_task
        self._modify_schedule_policy_properties()

    def update_app_groups(self, app_groups, operation_type):
        """
        Update the appgroups for the provided schedule policy
        Args:
            app_groups(List) -- Agent Types to be associated to the schedule policy

                      eg:    [
                                {
                                    "appGroupName": "Protected Files"
                                },
                                {
                                    "appGroupName": "Archived Files"
                                }
                            ]
            operation_type (OperationType) -- Please check OperationType class present in this file

        Sample:

            apptype = [{'appGroupName': 'DB2'}]
            sch_pol_obj.update_app_groups(apptype, OperationType.INCLUDE)

        """
        for app_group in app_groups:
            app_group["flags"] = {
                operation_type: True
            }
        self._app_groups = app_groups
        self._modify_schedule_policy_properties()

    def _modify_schedule_policy_properties(self):
        """
         Modifies the task properties of the schedule policy
        Exception:
            if modification of the schedule policy failed

        """
        request_json = {
            'taskInfo':
                {
                    'taskOperation': 1,
                    'associations': self._associations,
                    'task': self._task_json,
                    "appGroup":
                        {
                            "appGroups": self._app_groups if self._app_groups else [],
                        },
                    'subTasks': self._subtasks
                }
        }

        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'PUT', self._MODIFY_SCHEDULE_POLICY, request_json
        )
        output = self._process_schedule_policy_update_response(flag, response)
        self.refresh()

        if output[0]:
            return

        o_str = 'Failed to update properties of Schedule Policy\nError: "{0}"'
        raise SDKException('Schedules', '102', o_str.format(output[2]))

    def enable(self):
        """Enable a schedule policy.

                    Raises:
                        SDKException:
                            if failed to enable schedule policy

                            if response is empty

                            if response is not success
                """
        enable_request = self._commcell_object._services['ENABLE_SCHEDULE']
        request_text = "taskId={0}".format(self.schedule_policy_id)

        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'POST', enable_request, request_text)

        if flag:
            if response.json():
                error_code = str(response.json()['errorCode'])

                if error_code == "0":
                    return
                else:
                    error_message = 'Failed to enable Schedule Policy'

                    if 'errorMessage' in response.json():
                        error_message = "{0}\nError: {1}".format(error_message, response.json()['errorMessage'])

                    raise SDKException('Schedules', '102', error_message)

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

        response_string = self._commcell_object._update_response_(
            response.text)
        raise SDKException('Response', '101', response_string)

    def disable(self):
        """Disable a Schedule Policy.

            Raises:
                SDKException:
                    if failed to disable Schedule Policy

                    if response is empty

                    if response is not success
        """
        disable_request = self._commcell_object._services['DISABLE_SCHEDULE']

        request_text = "taskId={0}".format(self.schedule_policy_id)

        flag, response = self._commcell_object._cvpysdk_object.make_request(
            'POST', disable_request, request_text)

        if flag:
            if response.json():
                error_code = str(response.json()['errorCode'])

                if error_code == "0":
                    return
                else:
                    error_message = 'Failed to disable Schedule Policy'

                    if 'errorMessage' in response.json():
                        error_message = "{0}\nError: {1}".format(error_message, response.json()['errorMessage'])

                    raise SDKException('Schedules', '102', error_message)

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

        response_string = self._commcell_object._update_response_(
            response.text)
        raise SDKException('Response', '101', response_string)

    def _process_schedule_policy_update_response(self, flag, response):
        """
        processes the response received post update request
        Args:
        flag: (bool) -- True or false based on response
        response: (dict) response from modify request
        Returns:
            flag: (Bool) -- based on success and failure
            error_code: (int) -- error_code from response
            error_message: (str) -- error_message from the response if any
        """
        task_id = None
        if flag:
            if response.json():
                if "taskId" in response.json():
                    task_id = str(response.json()["taskId"])

                    if task_id:
                        return True, "0", ""

                elif "errorCode" in response.json():
                    error_code = str(response.json()['errorCode'])
                    error_message = response.json()['errorMessage']

                    if error_code == "0":
                        return True, "0", ""

                    if error_message:
                        return False, error_code, error_message
                    else:
                        return False, error_code, ""
                else:
                    raise SDKException('Response', '102')
            else:
                raise SDKException('Response', '102')
        else:
            response_string = self._commcell_object._update_response_(
                response.text)
            raise SDKException('Response', '101', response_string)

    def refresh(self):
        """Refresh the properties of the Schedule Policy."""
        self._get_schedule_policy_properties()

Static methods

def get_option(option_dict, option)

gets the schedule options for the provided option

Args

option_dict
the complete options dict
option
option for which the dict has to be fetched

Returns (dict) – Option dict for the provided option

Expand source code Browse git
@staticmethod
def get_option(option_dict, option):
    """
    gets the schedule options for the provided option
    Args:
        option_dict: the complete options dict
        option: option for which the dict has to be fetched

    Returns (dict) -- Option dict for the provided option

    """
    if isinstance(option_dict, dict) and option in option_dict:
        return option_dict[option]
    elif not isinstance(option_dict, dict):
        return None
    else:
        for value in option_dict.values():
            result = SchedulePolicy.get_option(value, option)
            if result is not None:
                return result

Instance variables

var all_schedules

Gets all the schedules of the schedule policy

Sample: sch_pol_obj.all_schedules

Returns (dict) – schedules in the below format

{
        "schedule_name" : (str),
        "schedule_id": (int)
}
Expand source code Browse git
@property
def all_schedules(self):
    """
    Gets all the schedules of the schedule policy

    Sample:  sch_pol_obj.all_schedules

    Returns (dict) -- schedules in the below format

        {
                "schedule_name" : (str),
                "schedule_id": (int)
        }

    """
    return self._all_schedules
var policy_type

Get the policy Type of the schedule policy

Sample: sch_pol_obj.policy_type

Returns (str) – Type of the schedule policy from 'policy_types' dict

Expand source code Browse git
@property
def policy_type(self):
    """
    Get the policy Type of the schedule policy

    Sample:  sch_pol_obj.policy_type

    Returns (str) -- Type of the schedule policy from 'policy_types' dict

    """
    return (
            list(
            SchedulePolicies.policy_types.keys())[
            list(
                SchedulePolicies.policy_types.values()).index(self._task_json['policyType'])])

Methods

def add_schedule(self, schedule_dict)

Adds a new schedule to the schedule policy

Args

schedule_dict (dict) – { pattern : {}, – Please refer SchedulePattern.create_schedule in schedules.py for the types of pattern to be sent

                     eg: {
                            "freq_type": 'daily',
                            "active_start_time": time_in_%H/%S (str),
                            "repeat_days": days_to_repeat (int)
                         }

    options: {} -- Please refer ScheduleOptions.py classes for respective schedule options

                    eg:  {
                        "maxNumberOfStreams": 0,
                        "useMaximumStreams": True,
                        "useScallableResourceManagement": True,
                        "totalJobsToProcess": 1000,
                        "allCopies": True,
                        "mediaAgent": {
                            "mediaAgentName": "<ANY MEDIAAGENT>"
                        }
                    }
}

Sample

sch_pol_obj.add_schedule({'pattern':{'freq_type': 'monthly'}})

Expand source code Browse git
def add_schedule(self, schedule_dict):
    """
    Adds a new schedule to the schedule policy
    Args:
        schedule_dict (dict) -- {
                pattern : {}, -- Please refer SchedulePattern.create_schedule in schedules.py for the types of
                                 pattern to be sent

                                 eg: {
                                        "freq_type": 'daily',
                                        "active_start_time": time_in_%H/%S (str),
                                        "repeat_days": days_to_repeat (int)
                                     }

                options: {} -- Please refer ScheduleOptions.py classes for respective schedule options

                                eg:  {
                                    "maxNumberOfStreams": 0,
                                    "useMaximumStreams": True,
                                    "useScallableResourceManagement": True,
                                    "totalJobsToProcess": 1000,
                                    "allCopies": True,
                                    "mediaAgent": {
                                        "mediaAgentName": "<ANY MEDIAAGENT>"
                                    }
                                }
            }

    Sample:

            sch_pol_obj.add_schedule({'pattern':{'freq_type': 'monthly'}})

    """
    sub_task = SchedulePolicies.schedule_json(self.policy_type, schedule_dict)
    sub_task["subTaskOperation"] = 2
    self._subtasks.append(sub_task)
    self._modify_schedule_policy_properties()
def delete_schedule(self, schedule_id=None, schedule_name=None)

Deletes the schedule from the schedule policy

Args

schedule_id (int) – id of the schedule schedule_name (str) – name of the schedule

Sample

sch_pol_obj.delete_schedule(schedule_name='testsch')

Expand source code Browse git
def delete_schedule(self, schedule_id=None, schedule_name=None):
    """
    Deletes the schedule from the schedule policy
    Args:
        schedule_id (int) -- id of the schedule
        schedule_name (str) -- name of the schedule

    Sample:
        sch_pol_obj.delete_schedule(schedule_name='testsch')

    """
    sub_task = self.get_schedule(schedule_id, schedule_name)
    if not sub_task:
        raise SDKException('Schedules', '105')
    sub_task["subTaskOperation"] = 3
    self._subtasks[self._subtasks.index(sub_task)] = sub_task
    self._modify_schedule_policy_properties()
def disable(self)

Disable a Schedule Policy.

Raises

SDKException: if failed to disable Schedule Policy

if response is empty

if response is not success
Expand source code Browse git
def disable(self):
    """Disable a Schedule Policy.

        Raises:
            SDKException:
                if failed to disable Schedule Policy

                if response is empty

                if response is not success
    """
    disable_request = self._commcell_object._services['DISABLE_SCHEDULE']

    request_text = "taskId={0}".format(self.schedule_policy_id)

    flag, response = self._commcell_object._cvpysdk_object.make_request(
        'POST', disable_request, request_text)

    if flag:
        if response.json():
            error_code = str(response.json()['errorCode'])

            if error_code == "0":
                return
            else:
                error_message = 'Failed to disable Schedule Policy'

                if 'errorMessage' in response.json():
                    error_message = "{0}\nError: {1}".format(error_message, response.json()['errorMessage'])

                raise SDKException('Schedules', '102', error_message)

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

    response_string = self._commcell_object._update_response_(
        response.text)
    raise SDKException('Response', '101', response_string)
def enable(self)

Enable a schedule policy.

Raises

SDKException: if failed to enable schedule policy

if response is empty

if response is not success
Expand source code Browse git
def enable(self):
    """Enable a schedule policy.

                Raises:
                    SDKException:
                        if failed to enable schedule policy

                        if response is empty

                        if response is not success
            """
    enable_request = self._commcell_object._services['ENABLE_SCHEDULE']
    request_text = "taskId={0}".format(self.schedule_policy_id)

    flag, response = self._commcell_object._cvpysdk_object.make_request(
        'POST', enable_request, request_text)

    if flag:
        if response.json():
            error_code = str(response.json()['errorCode'])

            if error_code == "0":
                return
            else:
                error_message = 'Failed to enable Schedule Policy'

                if 'errorMessage' in response.json():
                    error_message = "{0}\nError: {1}".format(error_message, response.json()['errorMessage'])

                raise SDKException('Schedules', '102', error_message)

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

    response_string = self._commcell_object._update_response_(
        response.text)
    raise SDKException('Response', '101', response_string)
def get_schedule(self, schedule_id=None, schedule_name=None)

returns the subtask dict for the provided schedule id or name

Args

schedule_id (int) – id of the schedule schedule_name (str) – name of the schedule Sample: sch_pol_obj.get_schedule(schedule_id=10)

Returns (dict) – subtask dict

Expand source code Browse git
def get_schedule(self, schedule_id=None, schedule_name=None):
    """
    returns the subtask dict for the provided schedule id or name
    Args:
        schedule_id (int) -- id of the schedule
        schedule_name (str) -- name of the schedule

    Sample:  sch_pol_obj.get_schedule(schedule_id=10)

    Returns (dict) -- subtask dict

    """
    if not schedule_name and not schedule_id:
        raise SDKException(
            'Schedules',
            '102',
            'Either Schedule Name or Schedule Id is needed')

    if schedule_name and not isinstance(schedule_name, str):
        raise SDKException('Schedules', '102')

    if schedule_id and not isinstance(schedule_id, int):
        raise SDKException('Schedules', '102')

    if schedule_name:
        search_dict = ("subTaskName", schedule_name)
    else:
        search_dict = ("subTaskId", schedule_id)

    for sub_task in self._subtasks:
        if search_dict in sub_task["subTask"].items():
            return sub_task
def modify_schedule(self, schedule_json, schedule_id=None, schedule_name=None)

Modifies the schedule with the given schedule json inputs for the given schedule id or name

Args

schedule_dict (dict) – { pattern : {}, – Please refer SchedulePattern.create_schedule in schedules.py for the types of pattern to be sent

                     eg: {
                            "freq_type": 'daily',
                            "active_start_time": time_in_%H/%S (str),
                            "repeat_days": days_to_repeat (int)
                         }

    options: {} -- Please refer ScheduleOptions.py classes for respective schedule options

                    eg:  {
                        "maxNumberOfStreams": 0,
                        "useMaximumStreams": True,
                        "useScallableResourceManagement": True,
                        "totalJobsToProcess": 1000,
                        "allCopies": True,
                        "mediaAgent": {
                            "mediaAgentName": "<ANY MEDIAAGENT>"
                        }
                    }
}

schedule_id (int) – id of the schedule schedule_name (str) – name of the schedule

Sample

Change Pattern: sch_pol_obj.change_schedule({'pattern':{'freq_type': 'monthly'}}, schedule_id=77)

Change Options: sch_pol_obj.change_schedule({'options':{'maxNumberOfStreams': 10}}, schedule_id=77)

Expand source code Browse git
def modify_schedule(self, schedule_json, schedule_id=None, schedule_name=None):
    """
    Modifies the schedule with the given schedule json inputs for the given schedule id or name
    Args:
        schedule_dict (dict) -- {
                pattern : {}, -- Please refer SchedulePattern.create_schedule in schedules.py for the types of
                                 pattern to be sent

                                 eg: {
                                        "freq_type": 'daily',
                                        "active_start_time": time_in_%H/%S (str),
                                        "repeat_days": days_to_repeat (int)
                                     }

                options: {} -- Please refer ScheduleOptions.py classes for respective schedule options

                                eg:  {
                                    "maxNumberOfStreams": 0,
                                    "useMaximumStreams": True,
                                    "useScallableResourceManagement": True,
                                    "totalJobsToProcess": 1000,
                                    "allCopies": True,
                                    "mediaAgent": {
                                        "mediaAgentName": "<ANY MEDIAAGENT>"
                                    }
                                }
            }
        schedule_id (int) -- id of the schedule
        schedule_name (str) -- name of the schedule

    Sample:
            Change Pattern:
                sch_pol_obj.change_schedule({'pattern':{'freq_type': 'monthly'}}, schedule_id=77)

            Change Options:
                sch_pol_obj.change_schedule({'options':{'maxNumberOfStreams': 10}}, schedule_id=77)

    """
    sub_task = self.get_schedule(schedule_id, schedule_name)
    if not sub_task:
        raise SDKException('Schedules', '105')
    if 'pattern' in schedule_json:
        self._update_pattern(sub_task["subTask"]["subTaskId"], schedule_json.get('pattern'))
    if 'options' in schedule_json:
        self._update_option(sub_task["subTask"]["subTaskId"], schedule_json.get('options'))
    self._modify_schedule_policy_properties()
def refresh(self)

Refresh the properties of the Schedule Policy.

Expand source code Browse git
def refresh(self):
    """Refresh the properties of the Schedule Policy."""
    self._get_schedule_policy_properties()
def update_app_groups(self, app_groups, operation_type)

Update the appgroups for the provided schedule policy

Args

app_groups(List) – Agent Types to be associated to the schedule policy

      eg:    [
                {
                    "appGroupName": "Protected Files"
                },
                {
                    "appGroupName": "Archived Files"
                }
            ]

operation_type (OperationType) – Please check OperationType class present in this file

Sample

apptype = [{'appGroupName': 'DB2'}] sch_pol_obj.update_app_groups(apptype, OperationType.INCLUDE)

Expand source code Browse git
def update_app_groups(self, app_groups, operation_type):
    """
    Update the appgroups for the provided schedule policy
    Args:
        app_groups(List) -- Agent Types to be associated to the schedule policy

                  eg:    [
                            {
                                "appGroupName": "Protected Files"
                            },
                            {
                                "appGroupName": "Archived Files"
                            }
                        ]
        operation_type (OperationType) -- Please check OperationType class present in this file

    Sample:

        apptype = [{'appGroupName': 'DB2'}]
        sch_pol_obj.update_app_groups(apptype, OperationType.INCLUDE)

    """
    for app_group in app_groups:
        app_group["flags"] = {
            operation_type: True
        }
    self._app_groups = app_groups
    self._modify_schedule_policy_properties()
def update_associations(self, associations, operation_type)

Updates the schedule policy associations

Args

associations (str) – List of schedule associations [ { "clientName": "scheduleclient1" }, { "clientGroupName": "scheduleclient2" } ] operation_type (OperationType) – Please check OperationType class present in this file

Sample

associations = [{'clientName': 'client2'}] sch_pol_obj.update_associations(associations, OperationType.DELETE)

Expand source code Browse git
def update_associations(self, associations, operation_type):
    """
    Updates the schedule policy associations
    Args:
        associations (str) -- List of schedule associations
        [
        {
            "clientName": "scheduleclient1"
        },
        {
            "clientGroupName": "scheduleclient2"
        }
        ]
        operation_type (OperationType) -- Please check OperationType class present in this file

    Sample:
        associations = [{'clientName': 'client2'}]
        sch_pol_obj.update_associations(associations, OperationType.DELETE)

    """

    for app_group in associations:
        app_group["flags"] = {
                                operation_type: True
                             }
    self._associations = associations
    self._modify_schedule_policy_properties()