Module cvpysdk.activateapps.inventory_manager

Main file for performing operations on inventory manager app under Activate.

Inventories, Inventory, Assets & Asset are the four classes defined in this file

Inventories: class for representing all inventories in the commcell

Inventory: class for representing a single inventory in the commcell

Assets: class for representing all assets in an inventory

Asset: class to represent single asset in an inventory

Inventories

init() – initialise object of the Inventories class

_get_inventories() – Gets all inventories in the commcell

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

refresh() – refresh the Inventories from the commcell

get_properties() – returns the properties for given inventory name

has_inventory() – Checks if a given inventory name exists in the commcell or not

get() – returns the Inventory class object for given inventory name

add() – add inventory to the commcell

delete() – delete inventory from the commcell

Inventory

init() – initialise object of the Inventory class

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

_get_inventory_properties() – Gets all the properties of this inventory

_get_schedule_object() – returns the schedule class object associated to this inventory

_get_data_source_handler_object() – returns the datasource and default handler object for this inventory

_get_permission() – returns the security associations for this inventory

refresh() – refresh the properties of the inventory

get_assets() – returns the Assets class object for this inventory

share() – shares inventory with other user or user group

start_collection() – starts collection job on this inventory

get_inventory_data() – returns data from inventory

Inventory Attributes

**properties**              --  returns properties of the inventory

**index_server_name**       --  returns the index server name associated with this inventory

**_index_server_cloud_id**  --  returns the index server cloudid associated with this inventory

**inventory_name**          --  returns the inventory name

**inventory_id**            --  returns the inventory id

**security_associations**   --  returns the security associations blob of this inventory

**schedule**                --  returns the schedule object associated with this inventory

**data_source**             --  returns the DataSource object associated with this inventory

**handler**                 --  returns the default handler object for this inventory

Assets

init() – initialise object of the Assets class

refresh() – refresh the assets associated with inventory

add() – adds asset to the inventory

get() – returns the instance of Asset class based on given asset name

has_asset() – returns whether given asset exists or not in inventory

delete() – deletes the asset from the inventory

_get_assets_properties() – returns the assets properties

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

Assets Attributes:

**assets**                  --  returns the assets details as json

Asset

init() – initialise object of the Asset class

_get_properties() – returns the properties of the asset

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

refresh() – refresh the asset associated with inventory

get_job_history() – returns the job history details of this asset

get_job_status() – returns the latest job status details of this asset

get_asset_prop() – returns the asset property value for the given property name

Asset Attributes:

    **asset_id**            --      returns the id of asset

    **asset_name**          --      returns the name of asset

    **asset_type**          --      returns the type of asset

    **crawl_start_time**    --      returns the last crawl start time of asset

    **asset_props**         --      returns the properties(name/value pair) of asset

    **asset_status**        --      returns the status of asset

    **inventory_id**        --      returns the inventory id of this asset
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 inventory manager app under Activate.

Inventories, Inventory, Assets & Asset are the four classes defined in this file

Inventories: class for representing all inventories in the commcell

Inventory: class for representing a single inventory in the commcell

Assets: class for representing all assets in an inventory

Asset: class to represent single asset in an inventory

Inventories:

            __init__()                          --  initialise object of the Inventories class

            _get_inventories()                  --  Gets all inventories in the commcell

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

             refresh()                          --  refresh the Inventories from the commcell

             get_properties()                   --  returns the properties for given inventory name

             has_inventory()                    --  Checks if a given inventory name exists in the commcell or not

             get()                              --  returns the Inventory class object for given inventory name

             add()                              --  add inventory to the commcell

             delete()                           --  delete inventory from the commcell


Inventory:

            __init__()                          --  initialise object of the Inventory class

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

            _get_inventory_properties()         --  Gets all the properties of this inventory

             _get_schedule_object()             --  returns the schedule class object associated to this inventory

            _get_data_source_handler_object()   --  returns the datasource and default handler object for this inventory

            _get_permission()                   --  returns the security associations for this inventory

            refresh()                           --  refresh the properties of the inventory

            get_assets()                        --  returns the Assets class object for this inventory

            share()                             --  shares inventory with other user or user group

            start_collection()                  --  starts collection job on this inventory

            get_inventory_data()                --  returns data from inventory

Inventory Attributes
-----------------

    **properties**              --  returns properties of the inventory

    **index_server_name**       --  returns the index server name associated with this inventory

    **_index_server_cloud_id**  --  returns the index server cloudid associated with this inventory

    **inventory_name**          --  returns the inventory name

    **inventory_id**            --  returns the inventory id

    **security_associations**   --  returns the security associations blob of this inventory

    **schedule**                --  returns the schedule object associated with this inventory

    **data_source**             --  returns the DataSource object associated with this inventory

    **handler**                 --  returns the default handler object for this inventory

Assets:

        __init__()                          --  initialise object of the Assets class

        refresh()                           --  refresh the assets associated with inventory

        add()                               --  adds asset to the inventory

        get()                               --  returns the instance of Asset class based on given asset name

        has_asset()                         --  returns whether given asset exists or not in inventory

        delete()                            --  deletes the asset from the inventory

        _get_assets_properties()            --  returns the assets properties

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

Assets Attributes:
----------------

    **assets**                  --  returns the assets details as json

Asset:

        __init__()                          --  initialise object of the Asset class

        _get_properties()                   --  returns the properties of the asset

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

        refresh()                           --  refresh the asset associated with inventory

        get_job_history()                   --  returns the job history details of this asset

        get_job_status()                    --  returns the latest job status details of this asset

        get_asset_prop()                    --  returns the asset property value for the given property name


Asset Attributes:
-----------------

        **asset_id**            --      returns the id of asset

        **asset_name**          --      returns the name of asset

        **asset_type**          --      returns the type of asset

        **crawl_start_time**    --      returns the last crawl start time of asset

        **asset_props**         --      returns the properties(name/value pair) of asset

        **asset_status**        --      returns the status of asset

        **inventory_id**        --      returns the inventory id of this asset


