Rem Rem $Header: emcore/source/oracle/sysman/emdrep/sql/core/latest/storage/storage_ui_common_pkgbody.sql /st_emcore_10.2.0.4.2db11.2/1 2009/02/18 16:39:48 yozhang Exp $ Rem Rem storage_ui_common_pkgbody.sql Rem Rem Copyright (c) 2004, 2009, Oracle and/or its affiliates. Rem All rights reserved. Rem Rem NAME Rem storage_ui_common_pkgbody.sql Rem Rem DESCRIPTION Rem package containing methods to retrieve host or group Rem storage data. Rem Rem NOTES Rem Only methods that work for both host and group should exist Rem in this package. Rem Rem MODIFIED (MM/DD/YY) Rem yozhang 02/11/09 - Fix bug 6848759 Rem yozhang 05/04/07 - Fix backport bug: 6029650 Rem mnihalan 08/18/06 - fix backport 5475298 Rem ajere 09/07/05 - Fix bug# 4573302 Rem sreddy 07/23/05 - Modified all queries to MGMT_V_STORAGE_STATS Rem to include target_type in join conditions Rem sreddy 07/23/05 - Improve performance by cutting over queries Rem to use ecm_snapshotId column in Rem MGMT_STORAGE_REPORT_UI_TARGETS table. Fixes Rem the performance bug of using Rem MGMT_STORAGE_REPORT_DATA as driver table Rem which has large number of rows. Rem sreddy 07/23/05 - Fixed GET_COLLECTION_TIMESTAMP to return Rem correct timestamp. It fixes the bug of not taking Rem ASM collection timestamps into computing it. Rem sreddy 07/23/05 - Fixed p_total_dbs computation in Rem GET_STRG_DATA_CFG_AND_ERRORS(). It fixes the Rem bug of counting errors due to inclusion of Rem oracle_database instances having valid Rem rac_database association Rem sreddy 07/23/05 - Fixed computation of collection_timestamp in Rem GET_COLLECTION_INFO. Fixes the bug of not taking Rem ASM collection timestamps into computing it. Rem sreddy 07/23/05 - perform DELETE_MISSING_SNAPSHOT_HOSTS before Rem computing summary metrics [fixes the bug of Rem summarizing usage values for db, asm and rac Rem targets without having associated host storage Rem snapshot] Rem sreddy 07/23/05 - define/use constants, cleanup comments, Rem cleanup queries, make the code more readable Rem ajdsouza 07/19/05 - Modified function get_refresh_job_info to query on Rem job desc Rem ajere 07/19/05 - Fix bug# 4409361 Rem ajere 07/11/05 - Fix bug# 4222308 Rem ajere 06/15/05 - Fix bug# 4300002 Rem ajere 06/13/05 - Fix bug# 4253174 Rem rmenon 05/02/05 - partial fix for performance bug (4289514). Rem Some extra code is being executed in the Rem common method. Also fixed the bug in Rem calculating local fs and writeable NFS Rem used storage. Rem rmenon 04/07/05 - fixed bug 4290570 Rem rmenon 03/18/05 - In the select in the function Rem get_refresh_job_info, we now use rownum Rem to restrict the number of rows to 1. Rem If jobs are normally submitted from the UI, Rem this is not needed. But due to some reason, Rem if the query does return more than one row, Rem it is not an error really, the behavior should Rem be to just return the first row. Rem rmenon 03/10/05 - changed db size calculation. it now depends Rem only on tablespace size (not on control files Rem size and redo log sizes. Rem rmenon 03/01/05 - added info conveying if any refresh Rem job is running against a group or not. Rem rmenon 02/21/05 - Rem rmenon 02/16/05 - fix 4186450 (show timezone in UI pages) Rem rmenon 02/07/05 - fix for 399806 - fixed by looking at tkprof Rem there were two problems: Rem a. There was a full scan on MGMT_TARGETS Rem that I now avoid by adding the target_type Rem column in my views and using them Rem in the queries to give mor info to the CBO Rem for it to be able to use index. Rem b. There were sorts using physical IO which Rem can be a bottleneck. If I alter the Rem sort_area_size and hash_area_size then Rem these disappear. If this problem occurs Rem again, we can at the minimum change these Rem settings at a session level perhaps. Rem Currently, I am ignoring these issues. Rem Formatted code to conform to EM coding Rem standards. Rem rmenon 01/31/05 - Rem rmenon 01/05/05 - fixed query that gets hosts in a group Rem that don't have collection defined or Rem jhave missing storage data. Rem rmenon 12/09/04 - history page UI changes based on UI Rem exit review - mainly to show the congiuration Rem and errors encountered while history Rem was calculated. Rem Rem rmenon 11/15/04 - split collection error count into Rem mapping error count and collection error Rem count; formatted procedure definitions Rem aligning the beginning and ending brackets. Rem rmenon 11/11/04 - correcting queries from MGMT_METRICS Rem to remove "met.metric_column = ' '" Rem condition.added API for calculating Rem error and config change history for Rem host and group storage history data. Rem rmenon 10/27/04 - corrected queries from MGMT_METRICS Rem to include type_meta_ver and Rem category properties conditions. Rem rmenon 10/23/04 - vendor distribution; code refactor Rem rmenon 10/09/04 - rmenon_storage_group_ui_and_sql_code_refactor Rem rmenon 09/28/04 - Created Rem CREATE OR REPLACE PACKAGE BODY STORAGE_UI_COMMON_PKG AS G_GROUP_JOB_DESC_STRG CONSTANT VARCHAR2(50) := 'Refreshing group storage for group: '; G_NO_REFRESH_JOB_IS_RUNNING CONSTANT NUMBER := -1; G_MODULE_NAME CONSTANT VARCHAR2(30) := 'STORAGE_UI_COMMON_PKG'; -- Note that following is not a constant gv_storage_rep_metric VARCHAR2(50) := STORAGE_REP_METRICS_PKG.G_HOST_STORAGE_REP_METRIC; -- Forward declarations of private procedures/functions FUNCTION IS_HISTORY_METRIC_DEFINED(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN VARCHAR2; PROCEDURE PRINT_DASHED_LINE; PROCEDURE PRINT_STORAGE_SUMMARY_VALUES(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_vol_allocated IN NUMBER, p_vol_overhead IN NUMBER, p_vol_unallocated IN NUMBER, p_vol_size IN NUMBER, p_asm_allocated IN NUMBER, p_asm_unallocated IN NUMBER, p_asm_overhead IN NUMBER, p_disk_allocated IN NUMBER, p_disk_unallocated IN NUMBER, p_disk_size IN NUMBER, p_asm_size IN NUMBER, p_writeable_nfs_allocated IN NUMBER, p_db_on_local_disks IN NUMBER, p_db_on_volumes IN NUMBER, p_db_on_asm IN NUMBER, p_db_on_local_fs IN NUMBER, p_db_on_writeable_nfs IN NUMBER, p_db_allocated IN NUMBER, p_db_tablespace_size IN NUMBER, p_db_tablespace_used IN NUMBER, p_db_used IN NUMBER, p_db_free IN NUMBER, p_local_fs_on_local_disks IN NUMBER, p_local_fs_on_volumes IN NUMBER, p_local_fs_used IN NUMBER, p_local_fs_free IN NUMBER, p_writeable_nfs_used IN NUMBER, p_writeable_nfs_free IN NUMBER, p_total_allocated IN NUMBER, p_total_unallocated IN NUMBER, p_total_overhead IN NUMBER, p_total_used IN NUMBER, p_total_free IN NUMBER); PROCEDURE LOG_STORAGE_SUMMARY_VALUES(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_vol_allocated IN NUMBER, p_vol_overhead IN NUMBER, p_vol_unallocated IN NUMBER, p_vol_size IN NUMBER, p_asm_allocated IN NUMBER, p_asm_unallocated IN NUMBER, p_asm_overhead IN NUMBER, p_disk_allocated IN NUMBER, p_disk_unallocated IN NUMBER, p_disk_size IN NUMBER, p_asm_size IN NUMBER, p_writeable_nfs_allocated IN NUMBER, p_db_on_local_disks IN NUMBER, p_db_on_volumes IN NUMBER, p_db_on_asm IN NUMBER, p_db_on_local_fs IN NUMBER, p_db_on_writeable_nfs IN NUMBER, p_db_allocated IN NUMBER, p_db_tablespace_size IN NUMBER, p_db_tablespace_used IN NUMBER, p_db_used IN NUMBER, p_db_free IN NUMBER, p_local_fs_on_local_disks IN NUMBER, p_local_fs_on_volumes IN NUMBER, p_local_fs_used IN NUMBER, p_local_fs_free IN NUMBER, p_writeable_nfs_used IN NUMBER, p_writeable_nfs_free IN NUMBER, p_total_allocated IN NUMBER, p_total_unallocated IN NUMBER, p_total_overhead IN NUMBER, p_total_used IN NUMBER, p_total_free IN NUMBER); PROCEDURE LOG_DASHED_LINE; PROCEDURE SET_HIST_DATA_EXISTS_FLAG(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_hist_data_exists_flag OUT VARCHAR2); PROCEDURE DO_INS_TARGETS_FOR_UI_QUERIES(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2); PROCEDURE GET_LOCAL_FS_NFS_USED_FREE(p_local_fs_used OUT NUMBER, p_local_fs_free OUT NUMBER, p_writeable_nfs_used OUT NUMBER, p_writeable_nfs_free OUT NUMBER); PROCEDURE GET_VOL_DISK_USED_BY_LAYER(p_storage_layer IN VARCHAR2, p_vol_allocated_by_layer OUT NUMBER, p_disk_allocated_by_layer OUT NUMBER); PROCEDURE GET_DB_DATA_FILES_SOURCE(p_db_df_on_local_fs OUT NUMBER, p_db_df_on_nfs OUT NUMBER, p_db_df_on_volumes OUT NUMBER, p_db_df_on_disks OUT NUMBER); PROCEDURE GET_DB_TABLESPACE_SIZE_USED(p_tablespace_size OUT NUMBER, p_tablespace_used OUT NUMBER); PROCEDURE GET_DB_ALLOC_USED_FREE(p_db_allocated OUT NUMBER, p_db_used OUT NUMBER, p_db_free OUT NUMBER); PROCEDURE GET_DB_STORAGE_SOURCE(p_db_on_local_disks OUT NUMBER, p_db_on_volumes OUT NUMBER, p_db_on_asm OUT NUMBER, p_db_on_local_fs OUT NUMBER, p_db_on_writeable_nfs OUT NUMBER); PROCEDURE GET_ALLOCATION_SUMMARY_VALUES(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_vol_allocated OUT NUMBER, p_vol_overhead OUT NUMBER, p_vol_unallocated OUT NUMBER, p_vol_size OUT NUMBER, p_asm_allocated OUT NUMBER, p_asm_unallocated OUT NUMBER, p_asm_overhead OUT NUMBER, p_disk_allocated OUT NUMBER, p_disk_unallocated OUT NUMBER, p_disk_size OUT NUMBER, p_asm_size OUT NUMBER, p_writeable_nfs_allocated OUT NUMBER); PROCEDURE GET_USAGE_SUMMARY_VALUES(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_calc_storage_source_flag IN NUMBER, p_db_on_local_disks OUT NUMBER, p_db_on_volumes OUT NUMBER, p_db_on_asm OUT NUMBER, p_db_on_local_fs OUT NUMBER, p_db_on_writeable_nfs OUT NUMBER, p_db_allocated OUT NUMBER, p_db_tablespace_size OUT NUMBER, p_db_tablespace_used OUT NUMBER, p_db_used OUT NUMBER, p_db_free OUT NUMBER, p_local_fs_on_local_disks OUT NUMBER, p_local_fs_on_volumes OUT NUMBER, p_local_fs_used OUT NUMBER, p_local_fs_free OUT NUMBER, p_writeable_nfs_used OUT NUMBER, p_writeable_nfs_free OUT NUMBER); FUNCTION GET_USAGE_SUMMARY_AS_CURSOR(p_db_on_local_disks IN NUMBER, p_db_on_volumes IN NUMBER, p_db_on_asm IN NUMBER, p_db_on_local_fs IN NUMBER, p_db_on_writeable_nfs IN NUMBER, p_db_allocated IN NUMBER, p_db_tablespace_size IN NUMBER, p_db_tablespace_used IN NUMBER, p_db_used IN NUMBER, p_db_free IN NUMBER, p_local_fs_on_local_disks IN NUMBER, p_local_fs_on_volumes IN NUMBER, p_local_fs_used IN NUMBER, p_local_fs_free IN NUMBER, p_writeable_nfs_used IN NUMBER, p_writeable_nfs_free IN NUMBER, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR; PROCEDURE GET_UTIL_SUMMARY_VALUES(p_vol_allocated IN NUMBER, p_vol_overhead IN NUMBER, p_vol_unallocated IN NUMBER, p_asm_allocated IN NUMBER, p_asm_unallocated IN NUMBER, p_asm_overhead IN NUMBER, p_disk_allocated IN NUMBER, p_disk_unallocated IN NUMBER, p_writeable_nfs_allocated IN NUMBER, p_db_used IN NUMBER, p_db_free IN NUMBER, p_local_fs_used IN NUMBER, p_local_fs_free IN NUMBER, p_writeable_nfs_used IN NUMBER, p_writeable_nfs_free IN NUMBER, p_total_allocated OUT NUMBER, p_total_unallocated OUT NUMBER, p_total_overhead OUT NUMBER, p_total_used OUT NUMBER, p_total_free OUT NUMBER); FUNCTION GET_UTIL_SUMMARY_AS_CURSOR(p_total_unallocated IN NUMBER, p_total_overhead IN NUMBER, p_total_used IN NUMBER, p_total_free IN NUMBER, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR; PROCEDURE GET_ASM_ALLOCATED_TO_DBS(p_asm_allocated OUT NUMBER); PROCEDURE GET_ASM_ALLOC_UNALLOC_OVERHEAD(p_asm_allocated OUT NUMBER, p_asm_unallocated OUT NUMBER, p_asm_overhead OUT NUMBER); PROCEDURE GET_VOL_DISK_NFS_SIZE(p_disk_size OUT NUMBER, p_vol_size OUT NUMBER, p_writeable_nfs_allocated OUT NUMBER); PROCEDURE GET_VOL_DISK_UNALLOCATED(p_disk_unallocated OUT NUMBER, p_vol_unallocated OUT NUMBER); FUNCTION GET_ALLOC_SUMMARY_AS_CURSOR(p_vol_allocated IN NUMBER, p_vol_overhead IN NUMBER, p_vol_unallocated IN NUMBER, p_vol_size IN NUMBER, p_asm_allocated IN NUMBER, p_asm_unallocated IN NUMBER, p_asm_overhead IN NUMBER, p_asm_size IN NUMBER, p_disk_allocated IN NUMBER, p_disk_unallocated IN NUMBER, p_disk_size IN NUMBER, p_writeable_nfs_allocated IN NUMBER, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR; FUNCTION GET_COLLECTION_INFO(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN SYS_REFCURSOR; FUNCTION GET_STORAGE_UNIT(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN VARCHAR2; -- -- History related methods -- PROCEDURE SET_GLOBAL_METRIC_NAME(p_target_type IN VARCHAR2); PROCEDURE SET_HIST_QUERY_ENV(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN INTEGER); PROCEDURE GET_MIN_MAX_DATES( p_storage_timeseries_rec_list IN STORAGE_TIMESERIES_REC_LIST, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE); PROCEDURE GET_MGMT_LYR_TIMESRS_AS_CURSOR( p_storage_timeseries_rec_list IN STORAGE_TIMESERIES_REC_LIST, p_summary_cursor OUT SYS_REFCURSOR); PROCEDURE GET_DISK_TIMESERIES_AS_CURSOR( p_storage_timeseries_rec_list IN STORAGE_TIMESERIES_REC_LIST, p_summary_cursor OUT SYS_REFCURSOR); PROCEDURE GET_APP_TIMESERIES_AS_CURSOR( p_storage_timeseries_rec_list IN STORAGE_TIMESERIES_REC_LIST, p_summary_cursor OUT SYS_REFCURSOR); PROCEDURE GET_SUMM_TIMESERIES_AS_CURSOR( p_storage_timeseries_rec_list IN STORAGE_TIMESERIES_REC_LIST, p_summary_cursor OUT SYS_REFCURSOR); FUNCTION GET_PERIOD_IN_DAYS(p_period IN VARCHAR2) RETURN NUMBER; FUNCTION GET_HIST_COLLECTION_TIMESTAMP(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN DATE; FUNCTION GET_HISTORY_STATS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR; PROCEDURE GET_HISTORY_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN NUMBER, p_storage_unit IN VARCHAR2, p_summary_cursor OUT SYS_REFCURSOR, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE); FUNCTION GET_HISTORY_DB_STATS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR; PROCEDURE GET_HISTORY_DB_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN NUMBER, p_storage_unit IN VARCHAR2, p_summary_cursor OUT SYS_REFCURSOR, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE); FUNCTION GET_HISTORY_LOCALFS_STATS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR; PROCEDURE GET_HISTORY_LOCALFS_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN NUMBER, p_storage_unit IN VARCHAR2, p_summary_cursor OUT SYS_REFCURSOR, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE); FUNCTION GET_HISTORY_DISK_STATS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR; PROCEDURE GET_HISTORY_DISK_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN NUMBER, p_storage_unit IN VARCHAR2, p_summary_cursor OUT SYS_REFCURSOR, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE); FUNCTION GET_HISTORY_ASM_STATS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR; PROCEDURE GET_HISTORY_ASM_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN NUMBER, p_storage_unit IN VARCHAR2, p_summary_cursor OUT SYS_REFCURSOR, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE); FUNCTION GET_HISTORY_VOL_STATS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR; PROCEDURE GET_HISTORY_VOL_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN NUMBER, p_storage_unit IN VARCHAR2, p_summary_cursor OUT SYS_REFCURSOR, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE); FUNCTION GET_HISTORY_NFS_STATS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR; PROCEDURE GET_HISTORY_NFS_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN NUMBER, p_storage_unit IN VARCHAR2, p_summary_cursor OUT SYS_REFCURSOR, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE); FUNCTION GET_STORAGE_COLLECTION_ERRORS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN SYS_REFCURSOR; FUNCTION GET_STORAGE_MAPPING_ISSUES(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN SYS_REFCURSOR; FUNCTION GET_SUMMARIZED_ASM_COUNT(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN NUMBER; PROCEDURE GET_STORAGE_ISSUES_COUNT(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_unmonitored_nfs_count OUT NUMBER, p_other_issues_count OUT NUMBER); PROCEDURE GET_HOST_DB_ASM_MET_ERRORS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_host_metric_errors OUT NUMBER, p_db_metric_errors OUT NUMBER, p_asm_metric_errors OUT NUMBER); ---------------------------------------------------------------------- -- -- Gets data to render the summary section of UI above the page -- properties in host storage UI pages. -- PROCEDURE GET_STORAGE_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_target_timezone_region OUT VARCHAR2, p_collection_info OUT SYS_REFCURSOR, p_allocation_summary OUT SYS_REFCURSOR, p_usage_summary OUT SYS_REFCURSOR, p_utilization_summary OUT SYS_REFCURSOR, p_num_of_targets OUT NUMBER, p_targets_having_snapshot OUT NUMBER, p_targets_with_coll_defined OUT NUMBER, p_targets_with_coll_enabled OUT NUMBER, p_hist_data_exists_flag OUT VARCHAR2, p_storage_unit OUT VARCHAR2, p_history_metric_defined_flag OUT VARCHAR2) IS -- Allocation summary variables l_vol_allocated NUMBER; l_vol_overhead NUMBER; l_asm_allocated NUMBER; l_disk_allocated NUMBER; l_vol_unallocated NUMBER; l_asm_unallocated NUMBER; l_asm_overhead NUMBER; l_disk_unallocated NUMBER; l_disk_size NUMBER; l_asm_size NUMBER; l_writeable_nfs_allocated NUMBER; l_vol_size NUMBER; -- Usage summary variables l_db_on_local_disks NUMBER; l_db_on_volumes NUMBER; l_db_on_asm NUMBER; l_db_on_local_fs NUMBER; l_db_on_writeable_nfs NUMBER; l_db_allocated NUMBER; l_db_tablespace_size NUMBER; l_db_tablespace_used NUMBER; l_db_used NUMBER; l_db_free NUMBER; l_local_fs_on_local_disks NUMBER; l_local_fs_on_volumes NUMBER; l_local_fs_used NUMBER; l_local_fs_free NUMBER; l_writeable_nfs_used NUMBER; l_writeable_nfs_free NUMBER; -- Utilization summary variables l_total_allocated NUMBER; l_total_unallocated NUMBER; l_total_overhead NUMBER; l_total_used NUMBER; l_total_free NUMBER; BEGIN p_target_timezone_region := GET_TARGET_TIMEZONE_REGION( p_target_name => p_target_name, p_target_type => p_target_type); INSERT_TARGETS_FOR_UI_QUERIES(p_target_name, p_target_type); GET_STORAGE_DATA_AVAIL_INFO(p_target_name => p_target_name, p_target_type => p_target_type, p_num_of_targets => p_num_of_targets, p_targets_having_snapshot => p_targets_having_snapshot, p_targets_with_coll_defined => p_targets_with_coll_defined, p_targets_with_coll_enabled => p_targets_with_coll_enabled); p_collection_info := GET_COLLECTION_INFO(p_target_name => p_target_name, p_target_type => p_target_type); SET_HIST_DATA_EXISTS_FLAG(p_target_name => p_target_name, p_target_type => p_target_type, p_hist_data_exists_flag => p_hist_data_exists_flag); p_storage_unit := GET_STORAGE_UNIT(p_target_name => p_target_name, p_target_type => p_target_type); DELETE_MISSING_SNAPSHOT_HOSTS; GET_STORAGE_SUMMARY_VALUES(p_target_name => p_target_name, p_target_type => p_target_type, p_calc_storage_source_flag => MGMT_GLOBAL.G_TRUE, p_vol_allocated => l_vol_allocated, p_vol_overhead => l_vol_overhead, p_vol_unallocated => l_vol_unallocated, p_vol_size => l_vol_size, p_asm_allocated => l_asm_allocated, p_asm_unallocated => l_asm_unallocated, p_asm_overhead => l_asm_overhead, p_asm_size => l_asm_size, p_disk_allocated => l_disk_allocated, p_disk_unallocated => l_disk_unallocated, p_disk_size => l_disk_size, p_writeable_nfs_allocated => l_writeable_nfs_allocated, p_db_on_local_disks => l_db_on_local_disks, p_db_on_volumes => l_db_on_volumes, p_db_on_asm => l_db_on_asm, p_db_on_local_fs => l_db_on_local_fs, p_db_on_writeable_nfs => l_db_on_writeable_nfs, p_db_allocated => l_db_allocated, p_db_tablespace_size => l_db_tablespace_size, p_db_tablespace_used => l_db_tablespace_used, p_db_used => l_db_used, p_db_free => l_db_free, p_local_fs_on_local_disks => l_local_fs_on_local_disks, p_local_fs_on_volumes => l_local_fs_on_volumes, p_local_fs_used => l_local_fs_used, p_local_fs_free => l_local_fs_free, p_writeable_nfs_used => l_writeable_nfs_used, p_writeable_nfs_free => l_writeable_nfs_free, p_total_allocated => l_total_allocated, p_total_unallocated => l_total_unallocated, p_total_overhead => l_total_overhead, p_total_used => l_total_used, p_total_free => l_total_free); p_allocation_summary := GET_ALLOC_SUMMARY_AS_CURSOR( p_vol_allocated => l_vol_allocated, p_vol_overhead => l_vol_overhead, p_vol_unallocated => l_vol_unallocated, p_vol_size => l_vol_size, p_asm_allocated => l_asm_allocated, p_asm_unallocated => l_asm_unallocated, p_asm_overhead => l_asm_overhead, p_asm_size => l_asm_size, p_disk_allocated => l_disk_allocated, p_disk_unallocated => l_disk_unallocated, p_disk_size => l_disk_size, p_writeable_nfs_allocated => l_writeable_nfs_allocated, p_storage_unit => p_storage_unit); p_usage_summary := GET_USAGE_SUMMARY_AS_CURSOR( p_db_on_local_disks => l_db_on_local_disks, p_db_on_volumes => l_db_on_volumes, p_db_on_asm => l_db_on_asm, p_db_on_local_fs => l_db_on_local_fs, p_db_on_writeable_nfs => l_db_on_writeable_nfs, p_db_allocated => l_db_allocated, p_db_tablespace_size => l_db_tablespace_size, p_db_tablespace_used => l_db_tablespace_used, p_db_used => l_db_used, p_db_free => l_db_free, p_local_fs_on_local_disks => l_local_fs_on_local_disks, p_local_fs_on_volumes => l_local_fs_on_volumes, p_local_fs_used => l_local_fs_used, p_local_fs_free => l_local_fs_free, p_writeable_nfs_used => l_writeable_nfs_used, p_writeable_nfs_free => l_writeable_nfs_free, p_storage_unit => p_storage_unit); p_utilization_summary := GET_UTIL_SUMMARY_AS_CURSOR( p_total_unallocated => l_total_unallocated, p_total_overhead => l_total_overhead, p_total_used => l_total_used, p_total_free => l_total_free, p_storage_unit => p_storage_unit); p_history_metric_defined_flag := IS_HISTORY_METRIC_DEFINED( p_target_name => p_target_name, p_target_type => p_target_type); END GET_STORAGE_SUMMARY; ---------------------------------------------------------------------- -- -- Inserts target names into a temporary table MGMT_STORAGE_REPORT_UI_TARGETS. -- In case of host, inserts the host itself. -- In case of group, inserts associated host list for the group. -- This approach allows common code for both host and group targets. -- PROCEDURE INSERT_TARGETS_FOR_UI_QUERIES(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) IS BEGIN -- first delete data from temporary tables. -- this table could have stale data from previous -- session due to session pooling. DELETE MGMT_STORAGE_REPORT_UI_TARGETS; DO_INS_TARGETS_FOR_UI_QUERIES(p_target_name => p_target_name, p_target_type => p_target_type); END INSERT_TARGETS_FOR_UI_QUERIES; ---------------------------------------------------------------------- PROCEDURE INSERT_TARGETS_FOR_UI_QUERIES(p_target_guid IN RAW) IS l_target_type MGMT_TARGETS.target_type%TYPE; l_target_name MGMT_TARGETS.target_name%TYPE; BEGIN GET_TARGET_NAME_TYPE(p_target_guid => p_target_guid, p_target_name => l_target_name, p_target_type => l_target_type); INSERT_TARGETS_FOR_UI_QUERIES(p_target_name => l_target_name, p_target_type => l_target_type); END INSERT_TARGETS_FOR_UI_QUERIES; ---------------------------------------------------------------------- -- -- Deletes hosts from MGMT_STORAGE_REPORT_UI_TARGETS table -- which do not have valid host_storage snapshot. -- PROCEDURE DELETE_MISSING_SNAPSHOT_HOSTS IS BEGIN -- delete hosts with missing storage snapshots from the temporary table DELETE FROM MGMT_STORAGE_REPORT_UI_TARGETS WHERE target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE AND ecm_snapshot_id IS NULL; END DELETE_MISSING_SNAPSHOT_HOSTS; ---------------------------------------------------------------------- -- -- Gets target name and type, given target guid of a target. -- PROCEDURE GET_TARGET_NAME_TYPE(p_target_guid IN RAW, p_target_name OUT VARCHAR2, p_target_type OUT VARCHAR2) IS BEGIN SELECT target_name, target_type INTO p_target_name, p_target_type FROM MGMT_TARGETS WHERE target_guid = p_target_guid; END GET_TARGET_NAME_TYPE; ---------------------------------------------------------------------- -- -- Gets storage history data to render the history summary page. -- PROCEDURE GET_STORAGE_HIST_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period IN VARCHAR2, p_target_timezone_region OUT VARCHAR2, p_collection_timestamp OUT DATE, p_history_summary OUT SYS_REFCURSOR, p_history_stats OUT SYS_REFCURSOR, p_storage_unit OUT VARCHAR2, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE, p_storage_hist_enabled_flag OUT VARCHAR2) IS l_period_in_days INTEGER; BEGIN p_target_timezone_region := GET_TARGET_TIMEZONE_REGION( p_target_name => p_target_name, p_target_type => p_target_type); SET_GLOBAL_METRIC_NAME(p_target_type); l_period_in_days := GET_PERIOD_IN_DAYS(p_period); SET_HIST_QUERY_ENV(p_target_name, p_target_type, l_period_in_days); p_collection_timestamp := GET_HIST_COLLECTION_TIMESTAMP( p_target_name, p_target_type); p_storage_unit := GET_STORAGE_UNIT(p_target_name, p_target_type); p_history_stats := GET_HISTORY_STATS(p_target_name, p_target_type, p_storage_unit); GET_HISTORY_SUMMARY(p_target_name => p_target_name, p_target_type => p_target_type, p_period_in_days => l_period_in_days, p_storage_unit => p_storage_unit, p_summary_cursor => p_history_summary, p_min_timeseries_date => p_min_timeseries_date, p_max_timeseries_date => p_max_timeseries_date); p_storage_hist_enabled_flag := GET_STORAGE_HIST_ENABLED( p_target_name => p_target_name, p_target_type => p_target_type); END GET_STORAGE_HIST_SUMMARY; ---------------------------------------------------------------------- -- -- Gets storage history data to render the storage history of -- databases on a host. -- PROCEDURE GET_STORAGE_HIST_DB(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period IN VARCHAR2, p_target_timezone_region OUT VARCHAR2, p_collection_timestamp OUT DATE, p_history_summary OUT SYS_REFCURSOR, p_history_stats OUT SYS_REFCURSOR, p_storage_unit OUT VARCHAR2, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE, p_storage_hist_enabled_flag OUT VARCHAR2) IS l_period_in_days INTEGER; BEGIN p_target_timezone_region := GET_TARGET_TIMEZONE_REGION( p_target_name => p_target_name, p_target_type => p_target_type); SET_GLOBAL_METRIC_NAME(p_target_type); l_period_in_days := GET_PERIOD_IN_DAYS(p_period); SET_HIST_QUERY_ENV(p_target_name, p_target_type, l_period_in_days); p_collection_timestamp := GET_HIST_COLLECTION_TIMESTAMP( p_target_name, p_target_type); p_storage_unit := GET_STORAGE_UNIT(p_target_name, p_target_type); p_history_stats := GET_HISTORY_DB_STATS(p_target_name, p_target_type, p_storage_unit); GET_HISTORY_DB_SUMMARY(p_target_name, p_target_type, l_period_in_days, p_storage_unit, p_history_summary, p_min_timeseries_date, p_max_timeseries_date); p_storage_hist_enabled_flag := GET_STORAGE_HIST_ENABLED( p_target_name => p_target_name, p_target_type => p_target_type); END GET_STORAGE_HIST_DB; ---------------------------------------------------------------------- -- -- Gets storage history data to render the storage history of -- local file systems on a host. -- PROCEDURE GET_STORAGE_HIST_LOCALFS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period IN VARCHAR2, p_target_timezone_region OUT VARCHAR2, p_collection_timestamp OUT DATE, p_history_summary OUT SYS_REFCURSOR, p_history_stats OUT SYS_REFCURSOR, p_storage_unit OUT VARCHAR2, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE, p_storage_hist_enabled_flag OUT VARCHAR2) IS l_period_in_days INTEGER; BEGIN p_target_timezone_region := GET_TARGET_TIMEZONE_REGION( p_target_name => p_target_name, p_target_type => p_target_type); SET_GLOBAL_METRIC_NAME(p_target_type); l_period_in_days := GET_PERIOD_IN_DAYS(p_period); SET_HIST_QUERY_ENV(p_target_name, p_target_type, l_period_in_days); p_collection_timestamp := GET_HIST_COLLECTION_TIMESTAMP( p_target_name, p_target_type); p_storage_unit := GET_STORAGE_UNIT(p_target_name, p_target_type); p_history_stats := GET_HISTORY_LOCALFS_STATS(p_target_name, p_target_type, p_storage_unit); GET_HISTORY_LOCALFS_SUMMARY(p_target_name, p_target_type, l_period_in_days, p_storage_unit, p_history_summary, p_min_timeseries_date, p_max_timeseries_date); p_storage_hist_enabled_flag := GET_STORAGE_HIST_ENABLED( p_target_name => p_target_name, p_target_type => p_target_type); END GET_STORAGE_HIST_LOCALFS; ---------------------------------------------------------------------- -- -- Gets storage history data to render the storage history of NFS on a host. -- PROCEDURE GET_STORAGE_HIST_NFS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period IN VARCHAR2, p_target_timezone_region OUT VARCHAR2, p_collection_timestamp OUT DATE, p_history_summary OUT SYS_REFCURSOR, p_history_stats OUT SYS_REFCURSOR, p_storage_unit OUT VARCHAR2, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE, p_storage_hist_enabled_flag OUT VARCHAR2) IS l_period_in_days INTEGER; BEGIN p_target_timezone_region := GET_TARGET_TIMEZONE_REGION( p_target_name => p_target_name, p_target_type => p_target_type); SET_GLOBAL_METRIC_NAME(p_target_type); l_period_in_days := GET_PERIOD_IN_DAYS(p_period); SET_HIST_QUERY_ENV(p_target_name, p_target_type, l_period_in_days); p_collection_timestamp := GET_HIST_COLLECTION_TIMESTAMP( p_target_name, p_target_type); p_storage_unit := GET_STORAGE_UNIT(p_target_name, p_target_type); p_history_stats := GET_HISTORY_NFS_STATS(p_target_name, p_target_type, p_storage_unit); GET_HISTORY_NFS_SUMMARY(p_target_name, p_target_type, l_period_in_days, p_storage_unit, p_history_summary, p_min_timeseries_date, p_max_timeseries_date); p_storage_hist_enabled_flag := GET_STORAGE_HIST_ENABLED( p_target_name => p_target_name, p_target_type => p_target_type); END GET_STORAGE_HIST_NFS; ---------------------------------------------------------------------- -- -- Gets storage history data to render the storage history of -- local disks on a host. -- PROCEDURE GET_STORAGE_HIST_DISKS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period IN VARCHAR2, p_target_timezone_region OUT VARCHAR2, p_collection_timestamp OUT DATE, p_history_summary OUT SYS_REFCURSOR, p_history_stats OUT SYS_REFCURSOR, p_storage_unit OUT VARCHAR2, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE, p_storage_hist_enabled_flag OUT VARCHAR2) IS l_period_in_days INTEGER; BEGIN p_target_timezone_region := GET_TARGET_TIMEZONE_REGION( p_target_name => p_target_name, p_target_type => p_target_type); SET_GLOBAL_METRIC_NAME(p_target_type); l_period_in_days := GET_PERIOD_IN_DAYS(p_period); SET_HIST_QUERY_ENV(p_target_name, p_target_type, l_period_in_days); p_collection_timestamp := GET_HIST_COLLECTION_TIMESTAMP( p_target_name, p_target_type); p_storage_unit := GET_STORAGE_UNIT(p_target_name, p_target_type); p_history_stats := GET_HISTORY_DISK_STATS(p_target_name, p_target_type, p_storage_unit); GET_HISTORY_DISK_SUMMARY(p_target_name, p_target_type, l_period_in_days, p_storage_unit, p_history_summary, p_min_timeseries_date, p_max_timeseries_date); p_storage_hist_enabled_flag := GET_STORAGE_HIST_ENABLED( p_target_name => p_target_name, p_target_type => p_target_type); END GET_STORAGE_HIST_DISKS; ---------------------------------------------------------------------- -- -- Gets storage history data to render the storage history of asm on a host. -- PROCEDURE GET_STORAGE_HIST_ASM(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period IN VARCHAR2, p_target_timezone_region OUT VARCHAR2, p_collection_timestamp OUT DATE, p_history_summary OUT SYS_REFCURSOR, p_history_stats OUT SYS_REFCURSOR, p_storage_unit OUT VARCHAR2, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE, p_storage_hist_enabled_flag OUT VARCHAR2) IS l_period_in_days INTEGER; BEGIN p_target_timezone_region := GET_TARGET_TIMEZONE_REGION( p_target_name => p_target_name, p_target_type => p_target_type); SET_GLOBAL_METRIC_NAME(p_target_type); l_period_in_days := GET_PERIOD_IN_DAYS(p_period); SET_HIST_QUERY_ENV(p_target_name, p_target_type, l_period_in_days); p_collection_timestamp := GET_HIST_COLLECTION_TIMESTAMP( p_target_name, p_target_type); p_storage_unit := GET_STORAGE_UNIT(p_target_name, p_target_type); p_history_stats := GET_HISTORY_ASM_STATS(p_target_name, p_target_type, p_storage_unit); GET_HISTORY_ASM_SUMMARY(p_target_name, p_target_type, l_period_in_days, p_storage_unit, p_history_summary, p_min_timeseries_date, p_max_timeseries_date); p_storage_hist_enabled_flag := GET_STORAGE_HIST_ENABLED( p_target_name => p_target_name, p_target_type => p_target_type); END GET_STORAGE_HIST_ASM; ---------------------------------------------------------------------- -- -- Gets storage history data to render the storage history of volumes on a host. -- PROCEDURE GET_STORAGE_HIST_VOL(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period IN VARCHAR2, p_target_timezone_region OUT VARCHAR2, p_collection_timestamp OUT DATE, p_history_summary OUT SYS_REFCURSOR, p_history_stats OUT SYS_REFCURSOR, p_storage_unit OUT VARCHAR2, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE, p_storage_hist_enabled_flag OUT VARCHAR2) IS l_period_in_days INTEGER; BEGIN p_target_timezone_region := GET_TARGET_TIMEZONE_REGION( p_target_name => p_target_name, p_target_type => p_target_type); SET_GLOBAL_METRIC_NAME(p_target_type); l_period_in_days := GET_PERIOD_IN_DAYS(p_period); SET_HIST_QUERY_ENV(p_target_name, p_target_type, l_period_in_days); p_collection_timestamp := GET_HIST_COLLECTION_TIMESTAMP( p_target_name, p_target_type); p_storage_unit := GET_STORAGE_UNIT(p_target_name, p_target_type); p_history_stats := GET_HISTORY_VOL_STATS(p_target_name, p_target_type, p_storage_unit); GET_HISTORY_VOL_SUMMARY(p_target_name, p_target_type, l_period_in_days, p_storage_unit, p_history_summary, p_min_timeseries_date, p_max_timeseries_date); p_storage_hist_enabled_flag := GET_STORAGE_HIST_ENABLED( p_target_name => p_target_name, p_target_type => p_target_type); END GET_STORAGE_HIST_VOL; ---------------------------------------------------------------------- -- -- Runs storage history repository collection for host or group. -- PROCEDURE RUN_HIST_COLLECTION(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) IS l_metric_name MGMT_METRICS.metric_name%TYPE; BEGIN INSERT_TARGETS_FOR_UI_QUERIES(p_target_name, p_target_type); SET_HIST_QUERY_ENV(p_target_name => p_target_name, p_target_type => p_target_type, p_period_in_days => STORAGE_UI_COMMON_PKG.G_DAYS_PER_MONTH); SET_GLOBAL_METRIC_NAME(p_target_type => p_target_type); MGMT_COLLECTION.RUN_COLLECTION(p_target_type => p_target_type, p_target_name => p_target_name, p_metric_name => gv_storage_rep_metric); END RUN_HIST_COLLECTION; ---------------------------------------------------------------------- -- -- This PROCEDURE returns 'Y' if storage history for a group -- is enabled, 'N' otherwise. If the target type is host, -- it always returns 'Y'. -- FUNCTION GET_STORAGE_HIST_ENABLED(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN VARCHAR2 IS l_storage_hist_enabled VARCHAR2(1); BEGIN IF (p_target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE) THEN l_storage_hist_enabled :=STORAGE_UI_UTIL_PKG.YES; ELSE SELECT DECODE(count(*), 0,STORAGE_UI_UTIL_PKG.NO,STORAGE_UI_UTIL_PKG.YES) INTO l_storage_hist_enabled FROM MGMT_TARGET_PROPERTIES tp, MGMT_TARGETS t WHERE t.target_guid = tp.target_guid AND tp.property_name = G_GRP_STORAGE_HIST_ENABLED AND property_type = MGMT_GLOBAL.G_INSTANCE_PROP_TYPE AND target_name = p_target_name AND target_type = p_target_type AND property_value =STORAGE_UI_UTIL_PKG.YES; END IF; RETURN l_storage_hist_enabled; END GET_STORAGE_HIST_ENABLED; ---------------------------------------------------------------------- -- -- Gets storage vendor disribution for a host or a group -- based on writeable NFS and disks information. -- PROCEDURE GET_STORAGE_VENDOR_DISTRIB(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_vendor_distrib OUT SYS_REFCURSOR) IS l_storage_unit VARCHAR2(2); BEGIN INSERT_TARGETS_FOR_UI_QUERIES(p_target_name, p_target_type); l_storage_unit := GET_STORAGE_UNIT(p_target_name, p_target_type); OPEN p_storage_vendor_distrib FOR SELECT vendor, storage_layer, round(SUM(sizeb)/STORAGE_UI_UTIL_PKG.BYTES_PER_GB,2) host_visible FROM ( SELECT vendor, storage_layer, sizeb, ROW_NUMBER() OVER (PARTITION BY storage_layer, global_unique_id ORDER BY ecm_snapshot_id) AS global_unique_id_rownumber FROM MGMT_V_VENDOR_DISTRIBUTION ) WHERE global_unique_id_rownumber = 1 GROUP BY vendor, storage_layer; END GET_STORAGE_VENDOR_DISTRIB; ---------------------------------------------------------------------- -- -- Returns information on storage data availability. -- For a host, it returns -- p_num_of_targets => num of targets, in this case 1. -- p_targets_having_snapshot => 1 if host has storage snapshot, 0 otherwise. -- p_targets_with_coll_defined => 1 if host has storage collection defined, -- 0 otherwise. -- p_targets_with_coll_enabled => 1 if host has storage collection enabled, -- 0 otherwise. -- For a group, it returns -- p_num_of_targets => # of associated host targets for the group. -- p_targets_having_snapshot => # of associated hosts having storage snapshot -- p_targets_with_coll_defined => # of associated hosts with storage snapshot -- collection defined -- p_targets_with_coll_enabled => # of associated hosts with storage snapshot -- collection enabled -- PROCEDURE GET_STORAGE_DATA_AVAIL_INFO(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_num_of_targets OUT NUMBER, p_targets_having_snapshot OUT NUMBER, p_targets_with_coll_defined OUT NUMBER, p_targets_with_coll_enabled OUT NUMBER) IS BEGIN SELECT NVL(SUM(is_enabled), 0) targets_with_coll_enabled, COUNT(*) targets_with_coll_defined INTO p_targets_with_coll_enabled, p_targets_with_coll_defined FROM MGMT_COLLECTIONS c, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE uit.target_guid = c.object_guid AND c.coll_name = G_HOST_STORAGE_COLL_NAME; SELECT COUNT(*) INTO p_num_of_targets FROM MGMT_STORAGE_REPORT_UI_TARGETS WHERE target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE; SELECT COUNT(*) INTO p_targets_having_snapshot FROM MGMT_STORAGE_REPORT_UI_TARGETS WHERE ecm_snapshot_id IS NOT NULL; END GET_STORAGE_DATA_AVAIL_INFO; ---------------------------------------------------------------------- -- -- Gets latest collection timestamp of all the relevant snapshots of given -- target. -- FUNCTION GET_COLLECTION_TIMESTAMP(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN DATE IS l_collection_timestamp MGMT$ECM_CURRENT_SNAPSHOTS.saved_timestamp%TYPE; BEGIN SELECT MAX(timestamp) INTO l_collection_timestamp FROM ( SELECT MAX(snap.saved_timestamp) timestamp FROM MGMT$ECM_CURRENT_SNAPSHOTS snap, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE uit.target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE AND uit.target_name = snap.host_name AND snap.snapshot_type IN (G_DB_CONFIG_COLL_NAME, G_RAC_CONFIG_COLL_NAME, G_HOST_STORAGE_COLL_NAME) UNION ALL SELECT MAX(collection_timestamp) timestamp FROM MGMT_CURRENT_METRICS cm, MGMT_TARGETS t, MGMT_METRICS m, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE uit.target_name = t.host_name AND t.target_type = MGMT_GLOBAL.G_ASM_TARGET_TYPE AND t.target_guid = cm.target_guid AND cm.metric_guid = m.metric_guid AND t.type_meta_ver = m.type_meta_ver AND (m.category_prop_1 = ' ' OR m.category_prop_1 = t.category_prop_1) AND (m.category_prop_2 = ' ' OR m.category_prop_2 = t.category_prop_2) AND (m.category_prop_3 = ' ' OR m.category_prop_3 = t.category_prop_3) AND (m.category_prop_4 = ' ' OR m.category_prop_4 = t.category_prop_4) AND (m.category_prop_5 = ' ' OR m.category_prop_5 = t.category_prop_5) AND m.metric_name in (STORAGE_UI_COMMON_PKG.G_ASM_DG_USAGE_METRIC, STORAGE_UI_COMMON_PKG.G_ASM_DB_DG_METRIC) ); RETURN l_collection_timestamp; END GET_COLLECTION_TIMESTAMP; ---------------------------------------------------------------------- -- -- Gets the following types of errors for a host or group -- 1. any storage metric collection errors -- 2. any storage metric mapping issues -- PROCEDURE GET_STORAGE_ERRORS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_target_timezone_region OUT VARCHAR2, p_collection_timestamp OUT DATE, p_storage_collection_errors OUT SYS_REFCURSOR, p_storage_mapping_issues OUT SYS_REFCURSOR, p_targets_with_missing_snaps OUT SYS_REFCURSOR, p_targets_with_no_collection OUT SYS_REFCURSOR, p_targets_with_coll_disabled OUT SYS_REFCURSOR) IS BEGIN p_target_timezone_region := GET_TARGET_TIMEZONE_REGION( p_target_name => p_target_name, p_target_type => p_target_type); INSERT_TARGETS_FOR_UI_QUERIES(p_target_name => p_target_name, p_target_type => p_target_type); OPEN p_targets_with_no_collection FOR SELECT target_name FROM MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE NOT EXISTS ( SELECT c.object_guid FROM MGMT_COLLECTIONS c WHERE c.coll_name = G_HOST_STORAGE_COLL_NAME AND c.object_guid = uit.target_guid ) AND target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE; OPEN p_targets_with_coll_disabled FOR SELECT target_name FROM MGMT_STORAGE_REPORT_UI_TARGETS uit, MGMT_COLLECTIONS c WHERE uit.target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE AND uit.target_guid = c.object_guid AND c.coll_name = G_HOST_STORAGE_COLL_NAME AND c.is_enabled = MGMT_GLOBAL.G_FALSE; OPEN p_targets_with_missing_snaps FOR SELECT target_name FROM MGMT_STORAGE_REPORT_UI_TARGETS WHERE target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE AND ecm_snapshot_id IS NULL; p_collection_timestamp := GET_COLLECTION_TIMESTAMP( p_target_name => p_target_name, p_target_type => p_target_type); p_storage_collection_errors := GET_STORAGE_COLLECTION_ERRORS( p_target_name => p_target_name, p_target_type => p_target_type); p_storage_mapping_issues := GET_STORAGE_MAPPING_ISSUES( p_target_name => p_target_name, p_target_type => p_target_type); END GET_STORAGE_ERRORS; ---------------------------------------------------------------------- -- -- Gets stats related to configuration of the target. Stats are as follows. -- . total database targets deployed across summarized hosts -- . number of database targets with storage data across summarized hosts -- . total ASM targets deployed across summarized hosts -- . number of ASM targets with storage data across summarized hosts -- . Total number of mapping issues related to unmonitored NFS targets -- . Total number of mapping issues other than the unmonitored NFS targets -- . Total storage metric collection errors for host(s). -- . Total storage metric collection errors for associated database target(s) -- having valid associated host storage snapshots. -- . Total storage metric collection errors for associated ASM target(s). -- having valid associated host storage snapshots. -- PROCEDURE GET_STRG_DATA_CFG_AND_ERRORS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_total_dbs OUT NUMBER, p_summarized_dbs OUT NUMBER, p_total_asm_count OUT NUMBER, p_summarized_asm_count OUT NUMBER, p_host_metric_errors OUT NUMBER, p_db_metric_errors OUT NUMBER, p_asm_metric_errors OUT NUMBER, p_unmonitored_nfs_count OUT NUMBER, p_other_issues_count OUT NUMBER) IS BEGIN -- -- Compute total number of rac_db and non_rac_db (stand alone db) targets -- having associated host storage snapshot as p_total_dbs. DB Targets -- not having valid host storage snapshot are excluded from all computations. -- SELECT non_rac_db_count+rac_db_count INTO p_total_dbs FROM ( SELECT COUNT(*) non_rac_db_count FROM MGMT_TARGETS t, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE uit.ecm_snapshot_id IS NOT NULL AND uit.target_name = t.host_name AND t.target_type = MGMT_GLOBAL.G_DATABASE_TARGET_TYPE AND NOT EXISTS ( SELECT member_target_guid FROM MGMT_TARGET_MEMBERSHIPS WHERE member_target_guid = t.target_guid AND composite_target_type = MGMT_GLOBAL.G_RAC_DATABASE_TARGET_TYPE ) ), ( SELECT COUNT(*) rac_db_count FROM MGMT_TARGETS t, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE uit.ecm_snapshot_id IS NOT NULL AND uit.target_name = t.host_name AND t.target_type = MGMT_GLOBAL.G_RAC_DATABASE_TARGET_TYPE ); -- -- Compute number of ASM targets having associated host storage snapshot -- as p_total_asm_count. ASM targets not having valid host storage snapshot -- are excluded from all computations. -- SELECT COUNT(*) INTO p_total_asm_count FROM MGMT_TARGETS t, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE uit.ecm_snapshot_id IS NOT NULL AND t.host_name = uit.target_name AND t.target_type = MGMT_GLOBAL.G_ASM_TARGET_TYPE; -- -- Compute number of db/rac targets with appropriate snapshot as -- p_summarized_dbs. It will be less than p_total_dbs when expected -- oracle_dbconfig or oracle_racconfig snapshot(s) are missing. -- SELECT count(*) INTO p_summarized_dbs FROM MGMT_V_HOST_DBS; -- -- Compute number of asm targets with appropriate metric collections as -- p_summarized_asm_count. It will be less than p_total_asm_count when -- all of the expected metric columns are missing from mgmt_current_metrics. -- p_summarized_asm_count := GET_SUMMARIZED_ASM_COUNT( p_target_name => p_target_name, p_target_type => p_target_type); GET_STORAGE_ISSUES_COUNT(p_target_name => p_target_name, p_target_type => p_target_type, p_unmonitored_nfs_count => p_unmonitored_nfs_count, p_other_issues_count => p_other_issues_count); GET_HOST_DB_ASM_MET_ERRORS(p_target_name => p_target_name, p_target_type => p_target_type, p_host_metric_errors => p_host_metric_errors, p_db_metric_errors => p_db_metric_errors, p_asm_metric_errors => p_asm_metric_errors); END GET_STRG_DATA_CFG_AND_ERRORS; ---------------------------------------------------------------------- PROCEDURE GET_HOST_DB_ASM_MET_ERRORS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_host_metric_errors OUT NUMBER, p_db_metric_errors OUT NUMBER, p_asm_metric_errors OUT NUMBER) IS BEGIN SELECT SUM(DECODE(e.target_type, MGMT_GLOBAL.G_HOST_TARGET_TYPE, 1, 0)) host_metric_errors, SUM(DECODE(e.target_type, MGMT_GLOBAL.G_DATABASE_TARGET_TYPE, 1, MGMT_GLOBAL.G_RAC_DATABASE_TARGET_TYPE, 1, 0)) db_metric_errors, SUM(DECODE(e.target_type, MGMT_GLOBAL.G_ASM_TARGET_TYPE, 1, 0)) asm_metric_errors INTO p_host_metric_errors, p_db_metric_errors, p_asm_metric_errors FROM MGMT_V_STORAGE_COLL_ERRORS e; END GET_HOST_DB_ASM_MET_ERRORS; ---------------------------------------------------------------------- -- -- Gets timezone region of a target. -- FUNCTION GET_TARGET_TIMEZONE_REGION(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN VARCHAR2 IS l_target_timezone_region MGMT_TARGETS.timezone_region%TYPE; BEGIN SELECT NVL(timezone_region, sessiontimezone) INTO l_target_timezone_region FROM MGMT_TARGETS WHERE target_name = p_target_name AND target_type = p_target_type; RETURN l_target_timezone_region; END GET_TARGET_TIMEZONE_REGION; ---------------------------------------------------------------------- -- -- Returns 'Y' if storage history for a group is enabled, 'N' otherwise. -- Returns 'Y' for a host target. -- PROCEDURE GET_HIST_ENABLED_EXISTS_FLAG(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_hist_enabled OUT VARCHAR2, p_hist_data_exists_flag OUT VARCHAR2, p_refresh_job_name OUT MGMT_JOB.job_name%TYPE, p_refresh_job_exec_id OUT MGMT_JOB_EXEC_SUMMARY.execution_id%TYPE, p_refresh_job_status OUT MGMT_JOB_EXEC_SUMMARY.status%TYPE) IS BEGIN -- since this method can be invoked independently -- we need to insert the targets from here INSERT_TARGETS_FOR_UI_QUERIES(p_target_name, p_target_type); SET_HIST_DATA_EXISTS_FLAG(p_target_name => p_target_name, p_target_type => p_target_type, p_hist_data_exists_flag => p_hist_data_exists_flag); p_storage_hist_enabled := GET_STORAGE_HIST_ENABLED( p_target_name => p_target_name, p_target_type => p_target_type); GET_REFRESH_JOB_INFO(p_target_name => p_target_name, p_target_type => p_target_type, p_refresh_job_name => p_refresh_job_name, p_refresh_job_exec_id => p_refresh_job_exec_id, p_refresh_job_status => p_refresh_job_status); END GET_HIST_ENABLED_EXISTS_FLAG; ---------------------------------------------------------------------- PROCEDURE GET_DB_ALLOC_USED_FREE(p_db_allocated OUT NUMBER, p_db_used OUT NUMBER, p_db_free OUT NUMBER) IS BEGIN SELECT SUM(allocated) as allocated, SUM(used) as used INTO p_db_allocated, p_db_used FROM mgmt_v_db_alloc_used; IF (NOT(p_db_allocated IS NULL AND p_db_used IS NULL)) THEN p_db_free := NVL(p_db_allocated, 0) - NVL(p_db_used, 0); END IF; END GET_DB_ALLOC_USED_FREE; ---------------------------------------------------------------------- PROCEDURE GET_LOCAL_FS_NFS_USED_FREE(p_local_fs_used OUT NUMBER, p_local_fs_free OUT NUMBER, p_writeable_nfs_used OUT NUMBER, p_writeable_nfs_free OUT NUMBER) IS l_writeable_nfs_size NUMBER; l_local_fs_size NUMBER; BEGIN SELECT SUM(writeable_nfs_size) writeable_nfs_size, SUM(local_fs_size) local_fs_size INTO l_writeable_nfs_size, l_local_fs_size FROM ( SELECT CASE WHEN data.storage_layer = G_NFS AND nfs_mount_privilege = G_WRITE_PRIVELEGE THEN sizeb ELSE NULL END writeable_nfs_size, CASE WHEN data.storage_layer = G_LOCAL_FILESYSTEM THEN sizeb ELSE NULL END local_fs_size, ROW_NUMBER() OVER (PARTITION BY global_unique_id ORDER BY name) global_unique_id_rownumber FROM MGMT_V_STORAGE_REPORT_DATA data, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE uit.ecm_snapshot_id = data.ecm_snapshot_id AND data.storage_layer IN (STORAGE_UI_COMMON_PKG.G_LOCAL_FILESYSTEM, STORAGE_UI_COMMON_PKG.G_NFS) AND data.is_virtual_layer=STORAGE_UI_UTIL_PKG.NO AND data.is_bottom_layer =STORAGE_UI_UTIL_PKG.YES ) WHERE global_unique_id_rownumber = 1; SELECT SUM(writeable_nfs_free) writeable_nfs_free, SUM(local_fs_free) local_fs_free INTO p_writeable_nfs_free, p_local_fs_free FROM ( SELECT name, CASE WHEN data.storage_layer = G_LOCAL_FILESYSTEM THEN freeb ELSE NULL END local_fs_free, CASE WHEN data.storage_layer = G_NFS AND nfs_mount_privilege = G_WRITE_PRIVELEGE THEN freeb ELSE NULL END writeable_nfs_free, ROW_NUMBER() OVER (PARTITION BY global_unique_id ORDER BY name) global_unique_id_rownumber FROM MGMT_V_STORAGE_REPORT_DATA data, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE uit.ecm_snapshot_id = data.ecm_snapshot_id AND data.storage_layer IN (STORAGE_UI_COMMON_PKG.G_LOCAL_FILESYSTEM, STORAGE_UI_COMMON_PKG.G_NFS) AND is_virtual_layer =STORAGE_UI_UTIL_PKG.NO ) WHERE global_unique_id_rownumber = 1; IF (NOT(l_writeable_nfs_size IS NULL)) THEN p_writeable_nfs_used := l_writeable_nfs_size - NVL(p_writeable_nfs_free, 0); END IF; IF (NOT(l_local_fs_size IS NULL)) THEN p_local_fs_used := l_local_fs_size - NVL(p_local_fs_free, 0); END IF; END GET_LOCAL_FS_NFS_USED_FREE; ---------------------------------------------------------------------- PROCEDURE GET_VOL_DISK_USED_BY_LAYER(p_storage_layer IN VARCHAR2, p_vol_allocated_by_layer OUT NUMBER, p_disk_allocated_by_layer OUT NUMBER) IS BEGIN SELECT SUM(disk_usedb), SUM(vol_usedb) INTO p_disk_allocated_by_layer, p_vol_allocated_by_layer FROM ( SELECT data.storage_layer as from_storage_layer, DECODE(data.storage_layer, STORAGE_UI_COMMON_PKG.G_OS_DISK, data.usedb, NULL) AS disk_usedb, DECODE(data.storage_layer, STORAGE_UI_COMMON_PKG.G_VOLUME_MANAGER, data.usedb, NULL) AS vol_usedb, parent.storage_layer as to_storage_layer, ROW_NUMBER() OVER (PARTITION BY data.storage_layer, data.global_unique_id ORDER BY data.target_name) AS global_unique_id_rownumber FROM MGMT_V_STORAGE_REPORT_DATA data, MGMT_V_STORAGE_REPORT_DATA parent, MGMT_STORAGE_REPORT_KEYS keys, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE uit.ecm_snapshot_id = data.ecm_snapshot_id AND data.ecm_snapshot_id = parent.ecm_snapshot_id AND keys.ecm_snapshot_id = data.ecm_snapshot_id AND data.key_value = keys.key_value AND keys.parent_key_value = parent.key_value AND data.storage_layer in(G_OS_DISK, G_VOLUME_MANAGER) AND data.storage_layer != parent.storage_layer AND parent.storage_layer like p_storage_layer ) WHERE global_unique_id_rownumber = 1; END GET_VOL_DISK_USED_BY_LAYER; ---------------------------------------------------------------------- PROCEDURE GET_DB_DATA_FILES_SOURCE(p_db_df_on_local_fs OUT NUMBER, p_db_df_on_nfs OUT NUMBER, p_db_df_on_volumes OUT NUMBER, p_db_df_on_disks OUT NUMBER) IS BEGIN SELECT SUM(DECODE(storage_layer, G_LOCAL_FILESYSTEM, file_size, 0)) db_df_on_local_fs, SUM(DECODE(storage_layer, G_NFS, file_size, 0)) db_df_on_nfs, SUM(DECODE(storage_layer, G_VOLUME_MANAGER, file_size, 0)) db_df_on_volumes, SUM(DECODE(storage_layer, G_OS_DISK, file_size, 0)) db_df_on_disks INTO p_db_df_on_local_fs, p_db_df_on_nfs, p_db_df_on_volumes, p_db_df_on_disks FROM ( SELECT dbs.target_name, dbs.target_type, df.file_name, df.file_size, df.os_storage_entity, data.storage_layer FROM MGMT_V_DB_DATAFILES_ECM df, MGMT$ECM_CURRENT_SNAPSHOTS dbs, MGMT_V_STORAGE_REPORT_DATA data, MGMT_STORAGE_REPORT_KEYS keys, MGMT_STORAGE_REPORT_ALIAS alias, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE df.ecm_snapshot_id = dbs.ecm_snapshot_id AND dbs.target_type in(MGMT_GLOBAL.G_DATABASE_TARGET_TYPE, MGMT_GLOBAL.G_RAC_DATABASE_TARGET_TYPE) AND uit.target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE AND dbs.host_name = uit.target_name AND data.ecm_snapshot_id = uit.ecm_snapshot_id AND data.storage_layer IN (G_LOCAL_FILESYSTEM, G_NFS, G_VOLUME_MANAGER, G_OS_DISK) AND keys.ecm_snapshot_id = data.ecm_snapshot_id AND keys.key_value = data.key_value AND keys.parent_key_value = alias.key_value AND alias.ecm_snapshot_id = data.ecm_snapshot_id AND alias.value = df.os_storage_entity ); END GET_DB_DATA_FILES_SOURCE; ---------------------------------------------------------------------- PROCEDURE GET_DB_TABLESPACE_SIZE_USED(p_tablespace_size OUT NUMBER, p_tablespace_used OUT NUMBER) IS BEGIN SELECT SUM(t.tablespace_size) total_size, SUM(t.tablespace_used_size) total_used INTO p_tablespace_size, p_tablespace_used FROM MGMT_V_HOST_DBS r, MGMT_V_DB_TABLESPACES_ECM t WHERE r.ecm_snapshot_id = t.ecm_snapshot_id; END GET_DB_TABLESPACE_SIZE_USED; ---------------------------------------------------------------------- PROCEDURE GET_DB_STORAGE_SOURCE(p_db_on_local_disks OUT NUMBER, p_db_on_volumes OUT NUMBER, p_db_on_asm OUT NUMBER, p_db_on_local_fs OUT NUMBER, p_db_on_writeable_nfs OUT NUMBER) IS BEGIN GET_DB_DATA_FILES_SOURCE(p_db_df_on_local_fs => p_db_on_local_fs, p_db_df_on_nfs => p_db_on_writeable_nfs, p_db_df_on_volumes => p_db_on_volumes, p_db_df_on_disks => p_db_on_local_disks); GET_ASM_ALLOCATED_TO_DBS(p_asm_allocated => p_db_on_asm); END GET_DB_STORAGE_SOURCE; ---------------------------------------------------------------------- FUNCTION GET_USAGE_SUMMARY_AS_CURSOR(p_db_on_local_disks IN NUMBER, p_db_on_volumes IN NUMBER, p_db_on_asm IN NUMBER, p_db_on_local_fs IN NUMBER, p_db_on_writeable_nfs IN NUMBER, p_db_allocated IN NUMBER, p_db_tablespace_size IN NUMBER, p_db_tablespace_used IN NUMBER, p_db_used IN NUMBER, p_db_free IN NUMBER, p_local_fs_on_local_disks IN NUMBER, p_local_fs_on_volumes IN NUMBER, p_local_fs_used IN NUMBER, p_local_fs_free IN NUMBER, p_writeable_nfs_used IN NUMBER, p_writeable_nfs_free IN NUMBER, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR IS l_result_cursor SYS_REFCURSOR; BEGIN OPEN l_result_cursor FOR SELECT round( p_db_on_local_disks/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) db_on_local_disks, round(p_db_on_volumes/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) db_on_volumes, round(p_db_on_asm/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) db_on_asm, round(p_db_on_local_fs/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) db_on_local_fs, round(p_db_on_writeable_nfs/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) db_on_writeable_nfs, round(p_local_fs_on_local_disks/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) local_fs_on_local_disks, round(p_local_fs_on_volumes/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) local_fs_on_volumes, round(p_db_used/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) db_used, round(p_db_free/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) db_free, round(p_local_fs_used/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) local_fs_used, round(p_local_fs_free/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) local_fs_free, round(p_writeable_nfs_used/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) writeable_nfs_used, round(p_writeable_nfs_free/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) writeable_nfs_free FROM DUAL; RETURN l_result_cursor; END GET_USAGE_SUMMARY_AS_CURSOR; ---------------------------------------------------------------------- PROCEDURE GET_UTIL_SUMMARY_VALUES(p_vol_allocated IN NUMBER, p_vol_overhead IN NUMBER, p_vol_unallocated IN NUMBER, p_asm_allocated IN NUMBER, p_asm_unallocated IN NUMBER, p_asm_overhead IN NUMBER, p_disk_allocated IN NUMBER, p_disk_unallocated IN NUMBER, p_writeable_nfs_allocated IN NUMBER, p_db_used IN NUMBER, p_db_free IN NUMBER, p_local_fs_used IN NUMBER, p_local_fs_free IN NUMBER, p_writeable_nfs_used IN NUMBER, p_writeable_nfs_free IN NUMBER, p_total_allocated OUT NUMBER, p_total_unallocated OUT NUMBER, p_total_overhead OUT NUMBER, p_total_used OUT NUMBER, p_total_free OUT NUMBER) IS BEGIN IF (NOT(p_writeable_nfs_allocated IS NULL AND p_asm_allocated IS NULL AND p_vol_allocated IS NULL AND p_disk_allocated IS NULL)) THEN p_total_allocated := NVL(p_writeable_nfs_allocated, 0) + NVL(p_asm_allocated, 0) + NVL(p_vol_allocated, 0) + NVL(p_disk_allocated, 0); END IF; IF (NOT(p_asm_unallocated IS NULL AND p_vol_unallocated IS NULL AND p_disk_unallocated IS NULL)) THEN p_total_unallocated := NVL(p_asm_unallocated, 0) + NVL(p_vol_unallocated, 0) + NVL(p_disk_unallocated, 0); END IF; IF (NOT(p_db_free IS NULL AND p_local_fs_free IS NULL AND p_writeable_nfs_free IS NULL)) THEN p_total_free := NVL(p_db_free, 0) + NVL(p_local_fs_free, 0) + NVL(p_writeable_nfs_free, 0); END IF; IF (NOT(p_total_allocated IS NULL AND p_total_free IS NULL)) THEN p_total_used := NVL(p_total_allocated, 0) - NVL(p_total_free, 0); END IF; IF (NOT(p_vol_overhead IS NULL AND p_asm_overhead IS NULL)) THEN p_total_overhead := NVL(p_vol_overhead, 0) + NVL(p_asm_overhead, 0); END IF; END GET_UTIL_SUMMARY_VALUES; ---------------------------------------------------------------------- FUNCTION GET_UTIL_SUMMARY_AS_CURSOR(p_total_unallocated IN NUMBER, p_total_overhead IN NUMBER, p_total_used IN NUMBER, p_total_free IN NUMBER, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR IS l_result_cursor SYS_REFCURSOR; BEGIN OPEN l_result_cursor FOR SELECT round(p_total_used/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) total_used, round(p_total_free/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) total_free, round(p_total_unallocated/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) total_unallocated, round(p_total_overhead/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) total_overhead FROM DUAL; RETURN l_result_cursor; END GET_UTIL_SUMMARY_AS_CURSOR; ---------------------------------------------------------------------- PROCEDURE GET_ASM_ALLOCATED_TO_DBS(p_asm_allocated OUT NUMBER) IS BEGIN /* -- currently we are assuming that the same ASM can not have the -- one disk group which can serve more than one databases. -- At least that is what the ROW_NUMBER() clause is there for. -- We are not dealing with the situation wherein, we go via the -- diskgroups to the databases but double count the storage -- allocated because the same dg may be serving multiple -- databases. SELECT NVL(sum(total_mb), NULL) asm_allocated INTO p_asm_allocated FROM ( SELECT a.host_name, total_mb, ROW_NUMBER() OVER ( PARTITION BY db_unique_name, cluster_db_flag, disk_group_name ORDER BY cluster_db_flag, disk_group_name ) rn FROM mgmt_v_asm_db_dg_usage a ) WHERE rn = 1; */ SELECT NVL((sum(total_mb)), NULL) asm_allocated INTO p_asm_allocated FROM MGMT_V_ASM_DB_DG_USAGE; END GET_ASM_ALLOCATED_TO_DBS; ---------------------------------------------------------------------- PROCEDURE GET_ASM_ALLOC_UNALLOC_OVERHEAD(p_asm_allocated OUT NUMBER, p_asm_unallocated OUT NUMBER, p_asm_overhead OUT NUMBER) IS l_asm_size NUMBER; BEGIN GET_ASM_ALLOCATED_TO_DBS(p_asm_allocated); /* SELECT NVL(((sum(total_mb))*1024*1024), 0) as asm_size, NVL(((sum(usable_file_mb))*1024*1024), 0) as asm_unallocated INTO l_asm_size, p_asm_unallocated FROM ( SELECT disk_group_name, db_unique_name, cluster_db_flag, total_mb, usable_file_mb, ROW_NUMBER() OVER ( PARTITION BY db_unique_name, cluster_db_flag, disk_group_name ORDER BY cluster_db_flag, disk_group_name ) rn FROM mgmt_v_asm_dg_usage ) WHERE rn = 1; */ SELECT NVL(((SUM(total_mb))*1024*1024), NULL) AS asm_size, NVL(((SUM(usable_file_mb))*1024*1024), NULL) AS asm_unallocated INTO l_asm_size, p_asm_unallocated FROM MGMT_V_ASM_DG_USAGE; IF (NOT(l_asm_size IS NULL AND p_asm_allocated IS NULL AND p_asm_unallocated IS NULL)) THEN p_asm_overhead := NVL(l_asm_size,0) - (NVL(p_asm_allocated,0) + NVL(p_asm_unallocated,0)); END IF; END GET_ASM_ALLOC_UNALLOC_OVERHEAD; ---------------------------------------------------------------------- PROCEDURE GET_VOL_DISK_NFS_SIZE(p_disk_size OUT NUMBER, p_vol_size OUT NUMBER, p_writeable_nfs_allocated OUT NUMBER) IS BEGIN -- Note: Writeable nfs total size is the same as storage allocated -- from writeable nfs. SELECT SUM(disk_sizeb) disk_size, SUM(writeable_nfs_sizeb) writeable_nfs_allocated, SUM(vol_sizeb) vol_size INTO p_disk_size, p_writeable_nfs_allocated, p_vol_size FROM ( SELECT DECODE(data.storage_layer, STORAGE_UI_COMMON_PKG.G_OS_DISK, sizeb, NULL) disk_sizeb, DECODE(data.storage_layer||nfs_mount_privilege, STORAGE_UI_COMMON_PKG.G_NFS_WRITE, sizeb, NULL) writeable_nfs_sizeb, DECODE(data.storage_layer, STORAGE_UI_COMMON_PKG.G_VOLUME_MANAGER, sizeb, NULL) vol_sizeb, ROW_NUMBER() OVER (PARTITION BY data.storage_layer, data.global_unique_id ORDER BY data.ecm_snapshot_id, data.name) AS global_unique_id_rownumber FROM MGMT_V_STORAGE_REPORT_DATA data, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE uit.ecm_snapshot_id = data.ecm_snapshot_id AND data.storage_layer IN ( STORAGE_UI_COMMON_PKG.G_OS_DISK, STORAGE_UI_COMMON_PKG.G_NFS, STORAGE_UI_COMMON_PKG.G_VOLUME_MANAGER ) AND is_bottom_layer = STORAGE_UI_UTIL_PKG.YES ) WHERE global_unique_id_rownumber = 1; END GET_VOL_DISK_NFS_SIZE; ---------------------------------------------------------------------- PROCEDURE GET_VOL_DISK_UNALLOCATED(p_disk_unallocated OUT NUMBER, p_vol_unallocated OUT NUMBER) IS BEGIN SELECT SUM(vol_freeb) vol_unallocated, SUM(disk_freeb) disk_unallocated INTO p_vol_unallocated, p_disk_unallocated FROM ( SELECT storage_layer, DECODE(storage_layer, STORAGE_UI_COMMON_PKG.G_VOLUME_MANAGER, freeb, NULL) vol_freeb, DECODE(storage_layer, STORAGE_UI_COMMON_PKG.G_OS_DISK, freeb, NULL) disk_freeb, ROW_NUMBER() OVER (PARTITION BY data.storage_layer, data.global_unique_id ORDER BY data.ecm_snapshot_id, data.name) AS global_unique_id_rownumber FROM MGMT_V_STORAGE_REPORT_DATA data, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE data.ecm_snapshot_id = uit.ecm_snapshot_id AND storage_layer IN ( STORAGE_UI_COMMON_PKG.G_VOLUME_MANAGER, STORAGE_UI_COMMON_PKG.G_OS_DISK ) AND is_virtual_layer=STORAGE_UI_UTIL_PKG.NO ) WHERE global_unique_id_rownumber = 1; END GET_VOL_DISK_UNALLOCATED; ---------------------------------------------------------------------- PROCEDURE GET_VOL_DISK_ALLOCATED(p_disk_allocated OUT NUMBER, p_vol_allocated OUT NUMBER) IS BEGIN SELECT SUM(vol_usedb) vol_allocated, SUM(disk_usedb) disk_allocated INTO p_vol_allocated, p_disk_allocated FROM ( SELECT storage_layer, DECODE(storage_layer, STORAGE_UI_COMMON_PKG.G_VOLUME_MANAGER, usedb, NULL) vol_usedb, DECODE(storage_layer, STORAGE_UI_COMMON_PKG.G_OS_DISK, usedb, NULL) disk_usedb, ROW_NUMBER() OVER (PARTITION BY data.storage_layer, data.global_unique_id ORDER BY data.ecm_snapshot_id, data.name) AS global_unique_id_rownumber FROM MGMT_V_STORAGE_REPORT_DATA data, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE uit.ecm_snapshot_id = data.ecm_snapshot_id AND storage_layer IN ( STORAGE_UI_COMMON_PKG.G_VOLUME_MANAGER, STORAGE_UI_COMMON_PKG.G_OS_DISK ) AND is_allocated =STORAGE_UI_UTIL_PKG.YES AND is_top_layer =STORAGE_UI_UTIL_PKG.YES AND is_virtual_layer=STORAGE_UI_UTIL_PKG.NO ) WHERE global_unique_id_rownumber = 1; END; ---------------------------------------------------------------------- FUNCTION GET_ALLOC_SUMMARY_AS_CURSOR(p_vol_allocated IN NUMBER, p_vol_overhead IN NUMBER, p_vol_unallocated IN NUMBER, p_vol_size IN NUMBER, p_asm_allocated IN NUMBER, p_asm_unallocated IN NUMBER, p_asm_overhead IN NUMBER, p_asm_size IN NUMBER, p_disk_allocated IN NUMBER, p_disk_unallocated IN NUMBER, p_disk_size IN NUMBER, p_writeable_nfs_allocated IN NUMBER, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR IS l_result_cursor SYS_REFCURSOR; BEGIN -- currently we dont calculate how much asm is allocated -- from volumes (it is a corner case). -- also we need to exclude asm from disks allocated also. -- this is higher priority. -- for the time being retain the old column names -- some of which are meaningless (e.g. volumes_excl_asm_unallocated -- should be simply vol_unallocated.) OPEN l_result_cursor FOR SELECT round(p_vol_allocated/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) vol_allocated, round(p_vol_unallocated/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) vol_unallocated, round(p_vol_overhead/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) vol_overhead, round(p_disk_allocated/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) disks_allocated, round(p_disk_unallocated/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) disks_unallocated, round(p_writeable_nfs_allocated/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) writeable_nfs_allocated, round(p_asm_allocated/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) asm_allocated, round(p_asm_unallocated/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) asm_unallocated, round(p_asm_overhead/STORAGE_UI_UTIL_PKG.BYTES_PER_GB, 2) asm_overhead FROM DUAL; RETURN l_result_cursor; END GET_ALLOC_SUMMARY_AS_CURSOR; ---------------------------------------------------------------------- -- -- Gets storage summary values in byte size numbers. -- If p_calc_storage_source_flag is FALSE, then it does not compute -- p_db_on_* values. It is set to FALSE for repository metric collections -- and TRUE for rendeting Storage Details page. -- PROCEDURE GET_STORAGE_SUMMARY_VALUES(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_calc_storage_source_flag IN NUMBER DEFAULT MGMT_GLOBAL.G_TRUE, p_vol_allocated OUT NUMBER, p_vol_overhead OUT NUMBER, p_vol_unallocated OUT NUMBER, p_vol_size OUT NUMBER, p_asm_allocated OUT NUMBER, p_asm_unallocated OUT NUMBER, p_asm_overhead OUT NUMBER, p_disk_allocated OUT NUMBER, p_disk_unallocated OUT NUMBER, p_disk_size OUT NUMBER, p_asm_size OUT NUMBER, p_writeable_nfs_allocated OUT NUMBER, p_db_on_local_disks OUT NUMBER, p_db_on_volumes OUT NUMBER, p_db_on_asm OUT NUMBER, p_db_on_local_fs OUT NUMBER, p_db_on_writeable_nfs OUT NUMBER, p_db_allocated OUT NUMBER, p_db_tablespace_size OUT NUMBER, p_db_tablespace_used OUT NUMBER, p_db_used OUT NUMBER, p_db_free OUT NUMBER, p_local_fs_on_local_disks OUT NUMBER, p_local_fs_on_volumes OUT NUMBER, p_local_fs_used OUT NUMBER, p_local_fs_free OUT NUMBER, p_writeable_nfs_used OUT NUMBER, p_writeable_nfs_free OUT NUMBER, p_total_allocated OUT NUMBER, p_total_unallocated OUT NUMBER, p_total_overhead OUT NUMBER, p_total_used OUT NUMBER, p_total_free OUT NUMBER) IS BEGIN GET_ALLOCATION_SUMMARY_VALUES(p_target_name => p_target_name, p_target_type => p_target_type, p_vol_allocated => p_vol_allocated, p_vol_overhead => p_vol_overhead, p_vol_unallocated => p_vol_unallocated, p_vol_size => p_vol_size, p_asm_allocated => p_asm_allocated, p_asm_unallocated => p_asm_unallocated, p_asm_overhead => p_asm_overhead, p_asm_size => p_asm_size, p_disk_allocated => p_disk_allocated, p_disk_unallocated => p_disk_unallocated, p_disk_size => p_disk_size, p_writeable_nfs_allocated => p_writeable_nfs_allocated); GET_USAGE_SUMMARY_VALUES(p_target_name => p_target_name, p_target_type => p_target_type, p_calc_storage_source_flag => p_calc_storage_source_flag, p_db_on_local_disks => p_db_on_local_disks, p_db_on_volumes => p_db_on_volumes, p_db_on_asm => p_db_on_asm, p_db_on_local_fs => p_db_on_local_fs, p_db_on_writeable_nfs => p_db_on_writeable_nfs, p_db_allocated => p_db_allocated, p_db_tablespace_size => p_db_tablespace_size, p_db_tablespace_used => p_db_tablespace_used, p_db_used => p_db_used, p_db_free => p_db_free, p_local_fs_on_local_disks => p_local_fs_on_local_disks, p_local_fs_on_volumes => p_local_fs_on_volumes, p_local_fs_used => p_local_fs_used, p_local_fs_free => p_local_fs_free, p_writeable_nfs_used => p_writeable_nfs_used, p_writeable_nfs_free => p_writeable_nfs_free); GET_UTIL_SUMMARY_VALUES(p_vol_allocated => p_vol_allocated, p_vol_overhead => p_vol_overhead, p_vol_unallocated => p_vol_unallocated, p_asm_allocated => p_asm_allocated, p_asm_unallocated => p_asm_unallocated, p_asm_overhead => p_asm_overhead, p_disk_allocated => p_disk_allocated, p_disk_unallocated => p_disk_unallocated, p_writeable_nfs_allocated => p_writeable_nfs_allocated, p_db_used => p_db_used, p_db_free => p_db_free, p_local_fs_used => p_local_fs_used, p_local_fs_free => p_local_fs_free, p_writeable_nfs_used => p_writeable_nfs_used, p_writeable_nfs_free => p_writeable_nfs_free, p_total_allocated => p_total_allocated, p_total_unallocated => p_total_unallocated, p_total_overhead => p_total_overhead, p_total_used => p_total_used, p_total_free => p_total_free); /* --IF(emdw_log.P_IS_DEBUG_SET) then PRINT_STORAGE_SUMMARY_VALUES ( p_target_name => p_target_name, p_target_type => p_target_type, p_vol_allocated => p_vol_allocated, p_vol_overhead => p_vol_overhead, p_vol_unallocated => p_vol_unallocated, p_vol_size => p_vol_size, p_asm_allocated => p_asm_allocated, p_asm_unallocated => p_asm_unallocated, p_asm_overhead => p_asm_overhead, p_disk_allocated => p_disk_allocated, p_disk_unallocated => p_disk_unallocated, p_disk_size => p_disk_size, p_asm_size => p_asm_size, p_writeable_nfs_allocated => p_writeable_nfs_allocated, p_db_on_local_disks => p_db_on_local_disks, p_db_on_volumes => p_db_on_volumes, p_db_on_asm => p_db_on_asm, p_db_on_local_fs => p_db_on_local_fs, p_db_on_writeable_nfs => p_db_on_writeable_nfs, p_db_allocated => p_db_allocated, p_db_tablespace_size => p_db_tablespace_size, p_db_tablespace_used => p_db_tablespace_used, p_db_used => p_db_used, p_db_free => p_db_free, p_local_fs_on_local_disks => p_local_fs_on_local_disks, p_local_fs_on_volumes => p_local_fs_on_volumes, p_local_fs_used => p_local_fs_used, p_local_fs_free => p_local_fs_free, p_writeable_nfs_used => p_writeable_nfs_used, p_writeable_nfs_free => p_writeable_nfs_free, p_total_allocated => p_total_allocated, p_total_unallocated => p_total_unallocated, p_total_overhead => p_total_overhead, p_total_used => p_total_used, p_total_free => p_total_free ); --END IF; */ END GET_STORAGE_SUMMARY_VALUES; ---------------------------------------------------------------------- FUNCTION GET_COLLECTION_INFO(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN SYS_REFCURSOR IS l_result_cursor SYS_REFCURSOR; BEGIN OPEN l_result_cursor FOR SELECT collection_timestamp, collection_error_count, mapping_issues_count FROM ( SELECT MAX(collection_timestamp) collection_timestamp FROM ( SELECT MAX(snap.saved_timestamp) collection_timestamp FROM MGMT$ECM_CURRENT_SNAPSHOTS snap, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE uit.target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE AND uit.target_name = snap.host_name AND snap.snapshot_type IN (G_DB_CONFIG_COLL_NAME, G_RAC_CONFIG_COLL_NAME, G_HOST_STORAGE_COLL_NAME) UNION SELECT MAX(cm.collection_timestamp) collection_timestamp FROM MGMT_CURRENT_METRICS cm, MGMT_TARGETS t, MGMT_METRICS m, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE uit.target_name = t.host_name AND t.target_type = MGMT_GLOBAL.G_ASM_TARGET_TYPE AND t.target_guid = cm.target_guid AND cm.metric_guid = m.metric_guid AND t.type_meta_ver = m.type_meta_ver AND (m.category_prop_1 = ' ' OR m.category_prop_1 = t.category_prop_1) AND (m.category_prop_2 = ' ' OR m.category_prop_2 = t.category_prop_2) AND (m.category_prop_3 = ' ' OR m.category_prop_3 = t.category_prop_3) AND (m.category_prop_4 = ' ' OR m.category_prop_4 = t.category_prop_4) AND (m.category_prop_5 = ' ' OR m.category_prop_5 = t.category_prop_5) AND m.metric_name IN ( STORAGE_UI_COMMON_PKG.G_ASM_DG_USAGE_METRIC, STORAGE_UI_COMMON_PKG.G_ASM_DB_DG_METRIC ) ) ), ( SELECT count(*) collection_error_count FROM MGMT_V_STORAGE_COLL_ERRORS e ), ( SELECT count(*) mapping_issues_count FROM MGMT_STORAGE_REPORT_ISSUES i, MGMT_STORAGE_REPORT_UI_TARGETS tgt WHERE tgt.ecm_snapshot_id = i.ecm_snapshot_id ); RETURN l_result_cursor; END GET_COLLECTION_INFO; ---------------------------------------------------------------------- PROCEDURE SET_GLOBAL_METRIC_NAME(p_target_type IN VARCHAR2) IS BEGIN IF(p_target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE) THEN gv_storage_rep_metric := STORAGE_REP_METRICS_PKG.G_HOST_STORAGE_REP_METRIC; ELSE gv_storage_rep_metric := STORAGE_REP_METRICS_PKG.G_GROUP_STORAGE_REP_METRIC; END IF; END SET_GLOBAL_METRIC_NAME; ---------------------------------------------------------------------- PROCEDURE SET_HIST_QUERY_ENV(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN INTEGER) IS BEGIN INSERT_TARGETS_FOR_UI_QUERIES(p_target_name, p_target_type); STORAGE_UI_UTIL_PKG.SET_STORAGE_CONTEXT('history_period_in_days', TO_CHAR(p_period_in_days)); END SET_HIST_QUERY_ENV; ---------------------------------------------------------------------- FUNCTION GET_STORAGE_UNIT(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN VARCHAR2 IS l_storage_unit VARCHAR2(2); BEGIN RETURN STORAGE_UI_UTIL_PKG.GB; END GET_STORAGE_UNIT; ---------------------------------------------------------------------- PROCEDURE GET_HISTORY_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN NUMBER, p_storage_unit IN VARCHAR2, p_summary_cursor OUT SYS_REFCURSOR, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE) IS l_storage_timeseries_rec_list STORAGE_TIMESERIES_REC_LIST; BEGIN SET_HIST_QUERY_ENV(p_target_name, p_target_type, p_period_in_days); SELECT STORAGE_TIMESERIES_REC(rollup_timestamp, NULL, unallocated, overhead, used, free) BULK COLLECT INTO l_storage_timeseries_rec_list FROM ( SELECT rollup_timestamp, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_TOTAL_UNALLOCATED, value, NULL)) unallocated, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_TOTAL_OVERHEAD, value, NULL)) overhead, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_TOTAL_USED, value, NULL)) used, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_TOTAL_FREE, value, NULL)) free FROM MGMT_V_TIMESERIES_DAILY_HIST WHERE metric_column IN ( STORAGE_REP_METRICS_PKG.G_TOTAL_OVERHEAD, STORAGE_REP_METRICS_PKG.G_TOTAL_UNALLOCATED, STORAGE_REP_METRICS_PKG.G_TOTAL_USED, STORAGE_REP_METRICS_PKG.G_TOTAL_FREE ) AND metric_name = gv_storage_rep_metric AND target_name = p_target_name AND target_type = p_target_type GROUP BY rollup_timestamp ORDER BY rollup_timestamp ); GET_SUMM_TIMESERIES_AS_CURSOR(l_storage_timeseries_rec_list, p_summary_cursor); GET_MIN_MAX_DATES(l_storage_timeseries_rec_list, p_min_timeseries_date, p_max_timeseries_date); END GET_HISTORY_SUMMARY; ---------------------------------------------------------------------- FUNCTION GET_HISTORY_STATS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR IS l_cursor SYS_REFCURSOR; BEGIN OPEN l_cursor FOR SELECT CASE WHEN metric_column = STORAGE_REP_METRICS_PKG.G_TOTAL_ALLOCATED THEN 'ALLOCATED_STORAGE_ATTRIBUTE' WHEN metric_column = STORAGE_REP_METRICS_PKG.G_TOTAL_UNALLOCATED THEN 'UNALLOCATED_STORAGE_ATTRIBUTE' WHEN metric_column = STORAGE_REP_METRICS_PKG.G_TOTAL_OVERHEAD THEN 'OVERHEAD_STORAGE_ATTRIBUTE' WHEN metric_column = STORAGE_REP_METRICS_PKG.G_TOTAL_USED THEN 'USED_STORAGE_ATTRIBUTE' WHEN metric_column = STORAGE_REP_METRICS_PKG.G_TOTAL_FREE THEN 'FREE_STORAGE_ATTRIBUTE' END storage_attribute, average, maximum, minimum, last_known_value FROM mgmt_v_storage_stats WHERE metric_column IN (STORAGE_REP_METRICS_PKG.G_TOTAL_USED, STORAGE_REP_METRICS_PKG.G_TOTAL_FREE, STORAGE_REP_METRICS_PKG.G_TOTAL_OVERHEAD, STORAGE_REP_METRICS_PKG.G_TOTAL_UNALLOCATED, STORAGE_REP_METRICS_PKG.G_TOTAL_ALLOCATED) AND metric_name = gv_storage_rep_metric AND target_name = p_target_name AND target_type = p_target_type; RETURN l_cursor; END GET_HISTORY_STATS; ---------------------------------------------------------------------- FUNCTION GET_HISTORY_DB_STATS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR IS l_cursor SYS_REFCURSOR; BEGIN OPEN l_cursor FOR SELECT CASE WHEN metric_column = STORAGE_REP_METRICS_PKG.G_DB_USED THEN 'USED_STORAGE_ATTRIBUTE' WHEN metric_column = STORAGE_REP_METRICS_PKG.G_DB_FREE THEN 'FREE_STORAGE_ATTRIBUTE' END storage_attribute, average, maximum, minimum, last_known_value FROM mgmt_v_storage_stats WHERE metric_column IN (STORAGE_REP_METRICS_PKG.G_DB_USED, STORAGE_REP_METRICS_PKG.G_DB_FREE) AND metric_name = gv_storage_rep_metric AND target_name = p_target_name AND target_type = p_target_type; RETURN l_cursor; END GET_HISTORY_DB_STATS; ---------------------------------------------------------------------- PROCEDURE GET_HISTORY_DB_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN NUMBER, p_storage_unit IN VARCHAR2, p_summary_cursor OUT SYS_REFCURSOR, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE) IS l_storage_timeseries_rec_list STORAGE_TIMESERIES_REC_LIST; BEGIN SET_HIST_QUERY_ENV(p_target_name, p_target_type, p_period_in_days); SELECT STORAGE_TIMESERIES_REC(rollup_timestamp, NULL, NULL, NULL, used, free) BULK COLLECT INTO l_storage_timeseries_rec_list FROM ( SELECT rollup_timestamp, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_DB_USED, value, NULL)) used, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_DB_FREE, value, NULL)) free FROM MGMT_V_TIMESERIES_DAILY_HIST WHERE metric_column IN ( STORAGE_REP_METRICS_PKG.G_DB_USED, STORAGE_REP_METRICS_PKG.G_DB_FREE ) AND metric_name = gv_storage_rep_metric AND target_name = p_target_name AND target_type = p_target_type GROUP BY rollup_timestamp ORDER BY rollup_timestamp ); GET_APP_TIMESERIES_AS_CURSOR(l_storage_timeseries_rec_list, p_summary_cursor); GET_MIN_MAX_DATES(l_storage_timeseries_rec_list, p_min_timeseries_date, p_max_timeseries_date); END GET_HISTORY_DB_SUMMARY; ---------------------------------------------------------------------- FUNCTION GET_HISTORY_LOCALFS_STATS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR IS l_cursor SYS_REFCURSOR; BEGIN OPEN l_cursor FOR SELECT CASE WHEN metric_column = STORAGE_REP_METRICS_PKG.G_LOCAL_FS_USED THEN 'USED_STORAGE_ATTRIBUTE' WHEN metric_column = STORAGE_REP_METRICS_PKG.G_LOCAL_FS_FREE THEN 'FREE_STORAGE_ATTRIBUTE' END storage_attribute, average, maximum, minimum, last_known_value FROM mgmt_v_storage_stats WHERE metric_column IN (STORAGE_REP_METRICS_PKG.G_LOCAL_FS_USED, STORAGE_REP_METRICS_PKG.G_LOCAL_FS_FREE) AND metric_name = gv_storage_rep_metric AND target_name = p_target_name AND target_type = p_target_type; RETURN l_cursor; END GET_HISTORY_LOCALFS_STATS; ---------------------------------------------------------------------- PROCEDURE GET_HISTORY_LOCALFS_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN NUMBER, p_storage_unit IN VARCHAR2, p_summary_cursor OUT SYS_REFCURSOR, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE) IS l_storage_timeseries_rec_list STORAGE_TIMESERIES_REC_LIST; BEGIN SET_HIST_QUERY_ENV(p_target_name, p_target_type, p_period_in_days); -- first try from the daily metric rollup table. SELECT STORAGE_TIMESERIES_REC(rollup_timestamp, NULL, NULL, NULL, used, free) BULK COLLECT INTO l_storage_timeseries_rec_list FROM ( SELECT rollup_timestamp, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_LOCAL_FS_USED, value, NULL)) used, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_LOCAL_FS_FREE, value, NULL)) free FROM MGMT_V_TIMESERIES_DAILY_HIST WHERE metric_column IN ( STORAGE_REP_METRICS_PKG.G_LOCAL_FS_USED, STORAGE_REP_METRICS_PKG.G_LOCAL_FS_FREE ) AND metric_name = gv_storage_rep_metric AND target_name = p_target_name AND target_type = p_target_type GROUP BY rollup_timestamp ORDER BY rollup_timestamp ); GET_APP_TIMESERIES_AS_CURSOR(l_storage_timeseries_rec_list, p_summary_cursor); GET_MIN_MAX_DATES(l_storage_timeseries_rec_list, p_min_timeseries_date, p_max_timeseries_date); END GET_HISTORY_LOCALFS_SUMMARY; ---------------------------------------------------------------------- FUNCTION GET_HISTORY_NFS_STATS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR IS l_cursor SYS_REFCURSOR; BEGIN OPEN l_cursor FOR SELECT CASE WHEN metric_column = STORAGE_REP_METRICS_PKG.G_WRITEABLE_NFS_USED THEN 'USED_STORAGE_ATTRIBUTE' WHEN metric_column = STORAGE_REP_METRICS_PKG.G_WRITEABLE_NFS_FREE THEN 'FREE_STORAGE_ATTRIBUTE' END storage_attribute, average, maximum, minimum, last_known_value FROM mgmt_v_storage_stats WHERE metric_column IN (STORAGE_REP_METRICS_PKG.G_WRITEABLE_NFS_USED, STORAGE_REP_METRICS_PKG.G_WRITEABLE_NFS_FREE) AND metric_name = gv_storage_rep_metric AND target_name = p_target_name AND target_type = p_target_type; RETURN l_cursor; END GET_HISTORY_NFS_STATS; ---------------------------------------------------------------------- PROCEDURE GET_HISTORY_NFS_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN NUMBER, p_storage_unit IN VARCHAR2, p_summary_cursor OUT SYS_REFCURSOR, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE) IS l_storage_timeseries_rec_list STORAGE_TIMESERIES_REC_LIST; BEGIN SET_HIST_QUERY_ENV(p_target_name, p_target_type, p_period_in_days); -- first try from the daily metric rollup table. SELECT STORAGE_TIMESERIES_REC(rollup_timestamp, NULL, NULL, NULL, used, free) BULK COLLECT INTO l_storage_timeseries_rec_list FROM ( SELECT rollup_timestamp, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_WRITEABLE_NFS_USED, value, NULL)) used, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_WRITEABLE_NFS_FREE, value, NULL)) free FROM MGMT_V_TIMESERIES_DAILY_HIST WHERE metric_column IN ( STORAGE_REP_METRICS_PKG.G_WRITEABLE_NFS_USED, STORAGE_REP_METRICS_PKG.G_WRITEABLE_NFS_FREE ) AND metric_name = gv_storage_rep_metric AND target_name = p_target_name AND target_type = p_target_type GROUP BY rollup_timestamp ORDER BY rollup_timestamp ); GET_APP_TIMESERIES_AS_CURSOR(l_storage_timeseries_rec_list, p_summary_cursor); GET_MIN_MAX_DATES(l_storage_timeseries_rec_list, p_min_timeseries_date, p_max_timeseries_date); END GET_HISTORY_NFS_SUMMARY; ---------------------------------------------------------------------- FUNCTION GET_HISTORY_DISK_STATS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR IS l_cursor SYS_REFCURSOR; BEGIN OPEN l_cursor FOR SELECT CASE WHEN metric_column = STORAGE_REP_METRICS_PKG.G_DISKS_ALLOCATED THEN 'ALLOCATED_STORAGE_ATTRIBUTE' WHEN metric_column = STORAGE_REP_METRICS_PKG.G_DISKS_UNALLOCATED THEN 'UNALLOCATED_STORAGE_ATTRIBUTE' END storage_attribute, average, maximum, minimum, last_known_value FROM mgmt_v_storage_stats WHERE metric_column IN (STORAGE_REP_METRICS_PKG.G_DISKS_ALLOCATED, STORAGE_REP_METRICS_PKG.G_DISKS_UNALLOCATED) AND metric_name = gv_storage_rep_metric AND target_name = p_target_name AND target_type = p_target_type; RETURN l_cursor; END GET_HISTORY_DISK_STATS; ---------------------------------------------------------------------- PROCEDURE GET_HISTORY_DISK_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN NUMBER, p_storage_unit IN VARCHAR2, p_summary_cursor OUT SYS_REFCURSOR, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE) IS l_storage_timeseries_rec_list STORAGE_TIMESERIES_REC_LIST; BEGIN SET_HIST_QUERY_ENV(p_target_name, p_target_type, p_period_in_days); -- first try from the daily metric rollup table. SELECT STORAGE_TIMESERIES_REC(rollup_timestamp, allocated, unallocated, NULL, NULL, NULL) BULK COLLECT INTO l_storage_timeseries_rec_list FROM ( SELECT rollup_timestamp, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_DISKS_ALLOCATED, value, NULL)) allocated, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_DISKS_UNALLOCATED, value, NULL)) unallocated FROM MGMT_V_TIMESERIES_DAILY_HIST WHERE metric_column IN ( STORAGE_REP_METRICS_PKG.G_DISKS_ALLOCATED, STORAGE_REP_METRICS_PKG.G_DISKS_UNALLOCATED ) AND metric_name = gv_storage_rep_metric AND target_name = p_target_name AND target_type = p_target_type GROUP BY rollup_timestamp ORDER BY rollup_timestamp ); GET_DISK_TIMESERIES_AS_CURSOR(l_storage_timeseries_rec_list, p_summary_cursor); GET_MIN_MAX_DATES(l_storage_timeseries_rec_list, p_min_timeseries_date, p_max_timeseries_date); END GET_HISTORY_DISK_SUMMARY; ---------------------------------------------------------------------- FUNCTION GET_PERIOD_IN_DAYS(p_period IN VARCHAR2) RETURN NUMBER IS l_period_in_days NUMBER; BEGIN CASE WHEN p_period = G_THREE_MONTHS THEN l_period_in_days := G_DAYS_PER_MONTH * 3; WHEN p_period = G_ONE_MONTH THEN l_period_in_days := G_DAYS_PER_MONTH * 1; WHEN p_period = G_ONE_YEAR THEN l_period_in_days := G_DAYS_PER_MONTH * 12; END CASE; RETURN l_period_in_days; END GET_PERIOD_IN_DAYS; ---------------------------------------------------------------------- FUNCTION GET_HISTORY_ASM_STATS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR IS l_cursor SYS_REFCURSOR; BEGIN OPEN l_cursor FOR SELECT CASE WHEN metric_column = STORAGE_REP_METRICS_PKG.G_ASM_ALLOCATED THEN 'ALLOCATED_STORAGE_ATTRIBUTE' WHEN metric_column = STORAGE_REP_METRICS_PKG.G_ASM_UNALLOCATED THEN 'UNALLOCATED_STORAGE_ATTRIBUTE' WHEN metric_column = STORAGE_REP_METRICS_PKG.G_ASM_OVERHEAD THEN 'OVERHEAD_STORAGE_ATTRIBUTE' END storage_attribute, average, maximum, minimum, last_known_value FROM mgmt_v_storage_stats WHERE metric_column IN (STORAGE_REP_METRICS_PKG.G_ASM_ALLOCATED, STORAGE_REP_METRICS_PKG.G_ASM_UNALLOCATED, STORAGE_REP_METRICS_PKG.G_ASM_OVERHEAD) AND metric_name = gv_storage_rep_metric AND target_name = p_target_name AND target_type = p_target_type; RETURN l_cursor; END GET_HISTORY_ASM_STATS; ---------------------------------------------------------------------- PROCEDURE GET_HISTORY_ASM_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN NUMBER, p_storage_unit IN VARCHAR2, p_summary_cursor OUT SYS_REFCURSOR, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE) IS l_storage_timeseries_rec_list STORAGE_TIMESERIES_REC_LIST; BEGIN SET_HIST_QUERY_ENV(p_target_name, p_target_type, p_period_in_days); -- first try from the daily metric rollup table. SELECT STORAGE_TIMESERIES_REC(rollup_timestamp, allocated, unallocated, overhead, NULL, NULL) BULK COLLECT INTO l_storage_timeseries_rec_list FROM ( SELECT rollup_timestamp, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_ASM_ALLOCATED, value, NULL)) allocated, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_ASM_UNALLOCATED, value, NULL)) unallocated, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_ASM_OVERHEAD, value, NULL)) overhead FROM MGMT_V_TIMESERIES_DAILY_HIST WHERE metric_column IN ( STORAGE_REP_METRICS_PKG.G_ASM_ALLOCATED, STORAGE_REP_METRICS_PKG.G_ASM_UNALLOCATED, STORAGE_REP_METRICS_PKG.G_ASM_OVERHEAD ) AND metric_name = gv_storage_rep_metric AND target_name = p_target_name AND target_type = p_target_type GROUP BY rollup_timestamp ORDER BY rollup_timestamp ); GET_MGMT_LYR_TIMESRS_AS_CURSOR(l_storage_timeseries_rec_list, p_summary_cursor); GET_MIN_MAX_DATES(l_storage_timeseries_rec_list, p_min_timeseries_date, p_max_timeseries_date); END GET_HISTORY_ASM_SUMMARY; ---------------------------------------------------------------------- FUNCTION GET_HISTORY_VOL_STATS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_storage_unit IN VARCHAR2) RETURN SYS_REFCURSOR IS l_cursor SYS_REFCURSOR; BEGIN OPEN l_cursor FOR SELECT CASE WHEN metric_column = STORAGE_REP_METRICS_PKG.G_VOL_ALLOCATED THEN 'ALLOCATED_STORAGE_ATTRIBUTE' WHEN metric_column = STORAGE_REP_METRICS_PKG.G_VOL_UNALLOCATED THEN 'UNALLOCATED_STORAGE_ATTRIBUTE' WHEN metric_column = STORAGE_REP_METRICS_PKG.G_VOL_OVERHEAD THEN 'OVERHEAD_STORAGE_ATTRIBUTE' END storage_attribute, average, maximum, minimum, last_known_value FROM mgmt_v_storage_stats WHERE metric_column IN (STORAGE_REP_METRICS_PKG.G_VOL_ALLOCATED, STORAGE_REP_METRICS_PKG.G_VOL_UNALLOCATED, STORAGE_REP_METRICS_PKG.G_VOL_OVERHEAD) AND metric_name = gv_storage_rep_metric AND target_name = p_target_name AND target_type = p_target_type; RETURN l_cursor; END GET_HISTORY_VOL_STATS; ---------------------------------------------------------------------- PROCEDURE GET_HISTORY_VOL_SUMMARY(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_period_in_days IN NUMBER, p_storage_unit IN VARCHAR2, p_summary_cursor OUT SYS_REFCURSOR, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE) IS l_storage_timeseries_rec_list STORAGE_TIMESERIES_REC_LIST; BEGIN SET_HIST_QUERY_ENV(p_target_name, p_target_type, p_period_in_days); SELECT STORAGE_TIMESERIES_REC(rollup_timestamp, allocated, unallocated, overhead, NULL, NULL) BULK COLLECT INTO l_storage_timeseries_rec_list FROM ( SELECT rollup_timestamp, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_VOL_ALLOCATED, value, NULL)) allocated, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_VOL_UNALLOCATED, value, NULL)) unallocated, MAX(DECODE(metric_column, STORAGE_REP_METRICS_PKG.G_VOL_OVERHEAD, value, NULL)) overhead FROM MGMT_V_TIMESERIES_DAILY_HIST WHERE metric_column IN ( STORAGE_REP_METRICS_PKG.G_VOL_ALLOCATED, STORAGE_REP_METRICS_PKG.G_VOL_UNALLOCATED, STORAGE_REP_METRICS_PKG.G_VOL_OVERHEAD ) AND metric_name = gv_storage_rep_metric AND target_name = p_target_name AND target_type = p_target_type GROUP BY rollup_timestamp ORDER BY rollup_timestamp ); GET_MGMT_LYR_TIMESRS_AS_CURSOR(l_storage_timeseries_rec_list, p_summary_cursor); GET_MIN_MAX_DATES(l_storage_timeseries_rec_list, p_min_timeseries_date, p_max_timeseries_date); END GET_HISTORY_VOL_SUMMARY; ---------------------------------------------------------------------- FUNCTION GET_HIST_COLLECTION_TIMESTAMP(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN DATE IS l_collection_timestamp MGMT_CURRENT_METRICS.collection_timestamp%TYPE; BEGIN SELECT MAX(collection_timestamp) INTO l_collection_timestamp FROM MGMT_METRICS m, MGMT_TARGETS t, MGMT_CURRENT_METRICS c WHERE m.target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE AND t.target_guid = c.target_guid AND t.target_name = p_target_name AND t.target_type = p_target_type AND m.metric_name = STORAGE_REP_METRICS_PKG.G_HOST_STORAGE_REP_METRIC AND t.type_meta_ver = m.type_meta_ver AND (m.category_prop_1 = ' ' OR m.category_prop_1 = t.category_prop_1) AND (m.category_prop_2 = ' ' OR m.category_prop_2 = t.category_prop_2) AND (m.category_prop_3 = ' ' OR m.category_prop_3 = t.category_prop_3) AND (m.category_prop_4 = ' ' OR m.category_prop_4 = t.category_prop_4) AND (m.category_prop_5 = ' ' OR m.category_prop_5 = t.category_prop_5) AND m.metric_guid = c.metric_guid; RETURN l_collection_timestamp; END GET_HIST_COLLECTION_TIMESTAMP; ---------------------------------------------------------------------- PROCEDURE GET_MGMT_LYR_TIMESRS_AS_CURSOR( p_storage_timeseries_rec_list IN STORAGE_TIMESERIES_REC_LIST, p_summary_cursor OUT SYS_REFCURSOR) IS BEGIN OPEN p_summary_cursor FOR SELECT collection_timestamp, allocated, unallocated, overhead FROM ( SELECT ts.collection_timestamp, ts.allocated, ts.unallocated, ts.overhead FROM TABLE(CAST(p_storage_timeseries_rec_list as storage_timeseries_rec_list)) ts ); END GET_MGMT_LYR_TIMESRS_AS_CURSOR; ---------------------------------------------------------------------- PROCEDURE GET_SUMM_TIMESERIES_AS_CURSOR( p_storage_timeseries_rec_list IN STORAGE_TIMESERIES_REC_LIST, p_summary_cursor OUT SYS_REFCURSOR) IS BEGIN OPEN p_summary_cursor FOR SELECT collection_timestamp, used, free, unallocated, overhead FROM ( SELECT ts.collection_timestamp, ts.unallocated, ts.overhead, ts.used, ts.free FROM TABLE(CAST(p_storage_timeseries_rec_list as storage_timeseries_rec_list)) ts ); END GET_SUMM_TIMESERIES_AS_CURSOR; ---------------------------------------------------------------------- PROCEDURE GET_APP_TIMESERIES_AS_CURSOR( p_storage_timeseries_rec_list in STORAGE_TIMESERIES_REC_LIST, p_summary_cursor OUT SYS_REFCURSOR) IS BEGIN OPEN p_summary_cursor FOR SELECT collection_timestamp, used, free FROM ( SELECT ts.collection_timestamp, ts.used, ts.free FROM TABLE(CAST(p_storage_timeseries_rec_list as storage_timeseries_rec_list)) ts ); END GET_APP_TIMESERIES_AS_CURSOR; ---------------------------------------------------------------------- PROCEDURE GET_DISK_TIMESERIES_AS_CURSOR( p_storage_timeseries_rec_list IN STORAGE_TIMESERIES_REC_LIST, p_summary_cursor OUT SYS_REFCURSOR) IS BEGIN OPEN p_summary_cursor FOR SELECT collection_timestamp, allocated, unallocated FROM ( SELECT ts.collection_timestamp, ts.allocated, ts.unallocated FROM TABLE(CAST(p_storage_timeseries_rec_list as storage_timeseries_rec_list)) ts ); END GET_DISK_TIMESERIES_AS_CURSOR; ---------------------------------------------------------------------- PROCEDURE GET_MIN_MAX_DATES( p_storage_timeseries_rec_list IN STORAGE_TIMESERIES_REC_LIST, p_min_timeseries_date OUT DATE, p_max_timeseries_date OUT DATE) IS BEGIN SELECT min_date, max_date INTO p_min_timeseries_date, p_max_timeseries_date FROM ( -- if the minimum date and maxmum dates differ -- by less than one, then we deliberately -- reduce min date by one. This is because -- the charts look ugly (with very thin bars) -- for cases WHERE it is rendered for period -- less than one day. SELECT CASE WHEN max_date-min_date <= 1 THEN max_date-1 ELSE min_date END min_date, max_date FROM ( -- in case there are no dates, we select -- sysdates - otherwise charts dont get -- rendered properly. SELECT NVL(MIN(ts.collection_timestamp), SYSDATE) min_date, NVL(MAX(ts.collection_timestamp), SYSDATE) max_date FROM TABLE(CAST(p_storage_timeseries_rec_list as storage_timeseries_rec_list)) ts ) ); END GET_MIN_MAX_DATES; ---------------------------------------------------------------------- PROCEDURE DO_INS_TARGETS_FOR_UI_QUERIES(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) IS BEGIN IF (p_target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE) THEN INSERT INTO MGMT_STORAGE_REPORT_UI_TARGETS(target_type, target_name, target_guid, ecm_snapshot_id) SELECT a.target_type, a.target_name, a.target_guid, b.ecm_snapshot_id FROM ( SELECT t.target_type, t.target_name, t.target_guid, null ecm_snapshot_id FROM MGMT_TARGETS t WHERE t.target_name = p_target_name AND t.target_type = p_target_type ) a, ( SELECT t.target_type, t.target_name, t.target_guid, snap.ecm_snapshot_id FROM MGMT_TARGETS t, MGMT$ECM_CURRENT_SNAPSHOTS snap WHERE t.target_name = p_target_name AND t.target_type = p_target_type AND t.target_guid = snap.target_guid(+) AND snap.snapshot_type = 'host_storage' AND EXISTS ( SELECT ecm_snapshot_id FROM MGMT_STORAGE_REPORT_DATA WHERE ecm_snapshot_id = snap.ecm_snapshot_id ) ) b WHERE a.target_guid = b.target_guid(+); ELSE INSERT INTO MGMT_STORAGE_REPORT_UI_TARGETS(target_type, target_name, target_guid, ecm_snapshot_id) SELECT tgt.target_type, tgt.target_name, tgt.target_guid, NULL ecm_snapshot_id FROM MGMT_TARGETS tgt WHERE target_name = p_target_name AND target_type = p_target_type UNION ALL ( SELECT c.target_type, c.target_name, c.target_guid, d.ecm_snapshot_id FROM ( SELECT tgt.target_type, tgt.target_name, tgt.target_guid, null ecm_snapshot_id FROM MGMT_V_STRG_FLAT_MEMBERSHIPS members, MGMT_TARGET_ASSOCS assoc, MGMT_TARGET_ASSOC_DEFS assocdef, MGMT_TARGETS tgt WHERE composite_target_name = p_target_name AND composite_target_type = p_target_type AND assoc.source_target_guid = members.member_target_guid AND assoc.assoc_guid = assocdef.assoc_guid AND assocdef.assoc_def_name = 'hosted_by' AND assoc.assoc_target_guid = tgt.target_guid ) c, ( SELECT tgt.target_type, tgt.target_name, tgt.target_guid, snap.ecm_snapshot_id FROM MGMT_V_STRG_FLAT_MEMBERSHIPS members, MGMT_TARGET_ASSOCS assoc, MGMT_TARGET_ASSOC_DEFS assocdef, MGMT_TARGETS tgt, MGMT$ECM_CURRENT_SNAPSHOTS snap WHERE composite_target_name = p_target_name AND composite_target_type = p_target_type AND assoc.source_target_guid = members.member_target_guid AND assoc.assoc_guid = assocdef.assoc_guid AND assocdef.assoc_def_name = 'hosted_by' AND assoc.assoc_target_guid = tgt.target_guid AND tgt.target_guid = snap.target_guid(+) AND snap.snapshot_type = 'host_storage' AND EXISTS ( SELECT ecm_snapshot_id FROM MGMT_STORAGE_REPORT_DATA WHERE ecm_snapshot_id = snap.ecm_snapshot_id ) ) d WHERE c.target_guid = d.target_guid(+) UNION -- finally insert all direct members that are hosts SELECT e.target_type, e.target_name, e.target_guid, f.ecm_snapshot_id FROM ( SELECT members.member_target_type target_type, members.member_target_name target_name, members.member_target_guid target_guid, null ecm_snapshot_id FROM MGMT_V_STRG_FLAT_MEMBERSHIPS members, MGMT$ECM_CURRENT_SNAPSHOTS snap WHERE composite_target_name = p_target_name AND composite_target_type = p_target_type AND member_target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE ) e, ( SELECT members.member_target_type target_type, members.member_target_name target_name, members.member_target_guid target_guid, snap.ecm_snapshot_id FROM MGMT_V_STRG_FLAT_MEMBERSHIPS members, MGMT$ECM_CURRENT_SNAPSHOTS snap WHERE composite_target_name = p_target_name AND composite_target_type = p_target_type AND member_target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE AND member_target_guid = snap.target_guid(+) AND snap.snapshot_type = 'host_storage' AND EXISTS ( SELECT ecm_snapshot_id FROM MGMT_STORAGE_REPORT_DATA WHERE ecm_snapshot_id = snap.ecm_snapshot_id ) ) f WHERE e.target_guid = f.target_guid(+) ); END IF; END DO_INS_TARGETS_FOR_UI_QUERIES; ---------------------------------------------------------------------- PROCEDURE SET_HIST_DATA_EXISTS_FLAG(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_hist_data_exists_flag OUT VARCHAR2) IS l_hist_metric_name MGMT_METRICS.metric_name%TYPE; BEGIN IF(p_target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE) THEN l_hist_metric_name := STORAGE_REP_METRICS_PKG.G_HOST_STORAGE_REP_METRIC; ELSE l_hist_metric_name := STORAGE_REP_METRICS_PKG.G_GROUP_STORAGE_REP_METRIC; END IF; SELECT DECODE(COUNT(*), 0, 'N', 'Y') history_data_exists INTO p_hist_data_exists_flag FROM DUAL WHERE EXISTS ( SELECT NULL FROM MGMT_CURRENT_METRICS c, MGMT_METRICS m, MGMT_TARGETS t, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE m.metric_guid = c.metric_guid AND m.metric_name = l_hist_metric_name AND c.target_guid = t.target_guid AND t.target_name = uit.target_name AND t.target_type = uit.target_type AND m.type_meta_ver = t.type_meta_ver AND (m.category_prop_1 = ' ' OR m.category_prop_1 = t.category_prop_1) AND (m.category_prop_2 = ' ' OR m.category_prop_2 = t.category_prop_2) AND (m.category_prop_3 = ' ' OR m.category_prop_3 = t.category_prop_3) AND (m.category_prop_4 = ' ' OR m.category_prop_4 = t.category_prop_4) AND (m.category_prop_5 = ' ' OR m.category_prop_5 = t.category_prop_5) ); END SET_HIST_DATA_EXISTS_FLAG; ---------------------------------------------------------------------- -- -- Gets usage summary storage values in byte size numbers. -- -- p_calc_storage_source_flag - flag that tells if we need -- to calculate values of storage source -- for db (i.e. values in the -- following OUT parameters): -- -- p_db_on_local_disks - database storage from disks -- p_db_on_volumes - database storage from volumes -- p_db_on_asm - database storage from asm -- p_db_on_local_fs database storage from local FS -- p_db_on_writeable_nfs - database storage from NFS -- -- It is set to TRUE when executed from UI. -- It is set to FALSE for repository metric collections. -- PROCEDURE GET_USAGE_SUMMARY_VALUES(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_calc_storage_source_flag IN NUMBER, p_db_on_local_disks OUT NUMBER, p_db_on_volumes OUT NUMBER, p_db_on_asm OUT NUMBER, p_db_on_local_fs OUT NUMBER, p_db_on_writeable_nfs OUT NUMBER, p_db_allocated OUT NUMBER, p_db_tablespace_size OUT NUMBER, p_db_tablespace_used OUT NUMBER, p_db_used OUT NUMBER, p_db_free OUT NUMBER, p_local_fs_on_local_disks OUT NUMBER, p_local_fs_on_volumes OUT NUMBER, p_local_fs_used OUT NUMBER, p_local_fs_free OUT NUMBER, p_writeable_nfs_used OUT NUMBER, p_writeable_nfs_free OUT NUMBER) IS l_db_allocated NUMBER; l_db_used NUMBER; l_db_free NUMBER; BEGIN IF (p_calc_storage_source_flag = MGMT_GLOBAL.G_TRUE) THEN GET_DB_STORAGE_SOURCE(p_db_on_local_disks => p_db_on_local_disks, p_db_on_volumes => p_db_on_volumes, p_db_on_asm => p_db_on_asm, p_db_on_local_fs => p_db_on_local_fs, p_db_on_writeable_nfs => p_db_on_writeable_nfs); END IF; GET_DB_TABLESPACE_SIZE_USED(p_tablespace_size => p_db_tablespace_size, p_tablespace_used => p_db_tablespace_used); GET_DB_ALLOC_USED_FREE(p_db_allocated => p_db_allocated, p_db_used => p_db_used, p_db_free => p_db_free); IF (p_calc_storage_source_flag = MGMT_GLOBAL.G_TRUE) THEN GET_VOL_DISK_USED_BY_LAYER(p_storage_layer => G_LOCAL_FILESYSTEM, p_vol_allocated_by_layer => p_local_fs_on_volumes, p_disk_allocated_by_layer => p_local_fs_on_local_disks); END IF; GET_LOCAL_FS_NFS_USED_FREE(p_local_fs_used => p_local_fs_used, p_local_fs_free => p_local_fs_free, p_writeable_nfs_used => p_writeable_nfs_used, p_writeable_nfs_free => p_writeable_nfs_free); /* With changes done by Ajay earlier, I no longer need to calculate the LOCAL FS FREE as below. Morever, In the case of history calculation, we no longer calculate p_local_fs_on_volumes and p_local_fs_on_local_disks - so the logic below would yield incorrect value for local fs free. Hence commenting it out (May 05, 2005) -- local fs free, if calculated in the same query as used, is inaccurate. -- I have to subtract the used from total to get the correct value. IF(NOT(p_local_fs_on_volumes IS NULL AND p_local_fs_on_local_disks IS NULL AND p_local_fs_used IS NULL)) THEN p_local_fs_free := (NVL(p_local_fs_on_volumes,0) + NVL(p_local_fs_on_local_disks, 0)) - NVL(p_local_fs_used, 0); END IF; */ END GET_USAGE_SUMMARY_VALUES; ---------------------------------------------------------------------- PROCEDURE GET_ALLOCATION_SUMMARY_VALUES(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_vol_allocated OUT NUMBER, p_vol_overhead OUT NUMBER, p_vol_unallocated OUT NUMBER, p_vol_size OUT NUMBER, p_asm_allocated OUT NUMBER, p_asm_unallocated OUT NUMBER, p_asm_overhead OUT NUMBER, p_disk_allocated OUT NUMBER, p_disk_unallocated OUT NUMBER, p_disk_size OUT NUMBER, p_asm_size OUT NUMBER, p_writeable_nfs_allocated OUT NUMBER) IS BEGIN GET_VOL_DISK_ALLOCATED(p_disk_allocated => p_disk_allocated, p_vol_allocated => p_vol_allocated); GET_VOL_DISK_UNALLOCATED(p_disk_unallocated => p_disk_unallocated, p_vol_unallocated => p_vol_unallocated); GET_VOL_DISK_NFS_SIZE(p_disk_size => p_disk_size, p_vol_size => p_vol_size, p_writeable_nfs_allocated => p_writeable_nfs_allocated); IF (NOT(p_vol_size IS NULL AND p_vol_allocated IS NULL AND p_vol_unallocated IS NULL)) THEN p_vol_overhead := NVL(p_vol_size,0) - (NVL(p_vol_allocated, 0) + NVL(p_vol_unallocated, 0)); END IF; GET_ASM_ALLOC_UNALLOC_OVERHEAD(p_asm_allocated => p_asm_allocated, p_asm_unallocated => p_asm_unallocated, p_asm_overhead => p_asm_overhead); END GET_ALLOCATION_SUMMARY_VALUES; ---------------------------------------------------------------------- FUNCTION GET_STORAGE_COLLECTION_ERRORS(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN SYS_REFCURSOR IS l_result_cursor SYS_REFCURSOR; BEGIN OPEN l_result_cursor FOR SELECT errors.target_name, types.type_display_name, errors.metric_label, errors.collection_timestamp, errors.metric_collection_error_msg, errors.target_type FROM MGMT_V_STORAGE_COLL_ERRORS errors, MGMT_TARGET_TYPES types WHERE errors.target_type = types.target_type ORDER BY errors.target_name, errors.target_type, errors.collection_timestamp; RETURN l_result_cursor; END GET_STORAGE_COLLECTION_ERRORS; ---------------------------------------------------------------------- FUNCTION GET_STORAGE_MAPPING_ISSUES(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN SYS_REFCURSOR IS l_result_cursor SYS_REFCURSOR; BEGIN OPEN l_result_cursor FOR SELECT uit.target_name, i.type, i.message_id, i.message_params, i.action_id, i.action_params, snap.saved_timestamp FROM MGMT_STORAGE_REPORT_ISSUES i, MGMT_STORAGE_REPORT_UI_TARGETS uit, MGMT_ECM_GEN_SNAPSHOT snap WHERE uit.ecm_snapshot_id = i.ecm_snapshot_id AND i.ecm_snapshot_id = snap.snapshot_guid; RETURN l_result_cursor; END GET_STORAGE_MAPPING_ISSUES; ---------------------------------------------------------------------- FUNCTION GET_SUMMARIZED_ASM_COUNT(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN NUMBER IS l_summarized_asm_count NUMBER; BEGIN -- The algorithm is that if for a target any one of the -- ASM metrics (currently we only consider DiskGroup_Usage -- metric) has been collected, then it is considered summarized. -- In future, we need to make changes during storage calculation -- to have a check that would prevent an ASM target to be summarized -- when perhaps any one of the metrics is not collected. SELECT COUNT (DISTINCT t.target_guid) INTO l_summarized_asm_count FROM MGMT_CURRENT_METRICS c, MGMT_TARGETS t, MGMT_METRICS m, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE t.target_type = MGMT_GLOBAL.G_ASM_TARGET_TYPE AND uit.target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE AND uit.target_name = t.host_name AND t.target_type = m.target_type AND t.type_meta_ver = m.type_meta_ver AND m.metric_name = G_ASM_DG_USAGE_METRIC AND m.metric_column IN ('total_mb', 'free_mb','usable_file_mb', 'type') AND (m.category_prop_1 = ' ' OR m.category_prop_1 = t.category_prop_1) AND (m.category_prop_2 = ' ' OR m.category_prop_2 = t.category_prop_2) AND (m.category_prop_3 = ' ' OR m.category_prop_3 = t.category_prop_3) AND (m.category_prop_4 = ' ' OR m.category_prop_4 = t.category_prop_4) AND (m.category_prop_5 = ' ' OR m.category_prop_5 = t.category_prop_5) AND c.target_guid = t.target_guid AND c.metric_guid = m.metric_guid; RETURN l_summarized_asm_count; END GET_SUMMARIZED_ASM_COUNT; ---------------------------------------------------------------------- PROCEDURE GET_STORAGE_ISSUES_COUNT(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_unmonitored_nfs_count OUT NUMBER, p_other_issues_count OUT NUMBER) IS BEGIN SELECT SUM(DECODE(message_id, 'ERROR_REP_TGT_NOT_MNTRD', 1, 0)) unmonitored_nfs_issue_count, SUM(DECODE(message_id, 'ERROR_REP_TGT_NOT_MNTRD', 0, 1)) other_issues_count INTO p_unmonitored_nfs_count, p_other_issues_count FROM MGMT_STORAGE_REPORT_ISSUES i, MGMT_STORAGE_REPORT_UI_TARGETS uit WHERE uit.ecm_snapshot_id = i.ecm_snapshot_id; END GET_STORAGE_ISSUES_COUNT; ---------------------------------------------------------------------- -- -- Returns refresh job info if it is not yet completed. -- PROCEDURE GET_REFRESH_JOB_INFO(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_refresh_job_name OUT MGMT_JOB.job_name%TYPE, p_refresh_job_exec_id OUT MGMT_JOB_EXEC_SUMMARY.job_id%TYPE, p_refresh_job_status OUT MGMT_JOB_EXEC_SUMMARY.status%TYPE) IS l_job_id MGMT_JOB.job_id%TYPE; BEGIN IF(p_target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE) THEN p_refresh_job_status := G_NO_REFRESH_JOB_IS_RUNNING; RETURN; END IF; -- Get the latest job executed for this group -- query on job description BEGIN SELECT job_id, job_name INTO l_job_id, p_refresh_job_name FROM ( SELECT RANK() OVER( ORDER BY b.start_time DESC ) rk, a.job_id, a.job_name FROM MGMT$JOBS a, MGMT_JOB_EXEC_SUMMARY b WHERE a.job_description = STORAGE_UI_GROUP_PKG.G_GROUP_JOB_DESC_PREFIX||p_target_name AND a.job_type = storage_ui_group_pkg.G_GROUP_REFRESH_JOB_TYPE AND a.job_id = b.job_id ) WHERE rk = 1 AND ROWNUM = 1; EXCEPTION -- No job ever submitted for this target WHEN NO_DATA_FOUND THEN p_refresh_job_status := G_NO_REFRESH_JOB_IS_RUNNING; p_refresh_job_name := NULL; RETURN; END; -- If a job was submitted for this group -- check for active jobs BEGIN SELECT status, execution_id INTO p_refresh_job_status, p_refresh_job_exec_id FROM mgmt_job_exec_summary WHERE job_id = l_job_id AND status NOT IN ( mgmt_jobs.COMPLETED_STATUS, mgmt_jobs.FAILED_STATUS, mgmt_jobs.ABORTED_STATUS, mgmt_jobs.STOPPED_STATUS, mgmt_jobs.SKIPPED_STATUS, mgmt_jobs.DELETE_PENDING_STATUS ) AND ROWNUM = 1; EXCEPTION WHEN NO_DATA_FOUND THEN p_refresh_job_status := G_NO_REFRESH_JOB_IS_RUNNING; p_refresh_job_name := NULL; END; END GET_REFRESH_JOB_INFO; ---------------------------------------------------------------------- PROCEDURE LOG_STORAGE_SUMMARY_VALUES(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_vol_allocated IN NUMBER, p_vol_overhead IN NUMBER, p_vol_unallocated IN NUMBER, p_vol_size IN NUMBER, p_asm_allocated IN NUMBER, p_asm_unallocated IN NUMBER, p_asm_overhead IN NUMBER, p_disk_allocated IN NUMBER, p_disk_unallocated IN NUMBER, p_disk_size IN NUMBER, p_asm_size IN NUMBER, p_writeable_nfs_allocated IN NUMBER, p_db_on_local_disks IN NUMBER, p_db_on_volumes IN NUMBER, p_db_on_asm IN NUMBER, p_db_on_local_fs IN NUMBER, p_db_on_writeable_nfs IN NUMBER, p_db_allocated IN NUMBER, p_db_tablespace_size IN NUMBER, p_db_tablespace_used IN NUMBER, p_db_used IN NUMBER, p_db_free IN NUMBER, p_local_fs_on_local_disks IN NUMBER, p_local_fs_on_volumes IN NUMBER, p_local_fs_used IN NUMBER, p_local_fs_free IN NUMBER, p_writeable_nfs_used IN NUMBER, p_writeable_nfs_free IN NUMBER, p_total_allocated IN NUMBER, p_total_unallocated IN NUMBER, p_total_overhead IN NUMBER, p_total_used IN NUMBER, p_total_free IN NUMBER) IS BEGIN EMDW_LOG.DEBUG('Storage summary values begin' , G_MODULE_NAME); LOG_DASHED_LINE; EMDW_LOG.DEBUG('p_vol_allocated: ' || p_vol_allocated , G_MODULE_NAME); EMDW_LOG.DEBUG('p_vol_overhead: ' || p_vol_overhead , G_MODULE_NAME); EMDW_LOG.DEBUG('p_vol_unallocated: ' || p_vol_unallocated , G_MODULE_NAME); EMDW_LOG.DEBUG('p_vol_size: ' || p_vol_size , G_MODULE_NAME); EMDW_LOG.DEBUG('p_asm_allocated: ' || p_asm_allocated , G_MODULE_NAME); EMDW_LOG.DEBUG('p_asm_unallocated: ' || p_asm_unallocated , G_MODULE_NAME); EMDW_LOG.DEBUG('p_asm_overhead: ' || p_asm_overhead , G_MODULE_NAME); EMDW_LOG.DEBUG('p_disk_allocated: ' || p_disk_allocated , G_MODULE_NAME); EMDW_LOG.DEBUG('p_disk_unallocated: ' || p_disk_unallocated , G_MODULE_NAME); EMDW_LOG.DEBUG('p_disk_size: ' || p_disk_size , G_MODULE_NAME); EMDW_LOG.DEBUG('p_asm_size: ' || p_asm_size , G_MODULE_NAME); EMDW_LOG.DEBUG('p_writeable_nfs_allocated: ' || p_writeable_nfs_allocated , G_MODULE_NAME); EMDW_LOG.DEBUG('p_db_on_local_disks: ' || p_db_on_local_disks , G_MODULE_NAME); EMDW_LOG.DEBUG('p_db_on_volumes: ' || p_db_on_volumes , G_MODULE_NAME); EMDW_LOG.DEBUG('p_db_on_asm: ' || p_db_on_asm , G_MODULE_NAME); EMDW_LOG.DEBUG('p_db_on_local_fs: ' || p_db_on_local_fs , G_MODULE_NAME); EMDW_LOG.DEBUG('p_db_on_writeable_nfs: ' || p_db_on_writeable_nfs , G_MODULE_NAME); EMDW_LOG.DEBUG('p_db_allocated: ' || p_db_allocated , G_MODULE_NAME); EMDW_LOG.DEBUG('p_db_tablespace_size: ' || p_db_tablespace_size , G_MODULE_NAME); EMDW_LOG.DEBUG('p_db_tablespace_used: ' || p_db_tablespace_used , G_MODULE_NAME); EMDW_LOG.DEBUG('p_db_used: ' || p_db_used , G_MODULE_NAME); EMDW_LOG.DEBUG('p_db_free: ' || p_db_free , G_MODULE_NAME); EMDW_LOG.DEBUG('p_local_fs_on_local_disks: ' || p_local_fs_on_local_disks , G_MODULE_NAME); EMDW_LOG.DEBUG('p_local_fs_on_volumes: ' || p_local_fs_on_volumes , G_MODULE_NAME); EMDW_LOG.DEBUG('p_local_fs_used: ' || p_local_fs_used , G_MODULE_NAME); EMDW_LOG.DEBUG('p_local_fs_free: ' || p_local_fs_free , G_MODULE_NAME); EMDW_LOG.DEBUG('p_writeable_nfs_used: ' || p_writeable_nfs_used , G_MODULE_NAME); EMDW_LOG.DEBUG('p_writeable_nfs_free: ' || p_writeable_nfs_free , G_MODULE_NAME); EMDW_LOG.DEBUG('p_total_allocated: ' || p_total_allocated , G_MODULE_NAME); EMDW_LOG.DEBUG('p_total_unallocated: ' || p_total_unallocated , G_MODULE_NAME); EMDW_LOG.DEBUG('p_total_overhead: ' || p_total_overhead , G_MODULE_NAME); EMDW_LOG.DEBUG('p_total_used: ' || p_total_used , G_MODULE_NAME); EMDW_LOG.DEBUG('p_total_free: ' || p_total_free , G_MODULE_NAME); LOG_DASHED_LINE; EMDW_LOG.DEBUG(' Storage summary values end.' , G_MODULE_NAME); END LOG_STORAGE_SUMMARY_VALUES; ---------------------------------------------------------------------- PROCEDURE LOG_DASHED_LINE IS BEGIN DBMS_OUTPUT.PUT_LINE('---------------------------'); END LOG_DASHED_LINE; ---------------------------------------------------------------------- PROCEDURE PRINT_STORAGE_SUMMARY_VALUES(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2, p_vol_allocated IN NUMBER, p_vol_overhead IN NUMBER, p_vol_unallocated IN NUMBER, p_vol_size IN NUMBER, p_asm_allocated IN NUMBER, p_asm_unallocated IN NUMBER, p_asm_overhead IN NUMBER, p_disk_allocated IN NUMBER, p_disk_unallocated IN NUMBER, p_disk_size IN NUMBER, p_asm_size IN NUMBER, p_writeable_nfs_allocated IN NUMBER, p_db_on_local_disks IN NUMBER, p_db_on_volumes IN NUMBER, p_db_on_asm IN NUMBER, p_db_on_local_fs IN NUMBER, p_db_on_writeable_nfs IN NUMBER, p_db_allocated IN NUMBER, p_db_tablespace_size IN NUMBER, p_db_tablespace_used IN NUMBER, p_db_used IN NUMBER, p_db_free IN NUMBER, p_local_fs_on_local_disks IN NUMBER, p_local_fs_on_volumes IN NUMBER, p_local_fs_used IN NUMBER, p_local_fs_free IN NUMBER, p_writeable_nfs_used IN NUMBER, p_writeable_nfs_free IN NUMBER, p_total_allocated IN NUMBER, p_total_unallocated IN NUMBER, p_total_overhead IN NUMBER, p_total_used IN NUMBER, p_total_free IN NUMBER) IS BEGIN DBMS_OUTPUT.PUT_LINE('Storage summary values begin'); PRINT_DASHED_LINE; DBMS_OUTPUT.PUT_LINE('p_vol_allocated: ' || p_vol_allocated); DBMS_OUTPUT.PUT_LINE('p_vol_overhead: ' || p_vol_overhead); DBMS_OUTPUT.PUT_LINE('p_vol_unallocated: ' || p_vol_unallocated); DBMS_OUTPUT.PUT_LINE('p_vol_size: ' || p_vol_size); DBMS_OUTPUT.PUT_LINE('p_asm_allocated: ' || p_asm_allocated); DBMS_OUTPUT.PUT_LINE('p_asm_unallocated: ' || p_asm_unallocated); DBMS_OUTPUT.PUT_LINE('p_asm_overhead: ' || p_asm_overhead); DBMS_OUTPUT.PUT_LINE('p_disk_allocated: ' || p_disk_allocated); DBMS_OUTPUT.PUT_LINE('p_disk_unallocated: ' || p_disk_unallocated); DBMS_OUTPUT.PUT_LINE('p_disk_size: ' || p_disk_size); DBMS_OUTPUT.PUT_LINE('p_asm_size: ' || p_asm_size); DBMS_OUTPUT.PUT_LINE('p_writeable_nfs_allocated: ' || p_writeable_nfs_allocated); DBMS_OUTPUT.PUT_LINE('p_db_on_local_disks: ' || p_db_on_local_disks); DBMS_OUTPUT.PUT_LINE('p_db_on_volumes: ' || p_db_on_volumes); DBMS_OUTPUT.PUT_LINE('p_db_on_asm: ' || p_db_on_asm); DBMS_OUTPUT.PUT_LINE('p_db_on_local_fs: ' || p_db_on_local_fs); DBMS_OUTPUT.PUT_LINE('p_db_on_writeable_nfs: ' || p_db_on_writeable_nfs); DBMS_OUTPUT.PUT_LINE('p_db_allocated: ' || p_db_allocated); DBMS_OUTPUT.PUT_LINE('p_db_tablespace_size: ' || p_db_tablespace_size); DBMS_OUTPUT.PUT_LINE('p_db_tablespace_used: ' || p_db_tablespace_used); DBMS_OUTPUT.PUT_LINE('p_db_used: ' || p_db_used); DBMS_OUTPUT.PUT_LINE('p_db_free: ' || p_db_free); DBMS_OUTPUT.PUT_LINE('p_local_fs_on_local_disks: ' || p_local_fs_on_local_disks); DBMS_OUTPUT.PUT_LINE('p_local_fs_on_volumes: ' || p_local_fs_on_volumes); DBMS_OUTPUT.PUT_LINE('p_local_fs_used: ' || p_local_fs_used); DBMS_OUTPUT.PUT_LINE('p_local_fs_free: ' || p_local_fs_free); DBMS_OUTPUT.PUT_LINE('p_writeable_nfs_used: ' || p_writeable_nfs_used); DBMS_OUTPUT.PUT_LINE('p_writeable_nfs_free: ' || p_writeable_nfs_free); DBMS_OUTPUT.PUT_LINE('p_total_allocated: ' || p_total_allocated); DBMS_OUTPUT.PUT_LINE('p_total_unallocated: ' || p_total_unallocated); DBMS_OUTPUT.PUT_LINE('p_total_overhead: ' || p_total_overhead); DBMS_OUTPUT.PUT_LINE('p_total_used: ' || p_total_used); DBMS_OUTPUT.PUT_LINE('p_total_free: ' || p_total_free); PRINT_DASHED_LINE; DBMS_OUTPUT.PUT_LINE(' Storage summary values end.'); END PRINT_STORAGE_SUMMARY_VALUES; ---------------------------------------------------------------------- PROCEDURE PRINT_DASHED_LINE IS BEGIN DBMS_OUTPUT.PUT_LINE('---------------------------'); END PRINT_DASHED_LINE; ---------------------------------------------------------------------- FUNCTION IS_HISTORY_METRIC_DEFINED(p_target_name IN VARCHAR2, p_target_type IN VARCHAR2) RETURN VARCHAR2 IS l_history_metric_defined_flag VARCHAR2(2); l_history_metric_name MGMT_METRICS.metric_name%TYPE; BEGIN l_history_metric_name := STORAGE_REP_METRICS_PKG.G_GROUP_STORAGE_REP_METRIC; IF(p_target_type = MGMT_GLOBAL.G_HOST_TARGET_TYPE) THEN l_history_metric_name := STORAGE_REP_METRICS_PKG.G_HOST_STORAGE_REP_METRIC; END IF; SELECT DECODE(COUNT(*), 0,STORAGE_UI_UTIL_PKG.NO, STORAGE_UI_UTIL_PKG.YES) INTO l_history_metric_defined_flag FROM MGMT_METRICS m, MGMT_TARGETS t WHERE m.target_type = p_target_type AND m.type_meta_ver = t.type_meta_ver AND m.metric_name = l_history_metric_name AND t.target_name = p_target_name AND t.target_type = m.target_type AND (m.category_prop_1 = ' ' OR m.category_prop_1 = t.category_prop_1) AND (m.category_prop_2 = ' ' OR m.category_prop_2 = t.category_prop_2) AND (m.category_prop_3 = ' ' OR m.category_prop_3 = t.category_prop_3) AND (m.category_prop_4 = ' ' OR m.category_prop_4 = t.category_prop_4) AND (m.category_prop_5 = ' ' OR m.category_prop_5 = t.category_prop_5); RETURN l_history_metric_defined_flag; END IS_HISTORY_METRIC_DEFINED; ---------------------------------------------------------------------- END STORAGE_UI_COMMON_PKG; / SHOW ERRORS;