Artículo
· 8 ene, 2024 Lectura de 6 min

Cómo iniciar la imagen Docker de InterSystems IRIS con Python

Al empezar el desarrollo con IRIS tenemos un kit de distribución o, en el caso de Docker, obtenemos la imagen Docker y después a menudo tenemos que iniciarla y configurar el entorno de desarrollo. Puede que necesitemos crear bases de datos, namespaces, activar/desactivar algunos servicios, crear recursos. Muchas veces necesitamos importar el código y los datos a la instancia de IRIS y ejecutar algún código personalizado para iniciar la solución.

Lajos Simicska declares war on Viktor Orban: "It's either him or me!" - The  Budapest Beacon

Y hay muchas plantillas en Open Exchange donde sugerimos cómo iniciar REST, Interoperabilidad, Analítica, Fullstack y muchas otras plantillas con ObjectScript. ¿Qué pasa si queremos utilizar sólo Python para configurar el entorno de desarrollo para un proyecto de Python Embebido con IRIS?

El reciente lanzamiento de la plantilla para Python Embebido es la que podéis utilizar como plantilla puramente en Python, que podría ser un punto de partida para los desarrolladores que realizan proyectos en Python sin necesidad de usar y aprender ObjectScript. Este artículo muestra cómo se podría utilizar esta plantilla para iniciar IRIS. ¡Allá vamos!

Creación de base de datos y namespace

Muchas veces necesitamos crear la base de datos y el namespace. Esto se podría hacer con la funcionalidad merge cpf de IRIS, y aquí está el archivo merge que lo hace:

[Actions]

CreateResource:Name=%DB_IRISAPP_DATA,Description="IRISAPP_DATA database"

CreateDatabase:Name=IRISAPP_DATA,Directory=/usr/irissys/mgr/IRISAPP_DATA

CreateResource:Name=%DB_IRISAPP_CODE,Description="IRISAPP_CODE database"

CreateDatabase:Name=IRISAPP_CODE,Directory=/usr/irissys/mgr/IRISAPP_CODE

CreateNamespace:Name=IRISAPP,Globals=IRISAPP_DATA,Routines=IRISAPP_CODE,Interop=1

ModifyService:Name=%Service_CallIn,Enabled=1,AutheEnabled=48

ModifyUser:Name=SuperUser,PasswordHash=a31d24aecc0bfe560a7e45bd913ad27c667dc25a75cbfd358c451bb595b6bd52bd25c82cafaa23ca1dd30b3b4947d12d3bb0ffb2a717df29912b743a281f97c1,0a4c463a2fa1e7542b61aa48800091ab688eb0a14bebf536638f411f5454c9343b9aa6402b4694f0a89b624407a5f43f0a38fc35216bb18aab7dc41ef9f056b1,10000,SHA512

Merge cpf contiene Actions (Acciones) que en este caso crean las bases de datos IRISAPP\_DATA e IRISAPP\_CODE para datos y código respectivamente, el namespace IRISAPP relacionado para acceder a él y los recursos relacionados %IRISAPP\_DATA y %IRISAPP\_CODE" para gestionar el acceso.

Este cpf Merge también permite que el servicio Callin haga funcionar Python Embebido mediante la acción ModifyService:

ModifyService:Name=%Service_CallIn,Enabled=1,AutheEnabled=48

La última acción es un ejemplo de cómo se puede establecer de forma segura la contraseña de un usuario, utilizando la acción ModifyUser:

ModifyUser:Name=SuperUser,PasswordHash=a31d24aecc0bfe560a7e45bd913ad27c667dc25a75cbfd358c451bb595b6bd52bd25c82cafaa23ca1dd30b3b4947d12d3bb0ffb2a717df29912b743a281f97c1,0a4c463a2fa1e7542b61aa48800091ab688eb0a14bebf536638f411f5454c9343b9aa6402b4694f0a89b624407a5f43f0a38fc35216bb18aab7dc41ef9f056b1,10000,SHA512

La contraseña hash aquí puede ser generada mediante otra imagen Docker desde InterSystems, por ejemplo, con la siguiente línea llamada en un terminal (aquí podéis leer más información sobre passwordhash):

docker run --rm -it containers.intersystems.com/intersystems/passwordhash:1.1 -algorithm SHA512 -workfactor 10000

El comando merge se puede llamar en Dockerfile de la siguiente manera:

iris merge IRIS merge.cpf && \

