La semana pasada estábamos barajando diferentes enfoques para un prototipo en el que queríamos usar HANA como backend. Hubo un momento en el que discutíamos sobre las distintas opciones que teníamos para ese HANA:
- Montar un HANA express On-premise: en mi opinión está era la mejor opción pero la descartamos por no ser una solución cloud. Haremos un post específico sobre su despliegue en una máquina virtual y su integración con la plataforma SCP.
- La segunda opción era utilizar el HANA como servicio de NEO de SCP manejando los datos por Odata. Esta fue la opción que finalmente montamos. Algo realmente sencillo y rápido una vez das los clicks adecuados.
- Y la tercera opción era quizás la más compleja y que descartamos cuando ya la teníamos montada. Utiliza una instancia HANA en Cloud Foundry con una applicación multi target.
Esta tercera opción la descartamos porque para lo que queríamos resultó ser excesivamente compleja. en cuanto a arquitectura. Sin embargo, es un ejemplo muy didáctico, muy útil en muchos casos y además me crucé con un problema que me trajo de cabeza y que quería anotar aquí. Por un lado para poder revisarlo en un futuro y por otro porque seguro que le ha pasado a mucha más gente y no he encontrado mucha información al respecto en la red para solucionarlo. Se trata de cómo (cómo demonios!), cómo desplegar un servicio Odata asociado a un HANA con una cuenta SCP trial! Sobre una cuenta SCP productiva no está este «error» pero sobre una trial si. Vamos a ver el proceso con un poco de detalle solo.
Doy por sentado que tenemos una cuenta trial en la plataforma y que tenemos la configuración por defecto de organización, espacio y plan en Cloud Foundry.
Si no estás familiarizado con el servicio de SAP HANA disponible en el Cloud Foundry de SAP Cloud Platform pero te interesa el tema, te recomiendo que eches un vistazo a esta ayuda oficial de SAP.
En primer lugar accedemos al servicio SAP HANA Schemas & HDI Containers (Trial) – Overview y creamos la instancia HDI si es que no la teníamos ya.


Sin entrar en muchos detalles, el HDI o HANA Deployment Infrastructure, es una capa sobre la base de datos HANA que simplifica el despliegue de tablas y otros objetos. Representa una capa adicional de abstracción sobre el esquema de la base de datos al introducir el concepto de contenedores dependientes de ejecución asociados al usuario. En este pequeño tutorial de SAP puede verse este concepto en detalle.
En mi ejemplo, he creado en HDI una pequeña tabla con solo tres campos.

Mi aplicación está construida en el SAP WebIDE con el wizard para SAP HANA Database Application.

Aquí creamos un módulo Node.js para poder exponer la tabla como un servicio Odata.
Ojo: Es necesario habilitar el soporte XSJS para utilizar el servicio como Odata.



Ahora crearemos un recurso Odata para poder exponer como servicio nuestra tabla.


Ahora ya puedo construir el fichero multitarget.


Por último es necesario configurar el fichero mta.yaml donde indicamos que recursos necesita utilizar nuestra aplicación. Lo hacemos con la ayuda del MTA Editor.

Hasta aquí todo normal. Hay muchos ejemplos en la red de este tipo de aplicaciones con la metodología CAP (Cloud Application Programming model).
El siguiente paso aquí es desplegar nuestra aplicación en Cloud Foundry.

Pero el despliegue dar un error… Y aquí es donde me volví loco porque no había manera de desplegar la aplicación…

Decía Einstein que “Locura es hacer lo mismo una y otra vez esperando obtener resultados diferentes”… pues algo así hice yo los primeros minutos… desplegar y desplegar con el mismo error.

Finalmente leí bien el log detenidamente y vi que está indicando que el nombre del servicio no coincide con el esperado. En concreto el mensaje dice: “Error determining actions to execute on service «hdi_db»: Service described by MTA resource «hdi_db» of type [hana/hdi-shared] does not match already existing service «hdi_db» of type [hanatrial/hdi-shared] and needs to be recreated.”
Y ahí está el problema. En una cuenta SCP trial nuestra servicio HANA es de tipo hanatrial, podemos verlo en la instancia en SCP CF:

¿Bueno, y ahora qué? ¿Cómo se soluciona esto? Pues tenemos que indicar esta información a nuestra aplicación MTA. Primero abrimos el fichero mta.yaml con el editor de código y añadiremos la etiqueta con el nombre de nuestro servicio.


Después tenemos que volver a construir y desplegar.

Y ahora si hemos conseguido desplegar nuestra aplicación con éxito. Podemos verlo en el cockpit de CF junto con el binding a nuestra base de datos.


Nuestra MTA está funcionando, podemo probar el servicio Odata desde el navegador:

Listo! Ya tenemos funcionando nuestro servicio Odata sobre un HDI de HANA en cuenta SAP Cloud Platform de Cloud Foundry.
