Cómo desplegar una app en Cloud Foundry

Introducción

En esta entrada voy a explicar como desplegar una aplicación basada en Spring en la plataforma Cloud Foundry. Para ello utilizaremos nuestro entorno Cloud Foundry local.

La aplicación pong_matcher_spring que vamos a utilizar como ejemplo requiere el servicio mysql en nuestra instancia Cloud Foundry, para instalarlo podemos seguir la guía cómo instalar el servicio mysql en Cloud Foundry.

 

Creando organización y espacio

En Cloud Foundry las aplicaciones se despliegan en espacios (spaces) que a su vez se encuentran agrupadas en organizaciones (orgs).

Las organizaciones son cuentas personales ó empresariales creadas en la plataforma de Cloud Foundry desde las que se pueden gestionar las aplicaciones y servicios pertenecientes a la organización. Los espacios se corresponden con las aplicaciones o servicios desplegados en dicha organización. La relación entre organizaciones y espacios es 1:N, es decir, una organización puede tener múltiples espacios mientras que un espacio pertenece a una organización.

A modo de ejemplo vamos a crear una organización que vamos a llamar dmunozfer.es y un espacio llamado dev-deploy-test-app en el que desplegaremos nuestras aplicaciones.

# Establecemos la conexión con la API
$ cf api --skip-ssl-validation https://api.bosh-lite.com
Estableciendo un punto final de API en https://api.bosh-lite.com...
Aceptar

                            
Punto final de la API:   https://api.bosh-lite.com (Versión de la API: 2.52.0)   
No está conectado. Utilice 'cf login' para iniciar la sesión.
# Nos autenticamos
$ cf login
Punto final de la API: https://api.bosh-lite.com

Email> admin

Password> 
Autenticando...
Aceptar


                            
Punto final de la API:   https://api.bosh-lite.com (Versión de la API: 2.52.0)   
Usuario:                 admin   
No se ha colocado como destino ninguna organización ni espacio; utilice 'cf target -o ORG -s SPACE'
# Creamos la organización dmunozfer.es
$ cf create-org dmunozfer.es
Creando la organización dmunozfer.es como admin...
Aceptar

Asignación de rol OrgManager al usuario admin en la organización dmunozfer.es ...
Aceptar

CONSEJO: Utilice 'cf target -o dmunozfer.es' para dirigirse a una organización nueva
# Comprobamos que la organización se creó correctamente
$ cf orgs
Obteniendo organizaciones como admin...

nombre  
dmunozfer.es 

Ahora que tenemos creada la organización es el momento de crear el espacio.

# Seleccionamos la organización dmunozfer.es
$ cf target -o dmunozfer.es
                            
Punto final de la API:   https://api.bosh-lite.com (Versión de la API: 2.52.0)   
Usuario:                 admin   
Organización:            dmunozfer.es   
Espacio:                 No se ha colocado como destino ningún espacio, utilice 'cf target -s SPACE' 
# Creamos el espacio
$ cf create-space dev-deploy-test-app
Creando el espacio dev-deploy-test-app en la organización dmunozfer.es como admin...
Aceptar
Asignación de rol SpaceManager al usuario admin en la organización dmunozfer.es / espacio dev-deploy-test-app como admin...
Aceptar
Asignación de rol SpaceDeveloper al usuario admin en la organización dmunozfer.es / espacio dev-deploy-test-app como admin...
Aceptar

CONSEJO: Utilice 'cf target -o "dmunozfer.es" -s "dev-deploy-test-app"' para dirigirse a un espacio nuevo
# Seleccionamos el espacio que acabamos de crear
$ cf target -o dmunozfer.es -s dev-deploy-test-app
                            
Punto final de la API:   https://api.bosh-lite.com (Versión de la API: 2.52.0)   
Usuario:                 admin   
Organización:            dmunozfer.es   
Espacio:                 dev-deploy-test-app

En este punto ya tenemos preparado nuestro entorno Cloud Foundry con nuestra propia organización dmunozfer.es y espacio dev-deploy-test-app en el que desplegaremos la aplicación de ejemplo.

 

Configurando servidor Cloud Foundry en Eclipse

Para realizar el despliegue de las aplicaciones en la plataforma de Cloud Foundry vamos a utilizar el Eclipse Mars R2 con el plugin Eclipse Tools for Cloud Foundry, para instalarlo únicamente tenemos que arrastar el botón Install a la barra de herramientas de nuestro eclipse (la versión que se me ha instalado es la 1.0.M6). Una vez instalado el plugin el eclipse se reiniciará.

Desde la vista de servidores en Eclipse (Window->Show View->Server) pulsamos con el botón derecho y seleccionamos New-> Server.

tutorial-desplegar-cf-01

Seleccionamos Pivotal->Cloud Foundry e introducimos un nombre del servidor, en nuestro caso lo llamaremos Local Cloud Foundry y pulsamos Next.

tutorial-desplegar-cf-02

Pulsamos el botón Manage Cloud para añadir los datos de conexión a la instancia local de Cloud Foundry.

