-------------------------------------------------------- -- DDL for Package Body PKG_STANDARD_EXECUTORS -------------------------------------------------------- CREATE OR REPLACE EDITIONABLE PACKAGE BODY "ENVX_OPER"."PKG_STANDARD_EXECUTORS" IS ------------------------------------------------------------- FUNCTION fnc_sicd_var ( pi_id_control_deploy IN INTEGER ) RETURN CLOB AS v_variables CLOB; BEGIN -- Obtiene el registro de control ejecutado para una solicitud /* SELECT '"varname":"ID_REQUEST","value":' || rd.id_request || ',' || --------------------------------------------------------------- ID_REQUEST CHR(13) || '"varname":"ID_REQUEST_DETAIL","value":' || rd.id_dep_req_object || ',' || --------------------------------------------------------------- ID_REQUEST_DETAIL CHR(13) || '"varname":"ID_DEPLOYING_TECH","value":' || rd.id_deploying_tech || ',' || --------------------------------------------------------------- ID_DEPLOYING_TECH CHR(13) || '"varname":"ID_ENVIROMENT_GROUP","value":' || rd.id_env_hgroup || ',' || --------------------------------------------------------------- ID_ENVIROMENT_GROUP CHR(13) || '"varname":"ID_ENVIROMENT","value":' || rd.id_enviroment || ',' || --------------------------------------------------------------- ID_ENVIROMENT CHR(13) || '"varname":"ID_OBJECT_GROUP","value":' || rd.id_obj_hgroup || ',' || --------------------------------------------------------------- ID_OBJECT_GROUP CHR(13) || '"varname":"ID_OBJECT_REPO","value":"' || rd.id_object_repo || '"' --------------------------------------------------------------- ID_OBJECT_REPO INTO v_variables FROM request_exec_deploy rd WHERE rd.id_control_deploy = pi_id_control_deploy; v_variables := '{ ' || v_variables || '}'; RETURN v_variables;*/ RETURN NULL; END; ------------- FUNCTIONS ------------------ /*--------------- FNC01-------------------*/ FUNCTION fnc_var_value ( pi_var_name VARCHAR2, pi_request NUMBER, pi_id_control_deploy NUMBER ) RETURN VARCHAR2 AS v_value VARCHAR2(100); log_program_name VARCHAR2(100) := 'pkg_standard_executors.fnc_var_value'; BEGIN SELECT ( CASE pi_var_name WHEN 'ID_REQUEST' THEN to_char(rd.id_request) WHEN 'ID_REQUEST_DETAIL' THEN to_char(rd.id_control_deploy) WHEN 'ID_DEPLOYING_TECH' THEN to_char(rd.id_deploying_tech) WHEN 'ID_ENVIROMENT_GROUP' THEN to_char(rd.id_env_hgroup) WHEN 'ENVIROMENT_ALIAS' THEN ( SELECT e.enviroment_alias FROM enviroment e WHERE e.id_enviroment = rd.id_enviroment ) WHEN 'ENVIROMENT_CLASS' THEN ( SELECT to_char(et.enviroment_type_class) FROM enviroment e, enviroment_type et WHERE e.id_enviroment = rd.id_enviroment AND e.id_enviroment_type = et.id_enviroment_type ) WHEN 'PARENT_ENVIROMENT_ALIAS' THEN ( SELECT pe.enviroment_alias FROM enviroment e, enviroment pe WHERE e.id_parent_enviroment = pe.id_enviroment AND e.id_enviroment = rd.id_enviroment ) WHEN 'ID_OBJECT_GROUP' THEN to_char(rd.id_obj_hgroup) WHEN 'OBJECT_PATH' THEN to_char(rd.object_source_path) WHEN 'ID_OBJECT' THEN to_char(rd.id_object_repo) WHEN 'OBJECT_NAME' THEN to_char(rd.object_name) WHEN 'OBJECT_VERSION' THEN to_char(rd.object_version) WHEN 'BUILD_TIMEOUT' THEN nvl(( SELECT to_char((nvl(ds.minutes_timeout, 0) * 60) + nvl(ds.seconds_timeout, 0)) FROM deployment_pattern_step ds WHERE ds.id_pattern_step = rd.id_pattern_step AND ds.id_pattern = rd.id_pattern ), '0') ELSE NULL END ) AS val INTO v_value FROM request_exec_deploy rd WHERE rd.id_control_deploy = pi_id_control_deploy; apex_debug.info('pkg_standard_executors.fnc_var_value - v_value: %s', v_value); RETURN v_value; EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.fnc_var_value - %s', sqlerrm); log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); RETURN NULL; END; /*--------------- FNC02-------------------*/ FUNCTION fnc_soap_call ( pi_body IN CLOB, pi_soap_header IN VARCHAR2, pi_soap_action IN VARCHAR2, pi_target_url IN VARCHAR2, pi_http_version IN VARCHAR2, pi_http_content_type IN VARCHAR2, po_response_code OUT VARCHAR2, po_error_message OUT VARCHAR2 ) RETURN XMLTYPE AS v_soap_envelope VARCHAR2(4000) := ' **pi_soap_header** **pi_body** '; v_soap_request VARCHAR2(32767); v_soap_response VARCHAR2(32767); v_clob CLOB; v_request_xmltype XMLTYPE; v_response_xmltype XMLTYPE; v_http_req utl_http.req; v_http_resp utl_http.resp; log_program_name VARCHAR2(100) := 'pkg_standard_executors.fnc_soap_call'; BEGIN ------------------------------------------------------------------ po_response_code := 'OK'; v_soap_envelope := replace(v_soap_envelope, '**pi_soap_header**', pi_soap_header); v_soap_request := replace(v_soap_envelope, '**pi_body**', pi_body); apex_debug.info('pkg_standard_executors.fnc_soap_call - v_soap_request: %s', v_soap_request); --Configuramos la invocacion --utl_http.set_transfer_timeout(60); dbms_output.put_line('URL = ' || pi_target_url); v_http_req := utl_http.begin_request(pi_target_url, 'POST', pi_http_version); utl_http.set_header(v_http_req, 'Content-Type', pi_http_content_type); utl_http.set_header(v_http_req, 'Content-Length', length(v_soap_request)); utl_http.set_header(v_http_req, 'SOAPAction', pi_soap_action); utl_http.write_text(v_http_req, v_soap_request); utl_http.set_response_error_check(false); --Ver como hacer ------------------------------------------------------------------ /* log_collector( pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'VARIABLES: - v_http_req: SOLICITUD - fecha: '||sysdate );*/ ------------------------------------------------------------------ --Invocamos el WS v_http_resp := utl_http.get_response(v_http_req); --Leemos la respuesta dbms_lob.createtemporary(v_clob, false); apex_debug.info('pkg_standard_executors.fnc_soap_call - v_soap_response: %s', v_soap_response); BEGIN LOOP utl_http.read_text(v_http_resp, v_soap_response, 32766); dbms_lob.writeappend(v_clob, length(v_soap_response), v_soap_response); END LOOP; -- Cerramos la comunicacion request/response utl_http.end_response(v_http_resp); EXCEPTION WHEN utl_http.end_of_body THEN apex_debug.error('pkg_standard_executors.fnc_soap_call - %s', sqlerrm); utl_http.end_response(v_http_resp); END; --Creamos el XML de respuesta (con el envelope retornado) v_response_xmltype := xmltype.createxml(v_clob); dbms_lob.freetemporary(v_clob); --Devolvemos el XML RETURN v_response_xmltype; EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.fnc_soap_call - %s', sqlerrm); utl_http.end_response(v_http_resp); po_response_code := 'ERROR'; po_error_message := substr(sqlerrm, 1, 4000); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); ------------------------------------------------------------------ END fnc_soap_call; /*--------------- FNC03-------------------*/ FUNCTION fnc_send_profile_email ( pi_id_sys_profile NUMBER ) RETURN VARCHAR2 AS v_mail VARCHAR2(4000); log_program_name VARCHAR2(100) := 'pkg_standard_executors.fnc_send_profile_email'; BEGIN -- consulto los mails asociados a dicho perfil -- FOR i IN ( SELECT user_mail FROM user_roles WHERE id_sys_profile = pi_id_sys_profile ) LOOP v_mail := v_mail || ',' || i.user_mail; END LOOP; -- averiguo si la consulta trajo resultados -- IF length4(v_mail) > 0 THEN -- remuevo la primer ',' en caso de que haya resultado -- v_mail := substr(v_mail, 2); apex_debug.info('pkg_standard_executors.fnc_send_profile_email v_mail: %s', v_mail); ELSE -- si no hay ningun perfil con mail, debo traer todos los mails hijos de ese perfil -- FOR i IN ( SELECT u.user_mail, u.id_sys_profile FROM user_roles u WHERE u.id_sys_profile IN ( SELECT p.id_sys_profile FROM system_profile p START WITH id_sup_sys_profile = pi_id_sys_profile CONNECT BY PRIOR id_sys_profile = id_sup_sys_profile ) ) LOOP v_mail := v_mail || ',' || i.user_mail; END LOOP; v_mail := substr(v_mail, 2); apex_debug.info('pkg_standard_executors.fnc_send_profile_email v_mails: %s', v_mail); END IF; RETURN v_mail; EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.fnc_send_profile_email - %s', sqlerrm); log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); RETURN NULL; END; /*--------------- FNC04-------------------*/ FUNCTION fnc_get_status_request ( pi_id_request NUMBER ) RETURN BOOLEAN AS v_status_request VARCHAR2(50); log_program_name VARCHAR2(100) := 'pkg_standard_executors.fnc_get_status_request'; BEGIN SELECT level_status INTO v_status_request FROM hierarchical_request_vew WHERE group_id = pi_id_request AND parent_id IS NULL; IF v_status_request != 'Creada' THEN RETURN false; ELSE RETURN true; END IF; EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.fnc_get_status_request - %s', sqlerrm); log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); RETURN false; END; /*--------------- FNC05-------------------*/ FUNCTION fnc_get_jenkins_node ( pi_environment_class NUMBER ) RETURN VARCHAR2 AS BEGIN IF ( pi_environment_class = 1 ) THEN RETURN 'PRIMARY'; ELSE RETURN 'SECONDARY'; END IF; END; ------------------------------------------ ------------ PROCEDURES ------------------ /*--------------- SEP1-------------------*/ PROCEDURE prc_dynamic_param ( pi_id_request IN NUMBER, pi_id_control_deploy IN NUMBER, pi_id_executor IN NUMBER, po_exec_program OUT CLOB, po_parameters_rep IN OUT CLOB ) AS v_prg VARCHAR2(1000); v_exec VARCHAR2(4000); v_execution VARCHAR2(4000); v_aux_param CLOB; log_program_name VARCHAR2(100) := 'pkg_standard_executors.prc_dynamic_param'; BEGIN FOR r IN ( SELECT upper(ep.parameter) AS sys_variable, a.argument_name AS prc_parameter, ep.default_value, a.position, a.data_type, ep.param_source_val AS param_type, ( CASE executor_type WHEN 0 THEN NULL WHEN 1 THEN NULL WHEN 2 THEN substr(e.executor_program, 1, instr(e.executor_program, '.') - 1) ELSE substr(e.executor_program, 1, instr(e.executor_program, '.') - 1) END ) AS pakage_name_exec, ( CASE executor_type WHEN 0 THEN NULL WHEN 1 THEN NULL WHEN 2 THEN substr(e.executor_program, instr(e.executor_program, '.') + 1) ELSE substr(e.executor_program, instr(e.executor_program, '.') + 1) END ) AS program_name_exec, e.executor_program FROM executor_parameter ep, user_arguments a, executor e WHERE ep.id_executor = pi_id_executor AND ep.id_executor = e.id_executor AND a.position = ep.order_number AND a.package_name = upper(( CASE executor_type WHEN 0 THEN NULL WHEN 1 THEN NULL WHEN 2 THEN substr(e.executor_program, 1, instr(e.executor_program, '.') - 1) ELSE substr(e.executor_program, 1, instr(e.executor_program, '.') - 1) END )) AND a.object_name = upper(( CASE executor_type WHEN 0 THEN NULL WHEN 1 THEN NULL WHEN 2 THEN substr(e.executor_program, instr(e.executor_program, '.') + 1) ELSE substr(e.executor_program, instr(e.executor_program, '.') + 1) END )) ORDER BY a.position ) LOOP CASE --- Reemplaza los valores de las constantes WHEN r.param_type = 1 THEN v_exec := v_exec || ( CASE WHEN r.position = 1 THEN r.executor_program || '(' ELSE ',' END ) || r.prc_parameter || ' => ' || ( CASE WHEN r.data_type IN ( 'NUMBER', 'INTEGER' ) THEN r.default_value ELSE '''' || r.default_value || '''' END ); WHEN r.param_type = 2 THEN --- Reemplaza los valores con las variables disponibles v_exec := v_exec || ( CASE WHEN r.position = 1 THEN r.executor_program || '(' ELSE ',' END ) || r.prc_parameter || ' => ' || ( CASE WHEN r.data_type IN ( 'NUMBER', 'INTEGER' ) THEN fnc_var_value( pi_var_name => r.sys_variable, pi_request => pi_id_request, pi_id_control_deploy => pi_id_control_deploy ) ELSE '''' || fnc_var_value( pi_var_name => r.sys_variable, pi_request => pi_id_request, pi_id_control_deploy => pi_id_control_deploy ) || '''' END ); END CASE; END LOOP; v_exec := v_exec || ');'; po_exec_program := v_exec; EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.prc_dynamic_param - %s', sqlerrm); log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); END; /*--------------- SEP2-------------------*/ PROCEDURE prc_jenkins_check_queue_status ( pi_id_request INTEGER, pi_id_req_det INTEGER, pi_id_prc_queue VARCHAR2, pi_category_action VARCHAR2, pi_environment_alias VARCHAR2, pi_enviroment_class NUMBER ) AS PRAGMA autonomous_transaction; v_queue_timeout INTEGER := pkg_sicd_commons.get_parameter_value(param_name => 'JENKINS_QUEUE_ADD_TIMEOUT'); name_job VARCHAR2(100); log_program_name VARCHAR2(100) := 'pkg_standard_executors.prc_jenkins_check_queue_status'; BEGIN --- apex_debug.warn('pkg_standard_executors.prc_jenkins_check_queue_status - pi_id_prc_queue: %s', pi_id_prc_queue); apex_debug.warn('pkg_standard_executors.prc_jenkins_check_queue_status - pi_id_req_det: %s', pi_id_req_det); apex_debug.warn('pkg_standard_executors.prc_jenkins_check_queue_status - pi_id_request: %s', pi_id_request); UPDATE request_exec_deploy dc SET dc.id_prc_queue = pi_id_prc_queue WHERE dc.id_control_deploy = pi_id_req_det AND dc.id_request = pi_id_request; COMMIT; log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'despues del update - ' || 'valor de timeout' ||v_queue_timeout); -- HABILITA EL JOB DE TIMEOUT PARA LA COLA IF nvl(v_queue_timeout, 0) > 0 THEN log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Entra dentro de nvl(v_queue_timeout, 0) > 0 '); name_job := '"'||pi_id_req_det || lpad(pi_id_prc_queue, 5, 0) || '_QUEUE_TIMEOUT"'; log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'PKG_STANDARD_EXECUTORS.prc_jenkins_check_build_status(' || pi_id_request || ',' || pi_id_req_det || ',''' || pi_id_prc_queue || ''',' || pi_enviroment_class || ',''' || pi_category_action || ''')'); sys.dbms_scheduler.create_job(job_name => name_job, job_type => 'PLSQL_BLOCK', start_date => sysdate +(v_queue_timeout / 86400), repeat_interval => NULL, end_date => sysdate +((v_queue_timeout + 5) / 86400), auto_drop => true, job_action => 'BEGIN PKG_STANDARD_EXECUTORS.prc_jenkins_check_build_status('||pi_id_request||','||pi_id_req_det||','''||pi_id_prc_queue||''','||pi_enviroment_class||','''||pi_category_action||''','''||pi_environment_alias||'''); END;', comments => NULL); sys.dbms_scheduler.enable(name_job); ELSE --- SI NO POSEE TIEMPO DE ESPERA SOLICITA LA INTERVENCION DEL USUARIO log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'entro en el else del nvl(v_queue_timeout, 0) > 0'); END IF; EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.prc_jenkins_check_queue_status - %s', sqlerrm); log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); END; /*--------------- SEP3-------------------*/ PROCEDURE prc_dynamic_exec ( pi_id_request IN INTEGER, pi_id_control_deploy IN INTEGER, pi_id_executor IN NUMBER ) AS v_prg_executor CLOB; v_execution CLOB; v_aux_param CLOB; v_id_executor NUMBER := 0; v_exec_type NUMBER := 0; v_exec_scope NUMBER := 0; v_enviroment_alias VARCHAR2(100); v_sqlerrm VARCHAR2(500); log_program_name VARCHAR2(100) := 'pkg_standard_executors.prc_dynamic_exec'; BEGIN --- SELECT ps.id_executor, ps.id_step_type, ps.id_scope, ( SELECT e.enviroment_alias FROM enviroment e WHERE e.id_enviroment = red.id_enviroment ) AS env_alias INTO v_id_executor, v_exec_type, v_exec_scope, v_enviroment_alias FROM request_exec_deploy red, deployment_pattern_step ps WHERE red.id_pattern = ps.id_pattern AND red.id_pattern_step = ps.id_pattern_step AND red.id_control_deploy = pi_id_control_deploy; IF v_exec_type = 2 THEN -- REALIZAR LA LLAMADA AL JENKINS --- prc_dynamic_param( pi_id_request => pi_id_request, pi_id_control_deploy => pi_id_control_deploy, pi_id_executor => pi_id_executor, po_exec_program => v_prg_executor, po_parameters_rep => v_aux_param ); --- ------------------------------------------------------------------ log_collector( pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'v_prg_executor: ' || v_prg_executor ); ------------------------------------------------------------------ v_execution := 'BEGIN ' || v_prg_executor || ' EXCEPTION WHEN OTHERS then ------------------------------------------------------------------ log_collector( pi_program_name => ''' || log_program_name || ''', pi_log_level => 2, --- pi_log_message => substr(''Error EXCEPTION WHEN OTHERS - Detalle del error: '' || sqlerrm || '' - Ubicación: '' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); ------------------------------------------------------------------ END;'; --- ------------------------------------------------------------------ log_collector( pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'v_execution: ' || v_execution ); ------------------------------------------------------------------ ------------------------------------------------------------------ log_collector( pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'EJECUCION AUTOMATICA pi_id_request, pi_id_control_deploy, execution: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || v_execution ); ------------------------------------------------------------------ --- EXECUTE IMMEDIATE v_execution; ELSIF v_exec_type = 1 THEN ------------------------------------------------------------------ log_collector( pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'EJECUCION ASISTIDA pi_id_request, pi_id_control_deploy, pi_id_executor: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || pi_id_executor ); ------------------------------------------------------------------ NULL; -- ENVIAR SOLICITUD DE ACCION AL PERFIL RESPONSABLE ELSE ------------------------------------------------------------------ log_collector( pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'EJECUCION MANUAL pi_id_request, pi_id_control_deploy, pi_id_executor: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || pi_id_executor ); ------------------------------------------------------------------ NULL; -- NINGUNA ACCION ADICIONAL END IF; EXCEPTION WHEN no_data_found THEN apex_debug.error('pkg_standard_executors.prc_dynamic_exec - %s', sqlerrm); ------------------------------------------------------------------ log_collector( pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'No_Data_Found - prc_dynamic_exec - pi_id_request, pi_id_control_deploy, pi_id_executor: ' || pi_id_request || ', ' || pi_id_control_deploy || ', ' || pi_id_executor ); ------------------------------------------------------------------ WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.prc_dynamic_exec - %s', sqlerrm); ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); ------------------------------------------------------------------ END; /*--------------- SEP4-------------------*/ PROCEDURE prc_jkins_job_oracle_db ( pi_category_action VARCHAR2, -- BACKUP | CHECKOUT | DEPLOY pi_id_request NUMBER, pi_id_req_det NUMBER, pi_database_alias VARCHAR2, pi_environment_alias VARCHAR2, pi_scm_alias VARCHAR2, pi_repository_path VARCHAR2, pi_object_repository_id VARCHAR2, pi_object_path VARCHAR2, pi_object VARCHAR2, pi_enviroment_class NUMBER, -- 0: NO PRODUCTIVO | 1: PRODUCTIVO pi_build_timeout NUMBER ) AS v_jenkins_node VARCHAR2(50); v_auth_basic VARCHAR2(200); vi_http_headers http_headers_tab := http_headers_tab(); vo_http_headers http_headers_tab := http_headers_tab(); v_jenkins_url VARCHAR2(4000); vo_http_status VARCHAR(20); vo_body CLOB; po_response CLOB; vo_response_code VARCHAR(15); vo_error_message VARCHAR(4000); exc_category_action EXCEPTION; exc_response_code EXCEPTION; log_program_name VARCHAR2(100) := 'pkg_standard_executors.prc_jkins_job_oracle_db'; BEGIN -- Defino el nodo de Jenkins a utilizar v_jenkins_node := fnc_get_jenkins_node(pi_enviroment_class); apex_debug.info('pkg_standard_executors.prc_jkins_job_oracle_db - v_jenkins_node: %s', v_jenkins_node); log_collector( pi_program_name => log_program_name, pi_log_level => 3,--- DEBUG pi_log_message => 'jenkins_node: ' || v_jenkins_node || CHR(13) || 'PLSQL_LINE: ' || $$plsql_line ); -- Busco y armo la URL del Jenkins v_jenkins_url := pkg_sicd_commons.get_parameter_value('JENKINS_' || v_jenkins_node || '_URL') || '/job'; apex_debug.info('pkg_standard_executors.prc_jkins_job_oracle_db - v_jenkins_url: %s', v_jenkins_url); log_collector( pi_program_name => log_program_name, pi_log_level => 3,--- DEBUG pi_log_message => 'jenkins_url: ' || v_jenkins_url || CHR(13) || 'PLSQL_LINE: ' || $$plsql_line ); -- Dependiendo de la acción enviada, invoco al Jenkins con los parámetros correspondientes CASE pi_category_action WHEN 'BACKUP' THEN pkg_sicd_commons.p_rest_call_apim( v_jenkins_url || '/' || 'pipBackupOracleDB' || '/' || 'buildWithParameters' || '?' || 'piIdRequest=' || pi_id_request || '&' || 'piIdDetReq=' || pi_id_req_det || '&' || 'buildTimeout=' || pi_build_timeout || '&' || 'databaseAlias=' || pi_database_alias || '&' || 'environmentAlias=' || pi_environment_alias || '&' || 'objectPath=' || pi_object_path || '&' || 'object=' || substr(pi_object, 1, instr(pi_object, '.', 1) - 1), 'POST', vo_body, vo_http_status, vo_http_headers, po_response, vo_response_code, vo_error_message ); WHEN 'CHECKOUT' THEN pkg_sicd_commons.p_rest_call_apim(v_jenkins_url || '/' || 'pipCheckoutOracleDB' || '/' || 'buildWithParameters' || '?' || 'piIdRequest=' || pi_id_request || '&' || 'piIdDetReq=' || pi_id_req_det || '&' || 'buildTimeout=' || pi_build_timeout || '&' || 'databaseAlias=' || pi_database_alias || '&' || 'environmentAlias=' || pi_environment_alias || '&' || 'scmAlias=' || pi_scm_alias || '&' || 'repositoryPath=' || pi_repository_path || '&' || 'objectRepositoryID=' || pi_object_repository_id || '&' || 'objectPath=' || pi_object_path || '&' || 'object=' || pi_object,--url 'POST', --method vo_body, vo_http_status, vo_http_headers, po_response, vo_response_code, vo_error_message ); dbms_output.put_line('vo_response_code'|| vo_response_code); dbms_output.put_line('vo_error_message'|| vo_error_message); WHEN 'DEPLOY' THEN pkg_sicd_commons.p_rest_call_apim( v_jenkins_url || '/' || 'pipDeployOracleDB' || '/' || 'buildWithParameters' || '?' || 'piIdRequest=' || pi_id_request || '&' || 'piIdDetReq=' || pi_id_req_det || '&' || 'buildTimeout=' || pi_build_timeout || '&' || 'databaseAlias=' || pi_database_alias || '&' || 'environmentAlias=' || pi_environment_alias || '&' || 'objectPath=' || pi_object_path || '&' || 'object=' || pi_object, 'POST', vo_body, vo_http_status, vo_http_headers, po_response, vo_response_code, vo_error_message ); WHEN 'ROLLBACK' THEN ------------------------------------------------------------------ log_collector( pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'ROLLBACK: ' ); ------------------------------------------------------------------ ELSE RAISE exc_category_action; END CASE; log_collector( pi_program_name => log_program_name, pi_log_level => 3,--- DEBUG pi_log_message => 'LOG next -case - Code: ' || vo_response_code || CHR(13) || ' - vo_error_message: ' || vo_error_message || CHR(13) || 'PLSQL_LINE: ' || $$plsql_line ); log_collector( pi_program_name => log_program_name, pi_log_level => 3, --- DEBUG pi_log_message => 'Body : ' || vo_body || CHR(13) || 'PLSQL_LINE: ' || $$plsql_line ); -- Analizo el response_code apex_debug.info('pkg_standard_executors.prc_jkins_job_oracle_db - vo_response_code: %s', vo_response_code); IF ( vo_response_code = 'OK' ) THEN -- Si es OK,invoco al procedimiento de out apex_debug.warn('pkg_standard_executors.prc_jkins_job_oracle_db - pi_id_request: %s', pi_id_request); apex_debug.warn('pkg_standard_executors.prc_jkins_job_oracle_db - pi_id_req_det: %s', pi_id_req_det); prc_jenkins_process_job_out( pi_id_request, pi_id_req_det, pi_category_action, pi_environment_alias, pi_enviroment_class, vo_http_status, vo_http_headers, vo_body ); log_collector( pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Ingreso dentro de response_code: OK' ); ELSE -- Si no es OK log_collector( pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Ingreso dentro de response_code: NO OK - RAISE exc_response_code' ); RAISE exc_response_code; END IF; EXCEPTION WHEN exc_category_action THEN apex_debug.error('pkg_standard_executors.prc_jkins_job_oracle_db (CATEGORY ACTION NO EXISTENTE) - %s', sqlerrm); dbms_output.put_line('ERROR - CATEGORY ACTION NO EXISTENTE: ' || pi_category_action || chr(13) || 'PLSQL_LINE: ' || $$plsql_line); ------------------------------------------------------------------ --Actualizo el estado de la solicitud PKG_DEPLOY_COORDINATOR.execution_status ( PI_ID_REQUEST => PI_ID_REQUEST, PI_ENVIRONMENT_ALIAS => PI_ENVIRONMENT_ALIAS, PI_ID_DET_REQ => pi_id_req_det, PI_ID_PRC_EXEC => NULL, PI_STATUS => -4, PI_EXEC_MESSAGE =>' Error - Category action NO EXISTENTE: '|| pi_category_action, PI_EXEC_DATE => sysdate) ; ------------------------------------------------------------------ log_collector( pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'Error - Category action NO EXISTENTE: ' || pi_category_action || CHR(13) || 'PLSQL_LINE: ' || $$plsql_line ); ------------------------------------------------------------------ WHEN exc_response_code THEN apex_debug.error('pkg_standard_executors.prc_jkins_job_oracle_db (CATEGORY ACTION NO EXISTENTE) - %s', sqlerrm); dbms_output.put_line('ERROR -ERROR - RESPONSE_CODE-JENKINS: NO OK ' || chr(13) || 'PLSQL_LINE: ' || $$plsql_line); -- ------------------------------------------------------------------ --Actualizo el estado de la solicitud PKG_DEPLOY_COORDINATOR.execution_status ( PI_ID_REQUEST => PI_ID_REQUEST, PI_ENVIRONMENT_ALIAS => PI_ENVIRONMENT_ALIAS, PI_ID_DET_REQ => pi_id_req_det, PI_ID_PRC_EXEC => NULL, PI_STATUS => -4, PI_EXEC_MESSAGE => ' Error en la invocación REST al Jenkins - Detalle: '|| vo_error_message, PI_EXEC_DATE => sysdate) ; ------------------------------------------------------------------ log_collector( pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => 'Error en la invocación REST al Jenkins - Detalle: ' || CHR(13) || vo_error_message || ' -PLSQL_LINE: ' || $$plsql_line ); ------------------------------------------------------------------ WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.prc_jkins_job_oracle_db - %s', sqlerrm); -------------------------------------------------------------------- -- Actualizo el estado de la solicitud PKG_DEPLOY_COORDINATOR.execution_status ( PI_ID_REQUEST => PI_ID_REQUEST, PI_ENVIRONMENT_ALIAS => PI_ENVIRONMENT_ALIAS, PI_ID_DET_REQ => pi_id_req_det, PI_ID_PRC_EXEC => NULL, PI_STATUS => -4, PI_EXEC_MESSAGE => 'Error when others - prc_jkins_job_oracle_db - Detalle: '|| sqlerrm, PI_EXEC_DATE => sysdate) ; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); ------------------------------------------------------------------ END; /*--------------- SEP5-------------------*/ PROCEDURE prc_jenkins_process_job_out ( pi_id_request NUMBER, pi_id_req_det NUMBER, pi_category_action VARCHAR2, pi_environment_alias VARCHAR2, pi_enviroment_class NUMBER, pi_http_status VARCHAR2, pi_http_headers http_headers_tab, pi_body CLOB ) AS v_id_prc_queue VARCHAR2(100); log_program_name VARCHAR2(100) := 'pkg_standard_executors.prc_jenkins_process_job_out'; BEGIN -- Recorro los HTTP headers y busco el Location,para luego obtener el Queue ID de Jenkins FOR i IN 1..pi_http_headers.count LOOP IF ( pi_http_headers(i).campo = 'Location' ) THEN v_id_prc_queue := replace(substr(pi_http_headers(i).valor, instr(pi_http_headers(i).valor, '/', -2)), '/', ''); EXIT; END IF; END LOOP; IF ( pi_http_status like '201%' ) THEN -- Envío el queueID al pkg_standard_executors.prc_jenkins_check_queue_status apex_debug.warn('pkg_standard_executors.prc_jenkins_process_job_out - v_id_prc_queue: %s', v_id_prc_queue); pkg_standard_executors.prc_jenkins_check_queue_status( pi_id_request => pi_id_request, pi_id_req_det => pi_id_req_det, pi_id_prc_queue => v_id_prc_queue, pi_category_action => pi_category_action, pi_environment_alias => pi_environment_alias, pi_enviroment_class => pi_enviroment_class ); ELSE ------------------------------------------------------------------ --Actualizo el estado de la solicitud PKG_DEPLOY_COORDINATOR.execution_status ( PI_ID_REQUEST => PI_ID_REQUEST, PI_ENVIRONMENT_ALIAS => PI_ENVIRONMENT_ALIAS, PI_ID_DET_REQ => pi_id_req_det, PI_ID_PRC_EXEC => NULL, PI_STATUS => -4, PI_EXEC_MESSAGE =>' Error - Se obtuvo un código http distinto a "201" - HTTP_STATUS recibido: '|| pi_http_status, PI_EXEC_DATE => sysdate) ; ------------------------------------------------------------------ END IF; EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.prc_jenkins_process_job_out - %s', sqlerrm); -- Actualizo el estado de la solicitud PKG_DEPLOY_COORDINATOR.execution_status ( PI_ID_REQUEST => PI_ID_REQUEST, PI_ENVIRONMENT_ALIAS => PI_ENVIRONMENT_ALIAS, PI_ID_DET_REQ => pi_id_req_det, PI_ID_PRC_EXEC => NULL, PI_STATUS => -4, PI_EXEC_MESSAGE => 'EXCEPTION WHEN OTHERS - pkg_standard_executors.prc_jenkins_process_job_out - Detalle: ' || sqlerrm, PI_EXEC_DATE => sysdate) ; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); ------------------------------------------------------------------ END; /*--------------- SEP6-------------------*/ PROCEDURE prc_jenkins_get_build_id ( pi_environment_class NUMBER, pi_id_queue NUMBER, pi_category_action VARCHAR2, -- BACKUP | CHECKOUT | DEPLOY po_id_build OUT NUMBER ) AS v_jenkins_url VARCHAR2(4000); v_jenkins_node VARCHAR2(50); v_auth_basic VARCHAR2(200); vi_http_headers http_headers_tab := http_headers_tab(); vo_http_headers http_headers_tab := http_headers_tab(); vo_http_status VARCHAR(5); vo_body CLOB; vo_response_code VARCHAR(15); vo_error_message VARCHAR(4000); exc_category_action EXCEPTION; v_id_build NUMBER; po_response CLOB; log_program_name VARCHAR2(100) := 'pkg_standard_executors.prc_jenkins_get_build_id'; BEGIN -- Defino el nodo de Jenkins a utilizar v_jenkins_node := fnc_get_jenkins_node(pi_environment_class); -- Busco y armo la URL del Jenkins v_jenkins_url := pkg_sicd_commons.get_parameter_value('JENKINS_' || fnc_get_jenkins_node(pi_environment_class) || '_URL') || '/queue'; pkg_sicd_commons.p_rest_call_apim( v_jenkins_url || '/' || 'item' || '/' || pi_id_queue --queue_ID || '/' || 'api' || '/' || 'json?pretty=true', 'POST', vo_body, vo_http_status, vo_http_headers, po_response, vo_response_code, vo_error_message ); SELECT JSON_VALUE(vo_body, '$.executable.number') INTO v_id_build FROM dual; po_id_build := v_id_build; dbms_output.put_line(po_id_build); EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.prc_jenkins_check_build_status - %s', sqlerrm); log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); END; /*--------------- SEP7-------------------*/ PROCEDURE prc_jenkins_get_build_status ( pi_environment_class NUMBER, --1-PRIMARY o 0-SECONDARY pi_id_build NUMBER, pi_category_action VARCHAR2, -- BACKUP | CHECKOUT | DEPLOY po_v_result OUT VARCHAR2, po_pipeline_accion OUT VARCHAR2 --pipBackupOracleDB | pipCheckoutOracleDB | pipDeployOracleDB ) AS v_jenkins_url VARCHAR2(4000); v_jenkins_node VARCHAR2(50); v_auth_basic VARCHAR2(200); vi_http_headers http_headers_tab := http_headers_tab(); vo_http_headers http_headers_tab := http_headers_tab(); vo_http_status VARCHAR(5); vo_body CLOB; vo_response_code VARCHAR(15); vo_error_message VARCHAR(4000); exc_category_action EXCEPTION; v_result VARCHAR2(50); v_building VARCHAR2(50); v_pipeline_accion VARCHAR2(50); po_response CLOB; log_program_name VARCHAR2(100) := 'pkg_standard_executors.prc_jenkins_get_build_status'; BEGIN -- Defino el nodo de Jenkins a utilizar v_jenkins_node := fnc_get_jenkins_node(pi_environment_class); -- Busco y armo la URL del Jenkins v_jenkins_url := pkg_sicd_commons.get_parameter_value('JENKINS_' || fnc_get_jenkins_node(pi_environment_class) || '_URL') || '/job'; CASE pi_category_action WHEN 'BACKUP' THEN v_pipeline_accion := 'pipBackupOracleDB'; WHEN 'CHECKOUT' THEN v_pipeline_accion := 'pipCheckoutOracleDB'; WHEN 'DEPLOY' THEN v_pipeline_accion := 'pipDeployOracleDB'; END CASE; --Crea la variable de salida po_po_pipeline_accion po_pipeline_accion := v_pipeline_accion; --------------------------------------------- pkg_sicd_commons.p_rest_call_apim(v_jenkins_url || '/' || v_pipeline_accion || '/' || pi_id_build --build_ID || '/' || 'api' || '/' || 'json?pretty=true',--url 'POST', --method vo_body, --body vo_http_status, vo_http_headers, po_response, vo_response_code, vo_error_message ); SELECT JSON_VALUE(vo_body, '$.result'), JSON_VALUE(vo_body, '$.building') INTO v_result, v_building FROM dual; po_v_result := v_result; IF v_result = 'null' THEN --si v_result ='null'se encuentra ejecutandose o en cola IF v_building = 'true' THEN --si v_building='true' esta esperando po_v_result := 'BUILDING'; ELSE po_v_result := v_result; END IF; ELSE po_v_result := v_result; END IF; dbms_output.put_line(v_result); EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.prc_jenkins_check_build_status - %s', sqlerrm); log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); END; /*--------------- SEP8-------------------*/ /*--------------- SEP9-------------------*/ PROCEDURE prc_send_mail ( pi_notification IN CLOB, pi_id_sys_profile IN NUMBER, pi_id_user IN NUMBER, pi_subject IN VARCHAR2, po_response_code OUT VARCHAR2, po_error_message OUT VARCHAR2 ) AS v_to VARCHAR2(4000) := NULL; v_payload CLOB; v_header VARCHAR2(2000) := NULL; v_action VARCHAR2(500) := NULL; v_url VARCHAR2(2000) := NULL; v_from VARCHAR2(2000) := NULL; return_value XMLTYPE; log_program_name VARCHAR2(100) := 'pkg_standard_executors.prc_send_mail'; BEGIN v_header := ''||chr(10)||''; v_from := pkg_sicd_commons.get_parameter_value('SICD_EMAIL_MESSAGE_FROM'); IF nvl(pi_id_user, 0) = 0 THEN v_to := pkg_standard_executors.fnc_send_profile_email(pi_id_sys_profile); log_collector( pi_program_name => log_program_name, pi_log_level => 4,--- DEBUG pi_log_message => 'Se da aviso al correo: ' || v_to || ' perteneciente al id_sys_profile: ' || pi_id_sys_profile ); ELSE SELECT unique user_mail INTO v_to FROM user_roles WHERE id_user = pi_id_user; -- DBMS_OUTPUT.PUT_LINE('user_mail al cual se envio el correo: '+v_to); log_collector( pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Se da aviso al correo: ' || v_to ); END IF; v_payload := ' ' || pi_subject || ' ' || v_to || ' ' || v_from || ' ' || pi_notification || ' '; log_collector( pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'v_payload: ' || v_payload ); apex_debug.info('pkg_standard_executors.prc_send_mail - v_payload: %s', v_payload); v_url := pkg_sicd_commons.get_parameter_value('MAILER_URL'); apex_debug.info('pkg_standard_executors.prc_send_mail - v_url: %s', v_url); v_action := 'EnviarMail'; return_value := pkg_standard_executors.fnc_soap_call( v_payload, v_header, v_action, v_url, 'HTTP/1.1', 'text/xml', po_response_code, po_error_message ); EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.prc_send_mail - %s', sqlerrm); po_response_code := 'ERROR'; po_error_message := substr(sqlerrm, 1, 4000); log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); END prc_send_mail; /*----------------SEPT10--------------------------------------------------------*/ PROCEDURE prc_jenkins_get_queue_status ( pi_id_request NUMBER, pi_id_req_det NUMBER, pi_environment_class NUMBER, pi_id_queue NUMBER, pi_category_action VARCHAR2, -- BACKUP | CHECKOUT | DEPLOY po_v_result OUT VARCHAR2, po_v_building OUT VARCHAR2 --v_pipeline_accion VARCHAR2; --pipBackupOracleDB | pipCheckoutOracleDB | pipDeployOracleDB ) AS v_jenkins_url VARCHAR2(4000); v_jenkins_node VARCHAR2(50); v_auth_basic VARCHAR2(200); vi_http_headers http_headers_tab := http_headers_tab(); vo_http_headers http_headers_tab := http_headers_tab(); vo_http_status VARCHAR(5); vo_body CLOB; vo_response_code VARCHAR(15); vo_error_message VARCHAR(4000); exc_category_action EXCEPTION; v_result VARCHAR2(50); v_building VARCHAR2(50); v_pipeline_accion VARCHAR2(50); po_id_build NUMBER; v_id_build NUMBER; po_response CLOB; log_program_name VARCHAR2(100) := 'pkg_standard_executors.prc_jenkins_get_queue_status'; BEGIN -- Defino el nodo de Jenkins a utilizar v_jenkins_node := fnc_get_jenkins_node(pi_environment_class); -- Busco y armo la URL del Jenkins v_jenkins_url := pkg_sicd_commons.get_parameter_value('JENKINS_' || fnc_get_jenkins_node(pi_environment_class) || '_URL') || '/job'; --Busco el id_build prc_jenkins_get_build_id( pi_environment_class, pi_id_queue, pi_category_action, -- BACKUP | CHECKOUT | DEPLOY po_id_build); v_id_build := po_id_build; CASE pi_category_action WHEN 'BACKUP' THEN v_pipeline_accion := 'pipBackupOracleDB'; WHEN 'CHECKOUT' THEN v_pipeline_accion := 'pipCheckoutOracleDB'; WHEN 'DEPLOY' THEN v_pipeline_accion := 'pipDeployOracleDB'; END CASE; pkg_sicd_commons.p_rest_call_apim( v_jenkins_url || '/' || v_pipeline_accion || '/' || v_id_build --build_ID || '/' || 'api' || '/' || 'json?pretty=true', 'POST', vo_body, vo_http_status, vo_http_headers, po_response, vo_response_code, vo_error_message ); SELECT JSON_VALUE(vo_body, '$.result'), JSON_VALUE(vo_body, '$.building') INTO v_result, v_building FROM dual; po_v_result := v_result; --po_v_building:=v_building; dbms_output.put_line(v_result); IF v_result = 'null' THEN --si v_result ='null'se encuentra ejecutandose o en cola IF v_building = 'true' THEN --si v_building='true' esta esperando po_v_result := 'BUILDING'; ELSE po_v_result := v_result; END IF; ELSE po_v_result := v_result; END IF; EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.prc_jenkins_queue_status - %s', sqlerrm); log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); END; /*----------------SEPT11--------------------------------------------------------*/ PROCEDURE prc_jenkins_check_build_status ( pi_id_request INTEGER, pi_id_req_det INTEGER, pi_id_prc_queue VARCHAR2, --id_queue pi_environment_class NUMBER, pi_category_action VARCHAR2, pi_environment_alias VARCHAR2 ) AS po_id_build VARCHAR2(50); v_id_build VARCHAR2(50); v_queue_timeout INTEGER := pkg_sicd_commons.get_parameter_value(param_name => 'JENKINS_QUEUE_ADD_TIMEOUT'); po_v_result VARCHAR2(50); v_status NUMBER; log_program_name VARCHAR2(100) := 'pkg_standard_executors.prc_jenkins_check_build_status'; id_status_build NUMBER; po_pipeline_accion VARCHAR2(50); name_job VARCHAR2(100); v_exec_message VARCHAR2(100); BEGIN -- Primero busco el build_id con el queue_id, y luego consulto el estado del build_id. log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Inicio - ' || log_program_name); ---------------------------------------------------------------- --Busca el estado del build segun el id_request y el id_control_deploy . SELECT red.id_deployment_status INTO id_status_build FROM request_exec_deploy red WHERE id_request = pi_id_request AND id_control_deploy = pi_id_req_det; -- id_status_build:= nvl(id_status_build,99); ------------------------------------------------------------------------- log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'id_status_build: ' || id_status_build); -------------------------------------------------------------------------- -- Consulto si el estado del build se actualizo o no. IF ( id_status_build = 0 ) THEN -- No se actualizo, Actualiza el estado del build -- Si el build_id esta en ABORTED, FAILED o SUCCESS, actualizo el estado del 'pi_id_req_det'. -- Ejecuto prc_jenkins_get_build_id y extraigo el id_build prc_jenkins_get_build_id(pi_environment_class, --1-PRIMARY o 0-SECONDARY pi_id_prc_queue, --=id_queue pi_category_action, -- BACKUP | CHECKOUT | DEPLOY po_id_build); -- po_id_build := v_id_build; v_id_build := po_id_build; --ejecuto prc_jenkins_check_build_status extraigo es status del build_id prc_jenkins_get_build_status(pi_environment_class, --1-PRIMARY o 0-SECONDARY v_id_build,--=pi_id_build pi_category_action,-- BACKUP | CHECKOUT | DEPLOY po_v_result, --BUILDING,ABORTED, FAILED o SUCCESS, po_pipeline_accion); log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'id_build - ' || v_id_build || 'po_result' || po_v_result || 'po_pipeline_accion' || po_pipeline_accion); IF ( po_v_result <> 'BUILDING' ) THEN IF ( po_v_result = 'SUCCESS' ) THEN v_status := 1; v_exec_message := 'Warning: Jenkins no informó el estado final del Build - Resultado final = Success'; ELSE v_status := -1; v_exec_message := 'Error en ejecución de Jenkins - Verifique el log.'; END IF; pkg_deploy_coordinator.execution_status(pi_id_request => pi_id_request, pi_environment_alias => pi_environment_alias, pi_id_det_req => pi_id_req_det, pi_id_prc_exec => 'jenkins-' || po_pipeline_accion || '-' || po_id_build, pi_status => v_status, pi_exec_message => v_exec_message, pi_exec_date => sysdate); ------------------------------------------------------ -- Actualizo el id_dep_proc en la tabla request_exec_deploy UPDATE request_exec_deploy ed SET ed.id_dep_proc = 'jenkins-' || po_pipeline_accion || '-' || po_id_build WHERE ed.id_request = pi_id_request AND ed.id_control_deploy = pi_id_req_det; log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Salió del procedimiento execution_status '); ELSE --po_v_result = 'BUILDING' -- Actualizo el estado del id_control_deploy log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Entro en el else por que po_v_result = BUILDING'); pkg_deploy_coordinator.execution_status(pi_id_request => pi_id_request, pi_environment_alias => pi_environment_alias, pi_id_det_req => pi_id_req_det, pi_id_prc_exec => 'jenkins-' || po_pipeline_accion || '-' || po_id_build, pi_status => - 1, pi_exec_message => 'Error en ejecucion de Jenkins - Verifique el log.', pi_exec_date => sysdate); UPDATE request_exec_deploy ed SET ed.id_dep_proc = 'jenkins-' || po_pipeline_accion || '-' || po_id_build WHERE ed.id_request = pi_id_request AND ed.id_control_deploy = pi_id_req_det; END IF; ELSE IF ( id_status_build IS NULL ) THEN log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'entro dentro del id_status_build = (null) '); prc_jenkins_get_build_id(pi_environment_class, --1-PRIMARY o 0-SECONDARY pi_id_prc_queue, --=id_queue pi_category_action, -- BACKUP | CHECKOUT | DEPLOY po_id_build); v_id_build := po_id_build; -- Ejecuto prc_jenkins_check_build_status extraigo es status del build_id prc_jenkins_get_build_status(pi_environment_class, --1-PRIMARY o 0-SECONDARY v_id_build,--=pi_id_build pi_category_action,-- BACKUP | CHECKOUT | DEPLOY po_v_result, --BUILDING,ABORTED, FAILED o SUCCESS, po_pipeline_accion); IF ( po_v_result = 'SUCCESS' ) THEN v_status := 1; v_exec_message := 'Warning: Jenkins no informó el estado final del Build - Resultado final = Success'; ELSE v_status := -1; v_exec_message := 'Error en ejecución de Jenkins - Verifique el log.'; END IF; pkg_deploy_coordinator.execution_status(pi_id_request => pi_id_request, pi_environment_alias => pi_environment_alias, pi_id_det_req => pi_id_req_det, pi_id_prc_exec => 'jenkins-' || po_pipeline_accion || '-' || po_id_build, pi_status => v_status, pi_exec_message => v_exec_message, pi_exec_date => sysdate); ------------------------------------------------------ -- Actualizo el id_dep_proc en la tabla request_exec_deploy UPDATE request_exec_deploy ed SET ed.id_dep_proc = 'jenkins-' || po_pipeline_accion || '-' || po_id_build WHERE ed.id_request = pi_id_request AND ed.id_control_deploy = pi_id_req_det; ELSE NULL; END IF; END IF; log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Fin Procedimiento - ' || log_program_name || ' - Estado del Build en Jenkins: ' || po_v_result || ' - ' || sysdate); EXCEPTION WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.prc_jenkins_check_build_status - %s', sqlerrm); log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); END; /*----------------SEPT12--------------------------------------------------------*/ PROCEDURE prc_configure_message ( pi_id_action IN NUMBER, pi_id_request IN NUMBER, pi_observation IN VARCHAR2, pi_request_status IN VARCHAR2, pi_request_flow_message IN VARCHAR2, pi_enviroment_type IN VARCHAR2, ---Ambiente testing / Ambiente productivo pi_deployment_type IN VARCHAR2, -- Estandar pi_enviroment_alias IN VARCHAR2, po_subject OUT VARCHAR2, po_message OUT CLOB, po_message_type OUT NUMBER ) IS ---action_message_conf v_response_code VARCHAR2(4000); v_error_message VARCHAR2(4000); r_drh deployment_req_hgroup%rowtype; v_step_flow NUMBER(38, 0); log_program_name VARCHAR2(100) := 'pkg_standard_executors.prc_configure_message'; r_ref_message_type Number(2); r_ref_subject VARCHAR2(200); r_ref_body VARCHAR2(4000); v_err_msg VARCHAR2(2000); v_err_code VARCHAR2(50); BEGIN log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Inicio Procedimiento prc_configure_message - ' || log_program_name || ': ' || sysdate); ------------------------------------------ -- Busco el cuerpo,asunto,tipo de mensensaja,etc segun la accion realizada BEGIN IF pi_request_flow_message='REQUEST_WORKFLOW' THEN SELECT am.action_message_type,am.action_message_subject,am.action_message_body INTO r_ref_message_type,r_ref_subject,r_ref_body FROM action_message am WHERE am.id_action = pi_id_action AND am.action_message_status= 1; ELSE IF pi_request_flow_message='REQUEST_DEPLOYMENT' THEN SELECT am.deploy_status_message_type,am.deploy_status_message_subject,am.deploy_status_message_body INTO r_ref_message_type,r_ref_subject,r_ref_body FROM deploy_status_message am WHERE am.id_deploy_status_message= pi_id_action AND am.deploy_status_message_status= 1; END IF; END IF; EXCEPTION WHEN OTHERS THEN v_err_code := sqlcode; v_err_msg := substr(sqlerrm, 1, 1000); log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); END; -- ------------------------------------------ -- Busco el Nº completo de la request (REQ_HGROUP_NAME) BEGIN SELECT r_drh.* INTO r_drh FROM deployment_req_hgroup r_drh WHERE r_drh.id_request = pi_id_request AND r_drh.id_req_hgroup_level = 'R'; EXCEPTION WHEN OTHERS THEN v_err_code := sqlcode; v_err_msg := substr(sqlerrm, 1, 1000); log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); END; ------------------------------------------ ---------- --Crea y extrae el Cuerpo del mensage IF pi_enviroment_alias IS NULL THEN IF pi_observation IS NULL THEN po_message := 'Solicitud Nº ' || r_drh.req_hgroup_name || chr(10) || chr(10) || 'Estado de la solicitud: ' || pi_request_status || chr(10) || chr(10) || 'Tipo de Ambiente: ' || pi_enviroment_type || chr(10) || chr(10) || 'Tipo de Solicitud: ' || pi_deployment_type || chr(10) || chr(10) || 'Detalle: ' || r_ref_body || chr(10) || chr(10) || 'Observaciones: sin observaciones' || chr(10) || chr(10) || 'Fecha: ' || sysdate ; ELSE po_message := 'Solicitud Nº ' || r_drh.req_hgroup_name || chr(10) || chr(10) || 'Estado de la solicitud: ' || pi_request_status || chr(10) || chr(10) || 'Tipo de Ambiente: ' || pi_enviroment_type || chr(10) || chr(10) || 'Tipo de Solicitud: ' || pi_deployment_type || chr(10) || chr(10) || 'Detalle: ' || r_ref_body || chr(10) || chr(10) || 'Observaciones: ' || utl_url.unescape(replace(pi_observation, '+', ' '), 'UTF-8') || chr(10) || chr(10) || 'Fecha: ' || sysdate; END IF; -- Creo y extraigo el cuerpo del mensage ELSE IF pi_observation IS NULL THEN po_message := 'Solicitud Nº ' || r_drh.req_hgroup_name || chr(10) || chr(10) || 'Estado de la solicitud: ' || pi_request_status || chr(10) || chr(10) || 'Tipo de Ambiente: ' || pi_enviroment_type || chr(10) || chr(10) || 'Ambiente Destino: ' || pi_enviroment_alias || chr(10) || chr(10) || 'Tipo de Solicitud: ' || pi_deployment_type || chr(10) || chr(10) || 'Detalle: ' || r_ref_body || chr(10) || chr(10) || 'Observaciones: sin observaciones' || chr(10) || chr(10) || 'Fecha: ' || sysdate ; ELSE po_message := 'Solicitud Nº ' || r_drh.req_hgroup_name || chr(10) || chr(10) || 'Estado de la solicitud: ' || pi_request_status || chr(10) || chr(10) || 'Tipo de Ambiente: ' || pi_enviroment_type || chr(10) || chr(10) || 'Ambiente Destino: ' || pi_enviroment_alias || chr(10) || chr(10) || 'Tipo de Solicitud: ' || pi_deployment_type || chr(10) || chr(10) || 'Detalle: ' || r_ref_body || chr(10) || chr(10) || 'Observaciones: ' || utl_url.unescape(replace(pi_observation, '+', ' '), 'UTF-8') || chr(10) || chr(10) || 'Fecha: ' || sysdate; END IF; END IF; -- ------------------------------------------ -- Creo y extraago el asunto del mensage a enviar po_subject := r_ref_subject || ' - Nº ' || r_drh.req_hgroup_name || ' - ' || to_char(sysdate, 'DD/MM/YYYY - HH24:MI:SS'); -- Extraigo el tipo de mensage po_message_type := r_ref_message_type; log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'El asunto del mensaje es: ' || po_subject); log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'La notificación es: ' || po_message); log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Fin Procedimiento - ' || log_program_name); EXCEPTION WHEN no_data_found THEN dbms_output.put_line('No datos'); v_err_code := sqlcode; v_err_msg := substr(sqlerrm, 1, 1000); log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Error tipo: No data found - ' || v_err_msg); WHEN OTHERS THEN v_err_code := sqlcode; v_err_msg := substr(sqlerrm, 1, 1000); log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); END; /*----------------SEPT13--------------------------------------------------------*/ PROCEDURE prc_send_deploy_status_message ( pi_id_request IN NUMBER, pi_id_control_deploy IN NUMBER, pi_observation IN VARCHAR2, pi_request_flow_message IN VARCHAR2, --'REQUEST_WORKFLOW' / REQUEST_DEPLOYMENT pi_id_prc_exec IN VARCHAR2 ) IS po_subject VARCHAR2(200); po_message VARCHAR2(4000); po_message_type NUMBER(2); v_notification CLOB; po_response_code VARCHAR2(4000); po_error_message VARCHAR2(4000); v_nn_id_sys_profile NUMBER := 0; v_request_status VARCHAR2(100); v_id_deploy_status_message NUMBER := 0; v_deploy_status_message NUMBER := 0; v_enviroment_type VARCHAR2(100); v_deployment_type VARCHAR2(100); v_enviroment_type_class NUMBER := 0; v_enviroment_alias VARCHAR2(100); v_id_dep_req_object NUMBER := 0; v_id_dep_req_object_max NUMBER := 0; v_bandera NUMBER := 0; v_id_pattern NUMBER := 0; v_id_pattern_step NUMBER := 0; v_id_deployment_status NUMBER := 0; v_retry_number NUMBER := 0; v_retries_error NUMBER := 0; v_retries_timeout NUMBER := 0; log_program_name VARCHAR2(100) := 'pkg_standard_executors.prc_send_deploy_status_message'; BEGIN log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'COMIENZO procedimiento prc_send_deploy_status_message '); --------------------------------------------- ---Busca el estado de la solicitud (En proceso,Con Errores,Abortada ó Finalizada) SELECT dr.request_status INTO v_request_status FROM deployment_request dr WHERE dr.id_request = pi_id_request; --------------------------------------------------------------- --- Busca si el estado de la solicitud tiene habilitado la notificacion ( =1 ) SELECT dsm.deploy_status_message_status INTO v_deploy_status_message FROM deploy_status_message dsm WHERE dsm.dep_request_status = v_request_status; IF v_deploy_status_message = 1 THEN CASE v_request_status WHEN 'Finalizada' THEN SELECT id_dep_req_object INTO v_id_dep_req_object FROM request_exec_deploy where id_request=pi_id_request AND id_control_deploy=pi_id_control_deploy; SELECT max(id_dep_req_object) INTO v_id_dep_req_object_max FROM request_exec_deploy where id_request=pi_id_request; --- comparo el id_dep_req_object es igual al maxino el maximo id_dep_req_object de la tabla deployment_req_object IF v_id_dep_req_object=v_id_dep_req_object_max THEN v_bandera:=1; log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Ingreso dentro de Finalizada v_bandera: ' || v_bandera); ELSE v_bandera:=0; END IF; WHEN 'Con Errores' THEN SELECT id_pattern, id_pattern_step,retry_numer,id_deployment_status into v_id_pattern, v_id_pattern_step,v_retry_number,v_id_deployment_status from request_exec_deploy where id_request=pi_id_request AND id_control_deploy=pi_id_control_deploy; SELECT retries_error, retries_timeout into v_retries_error, v_retries_timeout From deployment_pattern_step where id_pattern_step = v_id_pattern_step AND id_pattern = v_id_pattern; IF (v_id_deployment_status=-3 AND v_retry_number=v_retries_timeout) OR (v_id_deployment_status=-1 AND v_retry_number=v_retries_error) THEN v_bandera:=1; log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Ingreso dentro de Con error v_bandera: ' || v_bandera); ELSE v_bandera:=0; END IF; WHEN 'Abortada' THEN --para futuros usos v_bandera:=1; WHEN 'En Proceso' THEN --para futuros usos v_bandera:=0 ; ELSE NULL; END CASE; IF v_bandera=1 THEN ---Busca el tipo de ambiente de la solicitud (Ambiente productivo / Ambiento no productivo) log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Ingreso dentro de v_bandera: 1 - va a enviar email.'); SELECT enviroment_type_name INTO v_enviroment_type FROM enviroment_type WHERE id_enviroment_type = ( SELECT dr.id_enviroment_type FROM deployment_request dr WHERE dr.id_request = pi_id_request ); --------------------------------------------- ---Busca el tipo de solicitud (ESTANDAR / OTROS) SELECT deployment_type INTO v_deployment_type FROM deployment_type WHERE id_deployment_type = ( SELECT dr.id_deployment_type FROM deployment_request dr WHERE dr.id_request = pi_id_request ); -------------------------------------------------- ----Busca el alias del ambiente de la solicitud SELECT ENVIROMENT_ALIAS INTO v_enviroment_alias FROM ENVIROMENT WHERE ID_ENVIROMENT=(SELECT red.id_enviroment FROM REQUEST_EXEC_DEPLOY red WHERE red.id_request= pi_id_request AND red.id_control_deploy=(select max(id_control_deploy) from request_exec_deploy where id_request=pi_id_request )); --------------------------------------------------- CASE v_request_status WHEN 'En Proceso' THEN v_id_deploy_status_message := 1; WHEN 'Con Errores' THEN v_id_deploy_status_message := 2; WHEN 'Abortada' THEN v_id_deploy_status_message := 3; WHEN 'Finalizada' THEN v_id_deploy_status_message := 4; ELSE NULL; END CASE; ---- Crea el subject y body del email a enviar pkg_standard_executors.prc_configure_message(pi_id_action => v_id_deploy_status_message, pi_id_request => pi_id_request, pi_observation => pi_observation, pi_request_status => v_request_status, pi_request_flow_message => pi_request_flow_message, pi_enviroment_type => v_enviroment_type, ---Ambiente testing / Ambiente productivo pi_deployment_type => v_deployment_type, --Estandar pi_enviroment_alias => v_enviroment_alias, po_subject => po_subject, po_message => v_notification, po_message_type => po_message_type); -------------- ---Se reemplaza las variables particulares de cada mensaje CASE v_request_status WHEN 'En Proceso' THEN v_notification := replace(v_notification, '|link|', pkg_sicd_commons.get_parameter_value('SICD_URL')); WHEN 'Con Errores' THEN v_notification := replace(v_notification, '|link|', fnc_get_jenkins_log_url(pi_id_prc_exec)); WHEN 'Abortada' THEN v_notification := replace(v_notification, '|link|', pkg_sicd_commons.get_parameter_value('SICD_URL')); WHEN 'Finalizada' THEN v_notification := replace(v_notification, '|link|', pkg_sicd_commons.get_parameter_value('SICD_URL')); ELSE v_notification := replace(v_notification, '|link|', pkg_sicd_commons.get_parameter_value('SICD_URL')); END CASE; ----Analiza el Subject SELECT enviroment_type_class INTO v_enviroment_type_class FROM enviroment_type WHERE id_enviroment_type = ( SELECT dr.id_enviroment_type FROM deployment_request dr WHERE dr.id_request = pi_id_request ); IF v_enviroment_type_class = 0 THEN po_subject := replace(po_subject, '|envType|', '(No PRD)'); ELSIF v_enviroment_type_class = 1 THEN po_subject := replace(po_subject, '|envType|', '(PRD)'); END IF; --------------------------------------------------------------------------- ----- Envio de notificación a todos los intervinientes activos de dicha solicitud --- FOR c_user IN ( SELECT DISTINCT ref.id_user FROM request_exec_flow ref INNER JOIN user_roles ur ON ref.id_user = ur.id_user WHERE ref.id_request = pi_id_request AND ref.status_result IS NOT NULL AND ur.user_status = 1 UNION SELECT ur.id_user FROM user_roles ur WHERE UPPER(ur.user_name) = (SELECT UPPER(dr.user_create) FROM deployment_request dr WHERE dr.id_request = pi_id_request) ) LOOP IF po_message_type = 1 THEN --llama al procedimiento de envio de email pkg_standard_executors.prc_send_mail(pi_notification => v_notification, pi_id_sys_profile => NULL, pi_id_user => c_user.id_user, pi_subject => po_subject, po_response_code => po_response_code, po_error_message => po_error_message); ELSE --- v_message_type distinto de 1 NULL; END IF; END LOOP; END IF; ELSE NULL; END IF; log_collector(pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'FIN procedimiento prc_send_deploy_status_message'); 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 => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); END; /*----------------SEPT14--------------------------------------------------------*/ PROCEDURE prc_send_action_message ( pi_id_action IN NUMBER, pi_id_request IN NUMBER, pi_observation IN VARCHAR2, pi_request_status IN VARCHAR2, pi_request_flow_message IN VARCHAR2, --'REQUEST_WORKFLOW' / REQUEST_DEPLOYMENT pi_id_sys_profile IN NUMBER, pi_id_next_user IN NUMBER ) IS po_subject VARCHAR2(200); po_message VARCHAR2(4000); po_message_type NUMBER(2); v_notification CLOB; po_response_code VARCHAR2(4000); po_error_message VARCHAR2(4000); v_nn_id_sys_profile NUMBER := 0; v_subject VARCHAR2(200); v_message_type NUMBER := 0; v_enviroment_type VARCHAR2(100); v_deployment_type VARCHAR2(100); v_enviroment_alias VARCHAR2(100); log_program_name VARCHAR2(100) := 'pkg_standard_executors.prc_send_action_message'; BEGIN ---busca el tipo de ambiente (Productiva / No productiva) SELECT enviroment_type_name INTO v_enviroment_type FROM enviroment_type WHERE id_enviroment_type = ( SELECT dr.id_enviroment_type FROM deployment_request dr WHERE dr.id_request = pi_id_request ); ---busca el tipo de solicitud (ESTANDAR/ OTRO) SELECT deployment_type INTO v_deployment_type FROM deployment_type WHERE id_deployment_type = ( SELECT dr.id_deployment_type FROM deployment_request dr WHERE dr.id_request = pi_id_request ); --Ejecuta procedimeinto para configuracion y contenido del mensaje pkg_standard_executors.prc_configure_message(pi_id_action => pi_id_action, pi_id_request => pi_id_request, pi_observation => pi_observation, pi_request_status => pi_request_status, pi_request_flow_message => pi_request_flow_message, --'REQUEST_WORKFLOW', pi_enviroment_type => v_enviroment_type, pi_deployment_type => v_deployment_type, pi_enviroment_alias => null, po_subject => v_subject, po_message => v_notification, po_message_type => v_message_type); IF v_message_type = 1 THEN ------------------------------------------------------------------ ---Se reemplaza las variables particulares de cada mensaje v_notification := replace(v_notification, '|link|', pkg_sicd_commons.get_parameter_value('SICD_URL')); --Si no se selecciono ningun usuario de destino de notificacion IF pi_id_next_user IS NULL THEN --Busca todos los usuarios activos del id_sys_profile responsable del paso FOR c_user IN ( SELECT ur.ID_USER FROM USER_ROLES ur WHERE ur.ID_SYS_PROFILE=pi_id_sys_profile AND USER_STATUS = 1) LOOP --Llama al procedimiento de envio de email pkg_standard_executors.prc_send_mail(pi_notification => v_notification, pi_id_sys_profile => pi_id_sys_profile, pi_id_user => c_user.id_user, pi_subject => v_subject, po_response_code => po_response_code, po_error_message => po_error_message); END LOOP; --Si se selecciono usuario ELSE --Envia notificacion a usuario seleccionado --Llama al procedimiento de envio de email pkg_standard_executors.prc_send_mail(pi_notification => v_notification, pi_id_sys_profile => pi_id_sys_profile, --deberia entrar un valor NULL en esta variable pi_id_user => pi_id_next_user, pi_subject => v_subject, po_response_code => po_response_code, po_error_message => po_error_message); END IF; ELSE NULL; END IF; 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 => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); END; /*--------------- SEP15-------------------*/ PROCEDURE prc_jkins_job_ipolaris_java_wb ( pi_category_action VARCHAR2, -- CHECKOUT | COMPILE | DEPLOY pi_id_request NUMBER, -- id de la solicitud 1 pi_id_req_det NUMBER, -- detalle solictud pi_environment_alias VARCHAR2, --IPOLARIDES pi_scm_alias VARCHAR2, pi_repository_path VARCHAR2, --LaCaja/iPolaris/archive/ pi_componentes CLOB, pi_enviroment_class NUMBER, -- 0: NO PRODUCTIVO | 1: PRODUCTIVO pi_build_timeout NUMBER, pi_version VARCHAR2 ) AS v_jenkins_node VARCHAR2(50); v_auth_basic VARCHAR2(200); vi_http_headers http_headers_tab := http_headers_tab(); vo_http_headers http_headers_tab := http_headers_tab(); v_jenkins_url VARCHAR2(4000); vo_http_status VARCHAR(20); vo_body CLOB; vo_response_code VARCHAR(15); vo_error_message VARCHAR(4000); exc_category_action EXCEPTION; exc_response_code EXCEPTION; v_profile VARCHAR2(20):= '-Pprod'; v_sedURL VARCHAR2(50); po_response CLOB; log_program_name VARCHAR2(100) := 'pkg_standard_executors.prc_jkins_job_ipolaris_java_wb'; BEGIN -- Defino el nodo de Jenkins a utilizar v_jenkins_node := fnc_get_jenkins_node(pi_enviroment_class); apex_debug.info('pkg_standard_executors.prc_jkins_job_ipolaris_java_wb - v_jenkins_node: %s', v_jenkins_node); -- Busco y armo la URL del Jenkins v_jenkins_url := pkg_sicd_commons.get_parameter_value('JENKINS_' || v_jenkins_node || '_URL') || '/job'; apex_debug.info('pkg_standard_executors.prc_jkins_job_ipolaris_java_wb - v_jenkins_url: %s', v_jenkins_url); -- Dependiendo de la acción enviada, invoco al Jenkins con los parámetros correspondientes CASE pi_category_action WHEN 'CHECKOUT' THEN pkg_sicd_commons.p_rest_call_apim( v_jenkins_url || '/' || 'ipolaris_checkout' || '/' || 'buildWithParameters' || '?' || 'piIdRequest=' || pi_id_request || '&' || 'piIdDetReq=' || pi_id_req_det || '&' || 'buildTimeout=' || pi_build_timeout || '&' || 'environmentAlias' || pi_environment_alias || '&' || 'profile=' || v_profile || '&' || 'version=' || pi_version || '&' || 'scmAlias=' || pi_scm_alias || '&' || 'repository_path=' || pi_repository_path, 'POST', vo_body, vo_http_status, vo_http_headers, po_response, vo_response_code, vo_error_message ); WHEN 'COMPILE' THEN pkg_sicd_commons.p_rest_call_apim( v_jenkins_url || '/' || 'ipolaris_compile' || '/' || 'buildWithParameters' || '?' || 'profile=' || v_profile || '&' || 'version=' || pi_version || '&' || 'piIdDetReq=' || pi_id_req_det || '&' || 'piIdRequest=' || pi_id_request || '&' || 'buildTimeout=' || pi_build_timeout || '&' || 'environmentAlias' || pi_environment_alias, 'POST', vo_body, vo_http_status, vo_http_headers, po_response, vo_response_code, vo_error_message ); WHEN 'DEPLOY' THEN pkg_sicd_commons.p_rest_call_apim( v_jenkins_url || '/' || 'ipolaris_deploy' || '/' || 'buildWithParameters' || '?' || 'piIdRequest=' || pi_id_request || '&' || 'piIdDetReq=' || pi_id_req_det || '&' || 'buildTimeout=' || pi_build_timeout || '&' || 'environmentAlias=' || pi_environment_alias || '&' || 'profile=' || v_profile || '&' || 'version=' || pi_version || '&' || 'componentes=' || pi_componentes, 'POST', vo_body, vo_http_status, vo_http_headers, po_response, vo_response_code, vo_error_message ); WHEN 'ROLLBACK' THEN ------------------------------------------------------------------ log_collector( pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'ROLLBACK: ' ); ------------------------------------------------------------------ ELSE RAISE exc_category_action; END CASE; log_collector( pi_program_name => log_program_name, pi_log_level => 4,--- DEBUG pi_log_message => 'LOG next - case - Code: ' || vo_response_code || CHR(13) || ' - vo_error_message: ' || vo_error_message || CHR(13) || 'PLSQL_LINE: ' || $$plsql_line ); log_collector( pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Body: ' || vo_body || CHR(13) || 'PLSQL_LINE: ' || $$plsql_line ); -- Analizo el response_code apex_debug.info('pkg_standard_executors.prc_jkins_job_ipolaris_java_wb - vo_response_code: %s', vo_response_code); IF ( vo_response_code = 'OK' ) THEN -- Si es OK, invoco al procedimiento de OUT apex_debug.warn('pkg_standard_executors.prc_jkins_job_ipolaris_java_wb - pi_id_request: %s', pi_id_request); apex_debug.warn('pkg_standard_executors.prc_jkins_job_ipolaris_java_wb - pi_id_req_det: %s', pi_id_req_det); prc_jenkins_process_job_out( pi_id_request, pi_id_req_det, pi_category_action, pi_environment_alias, pi_enviroment_class, vo_http_status, vo_http_headers, vo_body ); log_collector( pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Ingreso dentro de response_code: OK '); ELSE -- Si no es OK log_collector( pi_program_name => log_program_name, pi_log_level => 4, --- DEBUG pi_log_message => 'Ingreso dentro de response_code: NO OK - RAISE exc_response_code' ); RAISE exc_response_code; END IF; EXCEPTION WHEN exc_category_action THEN apex_debug.error('pkg_standard_executors.prc_jkins_job_ipolaris_java_wb (CATEGORY ACTION NO EXISTENTE) - %s', sqlerrm); dbms_output.put_line('ERROR - CATEGORY ACTION NO EXISTENTE: ' || pi_category_action || chr(13) || 'PLSQL_LINE: ' || $$plsql_line); ------------------------------------------------------------------ -- Actualizo el estado de la solicitud PKG_DEPLOY_COORDINATOR.execution_status ( PI_ID_REQUEST => PI_ID_REQUEST, PI_ENVIRONMENT_ALIAS => PI_ENVIRONMENT_ALIAS, PI_ID_DET_REQ => pi_id_req_det, PI_ID_PRC_EXEC => NULL, PI_STATUS => -4, PI_EXEC_MESSAGE =>' Error - Category action NO EXISTENTE: '|| pi_category_action, PI_EXEC_DATE => sysdate) ; ------------------------------------------------------------------ log_collector( pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'Error - Category action NO EXISTENTE: ' || pi_category_action || CHR(13) || 'PLSQL_LINE: ' || $$plsql_line ); ------------------------------------------------------------------ WHEN exc_response_code THEN apex_debug.error('pkg_standard_executors.prc_jkins_job_ipolaris_java_wb (CATEGORY ACTION NO EXISTENTE) - %s', sqlerrm); dbms_output.put_line('ERROR -ERROR - RESPONSE_CODE-JENKINS: NO OK ' || chr(13) || 'PLSQL_LINE: ' || $$plsql_line); -- ------------------------------------------------------------------ -- Actualizo el estado de la solicitud PKG_DEPLOY_COORDINATOR.execution_status ( PI_ID_REQUEST => PI_ID_REQUEST, PI_ENVIRONMENT_ALIAS => PI_ENVIRONMENT_ALIAS, PI_ID_DET_REQ => pi_id_req_det, PI_ID_PRC_EXEC => NULL, PI_STATUS => -4, PI_EXEC_MESSAGE => 'Error en la invocación REST al Jenkins - Detalle: '|| vo_error_message, PI_EXEC_DATE => sysdate) ; ------------------------------------------------------------------ log_collector( pi_program_name => log_program_name, pi_log_level => 2, --- WARNING pi_log_message => 'Error en la invocación REST al Jenkins - Detalle: ' || CHR(13) || vo_error_message || ' -PLSQL_LINE: ' || $$plsql_line ); ------------------------------------------------------------------ WHEN OTHERS THEN apex_debug.error('pkg_standard_executors.prc_jkins_job_ipolaris_java_wb - %s', sqlerrm); -------------------------------------------------------------------- -- Actualizo el estado de la solicitud PKG_DEPLOY_COORDINATOR.execution_status ( PI_ID_REQUEST => PI_ID_REQUEST, PI_ENVIRONMENT_ALIAS => PI_ENVIRONMENT_ALIAS, PI_ID_DET_REQ => pi_id_req_det, PI_ID_PRC_EXEC => NULL, PI_STATUS => -4, PI_EXEC_MESSAGE => 'Error when others - prc_jkins_job_ipolaris_java_wb - Detalle: '|| sqlerrm, PI_EXEC_DATE => sysdate) ; ------------------------------------------------------------------ log_collector(pi_program_name => log_program_name, pi_log_level => 1, --- ERROR pi_log_message => substr('Error EXCEPTION WHEN OTHERS - Detalle del error: ' || sqlerrm || ' - Ubicación: ' || DBMS_UTILITY.format_error_backtrace, 1, 3900)); ------------------------------------------------------------------ END; ---------------------------------------------------------------------------- END pkg_standard_executors; /