En este blog les voy a proponer una solución técnica que utilicé en mi último proyecto para mantener “transportes” entre varios paquetes de entorno en el mismo inquilino de SAP Cloud Integration.
El problema, que a menudo se encuentra en los proyectos, surge cuando un inquilino de SAP Cloud Integration necesita admitir múltiples entornos. Hay situaciones en las que los clientes suelen hospedar entornos DEV y TEST en el mismo inquilino de Cloud Integration. El desafío proviene de tener todos los paquetes de entornos sincronizados con riesgos y esfuerzo mínimos. En este problema, las herramientas de SAP no pueden ayudarnos, es decir (transporte basado en archivos, transporte a través de CTS+, transporte a través de SAP Cloud Transport Management).
Manejo de múltiples entornos en el mismo arrendatario de SAP Cloud Integration
Antes de comenzar a hablar sobre la sincronización de paquetes en el mismo inquilino de SAP Cloud Integration, creo que es muy importante subrayar la idea de tener un procedimiento establecido que debe seguir durante todo el proyecto.
Desde mi experiencia, me resulta muy fácil caer en la tentación de cambiar «pequeñas cosas», especialmente en las fases de prueba SIT y UAT, directamente en el paquete de interés y después de desbloquear las pruebas para modificar también en DEV. Pero este tipo de enfoque a largo plazo se traduce en congelar el paquete DEV y los paquetes de prueba para servir en el desarrollo y la prueba al mismo tiempo.
Incluso si tenemos que mantener varios entornos en el mismo arrendatario de SAP Cloud Integration o no, es importante tener en cuenta que el paquete DEV se usa solo para desarrollo y todos los cambios se realizan en este paquete y paquetes de PRUEBA (no no importa cuántos sistemas de prueba haya) se usarán solo para probar y no realizar cambios en estos paquetes.
Volviendo a la sincronización de paquetes en el mismo SAP Cloud Integration, una opción podría ser descargar el flujo de integración localmente, cambiar manualmente las ID del archivo de manifiesto y luego importar los cambios en el paquete de destino. Este enfoque manual no es una solución viable, pero es importante para comprender el proceso.
Cambios necesarios en el archivo de manifiesto
Cargar cambios en la integración de prueba
Con esta técnica, estará 100% seguro de que todos los cambios realizados en DEV irán al paquete TEST. Pero como probablemente piense, este proceso lleva mucho tiempo y, por supuesto, requiere la máxima atención para preparar el archivo.
Ok, se ve bien, pero ¿por qué necesito esto? ¿Por qué no simplemente eliminar el antiguo flujo de integración de PRUEBA y copiar la nueva versión de DEV? La respuesta es porque normalmente el Flujo de Integración tiene parámetros configurables y una vez que haces una nueva copia, es necesario cambiar los parámetros DEV a TEST. Esto lleva mucho tiempo y requiere, nuevamente, la máxima atención para verificarlos todos.
Al utilizar este enfoque, el flujo de integración se actualizapor lo que las configuraciones siguen siendo las mismas y lo único que debe hacer el usuario final es presionar el botón «Desplegar“. Así de sencillo, ¿verdad?
El proceso manual es una opción, pero aún no se puede usar en un proyecto real donde tiene muchas interfaces y los cambios se realizan con frecuencia en su paisaje. Al final, el desarrollador decidirá realizar los cambios directamente en el entorno donde el equipo realiza las pruebas, para ahorrar tiempo. El control de versiones se destruirá y los cambios se realizarán manualmente en múltiples Iflows.
Después de una breve verificación en API Business Hub, encontré Contenido de integración colección API. Esta colección tiene todo lo que necesito para transformar el proceso manual en algo que pueda usar en mi proyecto. Al combinar el proceso manual con la colección de API, decidí crear un Iflow de SAP Cloud Integration que hará el trabajo. Utilicé SAP Cloud Platform Integration para eliminar el problema de hospedaje y el problema se redujo al crear una interfaz de usuario que recibe algunas claves de búsqueda del usuario final, realiza llamadas API estándar y envía un mensaje de respuesta.
A continuación se detallan los pasos principales que debe tener el flujo de integración:
OBTENGA https://
Message replaceIflowID(Message message) {
def input = message.getBody(java.io.InputStream);
def SourceIflowID = message.getProperty("SourceIflowID");
def TargetIflowID = message.getProperty("TargetIflowID");
if(SourceIflowID == null || TargetIflowID == null){
return input
}
MyZIP zipstream = new MyZIP(input);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(out);
ZipEntry entry = null
isFound = false
def StringSource = ""
def stringPath=""
while ((entry = zipstream.getNextEntry()) != null) {
if(entry.getName().length()> 11 && entry.getName()[-11..-1] == """MANIFEST.MF"""){
zos.putNextEntry(new ZipEntry(entry.getName()));
def text = zipstream.text;
text = removeSpace(text);
text = replaceImportantValue(text,SourceIflowID.toString(), TargetIflowID.toString())
zos.write(text.getBytes());
}
else{
zos.putNextEntry(new ZipEntry(entry.getName()));
zos.write(zipstream.text.getBytes());
}
zos.closeEntry();
}
zipstream.myClose();
zos.close();
message.setBody(new ByteArrayInputStream(out.toByteArray()))
return message
}
PUT https://
La funcionalidad principal ya está lista, pero aún requiere algunas actividades manuales para encontrar los ID de los flujos en SAP Cloud Platform Integration (que es bastante difícil cuando el artefacto no está implementado… requiere una llamada API de Contenido de integración) y también para usar una aplicación que puede enviar solicitudes como Postman.
Al crear otro flujo de SAP Cloud Integration que puede devolver una página HTML y podría interactuar con el usuario final, la búsqueda manual en SAP Cloud Platform Integration desaparece y la aplicación se puede usar directamente desde un navegador.
La página HTML devuelta por CPI Iflow
La página tiene cuatro menús desplegables y un botón, cuando el usuario elige los valores y presiona el botón “Transporte”, detrás de la página HTML, se ejecutará una llamada API a la funcionalidad principal (que expliqué anteriormente) y transportará los cambios de los Iflows de origen a los de destino. La respuesta se comprueba y se traduce en un mensaje de alerta que indica si se realizaron o no los cambios.
Cuando la página se carga en el navegador, los menús desplegables detrás del paquete de origen y de destino también usarán una llamada API que llenará el menú con todos los paquetes de su arrendatario. Una vez más, una API estándar de Contenido de integración se utilizó.
OBTENER https://
Cuando el usuario selecciona un nombre de paquete de la lista, esta vez se llama a otra API para extraer todos los Iflows del paquete seleccionado y llenará el menú desplegable de Iflow. Cuando se completan los nombres de Iflow de origen y destino, el usuario puede presionar el botón «Transportar» y los parámetros se pasarán a la API de funcionalidad.
OBTENER https://
Las llamadas desde HTML se realizan con Ajax marco y para una mejor comprensión voy a enumerar a continuación la llamada que se hace cuando el botón “Transporte» se presiona.
$('#transport').click(function() {
const resultTab = document.getElementById("results-table");
resultTab.innerHTML = '';
results = []
let valueSource = $('#integration-flow-source').val();
let valueTarget = $('#integration-flow-target').val();
let objSource = integrationFlowsSource[valueSource];
let objTarget = integrationFlowsTarget[valueTarget];
if (objSource.iD === objTarget.iD && compareVersion(objSource.version, objTarget.version) === 0) {
...
<Perform additional checks... Like if the versions are already in sync>
...
} else {
$.ajax({
url: url + "/updatePack",
type: 'POST',
contentType: "application/json",
data: JSON.stringify({
"SourceIflowID": objSource.iD,
"SourceIflowVersion": objSource.version,
"TargetIflowID": objTarget.iD,
"TargetIflowVersion": objTarget.version,
"TargetIflowName": objTarget.name
}),
xhrFields: {
withCredentials: withCred,
responseType: 'application/json'
}
})
.then(function(response) {
let data = JSON.parse(response);
if (data.messageCode == "200") {
load_successPopUp();
} else {
var errorMessage = data.message;
load_errorMessagePopUp(errorMessage);
load_errorPopUp();
}
let element = $('#results-table');
element.append('<div class="item"> <pre> <code>' + response + '</code> </pre> </div>');
});
}
})
Preparé para usted una breve demostración para resaltar cómo funciona y se ve esta herramienta.
Construir esta aplicación no consumió tanto tiempo, pero tener una herramienta que sincroniza diferentes paquetes del mismo arrendatario de SAP Cloud Integration con solo una entrada mínima de su parte valió la pena, especialmente porque su arrendatario está limpio y cada vez que se realiza un cambio en DEV podría ser transportado al resto de los paquetes en máximo dos minutos.
Para mí, el proceso de construcción de esta aplicación fue: preparar un plan, encontrar cómo funciona la actualización del flujo de integración y construir las funcionalidades. Ver lo útil que es en un proyecto real me motivó a escribir este blog. ¡Espero que mi idea te inspire a construir este tipo de herramienta también! 🙂
Espero que les haya gustado mi artículo y siéntanse libres de responder con cualquier sugerencia aquí en el Sección de preguntas sobre la integración en la nube de SAP ya que todavía estoy actualizando el flujo.
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073