En la documentación se pueden encontrar otros tipos de acciones de merge y diferentes ajustes disponibles para IRIS.

Ejecución de un código de inicio arbitrario

Otro caso de uso común es ejecutar un código personalizado arbitrario para cargar datos, variables de inicio y código de carga desde el repositorio, por ejemplo, en forma de paquete IPM. Normalmente en las plantillas IRIS hay un archivo especial iris.script que contiene ese código en forma de ObjectScript. He mantenido el archivo iris.script en el repositorio sólo para demostrar cómo se utilizó con ObjectScript. 

En esta plantilla de Python se puede encontrar el ejemplo de dicho código de inicio en un archivo iris_script.py. Veamos lo que hay ahí:

import glob

import os

import iris

import pandas as pd

from sqlalchemy import create_engine

from iris import ipm

# switch namespace to the %SYS namespace
iris.system.Process.SetNamespace("%SYS")

# set credentials to not expire
iris.cls('Security.Users').UnExpireUserPasswords("*")

# switch namespace to IRISAPP built by merge.cpf
iris.system.Process.SetNamespace("IRISAPP")

# load ipm package listed in module.xml
#iris.cls('%ZPM.PackageManager').Shell("load /home/irisowner/dev -v")
assert ipm('load /home/irisowner/dev -v')

# load demo data
engine = create_engine('iris+emb:///')

# list all csv files in the demo data folder
for files in glob.glob('/home/irisowner/dev/data/*.csv'):

# get the file name without the extension
table_name = os.path.splitext(os.path.basename(files))[0]

# load the csv file into a pandas dataframe
df = pd.read_csv(files)

# write the dataframe to IRIS
df.to_sql(table_name, engine, if_exists='replace', index=False, schema='dc_demo')

El código es bastante autoexplicativo y tiene la demo de cambio de namespaces, carga del código del repositorio en forma de módulo IPM, importación de archivos csv que se encuentran en la carpeta /data del repositorio utilizando la librería sqlalchemy.

¿Qué hace la plantilla?

Básicamente esta plantilla proporciona ejemplos de cómo se puede utilizar Python Embebido con IRIS.

1. Llamar a Python desde ObjectScript

Para demostrarlo tenemos varias clases ObjectScript en el repositorio.

Para probar el enfoque, hay que abrir el terminal de IRIS y ejecutar:

IRISAPP>d ##class(dc.python.test).Hello()

World

Esta prueba demuestra cómo se pueden utilizar funciones en el código sample.py en IRIS utilizando Python Embebido.

2. Acceder a IRIS desde Python

Para probar esto, se puede ejecutar irisapp.py, que realiza diferentes operaciones con la base de datos IRIS. Para ejecutar todas las pruebas, hay que iniciar sesión en un terminal en Docker:

# attach to the running IRIS container

docker-compose exec iris bash

# run the script

$ irispython ./python/irisapp.py

3. Crear una API REST en Python con Flask, que funcione con IRIS

También hay un ejemplo de api REST en Python hecho con Flask, que podéis utilizar en vuestras aplicaciones y que podéis encontrar en /python/flask/app.py

Para iniciar la api REST de Flask hay que hacer:

$ docker-compose exec iris bash

# irispython /python/flask/app.py

A continuación, se puede probar el servidor en http://localhost:55030/.

Y aquí hay dos ejemplos sobre cómo añadir un nuevo registro en IRIS y leer un registro:

POST http://localhost:55030/persistentclass

Content-Type: application/json

Accept: application/json

{

"test": "toto"

}

Result:

json

{

"id": 1,

"test": "toto"

}


GET http://localhost:55030/persistentclass/1

Accept: application/json

Result:

json

{

"id": 1,

"test": "toto"

}

4. Despliegue

El despliegue de la solución en los sistemas IRIS se puede realizar mediante IPM. Para ello disponemos de un IPM module.xml que entregará archivos ObjectScript y Python a un sistema IRIS de destino desde un Registro IPM en el que publicará el módulo.

Muchas gracias a @Guillaume Rongier y @Dmitry Maslennikov que ayudaron mucho a crear la plantilla e hicieron posible el enfoque "Pure Python".

Hay enfoques más "radicales" en la organización de tales plantillas - esta es la muestra "sin dockerfile" y "sin objectscript" de @Dmitry Maslennikov, y esta es la plantilla "embedded python" de @Guillaume Rongier.

.

Comentarios (0)1
Inicie sesión o regístrese para continuar