Module cvpysdk.activateapps.sensitive_data_governance

Main file for performing operations on Sensitive data governance(SDG) app under Activate.

'Projects' & 'Project' are 2 classes defined in this file

Projects: Class to represent all SDG projects in the commcell

Project: Class to represent single SDG project in the commcell

Projects

init() – initialise object of the Projects class

_response_not_success() – parses through the exception response, and raises SDKException

_get_all_projects() – gets all the Projects from the SDG

refresh() – refresh the projects associated with the SDG

has_project() – checks whether given project name exists in SDG or not

get() – returns the Project class object for given project name

add() – adds project to the SDG

delete() – deletes project from the SDG

Project

init() – initialise object of the Project class

_response_not_success() – parses through the exception response, and raises SDKException

_get_project_details() – returns the project properties

_get_schedule_object() – returns the schedule object for associated project schedule

refresh() – refresh the project details

add_fs_data_source() – adds file system data source to project

delete_schedule() – deletes schedule for this project

add_schedule() – creates schedule for this project

share() – shares project with given user name or group name

search() – returns the search response containing document details from project

Project Attributes

**project_id**              --  returns the id of the project

**project_details**         --  returns the project properties

**data_sources_name**       --  returns the list of data sources associated with this project

**data_sources**            --  returns the EdiscoveryDataSources object for this project

**total_data_sources**      --  returns total no of data sources associated with this project

**project_name**            --  returns the name of the project

**schedule**                --  returns the schedule object for associated project schedule

**sensitive_files_count**   --  returns the total sensitive files count
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 operations on Sensitive data governance(SDG) app under Activate.

'Projects' & 'Project' are 2 classes defined in this file

Projects:   Class to represent all SDG projects in the commcell

Project:    Class to represent single SDG project in the commcell

Projects:

    __init__()                          --  initialise object of the Projects class

     _response_not_success()            --  parses through the exception response, and raises SDKException

     _get_all_projects()                --  gets all the Projects from the SDG

     refresh()                          --  refresh the projects associated with the SDG

     has_project()                      --  checks whether given project name exists in SDG or not

     get()                              --  returns the Project class object for given project name

     add()                              --  adds project to the SDG

     delete()                           --  deletes project from the SDG

Project:

     __init__()                         --  initialise object of the Project class

     _response_not_success()            --  parses through the exception response, and raises SDKException

     _get_project_details()             --  returns the project properties

     _get_schedule_object()             --  returns the schedule object for associated project schedule

     refresh()                          --  refresh the project details

     add_fs_data_source()               --  adds file system data source to project

     delete_schedule()                  --  deletes schedule for this project

     add_schedule()                     --  creates schedule for this project

     share()                            --  shares project with given user name or group name

     search()                           --  returns the search response containing document details from project


Project Attributes
--------------------

    **project_id**              --  returns the id of the project

    **project_details**         --  returns the project properties

    **data_sources_name**       --  returns the list of data sources associated with this project

    **data_sources**            --  returns the EdiscoveryDataSources object for this project

    **total_data_sources**      --  returns total no of data sources associated with this project

    **project_name**            --  returns the name of the project

    **schedule**                --  returns the schedule object for associated project schedule

    **sensitive_files_count**   --  returns the total sensitive files count

