Hola desarrolladores,
En el artículo anterior, describimos cómo utilizar config-api para configurar IRIS.
Ahora, vamos a intentar combinar la biblioteca con el cliente ZPM.
El objetivo es cargar un documento de configuración durante zpm install
en la configure phase
.
Para realizar este ejercicio, hay un repositorio de plantillas disponible aquí (está basado en objectscript-docker-template).
Tratamos de:
- Crear una base de datos
MYAPPDATA
. - Configurar el mapeo de Globals para
dc.PackageSample.*
. - Añadir un usuario llamado
SQLUserRO
con acceso a la función SQL de solo lectura. - Añadir una configuración SSL denominada
SSLAppDefault
. - Crear una aplicación REST
/rest/myapp
.
El archivo de configuración iris-config.json
se encuentra en el subdirectorio config-api
. Es una plantilla vacía que se puede completar con el siguiente contenido:
{
"Security.Roles":{
"MyRoleRO" : {
"Descripion" : "SQL Read Only Role for dc_PackageSample schema.",
"Resources" : "%Service_SQL:U",
"GrantedRoles" : "%SQL"
}
},
"Security.SQLPrivileges": [{
"Grantee": "MyRoleRO",
"PrivList" : "s",
"SQLObject" : "1,dc_PackageSample.*"
}],
"Security.SQLAdminPrivilegeSet" : {
"${namespace}": [
]
},
"Security.Users": {
"${sqlusr}": {
"Name":"${sqlusr}",
"Password":"$usrpwd$",
"AccountNeverExpires":true,
"AutheEnabled":0,
"ChangePassword":false,
"Comment":"Demo SQLUserRO",
"EmailAddress":"",
"Enabled":true,
"ExpirationDate":"",
"FullName":"Demo SQLUserRO",
"NameSpace":"${namespace}",
"PasswordNeverExpires":false,
"PhoneNumber":"",
"PhoneProvider":"",
"Roles":"MyRoleRO",
"Routine":""
}
},
"Security.SSLConfigs": {
"SSLAppDefault":{}
},
"Security.Applications" : {
"/rest/myapp": {
"NameSpace" : "${namespace}",
"Enabled" : 1,
"DispatchClass" : "Your.Dispatch.class",
"CSPZENEnabled" : 1,
"AutheEnabled": 32
}
},
"SYS.Databases":{
"${mgrdir}myappdata" : {
"ExpansionSize":64
}
},
"Databases":{
"MYAPPDATA" : {
"Directory" : "${mgrdir}myappdata"
}
},
"MapGlobals":{
"${namespace}": [{
"Name" : "dc.PackageSample.*",
"Database" : "MYAPPDATA"
}]
},
"Library.SQLConnection": {
}
}
Puedes ver el uso de ${namespace}
, ${mgrdir}
. Se trata de variables predefinidas y se evaluarán en el tiempo de ejecución con el namespace actual y el directorio de IRIS mgr. Otras variables predefinidas son:
${cspdir}
: subdirectorio CSP en el directorio de instalación de IRIS.${bindir}
: directorio bin$SYSTEM.Util.BinaryDirectory()
${libdir}
: subdirectorio LIB en el directorio de instalación de IRIS.${username}
: nombre de usuario actual$USERNAME
${roles}
: funciones actuales otorgadas$ROLES
Además, utilizamos ${sqlusr}
, no es una variable predefinida y debemos establecer el valor desde module.xml
. Realmente no lo necesitamos, pero es solo para demostrar cómo los desarrolladores pueden definir y establecer variables desde modules.xml y transmitirlas al archivo de configuración.
Para ayudarte a crear tu propio archivo de configuración, una guía rápida ([cheat sheet config-api.md
])(https://github.com/lscalese/objectscript-docker-template-with-config-api...) también está disponible en el repositorio de plantillas.
El archivo de configuración ya está listo, el siguiente paso es el archivo module.xml
.
Tenemos que:
- Añadir el módulo
config-api
como una dependencia. - Invocar un método para cargar nuestro archivo de configuración
./config-api/iris-config.json
con el argumento${sqlusr}
.
<?xml version="1.0" encoding="UTF-8"?>
<Export generator="Cache" version="25">
<Document name="objectscript-template-with-config-api.ZPM">
<Module>
<Name>objectscript-template-with-config-api</Name>
<Version>0.0.1</Version>
<Packaging>module</Packaging>
<FileCopy Name="config-api/" InstallDirectory="${libdir}config-api/"/>
<Invoke Class="Api.Config.Services.Loader" Method="LoadFromInvoke">
<Arg>${root}config-api/iris-config.json</Arg>
<Arg>sqlusr</Arg>
<Arg>SQLUserRO</Arg>
</Invoke>
<SourcesRoot>src</SourcesRoot>
<Resource Name="dc.PackageSample.PKG"/>
<Dependencies>
<ModuleReference>
<Name>config-api</Name>
<Version>1.0.0</Version>
</ModuleReference>
</Dependencies>
</Module>
</Document>
</Export>
Echa un vistazo a la etiqueta Invoke:
<Invoke Class="Api.Config.Services.Loader" Method="LoadFromInvoke">
<Arg>${root}config-api/iris-config.json</Arg>
<Arg>sqlusr</Arg>
<Arg>SQLUserRO</Arg>
</Invoke>
El primer argumento es la ruta al archivo de configuración, ${root}
contiene el directorio del módulo usado por zpm durante la implementación.
Después de eso, todos los demás argumentos deben emparejarse. En primer lugar, una cadena con el nombre de la variable seguido del valor relacionado.
En nuestro ejemplo sqlusr
para la variable ${sqlusr}
seguido del valor SQLUserRO
.
Puedes pasar tantos argumentos emparejados como necesites.
Ten en cuenta que hay una etiqueta FileCopy: <FileCopy Name="config-api/" InstallDirectory="${libdir}config-api/"/>
Esta etiqueta existe solo para forzar al zpm a empaquetar el archivo de configuración. Deberíamos agregar una etiqueta Invoke para eliminar el directorio que se va a limpiar, así:
<Invoke Class="%File" Method="RemoveDirectoryTree">
<Arg>${libdir}config-api/</Arg>
</Invoke>
Module.xml está listo, es hora de probarlo. Compila e inicia el contenedor docker-compose up -d --build
.
Deberías ver estos registros durante la fase de configuración:
[objectscript-template-with-config-api] Configure START
2021-04-08 19:24:43 Load from file /opt/irisbuild/config-api/iris-config.json ...
2021-04-08 19:24:43 Start load configuration
2021-04-08 19:24:43 {
"Security.Roles":{
"MyRoleRO":{
"Descripion":"SQL Read Only Role for dc_PackageSample schema.",
"Resources":"%Service_SQL:U",
"GrantedRoles":"%SQL"
}
},
"Security.SQLPrivileges":[
{
"Grantee":"MyRoleRO",
"PrivList":"s",
"SQLObject":"1,dc_PackageSample.*"
}
],
"Security.SQLAdminPrivilegeSet":{
"USER":[
]
},
"Security.Users":{
"SQLUserRO":{
"Name":"SQLUserRO",
"Password":"$usrpwd$",
"AccountNeverExpires":true,
"AutheEnabled":0,
"ChangePassword":false,
"Comment":"Demo SQLUserRO",
"EmailAddress":"",
"Enabled":true,
"ExpirationDate":"",
"FullName":"Demo SQLUserRO",
"NameSpace":"USER",
"PasswordNeverExpires":false,
"PhoneNumber":"",
"PhoneProvider":"",
"Roles":"MyRoleRO",
"Routine":""
}
},
"Security.SSLConfigs":{
"SSLAppDefault":{
}
},
"Security.Applications":{
"/rest/myapp":{
"NameSpace":"USER",
"Enabled":1,
"DispatchClass":"Your.Dispatch.class",
"CSPZENEnabled":1,
"AutheEnabled":32
}
},
"SYS.Databases":{
"/usr/irissys/mgr/myappdata":{
"ExpansionSize":64
}
},
"Databases":{
"MYAPPDATA":{
"Directory":"/usr/irissys/mgr/myappdata"
}
},
"MapGlobals":{
"USER":[
{
"Name":"dc.PackageSample.*",
"Database":"MYAPPDATA"
}
]
},
"Library.SQLConnection":{
}
}
2021-04-08 19:24:43 * Security.Roles
2021-04-08 19:24:43 + Create MyRoleRO ... OK
2021-04-08 19:24:43 * Security.SQLPrivileges
2021-04-08 19:24:43 + Create {"Grantee":"MyRoleRO","PrivList":"s","SQLObject":"1,dc_PackageSample.*"} ... OK
2021-04-08 19:24:43 * Security.SQLAdminPrivilegeSet
2021-04-08 19:24:43 * Security.Users
2021-04-08 19:24:43 + Create SQLUserRO ... OK
2021-04-08 19:24:43 * Security.SSLConfigs
2021-04-08 19:24:43 + Create SSLAppDefault ... OK
2021-04-08 19:24:43 * Security.Applications
2021-04-08 19:24:43 + Create /api/config ... OK
2021-04-08 19:24:43 * SYS.Databases
2021-04-08 19:24:43 + Create /usr/irissys/mgr/myappdata ... OK
2021-04-08 19:24:43 * Databases
2021-04-08 19:24:43 + Create MYAPPDATA ... OK
2021-04-08 19:24:44 * MapGlobals
2021-04-08 19:24:44 + Create USER dc.PackageSample.* ... OK
2021-04-08 19:24:44 * Library.SQLConnection
[objectscript-template-with-config-api] Configure SUCCESS
Tu configuración se aplicó y el archivo de configuración se empaquetará cuando se publique. Puedes comprobarlo en el Portal de administración.
¡Gracias!