IBM Z Workload Scheduler 9.5 - Instalación
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:
Empezaremos localizando las librerías que utilizaremos. En mi caso, empiezan por TWS950.

Crearé un ALIAS relacionado con mi catálogo CATALOG.APL.
//$01ALIAS JOB CLASS=A,MSGCLASS=Q,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//* DEFINIMOS UN ALIAS
//PASO001 EXEC PGM=IDCAMS,REGION=1024K
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEFINE ALIAS (NAME(OPC) -
RELATE(CATALOG.APL)) -
CATALOG(CATALOG.Z25A.MASTER)
/*

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


Configurar librerías en TSO
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
Hay que poner la librería “SKELS” que creamos anteriormente por delante en la concatenación.

Ejecutar EQQJOBS
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=&SYSUIDAjustamos los nombres de las librerías según nuestros requerimientos.

Ajustamos las librerías y 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.

Compilar EXITS de SMF y JES2
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 controlan. Si tuviésemos algún error en el estado de los jobs, habría que revisar estas exits.

Antes de empezar hay que crear una librería “intermedia” donde 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.

Configurar JES2 y PARMLIB
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 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, 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)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 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)
Configurar TSO
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.
Crear datasets de configuración
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.

Crear STCs de Controller y Tracker
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.EV
Crear ficheros de parámetros
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 NCFOPCC 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 controller 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 ponemos NCFOPCC, para que se comunique con el controller.

Configurar VTAM
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.
Fijaos en la imagen para codificarlo correctamente.
VBUILD TYPE=APPL
NCFOPCC APPL VPACING=10, C
ACBNAME=NCFOPCC
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.
Fijaos en la imagen para codificarlo correctamente. Si diese algún error del tipo “syntax error” en la línea MODETAB, aseguraos 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.


Crear tabla de mensajes JCC
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 para 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
Configuración adicional
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é:
- 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).
//$12LOGZF JOB 0,REGION=0M,CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID
//CREATE EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEFINE CLUSTER ( -
NAME(OPC.LOGS.ZFS) -
CYL(50 50) -
STORCLAS(SCBASE) -
LINEAR -
SHAREOPTIONS(3) -
)
/*
// SET ZFSDSN='OPC.LOGS.ZFS'
//FORMAT EXEC PGM=IOEAGFMT,COND=(0,LT),
// PARM='-aggregate &ZFSDSN -compat'
//SYSPRINT DD SYSOUT=*
//*
//MOUNT EXEC PGM=IKJEFT01,COND=(0,LT)
//SYSEXEC DD DISP=SHR,DSN=SYS1.SBPXEXEC
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
PROFILE MSGID WTPMSG
oshell umask 0022; +
mkdir -p /var/TWS950 +
mkdir -p /var/TWS950/logs
MOUNT +
FILESYSTEM('OPC.LOGS.ZFS') +
MOUNTPOINT('/var/TWS950/logs') +
MODE(RDWR) TYPE(ZFS) PARM('AGGRGROW')
/*

Arranque del sistema
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.
Después del IPL, arrancaremos las tareas OPCC y OPCT con los comandos:
S OPCC
S OPCT
El siguiente mensaje 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
En el fichero de MLOG deberíamos ver mensajes como esos que están marcados en la imagen.
Eso indica que las EXITs se han cargado bien.

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.
Espero que os haya gustado y os sirva de ayuda esta demostración de instalación básica de OPC / TWS / IZWS.