"""

from ..schedules import Schedules

from ..activateapps.constants import EdiscoveryConstants

from ..activateapps.ediscovery_utils import EdiscoveryClients, EdiscoveryClientOperations, EdiscoveryDataSources

from ..exception import SDKException


class Projects():
    """Class for representing all SDG Projects in the commcell."""

    def __init__(self, commcell_object):
        """Initializes an instance of the Projects class.

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

            Returns:
                object  -   instance of the Projects class

        """
        self._commcell_object = commcell_object
        self._update_response_ = commcell_object._update_response_
        self._cvpysdk_object = commcell_object._cvpysdk_object
        self._services = commcell_object._services
        self._sdg_projects = None
        self._ediscovery_clients_obj = EdiscoveryClients(self._commcell_object, self)
        self.refresh()

    def _response_not_success(self, response):
        """Helper function to raise an exception when reponse status is not 200 (OK).

            Args:
                response    (object)    --  response class object,

                received upon running an API request, using the `requests` python package

        """
        raise SDKException('Response', '101', self._update_response_(response.text))

    def _get_all_sdg_projects(self):
        """Returns all the SDG Projects found in the commcell

                Args:

                    None

                Returns:

                    dict        --  Containing SDG Project details

                Raises;

                    SDKException:

                            if failed to get SDG Project details

                            if response is empty

                            if response is not success
        """
        return self._ediscovery_clients_obj.get_ediscovery_projects()

    def refresh(self):
        """Refresh the SDG Projects associated with the commcell."""
        self._sdg_projects = self._get_all_sdg_projects()

    def delete(self, project_name):
        """Deletes project from SDG

                Args:

                    project_name        (str)       --  Name of the project

                Returns:

                    None

                Raises:

                    SDKException:

                            if input is not valid

                            if failed to delete project

                            if response is empty or not success
        """
        if not self.has_project(project_name):
            raise SDKException('SensitiveDataGovernance', '102', "Project doesn't exists in SDG")
        project_id = self._sdg_projects[project_name.lower()]['clientId']
        self._ediscovery_clients_obj.delete(client_id=project_id)
        self.refresh()

    def add(self, project_name, inventory_name, plan_name):
        """Adds project to the SDG

                Args:

                    project_name        (str)       --  Name of the project

                    inventory_name      (str)       --  Name of inventory

                    plan_name           (str)       --  Plan name to associate with this project

                Returns:

                    obj --  Instance of Project class

                Raises:

                    SDKException:

                            if input is not valid

                            if failed to create project

                            if response is empty or not success
        """
        client_id = self._ediscovery_clients_obj.add(
            client_name=project_name,
            inventory_name=inventory_name,
            plan_name=plan_name)
        if client_id == 0:
            raise SDKException('SensitiveDataGovernance', '102', 'Failed to add project to SDG')
        self.refresh()
        return Project(commcell_object=self._commcell_object, project_name=project_name, project_id=client_id)

    def has_project(self, project_name):
        """Checks if a project exists in the commcell with the input name for SDG or not

            Args:
                project_name (str)  --  name of the project

            Returns:
                bool - boolean output whether the SDG Project exists in the commcell or not

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

        """
        if not isinstance(project_name, str):
            raise SDKException('SensitiveDataGovernance', '101')
        return self._sdg_projects and project_name.lower() in self._sdg_projects

    def get(self, project_name):
        """returns the Project object for given project name

                Args:

                    project_name         (str)       --  Name of the project

                Returns:

                    obj --  Instance of Project Class

                Raises:

                    SDKException:

                            if failed to find Project in SDG

                            if input is not valid

        """
        if not isinstance(project_name, str):
            raise SDKException('SensitiveDataGovernance', '101')
        if not self.has_project(project_name):
            raise SDKException('SensitiveDataGovernance', '103')
        project_id = self._sdg_projects[project_name.lower()]['eDiscoveryClient']['clientId']
        return Project(commcell_object=self._commcell_object, project_name=project_name, project_id=project_id)


class Project():
    """Class to represent single SDG Project in the commcell"""

    def __init__(self, commcell_object, project_name, project_id=None):
        """Initializes an instance of the Project class.

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

                project_name        (str)       --  name of the project

                project_id          (int)       --  project's pseudoclient id

            Returns:
                object  -   instance of the Project class

        """
        self._commcell_object = commcell_object
        self._update_response_ = commcell_object._update_response_
        self._cvpysdk_object = commcell_object._cvpysdk_object
        self._services = commcell_object._services
        self._project_name = project_name
        self._project_id = None
        self._project_props = None
        self._schedule_obj = None
        if project_id:
            self._project_id = project_id
        else:
            self._project_id = self._commcell_object.activate.sensitive_data_governance().get(project_name).project_id
        self._ediscovery_data_srcs_obj = EdiscoveryDataSources(self._commcell_object, self)
        self._ediscovery_client_ops = EdiscoveryClientOperations(self._commcell_object, self)
        self.refresh()

    def _response_not_success(self, response):
        """Helper function to raise an exception when reponse status is not 200 (OK).

            Args:
                response    (object)    --  response class object,

                received upon running an API request, using the `requests` python package

        """
        raise SDKException('Response', '101', self._update_response_(response.text))

    def _get_project_details(self):
        """gets SDG Project details from the commcell

                Args:

                    None

                Returns:

                    dict    --  Containing project details

                Raises:

                     Raises;

                        SDKException:

                            if failed to get project details

        """
        return self._ediscovery_data_srcs_obj.ediscovery_client_props

    def _get_schedule_object(self):
        """returns the schedule object for associated project schedule

            Args:
                None

            Returns:

                obj --  Instance of Schedule class

                None -- if no schedule exists

            Raises:

                SDKException:

                        if failed to find schedule details associated with this project
        """
        scd_obj = Schedules(self)
        if scd_obj.has_schedule():
            return scd_obj.get()
        return None

    def refresh(self):
        """Refresh the SDG project details"""
        self._project_props = self._get_project_details()
        self._schedule_obj = self._get_schedule_object()

    def add_schedule(self, schedule_name, pattern_json):
        """Creates the schedule and associate it with project

                        Args:

                            schedule_name       (str)       --  Schedule name

                            pattern_json        (dict)      --  Schedule pattern dict
                                                                    (Refer to Create_schedule_pattern in schedule.py)

                        Raises:

                              SDKException:

                                    if input is not valid

                                    if failed to create schedule

        """
        self._ediscovery_client_ops.schedule(schedule_name=schedule_name, pattern_json=pattern_json)
        self.refresh()

    def delete_schedule(self):
        """Deletes the schedule associated with project

                        Args:

                            None

                        Raises:

                              SDKException:

                                    if failed to Delete schedule

        """
        if not self._schedule_obj:
            raise SDKException('SensitiveDataGovernance', '102', "No schedule is associated to this SDG Project")
        Schedules(self).delete()
        self.refresh()

    def search(self, criteria=None, attr_list=None, params=None):
        """do searches on entire project and returns document details

            Args:

                criteria        (str)      --  containing criteria for query
                                                    (Default : None - returns all docs)

                                                    Example :

                                                        Size:[10 TO 1024]
                                                        FileName:09_23*

                attr_list       (set)      --  Column names to be returned in results.
                                                     Acts as 'fl' in query

                params          (dict)     --  Any other params which needs to be passed
                                                   Example : { "start" : "0" }

            Returns:

                int,list(dict),dict    --  Containing document count, document details & facet details(if any)

            Raises:

                SDKException:

                        if failed to perform search

        """
        return self._ediscovery_client_ops.search(criteria=criteria, attr_list=attr_list, params=params)

    def share(self, user_or_group_name, allow_edit_permission=False, is_user=True, ops_type=1):
        """Shares project with given user or user group in commcell

                Args:

                    user_or_group_name      (str)       --  Name of user or group

                    is_user                 (bool)      --  Denotes whether this is user or group name
                                                                default : True(User)

                    allow_edit_permission   (bool)      --  whether to give edit permission or not to user or group

                    ops_type                (int)       --  Operation type

                                                            Default : 1 (Add)

                                                            Supported : 1 (Add)
                                                                        3 (Delete)

                Returns:

                    None

                Raises:

                    SDKException:

                            if unable to update security associations

                            if response is empty or not success
        """
        return self._ediscovery_client_ops.share(
            user_or_group_name=user_or_group_name,
            allow_edit_permission=allow_edit_permission,
            is_user=is_user,
            ops_type=ops_type)

    def add_fs_data_source(self, server_name, data_source_name,
                           source_type=EdiscoveryConstants.SourceType.BACKUP, **kwargs):
        """Adds file system data source to project

                Args:

                    server_name         (str)       --  Server name which needs to be added

                    data_source_name    (str)       --  Name for data source

                    source_type         (enum)      --  Source type for crawl (Live source or Backedup)
                                                                Refer EdiscoveryConstants.SourceType

                Kwargs Arguments:

                    crawl_path          (list)      --  File path which needs to be crawl if source type is Live source

                    access_node         (str)       --  server name which needs to be used as access node in case
                                                                if server to be added is not a commvault client

                    country_name        (str)       --  country name where server is located (default: USA)

                    country_code        (str)       --  Country code (ISO 3166 2-letter code)

                    user_name           (str)       --  User name who has access to UNC path

                    password            (str)       --  base64 encoded password to access unc path

                    enable_monitoring   (str)       --  specifies whether to enable file monitoring or not for this

                Returns:

                    obj     --  Instance of EdiscoveryDataSource class

                Raises:

                      SDKException:

                            if plan/inventory/index server doesn't exists

                            if failed to add FS data source
        """
        inventory_name = self.project_details['inventoryDataSource']['seaDataSourceName']
        plan_name = self.project_details['plan']['planName']
        return self._ediscovery_data_srcs_obj.add_fs_data_source(
            server_name=server_name,
            data_source_name=data_source_name,
            inventory_name=inventory_name,
            plan_name=plan_name,
            source_type=source_type,
            **kwargs)

    @property
    def project_id(self):
        """returns the project psuedoclient id

                Returns:

                    int --  Pseudoclient id associated with this project

        """
        return self._project_id

    @property
    def project_name(self):
        """returns the project name

                Returns:

                    str --  project name

        """
        return self._project_name

    @property
    def project_details(self):
        """returns the project properties

            Returns:

                dict    --  Containing project properties

        """
        return self._project_props

    @property
    def data_sources_name(self):
        """returns the associated data sources to this project

            Returns:

                list --  names of data sources

        """
        return self._ediscovery_data_srcs_obj.data_sources

    @property
    def total_data_sources(self):
        """returns the total number of data sources associated with this project

            Returns:

                int --  total number of data sources

        """
        return len(self._ediscovery_data_srcs_obj.data_sources)

    @property
    def data_sources(self):
        """returns the EdiscoveryDataSources object associated to this project

            Returns:

                obj --  Instance of EdiscoveryDataSources Object

        """
        return self._ediscovery_data_srcs_obj

    @property
    def schedule(self):
        """returns the schedule object for associated schedule

                Returns:

                    obj     --  Instance of Schedule Class if schedule exists

                    None    --  If no schedule exists

        """
        return self._schedule_obj

    @property
    def sensitive_files_count(self):
        """returns the total sensitive files count on this project

            Returns:

                int --  Sensitive files count

        """
        count, _, _ = self.search(criteria=EdiscoveryConstants.CRITERIA_EXTRACTED_DOCS,
                                  params={"rows":"0"})
        return count

Classes

class Project (commcell_object, project_name, project_id=None)

Class to represent single SDG Project in the commcell

Initializes an instance of the Project class.

Args

commcell_object (object) – instance of the commcell class

project_name (str) – name of the project

project_id (int) – project's pseudoclient id

Returns

object - instance of the Project class

Expand source code Browse git
class Project():
    """Class to represent single SDG Project in the commcell"""

    def __init__(self, commcell_object, project_name, project_id=None):
        """Initializes an instance of the Project class.

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

                project_name        (str)       --  name of the project

                project_id          (int)       --  project's pseudoclient id

            Returns:
                object  -   instance of the Project class

        """
        self._commcell_object = commcell_object
        self._update_response_ = commcell_object._update_response_
        self._cvpysdk_object = commcell_object._cvpysdk_object
        self._services = commcell_object._services
        self._project_name = project_name
        self._project_id = None
        self._project_props = None
        self._schedule_obj = None
        if project_id:
            self._project_id = project_id
        else:
            self._project_id = self._commcell_object.activate.sensitive_data_governance().get(project_name).project_id
        self._ediscovery_data_srcs_obj = EdiscoveryDataSources(self._commcell_object, self)
        self._ediscovery_client_ops = EdiscoveryClientOperations(self._commcell_object, self)
        self.refresh()

    def _response_not_success(self, response):
        """Helper function to raise an exception when reponse status is not 200 (OK).

            Args:
                response    (object)    --  response class object,

                received upon running an API request, using the `requests` python package

        """
        raise SDKException('Response', '101', self._update_response_(response.text))

    def _get_project_details(self):
        """gets SDG Project details from the commcell

                Args:

                    None

                Returns:

                    dict    --  Containing project details

                Raises:

                     Raises;

                        SDKException:

                            if failed to get project details

        """
        return self._ediscovery_data_srcs_obj.ediscovery_client_props

    def _get_schedule_object(self):
        """returns the schedule object for associated project schedule

            Args:
                None

            Returns:

                obj --  Instance of Schedule class

                None -- if no schedule exists

            Raises:

                SDKException:

                        if failed to find schedule details associated with this project
        """
        scd_obj = Schedules(self)
        if scd_obj.has_schedule():
            return scd_obj.get()
        return None

    def refresh(self):
        """Refresh the SDG project details"""
        self._project_props = self._get_project_details()
        self._schedule_obj = self._get_schedule_object()

    def add_schedule(self, schedule_name, pattern_json):
        """Creates the schedule and associate it with project

                        Args:

                            schedule_name       (str)       --  Schedule name

                            pattern_json        (dict)      --  Schedule pattern dict
                                                                    (Refer to Create_schedule_pattern in schedule.py)

                        Raises:

                              SDKException:

                                    if input is not valid

                                    if failed to create schedule

        """
        self._ediscovery_client_ops.schedule(schedule_name=schedule_name, pattern_json=pattern_json)
        self.refresh()

    def delete_schedule(self):
        """Deletes the schedule associated with project

                        Args:

                            None

                        Raises:

                              SDKException:

                                    if failed to Delete schedule

        """
        if not self._schedule_obj:
            raise SDKException('SensitiveDataGovernance', '102', "No schedule is associated to this SDG Project")
        Schedules(self).delete()
        self.refresh()

    def search(self, criteria=None, attr_list=None, params=None):
        """do searches on entire project and returns document details

            Args:

                criteria        (str)      --  containing criteria for query
                                                    (Default : None - returns all docs)

                                                    Example :

                                                        Size:[10 TO 1024]
                                                        FileName:09_23*

                attr_list       (set)      --  Column names to be returned in results.
                                                     Acts as 'fl' in query

                params          (dict)     --  Any other params which needs to be passed
                                                   Example : { "start" : "0" }

            Returns:

                int,list(dict),dict    --  Containing document count, document details & facet details(if any)

            Raises:

                SDKException:

                        if failed to perform search

        """
        return self._ediscovery_client_ops.search(criteria=criteria, attr_list=attr_list, params=params)

    def share(self, user_or_group_name, allow_edit_permission=False, is_user=True, ops_type=1):
        """Shares project with given user or user group in commcell

                Args:

                    user_or_group_name      (str)       --  Name of user or group

                    is_user                 (bool)      --  Denotes whether this is user or group name
                                                                default : True(User)

                    allow_edit_permission   (bool)      --  whether to give edit permission or not to user or group

                    ops_type                (int)       --  Operation type

                                                            Default : 1 (Add)

                                                            Supported : 1 (Add)
                                                                        3 (Delete)

                Returns:

                    None

                Raises:

                    SDKException:

                            if unable to update security associations

                            if response is empty or not success
        """
        return self._ediscovery_client_ops.share(
            user_or_group_name=user_or_group_name,
            allow_edit_permission=allow_edit_permission,
            is_user=is_user,
            ops_type=ops_type)

    def add_fs_data_source(self, server_name, data_source_name,
                           source_type=EdiscoveryConstants.SourceType.BACKUP, **kwargs):
        """Adds file system data source to project

                Args:

                    server_name         (str)       --  Server name which needs to be added

                    data_source_name    (str)       --  Name for data source

                    source_type         (enum)      --  Source type for crawl (Live source or Backedup)
                                                                Refer EdiscoveryConstants.SourceType

                Kwargs Arguments:

                    crawl_path          (list)      --  File path which needs to be crawl if source type is Live source

                    access_node         (str)       --  server name which needs to be used as access node in case
                                                                if server to be added is not a commvault client

                    country_name        (str)       --  country name where server is located (default: USA)

                    country_code        (str)       --  Country code (ISO 3166 2-letter code)

                    user_name           (str)       --  User name who has access to UNC path

                    password            (str)       --  base64 encoded password to access unc path

                    enable_monitoring   (str)       --  specifies whether to enable file monitoring or not for this

                Returns:

                    obj     --  Instance of EdiscoveryDataSource class

                Raises:

                      SDKException:

                            if plan/inventory/index server doesn't exists

                            if failed to add FS data source
        """
        inventory_name = self.project_details['inventoryDataSource']['seaDataSourceName']
        plan_name = self.project_details['plan']['planName']
        return self._ediscovery_data_srcs_obj.add_fs_data_source(
            server_name=server_name,
            data_source_name=data_source_name,
            inventory_name=inventory_name,
            plan_name=plan_name,
            source_type=source_type,
            **kwargs)

    @property
    def project_id(self):
        """returns the project psuedoclient id

                Returns:

                    int --  Pseudoclient id associated with this project

        """
        return self._project_id

    @property
    def project_name(self):
        """returns the project name

                Returns:

                    str --  project name

        """
        return self._project_name

    @property
    def project_details(self):
        """returns the project properties

            Returns:

                dict    --  Containing project properties

        """
        return self._project_props

    @property
    def data_sources_name(self):
        """returns the associated data sources to this project

            Returns:

                list --  names of data sources

        """
        return self._ediscovery_data_srcs_obj.data_sources

    @property
    def total_data_sources(self):
        """returns the total number of data sources associated with this project

            Returns:

                int --  total number of data sources

        """
        return len(self._ediscovery_data_srcs_obj.data_sources)

    @property
    def data_sources(self):
        """returns the EdiscoveryDataSources object associated to this project

            Returns:

                obj --  Instance of EdiscoveryDataSources Object

        """
        return self._ediscovery_data_srcs_obj

    @property
    def schedule(self):
        """returns the schedule object for associated schedule

                Returns:

                    obj     --  Instance of Schedule Class if schedule exists

                    None    --  If no schedule exists

        """
        return self._schedule_obj

    @property
    def sensitive_files_count(self):
        """returns the total sensitive files count on this project

            Returns:

                int --  Sensitive files count

        """
        count, _, _ = self.search(criteria=EdiscoveryConstants.CRITERIA_EXTRACTED_DOCS,
                                  params={"rows":"0"})
        return count

Instance variables

var data_sources

returns the EdiscoveryDataSources object associated to this project

Returns

obj – Instance of EdiscoveryDataSources Object

Expand source code Browse git
@property
def data_sources(self):
    """returns the EdiscoveryDataSources object associated to this project

        Returns:

            obj --  Instance of EdiscoveryDataSources Object

    """
    return self._ediscovery_data_srcs_obj
var data_sources_name

returns the associated data sources to this project

Returns

list – names of data sources

Expand source code Browse git
@property
def data_sources_name(self):
    """returns the associated data sources to this project

        Returns:

            list --  names of data sources

    """
    return self._ediscovery_data_srcs_obj.data_sources
var project_details

returns the project properties

Returns

dict – Containing project properties

Expand source code Browse git
@property
def project_details(self):
    """returns the project properties

        Returns:

            dict    --  Containing project properties

    """
    return self._project_props
var project_id

returns the project psuedoclient id

Returns

int – Pseudoclient id associated with this project

Expand source code Browse git
@property
def project_id(self):
    """returns the project psuedoclient id

            Returns:

                int --  Pseudoclient id associated with this project

    """
    return self._project_id
var project_name

returns the project name

Returns

str – project name

Expand source code Browse git
@property
def project_name(self):
    """returns the project name

            Returns:

                str --  project name

    """
    return self._project_name
var schedule

returns the schedule object for associated schedule

Returns

obj – Instance of Schedule Class if schedule exists

None – If no schedule exists

Expand source code Browse git
@property
def schedule(self):
    """returns the schedule object for associated schedule

            Returns:

                obj     --  Instance of Schedule Class if schedule exists

                None    --  If no schedule exists

    """
    return self._schedule_obj
var sensitive_files_count

returns the total sensitive files count on this project

Returns

int – Sensitive files count

Expand source code Browse git
@property
def sensitive_files_count(self):
    """returns the total sensitive files count on this project

        Returns:

            int --  Sensitive files count

    """
    count, _, _ = self.search(criteria=EdiscoveryConstants.CRITERIA_EXTRACTED_DOCS,
                              params={"rows":"0"})
    return count
var total_data_sources

returns the total number of data sources associated with this project

Returns

int – total number of data sources

Expand source code Browse git
@property
def total_data_sources(self):
    """returns the total number of data sources associated with this project

        Returns:

            int --  total number of data sources

    """
    return len(self._ediscovery_data_srcs_obj.data_sources)

Methods

def add_fs_data_source(self, server_name, data_source_name, source_type=SourceType.BACKUP, **kwargs)

Adds file system data source to project

Args

server_name (str) – Server name which needs to be added

data_source_name (str) – Name for data source

source_type (enum) – Source type for crawl (Live source or Backedup) Refer EdiscoveryConstants.SourceType Kwargs Arguments:

crawl_path          (list)      --  File path which needs to be crawl if source type is Live source

access_node         (str)       --  server name which needs to be used as access node in case
                                            if server to be added is not a commvault client

country_name        (str)       --  country name where server is located (default: USA)

country_code        (str)       --  Country code (ISO 3166 2-letter code)

user_name           (str)       --  User name who has access to UNC path

password            (str)       --  base64 encoded password to access unc path

enable_monitoring   (str)       --  specifies whether to enable file monitoring or not for this

Returns

obj – Instance of EdiscoveryDataSource class

Raises

SDKException:

  if plan/inventory/index server doesn't exists

  if failed to add FS data source
Expand source code Browse git
def add_fs_data_source(self, server_name, data_source_name,
                       source_type=EdiscoveryConstants.SourceType.BACKUP, **kwargs):
    """Adds file system data source to project

            Args:

                server_name         (str)       --  Server name which needs to be added

                data_source_name    (str)       --  Name for data source

                source_type         (enum)      --  Source type for crawl (Live source or Backedup)
                                                            Refer EdiscoveryConstants.SourceType

            Kwargs Arguments:

                crawl_path          (list)      --  File path which needs to be crawl if source type is Live source

                access_node         (str)       --  server name which needs to be used as access node in case
                                                            if server to be added is not a commvault client

                country_name        (str)       --  country name where server is located (default: USA)

                country_code        (str)       --  Country code (ISO 3166 2-letter code)

                user_name           (str)       --  User name who has access to UNC path

                password            (str)       --  base64 encoded password to access unc path

                enable_monitoring   (str)       --  specifies whether to enable file monitoring or not for this

            Returns:

                obj     --  Instance of EdiscoveryDataSource class

            Raises:

                  SDKException:

                        if plan/inventory/index server doesn't exists

                        if failed to add FS data source
    """
    inventory_name = self.project_details['inventoryDataSource']['seaDataSourceName']
    plan_name = self.project_details['plan']['planName']
    return self._ediscovery_data_srcs_obj.add_fs_data_source(
        server_name=server_name,
        data_source_name=data_source_name,
        inventory_name=inventory_name,
        plan_name=plan_name,
        source_type=source_type,
        **kwargs)
def add_schedule(self, schedule_name, pattern_json)

Creates the schedule and associate it with project

Args

schedule_name (str) – Schedule name

pattern_json (dict) – Schedule pattern dict (Refer to Create_schedule_pattern in schedule.py)

Raises

SDKException:

  if input is not valid

  if failed to create schedule
Expand source code Browse git
def add_schedule(self, schedule_name, pattern_json):
    """Creates the schedule and associate it with project

                    Args:

                        schedule_name       (str)       --  Schedule name

                        pattern_json        (dict)      --  Schedule pattern dict
                                                                (Refer to Create_schedule_pattern in schedule.py)

                    Raises:

                          SDKException:

                                if input is not valid

                                if failed to create schedule

    """
    self._ediscovery_client_ops.schedule(schedule_name=schedule_name, pattern_json=pattern_json)
    self.refresh()
def delete_schedule(self)

Deletes the schedule associated with project

Args

None

Raises

SDKException:

  if failed to Delete schedule
Expand source code Browse git
def delete_schedule(self):
    """Deletes the schedule associated with project

                    Args:

                        None

                    Raises:

                          SDKException:

                                if failed to Delete schedule

    """
    if not self._schedule_obj:
        raise SDKException('SensitiveDataGovernance', '102', "No schedule is associated to this SDG Project")
    Schedules(self).delete()
    self.refresh()
def refresh(self)

Refresh the SDG project details

Expand source code Browse git
def refresh(self):
    """Refresh the SDG project details"""
    self._project_props = self._get_project_details()
    self._schedule_obj = self._get_schedule_object()
def search(self, criteria=None, attr_list=None, params=None)

do searches on entire project and returns document details

Args

criteria (str) – containing criteria for query (Default : None - returns all docs)

                                Example :

                                    Size:[10 TO 1024]
                                    FileName:09_23*

attr_list (set) – Column names to be returned in results. Acts as 'fl' in query

params (dict) – Any other params which needs to be passed Example : { "start" : "0" }

Returns

int,list(dict),dict – Containing document count, document details & facet details(if any)

Raises

SDKException:

    if failed to perform search
Expand source code Browse git
def search(self, criteria=None, attr_list=None, params=None):
    """do searches on entire project and returns document details

        Args:

            criteria        (str)      --  containing criteria for query
                                                (Default : None - returns all docs)

                                                Example :

                                                    Size:[10 TO 1024]
                                                    FileName:09_23*

            attr_list       (set)      --  Column names to be returned in results.
                                                 Acts as 'fl' in query

            params          (dict)     --  Any other params which needs to be passed
                                               Example : { "start" : "0" }

        Returns:

            int,list(dict),dict    --  Containing document count, document details & facet details(if any)

        Raises:

            SDKException:

                    if failed to perform search

    """
    return self._ediscovery_client_ops.search(criteria=criteria, attr_list=attr_list, params=params)
def share(self, user_or_group_name, allow_edit_permission=False, is_user=True, ops_type=1)

Shares project with given user or user group in commcell

Args

user_or_group_name (str) – Name of user or group

is_user (bool) – Denotes whether this is user or group name default : True(User)

allow_edit_permission (bool) – whether to give edit permission or not to user or group

ops_type (int) – Operation type

                                    Default : 1 (Add)

                                    Supported : 1 (Add)
                                                3 (Delete)

Returns

None

Raises

SDKException:

    if unable to update security associations

    if response is empty or not success
Expand source code Browse git
def share(self, user_or_group_name, allow_edit_permission=False, is_user=True, ops_type=1):
    """Shares project with given user or user group in commcell

            Args:

                user_or_group_name      (str)       --  Name of user or group

                is_user                 (bool)      --  Denotes whether this is user or group name
                                                            default : True(User)

                allow_edit_permission   (bool)      --  whether to give edit permission or not to user or group

                ops_type                (int)       --  Operation type

                                                        Default : 1 (Add)

                                                        Supported : 1 (Add)
                                                                    3 (Delete)

            Returns:

                None

            Raises:

                SDKException:

                        if unable to update security associations

                        if response is empty or not success
    """
    return self._ediscovery_client_ops.share(
        user_or_group_name=user_or_group_name,
        allow_edit_permission=allow_edit_permission,
        is_user=is_user,
        ops_type=ops_type)
class Projects (commcell_object)

Class for representing all SDG Projects in the commcell.

Initializes an instance of the Projects class.

Args

commcell_object (object) – instance of the commcell class

Returns

object - instance of the Projects class

Expand source code Browse git
class Projects():
    """Class for representing all SDG Projects in the commcell."""

    def __init__(self, commcell_object):
        """Initializes an instance of the Projects class.

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

            Returns:
                object  -   instance of the Projects class

        """
        self._commcell_object = commcell_object
        self._update_response_ = commcell_object._update_response_
        self._cvpysdk_object = commcell_object._cvpysdk_object
        self._services = commcell_object._services
        self._sdg_projects = None
        self._ediscovery_clients_obj = EdiscoveryClients(self._commcell_object, self)
        self.refresh()

    def _response_not_success(self, response):
        """Helper function to raise an exception when reponse status is not 200 (OK).

            Args:
                response    (object)    --  response class object,

                received upon running an API request, using the `requests` python package

        """
        raise SDKException('Response', '101', self._update_response_(response.text))

    def _get_all_sdg_projects(self):
        """Returns all the SDG Projects found in the commcell

                Args:

                    None

                Returns:

                    dict        --  Containing SDG Project details

                Raises;

                    SDKException:

                            if failed to get SDG Project details

                            if response is empty

                            if response is not success
        """
        return self._ediscovery_clients_obj.get_ediscovery_projects()

    def refresh(self):
        """Refresh the SDG Projects associated with the commcell."""
        self._sdg_projects = self._get_all_sdg_projects()

    def delete(self, project_name):
        """Deletes project from SDG

                Args:

                    project_name        (str)       --  Name of the project

                Returns:

                    None

                Raises:

                    SDKException:

                            if input is not valid

                            if failed to delete project

                            if response is empty or not success
        """
        if not self.has_project(project_name):
            raise SDKException('SensitiveDataGovernance', '102', "Project doesn't exists in SDG")
        project_id = self._sdg_projects[project_name.lower()]['clientId']
        self._ediscovery_clients_obj.delete(client_id=project_id)
        self.refresh()

    def add(self, project_name, inventory_name, plan_name):
        """Adds project to the SDG

                Args:

                    project_name        (str)       --  Name of the project

                    inventory_name      (str)       --  Name of inventory

                    plan_name           (str)       --  Plan name to associate with this project

                Returns:

                    obj --  Instance of Project class

                Raises:

                    SDKException:

                            if input is not valid

                            if failed to create project

                            if response is empty or not success
        """
        client_id = self._ediscovery_clients_obj.add(
            client_name=project_name,
            inventory_name=inventory_name,
            plan_name=plan_name)
        if client_id == 0:
            raise SDKException('SensitiveDataGovernance', '102', 'Failed to add project to SDG')
        self.refresh()
        return Project(commcell_object=self._commcell_object, project_name=project_name, project_id=client_id)

    def has_project(self, project_name):
        """Checks if a project exists in the commcell with the input name for SDG or not

            Args:
                project_name (str)  --  name of the project

            Returns:
                bool - boolean output whether the SDG Project exists in the commcell or not

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

        """
        if not isinstance(project_name, str):
            raise SDKException('SensitiveDataGovernance', '101')
        return self._sdg_projects and project_name.lower() in self._sdg_projects

    def get(self, project_name):
        """returns the Project object for given project name

                Args:

                    project_name         (str)       --  Name of the project

                Returns:

                    obj --  Instance of Project Class

                Raises:

                    SDKException:

                            if failed to find Project in SDG

                            if input is not valid

        """
        if not isinstance(project_name, str):
            raise SDKException('SensitiveDataGovernance', '101')
        if not self.has_project(project_name):
            raise SDKException('SensitiveDataGovernance', '103')
        project_id = self._sdg_projects[project_name.lower()]['eDiscoveryClient']['clientId']
        return Project(commcell_object=self._commcell_object, project_name=project_name, project_id=project_id)

Methods

def add(self, project_name, inventory_name, plan_name)

Adds project to the SDG

Args

project_name (str) – Name of the project

inventory_name (str) – Name of inventory

plan_name (str) – Plan name to associate with this project

Returns

obj – Instance of Project class

Raises

SDKException:

    if input is not valid

    if failed to create project

    if response is empty or not success
Expand source code Browse git
def add(self, project_name, inventory_name, plan_name):
    """Adds project to the SDG

            Args:

                project_name        (str)       --  Name of the project

                inventory_name      (str)       --  Name of inventory

                plan_name           (str)       --  Plan name to associate with this project

            Returns:

                obj --  Instance of Project class

            Raises:

                SDKException:

                        if input is not valid

                        if failed to create project

                        if response is empty or not success
    """
    client_id = self._ediscovery_clients_obj.add(
        client_name=project_name,
        inventory_name=inventory_name,
        plan_name=plan_name)
    if client_id == 0:
        raise SDKException('SensitiveDataGovernance', '102', 'Failed to add project to SDG')
    self.refresh()
    return Project(commcell_object=self._commcell_object, project_name=project_name, project_id=client_id)
def delete(self, project_name)

Deletes project from SDG

Args

project_name (str) – Name of the project

Returns

None

Raises

SDKException:

    if input is not valid

    if failed to delete project

    if response is empty or not success
Expand source code Browse git
def delete(self, project_name):
    """Deletes project from SDG

            Args:

                project_name        (str)       --  Name of the project

            Returns:

                None

            Raises:

                SDKException:

                        if input is not valid

                        if failed to delete project

                        if response is empty or not success
    """
    if not self.has_project(project_name):
        raise SDKException('SensitiveDataGovernance', '102', "Project doesn't exists in SDG")
    project_id = self._sdg_projects[project_name.lower()]['clientId']
    self._ediscovery_clients_obj.delete(client_id=project_id)
    self.refresh()
def get(self, project_name)

returns the Project object for given project name

Args

project_name (str) – Name of the project

Returns

obj – Instance of Project Class

Raises

SDKException:

    if failed to find Project in SDG

    if input is not valid
Expand source code Browse git
def get(self, project_name):
    """returns the Project object for given project name

            Args:

                project_name         (str)       --  Name of the project

            Returns:

                obj --  Instance of Project Class

            Raises:

                SDKException:

                        if failed to find Project in SDG

                        if input is not valid

    """
    if not isinstance(project_name, str):
        raise SDKException('SensitiveDataGovernance', '101')
    if not self.has_project(project_name):
        raise SDKException('SensitiveDataGovernance', '103')
    project_id = self._sdg_projects[project_name.lower()]['eDiscoveryClient']['clientId']
    return Project(commcell_object=self._commcell_object, project_name=project_name, project_id=project_id)
def has_project(self, project_name)

Checks if a project exists in the commcell with the input name for SDG or not

Args

project_name (str) – name of the project

Returns

bool - boolean output whether the SDG Project exists in the commcell or not

Raises

SDKException: if type of the project name argument is not string

Expand source code Browse git
def has_project(self, project_name):
    """Checks if a project exists in the commcell with the input name for SDG or not

        Args:
            project_name (str)  --  name of the project

        Returns:
            bool - boolean output whether the SDG Project exists in the commcell or not

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

    """
    if not isinstance(project_name, str):
        raise SDKException('SensitiveDataGovernance', '101')
    return self._sdg_projects and project_name.lower() in self._sdg_projects
def refresh(self)

Refresh the SDG Projects associated with the commcell.

Expand source code Browse git
def refresh(self):
    """Refresh the SDG Projects associated with the commcell."""
    self._sdg_projects = self._get_all_sdg_projects()