tutorial-desplegar-cf-03

Pulsamos Add e introducimos un nombre Local Cloud Foundry y la URL de nuestro entorno Cloud Foundry local https://api.bosh-lite.com.

tutorial-desplegar-cf-04

Seleccionamos la nueva entrada que acabamos de crear y pulsamos el botón OK.

tutorial-desplegar-cf-05

Introducimos los datos de autenticación, en nuestro caso será admin y pulsamos el botón Validate Account para comprobar que todo está correcto. Una vez comprobado que tanto la conexión como la autenticación son correctas pulsamos el botón Finish.

tutorial-desplegar-cf-06

 

Importando aplicación ejemplo en workspace

Vamos a importar en Eclipse la aplicación de ejemplo Pong Matcher Spring para desplegarla en nuestro entorno de Cloud Foundry.

Importamos el proyecto utilizando el plugin de Git, seleccionamos en el menú File->Import->Check out Maven projects from SCM.

tutorial-desplegar-cf-07
Añadimos el plugin egit para m2e en caso de no tenerlo, para eso pulsamos sobre el enlace m2e Marketplace, escribimos egit y seleccionamos el plugin m2e-egit. Pulsamos el botón Finish.
tutorial-desplegar-cf-08
A continuación aparecerán las típicas pantallas de instalación de plugins de eclipse, pulsar Next y aceptamos los términos. Al finalizar la instalación se cerrará la ventana y se reiniciará el eclipse.

Volvemos a seleccionar en el menú File->Import->Check out Maven projects from SCM. Ahora aparecerá la opción git en el desplegable SCM, la seleccionamos y pegamos la url https://github.com/cloudfoundry-samples/pong_matcher_spring.git. Pulsamos el botón Finish.
tutorial-desplegar-cf-09

El proyecto se descargará a nuestro workspace y aparecerá en el explorador de archivos.
tutorial-desplegar-cf-10

Pulsamos con el botón derecho en el proyecto pong-matcher-spring y seleccionamos la opción Configure->Enable as Cloud Foundry App
tutorial-desplegar-cf-11

 

Desplegando aplicación en Cloud Foundry

Ahora que ya tenemos importada y preparada la aplicación Pong Matcher Spring vamos a desplegarla en nuestro entorno de Cloud Foundry.

Hacemos doble click en el servidor Local Cloud Fondry.
tutorial-desplegar-cf-12

Se abrirá el panel de configuración de la instancia de Cloud Foundry. Vamos a añadir el servicio mysql necesario para que funcione nuestra aplicación, para ello pulsamos el botón Add Service indicado en la siguiente imagen.
tutorial-desplegar-cf-13

Si hemos instalado el servicio MySQL nos aparece en el listado de servicios disponibles. Hacemos doble click sobre el servicio p-mysql y nos aparecerá en la parte derecha de la pantalla, configuramos el plan y le ponemos como nombre mysql. Pulsamos Finish.
tutorial-desplegar-cf-14

No aparecerá el servicio mysql en el listado de servicios. Antes de desplegar la aplicación debemos compilarla y generar los binarios, para ello pulsamos con el botón derecho en el proyecto pong-matcher-spring y seleccionamos la acción Run As->Maven install.

Una vez compilada la aplicación procedemos a desplegarla. Pulsamos el botón Add/Remove Applications.
tutorial-desplegar-cf-15

Hacemos doble click sobre la aplicación pong-matcher-spring para añadirla al despliegue, la aplicación aparecerá en el listado de la derecha. Pulsamos Finish.
tutorial-desplegar-cf-16

Nos aparecerán unas pantallas en las que podemos configurar algunos de los aspectos de despliegue de la aplicación. En nuestro caso vamos a dejar todas las configuraciones con los valores por defecto.
tutorial-desplegar-cf-17

tutorial-desplegar-cf-18

tutorial-desplegar-cf-19

tutorial-desplegar-cf-20

Si todo ha ido bien nos aparecerá en la consola el siguiente mensaje:
tutorial-desplegar-cf-21

¡¡Ya tenemos la aplicación desplegada!! 😀

 

Probando la aplicación

La aplicación es una API REST por lo que para probarla tendremos que hacer peticiones HTTP a nuestra aplicación. Para realizar las peticiones vamos a utilizar la herramienta curl.

Configuremos la variable $HOST para que apunte a la URL de nuestra aplicación desplegada en la instancia de Cloud Foundry.

$ export HOST=http://springpong.bosh-lite.com

Inicializamos la base de datos y la limpiamos de los datos que pudiese tener de pruebas anteriores.