"""
import copy

from ..activateapps.constants import InventoryConstants
from ..schedules import Schedules
from ..exception import SDKException


class Inventories():
    """Class for representing all inventories in the commcell."""

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

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

            Returns:
                object  -   instance of the Inventories 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._inventories = None
        self._API_INVENTORIES = self._services['EDISCOVERY_INVENTORIES']
        self._API_DELETE_INVENTORY = self._services['EDISCOVERY_INVENTORY']
        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_inventories(self):
        """Gets all inventories from the commcell

            Args:

                None

            Return:

                list(dict)        --  list Containing inventory details dict

            Raises:

                SDKException:

                    if response is empty

                    if response is not success

        """
        output = {}
        flag, response = self._cvpysdk_object.make_request(
            'GET', self._API_INVENTORIES
        )
        if flag:
            if response.json() and 'inventories' in response.json():
                inventories = response.json()['inventories']
                for inventory in inventories:
                    output[inventory['displayName'].lower()] = inventory
                return output
            raise SDKException('Inventory', '103')
        self._response_not_success(response)

    def add(self, inventory_name, index_server, name_server=None):
        """Adds inventory to the commcell with given inputs

                Args:

                    inventory_name              (str)       --  Name of the inventory

                    index_server                (str)       --  Index server name

                    name_server                 (list)      --  Name server assets which needs to be added to inventory

                Returns:

                    object  --  Instance of Inventory Class

                Raises:

                    SDKException:

                            if input data type is not valid

                            if failed to add inventory

                            if Index Server doesn't exists in commcell

        """
        if not isinstance(inventory_name, str) or not isinstance(index_server, str):
            raise SDKException('Inventory', '101')
        req_json = copy.deepcopy(InventoryConstants.INVENTORY_ADD_REQUEST_JSON)
        if name_server:
            req_json['identityServers'] = name_server
        req_json['name'] = inventory_name
        if not self._commcell_object.index_servers.has(index_server):
            raise SDKException('Inventory', '102', "Given index server name not exists on this commcell")
        index_server_obj = self._commcell_object.index_servers.get(index_server)
        req_json['indexServer']['cloudId'] = index_server_obj.cloud_id
        req_json['indexServer']['displayName'] = index_server_obj.cloud_name
        flag, response = self._cvpysdk_object.make_request(
            'POST', self._API_INVENTORIES, req_json
        )
        if flag:
            if response.json():
                if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                    raise SDKException(
                        'Inventory',
                        '102',
                        f"Failed to create inventory with error [{response.json()['errorMessage']}]")
                elif 'name' in response.json():
                    inventory = response.json()['name']
                    inventory_id = response.json()['id']
                    self.refresh()
                    return Inventory(self._commcell_object, inventory_name, inventory_id)
                raise SDKException('Inventory', '102', f"Failed to create inventory with response - {response.json()}")
            raise SDKException('Inventory', '105')
        self._response_not_success(response)

    def delete(self, inventory_name):
        """Deletes the inventory from the commcell

                Args:

                    inventory_name      (str)       --  Inventory name to be deleted

                Returns:
                    None

                Raises:

                    SDKException:

                            if unable to find inventory

                            if failed to delete inventory

                            if input type is not valid

        """
        if not isinstance(inventory_name, str):
            raise SDKException('Inventory', '101')
        if not self.has_inventory(inventory_name):
            raise SDKException('Inventory', '106')
        flag, response = self._cvpysdk_object.make_request(
            'DELETE', self._API_DELETE_INVENTORY % self._inventories[inventory_name.lower()]['id']
        )
        if flag:
            if response.json():
                if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                    raise SDKException(
                        'Inventory',
                        '102',
                        f"Failed to Delete inventory with error [{response.json()['errorMessage']}]")
                self.refresh()
            else:
                raise SDKException('Inventory', '107')
        else:
            self._response_not_success(response)

    def refresh(self):
        """Refresh the inventories associated with the commcell."""
        self._inventories = self._get_inventories()

    def get_properties(self, inventory_name):
        """Returns a properties of the specified Inventory

            Args:
                inventory_name (str)  --  name of the inventory

            Returns:
                dict -  properties for the given inventory name


        """
        return self._inventories[inventory_name.lower()]

    def has_inventory(self, inventory_name):
        """Checks if a inventory exists in the commcell with the input name.

            Args:
                inventory_name (str)  --  name of the inventory

            Returns:
                bool - boolean output to specify whether the inventory exists in the commcell or not

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

        """
        if not isinstance(inventory_name, str):
            raise SDKException('Inventory', '101')

        return self._inventories and inventory_name.lower() in map(str.lower, self._inventories)

    def get(self, inventory_name):
        """Returns a Inventory object for the given inventory name.

            Args:
                inventory_name (str)  --  name of the inventory

            Returns:

                obj                 -- Object of Inventory class

            Raises:

                SDKException:

                    if inventory doesn't exists in commcell

                    if inventory_name is not of type string


        """
        if not isinstance(inventory_name, str):
            raise SDKException('Inventory', '101')

        if self.has_inventory(inventory_name):
            inventory_id = self._inventories[inventory_name.lower()]['id']
            return Inventory(self._commcell_object, inventory_name, inventory_id)
        raise SDKException('Inventory', '106')


class Inventory():
    """Class for performing operations on a single inventory"""

    def __init__(self, commcell_object, inventory_name, inventory_id=None):
        """Initialize an object of the Inventory class.

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

                inventory_name     (str)        --  name of the Inventory

                inventory_id       (str)        --  id of Inventory
                    default: None

            Returns:
                object  -   instance of the Inventory class
        """
        self._commcell_object = commcell_object
        self._update_response_ = commcell_object._update_response_
        self._services = commcell_object._services
        self._cvpysdk_obj = self._commcell_object._cvpysdk_object
        self._inventory_id = None
        self._inventory_name = inventory_name
        self._inventory_props = None
        self._index_server_name = None
        self._index_server_cloud_id = None
        self._security_associations = None
        self._schedule = None
        self._data_source = None
        self._handler = None
        self._API_GET_INVENTORY_DETAILS = self._services['EDISCOVERY_INVENTORY']
        self._API_SECURITY_ENTITY = self._services['ENTITY_SECURITY_ASSOCIATION']
        self._API_GET_DEFAULT_HANDLER = self._services['EDISCOVERY_GET_DEFAULT_HANDLER']
        self._API_PERMISSION = self._services['V4_ACTIVATE_DS_PERMISSION']
        self._API_CRAWL = self._services['V4_INVENTORY_CRAWL']

        if not inventory_id:
            self._inventory_id = self._commcell_object.activate.inventory_manager().get(inventory_name).inventory_id
        else:
            self._inventory_id = inventory_id
        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_permission(self):
        """returns security association blob for this inventory

                Args:

                    None

                Returns:

                    dict    --  Security association blob

        """
        flag, response = self._cvpysdk_obj.make_request(
            'GET', self._API_PERMISSION % self._inventory_id
        )
        if flag:
            if response.json() and 'securityAssociations' in response.json():
                return response.json()['securityAssociations']
            raise SDKException('Inventory', '102', "Inventory permission fetch failed")
        self._response_not_success(response)

    def _get_inventory_properties(self):
        """ Get inventory properties from the commcell
                Args:

                    None

                Returns:

                    dict        --  Properties of inventory

        """
        flag, response = self._cvpysdk_obj.make_request(
            'GET', self._API_GET_INVENTORY_DETAILS % self._inventory_id
        )
        if flag:
            if response.json():
                inventory_props = response.json()
                self._index_server_name = inventory_props['indexServer']['displayName']
                self._index_server_cloud_id = inventory_props['indexServer']['cloudId']
                self._inventory_name = inventory_props['displayName']
                return inventory_props
            raise SDKException('Inventory', '104')
        self._response_not_success(response)

    def refresh(self):
        """Refresh the inventory details for associated object"""
        self._inventory_props = self._get_inventory_properties()
        self._schedule = self._get_schedule_object()
        self._data_source, self._handler = self._get_data_source_handler_object()
        self._security_associations = self._get_permission()

    def get_assets(self):
        """Returns the Assets class instance for this inventory

                Args:

                    None

                Returns:

                    object      --  Instance of Assets class

        """
        return Assets(self._commcell_object, self.inventory_name, self.inventory_id)

    def start_collection(self):
        """Starts collection job on this inventory

                Args:

                    None

                Return:

                    None

                Raises:

                    SDKException:

                            if failed to start collection job

        """
        flag, response = self._cvpysdk_obj.make_request(
            'PUT', self._API_CRAWL % self._inventory_id
        )
        if flag:
            if response.json():
                if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                    raise SDKException(
                        'Inventory',
                        '102',
                        f"Failed to start crawl on inventory with error [{response.json()['errorMessage']}]")
                return
            else:
                raise SDKException('Inventory', '102', "Unknown response while starting collection job on inventory")
        else:
            self._response_not_success(response)

    def share(self, user_or_group_name, allow_edit_permission=False, is_user=True, ops_type=1):
        """Shares inventory 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
        """
        if not isinstance(user_or_group_name, str):
            raise SDKException('Inventory', '101')
        request_json = copy.deepcopy(InventoryConstants.INVENTORY_SHARE_REQUEST_JSON)
        external_user = False
        association_response = None
        if ops_type == 1 and len(self.security_associations) > 1:
            association_request_json = copy.deepcopy(InventoryConstants.INVENTORY_SHARE_REQUEST_JSON)
            del association_request_json['securityAssociations']
            association_request_json['entityAssociated']['entity'][0]['seaDataSourceId'] = int(self.inventory_id)
            # get security blob for this data source type entity - 132
            flag, response = self._cvpysdk_obj.make_request(
                'GET', self._API_SECURITY_ENTITY % (132, int(self.inventory_id)), association_request_json
            )
            if flag:
                if response.json() and 'securityAssociations' in response.json():
                    association_response = response.json(
                    )['securityAssociations'][0]['securityAssociations']['associations']
                else:
                    raise SDKException('Inventory', '102', 'Failed to get existing security associations')
            else:
                response_string = self._commcell_object._update_response_(response.text)
                raise SDKException('Response', '101', response_string)

        if '\\' in user_or_group_name:
            external_user = True
        if is_user:
            user_obj = self._commcell_object.users.get(user_or_group_name)
            user_id = user_obj.user_id
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['userId'] = int(user_id)
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['_type_'] = 13
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['userName'] = user_or_group_name
        elif external_user:
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['groupId'] = 0
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['_type_'] = 62
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0][
                'externalGroupName'] = user_or_group_name
        else:
            grp_obj = self._commcell_object.user_groups.get(user_or_group_name)
            grp_id = grp_obj.user_group_id
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['userGroupId'] = int(grp_id)
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['_type_'] = 15
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0][
                'userGroupName'] = user_or_group_name

        request_json['entityAssociated']['entity'][0]['seaDataSourceId'] = self.inventory_id
        request_json['securityAssociations']['associationsOperationType'] = ops_type

        if allow_edit_permission:
            request_json['securityAssociations']['associations'][0]['properties']['categoryPermission']['categoriesPermissionList'].append(
                InventoryConstants.EDIT_CATEGORY_PERMISSION)

            # Associate existing associations to the request
        if ops_type == 1 and len(self.security_associations) > 1:
            request_json['securityAssociations']['associations'].extend(association_response)

        flag, response = self._cvpysdk_obj.make_request(
            'PUT', self._API_PERMISSION % self._inventory_id, request_json
        )
        if flag:
            if response.json():
                error_code = response.json()['errorCode']
                if error_code != 0:
                    error_message = response.json()['errorString']
                    raise SDKException(
                        'Inventory',
                        '102', error_message)
                # update association list by refreshing inventory
                self.refresh()
            else:
                raise SDKException('Inventory', '111')
        else:
            response_string = self._commcell_object._update_response_(response.text)
            raise SDKException('Response', '101', response_string)

    def _get_data_source_handler_object(self):
        """returns the data source and handler object associated with this inventory

                Args:
                    None

                Returns:
                    obj,obj     --  Instance of DataSource object,Instance of Handler object

                Raises:

                    SDKException:

                            if failed to get datasource or handler details
        """
        flag, response = self._cvpysdk_obj.make_request(
            'GET', self._API_GET_DEFAULT_HANDLER % self.inventory_id)
        if flag:
            if response.json() and 'handlerInfos' in response.json():
                handler_list = response.json()['handlerInfos']
                if not isinstance(handler_list, list):
                    raise SDKException('Inventory', '102', "Failed to get Datasource/Handler details")
                handler_details = handler_list[0]
                ds_name = handler_details['dataSourceName']
                handler_name = handler_details['handlerName']
                ds_obj = self._commcell_object.datacube.datasources.get(ds_name)
                handler_obj = ds_obj.ds_handlers.get(handler_name)
                return ds_obj, handler_obj
            raise SDKException('Inventory', '102', 'Unknown response while fetching datasource details')
        response_string = self._commcell_object._update_response_(response.text)
        raise SDKException('Response', '101', response_string)

    def _get_schedule_object(self):
        """Returns the schedule class object of schedule associated to this inventory

                Args:

                    None

                Returns:

                    object      --  Instance of Schedule class

                Raises:

                    SDKException:

                            if failed to find schedule
        """
        return Schedules(self).get()

    def get_inventory_data(self, handler_filter=""):
        """ Executes handler for fetching data from inventory
                Args:

                     handler_filter    (str)  -- Filter which needs to applied for handler execution

                Returns:

                    dict        --  Dictionary of values fetched from handler execution

                Raises:

                    SDKExpception:

                        if error in fetching handler data

                        if input is not valid
        """
        if not isinstance(handler_filter, str):
            raise SDKException('Inventory', '101')
        if not self._handler:
            raise SDKException('Inventory', '102', 'No handler object initialised')
        return self._handler.get_handler_data(handler_filter=handler_filter)

    @property
    def properties(self):
        """Returns the properties of this inventory as dict"""
        return self._inventory_props

    @property
    def index_server_name(self):
        """Returns the index server name associated with this inventory"""
        return self._index_server_name

    @property
    def index_server_cloud_id(self):
        """Returns the index server id associated with this inventory"""
        return self._index_server_cloud_id

    @property
    def inventory_id(self):
        """Returns the inventory id associated with this inventory"""
        return self._inventory_id

    @property
    def inventory_name(self):
        """Returns the inventory name associated with this inventory"""
        return self._inventory_name

    @property
    def security_associations(self):
        """Returns the security blob associated with this inventory"""
        return self._security_associations

    @property
    def schedule(self):
        """Returns the schedule class object for schedule associated with this inventory"""
        return self._schedule

    @property
    def data_source(self):
        """Returns the DataSource class object for datasource associated with this inventory"""
        return self._data_source

    @property
    def handler(self):
        """Returns the Handler class object for default handler associated with this inventory"""
        return self._handler


class Assets():
    """Class to represent all assets in an inventory"""

    def __init__(self, commcell_object, inventory_name, inventory_id=None):
        """Initialize an object of the Assets class.

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

                inventory_name     (str)        --  name of the Inventory

                inventory_id       (str)        --  id of Inventory
                    default: None

            Returns:
                object  -   instance of the Assets class
        """
        self._commcell_object = commcell_object
        self._update_response_ = commcell_object._update_response_
        self._services = commcell_object._services
        self._cvpysdk_obj = self._commcell_object._cvpysdk_object
        self._inventory_id = None
        self._inventory_name = inventory_name
        if not inventory_id:
            self._inventory_id = self._commcell_object.activate.inventory_manager().get(inventory_name).inventory_id
        else:
            self._inventory_id = inventory_id
        self._assets = None
        self._API_ASSETS = self._services['EDISCOVERY_ASSETS']
        self._API_ASSET = self._services['EDISCOVERY_ASSET']
        self.refresh()

    def _get_assets_properties(self):
        """gets the assets properties from inventory

                    Args:
                        None

                    Returns:

                        dict    --  containing asset properties

        """
        flag, response = self._cvpysdk_obj.make_request(
            'GET', self._API_ASSETS % self._inventory_id)
        if flag:
            if response.json() and 'assets' in response.json():
                assets = {}
                for asset in response.json()['assets']:
                    name = asset['name'].lower()
                    assets[name] = asset
                return assets
            else:
                raise SDKException('Inventory', '102', "Unknown response while fetching assets on inventory")
        else:
            self._response_not_success(response)

    def refresh(self):
        """Refresh the assets details associated with this inventory"""
        self._assets = self._get_assets_properties()

    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 has_asset(self, asset_name):
        """Checks whether given asset exists in inventory or not

                        Args:

                            asset_name      (str)       --  Name of the asset

                        Returns:

                            bool      --  true if asset exists else false
        """
        return self._assets and asset_name.lower() in self._assets

    def get(self, asset_name):
        """Returns the asset object

                Args:

                    asset_name      (str)       --  Name of the asset

                Returns:

                    object      -- Instance of Asset class

                Raises:

                    SDKException:

                            if input is not valid

                            if asset doesn't exists in inventory
        """
        if not isinstance(asset_name, str):
            raise SDKException('Inventory', '101')
        if not self.has_asset(asset_name):
            raise SDKException('Inventory', '109')
        return Asset(self._commcell_object, self._inventory_name, asset_name, self._inventory_id)

    def add(self, asset_name, asset_type=InventoryConstants.AssetType.IDENTITY_SERVER, **kwargs):
        """Adds asset to the inventory

                Args:

                    asset_name          (str)       --  Name of the asset

                    asset_type          (Enum)      --  type of asset (Refer to InventoryConstants.AssetType class)

                    kwargs for FILE SERVER type Asset:

                            fqdn                --  File server FQDN

                            os                  --  File Server OS type
                                                        (Default:Windows)

                            ip                  --  File server IP

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

                Returns:

                    object  --  Instance of Asset class

                Raises:

                    SDKException:

                            if input is not valid

                            if failed to add asset to inventory

        """
        if not isinstance(asset_name, str) or not isinstance(asset_type, InventoryConstants.AssetType):
            raise SDKException('Inventory', '101')
        request_json = {}
        if asset_type.value == InventoryConstants.AssetType.FILE_SERVER.value:
            for prop in InventoryConstants.ASSET_FILE_SERVER_PROPERTY:
                prop_name = InventoryConstants.FIELD_PROPS_MAPPING[prop]
                default_value = ""
                if prop_name not in kwargs:
                    # always use asset name as file server name
                    if prop == InventoryConstants.FIELD_PROPERTY_NAME:
                        default_value = asset_name
                    if prop == InventoryConstants.FIELD_PROPERTY_OS:
                        default_value = "Windows"
                request_json[prop] = kwargs.get(prop_name, default_value)
        else:
            request_json = copy.deepcopy(InventoryConstants.IDENTITY_SERVER_ASSET_ADD_TO_INVENTORY_JSON)
            request_json['identityServers'] = [asset_name]

        flag, response = self._cvpysdk_obj.make_request(
            'PUT', self._API_ASSETS % self._inventory_id, request_json)
        if flag:
            if response.json():
                if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                    raise SDKException(
                        'Inventory',
                        '102',
                        f"Failed to add asset to inventory with error [{response.json()['errorMessage']}]")
                self.refresh()
                return Asset(self._commcell_object, self._inventory_name, asset_name, self._inventory_id)
            raise SDKException('Inventory', '108')
        self._response_not_success(response)

    def delete(self, asset_name):
        """Delete the asset from the inventory

                Args:

                    asset_name      (str)       --  Name of the asset

                Returns:

                    None

                Raises:

                    SDKException:

                            if input is not valid

                            if failed to delete the asset

                            if unable to find this asset in inventory
        """

        if not isinstance(asset_name, str):
            raise SDKException('Inventory', '101')
        if not self.has_asset(asset_name):
            raise SDKException('Inventory', '109')
        flag, response = self._cvpysdk_obj.make_request(
            'DELETE', self._API_ASSET % (self._inventory_id, self._assets[asset_name.lower()]['id']))
        if flag:
            if response.json():
                if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                    raise SDKException(
                        'Inventory',
                        '102',
                        f"Failed to delete asset from inventory with error [{response.json()['errorMessage']}]")
                self.refresh()
                return
            raise SDKException('Inventory', '110')
        self._response_not_success(response)

    @property
    def assets(self):
        """Returns the assets details associated with this inventory"""
        return self._assets


class Asset():
    """Class to represent single asset in an inventory"""

    def __init__(self, commcell_object, inventory_name, asset_name, inventory_id=None):
        """Initialize an object of the Asset class.

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

                inventory_name     (str)        --  name of the Inventory

                asset_name          (str)       --  Name of the asset

                inventory_id       (str)        --  id of Inventory
                    default: None

            Returns:
                object  -   instance of the Asset class
        """
        self._commcell_object = commcell_object
        self._update_response_ = commcell_object._update_response_
        self._services = commcell_object._services
        self._cvpysdk_obj = self._commcell_object._cvpysdk_object
        self._inventory_id = None
        self._inventory_name = inventory_name
        if not inventory_id:
            self._inventory_id = self._commcell_object.activate.inventory_manager().get(inventory_name).inventory_id
        else:
            self._inventory_id = inventory_id
        self._asset_name = asset_name
        self._asset_props = None
        self._asset_id = None
        self._crawl_start_time = None
        self._asset_type = None
        self._asset_status = None
        self._asset_name_values_props = None
        self._API_ASSETS = self._services['EDISCOVERY_ASSETS']
        self._API_ASSET = self._services['EDISCOVERY_ASSET']
        self._API_ASSET_JOBS = self._services['EDISCOVERY_ASSET_JOBS']
        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_properties(self):
        """Returns the properties of this asset

                Args:

                    None

                Returns:

                    dict        -- Containing properties of asset

        """

        flag, response = self._cvpysdk_obj.make_request(
            'GET', self._API_ASSETS % self._inventory_id)
        if flag:
            if response.json() and 'assets' in response.json():
                for asset in response.json()['assets']:
                    if asset['name'].lower() == self._asset_name.lower():
                        self._asset_id = asset.get('id', "")
                        self._crawl_start_time = asset.get('lastCollectionTime', 0)
                        self._asset_type = asset.get('type', "")
                        self._asset_status = asset.get('status', "NA")
                        self._asset_name = asset['name']
                        if self._asset_type == InventoryConstants.AssetType.FILE_SERVER.name:
                            flag, response = self._cvpysdk_obj.make_request(
                                'GET', self._API_ASSET % (self._inventory_id, self._asset_id))
                            if flag:
                                if response.json() and 'properties' in response.json():
                                    self._asset_name_values_props = response.json()['properties']
                        return asset
                return {}
            else:
                raise SDKException('Inventory', '102', "Unknown response while fetching assets on inventory")
        else:
            self._response_not_success(response)

    def refresh(self):
        """Refresh the asset details associated with this"""
        self._asset_props = self._get_properties()

    def get_job_history(self):
        """Returns the job history details of this asset

                Args:
                    None

                Returns:

                    list(dict)    --  containing job history details

                Raises:

                    SDKException:

                            if failed to get job history

                            if asset is not supported for this operation

        """
        if self.asset_type != InventoryConstants.AssetType.IDENTITY_SERVER.name:
            raise SDKException('Inventory', '102', "Not supported other than Name Server asset type")
        flag, response = self._cvpysdk_obj.make_request(
            'GET', self._API_ASSET_JOBS % (self._inventory_id, self._asset_id))
        if flag:
            if response.json() and 'jobs' in response.json():
                return response.json()['jobs']
            raise SDKException('Inventory', '102', "Unknown response while fetching job history on inventory")
        else:
            self._response_not_success(response)

    def get_job_status(self):
        """Returns the latest job status details of this asset

                Args:
                    None

                Returns:

                    str    --  last job status (Eg:- RUNNING / IDLE)

                Raises:

                    SDKException:

                            if failed to get job status

                             if asset is not supported for this operation

        """
        if self.asset_type != InventoryConstants.AssetType.IDENTITY_SERVER.name:
            raise SDKException('Inventory', '102', "Not supported other than Name Server asset type")
        self.refresh()  # do refresh before getting current status
        return self.asset_status

    def get_asset_prop(self, prop_name):
        """returns the property value for given property name for this asset

            Args:

                prop_name       (str)       --  Name of the property

            Returns:

                str     --  Value of the property


        """
        for prop in self._asset_name_values_props:
            name = prop['name']
            if name == prop_name:
                return prop['value']
        return ""

    @property
    def asset_id(self):
        """Returns the asset id with this asset"""
        return self._asset_id

    @property
    def asset_name(self):
        """Returns the asset name with this asset"""
        return self._asset_name

    @property
    def crawl_start_time(self):
        """Returns the crawl start time with this asset"""
        return self._crawl_start_time

    @property
    def asset_type(self):
        """Returns the asset type for this asset"""
        return self._asset_type

    @property
    def asset_status(self):
        """Returns the asset status for this asset"""
        return self._asset_status

    @property
    def asset_props(self):
        """Returns the property values for this asset"""
        return self._asset_name_values_props

    @property
    def inventory_id(self):
        """Returns the inventory id for this asset"""
        return self._inventory_id

Classes

class Asset (commcell_object, inventory_name, asset_name, inventory_id=None)

Class to represent single asset in an inventory

Initialize an object of the Asset class.

Args

commcell_object (object) – instance of the commcell class

inventory_name (str) – name of the Inventory

asset_name (str) – Name of the asset

inventory_id (str) – id of Inventory default: None

Returns

object - instance of the Asset class

Expand source code Browse git
class Asset():
    """Class to represent single asset in an inventory"""

    def __init__(self, commcell_object, inventory_name, asset_name, inventory_id=None):
        """Initialize an object of the Asset class.

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

                inventory_name     (str)        --  name of the Inventory

                asset_name          (str)       --  Name of the asset

                inventory_id       (str)        --  id of Inventory
                    default: None

            Returns:
                object  -   instance of the Asset class
        """
        self._commcell_object = commcell_object
        self._update_response_ = commcell_object._update_response_
        self._services = commcell_object._services
        self._cvpysdk_obj = self._commcell_object._cvpysdk_object
        self._inventory_id = None
        self._inventory_name = inventory_name
        if not inventory_id:
            self._inventory_id = self._commcell_object.activate.inventory_manager().get(inventory_name).inventory_id
        else:
            self._inventory_id = inventory_id
        self._asset_name = asset_name
        self._asset_props = None
        self._asset_id = None
        self._crawl_start_time = None
        self._asset_type = None
        self._asset_status = None
        self._asset_name_values_props = None
        self._API_ASSETS = self._services['EDISCOVERY_ASSETS']
        self._API_ASSET = self._services['EDISCOVERY_ASSET']
        self._API_ASSET_JOBS = self._services['EDISCOVERY_ASSET_JOBS']
        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_properties(self):
        """Returns the properties of this asset

                Args:

                    None

                Returns:

                    dict        -- Containing properties of asset

        """

        flag, response = self._cvpysdk_obj.make_request(
            'GET', self._API_ASSETS % self._inventory_id)
        if flag:
            if response.json() and 'assets' in response.json():
                for asset in response.json()['assets']:
                    if asset['name'].lower() == self._asset_name.lower():
                        self._asset_id = asset.get('id', "")
                        self._crawl_start_time = asset.get('lastCollectionTime', 0)
                        self._asset_type = asset.get('type', "")
                        self._asset_status = asset.get('status', "NA")
                        self._asset_name = asset['name']
                        if self._asset_type == InventoryConstants.AssetType.FILE_SERVER.name:
                            flag, response = self._cvpysdk_obj.make_request(
                                'GET', self._API_ASSET % (self._inventory_id, self._asset_id))
                            if flag:
                                if response.json() and 'properties' in response.json():
                                    self._asset_name_values_props = response.json()['properties']
                        return asset
                return {}
            else:
                raise SDKException('Inventory', '102', "Unknown response while fetching assets on inventory")
        else:
            self._response_not_success(response)

    def refresh(self):
        """Refresh the asset details associated with this"""
        self._asset_props = self._get_properties()

    def get_job_history(self):
        """Returns the job history details of this asset

                Args:
                    None

                Returns:

                    list(dict)    --  containing job history details

                Raises:

                    SDKException:

                            if failed to get job history

                            if asset is not supported for this operation

        """
        if self.asset_type != InventoryConstants.AssetType.IDENTITY_SERVER.name:
            raise SDKException('Inventory', '102', "Not supported other than Name Server asset type")
        flag, response = self._cvpysdk_obj.make_request(
            'GET', self._API_ASSET_JOBS % (self._inventory_id, self._asset_id))
        if flag:
            if response.json() and 'jobs' in response.json():
                return response.json()['jobs']
            raise SDKException('Inventory', '102', "Unknown response while fetching job history on inventory")
        else:
            self._response_not_success(response)

    def get_job_status(self):
        """Returns the latest job status details of this asset

                Args:
                    None

                Returns:

                    str    --  last job status (Eg:- RUNNING / IDLE)

                Raises:

                    SDKException:

                            if failed to get job status

                             if asset is not supported for this operation

        """
        if self.asset_type != InventoryConstants.AssetType.IDENTITY_SERVER.name:
            raise SDKException('Inventory', '102', "Not supported other than Name Server asset type")
        self.refresh()  # do refresh before getting current status
        return self.asset_status

    def get_asset_prop(self, prop_name):
        """returns the property value for given property name for this asset

            Args:

                prop_name       (str)       --  Name of the property

            Returns:

                str     --  Value of the property


        """
        for prop in self._asset_name_values_props:
            name = prop['name']
            if name == prop_name:
                return prop['value']
        return ""

    @property
    def asset_id(self):
        """Returns the asset id with this asset"""
        return self._asset_id

    @property
    def asset_name(self):
        """Returns the asset name with this asset"""
        return self._asset_name

    @property
    def crawl_start_time(self):
        """Returns the crawl start time with this asset"""
        return self._crawl_start_time

    @property
    def asset_type(self):
        """Returns the asset type for this asset"""
        return self._asset_type

    @property
    def asset_status(self):
        """Returns the asset status for this asset"""
        return self._asset_status

    @property
    def asset_props(self):
        """Returns the property values for this asset"""
        return self._asset_name_values_props

    @property
    def inventory_id(self):
        """Returns the inventory id for this asset"""
        return self._inventory_id

Instance variables

var asset_id

Returns the asset id with this asset

Expand source code Browse git
@property
def asset_id(self):
    """Returns the asset id with this asset"""
    return self._asset_id
var asset_name

Returns the asset name with this asset

Expand source code Browse git
@property
def asset_name(self):
    """Returns the asset name with this asset"""
    return self._asset_name
var asset_props

Returns the property values for this asset

Expand source code Browse git
@property
def asset_props(self):
    """Returns the property values for this asset"""
    return self._asset_name_values_props
var asset_status

Returns the asset status for this asset

Expand source code Browse git
@property
def asset_status(self):
    """Returns the asset status for this asset"""
    return self._asset_status
var asset_type

Returns the asset type for this asset

Expand source code Browse git
@property
def asset_type(self):
    """Returns the asset type for this asset"""
    return self._asset_type
var crawl_start_time

Returns the crawl start time with this asset

Expand source code Browse git
@property
def crawl_start_time(self):
    """Returns the crawl start time with this asset"""
    return self._crawl_start_time
var inventory_id

Returns the inventory id for this asset

Expand source code Browse git
@property
def inventory_id(self):
    """Returns the inventory id for this asset"""
    return self._inventory_id

Methods

def get_asset_prop(self, prop_name)

returns the property value for given property name for this asset

Args

prop_name (str) – Name of the property

Returns

str – Value of the property

Expand source code Browse git
def get_asset_prop(self, prop_name):
    """returns the property value for given property name for this asset

        Args:

            prop_name       (str)       --  Name of the property

        Returns:

            str     --  Value of the property


    """
    for prop in self._asset_name_values_props:
        name = prop['name']
        if name == prop_name:
            return prop['value']
    return ""
def get_job_history(self)

Returns the job history details of this asset

Args

None

Returns

list(dict) – containing job history details

Raises

SDKException:

    if failed to get job history

    if asset is not supported for this operation
Expand source code Browse git
def get_job_history(self):
    """Returns the job history details of this asset

            Args:
                None

            Returns:

                list(dict)    --  containing job history details

            Raises:

                SDKException:

                        if failed to get job history

                        if asset is not supported for this operation

    """
    if self.asset_type != InventoryConstants.AssetType.IDENTITY_SERVER.name:
        raise SDKException('Inventory', '102', "Not supported other than Name Server asset type")
    flag, response = self._cvpysdk_obj.make_request(
        'GET', self._API_ASSET_JOBS % (self._inventory_id, self._asset_id))
    if flag:
        if response.json() and 'jobs' in response.json():
            return response.json()['jobs']
        raise SDKException('Inventory', '102', "Unknown response while fetching job history on inventory")
    else:
        self._response_not_success(response)
def get_job_status(self)

Returns the latest job status details of this asset

Args

None

Returns

str – last job status (Eg:- RUNNING / IDLE)

Raises

SDKException:

    if failed to get job status

     if asset is not supported for this operation
Expand source code Browse git
def get_job_status(self):
    """Returns the latest job status details of this asset

            Args:
                None

            Returns:

                str    --  last job status (Eg:- RUNNING / IDLE)

            Raises:

                SDKException:

                        if failed to get job status

                         if asset is not supported for this operation

    """
    if self.asset_type != InventoryConstants.AssetType.IDENTITY_SERVER.name:
        raise SDKException('Inventory', '102', "Not supported other than Name Server asset type")
    self.refresh()  # do refresh before getting current status
    return self.asset_status
def refresh(self)

Refresh the asset details associated with this

Expand source code Browse git
def refresh(self):
    """Refresh the asset details associated with this"""
    self._asset_props = self._get_properties()
class Assets (commcell_object, inventory_name, inventory_id=None)

Class to represent all assets in an inventory

Initialize an object of the Assets class.

Args

commcell_object (object) – instance of the commcell class

inventory_name (str) – name of the Inventory

inventory_id (str) – id of Inventory default: None

Returns

object - instance of the Assets class

Expand source code Browse git
class Assets():
    """Class to represent all assets in an inventory"""

    def __init__(self, commcell_object, inventory_name, inventory_id=None):
        """Initialize an object of the Assets class.

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

                inventory_name     (str)        --  name of the Inventory

                inventory_id       (str)        --  id of Inventory
                    default: None

            Returns:
                object  -   instance of the Assets class
        """
        self._commcell_object = commcell_object
        self._update_response_ = commcell_object._update_response_
        self._services = commcell_object._services
        self._cvpysdk_obj = self._commcell_object._cvpysdk_object
        self._inventory_id = None
        self._inventory_name = inventory_name
        if not inventory_id:
            self._inventory_id = self._commcell_object.activate.inventory_manager().get(inventory_name).inventory_id
        else:
            self._inventory_id = inventory_id
        self._assets = None
        self._API_ASSETS = self._services['EDISCOVERY_ASSETS']
        self._API_ASSET = self._services['EDISCOVERY_ASSET']
        self.refresh()

    def _get_assets_properties(self):
        """gets the assets properties from inventory

                    Args:
                        None

                    Returns:

                        dict    --  containing asset properties

        """
        flag, response = self._cvpysdk_obj.make_request(
            'GET', self._API_ASSETS % self._inventory_id)
        if flag:
            if response.json() and 'assets' in response.json():
                assets = {}
                for asset in response.json()['assets']:
                    name = asset['name'].lower()
                    assets[name] = asset
                return assets
            else:
                raise SDKException('Inventory', '102', "Unknown response while fetching assets on inventory")
        else:
            self._response_not_success(response)

    def refresh(self):
        """Refresh the assets details associated with this inventory"""
        self._assets = self._get_assets_properties()

    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 has_asset(self, asset_name):
        """Checks whether given asset exists in inventory or not

                        Args:

                            asset_name      (str)       --  Name of the asset

                        Returns:

                            bool      --  true if asset exists else false
        """
        return self._assets and asset_name.lower() in self._assets

    def get(self, asset_name):
        """Returns the asset object

                Args:

                    asset_name      (str)       --  Name of the asset

                Returns:

                    object      -- Instance of Asset class

                Raises:

                    SDKException:

                            if input is not valid

                            if asset doesn't exists in inventory
        """
        if not isinstance(asset_name, str):
            raise SDKException('Inventory', '101')
        if not self.has_asset(asset_name):
            raise SDKException('Inventory', '109')
        return Asset(self._commcell_object, self._inventory_name, asset_name, self._inventory_id)

    def add(self, asset_name, asset_type=InventoryConstants.AssetType.IDENTITY_SERVER, **kwargs):
        """Adds asset to the inventory

                Args:

                    asset_name          (str)       --  Name of the asset

                    asset_type          (Enum)      --  type of asset (Refer to InventoryConstants.AssetType class)

                    kwargs for FILE SERVER type Asset:

                            fqdn                --  File server FQDN

                            os                  --  File Server OS type
                                                        (Default:Windows)

                            ip                  --  File server IP

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

                Returns:

                    object  --  Instance of Asset class

                Raises:

                    SDKException:

                            if input is not valid

                            if failed to add asset to inventory

        """
        if not isinstance(asset_name, str) or not isinstance(asset_type, InventoryConstants.AssetType):
            raise SDKException('Inventory', '101')
        request_json = {}
        if asset_type.value == InventoryConstants.AssetType.FILE_SERVER.value:
            for prop in InventoryConstants.ASSET_FILE_SERVER_PROPERTY:
                prop_name = InventoryConstants.FIELD_PROPS_MAPPING[prop]
                default_value = ""
                if prop_name not in kwargs:
                    # always use asset name as file server name
                    if prop == InventoryConstants.FIELD_PROPERTY_NAME:
                        default_value = asset_name
                    if prop == InventoryConstants.FIELD_PROPERTY_OS:
                        default_value = "Windows"
                request_json[prop] = kwargs.get(prop_name, default_value)
        else:
            request_json = copy.deepcopy(InventoryConstants.IDENTITY_SERVER_ASSET_ADD_TO_INVENTORY_JSON)
            request_json['identityServers'] = [asset_name]

        flag, response = self._cvpysdk_obj.make_request(
            'PUT', self._API_ASSETS % self._inventory_id, request_json)
        if flag:
            if response.json():
                if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                    raise SDKException(
                        'Inventory',
                        '102',
                        f"Failed to add asset to inventory with error [{response.json()['errorMessage']}]")
                self.refresh()
                return Asset(self._commcell_object, self._inventory_name, asset_name, self._inventory_id)
            raise SDKException('Inventory', '108')
        self._response_not_success(response)

    def delete(self, asset_name):
        """Delete the asset from the inventory

                Args:

                    asset_name      (str)       --  Name of the asset

                Returns:

                    None

                Raises:

                    SDKException:

                            if input is not valid

                            if failed to delete the asset

                            if unable to find this asset in inventory
        """

        if not isinstance(asset_name, str):
            raise SDKException('Inventory', '101')
        if not self.has_asset(asset_name):
            raise SDKException('Inventory', '109')
        flag, response = self._cvpysdk_obj.make_request(
            'DELETE', self._API_ASSET % (self._inventory_id, self._assets[asset_name.lower()]['id']))
        if flag:
            if response.json():
                if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                    raise SDKException(
                        'Inventory',
                        '102',
                        f"Failed to delete asset from inventory with error [{response.json()['errorMessage']}]")
                self.refresh()
                return
            raise SDKException('Inventory', '110')
        self._response_not_success(response)

    @property
    def assets(self):
        """Returns the assets details associated with this inventory"""
        return self._assets

Instance variables

var assets

Returns the assets details associated with this inventory

Expand source code Browse git
@property
def assets(self):
    """Returns the assets details associated with this inventory"""
    return self._assets

Methods

def add(self, asset_name, asset_type=AssetType.IDENTITY_SERVER, **kwargs)

Adds asset to the inventory

Args

asset_name (str) – Name of the asset

asset_type (Enum) – type of asset (Refer to InventoryConstants.AssetType class)

kwargs for FILE SERVER type Asset:

    fqdn                --  File server FQDN

    os                  --  File Server OS type
                                (Default:Windows)

    ip                  --  File server IP

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

Returns

object – Instance of Asset class

Raises

SDKException:

    if input is not valid

    if failed to add asset to inventory
Expand source code Browse git
def add(self, asset_name, asset_type=InventoryConstants.AssetType.IDENTITY_SERVER, **kwargs):
    """Adds asset to the inventory

            Args:

                asset_name          (str)       --  Name of the asset

                asset_type          (Enum)      --  type of asset (Refer to InventoryConstants.AssetType class)

                kwargs for FILE SERVER type Asset:

                        fqdn                --  File server FQDN

                        os                  --  File Server OS type
                                                    (Default:Windows)

                        ip                  --  File server IP

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

            Returns:

                object  --  Instance of Asset class

            Raises:

                SDKException:

                        if input is not valid

                        if failed to add asset to inventory

    """
    if not isinstance(asset_name, str) or not isinstance(asset_type, InventoryConstants.AssetType):
        raise SDKException('Inventory', '101')
    request_json = {}
    if asset_type.value == InventoryConstants.AssetType.FILE_SERVER.value:
        for prop in InventoryConstants.ASSET_FILE_SERVER_PROPERTY:
            prop_name = InventoryConstants.FIELD_PROPS_MAPPING[prop]
            default_value = ""
            if prop_name not in kwargs:
                # always use asset name as file server name
                if prop == InventoryConstants.FIELD_PROPERTY_NAME:
                    default_value = asset_name
                if prop == InventoryConstants.FIELD_PROPERTY_OS:
                    default_value = "Windows"
            request_json[prop] = kwargs.get(prop_name, default_value)
    else:
        request_json = copy.deepcopy(InventoryConstants.IDENTITY_SERVER_ASSET_ADD_TO_INVENTORY_JSON)
        request_json['identityServers'] = [asset_name]

    flag, response = self._cvpysdk_obj.make_request(
        'PUT', self._API_ASSETS % self._inventory_id, request_json)
    if flag:
        if response.json():
            if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                raise SDKException(
                    'Inventory',
                    '102',
                    f"Failed to add asset to inventory with error [{response.json()['errorMessage']}]")
            self.refresh()
            return Asset(self._commcell_object, self._inventory_name, asset_name, self._inventory_id)
        raise SDKException('Inventory', '108')
    self._response_not_success(response)
def delete(self, asset_name)

Delete the asset from the inventory

Args

asset_name (str) – Name of the asset

Returns

None

Raises

SDKException:

    if input is not valid

    if failed to delete the asset

    if unable to find this asset in inventory
Expand source code Browse git
def delete(self, asset_name):
    """Delete the asset from the inventory

            Args:

                asset_name      (str)       --  Name of the asset

            Returns:

                None

            Raises:

                SDKException:

                        if input is not valid

                        if failed to delete the asset

                        if unable to find this asset in inventory
    """

    if not isinstance(asset_name, str):
        raise SDKException('Inventory', '101')
    if not self.has_asset(asset_name):
        raise SDKException('Inventory', '109')
    flag, response = self._cvpysdk_obj.make_request(
        'DELETE', self._API_ASSET % (self._inventory_id, self._assets[asset_name.lower()]['id']))
    if flag:
        if response.json():
            if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                raise SDKException(
                    'Inventory',
                    '102',
                    f"Failed to delete asset from inventory with error [{response.json()['errorMessage']}]")
            self.refresh()
            return
        raise SDKException('Inventory', '110')
    self._response_not_success(response)
def get(self, asset_name)

Returns the asset object

Args

asset_name (str) – Name of the asset

Returns

object – Instance of Asset class

Raises

SDKException:

    if input is not valid

    if asset doesn't exists in inventory
Expand source code Browse git
def get(self, asset_name):
    """Returns the asset object

            Args:

                asset_name      (str)       --  Name of the asset

            Returns:

                object      -- Instance of Asset class

            Raises:

                SDKException:

                        if input is not valid

                        if asset doesn't exists in inventory
    """
    if not isinstance(asset_name, str):
        raise SDKException('Inventory', '101')
    if not self.has_asset(asset_name):
        raise SDKException('Inventory', '109')
    return Asset(self._commcell_object, self._inventory_name, asset_name, self._inventory_id)
def has_asset(self, asset_name)

Checks whether given asset exists in inventory or not

Args

asset_name (str) – Name of the asset

Returns

bool – true if asset exists else false

Expand source code Browse git
def has_asset(self, asset_name):
    """Checks whether given asset exists in inventory or not

                    Args:

                        asset_name      (str)       --  Name of the asset

                    Returns:

                        bool      --  true if asset exists else false
    """
    return self._assets and asset_name.lower() in self._assets
def refresh(self)

Refresh the assets details associated with this inventory

Expand source code Browse git
def refresh(self):
    """Refresh the assets details associated with this inventory"""
    self._assets = self._get_assets_properties()
class Inventories (commcell_object)

Class for representing all inventories in the commcell.

Initializes an instance of the Inventories class.

Args

commcell_object (object) – instance of the commcell class

Returns

object - instance of the Inventories class

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

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

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

            Returns:
                object  -   instance of the Inventories 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._inventories = None
        self._API_INVENTORIES = self._services['EDISCOVERY_INVENTORIES']
        self._API_DELETE_INVENTORY = self._services['EDISCOVERY_INVENTORY']
        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_inventories(self):
        """Gets all inventories from the commcell

            Args:

                None

            Return:

                list(dict)        --  list Containing inventory details dict

            Raises:

                SDKException:

                    if response is empty

                    if response is not success

        """
        output = {}
        flag, response = self._cvpysdk_object.make_request(
            'GET', self._API_INVENTORIES
        )
        if flag:
            if response.json() and 'inventories' in response.json():
                inventories = response.json()['inventories']
                for inventory in inventories:
                    output[inventory['displayName'].lower()] = inventory
                return output
            raise SDKException('Inventory', '103')
        self._response_not_success(response)

    def add(self, inventory_name, index_server, name_server=None):
        """Adds inventory to the commcell with given inputs

                Args:

                    inventory_name              (str)       --  Name of the inventory

                    index_server                (str)       --  Index server name

                    name_server                 (list)      --  Name server assets which needs to be added to inventory

                Returns:

                    object  --  Instance of Inventory Class

                Raises:

                    SDKException:

                            if input data type is not valid

                            if failed to add inventory

                            if Index Server doesn't exists in commcell

        """
        if not isinstance(inventory_name, str) or not isinstance(index_server, str):
            raise SDKException('Inventory', '101')
        req_json = copy.deepcopy(InventoryConstants.INVENTORY_ADD_REQUEST_JSON)
        if name_server:
            req_json['identityServers'] = name_server
        req_json['name'] = inventory_name
        if not self._commcell_object.index_servers.has(index_server):
            raise SDKException('Inventory', '102', "Given index server name not exists on this commcell")
        index_server_obj = self._commcell_object.index_servers.get(index_server)
        req_json['indexServer']['cloudId'] = index_server_obj.cloud_id
        req_json['indexServer']['displayName'] = index_server_obj.cloud_name
        flag, response = self._cvpysdk_object.make_request(
            'POST', self._API_INVENTORIES, req_json
        )
        if flag:
            if response.json():
                if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                    raise SDKException(
                        'Inventory',
                        '102',
                        f"Failed to create inventory with error [{response.json()['errorMessage']}]")
                elif 'name' in response.json():
                    inventory = response.json()['name']
                    inventory_id = response.json()['id']
                    self.refresh()
                    return Inventory(self._commcell_object, inventory_name, inventory_id)
                raise SDKException('Inventory', '102', f"Failed to create inventory with response - {response.json()}")
            raise SDKException('Inventory', '105')
        self._response_not_success(response)

    def delete(self, inventory_name):
        """Deletes the inventory from the commcell

                Args:

                    inventory_name      (str)       --  Inventory name to be deleted

                Returns:
                    None

                Raises:

                    SDKException:

                            if unable to find inventory

                            if failed to delete inventory

                            if input type is not valid

        """
        if not isinstance(inventory_name, str):
            raise SDKException('Inventory', '101')
        if not self.has_inventory(inventory_name):
            raise SDKException('Inventory', '106')
        flag, response = self._cvpysdk_object.make_request(
            'DELETE', self._API_DELETE_INVENTORY % self._inventories[inventory_name.lower()]['id']
        )
        if flag:
            if response.json():
                if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                    raise SDKException(
                        'Inventory',
                        '102',
                        f"Failed to Delete inventory with error [{response.json()['errorMessage']}]")
                self.refresh()
            else:
                raise SDKException('Inventory', '107')
        else:
            self._response_not_success(response)

    def refresh(self):
        """Refresh the inventories associated with the commcell."""
        self._inventories = self._get_inventories()

    def get_properties(self, inventory_name):
        """Returns a properties of the specified Inventory

            Args:
                inventory_name (str)  --  name of the inventory

            Returns:
                dict -  properties for the given inventory name


        """
        return self._inventories[inventory_name.lower()]

    def has_inventory(self, inventory_name):
        """Checks if a inventory exists in the commcell with the input name.

            Args:
                inventory_name (str)  --  name of the inventory

            Returns:
                bool - boolean output to specify whether the inventory exists in the commcell or not

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

        """
        if not isinstance(inventory_name, str):
            raise SDKException('Inventory', '101')

        return self._inventories and inventory_name.lower() in map(str.lower, self._inventories)

    def get(self, inventory_name):
        """Returns a Inventory object for the given inventory name.

            Args:
                inventory_name (str)  --  name of the inventory

            Returns:

                obj                 -- Object of Inventory class

            Raises:

                SDKException:

                    if inventory doesn't exists in commcell

                    if inventory_name is not of type string


        """
        if not isinstance(inventory_name, str):
            raise SDKException('Inventory', '101')

        if self.has_inventory(inventory_name):
            inventory_id = self._inventories[inventory_name.lower()]['id']
            return Inventory(self._commcell_object, inventory_name, inventory_id)
        raise SDKException('Inventory', '106')

Methods

def add(self, inventory_name, index_server, name_server=None)

Adds inventory to the commcell with given inputs

Args

inventory_name (str) – Name of the inventory

index_server (str) – Index server name

name_server (list) – Name server assets which needs to be added to inventory

Returns

object – Instance of Inventory Class

Raises

SDKException:

    if input data type is not valid

    if failed to add inventory

    if Index Server doesn't exists in commcell
Expand source code Browse git
def add(self, inventory_name, index_server, name_server=None):
    """Adds inventory to the commcell with given inputs

            Args:

                inventory_name              (str)       --  Name of the inventory

                index_server                (str)       --  Index server name

                name_server                 (list)      --  Name server assets which needs to be added to inventory

            Returns:

                object  --  Instance of Inventory Class

            Raises:

                SDKException:

                        if input data type is not valid

                        if failed to add inventory

                        if Index Server doesn't exists in commcell

    """
    if not isinstance(inventory_name, str) or not isinstance(index_server, str):
        raise SDKException('Inventory', '101')
    req_json = copy.deepcopy(InventoryConstants.INVENTORY_ADD_REQUEST_JSON)
    if name_server:
        req_json['identityServers'] = name_server
    req_json['name'] = inventory_name
    if not self._commcell_object.index_servers.has(index_server):
        raise SDKException('Inventory', '102', "Given index server name not exists on this commcell")
    index_server_obj = self._commcell_object.index_servers.get(index_server)
    req_json['indexServer']['cloudId'] = index_server_obj.cloud_id
    req_json['indexServer']['displayName'] = index_server_obj.cloud_name
    flag, response = self._cvpysdk_object.make_request(
        'POST', self._API_INVENTORIES, req_json
    )
    if flag:
        if response.json():
            if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                raise SDKException(
                    'Inventory',
                    '102',
                    f"Failed to create inventory with error [{response.json()['errorMessage']}]")
            elif 'name' in response.json():
                inventory = response.json()['name']
                inventory_id = response.json()['id']
                self.refresh()
                return Inventory(self._commcell_object, inventory_name, inventory_id)
            raise SDKException('Inventory', '102', f"Failed to create inventory with response - {response.json()}")
        raise SDKException('Inventory', '105')
    self._response_not_success(response)
def delete(self, inventory_name)

Deletes the inventory from the commcell

Args

inventory_name (str) – Inventory name to be deleted

Returns

None

Raises

SDKException:

    if unable to find inventory

    if failed to delete inventory

    if input type is not valid
Expand source code Browse git
def delete(self, inventory_name):
    """Deletes the inventory from the commcell

            Args:

                inventory_name      (str)       --  Inventory name to be deleted

            Returns:
                None

            Raises:

                SDKException:

                        if unable to find inventory

                        if failed to delete inventory

                        if input type is not valid

    """
    if not isinstance(inventory_name, str):
        raise SDKException('Inventory', '101')
    if not self.has_inventory(inventory_name):
        raise SDKException('Inventory', '106')
    flag, response = self._cvpysdk_object.make_request(
        'DELETE', self._API_DELETE_INVENTORY % self._inventories[inventory_name.lower()]['id']
    )
    if flag:
        if response.json():
            if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                raise SDKException(
                    'Inventory',
                    '102',
                    f"Failed to Delete inventory with error [{response.json()['errorMessage']}]")
            self.refresh()
        else:
            raise SDKException('Inventory', '107')
    else:
        self._response_not_success(response)
def get(self, inventory_name)

Returns a Inventory object for the given inventory name.

Args

inventory_name (str) – name of the inventory

Returns

obj – Object of Inventory class

Raises

SDKException:

if inventory doesn't exists in commcell

if inventory_name is not of type string
Expand source code Browse git
def get(self, inventory_name):
    """Returns a Inventory object for the given inventory name.

        Args:
            inventory_name (str)  --  name of the inventory

        Returns:

            obj                 -- Object of Inventory class

        Raises:

            SDKException:

                if inventory doesn't exists in commcell

                if inventory_name is not of type string


    """
    if not isinstance(inventory_name, str):
        raise SDKException('Inventory', '101')

    if self.has_inventory(inventory_name):
        inventory_id = self._inventories[inventory_name.lower()]['id']
        return Inventory(self._commcell_object, inventory_name, inventory_id)
    raise SDKException('Inventory', '106')
def get_properties(self, inventory_name)

Returns a properties of the specified Inventory

Args

inventory_name (str) – name of the inventory

Returns

dict - properties for the given inventory name

Expand source code Browse git
def get_properties(self, inventory_name):
    """Returns a properties of the specified Inventory

        Args:
            inventory_name (str)  --  name of the inventory

        Returns:
            dict -  properties for the given inventory name


    """
    return self._inventories[inventory_name.lower()]
def has_inventory(self, inventory_name)

Checks if a inventory exists in the commcell with the input name.

Args

inventory_name (str) – name of the inventory

Returns

bool - boolean output to specify whether the inventory exists in the commcell or not

Raises

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

Expand source code Browse git
def has_inventory(self, inventory_name):
    """Checks if a inventory exists in the commcell with the input name.

        Args:
            inventory_name (str)  --  name of the inventory

        Returns:
            bool - boolean output to specify whether the inventory exists in the commcell or not

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

    """
    if not isinstance(inventory_name, str):
        raise SDKException('Inventory', '101')

    return self._inventories and inventory_name.lower() in map(str.lower, self._inventories)
def refresh(self)

Refresh the inventories associated with the commcell.

Expand source code Browse git
def refresh(self):
    """Refresh the inventories associated with the commcell."""
    self._inventories = self._get_inventories()
class Inventory (commcell_object, inventory_name, inventory_id=None)

Class for performing operations on a single inventory

Initialize an object of the Inventory class.

Args

commcell_object (object) – instance of the commcell class

inventory_name (str) – name of the Inventory

inventory_id (str) – id of Inventory default: None

Returns

object - instance of the Inventory class

Expand source code Browse git
class Inventory():
    """Class for performing operations on a single inventory"""

    def __init__(self, commcell_object, inventory_name, inventory_id=None):
        """Initialize an object of the Inventory class.

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

                inventory_name     (str)        --  name of the Inventory

                inventory_id       (str)        --  id of Inventory
                    default: None

            Returns:
                object  -   instance of the Inventory class
        """
        self._commcell_object = commcell_object
        self._update_response_ = commcell_object._update_response_
        self._services = commcell_object._services
        self._cvpysdk_obj = self._commcell_object._cvpysdk_object
        self._inventory_id = None
        self._inventory_name = inventory_name
        self._inventory_props = None
        self._index_server_name = None
        self._index_server_cloud_id = None
        self._security_associations = None
        self._schedule = None
        self._data_source = None
        self._handler = None
        self._API_GET_INVENTORY_DETAILS = self._services['EDISCOVERY_INVENTORY']
        self._API_SECURITY_ENTITY = self._services['ENTITY_SECURITY_ASSOCIATION']
        self._API_GET_DEFAULT_HANDLER = self._services['EDISCOVERY_GET_DEFAULT_HANDLER']
        self._API_PERMISSION = self._services['V4_ACTIVATE_DS_PERMISSION']
        self._API_CRAWL = self._services['V4_INVENTORY_CRAWL']

        if not inventory_id:
            self._inventory_id = self._commcell_object.activate.inventory_manager().get(inventory_name).inventory_id
        else:
            self._inventory_id = inventory_id
        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_permission(self):
        """returns security association blob for this inventory

                Args:

                    None

                Returns:

                    dict    --  Security association blob

        """
        flag, response = self._cvpysdk_obj.make_request(
            'GET', self._API_PERMISSION % self._inventory_id
        )
        if flag:
            if response.json() and 'securityAssociations' in response.json():
                return response.json()['securityAssociations']
            raise SDKException('Inventory', '102', "Inventory permission fetch failed")
        self._response_not_success(response)

    def _get_inventory_properties(self):
        """ Get inventory properties from the commcell
                Args:

                    None

                Returns:

                    dict        --  Properties of inventory

        """
        flag, response = self._cvpysdk_obj.make_request(
            'GET', self._API_GET_INVENTORY_DETAILS % self._inventory_id
        )
        if flag:
            if response.json():
                inventory_props = response.json()
                self._index_server_name = inventory_props['indexServer']['displayName']
                self._index_server_cloud_id = inventory_props['indexServer']['cloudId']
                self._inventory_name = inventory_props['displayName']
                return inventory_props
            raise SDKException('Inventory', '104')
        self._response_not_success(response)

    def refresh(self):
        """Refresh the inventory details for associated object"""
        self._inventory_props = self._get_inventory_properties()
        self._schedule = self._get_schedule_object()
        self._data_source, self._handler = self._get_data_source_handler_object()
        self._security_associations = self._get_permission()

    def get_assets(self):
        """Returns the Assets class instance for this inventory

                Args:

                    None

                Returns:

                    object      --  Instance of Assets class

        """
        return Assets(self._commcell_object, self.inventory_name, self.inventory_id)

    def start_collection(self):
        """Starts collection job on this inventory

                Args:

                    None

                Return:

                    None

                Raises:

                    SDKException:

                            if failed to start collection job

        """
        flag, response = self._cvpysdk_obj.make_request(
            'PUT', self._API_CRAWL % self._inventory_id
        )
        if flag:
            if response.json():
                if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                    raise SDKException(
                        'Inventory',
                        '102',
                        f"Failed to start crawl on inventory with error [{response.json()['errorMessage']}]")
                return
            else:
                raise SDKException('Inventory', '102', "Unknown response while starting collection job on inventory")
        else:
            self._response_not_success(response)

    def share(self, user_or_group_name, allow_edit_permission=False, is_user=True, ops_type=1):
        """Shares inventory 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
        """
        if not isinstance(user_or_group_name, str):
            raise SDKException('Inventory', '101')
        request_json = copy.deepcopy(InventoryConstants.INVENTORY_SHARE_REQUEST_JSON)
        external_user = False
        association_response = None
        if ops_type == 1 and len(self.security_associations) > 1:
            association_request_json = copy.deepcopy(InventoryConstants.INVENTORY_SHARE_REQUEST_JSON)
            del association_request_json['securityAssociations']
            association_request_json['entityAssociated']['entity'][0]['seaDataSourceId'] = int(self.inventory_id)
            # get security blob for this data source type entity - 132
            flag, response = self._cvpysdk_obj.make_request(
                'GET', self._API_SECURITY_ENTITY % (132, int(self.inventory_id)), association_request_json
            )
            if flag:
                if response.json() and 'securityAssociations' in response.json():
                    association_response = response.json(
                    )['securityAssociations'][0]['securityAssociations']['associations']
                else:
                    raise SDKException('Inventory', '102', 'Failed to get existing security associations')
            else:
                response_string = self._commcell_object._update_response_(response.text)
                raise SDKException('Response', '101', response_string)

        if '\\' in user_or_group_name:
            external_user = True
        if is_user:
            user_obj = self._commcell_object.users.get(user_or_group_name)
            user_id = user_obj.user_id
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['userId'] = int(user_id)
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['_type_'] = 13
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['userName'] = user_or_group_name
        elif external_user:
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['groupId'] = 0
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['_type_'] = 62
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0][
                'externalGroupName'] = user_or_group_name
        else:
            grp_obj = self._commcell_object.user_groups.get(user_or_group_name)
            grp_id = grp_obj.user_group_id
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['userGroupId'] = int(grp_id)
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['_type_'] = 15
            request_json['securityAssociations']['associations'][0]['userOrGroup'][0][
                'userGroupName'] = user_or_group_name

        request_json['entityAssociated']['entity'][0]['seaDataSourceId'] = self.inventory_id
        request_json['securityAssociations']['associationsOperationType'] = ops_type

        if allow_edit_permission:
            request_json['securityAssociations']['associations'][0]['properties']['categoryPermission']['categoriesPermissionList'].append(
                InventoryConstants.EDIT_CATEGORY_PERMISSION)

            # Associate existing associations to the request
        if ops_type == 1 and len(self.security_associations) > 1:
            request_json['securityAssociations']['associations'].extend(association_response)

        flag, response = self._cvpysdk_obj.make_request(
            'PUT', self._API_PERMISSION % self._inventory_id, request_json
        )
        if flag:
            if response.json():
                error_code = response.json()['errorCode']
                if error_code != 0:
                    error_message = response.json()['errorString']
                    raise SDKException(
                        'Inventory',
                        '102', error_message)
                # update association list by refreshing inventory
                self.refresh()
            else:
                raise SDKException('Inventory', '111')
        else:
            response_string = self._commcell_object._update_response_(response.text)
            raise SDKException('Response', '101', response_string)

    def _get_data_source_handler_object(self):
        """returns the data source and handler object associated with this inventory

                Args:
                    None

                Returns:
                    obj,obj     --  Instance of DataSource object,Instance of Handler object

                Raises:

                    SDKException:

                            if failed to get datasource or handler details
        """
        flag, response = self._cvpysdk_obj.make_request(
            'GET', self._API_GET_DEFAULT_HANDLER % self.inventory_id)
        if flag:
            if response.json() and 'handlerInfos' in response.json():
                handler_list = response.json()['handlerInfos']
                if not isinstance(handler_list, list):
                    raise SDKException('Inventory', '102', "Failed to get Datasource/Handler details")
                handler_details = handler_list[0]
                ds_name = handler_details['dataSourceName']
                handler_name = handler_details['handlerName']
                ds_obj = self._commcell_object.datacube.datasources.get(ds_name)
                handler_obj = ds_obj.ds_handlers.get(handler_name)
                return ds_obj, handler_obj
            raise SDKException('Inventory', '102', 'Unknown response while fetching datasource details')
        response_string = self._commcell_object._update_response_(response.text)
        raise SDKException('Response', '101', response_string)

    def _get_schedule_object(self):
        """Returns the schedule class object of schedule associated to this inventory

                Args:

                    None

                Returns:

                    object      --  Instance of Schedule class

                Raises:

                    SDKException:

                            if failed to find schedule
        """
        return Schedules(self).get()

    def get_inventory_data(self, handler_filter=""):
        """ Executes handler for fetching data from inventory
                Args:

                     handler_filter    (str)  -- Filter which needs to applied for handler execution

                Returns:

                    dict        --  Dictionary of values fetched from handler execution

                Raises:

                    SDKExpception:

                        if error in fetching handler data

                        if input is not valid
        """
        if not isinstance(handler_filter, str):
            raise SDKException('Inventory', '101')
        if not self._handler:
            raise SDKException('Inventory', '102', 'No handler object initialised')
        return self._handler.get_handler_data(handler_filter=handler_filter)

    @property
    def properties(self):
        """Returns the properties of this inventory as dict"""
        return self._inventory_props

    @property
    def index_server_name(self):
        """Returns the index server name associated with this inventory"""
        return self._index_server_name

    @property
    def index_server_cloud_id(self):
        """Returns the index server id associated with this inventory"""
        return self._index_server_cloud_id

    @property
    def inventory_id(self):
        """Returns the inventory id associated with this inventory"""
        return self._inventory_id

    @property
    def inventory_name(self):
        """Returns the inventory name associated with this inventory"""
        return self._inventory_name

    @property
    def security_associations(self):
        """Returns the security blob associated with this inventory"""
        return self._security_associations

    @property
    def schedule(self):
        """Returns the schedule class object for schedule associated with this inventory"""
        return self._schedule

    @property
    def data_source(self):
        """Returns the DataSource class object for datasource associated with this inventory"""
        return self._data_source

    @property
    def handler(self):
        """Returns the Handler class object for default handler associated with this inventory"""
        return self._handler

Instance variables

var data_source

Returns the DataSource class object for datasource associated with this inventory

Expand source code Browse git
@property
def data_source(self):
    """Returns the DataSource class object for datasource associated with this inventory"""
    return self._data_source
var handler

Returns the Handler class object for default handler associated with this inventory

Expand source code Browse git
@property
def handler(self):
    """Returns the Handler class object for default handler associated with this inventory"""
    return self._handler
var index_server_cloud_id

Returns the index server id associated with this inventory

Expand source code Browse git
@property
def index_server_cloud_id(self):
    """Returns the index server id associated with this inventory"""
    return self._index_server_cloud_id
var index_server_name

Returns the index server name associated with this inventory

Expand source code Browse git
@property
def index_server_name(self):
    """Returns the index server name associated with this inventory"""
    return self._index_server_name
var inventory_id

Returns the inventory id associated with this inventory

Expand source code Browse git
@property
def inventory_id(self):
    """Returns the inventory id associated with this inventory"""
    return self._inventory_id
var inventory_name

Returns the inventory name associated with this inventory

Expand source code Browse git
@property
def inventory_name(self):
    """Returns the inventory name associated with this inventory"""
    return self._inventory_name
var properties

Returns the properties of this inventory as dict

Expand source code Browse git
@property
def properties(self):
    """Returns the properties of this inventory as dict"""
    return self._inventory_props
var schedule

Returns the schedule class object for schedule associated with this inventory

Expand source code Browse git
@property
def schedule(self):
    """Returns the schedule class object for schedule associated with this inventory"""
    return self._schedule
var security_associations

Returns the security blob associated with this inventory

Expand source code Browse git
@property
def security_associations(self):
    """Returns the security blob associated with this inventory"""
    return self._security_associations

Methods

def get_assets(self)

Returns the Assets class instance for this inventory

Args

None

Returns

object – Instance of Assets class

Expand source code Browse git
def get_assets(self):
    """Returns the Assets class instance for this inventory

            Args:

                None

            Returns:

                object      --  Instance of Assets class

    """
    return Assets(self._commcell_object, self.inventory_name, self.inventory_id)
def get_inventory_data(self, handler_filter='')

Executes handler for fetching data from inventory

Args

handler_filter (str) – Filter which needs to applied for handler execution

Returns

dict – Dictionary of values fetched from handler execution

Raises

SDKExpception:

if error in fetching handler data

if input is not valid
Expand source code Browse git
def get_inventory_data(self, handler_filter=""):
    """ Executes handler for fetching data from inventory
            Args:

                 handler_filter    (str)  -- Filter which needs to applied for handler execution

            Returns:

                dict        --  Dictionary of values fetched from handler execution

            Raises:

                SDKExpception:

                    if error in fetching handler data

                    if input is not valid
    """
    if not isinstance(handler_filter, str):
        raise SDKException('Inventory', '101')
    if not self._handler:
        raise SDKException('Inventory', '102', 'No handler object initialised')
    return self._handler.get_handler_data(handler_filter=handler_filter)
def refresh(self)

Refresh the inventory details for associated object

Expand source code Browse git
def refresh(self):
    """Refresh the inventory details for associated object"""
    self._inventory_props = self._get_inventory_properties()
    self._schedule = self._get_schedule_object()
    self._data_source, self._handler = self._get_data_source_handler_object()
    self._security_associations = self._get_permission()
def share(self, user_or_group_name, allow_edit_permission=False, is_user=True, ops_type=1)

Shares inventory 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 inventory 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
    """
    if not isinstance(user_or_group_name, str):
        raise SDKException('Inventory', '101')
    request_json = copy.deepcopy(InventoryConstants.INVENTORY_SHARE_REQUEST_JSON)
    external_user = False
    association_response = None
    if ops_type == 1 and len(self.security_associations) > 1:
        association_request_json = copy.deepcopy(InventoryConstants.INVENTORY_SHARE_REQUEST_JSON)
        del association_request_json['securityAssociations']
        association_request_json['entityAssociated']['entity'][0]['seaDataSourceId'] = int(self.inventory_id)
        # get security blob for this data source type entity - 132
        flag, response = self._cvpysdk_obj.make_request(
            'GET', self._API_SECURITY_ENTITY % (132, int(self.inventory_id)), association_request_json
        )
        if flag:
            if response.json() and 'securityAssociations' in response.json():
                association_response = response.json(
                )['securityAssociations'][0]['securityAssociations']['associations']
            else:
                raise SDKException('Inventory', '102', 'Failed to get existing security associations')
        else:
            response_string = self._commcell_object._update_response_(response.text)
            raise SDKException('Response', '101', response_string)

    if '\\' in user_or_group_name:
        external_user = True
    if is_user:
        user_obj = self._commcell_object.users.get(user_or_group_name)
        user_id = user_obj.user_id
        request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['userId'] = int(user_id)
        request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['_type_'] = 13
        request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['userName'] = user_or_group_name
    elif external_user:
        request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['groupId'] = 0
        request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['_type_'] = 62
        request_json['securityAssociations']['associations'][0]['userOrGroup'][0][
            'externalGroupName'] = user_or_group_name
    else:
        grp_obj = self._commcell_object.user_groups.get(user_or_group_name)
        grp_id = grp_obj.user_group_id
        request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['userGroupId'] = int(grp_id)
        request_json['securityAssociations']['associations'][0]['userOrGroup'][0]['_type_'] = 15
        request_json['securityAssociations']['associations'][0]['userOrGroup'][0][
            'userGroupName'] = user_or_group_name

    request_json['entityAssociated']['entity'][0]['seaDataSourceId'] = self.inventory_id
    request_json['securityAssociations']['associationsOperationType'] = ops_type

    if allow_edit_permission:
        request_json['securityAssociations']['associations'][0]['properties']['categoryPermission']['categoriesPermissionList'].append(
            InventoryConstants.EDIT_CATEGORY_PERMISSION)

        # Associate existing associations to the request
    if ops_type == 1 and len(self.security_associations) > 1:
        request_json['securityAssociations']['associations'].extend(association_response)

    flag, response = self._cvpysdk_obj.make_request(
        'PUT', self._API_PERMISSION % self._inventory_id, request_json
    )
    if flag:
        if response.json():
            error_code = response.json()['errorCode']
            if error_code != 0:
                error_message = response.json()['errorString']
                raise SDKException(
                    'Inventory',
                    '102', error_message)
            # update association list by refreshing inventory
            self.refresh()
        else:
            raise SDKException('Inventory', '111')
    else:
        response_string = self._commcell_object._update_response_(response.text)
        raise SDKException('Response', '101', response_string)
def start_collection(self)

Starts collection job on this inventory

Args

None

Return

None

Raises

SDKException:

    if failed to start collection job
Expand source code Browse git
def start_collection(self):
    """Starts collection job on this inventory

            Args:

                None

            Return:

                None

            Raises:

                SDKException:

                        if failed to start collection job

    """
    flag, response = self._cvpysdk_obj.make_request(
        'PUT', self._API_CRAWL % self._inventory_id
    )
    if flag:
        if response.json():
            if 'errorCode' in response.json() and response.json()['errorCode'] != 0:
                raise SDKException(
                    'Inventory',
                    '102',
                    f"Failed to start crawl on inventory with error [{response.json()['errorMessage']}]")
            return
        else:
            raise SDKException('Inventory', '102', "Unknown response while starting collection job on inventory")
    else:
        self._response_not_success(response)