-------------------------------------------------------- -- DDL for Package Body PKG_DEPLOY_COORDINATOR -------------------------------------------------------- CREATE OR REPLACE EDITIONABLE PACKAGE BODY "ENVX_OPER"."PKG_DEPLOY_COORDINATOR" AS /*-------------------------------------------------------------------------*/ /*---------------------------- FUNCTIONS ----------------------------------*/ /*-------------------------------------------------------------------------*/ /*--------------- FNC01-------------------*/ FUNCTION request_hgroup_name( pi_id_request IN NUMBER, pi_id_enviroment_type IN NUMBER, pi_creation_date IN DATE ) RETURN VARCHAR2 AS v_result VARCHAR2(100); log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.request_hgroup_name'; BEGIN v_result := lpad(pi_id_request, 5, 0) || '-' --lpad(pi_id_enviroment_type, 000) || lpad(to_char(pi_creation_date, 'YYYYMMDD'), 8, 0); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'HGROUP: ' || v_result); ------------------------------------------------------------------ RETURN v_result; END; /*--------------- FNC02-------------------*/ FUNCTION next_step_status( pi_id_pattern IN NUMBER, pi_id_pattern_step IN NUMBER, pi_id_status IN NUMBER, pi_result IN NUMBER -- 0: exec_sequence / 1: id_pattern_step / 2: id_executor ) RETURN NUMBER AS v_result NUMBER := 0; v_actual_id_step NUMBER := 0; v_category NUMBER := 0; v_act_exec_cat NUMBER := 0; v_act_executor NUMBER := 0; v_actual_sequence NUMBER := 0; --- v_new_id_step NUMBER := 0; v_new_exec_cat NUMBER := 0; v_new_executor NUMBER := 0; v_new_sequence NUMBER := 0; log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.next_step_status'; BEGIN SELECT ( CASE pi_id_status WHEN 0 THEN -999 WHEN 1 THEN nvl(ps.id_pstep_success, -999) WHEN 2 THEN nvl(ps.id_pstep_warning, -999) WHEN (-1) THEN nvl(ps.id_pstep_error, -999) WHEN (-2) THEN nvl(ps.id_pstep_abort, -999) WHEN (-3) THEN nvl(ps.id_pstep_timeout, -999) ELSE NULL END ) AS resultado, ( CASE pi_id_status WHEN 0 THEN 0 WHEN 1 THEN ps.id_act_cat_success WHEN 2 THEN ps.id_act_cat_warning WHEN (-1) THEN ps.id_act_cat_error WHEN (-2) THEN ps.id_act_cat_abort WHEN (-3) THEN ps.id_act_cat_timeout ELSE NULL END ) AS category, ps.id_exec_category, ps.exec_sequence, ps.id_executor INTO v_actual_id_step, v_category, v_act_exec_cat, v_actual_sequence, v_act_executor FROM deployment_pattern_step ps WHERE ps.id_pattern_step = pi_id_pattern_step AND ps.id_pattern = pi_id_pattern; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_actual_id_step, v_category, v_act_exec_cat, v_actual_sequence, v_act_executor: ' || v_actual_id_step || ', ' || v_category || ', ' || v_act_exec_cat || ', ' || v_actual_sequence || ', ' || v_act_executor); ------------------------------------------------------------------ IF v_actual_id_step = -999 THEN CASE WHEN v_category = 1 THEN -- NEXT_STEP --- v_new_sequence := v_actual_sequence + 1; --- SELECT ps.id_pattern_step, ps.id_exec_category, ps.id_executor INTO v_new_id_step, v_new_exec_cat, v_new_executor FROM deployment_pattern_step ps WHERE ps.id_pattern = pi_id_pattern AND ps.exec_sequence = v_new_sequence; WHEN v_category = 2 THEN -- PREV_STEP v_new_sequence := v_actual_sequence - 1; --- SELECT ps.id_pattern_step, ps.id_exec_category, ps.id_executor INTO v_new_id_step, v_new_exec_cat, v_new_executor FROM deployment_pattern_step ps WHERE ps.id_pattern = pi_id_pattern AND ps.exec_sequence = v_new_sequence; WHEN v_category = 3 THEN -- GO_2_STEP v_new_sequence := -999; --- WTF -- DEBE TENER CONFIGURADO UN PASO OBLIGATORIAMENTE v_new_id_step := -999; WHEN v_category = 4 THEN -- GO_2_BEGIN v_new_sequence := 1; --- SELECT ps.id_pattern_step, ps.id_exec_category, ps.id_executor INTO v_new_id_step, v_new_exec_cat, v_new_executor FROM deployment_pattern_step ps WHERE ps.id_pattern = pi_id_pattern AND ps.exec_sequence = v_new_sequence; WHEN v_category = 5 THEN -- PAUSE v_new_id_step := v_actual_id_step; v_new_sequence := v_actual_sequence; v_new_executor := v_act_executor; WHEN v_category = 6 THEN -- ABORT v_new_sequence := 0; --- WTF -- FIN DE LA EJECUCION v_new_id_step := 0; v_new_executor := 0; WHEN v_category = 7 THEN -- FINISH v_new_sequence := 0; --- WTF -- FIN DE LA EJECUCION v_new_id_step := 0; v_new_executor := 0; ELSE -- WTF NULL; END CASE; ELSE v_new_id_step := v_actual_id_step; v_new_sequence := v_actual_sequence; v_new_executor := v_act_executor; END IF; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_new_id_step, v_category, v_new_exec_cat, v_new_sequence, v_new_executor: ' || v_new_id_step || ', ' || v_category || ', ' || v_new_exec_cat || ', ' || v_new_sequence || ', ' || v_new_executor); ------------------------------------------------------------------ --- IF nvl(pi_result, 0) = 0 THEN RETURN v_new_id_step; ELSIF nvl(pi_result, 0) = 1 THEN RETURN v_new_sequence; ELSE RETURN v_act_executor; END IF; --- EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.next_step_status - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - next_step_status: ' || sqlerrm); ------------------------------------------------------------------ RETURN -999; END; /*--------------- FNC03-------------------*/ FUNCTION step_status_result( pi_pattern IN NUMBER, pi_id_pattern_step IN NUMBER, pi_id_status IN NUMBER ) RETURN VARCHAR2 AS v_result VARCHAR2(50); log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.step_status_result'; BEGIN SELECT ( CASE pi_id_status WHEN 0 THEN 'Procesando' WHEN 1 THEN ps.status_success WHEN 2 THEN ps.status_warning WHEN (-1) THEN ps.status_error WHEN (-2) THEN ps.status_abort WHEN (-3) THEN ps.status_timeout ELSE NULL END ) AS functional_status INTO v_result FROM deployment_pattern_step ps WHERE ps.id_pattern_step = pi_id_pattern_step AND ps.id_pattern = pi_pattern; --- apex_debug.info('pkg_deploy_coordinator.step_status_result - v_result: %s', v_result); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_result: ' || v_result); ------------------------------------------------------------------ RETURN v_result; --- EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.step_status_result - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - step_status_result: ' || sqlerrm); ------------------------------------------------------------------ RETURN 'ERROR-WTF-FNC03'; END; /*--------------- FNC04-------------------*/ FUNCTION step_status_category( pi_id_pattern IN NUMBER, pi_id_pattern_step IN NUMBER, pi_id_status IN NUMBER ) RETURN NUMBER AS v_result NUMBER := 0; log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.step_status_category'; BEGIN SELECT ( CASE pi_id_status WHEN 0 THEN 0 WHEN 1 THEN ps.id_act_cat_success WHEN 2 THEN ps.id_act_cat_warning WHEN (-1) THEN ps.id_act_cat_error WHEN (-2) THEN ps.id_act_cat_abort WHEN (-3) THEN ps.id_act_cat_timeout ELSE NULL END ) AS category INTO v_result FROM deployment_pattern_step ps WHERE ps.id_pattern_step = pi_id_pattern_step AND ps.id_pattern = pi_id_pattern; --- apex_debug.info('pkg_deploy_coordinator.step_status_category - v_result: %s', v_result); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_result: ' || v_result); ------------------------------------------------------------------ RETURN v_result; --- EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.step_status_category - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - step_status_category: ' || sqlerrm); ------------------------------------------------------------------ RETURN -999; END; /*--------------- FNC05-------------------*/ FUNCTION step_status_retry( pi_id_pattern IN NUMBER, pi_id_pattern_step IN NUMBER, pi_id_status IN NUMBER ) RETURN NUMBER AS v_result NUMBER := 0; log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.step_status_retry'; BEGIN SELECT ( CASE pi_id_status WHEN 0 THEN 0 WHEN 1 THEN 0 WHEN 2 THEN 0 WHEN (-1) THEN ps.retries_error WHEN (-2) THEN 0 WHEN (-3) THEN ps.retries_timeout ELSE 0 END ) AS retries INTO v_result FROM deployment_pattern_step ps WHERE ps.id_pattern_step = pi_id_pattern_step AND ps.id_pattern = pi_id_pattern; --- apex_debug.info('pkg_deploy_coordinator.step_status_retry - v_result: %s', v_result); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_result: ' || v_result); ------------------------------------------------------------------ RETURN v_result; --- EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.step_status_retry - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - step_status_retry: ' || sqlerrm); ------------------------------------------------------------------ RETURN -999; END; /*--------------- FNC06-------------------*/ FUNCTION step_exec_category( pi_id_pattern IN NUMBER, pi_id_pattern_step IN NUMBER, pi_result IN NUMBER -- 0:exec_category_type / 1:id_exec_category ) RETURN NUMBER AS v_result NUMBER := 0; v_sqlerrm VARCHAR2(500); log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.step_exec_category'; BEGIN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES pi_result, pi_id_pattern, pi_id_pattern_step: ' || pi_result || ', ' || pi_id_pattern || ', ' || pi_id_pattern_step); ------------------------------------------------------------------ SELECT decode(nvl(pi_result, 0), 0, ec.exec_category_type, ps.id_exec_category) AS category INTO v_result FROM deployment_pattern_step ps, executor_category ec WHERE ps.id_exec_category = ec.id_exec_category AND ps.id_pattern_step = pi_id_pattern_step AND ps.id_pattern = pi_id_pattern; --- apex_debug.info('pkg_deploy_coordinator.step_exec_category - v_result: %s', v_result); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_result: ' || v_result); ------------------------------------------------------------------ RETURN v_result; --- EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.step_exec_category - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - step_exec_category: ' || sqlerrm); ------------------------------------------------------------------ RETURN -999; --WTF END; /*--------------- FNC07-------------------*/ FUNCTION sch_job_name( pi_id_schedule IN NUMBER, pi_id_schedule_detail IN NUMBER, pi_schedule_fequency IN NUMBER ) RETURN VARCHAR2 AS v_result VARCHAR2(100); log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.sch_job_name'; BEGIN SELECT 'SC' || lpad(s.id_schedule, 2, 0) || lpad(pi_id_schedule_detail, 2, 0) || 'F' || lpad(pi_schedule_fequency, 2, 0) || 'DT' || lpad(id_deployment_type, 2, 0) || 'ET' || lpad(id_enviroment_type, 2, 0) AS job_name INTO v_result FROM deployment_schedule s WHERE s.id_schedule = pi_id_schedule; apex_debug.info('pkg_deploy_coordinator.sch_job_name - v_result: %s', v_result); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_result: ' || v_result); ------------------------------------------------------------------ RETURN v_result; EXCEPTION WHEN no_data_found THEN apex_debug.error('pkg_deploy_coordinator.sch_job_name - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - sch_job_name: ' || sqlerrm); ------------------------------------------------------------------ RETURN NULL; END; /*--------------- FNC08-------------------*/ FUNCTION schedule_fequency_name( pi_schedule_fequency IN NUMBER, pi_schedule_init_date IN DATE ) RETURN VARCHAR2 AS v_result VARCHAR2(200); log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.schedule_fequency_name'; BEGIN CASE WHEN pi_schedule_fequency = 1 THEN v_result := 'DIARIAMENTE: HORA-' || to_char(pi_schedule_init_date, 'HH24:MI:SS'); WHEN pi_schedule_fequency = 2 THEN v_result := 'SEMANALMENTE: ' || trim(to_char(pi_schedule_init_date, 'DAY')) || ' | HORA-' || to_char(pi_schedule_init_date, 'HH24:MI:SS'); WHEN pi_schedule_fequency = 3 THEN v_result := 'MENSUALMENTE: DIA-' || to_char(pi_schedule_init_date, 'DD') || ' | HORA-' || to_char(pi_schedule_init_date, 'HH24:MI:SS'); WHEN pi_schedule_fequency = 4 THEN v_result := 'ANUALMENTE: DIA-' || to_char(pi_schedule_init_date, 'DD') || ' | MES-' || trim(to_char(pi_schedule_init_date, 'MONTH')) || ' | HORA-' || to_char(pi_schedule_init_date, 'HH24:MI:SS'); END CASE; apex_debug.info('pkg_deploy_coordinator.schedule_fequency_name - v_result: %s', v_result); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_result: ' || v_result); ------------------------------------------------------------------ RETURN v_result; EXCEPTION WHEN no_data_found THEN apex_debug.error('pkg_deploy_coordinator.schedule_fequency_name - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - schedule_fequency_name: ' || sqlerrm); ------------------------------------------------------------------ RETURN NULL; END; /*--------------- FNC09-------------------*/ FUNCTION schedule_fequency_job( pi_schedule_fequency IN NUMBER, pi_schedule_init_date IN DATE ) RETURN VARCHAR2 AS v_result VARCHAR2(200); v_job_freq VARCHAR2(100); v_day VARCHAR2(50); v_hour VARCHAR2(50); v_minute VARCHAR2(50); v_second VARCHAR2(50); log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.schedule_fequency_job'; BEGIN CASE pi_schedule_fequency WHEN 1 THEN v_job_freq := 'FREQ=DAILY'; --- Establece la hora exacta de ejecucion en funcion de la fecha inicial v_hour := ';byhour=' || to_char(pi_schedule_init_date, 'HH24'); v_minute := ';byminute=' || to_char(pi_schedule_init_date, 'MI'); v_second := ';bysecond=' || to_char(pi_schedule_init_date, 'SS'); v_result := v_job_freq || v_hour || v_minute || v_second; WHEN 2 THEN v_job_freq := 'FREQ=WEEKLY'; --- Determina el dia de la semana donde se ejecuta en funcion de la fecha inicial CASE to_char(pi_schedule_init_date, 'D') WHEN 1 THEN v_day := ';BYDAY=MON'; WHEN 2 THEN v_day := ';BYDAY=TUE'; WHEN 3 THEN v_day := ';BYDAY=WED'; WHEN 4 THEN v_day := ';BYDAY=THU'; WHEN 5 THEN v_day := ';BYDAY=FRI'; WHEN 6 THEN v_day := ';BYDAY=SAT'; ELSE v_day := ';BYDAY=SUN'; END CASE; --- Establece la hora exacta de ejecucion en funcion de la fecha inicial v_hour := ';byhour=' || to_char(pi_schedule_init_date, 'HH24'); v_minute := ';byminute=' || to_char(pi_schedule_init_date, 'MI'); v_second := ';bysecond=' || to_char(pi_schedule_init_date, 'SS'); --- v_result := v_job_freq || v_day || v_hour || v_minute || v_second; WHEN 3 THEN v_job_freq := 'FREQ=MONTHLY'; --- v_result := v_job_freq; WHEN 4 THEN v_job_freq := 'FREQ=YEARLY'; v_result := v_job_freq; ELSE v_result := ''; END CASE; apex_debug.info('pkg_deploy_coordinator.schedule_fequency_job - v_result: %s', v_result); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_result: ' || v_result); ------------------------------------------------------------------ RETURN v_result; EXCEPTION WHEN no_data_found THEN apex_debug.error('pkg_deploy_coordinator.schedule_fequency_job - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - schedule_fequency_job: ' || sqlerrm); ------------------------------------------------------------------ RETURN NULL; END; /*--------------- FNC10-------------------*/ FUNCTION fnc_request_icon_deploy( pi_id_status NUMBER ) RETURN VARCHAR2 AS v_result VARCHAR2(100); log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.fnc_request_icon_deploy'; BEGIN SELECT ( CASE WHEN pi_id_status = 0 THEN 'fa fa-rocket fam-blank fam-is-info' --0 WHEN pi_id_status = 1 THEN 'fa fa-rocket fam-check fam-is-success' --ps.id_act_cat_success WHEN pi_id_status = 2 THEN 'fa fa-rocket fam-check fam-is-warning' --ps.id_act_cat_warning WHEN pi_id_status = (-1) THEN 'fa fa-rocket fam-x fam-is-danger' --ps.id_act_cat_error WHEN pi_id_status = (-2) THEN 'fa fa-ban' --ps.id_act_cat_abort WHEN pi_id_status = (-3) THEN 'fa fa-clock-o fam-x fam-is-danger' --ps.id_act_cat_timeout WHEN pi_id_status = (-4) THEN 'fa fa-rocket fam-x fam-is-danger' -- -4 - Error interno, NO devuelto por Jenkins ELSE 'fa fa-rocket fam-blank fam-is-info' END ) AS category_action INTO v_result FROM dual; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_result: ' || v_result); ------------------------------------------------------------------ RETURN v_result; EXCEPTION WHEN OTHERS THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR: ' || sqlerrm); ------------------------------------------------------------------ RETURN NULL; END; /*--------------- FNC11-------------------*/ FUNCTION fnc_request_status( pi_id_control_deploy NUMBER ) RETURN VARCHAR2 AS v_id_status NUMBER; v_status VARCHAR2(100); v_last_step BOOLEAN; v_category NUMBER; v_pattern NUMBER; v_pattern_step NUMBER; v_id_obj_hgroup VARCHAR(50); v_max_group VARCHAR(50); log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.fnc_request_status'; BEGIN v_last_step := false; SELECT ed.id_deployment_status, ed.id_pattern, ed.id_pattern_step, ed.id_obj_hgroup, ( SELECT MAX(h.id_req_hgroup) FROM deployment_req_hgroup h WHERE h.id_request = ed.id_request ) AS max_group INTO v_id_status, v_pattern, v_pattern_step, v_id_obj_hgroup, v_max_group FROM request_exec_deploy ed WHERE ed.id_control_deploy = pi_id_control_deploy; --analizo si es el ultimo paso en el patron SELECT ( CASE WHEN v_id_status = 0 THEN 0 WHEN v_id_status = 1 THEN ps.id_act_cat_success WHEN v_id_status = 2 THEN ps.id_act_cat_warning WHEN v_id_status = -1 THEN ps.id_act_cat_error WHEN v_id_status = -2 THEN ps.id_act_cat_abort WHEN v_id_status = -3 THEN ps.id_act_cat_timeout ELSE NULL END ) AS category_action INTO v_category FROM deployment_pattern_step ps WHERE ps.id_pattern_step = v_pattern_step AND ps.id_pattern = v_pattern; --si es el ultimo paso en el patron, seteo la variable last_step IF v_category IN (6, 7) AND (v_id_obj_hgroup = v_max_group) THEN v_last_step := true; END IF; --analizo si es el ultimo paso de la solicitud o no y seteo el resultado IF v_last_step = false THEN --analizo segun el id, si es un estado correcto, con advertencias o con errores IF v_id_status >= 0 THEN v_status := 'En Proceso'; ELSIF v_id_status < 0 AND v_category IN (6, 7) THEN v_status := 'Abortada'; ELSE v_status := 'Con Errores'; END IF; ELSE --analizo segun el id, si es un estado correcto, con advertencias o con errores IF v_id_status > 0 THEN v_status := 'Finalizada'; ELSIF v_id_status < 0 THEN v_status := 'Abortada'; END IF; END IF; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_status: ' || v_status); ------------------------------------------------------------------ RETURN v_status; EXCEPTION WHEN OTHERS THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR: ' || sqlerrm); ------------------------------------------------------------------ RETURN NULL; END; /*--------------- FNC12-------------------*/ FUNCTION fnc_request_progress( pi_id_request NUMBER ) RETURN VARCHAR2 AS v_total_obj_deploy NUMBER; v_total_obj NUMBER; v_result VARCHAR2(100); log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.fnc_request_progress'; BEGIN SELECT ( SELECT COUNT(1) FROM request_exec_deploy ed WHERE id_request = t.id_request AND id_deployment_status > 0 AND id_control_deploy = ( SELECT MAX(ec.id_control_deploy) FROM request_exec_deploy ec WHERE ec.id_dep_req_object = ed.id_dep_req_object AND ec.id_request = ed.id_request AND ec.env_order = ed.env_order ) AND ( SELECT ( CASE WHEN ed.id_deployment_status = 0 THEN 0 WHEN ed.id_deployment_status = 1 THEN ps.id_act_cat_success WHEN ed.id_deployment_status = 2 THEN ps.id_act_cat_warning WHEN ed.id_deployment_status = -1 THEN ps.id_act_cat_error WHEN ed.id_deployment_status = -2 THEN ps.id_act_cat_abort WHEN ed.id_deployment_status = -3 THEN ps.id_act_cat_timeout ELSE NULL END ) AS category_action FROM deployment_pattern_step ps WHERE ps.id_pattern_step = ed.id_pattern_step AND ps.id_pattern = ed.id_pattern ) = 7 ) AS obj, t.q_object INTO v_total_obj_deploy, v_total_obj FROM request_exec_tray t WHERE t.id_request = pi_id_request; v_result := v_total_obj_deploy || '/' || v_total_obj || ' Objetos (' || round(((v_total_obj_deploy / v_total_obj) * 100), 2) || '%)'; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_result: ' || v_result); ------------------------------------------------------------------ RETURN v_result; EXCEPTION WHEN OTHERS THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR: ' || sqlerrm); ------------------------------------------------------------------ RETURN NULL; END; /*--------------- FNC13-------------------*/ FUNCTION fnc_icon_flag( pi_id_request NUMBER, pi_env_hgroup VARCHAR2 ) RETURN VARCHAR2 AS v_result VARCHAR2(100); v_total_obj_hgroup NUMBER; v_total_obj_hgroup_deploy NUMBER; v_total_obj_processing NUMBER; v_obj_error NUMBER; log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.fnc_icon_flag'; BEGIN SELECT ( SELECT COUNT(1) FROM request_exec_deploy ed WHERE id_request = t.id_request AND id_deployment_status > 0 AND id_control_deploy = ( SELECT MAX(ec.id_control_deploy) FROM request_exec_deploy ec WHERE ec.id_dep_req_object = ed.id_dep_req_object AND ec.id_request = ed.id_request ) AND ( SELECT ( CASE WHEN ed.id_deployment_status = 0 THEN 0 WHEN ed.id_deployment_status = 1 THEN ps.id_act_cat_success WHEN ed.id_deployment_status = 2 THEN ps.id_act_cat_warning WHEN ed.id_deployment_status = -1 THEN ps.id_act_cat_error WHEN ed.id_deployment_status = -2 THEN ps.id_act_cat_abort WHEN ed.id_deployment_status = -3 THEN ps.id_act_cat_timeout ELSE NULL END ) AS category_action FROM deployment_pattern_step ps WHERE ps.id_pattern_step = ed.id_pattern_step AND ps.id_pattern = ed.id_pattern ) = 7 AND ed.id_env_hgroup = pi_env_hgroup ), ( SELECT COUNT(1) FROM request_exec_deploy ed WHERE ed.id_request = t.id_request AND ed.id_control_deploy = ( SELECT MAX(ec.id_control_deploy) FROM request_exec_deploy ec WHERE ec.id_dep_req_object = ed.id_dep_req_object AND ec.id_request = ed.id_request ) AND ed.id_env_hgroup = pi_env_hgroup ), ( SELECT COUNT(1) FROM request_exec_deploy ed WHERE ed.id_request = pi_id_request AND ed.id_control_deploy = ( SELECT MAX(ec.id_control_deploy) FROM request_exec_deploy ec WHERE ec.id_dep_req_object = ed.id_dep_req_object AND ec.id_request = ed.id_request ) AND ed.id_env_hgroup = pi_env_hgroup AND id_deployment_status < 0 ) INTO v_total_obj_hgroup_deploy, v_total_obj_processing, v_obj_error FROM request_exec_tray t WHERE t.id_request = pi_id_request; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_total_obj_hgroup_deploy,v_total_obj_processing,v_obj_error: ' || v_total_obj_hgroup_deploy || ',' || v_total_obj_processing || ',' || v_obj_error); ------------------------------------------------------------------ SELECT COUNT(1) INTO v_total_obj_hgroup FROM hierarchical_request_vew WHERE group_id = pi_id_request AND level_alias = 'O' AND level_path_id LIKE 'R' || pi_id_request || ',' || pi_env_hgroup || '%'; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_total_obj_hgroup: ' || v_total_obj_hgroup); ------------------------------------------------------------------ IF (v_total_obj_hgroup = v_total_obj_hgroup_deploy) THEN v_result := 'fa fa-code fam-check fam-is-success'; ELSIF (v_total_obj_hgroup > v_total_obj_hgroup_deploy) AND (v_obj_error > 0) THEN v_result := 'fa fa-code fam-x fam-is-danger'; ELSIF (v_total_obj_hgroup > v_total_obj_hgroup_deploy) AND (v_total_obj_hgroup_deploy > 0) THEN v_result := 'fa fa-code fam-blank fam-is-info'; ELSIF (v_total_obj_hgroup > v_total_obj_hgroup_deploy) AND (v_total_obj_hgroup_deploy = 0) AND (v_total_obj_processing > 0) THEN v_result := 'fa fa-code fam-blank fam-is-info'; ELSIF (v_total_obj_hgroup > v_total_obj_hgroup_deploy) AND (v_total_obj_hgroup = 0) THEN v_result := 'fa fa-code'; ELSE v_result := 'fa fa-code'; END IF; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES v_result: ' || v_result); ------------------------------------------------------------------ RETURN v_result; EXCEPTION WHEN OTHERS THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR: ' || sqlerrm); ------------------------------------------------------------------ RETURN NULL; END; /*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/ /*--------------------------- PROCEDURES ----------------------------------*/ /*-------------------------------------------------------------------------*/ /*--------------- DPCP1-------------------*/ PROCEDURE manage_enviroment_pattern( pi_id_pattern IN NUMBER, pi_id_enviroment IN NUMBER, po_warning OUT NOCOPY VARCHAR2 ) AS v_deploy_enable NUMBER := 0; v_enviroment_status NUMBER := 0; v_enviroment_alias VARCHAR2(100); v_enviroment_set NUMBER := 0; log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.manage_enviroment_pattern'; BEGIN SELECT e.deploy_enable, e.enviroment_status AS env_enable, e.enviroment_name || ' (' || e.enviroment_alias || ') ', nvl(( SELECT 1 FROM deployment_pattern_env ep WHERE ep.id_enviroment = e.id_enviroment AND ep.id_pattern = pi_id_pattern ), 0) INTO v_deploy_enable, v_enviroment_status, v_enviroment_alias, v_enviroment_set FROM enviroment e WHERE e.id_enviroment = pi_id_enviroment; IF v_enviroment_status = 1 AND v_enviroment_set = 0 THEN BEGIN INSERT INTO tmp_enviroment_pattern ( id_pattern, id_enviroment ) VALUES ( pi_id_pattern, pi_id_enviroment ); --- po_warning := v_enviroment_alias || pkg_sicd_commons.f_system_message(pi_id_message => 1, pi_message_class => 'DPCP1', pi_return_type => 1); --- EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.manage_enviroment_pattern - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - tmp_enviroment_pattern: ' || sqlerrm); ------------------------------------------------------------------ DELETE tmp_enviroment_pattern WHERE id_enviroment = pi_id_enviroment AND id_pattern = pi_id_pattern; --- po_warning := v_enviroment_alias || pkg_sicd_commons.f_system_message(pi_id_message => 2, pi_message_class => 'DPCP1', pi_return_type => 1); END; ELSIF v_enviroment_status = 0 THEN --- po_warning := v_enviroment_alias || pkg_sicd_commons.f_system_message(pi_id_message => 3, pi_message_class => 'DPCP1', pi_return_type => 1); ELSIF v_enviroment_set = 1 THEN po_warning := v_enviroment_alias || pkg_sicd_commons.f_system_message(pi_id_message => 4, pi_message_class => 'DPCP1', pi_return_type => 1); ELSE --- po_warning := v_enviroment_alias || pkg_sicd_commons.f_system_message(pi_id_message => 5, pi_message_class => 'DPCP1', pi_return_type => 1); END IF; EXCEPTION WHEN OTHERS THEN --- apex_debug.error('pkg_deploy_coordinator.manage_enviroment_pattern - %s', sqlerrm); po_warning := v_enviroment_alias || pkg_sicd_commons.f_system_message(pi_id_message => 5, pi_message_class => 'DPCP1', pi_return_type => 1); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - manage_enviroment_pattern: ' || sqlerrm); ------------------------------------------------------------------ END; /*--------------- DPCP2-------------------*/ PROCEDURE manage_enviroment_request( pi_id_request IN NUMBER, pi_id_req_hgroup IN VARCHAR2, pi_id_deploying_tech IN NUMBER, pi_id_enviroment IN NUMBER, po_warning OUT NOCOPY VARCHAR2 ) AS v_order NUMBER := 0; v_deploy_enable NUMBER := 0; v_enviroment_status NUMBER := 0; v_enviroment_alias VARCHAR2(100); v_enviroment_set NUMBER := 0; log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.manage_enviroment_request'; BEGIN SELECT e.deploy_enable, e.enviroment_status AS env_enable, e.enviroment_name || ' (' || e.enviroment_alias || ') ', nvl((SELECT COUNT(1) FROM enviroment ep WHERE ep.id_parent_enviroment = e.id_enviroment), 0) AS seted INTO v_deploy_enable, v_enviroment_status, v_enviroment_alias, v_enviroment_set FROM enviroment e WHERE e.id_enviroment = pi_id_enviroment; IF v_enviroment_status = 1 AND v_enviroment_set = 0 THEN BEGIN --- SELECT nvl(MAX(enviroment_order), 0) INTO v_order FROM tmp_enviroments_request; --- INSERT INTO tmp_enviroments_request ( id_dep_req_env, id_enviroment, id_deploying_tech, id_request, enviroment_order, id_req_hgroup ) VALUES ( v_order + 1, pi_id_enviroment, pi_id_deploying_tech, pi_id_request, v_order + 1, pi_id_req_hgroup ); --- po_warning := v_enviroment_alias || pkg_sicd_commons.f_system_message(pi_id_message => 1, pi_message_class => 'DPCP2', pi_return_type => 1); --- EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.manage_enviroment_request - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - tmp_enviroments_request: ' || sqlerrm); ------------------------------------------------------------------ DELETE tmp_enviroments_request WHERE id_enviroment = pi_id_enviroment AND id_req_hgroup = pi_id_req_hgroup; --- po_warning := v_enviroment_alias || pkg_sicd_commons.f_system_message(pi_id_message => 2, pi_message_class => 'DPCP2', pi_return_type => 1); END; ELSIF v_enviroment_status = 0 THEN --- po_warning := v_enviroment_alias || pkg_sicd_commons.f_system_message(pi_id_message => 3, pi_message_class => 'DPCP2', pi_return_type => 1); ELSIF v_enviroment_set > 0 THEN po_warning := pkg_sicd_commons.f_system_message(pi_id_message => 4, pi_message_class => 'DPCP2', pi_return_type => 1) || v_enviroment_alias; ELSE --- po_warning := v_enviroment_alias || pkg_sicd_commons.f_system_message(pi_id_message => 5, pi_message_class => 'DPCP2', pi_return_type => 1); END IF; EXCEPTION WHEN OTHERS THEN --- apex_debug.error('pkg_deploy_coordinator.manage_enviroment_request - %s', sqlerrm); po_warning := v_enviroment_alias || pi_id_enviroment || pkg_sicd_commons.f_system_message(pi_id_message => 5, pi_message_class => 'DPCP2', pi_return_type => 1); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - manage_enviroment_request: ' || sqlerrm); ------------------------------------------------------------------ END; /*--------------- DPCP3-------------------*/ PROCEDURE manage_object_request( pi_id_request IN NUMBER, pi_id_req_hgroup IN VARCHAR2, pi_id_pattern IN NUMBER, pi_object_path IN VARCHAR2, pi_object_name IN VARCHAR2, pi_object_version IN VARCHAR2, pi_id_object_repo IN VARCHAR2, po_warning OUT NOCOPY VARCHAR2 ) AS v_order NUMBER := 0; v_deploy_enable NUMBER := 0; v_object_status NUMBER := 0; v_object_t_set NUMBER := 0; v_object_ver_set VARCHAR2(10); v_object_hgroup_name VARCHAR2(100); v_err VARCHAR2(1000); log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.manage_object_request'; BEGIN BEGIN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- WARNING pi_log_message => '00 - pi_id_request, pi_id_req_hgroup, pi_id_pattern, pi_object_path, pi_object_name, pi_object_version, pi_id_object_rep: ' || pi_id_request || ', ' || pi_id_req_hgroup || ', ' || pi_id_pattern || ', ' || pi_object_path || ', ' || pi_object_name || ', ' || pi_object_version || ', ' || pi_id_object_repo); ------------------------------------------------------------------ SELECT o.object_version INTO v_object_ver_set FROM tmp_objects_request o WHERE o.object_name = pi_object_name AND o.object_source_path = pi_object_path; v_object_t_set := 1; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- WARNING pi_log_message => '01 - pi_id_object_repo, v_object_ver_set: ' || pi_id_object_repo || ', ' || v_object_ver_set); ------------------------------------------------------------------ EXCEPTION WHEN no_data_found THEN -- apex_debug.error('pkg_deploy_coordinator.manage_object_request - %s', sqlerrm); BEGIN SELECT o.object_version, hg.req_hgroup_name INTO v_object_ver_set, v_object_hgroup_name FROM deployment_req_object o, deployment_req_hgroup hg WHERE o.id_req_hgroup = hg.id_req_hgroup AND o.id_req_hgroup != pi_id_req_hgroup AND o.object_name = pi_object_name AND o.object_source_path = pi_object_path AND o.id_request = pi_id_request; v_object_t_set := 2; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- WARNING pi_log_message => '02 - pi_id_object_repo, v_object_ver_set, v_object_t_set: ' || pi_id_object_repo || ', ' || v_object_ver_set || ', ' || v_object_hgroup_name || ', ' || v_object_t_set); ------------------------------------------------------------------ EXCEPTION WHEN no_data_found THEN -- apex_debug.error('pkg_deploy_coordinator.manage_object_request - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - tmp_objects_request: ' || sqlerrm); ------------------------------------------------------------------ END; END; --- IF nvl(v_object_ver_set, 'NE') IN ('NE', pi_object_version) AND v_object_t_set = 1 THEN --- -- apex_debug.error('pkg_deploy_coordinator.manage_object_request - %s', sqlerrm); DELETE tmp_objects_request WHERE id_object_repo = pi_id_object_repo AND object_name = pi_object_name AND id_req_hgroup = pi_id_req_hgroup AND id_request = pi_id_request; --- ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- WARNING pi_log_message => '04 - pi_id_object_repo, pi_id_req_hgroup: ' || pi_id_object_repo || ', ' || pi_id_req_hgroup); ------------------------------------------------------------------ po_warning := pi_object_name || pkg_sicd_commons.f_system_message(pi_id_message => 2, pi_message_class => 'DPCP3', pi_return_type => 1); ELSIF nvl(v_object_ver_set, 'NE') IN ('NE', pi_object_version) AND v_object_t_set = 0 THEN BEGIN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- WARNING pi_log_message => 'EVAL - v_object_ver_set, pi_object_version, v_object_t_set: ' || v_object_ver_set || ', ' || pi_object_version || ', ' || v_object_t_set); ------------------------------------------------------------------ --- SELECT nvl(MAX(o.object_order), 0) INTO v_order FROM tmp_objects_request o WHERE id_req_hgroup = pi_id_req_hgroup AND id_request = pi_id_request; --- INSERT INTO tmp_objects_request ( id_dep_req_object, id_request, id_pattern, id_req_hgroup, object_order, id_object_repo, id_reqdet_instance, object_dep_status, object_version, object_name, object_source_path ) VALUES ( v_order + 1, pi_id_request, pi_id_pattern, pi_id_req_hgroup, v_order + 1, TRIM(pi_id_object_repo), NULL, NULL, pi_object_version, pi_object_name, pi_object_path ); --- ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- WARNING pi_log_message => '03 - pi_id_object_repo, pi_object_version, pi_object_name, pi_object_path: ' || pi_id_object_repo || ', ' || pi_object_version || ', ' || pi_object_name || ', ' || pi_object_path); ------------------------------------------------------------------ po_warning := pi_object_name || pkg_sicd_commons.f_system_message(pi_id_message => 1, pi_message_class => 'DPCP3', pi_return_type => 1); --- EXCEPTION WHEN OTHERS THEN --- -- apex_debug.error('pkg_deploy_coordinator.manage_object_request - %s', sqlerrm); DELETE tmp_objects_request WHERE id_object_repo = pi_id_object_repo AND object_name = pi_object_name AND id_req_hgroup = pi_id_req_hgroup AND id_request = pi_id_request; --- ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- WARNING pi_log_message => '04 - pi_id_object_repo, pi_id_req_hgroup: ' || pi_id_object_repo || ', ' || pi_id_req_hgroup); ------------------------------------------------------------------ po_warning := pi_object_name || pkg_sicd_commons.f_system_message(pi_id_message => 2, pi_message_class => 'DPCP3', pi_return_type => 1); END; ELSIF nvl(v_object_ver_set, 'NE') NOT IN ('NE', pi_object_version) AND v_object_t_set = 1 THEN UPDATE tmp_objects_request o SET o.id_object_repo = pi_id_object_repo, o.object_version = pi_object_version WHERE o.object_name = pi_object_name AND o.object_source_path = pi_object_path AND id_request = pi_id_request; --- ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- WARNING pi_log_message => '05 - pi_id_object_repo, v_object_ver_set, v_object_t_set: ' || pi_id_object_repo || ', ' || v_object_ver_set || ', ' || v_object_hgroup_name || ', ' || v_object_t_set); ------------------------------------------------------------------ po_warning := pi_object_name || pkg_sicd_commons.f_system_message(pi_id_message => 3, pi_message_class => 'DPCP3', pi_return_type => 1); ELSIF v_object_ver_set = pi_object_version AND v_object_t_set = 2 THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- WARNING pi_log_message => '06 - pi_id_object_repo, v_object_ver_set, v_object_t_set: ' || pi_id_object_repo || ', ' || v_object_ver_set || ', ' || v_object_hgroup_name || ', ' || v_object_t_set); ------------------------------------------------------------------ po_warning := pi_object_name || pkg_sicd_commons.f_system_message(pi_id_message => 4, pi_message_class => 'DPCP3', pi_return_type => 1) || v_object_hgroup_name; ELSIF v_object_ver_set != pi_object_version AND v_object_t_set = 2 THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- WARNING pi_log_message => '07 - pi_id_object_repo, v_object_ver_set, v_object_t_set: ' || pi_id_object_repo || ', ' || v_object_ver_set || ', ' || v_object_hgroup_name || ', ' || v_object_t_set); ------------------------------------------------------------------ po_warning := pi_object_name || pkg_sicd_commons.f_system_message(pi_id_message => 4, pi_message_class => 'DPCP3', pi_return_type => 1) || '"' || v_object_hgroup_name || '"'; ELSE --- ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- WARNING pi_log_message => '08 - pi_id_object_repo, v_object_ver_set, v_object_t_set: ' || pi_id_object_repo || ', ' || v_object_ver_set || ', ' || v_object_hgroup_name || ', ' || v_object_t_set); ------------------------------------------------------------------ po_warning := pi_object_name || pkg_sicd_commons.f_system_message(pi_id_message => 5, pi_message_class => 'DPCP3', pi_return_type => 1) || '"' || v_object_hgroup_name || '"'; END IF; EXCEPTION WHEN OTHERS THEN --- -- apex_debug.error('pkg_deploy_coordinator.manage_object_request - %s', sqlerrm); /*po_warning := pi_object_name || pi_id_object_repo || pkg_sicd_commons.f_system_message(pi_id_message => 6, pi_message_class => 'DPCP3', pi_return_type => 1);*/ po_warning := pi_object_name || ': ' || pkg_sicd_commons.f_system_message(pi_id_message => 6, pi_message_class => 'DPCP3', pi_return_type => 1); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - manage_object_request: ' || sqlerrm); ------------------------------------------------------------------ END; /*--------------- DPCP4-------------------*/ PROCEDURE automatic_dep_control( pi_id_request IN INTEGER, pi_id_control_deploy IN INTEGER, pi_id_status IN INTEGER, pi_exec_message IN VARCHAR2, pi_exec_date IN VARCHAR2, po_warning OUT NOCOPY VARCHAR2 ) IS r_red request_exec_deploy%rowtype; r_redx request_exec_deploy%rowtype; v_retry_aux INTEGER := 0; v_id_next_step INTEGER := 0; v_seq_next_step INTEGER := 0; v_exec_next_step INTEGER := 0; v_sts_category INTEGER := 0; v_exec_category INTEGER := 0; v_exec_cat_type INTEGER := 0; v_next_ctrl_deploy INTEGER := 0; --- v_total_obj_og INTEGER := 0; v_total_og_eg INTEGER := 0; v_total_env_eg INTEGER := 0; v_total_eg_req INTEGER := 0; --- v_next_obj INTEGER := 0; v_next_obj_hgroup INTEGER := 0; v_next_env INTEGER := 0; v_next_env_hgroup INTEGER := 0; --- v_sqlerrm VARCHAR2(500); log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.automatic_dep_control'; BEGIN SELECT d.* INTO r_red FROM request_exec_deploy d WHERE d.id_request = pi_id_request AND d.id_control_deploy = pi_id_control_deploy; v_sts_category := pkg_deploy_coordinator.step_status_category(pi_id_pattern => r_red.id_pattern, pi_id_pattern_step => r_red.id_pattern_step, pi_id_status => r_red.id_deployment_status); -- Determina si la ejecucion se esta procesando IF r_red.id_deployment_status = 0 THEN NULL; -- FALTA JOB DE TIMEOUT --- ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- INFO pi_log_message => 'PROCESANDO EJECUCION pi_id_request, pi_id_control_deploy, pi_id_status: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || pi_id_status); ------------------------------------------------------------------ ELSIF r_red.id_deployment_status < 0 THEN -- Determina si la ultima ejecucion no fue exitosa ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- INFO pi_log_message => 'EJECUCION CON ERROR pi_id_request, pi_id_control_deploy, pi_id_status: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || pi_id_status); ------------------------------------------------------------------ v_retry_aux := pkg_deploy_coordinator.step_status_retry(pi_id_pattern => r_red.id_pattern, pi_id_pattern_step => r_red.id_pattern_step, pi_id_status => r_red.id_deployment_status); -- Determina si posee reintentos IF v_retry_aux > 0 THEN IF r_red.retry_numer < v_retry_aux THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- INFO pi_log_message => 'REINTENTO DE EJECUCION pi_id_request, retry_numer: ' || pi_id_request || ', ' || r_red.retry_numer); ------------------------------------------------------------------ -- Ajusta los datos para el nuevo registro de control v_next_ctrl_deploy := s_request_exec_dep_id.nextval; r_red.id_control_deploy := v_next_ctrl_deploy; r_red.retry_numer := r_red.retry_numer + 1; IF r_red.retry_numer >= v_retry_aux THEN r_red.deployment_status := 'Último Reintento'; END IF; -- inserta un nuevo registro de control con el numero de reintentos next_dep_control(n_red => r_red); -- Lanza la ejecucion automatica pkg_standard_executors.prc_dynamic_exec(pi_id_request => pi_id_request, pi_id_control_deploy => r_red.id_control_deploy, pi_id_executor => r_red.id_executor); ELSE ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- INFO pi_log_message => 'ULTIMO REINTENTO DE EJECUCION FALLIDO pi_id_request, retry_numer: ' || pi_id_request || ', ' || r_red.retry_numer); ------------------------------------------------------------------ -- Ajusta los datos para el nuevo registro de control v_next_ctrl_deploy := s_request_exec_dep_id.nextval; r_red.id_control_deploy := v_next_ctrl_deploy; r_red.retry_numer := 0; r_red.id_deployment_status := -1; r_red.id_dep_proc := NULL; r_red.control_init_date := sysdate; r_red.control_end_date := NULL; r_red.deployment_status := 'Maximo de Reintentos'; r_red.observation := 'SE ALCANZO EL MAXIMO DE REINTENTOS FALLIDOS Y SE REQUIERE INTERVENCION MANUAL PARA CONTINUAR !!!'; -- inserta un nuevo registro de control para subsanacion manual INSERT INTO request_exec_deploy VALUES r_red; END IF; ELSE ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- INFO pi_log_message => 'EJECUCION SIN REINTENTOS pi_id_request, retry_numer: ' || pi_id_request || ', ' || r_red.retry_numer); ------------------------------------------------------------------ --- v_id_next_step := pkg_deploy_coordinator.next_step_status(pi_id_pattern => r_red.id_pattern, pi_id_pattern_step => r_red.id_pattern_step, pi_id_status => r_red.id_deployment_status, pi_result => 0 -- 1: exec_sequence / 0: id_pattern_step, ); IF v_id_next_step > 0 THEN -- Ajusta los datos para el nuevo registro de control v_next_ctrl_deploy := s_request_exec_dep_id.nextval; r_red.id_control_deploy := v_next_ctrl_deploy; r_red.id_pattern_step := v_id_next_step; -- inserta un nuevo registro de control con el numero de reintentos next_dep_control(n_red => r_red); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- INFO pi_log_message => 'EJECUTAR PASO pi_id_request, v_id_next_step: ' || pi_id_request || ', ' || v_id_next_step); ------------------------------------------------------------------ -- Lanza la ejecucion automatica pkg_standard_executors.prc_dynamic_exec(pi_id_request => pi_id_request, pi_id_control_deploy => r_red.id_control_deploy, pi_id_executor => r_red.id_executor); ELSE -- DETIENE EL PROCESO DE EJECUCION EN EL ULTIMO CONTROL -- Ajusta los datos para el nuevo registro de control v_next_ctrl_deploy := s_request_exec_dep_id.nextval; r_red.id_control_deploy := v_next_ctrl_deploy; r_red.id_pattern_step := v_id_next_step; -- inserta un nuevo registro de control con el numero de reintentos next_dep_control(n_red => r_red); -- AVISA AL PERFIL RESPONSABLE ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- DEBUG pi_log_message => '*** PAUSA DE EJECUCION pi_id_request, id_control_deploy: ' || pi_id_request || ', ' || r_red.id_control_deploy); ------------------------------------------------------------------ END IF; END IF; ELSE --- Determina si la ejecucion fue exitosa ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- INFO pi_log_message => 'EJECUCION CORRECTA pi_id_request, pi_id_control_deploy, pi_id_status: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || pi_id_status); ------------------------------------------------------------------ -- Se inicializa el numero de reintentos para el siguiente paso r_red.retry_numer := 0; ---------------------------------------------------------------- -- Determinar si existen controles hijos FOR ctrl IN ( SELECT MAX(id_control_deploy) ult_ctrl FROM request_exec_deploy dc WHERE dc.id_parent_ctrl_deploy = r_red.id_control_deploy ) LOOP -- Si existen controles hijos, buscar el ID mas alto y actualiza el registro actual -- Obtiene el registro de control ejecutado para una solicitud BEGIN SELECT d.* INTO r_red FROM request_exec_deploy d WHERE d.id_request = pi_id_request AND d.id_control_deploy = ctrl.ult_ctrl; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'ULTIMO REGISTRO HIJO pi_id_request, id_control_deploy: ' || pi_id_request || ', ' || r_red.id_control_deploy); ------------------------------------------------------------------ EXCEPTION WHEN no_data_found THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'ERROR - request_exec_deploy - SIN HIJOS: ' || sqlerrm); ------------------------------------------------------------------ END; END LOOP; ---------------------------------------------------------------- ---------------------------------------------------------------- -- Determina el Tipo de la Categoria de Ejecucion del paso actual v_exec_cat_type := pkg_deploy_coordinator.step_exec_category(pi_id_pattern => r_red.id_pattern, pi_id_pattern_step => r_red.id_pattern_step, pi_result => 0 -- 0: exec_category_type / 1:id_exec_category ); --- -- Categoría del Paso Actual es AUXILIAR IF v_exec_cat_type = 3 THEN -- Determina el Tipo de la Categoria de Ejecucion del paso anterior SELECT pkg_deploy_coordinator.step_exec_category(pi_id_pattern => d.id_pattern, pi_id_pattern_step => d.id_pattern_step, pi_result => 0) -- 0: exec_category_type / 1: id_exec_category INTO v_exec_cat_type FROM request_exec_deploy d WHERE d.id_request = pi_id_request AND d.id_control_deploy = ( SELECT MAX(d.id_control_deploy) FROM request_exec_deploy d WHERE d.id_request = pi_id_request AND d.id_control_deploy < r_red.id_control_deploy ); END IF; ---------------------------------------------------------------- CASE v_exec_cat_type WHEN 1 THEN -- Flujo regular de ejecucion ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'SIGUIENTE EJCUCION REGULAR pi_id_request, pi_id_control_deploy, pi_id_status: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || pi_id_status); ------------------------------------------------------------------ IF v_sts_category IN (1, 7) THEN --- Siguiente paso en el orden de ejecucion ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'CATEGORIA PASO SIGUIENTE pi_id_request, pi_id_control_deploy, v_sts_category: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || v_sts_category); ------------------------------------------------------------------ -- Total de Objetos por Grupo de Objetos SELECT MAX(ro.object_order) INTO v_total_obj_og FROM deployment_req_object ro WHERE ro.id_req_hgroup = r_red.id_obj_hgroup AND ro.id_request = r_red.id_request; IF v_total_obj_og > r_red.obj_order THEN -- Determino si NO es el ultimo objeto del Grupo -- Busco el siguiente Objeto en el Grupo -- Ajusta los datos para el nuevo registro de control r_red.obj_order := r_red.obj_order + 1; v_next_ctrl_deploy := s_request_exec_dep_id.nextval; r_red.id_control_deploy := v_next_ctrl_deploy; --- SELECT ro.id_dep_req_object, ro.id_object_repo, ro.object_name, ro.object_version, ro.object_source_path INTO r_red.id_dep_req_object, r_red.id_object_repo, r_red.object_name, r_red.object_version, r_red.object_source_path FROM deployment_req_object ro WHERE ro.id_req_hgroup = r_red.id_obj_hgroup AND ro.id_request = r_red.id_request AND ro.object_order = r_red.obj_order; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'IR AL SIGUIENTE OBJETO pi_id_request, id_control_deploy, object_name: ' || pi_id_request || ', ' || r_red.id_control_deploy || ', ' || r_red.object_name); ------------------------------------------------------------------ -- inserta un nuevo registro de control con el numero de reintentos next_dep_control(n_red => r_red); -- Solicito la Ejecucion del mismo paso del Patron -- Lanza la ejecucion automatica pkg_standard_executors.prc_dynamic_exec(pi_id_request => pi_id_request, pi_id_control_deploy => r_red.id_control_deploy, pi_id_executor => r_red.id_executor); ELSE --- IF v_sts_category != 7 THEN -- Determino si NO es el ultimo Paso del Patron -- Busco el siguiente Paso Regular del Patron SELECT ps.id_pattern_step, ps.id_executor INTO r_red.id_pattern_step, r_red.id_executor FROM deployment_pattern_step ps, deployment_pattern_step psa WHERE ps.exec_sequence = psa.exec_sequence + 1 AND ps.id_pattern = psa.id_pattern AND psa.id_pattern = r_red.id_pattern AND psa.id_pattern_step = r_red.id_pattern_step; -- Ajusta los datos para el nuevo registro de control v_next_ctrl_deploy := s_request_exec_dep_id.nextval; r_red.id_control_deploy := v_next_ctrl_deploy; r_red.obj_order := 1; -- Solicito la Ejecucion con el primer Objeto del Grupo SELECT ro.id_dep_req_object, ro.id_object_repo, ro.object_name, ro.object_version, ro.object_source_path INTO r_red.id_dep_req_object, r_red.id_object_repo, r_red.object_name, r_red.object_version, r_red.object_source_path FROM deployment_req_object ro WHERE ro.id_req_hgroup = r_red.id_obj_hgroup AND ro.id_request = r_red.id_request AND ro.object_order = 1; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'IR AL SIGUIENTE PASO DEL PATRON pi_id_request, id_control_deploy, id_pattern_step: ' || pi_id_request || ', ' || r_red.id_control_deploy || ', ' || r_red.id_pattern_step); ------------------------------------------------------------------ -- inserta un nuevo registro de control con el numero de reintentos next_dep_control(n_red => r_red); -- Lanza la ejecucion automatica pkg_standard_executors.prc_dynamic_exec(pi_id_request => pi_id_request, pi_id_control_deploy => r_red.id_control_deploy, pi_id_executor => r_red.id_executor); ELSE -- Total de Grupos de Objetos por Grupo de Ambientes SELECT MAX(og.req_hgroup_order) INTO v_total_og_eg FROM deployment_req_hgroup og WHERE og.id_parent_req_hgroup = r_red.id_env_hgroup AND og.id_request = r_red.id_request; IF v_total_og_eg > r_red.obj_hgroup_order THEN -- Determino si NO es el ultimo Grupo de objetos -- Ajusta los datos para el nuevo registro de control v_next_ctrl_deploy := s_request_exec_dep_id.nextval; r_red.id_control_deploy := v_next_ctrl_deploy; r_red.obj_hgroup_order := r_red.obj_hgroup_order + 1; r_red.obj_order := 1; -- Busco el siguiente Grupo de Objetos SELECT og.id_req_hgroup, og.id_req_hgroup_ref INTO r_red.id_obj_hgroup, r_red.id_pattern FROM deployment_req_hgroup og WHERE og.id_parent_req_hgroup = r_red.id_env_hgroup AND og.id_request = r_red.id_request AND og.req_hgroup_order = r_red.obj_hgroup_order; -- Primer Paso del Patron SELECT id_pattern_step, id_executor INTO r_red.id_pattern_step, r_red.id_executor FROM deployment_pattern_step ps WHERE ps.id_pattern = r_red.id_pattern AND ps.exec_sequence = 1; -- Primer Objeto del Grupo SELECT ro.id_dep_req_object, ro.id_object_repo, ro.object_name, ro.object_version, ro.object_source_path INTO r_red.id_dep_req_object, r_red.id_object_repo, r_red.object_name, r_red.object_version, r_red.object_source_path FROM deployment_req_object ro WHERE ro.id_req_hgroup = r_red.id_obj_hgroup AND ro.id_request = r_red.id_request AND ro.object_order = 1; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'IR AL SIGUIENTE GRUPO DE OBJETOS pi_id_request, id_control_deploy, id_obj_hgroup: ' || pi_id_request || ', ' || r_red.id_control_deploy || ', ' || r_red.id_obj_hgroup); ------------------------------------------------------------------ -- inserta un nuevo registro de control con el numero de reintentos next_dep_control(n_red => r_red); -- Lanza la ejecucion automatica pkg_standard_executors.prc_dynamic_exec(pi_id_request => pi_id_request, pi_id_control_deploy => r_red.id_control_deploy, pi_id_executor => r_red.id_executor); ELSE -- Total de Ambientes por Grupo de Ambientes SELECT MAX(re.enviroment_order) INTO v_total_env_eg FROM deployment_req_env re WHERE re.id_req_hgroup = r_red.id_env_hgroup AND re.id_request = r_red.id_request; IF v_total_env_eg > r_red.env_order THEN -- Determino si NO es el ultimo Ambiente del Grupo -- Ajusta los datos para el nuevo registro de control v_next_ctrl_deploy := s_request_exec_dep_id.nextval; r_red.id_control_deploy := v_next_ctrl_deploy; r_red.env_order := r_red.env_order + 1; r_red.obj_hgroup_order := 1; r_red.obj_order := 1; -- Busco el Siguiente Ambientes SELECT re.id_enviroment, ( SELECT id_parent_enviroment FROM enviroment ep WHERE ep.id_enviroment = re.id_enviroment ) AS id_parent_enviroment INTO r_red.id_enviroment, r_red.id_parent_enviroment FROM deployment_req_env re WHERE re.id_req_hgroup = r_red.id_env_hgroup AND re.id_request = r_red.id_request AND re.enviroment_order = r_red.env_order; -- Primer Grupo de Objetos SELECT og.id_req_hgroup, og.id_req_hgroup_ref INTO r_red.id_obj_hgroup, r_red.id_pattern FROM deployment_req_hgroup og WHERE og.id_parent_req_hgroup = r_red.id_env_hgroup AND og.id_request = r_red.id_request AND og.req_hgroup_order = 1; -- Primer Paso del Patron SELECT id_pattern_step, id_executor INTO r_red.id_pattern_step, r_red.id_executor FROM deployment_pattern_step ps WHERE ps.id_pattern = r_red.id_pattern AND ps.exec_sequence = 1; -- Primer Objeto del Grupo SELECT ro.id_dep_req_object, ro.id_object_repo, ro.object_name, ro.object_version, ro.object_source_path INTO r_red.id_dep_req_object, r_red.id_object_repo, r_red.object_name, r_red.object_version, r_red.object_source_path FROM deployment_req_object ro WHERE ro.id_req_hgroup = r_red.id_obj_hgroup AND ro.id_request = r_red.id_request AND ro.object_order = 1; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'IR AL SIGUIENTE AMBIENTE pi_id_request, id_control_deploy, id_enviroment: ' || pi_id_request || ', ' || r_red.id_control_deploy || ', ' || r_red.id_enviroment); ------------------------------------------------------------------ -- inserta un nuevo registro de control con el numero de reintentos next_dep_control(n_red => r_red); -- Lanza la ejecucion automatica pkg_standard_executors.prc_dynamic_exec(pi_id_request => pi_id_request, pi_id_control_deploy => r_red.id_control_deploy, pi_id_executor => r_red.id_executor); ELSE -- Total de Grupos de Ambientes por Solicitud SELECT MAX(eg.req_hgroup_order) INTO v_total_eg_req FROM deployment_req_hgroup eg WHERE eg.id_parent_req_hgroup = r_red.id_req_hgroup AND eg.id_request = r_red.id_request; IF v_total_eg_req > r_red.env_hgroup_order THEN -- Determino si NO es el ultimo Grupo de Ambientes -- Ajusta los datos para el nuevo registro de control v_next_ctrl_deploy := s_request_exec_dep_id.nextval; r_red.id_control_deploy := v_next_ctrl_deploy; r_red.env_hgroup_order := r_red.env_hgroup_order + 1; r_red.env_order := 1; r_red.obj_hgroup_order := 1; r_red.obj_order := 1; -- Busco el siguiente Grupo de Ambientes SELECT id_req_hgroup INTO r_red.id_env_hgroup FROM deployment_req_hgroup eg WHERE eg.id_parent_req_hgroup = r_red.id_req_hgroup AND eg.id_request = r_red.id_request AND eg.req_hgroup_order = r_red.env_hgroup_order; -- Primer Ambiente del Grupo SELECT re.id_enviroment, ( SELECT id_parent_enviroment FROM enviroment ep WHERE ep.id_enviroment = re.id_enviroment ) AS id_parent_enviroment INTO r_red.id_enviroment, r_red.id_parent_enviroment FROM deployment_req_env re WHERE re.id_req_hgroup = r_red.id_env_hgroup AND re.id_request = r_red.id_request AND re.enviroment_order = 1; -- Primer Grupo de Objetos SELECT og.id_req_hgroup, og.id_req_hgroup_ref INTO r_red.id_obj_hgroup, r_red.id_pattern FROM deployment_req_hgroup og WHERE og.id_parent_req_hgroup = r_red.id_env_hgroup AND og.id_request = r_red.id_request AND og.req_hgroup_order = 1; -- Primer Paso del Patron SELECT id_pattern_step, id_executor INTO r_red.id_pattern_step, r_red.id_executor FROM deployment_pattern_step ps WHERE ps.id_pattern = r_red.id_pattern AND ps.exec_sequence = 1; -- Primer Objeto del Grupo SELECT ro.id_dep_req_object, ro.id_object_repo, ro.object_name, ro.object_version, ro.object_source_path INTO r_red.id_dep_req_object, r_red.id_object_repo, r_red.object_name, r_red.object_version, r_red.object_source_path FROM deployment_req_object ro WHERE ro.id_req_hgroup = r_red.id_obj_hgroup AND ro.id_request = r_red.id_request AND ro.object_order = 1; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'IR AL SIGUIENTE GRUPO DE AMBIENTES pi_id_request, id_control_deploy, id_env_hgroup: ' || pi_id_request || ', ' || r_red.id_control_deploy || ', ' || r_red.id_env_hgroup); ------------------------------------------------------------------ -- inserta un nuevo registro de control con el numero de reintentos next_dep_control(n_red => r_red); -- Lanza la ejecucion automatica pkg_standard_executors.prc_dynamic_exec(pi_id_request => pi_id_request, pi_id_control_deploy => r_red.id_control_deploy, pi_id_executor => r_red.id_executor); ELSE ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'FIN DE LA SOLICITUD pi_id_request, id_control_deploy: ' || pi_id_request || ', ' || r_red.id_control_deploy); ------------------------------------------------------------------ next_dep_queue( pi_id_request => pi_id_request, pi_queue_alias => r_red.queue_alias ); -- FIN DE LA SOLICITUD END IF; END IF; END IF; END IF; END IF; ELSE -- Proximo paso configurado de ejecucion v_id_next_step := pkg_deploy_coordinator.next_step_status(pi_id_pattern => r_red.id_pattern, pi_id_pattern_step => r_red.id_pattern_step, pi_id_status => r_red.id_deployment_status, pi_result => 1 -- 0: exec_sequence / 1: id_pattern_step, ); -- Ajusta los datos para el nuevo registro de control v_next_ctrl_deploy := s_request_exec_dep_id.nextval; r_red.id_control_deploy := v_next_ctrl_deploy; r_red.id_pattern_step := v_id_next_step; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'IR AL PASO* pi_id_request, pi_id_control_deploy, v_sts_category, v_id_next_step: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || v_sts_category || ', ' || v_id_next_step); ------------------------------------------------------------------ -- inserta un nuevo registro de control con el numero de reintentos next_dep_control(n_red => r_red); -- Lanza la ejecucion automatica pkg_standard_executors.prc_dynamic_exec(pi_id_request => pi_id_request, pi_id_control_deploy => r_red.id_control_deploy, pi_id_executor => r_red.id_executor); END IF; WHEN 2 THEN -- Flujo de Subsanacion de la Ejecucion v_id_next_step := pkg_deploy_coordinator.next_step_status(pi_id_pattern => r_red.id_pattern, pi_id_pattern_step => r_red.id_pattern_step, pi_id_status => r_red.id_deployment_status, pi_result => 1 -- 0: exec_sequence / 1: id_pattern_step ); -- Ajusta los datos para el nuevo registro de control v_next_ctrl_deploy := s_request_exec_dep_id.nextval; r_red.id_control_deploy := v_next_ctrl_deploy; r_red.id_pattern_step := v_id_next_step; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'IR AL PASO DE SUBSANACION pi_id_request, pi_id_control_deploy, v_sts_category, v_id_next_step: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || v_sts_category || ', ' || v_id_next_step); ------------------------------------------------------------------ -- inserta un nuevo registro de control con el numero de reintentos next_dep_control(n_red => r_red); -- Lanza la ejecucion automatica pkg_standard_executors.prc_dynamic_exec(pi_id_request => pi_id_request, pi_id_control_deploy => r_red.id_control_deploy, pi_id_executor => r_red.id_executor); WHEN 3 THEN -- Flujo Auxiliar ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- INFO pi_log_message => 'EJCUCION AUXILIAR pi_id_request, pi_id_control_deploy, pi_id_status: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || pi_id_status); ------------------------------------------------------------------ ELSE ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'WTF-PROBLEMA pi_id_request, pi_id_control_deploy, pi_id_status: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || pi_id_status); ------------------------------------------------------------------ END CASE; END IF; EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.automatic_dep_control - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - automatic_dep_control: ' || sqlerrm); ------------------------------------------------------------------ END automatic_dep_control; /*--------------- DPCP5-------------------*/ PROCEDURE first_dep_control( pi_id_request IN NUMBER, pi_id_user IN NUMBER, pi_queue_alias IN VARCHAR2, n_red OUT NOCOPY request_exec_deploy%rowtype ) AS v_scope_type INTEGER := 0; v_id_scope INTEGER := 0; r_redx request_exec_deploy%rowtype; v_new_id_ctrl INTEGER := 0; v_warning VARCHAR2(1000); log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.first_dep_control'; BEGIN v_new_id_ctrl := s_request_exec_dep_id.nextval; -- SELECT eg.id_parent_req_hgroup AS id_req_hgroup, re.id_request, NULL AS id_deployment_status, NULL AS deployment_status, eg.req_hgroup_order AS env_hgroup_order, 0 AS env_hgroup_members, eg.id_req_hgroup AS id_env_hgroup, id_deploying_tech, re.enviroment_order AS env_order, ( SELECT e.id_enviroment FROM enviroment e WHERE e.id_enviroment = re.id_enviroment ) AS id_enviroment, ( SELECT e.id_parent_enviroment FROM enviroment e WHERE e.id_enviroment = re.id_enviroment ) AS id_parent_enviroment, og.req_hgroup_order AS obj_hgroup_order, 0 AS obj_hgroup_members, og.id_req_hgroup AS id_obj_hgroup, ps.id_pattern, ps.id_pattern_step, ro.object_order AS obj_order, id_object_repo, object_source_path, object_name, object_version, v_new_id_ctrl AS id_control_deploy, pi_id_user AS id_user_control, id_executor, NULL AS id_dep_proc, 0 AS retry_numer, NULL AS control_init_date, NULL AS control_end_date, id_dep_req_object, NULL AS id_parent_ctrl_deploy, pi_queue_alias AS queue_alias, NULL AS id_prc_queue, NULL AS observation ------------------- INTO n_red FROM deployment_req_object ro, deployment_pattern_step ps, deployment_req_hgroup og, deployment_req_env re, deployment_req_hgroup eg WHERE ro.id_req_hgroup = og.id_req_hgroup AND og.id_parent_req_hgroup = eg.id_req_hgroup AND re.id_req_hgroup = eg.id_req_hgroup AND ps.id_pattern = og.id_req_hgroup_ref AND eg.id_request = re.id_request AND og.id_request = re.id_request AND ro.id_request = re.id_request AND re.id_request = re.id_request AND re.id_request = pi_id_request AND ro.object_order = ( SELECT MIN(ro1.object_order) FROM deployment_req_object ro1 WHERE ro1.id_request = re.id_request AND ro1.id_req_hgroup = og.id_req_hgroup ) -------------------------------- AND og.req_hgroup_order = ( SELECT MIN(og1.req_hgroup_order) FROM deployment_req_hgroup og1 WHERE og1.id_request = re.id_request AND og1.id_parent_req_hgroup = eg.id_req_hgroup ) -------------------------------- AND re.enviroment_order = ( SELECT MIN(re1.enviroment_order) FROM deployment_req_env re1 WHERE re1.id_request = re.id_request AND re1.id_req_hgroup = eg.id_req_hgroup ) -------------------------------- AND eg.req_hgroup_order = 1/*( SELECT MIN(eg1.req_hgroup_order) FROM deployment_req_hgroup eg1 WHERE eg1.id_request = re.id_request AND og.id_parent_req_hgroup = eg1.id_req_hgroup )*/ -------------------------------- AND ps.exec_sequence = 1; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- INFO pi_log_message => 'PRIMER REGISTRO DE CONTROL pi_id_request, id_control_deploy: ' || pi_id_request || ', ' || v_new_id_ctrl); ------------------------------------------------------------------ -- inserta un nuevo registro de control con el numero de reintentos INSERT INTO request_exec_deploy VALUES n_red; log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- INFO pi_log_message => 'Actualizacion first_dep_control: ' || pi_id_request); -- Actualiza el estado de la Solicitud UPDATE deployment_request r SET r.request_status = 'En Proceso' WHERE r.id_request = n_red.id_request; SELECT ps.id_scope INTO v_id_scope FROM deployment_pattern_step ps WHERE ps.id_pattern = n_red.id_pattern AND ps.id_pattern_step = n_red.id_pattern_step; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- debug pi_log_message => 'LUEGO DE CONSULTAR EL SCOPE - SCOPE: ' || v_id_scope); ------------------------------------------------------------------ -- Si afecta a multiples objetos IF v_id_scope != 0 THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- debug pi_log_message => 'DENTRO DEL IF DE SCOPE - n_red.id_request: ' || n_red.id_request || ' - n_red.id_req_hgroup: ' || n_red.id_req_hgroup || ' - n_red.id_object_repo: ' || n_red.id_object_repo || ' - n_red.obj_order: ' || n_red.obj_order); ------------------------------------------------------------------ FOR r_rdtx IN ( SELECT * FROM deployment_req_object ro WHERE ro.id_request = n_red.id_request AND ro.id_req_hgroup LIKE n_red.id_req_hgroup || '%' AND ro.id_object_repo = n_red.id_object_repo AND ro.object_order > n_red.obj_order ORDER BY ro.object_order ) LOOP --- ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- debug pi_log_message => 'DENTRO DEL LOOP DE HIJOS pi_id_request, r_rdtx.object_source_path, n_red.object_source_path: ' || pi_id_request || ', ' || r_rdtx.object_source_path || ', ' || n_red.object_source_path); ------------------------------------------------------------------ IF r_rdtx.object_source_path = n_red.object_source_path THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- debug pi_log_message => 'DENTRO DEL IF'); ------------------------------------------------------------------ -- Inserta registros de control mientras los registros ordenados pertenezcan al mismo directorio r_redx.id_req_hgroup := r_rdtx.id_req_hgroup; r_redx.id_request := r_rdtx.id_request; r_redx.id_user_control := pi_id_user; r_redx.id_deployment_status := NULL; r_redx.deployment_status := NULL; r_redx.env_hgroup_order := n_red.env_hgroup_order; r_redx.env_hgroup_members := n_red.env_hgroup_members; r_redx.id_env_hgroup := n_red.id_env_hgroup; r_redx.id_deploying_tech := n_red.id_deploying_tech; r_redx.env_order := n_red.env_order; r_redx.id_enviroment := n_red.id_enviroment; r_redx.id_parent_enviroment := n_red.id_parent_enviroment; r_redx.obj_hgroup_order := n_red.obj_hgroup_order; r_redx.obj_hgroup_members := n_red.obj_hgroup_members; r_redx.id_obj_hgroup := r_rdtx.id_req_hgroup; r_redx.id_pattern := r_rdtx.id_pattern; r_redx.id_pattern_step := n_red.id_pattern_step; r_redx.obj_order := r_rdtx.object_order; r_redx.id_object_repo := r_rdtx.id_object_repo; r_redx.object_source_path := r_rdtx.object_source_path; r_redx.object_name := r_rdtx.object_name; r_redx.object_version := r_rdtx.object_version; r_redx.id_control_deploy := s_request_exec_dep_id.nextval; r_redx.id_executor := n_red.id_executor; r_redx.retry_numer := n_red.retry_numer; r_redx.control_init_date := sysdate; r_redx.id_dep_req_object := r_rdtx.id_dep_req_object; r_redx.id_parent_ctrl_deploy := n_red.id_control_deploy; --- ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- debug pi_log_message => 'PRIMER GRUPO HIJO DE CONTROL pi_id_request, id_control_deploy: ' || pi_id_request || ', ' || r_redx.id_control_deploy); ------------------------------------------------------------------ -- inserta un nuevo registro de control INSERT INTO request_exec_deploy VALUES r_redx; ELSE ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- debug pi_log_message => 'DENTRO DEL ELSE'); ------------------------------------------------------------------ n_red := r_redx; EXIT; END IF; END LOOP; END IF; --- COMMIT; --- -- Lanza la ejecucion del primer registro de Control ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- debug pi_log_message => 'PRIMERA EJECUCION pi_id_request, id_control_deploy: ' || pi_id_request || ', ' || v_new_id_ctrl); ------------------------------------------------------------------ pkg_standard_executors.prc_dynamic_exec(pi_id_request => pi_id_request, pi_id_control_deploy => v_new_id_ctrl, --n_red.id_control_deploy, pi_id_executor => n_red.id_executor); --- INCLUIR AUDITORIA QUE CONTROLE QUE UN PROGRAMA HAYA INTENTADO ACTUALIZAR EL ESTATUS --- Y EL REGISTRO YA SE ENCUENTRE CON UN ESTATUS PREVIO --- PUEDE PASAR SOBRE TODO EN LOS TIMEOUT --- EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.first_dep_control - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - first_dep_control: ' || sqlerrm); ------------------------------------------------------------------ END first_dep_control; /*--------------- DPCP6-------------------*/ PROCEDURE next_dep_control( n_red IN OUT NOCOPY request_exec_deploy%rowtype ) AS v_scope_type INTEGER := 0; v_id_scope INTEGER := 0; r_redx request_exec_deploy%rowtype; v_sqlerrm VARCHAR2(500); log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.next_dep_control'; BEGIN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- debug pi_log_message => 'Inicio next_dep_control: id_pattern, id_pattern_step : ' || n_red.id_pattern || ', ' || n_red.id_pattern_step); ------------------------------------------------------------------ SELECT ps.id_scope INTO v_id_scope FROM deployment_pattern_step ps WHERE ps.id_pattern = n_red.id_pattern AND ps.id_pattern_step = n_red.id_pattern_step; -- inserta un nuevo registro de control con el numero de reintentos n_red.id_deployment_status := NULL; n_red.deployment_status := NULL; n_red.id_prc_queue := NULL; n_red.id_dep_proc := NULL; n_red.control_init_date := sysdate; n_red.control_end_date := NULL; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- debug pi_log_message => 'SIGUIENTE REGISTRO DE CONTROL pi_id_request, id_control_deploy: ' || n_red.id_request || ', ' || n_red.id_control_deploy); ------------------------------------------------------------------ INSERT INTO request_exec_deploy VALUES n_red; -- Si afecta a multiples objetos IF v_id_scope != 0 THEN FOR r_rdtx IN ( SELECT * FROM deployment_req_object ro WHERE ro.id_request = n_red.id_request AND ro.id_req_hgroup LIKE n_red.id_req_hgroup || '%' AND (ro.id_object_repo != n_red.id_object_repo OR ro.id_object_repo = n_red.id_object_repo AND ro.object_name != n_red.object_name ) AND ro.object_order > n_red.obj_order ORDER BY ro.object_order ) LOOP IF r_rdtx.object_source_path = n_red.object_source_path THEN -- Inserta registros de control mientras los registros ordenados pertenezcan al mismo directorio r_redx.id_req_hgroup := n_red.id_req_hgroup; r_redx.id_request := r_rdtx.id_request; r_redx.id_user_control := n_red.id_user_control; r_redx.id_deployment_status := NULL; r_redx.deployment_status := NULL; r_redx.env_hgroup_order := n_red.env_hgroup_order; r_redx.env_hgroup_members := n_red.env_hgroup_members; r_redx.id_env_hgroup := n_red.id_env_hgroup; r_redx.id_deploying_tech := n_red.id_deploying_tech; r_redx.env_order := n_red.env_order; r_redx.id_enviroment := n_red.id_enviroment; r_redx.id_parent_enviroment := n_red.id_parent_enviroment; r_redx.obj_hgroup_order := n_red.obj_hgroup_order; r_redx.obj_hgroup_members := n_red.obj_hgroup_members; r_redx.id_obj_hgroup := r_rdtx.id_req_hgroup; r_redx.id_pattern := r_rdtx.id_pattern; r_redx.id_pattern_step := n_red.id_pattern_step; r_redx.obj_order := r_rdtx.object_order; r_redx.id_object_repo := r_rdtx.id_object_repo; r_redx.object_source_path := r_rdtx.object_source_path; r_redx.object_name := r_rdtx.object_name; r_redx.object_version := r_rdtx.object_version; r_redx.id_control_deploy := s_request_exec_dep_id.nextval; r_redx.id_executor := n_red.id_executor; r_redx.retry_numer := n_red.retry_numer; r_redx.control_init_date := sysdate; r_redx.id_dep_req_object := r_rdtx.id_dep_req_object; r_redx.id_parent_ctrl_deploy := n_red.id_control_deploy; --- ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- debug pi_log_message => 'SIGUIENTE REGISTRO DE CONTROL HIJO pi_id_request, id_control_deploy: ' || r_redx.id_request || ', ' || r_redx.id_control_deploy); ------------------------------------------------------------------ -- inserta un nuevo registro de control INSERT INTO request_exec_deploy VALUES r_redx; ELSE n_red := r_redx; EXIT; END IF; END LOOP; END IF; --- COMMIT; EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.next_dep_control - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - next_dep_control: ' || sqlerrm); ------------------------------------------------------------------ END next_dep_control; /*--------------- DPCP7-------------------*/ PROCEDURE update_dep_control( pi_id_request IN NUMBER, pi_id_control_deploy IN NUMBER, pi_id_prc_exec IN VARCHAR2, pi_status IN NUMBER, pi_exec_message IN VARCHAR2, po_result OUT INTEGER -- 0: Sin actualizaciones , 1: Con actualizaciones ) AS v_parent_ctrl INTEGER := 0; v_sqlerrm VARCHAR2(500); v_request_status VARCHAR2(500); v_id_action NUMBER; log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.update_dep_control'; BEGIN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'ACTUALIZACION DEL CONTROL pi_id_request, id_control_deploy, pi_id_prc_exec, pi_status: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || pi_id_prc_exec || ', ' || pi_status); ------------------------------------------------------------------ -- Actualiza el registro de control devuelto por Jenkins UPDATE request_exec_deploy ed SET ed.id_deployment_status = pi_status, ed.deployment_status = pkg_deploy_coordinator.step_status_result(ed.id_pattern, ed.id_pattern_step, pi_status), ed.id_dep_proc = decode(pi_status, 0, pi_id_prc_exec, ed.id_dep_proc), ed.control_init_date = ( CASE WHEN pi_status = 0 THEN sysdate WHEN pi_status = -4 THEN sysdate ELSE ed.control_init_date END ), ed.control_end_date = ( CASE WHEN pi_status = 0 THEN NULL WHEN pi_status = -4 THEN NULL ELSE sysdate END ), ed.observation = substr(utl_url.unescape(replace(pi_exec_message, '+', ' '), 'UTF-8'), 1, 4000) WHERE ed.id_request = pi_id_request -- AND nvl(ed.id_deployment_status, 0) = 0 AND ed.id_control_deploy = pi_id_control_deploy; IF SQL%rowcount >= 1 THEN po_result := 1; COMMIT; -- Actualiza los registros que posean el control como padre UPDATE request_exec_deploy ed SET ed.id_deployment_status = pi_status, ed.deployment_status = pkg_deploy_coordinator.step_status_result(ed.id_pattern, ed.id_pattern_step, pi_status), ed.id_dep_proc = decode(pi_status, 0, pi_id_prc_exec, ed.id_dep_proc), ed.control_init_date = decode(pi_status, 0, sysdate, ed.control_init_date), ed.control_end_date = decode(pi_status, 0, NULL, sysdate) WHERE ed.id_request = pi_id_request AND ed.id_parent_ctrl_deploy = pi_id_control_deploy; -- Si encontro registros adicionales que actualizar IF SQL%rowcount >= 1 THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- debug pi_log_message => 'ACTUALIZACION DEL GRUPO CONTROL pi_id_request, id_parent_ctrl_deploy, pi_id_prc_exec, pi_status: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || pi_id_prc_exec || ', ' || pi_status); ------------------------------------------------------------------ COMMIT; END IF; ELSE po_result := 0; END IF; -- Actualiza el estado de la Solicitud UPDATE deployment_request r SET r.request_status = (fnc_request_status(pi_id_control_deploy)) WHERE r.id_request = pi_id_request; COMMIT; log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Actualización tabla deployment_request - antes de enviar el mail - Estado: ' || fnc_request_status(pi_id_control_deploy)); ----Envia notificacion de mail de la actualizacion del estado de la solicitud pkg_standard_executors.prc_send_deploy_status_message( pi_id_request => pi_id_request, pi_id_control_deploy => pi_id_control_deploy, pi_observation => pi_exec_message, pi_request_flow_message => 'REQUEST_DEPLOYMENT',--'REQUEST_WORKFLOW' / REQUEST_DEPLOYMENT */ pi_id_prc_exec => pi_id_prc_exec); EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.update_dep_control - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - update_dep_control: ' || sqlerrm); ------------------------------------------------------------------ END update_dep_control; /*--------------- DPCP8-------------------*/ PROCEDURE execution_status( pi_id_request IN NUMBER, pi_environment_alias IN VARCHAR2, pi_id_det_req IN NUMBER, pi_id_prc_exec IN VARCHAR2, pi_status IN NUMBER, pi_exec_message IN VARCHAR2, pi_exec_date IN VARCHAR2 ) AS v_warning VARCHAR2(1000); v_result INTEGER := 0; v_enviroment_alias VARCHAR2(100); v_id_executor INTEGER := 0; v_prg_executor VARCHAR2(100); v_minutes_timeout INTEGER := 0; v_seconds_timeout INTEGER := 0; v_queue_timeout INTEGER := pkg_sicd_commons.get_parameter_value(param_name => 'JENKINS_QUEUE_ADD_TIMEOUT'); v_sqlerrm VARCHAR2(500); log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.execution_status'; BEGIN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- INFO pi_log_message => 'REPORTE DE ESTADO pi_id_request, pi_id_det_req, pi_id_prc_exec, pi_status, pi_exec_message: ' || pi_id_request || ', ' || pi_id_det_req || ', ' || pi_id_prc_exec || ', ' || pi_status || ', ' || pi_exec_message); ------------------------------------------------------------------ -- Recibe la comunicacion del Jenkins con el estado update_dep_control(pi_id_request => pi_id_request, pi_id_control_deploy => pi_id_det_req, pi_id_prc_exec => pi_id_prc_exec, pi_status => pi_status, pi_exec_message => pi_exec_message, po_result => v_result -- 0: Sin actualizaciones , 1: Con actualizaciones ); --- log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Salió de procedimiento update_dep_control - v_result: ' || v_result); IF pi_status = 0 AND v_result = 1 THEN -- Inicio de Procesamiento ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'JOB TIMEOUT DE COLA pi_id_request, pi_id_det_req, pi_id_prc_exec, pi_status: ' || pi_id_request || ', ' || pi_id_det_req || ', ' || pi_id_prc_exec || ', ' || pi_status); ------------------------------------------------------------------ SELECT e.enviroment_alias, red.id_executor, ( SELECT executor_program FROM executor exe WHERE exe.id_executor = red.id_executor ) AS executor_program, ps.minutes_timeout, ps.seconds_timeout INTO v_enviroment_alias, v_id_executor, v_prg_executor, v_minutes_timeout, v_seconds_timeout FROM request_exec_deploy red, deployment_pattern_step ps, enviroment e WHERE ps.id_pattern = red.id_pattern AND e.id_enviroment = red.id_enviroment AND red.id_pattern_step = ps.id_pattern_step AND e.enviroment_alias = pi_environment_alias AND red.id_control_deploy = pi_id_det_req; -- Se genera un JOB para el control de TIMEOUT configurado por para la cola de procesamiento ---***** HAY QUE CAMBIAR EL PROGRAMA, YA QUE ES UNO DESTINADO A LA NOTIFICACION ****--- /*sys.dbms_scheduler.create_job( job_name => pi_id_det_req || '_' || v_prg_executor || '_PROCCESSING_TIMEOUT', job_type => 'PLSQL_BLOCK', start_date => sysdate +(v_minutes_timeout / 1440) +(v_seconds_timeout / 86400), repeat_interval => NULL, end_date => sysdate +(v_minutes_timeout / 1440) +((v_seconds_timeout + v_queue_timeout) / 86400), auto_drop => true, job_action => ' BEGIN pkg_deploy_coordinator.execution_status( pi_id_request => ' || pi_id_request || ', pi_environment_alias => ' || v_enviroment_alias || ', pi_id_det_req => ' || pi_id_det_req || ', pi_id_prc_exec => ' || pi_id_prc_exec || ', pi_status => - 3, pi_exec_message => NULL, pi_exec_date => sydate ); END;', comments => NULL );*/ END IF; --- IF v_result = 1 THEN --- /* ------------------------------------------------------------------ log_collector( pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'SIGUIENTE CICLO DE EJECUCION pi_id_request, pi_id_det_req, pi_id_prc_exec, pi_status: ' || pi_id_request || ', ' || pi_id_det_req || ', ' || pi_id_prc_exec || ', ' || pi_status ); ------------------------------------------------------------------*/ pkg_deploy_coordinator.automatic_dep_control(pi_id_request => pi_id_request, pi_id_control_deploy => pi_id_det_req, pi_id_status => pi_status, pi_exec_message => NULL, pi_exec_date => sysdate, po_warning => v_warning); log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Luego de llamar al procedimiento automatic_dep_control - ' || v_warning); --- INCLUIR AUDITORIA QUE CONTROLE QUE UN PROGRAMA HAYA INTENTADO ACTUALIZAR EL ESTATUS --- Y EL REGISTRO YA SE ENCUENTRE CON UN ESTATUS PREVIO --- PUEDE PASAR SOBRE TODO EN LOS TIMEOUT END IF; EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.execution_status - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - execution_status: ' || sqlerrm); ------------------------------------------------------------------ END; /*--------------- DPCP9-------------------*/ PROCEDURE delete_references( pi_id_request IN NUMBER, pi_id_reference IN VARCHAR2, po_warning OUT NOCOPY VARCHAR2 ) AS log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.delete_references'; BEGIN IF pi_id_reference IS NOT NULL THEN DELETE FROM tmp_reference_list_add WHERE id_reference = pi_id_reference AND id_request = pi_id_request; po_warning := pkg_sicd_commons.f_system_message(pi_id_message => 1, pi_message_class => 'DPCP9', pi_return_type => 1); END IF; EXCEPTION WHEN no_data_found THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR: ' || sqlerrm); ------------------------------------------------------------------ END; /*--------------- DPCP10-------------------*/ PROCEDURE manage_references( pi_id_request IN NUMBER, pi_id_reference IN VARCHAR2, pi_id_reference_des IN VARCHAR2, po_warning OUT NOCOPY VARCHAR2 ) AS v_reference NUMBER; log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.manage_references'; BEGIN IF pi_id_reference IS NOT NULL THEN SELECT COUNT(1) INTO v_reference FROM tmp_reference_list_add t WHERE t.id_request = pi_id_request AND t.id_reference = pi_id_reference; IF v_reference = 1 THEN po_warning := pkg_sicd_commons.f_system_message(pi_id_message => 1, pi_message_class => 'DPCP10', pi_return_type => 1); ELSE IF v_reference = 0 THEN INSERT INTO tmp_reference_list_add ( id_reference, id_request, id_ref_source, reference_description ) VALUES ( pi_id_reference, pi_id_request, 1, pi_id_reference_des ); po_warning := pkg_sicd_commons.f_system_message(pi_id_message => 2, pi_message_class => 'DPCP10', pi_return_type => 1); END IF; END IF; END IF; EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.manage_references - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - manage_references: ' || sqlerrm); ------------------------------------------------------------------ END; /*--------------- DPCP11-------------------*/ PROCEDURE manage_dep_queue( pi_id_request IN NUMBER ) AS v_start_date DATE; v_id_queue INTEGER := 0; v_id_schedule INTEGER := 0; v_id_schedule_detail INTEGER := 0; v_job_name VARCHAR2(100); v_deploy_date DATE; log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.manage_dep_queue'; BEGIN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'INICIO - manage_dep_queue: ' || sqlerrm); ------------------------------------------------------------------ --- FOR sch IN ( SELECT aj.next_run_date, sd.schedule_job_name, s.id_schedule, sd.id_schedule_detail FROM all_scheduler_jobs aj, deployment_schedule_detail sd, deployment_schedule s, deployment_request r WHERE aj.job_name = sd.schedule_job_name AND sd.id_schedule = s.id_schedule AND s.id_deployment_type = r.id_deployment_type AND s.id_enviroment_type = r.id_enviroment_type AND r.id_request = pi_id_request AND aj.next_run_date > sysdate ORDER BY aj.start_date ) LOOP v_start_date := sch.next_run_date; v_job_name := sch.schedule_job_name; v_id_schedule := sch.id_schedule; v_id_schedule_detail := sch.id_schedule_detail; EXIT; END LOOP; -------------------------------------------------- -- PROVISIONAL: EN ESPERA SE EJECUCION CON JOBS -- -------------------------------------------------- /* BEGIN SELECT next_run_date, job_name INTO v_start_date, v_job_name FROM user_scheduler_jobs aj WHERE next_run_date > sysdate AND rownum = 1 ORDER BY next_run_date; SELECT ID_SCHEDULE, ID_SCHEDULE_DETAIL INTO v_id_schedule, v_id_schedule_detail FROM DEPLOYMENT_SCHEDULE_DETAIL WHERE SCHEDULE_JOB_NAME = v_job_name; EXCEPTION WHEN NO_DATA_FOUND THEN v_start_date := sysdate; v_job_name := 'J0000001'; v_id_schedule := 1; v_id_schedule_detail := 1; END;*/ -------------------------------------------------- -- PROVISIONAL: EN ESPERA SE EJECUCION CON JOBS -- -------------------------------------------------- v_id_queue := s_req_queue_id.nextval; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'INSERT - manage_dep_queue: ' || v_id_queue); ------------------------------------------------------------------ --- INSERT INTO deployment_request_queue ( id_queue, id_request, queue_date, queue_order, id_parent_queue, id_schedule, id_schedule_detail, deploy_date, queue_alias, job_name ) VALUES ( v_id_queue, pi_id_request, v_start_date, nvl(( SELECT MAX(q.queue_order) FROM deployment_request_queue q WHERE q.id_schedule = v_id_schedule AND q.id_schedule_detail = v_id_schedule_detail AND q.status_queue = 0 AND q.queue_date >= to_date(sysdate,'DD/MM/YYYY') ), 0) + 1, NULL, v_id_schedule, v_id_schedule_detail, NULL, to_char(v_start_date, 'YYYYMMDDHHMISS') || 'SC' || v_id_schedule_detail, v_job_name ); --- COMMIT; -- END IF; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'FIN - manage_dep_queue: ' || sqlerrm); ------------------------------------------------------------------ EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.manage_dep_queue - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - manage_dep_queue: ' || sqlerrm); ------------------------------------------------------------------ END; /*--------------- DPCP12-------------------*/ PROCEDURE first_dep_queue( pi_job_name IN VARCHAR2 ) AS r_red request_exec_deploy%rowtype; r_drq deployment_request_queue%rowtype; v_id_automatic_user NUMBER; log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.first_dep_queue'; BEGIN SELECT MIN(id_user) INTO v_id_automatic_user FROM USER_ROLES WHERE ID_ROLE = '1'; -- Recorre todas las colas, seleccionando unicamente su primer registro FOR r_drq IN ( SELECT q.* FROM deployment_request_queue q WHERE trunc(q.queue_date) = trunc(sysdate) AND q.job_name = pi_job_name AND q.queue_order = 1 AND q.status_queue = 0 ) LOOP -- Incluye el primer registro de Control para cada cola e inicia el ciclo pkg_deploy_coordinator.first_dep_control(pi_id_request => r_drq.id_request, pi_id_user => v_id_automatic_user, pi_queue_alias => r_drq.queue_alias, n_red => r_red); -- Actualiza el primer registro de la cola UPDATE deployment_request_queue q SET q.deploy_date = sysdate, q.status_queue = 1 -- en proceso WHERE q.id_queue = r_drq.id_queue; COMMIT; END LOOP; EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.first_dep_queue - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - first_dep_queue: ' || sqlerrm); ------------------------------------------------------------------ END; /*--------------- DPCP13-------------------*/ PROCEDURE next_dep_queue( pi_id_request IN NUMBER DEFAULT 0, pi_queue_alias IN VARCHAR2 ) AS r_red request_exec_deploy%rowtype; r_drq deployment_request_queue%rowtype; v_last_id_queue NUMBER := 0; v_next_id_queue NUMBER := 0; v_last_queue_order NUMBER := 0; v_next_id_request NUMBER := 0; v_id_automatic_user NUMBER; log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.next_dep_queue'; BEGIN SELECT MIN(id_user) INTO v_id_automatic_user FROM USER_ROLES WHERE ID_ROLE = '1'; --- Busca el registro de la cola ejecutada SELECT q.id_queue, q.queue_order INTO v_last_id_queue, v_last_queue_order FROM deployment_request_queue q WHERE q.id_request = pi_id_request AND q.queue_alias = pi_queue_alias; -- Actualiza el estado de ejecucion UPDATE deployment_request_queue q SET q.status_queue = 2 -- terminado WHERE q.id_queue = v_last_id_queue; COMMIT; --- busca la proxima ejecucion en secuencia SELECT q.id_queue, q.id_request INTO v_next_id_queue, v_next_id_request FROM deployment_request_queue q WHERE q.queue_order = v_last_queue_order +1 AND q.status_queue = 0 AND q.queue_alias = pi_queue_alias; pkg_deploy_coordinator.first_dep_control( pi_id_request => v_next_id_request, pi_id_user => v_id_automatic_user, pi_queue_alias => pi_queue_alias, n_red => r_red ); -- Actualiza el estado de ejecucion UPDATE deployment_request_queue q SET q.deploy_date = sysdate, q.status_queue = 1 -- en proceso WHERE q.id_queue = v_next_id_queue; COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN OTHERS THEN apex_debug.error('pkg_deploy_coordinator.next_dep_queue - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ERROR - next_dep_queue: ' || sqlerrm); ------------------------------------------------------------------ END; /*--------------- DPCP14-------------------*/ PROCEDURE manage_dep_job( pi_job_n_name IN VARCHAR2, pi_job_o_name IN VARCHAR2, pi_job_status IN NUMBER, pi_freq IN NUMBER, pi_start_date IN DATE ) AS v_job_freq VARCHAR2(100); v_end_date DATE := NULL; v_auto_drop BOOLEAN := false; v_day VARCHAR2(50); v_hour VARCHAR2(50); v_minute VARCHAR2(50); v_second VARCHAR2(50); v_boolean_sts BOOLEAN := false; log_program_name VARCHAR2(100) := 'pkg_deploy_coordinator.manage_dep_job'; BEGIN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- INFO pi_log_message => 'INICIO '); ------------------------------------------------------------------ v_job_freq := pkg_deploy_coordinator.schedule_fequency_job(pi_schedule_fequency => pi_freq, pi_schedule_init_date => pi_start_date); --- IF pi_job_status = 1 THEN v_boolean_sts := true; ELSE v_boolean_sts := false; END IF; /* -- Al crear el trabajo programado -- */ IF pi_job_o_name IS NULL THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'NUEVO TRABAJO PROGRAMADO ' || pi_job_n_name); ------------------------------------------------------------------ /* dbms_scheduler.create_job(job_name => pi_job_n_name, job_type => 'PLSQL_BLOCK', job_action => 'BEGIN pkg_deploy_coordinator.first_dep_queue(pi_job_name => ' || pi_job_n_name || '); END;', number_of_arguments => 0, start_date => pi_start_date, repeat_interval => v_job_freq, end_date => v_end_date, enabled => v_boolean_sts, auto_drop => v_auto_drop, comments => NULL); */ /* -- Al Cambiar la Frecuencia y Datos del Trabajo Programado -- */ ELSE ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'CAMBIO DEL TRABAJO PROGRAMADO ' || pi_job_n_name || ' POR ' || pi_job_o_name); ------------------------------------------------------------------ UPDATE deployment_request_queue drq SET drq.job_name = pi_job_n_name, drq.deploy_date = pi_start_date WHERE drq.job_name = pi_job_o_name AND drq.deploy_date >= sysdate; BEGIN NULL;--dbms_scheduler.drop_job(pi_job_o_name, false); EXCEPTION WHEN OTHERS THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- INFO pi_log_message => 'ERROR ELIMINADNO EL JOB ' || sqlerrm || ' EN EL JOB ' || pi_job_n_name); ------------------------------------------------------------------ END; /* dbms_scheduler.create_job(job_name => pi_job_n_name, job_type => 'PLSQL_BLOCK', job_action => 'BEGIN pkg_deploy_coordinator.first_dep_queue(pi_job_name => ' || pi_job_n_name || '); END;', number_of_arguments => 0, start_date => pi_start_date, repeat_interval => v_job_freq, end_date => v_end_date, enabled => v_boolean_sts, auto_drop => v_auto_drop, comments => NULL); */ END IF; --- EXCEPTION WHEN OTHERS THEN ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- INFO pi_log_message => 'ERROR NO MENAJDO ' || sqlerrm || ' EN EL JOB ' || pi_job_n_name); ------------------------------------------------------------------ END manage_dep_job; ----------------------------------------------------------------------- /*---------------DPCP15--------------------*/ PROCEDURE manage_req_object_order( pi_id_dep_req_object IN NUMBER, pi_id_req_hgroup IN VARCHAR2 ) AS v_aux NUMBER := 0; BEGIN DELETE FROM deployment_req_object WHERE id_dep_req_object = pi_id_dep_req_object; COMMIT; FOR i IN ( SELECT * FROM deployment_req_object WHERE id_req_hgroup = pi_id_req_hgroup --:P300_ID ORDER BY object_order ) LOOP v_aux := v_aux + 1; UPDATE deployment_req_object SET object_order = v_aux WHERE id_dep_req_object = i.id_dep_req_object; END LOOP; END; ----------------------------------------------------------------------- /*---------------DPCP16--------------------*/ PROCEDURE manage_req_hgroup_order( pi_id_request IN NUMBER, pi_id_req_hgroup_level IN VARCHAR2, pi_id_parent_req_hgroup IN VARCHAR2 ) AS i NUMBER := 0; BEGIN FOR hg_ord IN ( SELECT id_req_hgroup FROM deployment_req_hgroup hg WHERE hg.id_request = pi_id_request AND hg.id_req_hgroup_level = pi_id_req_hgroup_level AND hg.id_parent_req_hgroup = pi_id_parent_req_hgroup ORDER BY req_hgroup_order ) LOOP i := i + 1; UPDATE deployment_req_hgroup SET req_hgroup_order = i WHERE id_req_hgroup = hg_ord.id_req_hgroup; END LOOP; COMMIT; END manage_req_hgroup_order; /*---------------DPCP17--------------------*/ PROCEDURE p_genera_job( pi_job_nombre IN VARCHAR2, pi_job_accion IN VARCHAR2, pi_job_tipo_frecuencia IN NUMBER, pi_job_fecha_inicio IN TIMESTAMP, po_estado OUT NUMBER ) AS PRAGMA autonomous_transaction; v_estado NUMBER; v_job_frecuencia NUMBER := 1; v_intervalo_repeticion VARCHAR2(500); BEGIN -------------------------------------------- -- Se calcula el Intervalo de Repeticion --- CASE WHEN pi_job_tipo_frecuencia = 1 THEN v_intervalo_repeticion := 'FREQ=WEEKLY;BYDAY=MON,TUE,WED,THU,FRI;'; WHEN pi_job_tipo_frecuencia = 2 THEN v_intervalo_repeticion := 'FREQ=DAILY;'; WHEN pi_job_tipo_frecuencia = 3 THEN v_intervalo_repeticion := 'FREQ=WEEKLY;'; WHEN pi_job_tipo_frecuencia = 4 THEN v_intervalo_repeticion := 'FREQ=DAILY;INTERVAL=30;'; WHEN pi_job_tipo_frecuencia = 5 THEN v_intervalo_repeticion := 'FREQ=MONTHLY;bymonthday=1;'; WHEN pi_job_tipo_frecuencia = 6 THEN v_intervalo_repeticion := 'FREQ=MONTHLY;bymonthday=-1;'; ELSE v_intervalo_repeticion := ''; END CASE; -- Se calcula el Intervalo de Repeticion --- -------------------------------------------- ---------------------------------------------- -- CREACION DEL JOB CON LOS DATOS INDICADOS -- dbms_scheduler.create_job(job_name => pi_job_nombre, job_action => pi_job_accion, start_date => pi_job_fecha_inicio, job_type => 'plsql_block', repeat_interval => v_intervalo_repeticion, enabled => false); -- CREACION DEL JOB CON LOS DATOS INDICADOS -- ---------------------------------------------- dbms_scheduler.enable(pi_job_nombre); END; /*---------------DPCP18--------------------*/ PROCEDURE p_elimina_job( pi_nombre_job IN OUT CLOB ) AS PRAGMA autonomous_transaction; BEGIN -- Desactiva el JOB -- dbms_scheduler.disable(name => pi_nombre_job); -- Elimina el JOB existente -- dbms_scheduler.drop_job(job_name => pi_nombre_job); END; ----------------------------------------------------------------------- END pkg_deploy_coordinator; /