En este post haremos la instalación de IBM Z Workload Scheduler 9.5. Este producto es el planificador de IBM, también conocido como TWS u OPC. En otras ocasiones, ya hemos instalado otras versiones de este producto, por lo tanto, este post será similar.
El enlace de la documentación es:
Using the EQQJOBS installation aid
Empezaremos localizando las librerías que utilizaremos. En mi caso, empiezan por TWS950.
Crearé un ALIAS relacionado con mi catálogo CATALOG.APL.
NOTA: El job se puede descargar al principio de la entrada.
Ahora crearemos dos librerías que contendrán todos los recursos que usaremos durante la instalación. Yo las llamaré:
OPC.V950.SAMPJCL
OPC.V950.SKELS
La instalación se realiza mediante la utilidad REXX “EQQJOBS”.
Primero debemos añadir las siguientes librerías a nuestra sesión de TSO:
Librería SEQQCLIB a SYSPROC
Librería SEQQPNL0 a ISPPLIB
Librerías SEQQSKL0 y SEQQSAMP a ISPSLIB.
Para saber el procedimiento de logon de TSO que usamos, lo podemos ver cuando entramos al TSO. En mi caso, es ISPFPROC.
Este procedimiento se encuentra almacenado en una de las PROCLIB del sistema. Para saberlo, podemos mirar en la opción PROC de SDSF. También podemos usar el comando del sistema $D PROCLIB.
Añadimos las librerías.
TWS950.SEQQCLIB
TWS950.SEQQPNL0
También añadiremos la librería OPC.V950.SKELS que creamos anteriormente:
OPC.V950.SKELS
TWS950.SEQQSKL0
TWS950.SEQQSAMP
IMPORTANTE: Hay que poner la librería “SKELS” que creamos anteriormente por delante en la concatenación.
Salimos de la sesión de TSO y volvemos a entrar.
Con el comando TSO EQQJOBS entraremos a los paneles de instalación de TWS.
Desde el panel principal de instalación de TWS, entraremos en la opción 1 - Create sample job JCL.
Añadimos una ficha job:
//TWS95INS JOB 'TWS INSTALL',CLASS=A,MSGCLASS=Q,
// MSGLEVEL=(1,1),NOTIFY=&SYSUID
Ajustamos los nombres de las librerías según nuestros requerimientos.
Ajustamos las librerías el nombre de los discos.
Dejamos las opciones a N (por defecto). Si acaso alguna vez me apetece configurarlo, lo haré en el futuro.
Dejamos la opción a N.
En mi caso, activaré la opción “MLOG SWITCH”. Esta opción sirve para cambiar de fichero MLOG cuando se alcance un número determinado de registros.
La opción “CDP LOG INTEGRATION ENABLEMENT” la voy a activar para probarla. Sirve para integrar los logs de TWS con la utilidad “IBM Common Data Provider for z Systems”.
Me parece algo que podría ser interesante para una entrada.
Usaré la ruta /var/TWS950/logs. Lo modificaré más adelante, si fuese necesario.
Esperamos hasta que se creen todos los miembros.
Una vez finalice el proceso, entramos en la opción 2 - Generate batch-job skeletons.
Adaptamos la configuración a nuestra instalación.
Activaré la opción “FORMATTED REPORT OF TRACKLOG EVENTS”.
Esperaremos a que termine el proceso.
La opción 3, no la voy a procesar porque no uso Data Store. Ahora entraré en la opción “4 - Generate WAPL samples”.
Ajustaré los parámetros a mi sistema. Como nombre de subsistema, utilizaré “OPCC”.
Esperamos a que termine.
Ya tenemos ambas librerías con el contenido correspondiente.
Empezamos compilando las “EXITS” de SMF y de JES2. Son registros que se generan según los tipos de evento que van ocurriendo (inicio del job, paso terminado, fin del job…) y sirven para que el planificador sepa en qué estado se encuentran los jobs.
En esta tabla sacada de la web de IBM, se puede ver las exits que existen y el tipo de evento que contralan.
Si tuviésemos algún error en el estado de los jobs, habría que revisar estás exits.
Antes de empezar hay que crear una librería “intermedia” dónde se guardarán los módulos ensamblados. Se llamará OPC.V950.OBJ.
Ahora buscamos el job EQQJES2 de la librería de ejemplos (en mi caso, OPC.V950.SAMPJCL) y lo copiaré a una librería diferente donde voy guardando los jobs que voy ejecutando para tenerlo de referencia en el futuro. Este job sirve para crear la EXIT7 de JES2. Ajustamos el job y lo ejecutamos.
En mi caso, la librería de JES2 es la MVS.MVST.SMPMTS.
La librería donde se guardará el módulo final (DD SYSLMOD) será USER.Z25A.LPALIB.
En los sistemas ADCD, es mejor guardar las cosas en las librerías “USER.**” porque al cambiar de versión resulta más fácil disponer de todos los cambios porque solo habría que poner el disco A5CFG1 (en el caso de mi versión).
Terminará correctamente.
Ahora editaremos el job EQQJES21 para crear la exit EXIT51. Los cambios serán los mismos que en el job anterior.
Terminará bien.
Ahora queda por compilar las tres exits de SMF: IEFACTRT, IEFUJI, IEFU83. El manual de IBM, indica utilizar el job EQQSMF para hacer esto instalándolo como USERMOD, pero yo voy a utilizar otro método.
Usando el job EQQJES2 como base, simplemente tendremos que hacer los cambios mostrados en la imagen para compilar los ejemplos EQQACTR1, EQQUJI1, EQQU831.
Para la exit IEFACTRT haremos los siguientes cambios y ejecutaremos el job.
Para la exit IEFUJI haremos los siguientes cambios y ejecutaremos el job.
Para la exit IEFU83 haremos los siguientes cambios y ejecutaremos el job.
Ya tendremos todos los módulos compilados.
Ahora añadiremos las exits al fichero de parámetros de JES2. Para saber el fichero de parámetros, en mi caso, solo tengo que mirar el arranque de la tarea.
Además, como yo usaré las librerías USER.** para hacer los cambios, también es necesario copiar la STC de JES2 a la librería USER.Z25A.PROCLIB para indicar que busque en la librería USER.Z25A.PARMLIB.
Editamos el miembro de parámetros. Debemos tener mucho cuidado al hacerlo porque si nos equivocamos, la tarea no arrancará.
LOAD(OPCAXIT7) /* Load IBM Z Workload Scheduler exit mod */
EXIT(7) ROUTINES=OPCAENT7,STATUS=ENABLED /* Define EXIT7 entry point */
LOAD(TWSXIT51) /* Load IBM Workload Scheduler for z/OS exit mod */
EXIT(51) ROUTINES=TWSENT51,STATUS=ENABLED /* Define EXIT51 entry */
Ahora tenemos que definir los subsistemas (Controller y Tracker) en el miembro IEFSSNxx de la PARMLIB. En esta versión, el parámetro suffix será “N”. Para establecer el parámetro maxecsa debemos calcularlo según nuestra instalación.
SUBSYS SUBNAME(subsystem name) INITRTN(module name) INITPARM ('maxecsa,suffix')
En mi caso sería:
SUBSYS SUBNAME(OPCC) INITRTN(EQQINITN) INITPARM (’0,N’)
SUBSYS SUBNAME(OPCT) INITRTN(EQQINITN) INITPARM (’100,N’)
El siguiente paso es añadir la librería de módulos TWS950.SEQQLMD0 al listado de librerías a APF.
Ahora tenemos que añadir los registros SMF que se capturan. Lo añadiremos al miembro SMFPRMxx.
Lo importante es que se capturen los registros SMF de los siguientes tipos (6, 14, 15, 18…):
/*SYS and SUBSYS keywords*/
SYS(TYPE(6,14,15,18,26,30,60,62,64,90),EXITS(IEFU83,IEFACTRT,IEFUJI))
SUBSYS(STC,EXITS(IEFUJI,IEFACTRT,IEFU83))
SUBSYS(JESn,EXITS(IEFUJI,IEFACTRT,IEFU83))
Como, en mi caso, está viene esta configuración, tengo que cambiarla para incluir los registros indicados arriba:
SYS(NOTYPE(14:19,62:69,99),EXITS(IEFU83,IEFU84,IEFACTRT,
IEFUSI,IEFUJI,IEFU29),NOINTERVAL,NODETAIL)
En mi caso, quedaría de la siguiente forma:
SYS(NOTYPE(16,17,19,63,65:69,99),EXITS(
IEFU83,IEFU84,IEFACTRT,IEFUSI,IEFUJI,IEFU29),NOINTERVAL,NODETAIL)
SUBSYS(STC,EXITS(IEFU29,IEFU83,IEFU84,IEFUJP,IEFUSO,IEFUJI,IEFACTRT))
SUBSYS(JES2,EXITS(IEFU83,IEFUJI,IEFACTRT))
En el miembro PROGxx y antes de la definición de la LINKLST añadiremos diremos la definición de las EXITS para que hagan uso de los módulos creados anteriormente.
EXIT ADD EXITNAME(SYS.IEFU83) MODNAME(TWSU83)
EXIT ADD EXITNAME(SYS.IEFACTRT) MODNAME(TWSACTRT)
EXIT ADD EXITNAME(SYS.IEFUJI) MODNAME(TWSUJI)
EXIT ADD EXITNAME(SYSSTC.IEFU83) MODNAME(TWSU83)
EXIT ADD EXITNAME(SYSSTC.IEFACTRT) MODNAME(TWSACTRT)
EXIT ADD EXITNAME(SYSSTC.IEFUJI) MODNAME(TWSUJI)
EXIT ADD EXITNAME(SYSJES2.IEFU83) MODNAME(TWSU83)
EXIT ADD EXITNAME(SYSJES2.IEFACTRT) MODNAME(TWSACTRT)
EXIT ADD EXITNAME(SYSJES2.IEFUJI) MODNAME(TWSUJI)
Aprovechamos para añadir la librería de módulos a LNKLST también.
LNKLST ADD NAME(LNKLST00) DSN(TWS950.SEQQLMD0) VOLUME(&SYSP4)
El siguiente paso es añadir el módulo EQQMINON y unos comandos a TSO. Para ello tenemos que editar el miembro IKJTSOxx.
Para saber qué fichero de parámetros estamos usando podemos utilizar el comando: D IKJTSO
Añadimos EQQMINON en AUTHTSF NAMES.
Añadimos los siguientes comandos en AUTHCMD:
BACKUP
BULKDISC
JSUACT
OPINFO
OPSTAT
SRSTAT
WSSTAT
En el miembro SCHEDxx añadimos el siguiente parámetro:
PPT PGMNAME(EQQMAJOR) NOSWAP
Siguiendo el manual de IBM, ahora tendríamos que configurar la seguridad (con RACF, en mi caso). Aún no lo voy a hacer, lo dejaré para una entrada futura si es necesario.
Vamos a ejecutar una serie de jobs que sirven para crear los data sets de configuración que usará el producto.
Empezamos por el job EQQPCS01.
Este job crea varios dataset VSAM y NO-VSAM. Debemos revisar el job y ajustar el espacio de esos dataset para que no nos quedemos sin espacio. De forma opcional, si no usamos SMS, podemos añadir “VOL=SER=xxxxxx” para indicar el disco en los ficheros NO-VSAM.
Tendremos todos los data sets creados.
Seguiremos con el job EQQPCS02. Este job también crea data sets. Debemos revisar el espacio para ajustarlo a lo que necesitemos. Lo ejecutamos y comprobamos que termine correctamente.
El job EQQPCS12 sirve para crear el GDG necesario para la función de intercambio de MLOG.
Terminará correctamente.
El siguiente paso es crear las STC de Controller y Tracker y los ficheros de configuración.
Volvemos a la librería OPC.V950.SAMPJCL y copiamos los miembros EQQCONO y EQQTRA a la PROCLIB del sistema. El miembro EQQCONO será el Controller, con el nombre OPCC. El miembro EQQTRA será el Tracker, con el nombre OPCT.
Ahora editamos el miembro OPCC que acabamos de copiar a la PROCLIB.
Pondremos el nombre de la tarea en la cabecera (OPCC) y el fichero de parámetros que creamos en pasos anteriores (OPCCPARM).
Bajamos un poco y editamos la DD EQQPRLIB para poner la librería correcta.
Ahora editamos el miembro OPCT. Pondremos el nombre de la tarea en la cabecera (OPCT) y el fichero de parámetros que creamos en pasos anteriores (OPCTPARM).
Además, en las DD EQQMLOG, EQQMLOG2 y EQQEVDS, tenemos que poner dos nuevos ficheros que crearemos más adelante. Esto es debido a que no pueden ser compartidos con el Controller.
//EQQMLOG DD DISP=SHR,DSN=OPC.V950.MLOGT
//EQQMLOG2 DD DISP=SHR,DSN=OPC.V950.MLOGT2
//EQQEVDS DD DISP=SHR,DSN=OPC.V950.OPCT.E
Para poder crear los ficheros de parámetros, copiamos los miembros EQQCONOP y EQQTRAP de la SAMPJCL a la librería de parámetros de OPC (en mi caso, OPC.V950.PARM).
Ahora entramos en el miembro EQQCONOP y vamos a crear nuevos miembros con las partes correspondientes del JCL. Usaremos el comando de bloque cc – cc, para copiar las partes que queremos, y el comando CREATE.
Vamos a crear el miembro CONOP. Para ello marcamos con "CC" en la línea que se muestra en la imagen.
Ahora vamos a la línea que se muestra en la imagen y ponemos "CC" otra vez, para cerrar el bloque que queremos copiar, y en la barra de comandos ponemos "CREATE CONOP".
Hacemos lo mismo para crear el miembro STDAR.
Por último, crearemos el miembro CONOB de la misma forma.
Ahora haremos lo mismo con el miembro EQQTRAP.
Haremos lo mismo para crear los miembros STDEWTR y STDJCC.
Renombramos el miembro CONOB a BATCHOPT.
Renombramos el miembro CONOP a OPCCPARM.
Renombramos el miembro TRAP a OPCTPARM.
Entramos a editar el miembro OPCCPARM. Ponemos NFCOPCC en el parámetro NCFAPPL, que será el nombre de nuestra LU del controller.
¡IMPORTANTE! Hay que poner RECOVERY NO, sino se producirá un abend al arrancar el controler más adelante.
Seguimos bajando y ponemos NCFOPCT en el parámetro SNA, para que se comunique con el tracker.
Ahora editamos el miembro OPCTPARM. Ponemos NCFOPCT en el parámetro NCFAPPL, que será el nombre de nuestra LU del tracker.
En el parámetro SNAHOST y ponemos NCFOPCC, para que se comunique con el controller.
Ahora vamos a crear los nodos de VTAM.
La comunicación entre Controller y Tracker la haremos por VTAM. Debemos crearlos en la librería **.VTAMLST correspondiente a nuestro sistema. Para ello, comprobaremos la tarea VTAM en la PROCLIB.
Controller. He creado un miembro llamado AOPCC con los datos de la imagen. El nombre de la aplicación y el ACBNAME debe ser el mismo. En mi caso, el nombre que puse en el fichero de parámetros del controller (OPCCPARM) fue NCFOPCC.
NOTA: Fijaos en la imagen para codificarlo correctamente.
VBUILD TYPE=APPL
NCFOPCC APPL VPACING=10, C
ACBNAME=NFCOPCC
Tracker. He creado un miembro llamado AOPCT con los datos de la imagen. El nombre de la aplicación y el ACBNAME debe ser el mismo. En mi caso, el nombre que puse en el fichero de parámetros del tracker (OPCTPARM) fue NCFOPCT.
NOTA: Fijaos en la imagen para codificarlo correctamente. Si diese algún error del tipo “syntax error” en la línea MODETAB, aseguraros que los espacios están puestos correctamente.
VBUILD TYPE=APPL
NCFOPCT APPL ACBNAME=NCFOPCT, C
MODETAB=EQQLMTAB, C
DLOGMOD=NCFSPARM
Vamos a añadir ambos miembros a la inicialización de VTAM para que arranquen los nodos automáticamente después de un IPL. En mi caso, es el miembro ATCCON00 de la VTAMLST.
Ahora debemos crear la modetab EQQLMTAB en la librería VTAMLIB de nuestro sistema. Para ello, editamos y submitimos el job EQQLMTAB de la librería **.SEQQSKL0.
Añadimos la cabecera del job. También comprobaremos que la librería VTAMLIB de la DD SYSLMOD sea la correcta. Comprobamos que el job termina correctamente.
Ahora vamos a crear el miembro EQQGJCCT, que es la tabla de mensajes del JOB COMPLETION CHECKER. Para ello, entramos a la librería **.SEQQSAMP y editamos el miembro EQQJCCTB. Añadimos una cabecera al job y ajustamos las librerías para adaptarlas a nuestro sistema.
Además, debemos sustituir la primera línea de la SYSIN por la siguiente:
EQQJCCT S=1,T=SKIPSTA,M='IDCAMS SYSTEM SERVICES'
Ejecutamos el job y comprobamos que termina correctamente.
ACCEDER A OPC DESDE ISPF.
Vamos a cambiar el panel de ISPF para añadir una opción acceder a OPC. Para saber el nombre del panel a editar, pondremos el comando “PANELID”.
Añadimos una nueva opción en el panel deseado.
Añadimos la siguiente línea dentro de las opciones:
O,'PANEL(EQQOPCAP) NEWAPPL(EQQA)'
Por último, añadiremos las últimas librerías al procedimiento de logon de TSO.
Añadimos las siguientes líneas en la DD ISPPLIB:
// DD DISP=SHR,DSN=TWS950.SEQQGENU
// DD DISP=SHR,DSN=TWS950.SEQQPENU
En la DD ISPMLIB:
// DD DISP=SHR,DSN=TWS950.SEQQMSG0
En la DD ISPTLIB:
// DD DISP=SHR,DSN=TWS950.SEQQTBL0
Al final del fichero, añadimos tres DD nuevas:
//EQQMLIB DD DISP=SHR,DSN=TWS950.SEQQMSG0
//EQQMLOG DD DISP=SHR,DSN=OPC.V950.MLOG
//EQQTMPL DD DISP=SHR,DSN=TWS950.SEQQLENU
Para que funcione correctamente el intercambio de MLOG, debemos copiar a la PROCLIB el miembro EQQSMLOG de la librería de ejemplos, en mi caso, OPC.V950.SAMPJCL.
Ese procedimiento utiliza como sysin el miembro EQQREPRO de la librería **.SEQQSAMP. Debemos copiarlo de esa librería a la librería de parámetros de OPC, en mi caso, OPC.V950.PARM.
Editamos el BPXPRMxx correspondiente para montar el File System ‘TWS950.ZFS’ en el punto de montaje ‘/usr/lpp/TWS’.
Crearemos dos ficheros MLOG para el tracker ya que no puede compartirlos con el controller.
Las características de los dataset son las mismas que los ficheros MLOG del controller. Los llamaré:
OPC.V950.MLOGT
OPC.V950.MLOGT2
También hay que crear el fichero EV (EQQEVD). Lo llamaré (se puede descargar el job al principio de la entrada):
OPC.V950.OPCT.EV
También hay que crear el directorio de logs que definimos en la configuración anteriormente (/var/TWS950/logs) y montar un ZFS para guardar el contenido (importante incluirlo en el BPXPRMxx correspondiente). Lo haré mediante un job que dejaré al principio de la entrada.
Como no hemos ido activando la configuración de forma dinámica, ahora haré IPL. Además, de esta forma me aseguro de que todas las modificaciones que hecho son correctas.
Podemos verificar que han cargado bien las EXITs de JES2 con los comandos:
$D EXIT(7)
$HASP823 EXIT(7)
$HASP823 EXIT(7) STATUS=ENABLED,ENVIRON=JES2,
$HASP823 ROUTINES=(OPCAENT7),SPLEVEL=CHECK,TRACE=YES,
$HASP823 USECOUNT=0
$D EXIT(51)
$HASP823 EXIT(51)
$HASP823 EXIT(51) STATUS=ENABLED,ENVIRON=JES2,
$HASP823 ROUTINES=(TWSENT51),SPLEVEL=CHECK,TRACE=YES,
$HASP823 USECOUNT=0
Después del IPL, arrancaremos las tareas OPCC y OPCT con los comandos:
S OPCC
S OPCT
El mensaje siguiente es debido a que no tenemos ningún Long-term plan, ni Current Plan creados. Una vez creados, el tracker conectará con el controller. De momento, podemos ignorarlo.
EQQV019E SESSION SETUP FAILED - PLU=NCFOPCC NOT AVAILABLE
Ahora entramos a los paneles de OPC.
Para definir el controller al que nos vamos a conectar, vamos a la opción 0 - Options.
Entramos a la opción 1 – Subsystem.
Marcamos la opción Local “OPC on same MVS”. El nombre del controller es OPCC.
Ya podremos entrar a las diferentes opciones de la herramienta.
Es importante añadir que si hay algún problema en el arranque de las tareas, debermos mirar el fichero OPC.V950.MLOG*. Ahí veremos los errores que se produzcan. Es importante fijarse que el OPC reconoce el sistema como JES2. Esto quiere decir que las EXITs de JES2 (EXIT7 y EXIT51) han cargado bien.
En próximas entradas veremos cómo crear Work Stations, aplicaciones, Long Term Plan, Current Plan, etc.
Espero que os haya gustado y os sirva de ayuda esta demostración de instalación básica de OPC / TWS / IZWS.