$ curl -v -X DELETE $HOST/all
*   Trying 10.244.0.34...
* Connected to springpong.bosh-lite.com (10.244.0.34) port 80 (#0)
> DELETE /all HTTP/1.1
> Host: springpong.bosh-lite.com
> User-Agent: curl/7.43.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Length: 0
< Date: Thu, 24 Mar 2016 18:00:09 GMT
< Server: Apache-Coyote/1.1
< X-Vcap-Request-Id: 1956453f-5294-4a51-66f2-734211f744c9
< 
* Connection #0 to host springpong.bosh-lite.com left intact

Vamos a realizar una solicitud de partido para el jugador dmunozfer

$ curl -v -H "Content-Type: application/json" -X PUT $HOST/match_requests/dmunozfer1 -d '{"player": "dmunozfer"}'
*   Trying 10.244.0.34...
* Connected to springpong.bosh-lite.com (10.244.0.34) port 80 (#0)
> PUT /match_requests/dmunozfer1 HTTP/1.1
> Host: springpong.bosh-lite.com
> User-Agent: curl/7.43.0
> Accept: */*
> Content-Type: application/json
> Content-Length: 23
> 
* upload completely sent off: 23 out of 23 bytes
< HTTP/1.1 200 OK
< Content-Type: application/json;charset=UTF-8
< Date: Fri, 25 Mar 2016 13:49:18 GMT
< Server: Apache-Coyote/1.1
< X-Vcap-Request-Id: 46c8d1f7-05de-4883-5486-8ef364bb7c9a
< Content-Length: 47
< 
* Connection #0 to host springpong.bosh-lite.com left intact
{"uuid":"dmunozfer1","requesterId":"dmunozfer"}

Realizamos una segunda petición de partido con el usuario rafa nadal

$ curl -v -H "Content-Type: application/json" -X PUT $HOST/match_requests/rafanadal1 -d '{"player": "rafa_nadal"}'
*   Trying 10.244.0.34...
* Connected to springpong.bosh-lite.com (10.244.0.34) port 80 (#0)
> PUT /match_requests/rafanadal1 HTTP/1.1
> Host: springpong.bosh-lite.com
> User-Agent: curl/7.43.0
> Accept: */*
> Content-Type: application/json
> Content-Length: 24
> 
* upload completely sent off: 24 out of 24 bytes
< HTTP/1.1 200 OK
< Content-Type: application/json;charset=UTF-8
< Date: Fri, 25 Mar 2016 13:49:38 GMT
< Server: Apache-Coyote/1.1
< X-Vcap-Request-Id: e3b672e4-72ea-44ef-4dc5-cc1ea220218b
< Content-Length: 48
< 
* Connection #0 to host springpong.bosh-lite.com left intact
{"uuid":"rafanadal1","requesterId":"rafa nadal"}

Ahora comprobamos si tenemos asignado un partido para la primera solicitud que hicimos con dmunozfer

$ curl -v -X GET $HOST/match_requests/dmunozfer1
*   Trying 10.244.0.34...
* Connected to springpong.bosh-lite.com (10.244.0.34) port 80 (#0)
> GET /match_requests/dmunozfer1 HTTP/1.1
> Host: springpong.bosh-lite.com
> User-Agent: curl/7.43.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: application/json;charset=UTF-8
< Date: Fri, 25 Mar 2016 13:50:16 GMT
< Server: Apache-Coyote/1.1
< X-Vcap-Request-Id: fcca0c2e-78e0-45a8-7cbe-13db3b244c4d
< Content-Length: 90
< 
* Connection #0 to host springpong.bosh-lite.com left intact
{"match_id":"093b9647-01c7-4951-a341-a4d017e67722","id":"dmunozfer1","player":"dmunozfer"}

¡Perfecto! ya tenemos asignado un partido... vamos a enviar los resultados del encuentro.

$ curl -v -H "Content-Type: application/json" -X POST $HOST/results -d '
> {
>     "match_id":"106c6d38-ebdd-42ba-a71c-2c1bca5899b2",
>     "winner":"rafa_nadal",
>     "loser":"dmunozfer"
> }'
*   Trying 10.244.0.34...
* Connected to springpong.bosh-lite.com (10.244.0.34) port 80 (#0)
> POST /results HTTP/1.1
> Host: springpong.bosh-lite.com
> User-Agent: curl/7.43.0
> Accept: */*
> Content-Type: application/json
> Content-Length: 110
> 
* upload completely sent off: 110 out of 110 bytes
< HTTP/1.1 201 Created
< Content-Type: application/json;charset=UTF-8
< Date: Fri, 25 Mar 2016 13:57:03 GMT
< Server: Apache-Coyote/1.1
< X-Vcap-Request-Id: 899d2c8e-e161-45b2-6c43-a64ce4e748bb
< Content-Length: 93
< 
* Connection #0 to host springpong.bosh-lite.com left intact

Sí, he perdido contra Rafa Nadal... ¡qué cosas pasan!

A pesar de este pequeño sinsabor ante la derrota final la entrada ha sido bastante productiva: hemos visto cómo configurar la organización y el espacio en Cloud Foundry, cómo configurar el servidor CF en eclipse, cómo importar desde GitHub un proyecto al Eclipse y cómo desplegar una aplicación en Cloud Foundry. No está nada mal ¿no?

Sobre el autor

Apasionado de las tecnologías, entusiasta del desarrollo de software. Especializado en Java EE. Cofundador de www.logrosxbox.com.