.NET & DB2 for i: IA et conteneurs au service de l'IBM i

Faire de l'IBM i comme on fait du SQL Server ou du MySQL en .NET ? Avec des interfaces modernes ? Conteneurisé sur ARM ou POWER ? C'est possible grâce à la solution NTi proposée par AUMERIAL et accessible à tous. La preuve, même #ChatGPT sait le faire ;)

image d’illustration de l’article

Introduction

L'Intelligence Artificielle

Cette année 2023 aura été marquée par les progrès fulgurants de l'intelligence artificielle. Elle s'est démocratisée à travers des outils très populaires tels que ChatGPT. Nous disposons aujourd'hui de toute une panoplie d'outils permettant de produire un résultat à partir d'une idée ou d'une pensée.

La Conteneurisation

En parallèle, on assiste à la démocratisation et à la montée en puissance de la conteneurisation. Elle est devenue un incontournable de l'infrastructure moderne. En posant de nouveaux standards dans le développement d'applications, elle uniformise les pratiques de développement et garantit une interopérabilité de tous les composants de son SI. Investir dans des technologies cloud natives n'est donc plus nice-to-have mais un must-have. Je vous recommande d'ailleurs la lecture cet article publié par Google et mettant en évidence l'importance de standardiser ses outils.

...Et l'IBM i dans tout ça ?

Comment peut-on se retrouver à parler d'IA, de conteneurisation... et d'IBM i ? Chez AUMERIAL, nous venons de sortir NTi, un fournisseur d'accès à l'IBM i pour .NET cloud-natif, autonome et conteneurisable.

Je vais dans cet article vous présenter le développement et la publication d'une application web .NET accédant à l'IBM i, conteneurisée dans Docker en environnement ARM.

L'écriture de cette appli sera supervisée par ChatGPT, pour montrer l'intérêt de cet outil pour un développeur même expérimenté. Pas question ici d'envisager que le développeur soit remplacé par une IA, mais plutôt de montrer la puissance de cet outil pour gagner en productivité dans le développement d'applications .NET.

CQFD on a de l'IA, du container et de l'IBM i.

Le scénario

Je dois développer une application web de réservation de billets de concert. On retrouvera les étapes suivantes:

  • La conception de la base de données relationnelle
  • L'écriture des accès aux données (les CRUDs)
  • Le développement de l'interface web

Le tout sera développé en ASP.NET Blazor server, sur une base de données DB2 for i grâce aux fournisseur de données NTi développé par AUMERIAL.

Cet article passe en revue les différentes étapes de la conception d'une application et de son déploiement. L'objectif n'est pas de présenter un tutoriel détaillé mais plutôt une approche pour démontrer que :

  1. L'utilisation d'un assistant virtuel peut aider le développeur dans son travail en apportant de la productivité
  2. Développer une application .NET/IBM i est une tâche aussi triviale qu'avec n'importe quel autre base de données
  3. La solution NTi proposée par AUMERIAL simplifie le développement d'applications et permet d'intégrer l'IBM i aux schémas modernes de développement.

Enfin, j'ai choisi de cibler une architecture ARM pour cet exemple, cependant sans modifier le code, l'application peut s'exécuter en environnement POWER ou x86.

Briefing avec ChatGPT

Je commence par expliquer ma démarche auprès de mon assistant virtuel:

Démarche initiale présentée à ChatGPT pour le projet de réservation

Ensuite je lui expose clairement mon cas d'utilisation:

Prompt détaillé envoyé à ChatGPT pour générer l’application .NET avec IBM i

Le briefing est terminé, on peut commencer !

Étape 1: Création de la base de données

Pour développer ce genre d'application, je commence toujours par la modélisation de la situation et la création de mon modèle de données. Ensuite je crée les différentes tables dans mon SGBD. Faisons le point avec ChatGPT:

Modélisation entités-relations Concert, Billet et Utilisateur sous DB2 for i

En relisant ce modèle, je remarque quelques point à corriger:

Corrections du modèle relationnel : clés primaires et normalisation Client

Le modèle me convient, on passe à l'implémentation en SQL:

Script SQL de création des tables dans DB2 for i avec ACS

On copie tout dans ACS pour exécuter ce script, on vérifie et tout se crée sans problème:

Exécution du script SQL dans ACS et création des tables DB2 for i

Tout s'est bien passé, la base de données est créée, il ne reste plus qu'à développer notre application !

article 1

Étape 2: Création de l'application

Création d'un nouveau projet .NET

Nous allons créer un projet asp.net blazor server. On ajoute également toutes les dépendance dont nous aurons besoins:

  • MudBlazor pour la réalisation de l'interface
  • Aumerial.Data.Nti et l'ORM Dapper pour l'accès à DB2 for i

Confirmation de la base de données créée dans DB2 for i

Le projet est maintenant créé avec ses dépendances. Une fois le projet ouvert dans Visual Studio (ou VSCode), on suit les étapes d'installation de MudBlazor.

Implémentation de la couche d'accès aux données

Commençons par les modèles:

Création d’un projet ASP.NET Core Blazor Server avec dépendances MudBlazor et NTi

On reste sur une approche très classique où des classes représentent les différentes entités.

On réalise ensuite les différents services qui implémentent le SQL pour la récupération des données dans les différents modèles. Le fournisseur NTi expose les classes ADO.NET, on demande donc à ChatGPT de nous réaliser une implémentation basé sur les classes génériques ADO.NET, en précisant bien que les marque de paramètres de nos requêtes SQL sont les points d'interrogation pour respecter le format attendu par l'IBM i:

Modèles C# représentant les entités relationnelles Concert et Billet

Je passe les détails mais après vérification et quelques retouches du travail dégrossi par ChatGPT nous disposons maintenant de tous les services d'accès à la base de données, écrits en SQL et protégés contre l'injection de SQL (utilisation de paramètres et requêtes préparées).

Les requêtes sont directement soumises à l'IBM i via NTi sans utilisation de driver comme l'ODBC ou OLEDB. Cette application est donc totalement agnostique à la plateforme sur laquelle elle va s'exécuter. On pourra sans problème conteneuriser notre application.

Nous pouvons maintenant passer à la partie interface.

Création d'une interface moderne

Enfin, nous pouvons créer l'interface de notre application grâce à la richesse et l'efficacité des outils offerts par .NET, en l'occurence la bibliothèque de composants MudBlazor.

À ce stade, il faut créer les différentes pages de notre application:

  • Page de connexion/création de compte
  • Page d'accueil/affichage des concerts et réservation de billets
  • Page d'affichage des billets réservés par l'utilisateur
  • Page de gestion des informations du profil utilisateur

Demandons à ChatGpt le code de la page d'affichage des concerts et de réservation de billets:

Implémentation des services SQL générés avec ChatGPT et NTi pour DB2 for i

Le code généré par ChatGPT dégrossit encore une fois le travail, il reste toutefois quelques ajustements à réaliser mais la structure de base est présente. Le résultat est une application web moderne et dynamique:

Code généré par ChatGPT pour la page Blazor de réservation de concerts

Les données remontent bien de notre base de données relationnelle DB2 for i:

Affichage des données relationnelles extraites de DB2 for i

Une fois toutes les pages développées selon ce principe, notre application est prête à être publiée dans n'importe quel environnement supportant docker ou disposant d'un orchestrateur de conteneurs (Openshift, Kubernetes,...).

Étape 3: Création de l'image Docker

Le développement de l'application étant terminé, nous pouvons maintenant la publier sous forme d'image Docker. Pour cela on suit le processus dans Visual Studio permettant de publier notre application comme image Docker dans un dépôt distant.

Un DockerFile est créé automatiquement:

Dockerfile généré automatiquement pour la publication de l’application .NET

Et l'interface graphique de Visual Studio nous guide dans les différentes étapes de publication:

Interface Visual Studio pour publier l’image Docker de l’application

Une fois ces étapes suivies, notre application est poussée dans Docker:

Application publiée dans Docker Hub depuis Visual Studio

Étape 4: Démarrage de l'application dans un container

Dans cette dernière partie, il ne nous reste plus qu'à récupérer l'image Docker de l'application depuis notre serveur et à l'exécuter. Dans notre cas, il s'agit d'un ordinateur mono-carte Raspberry pi basé sur l'architecture ARM. Il n'y a besoin d'aucune dépendance, simplement d'une installation de docker.

Exécution de l’image Docker de l’application sur Raspberry Pi ARM

Depuis une session SSH sur ce serveur, on exécute la commande suivante:

Commande SSH docker run pour lancer l’application conteneurisée

Cette commande se traduit par:

Exécuter l'image concertbookingapp du dépôt rrouillo dans un nouveau container nommé ConcertApp en exposant le port 5000

Une fois cette commande exécutée, notre application démarre et est accessible depuis un navigateur web (à l'adresse 192.168.46.31 dans mon cas):

Application de réservation accessible via navigateur web local

Et l'appli est disponible:

Application .NET IBM i fonctionnelle et disponible dans le conteneur Docker

Conclusion

À travers cet article, vous aurez donc compris qu'un assistant virtuel comme ChatGPT peut être d'une aide précieuse dans le développement d'une application, en l'occurrence entre .NET et l'IBM i.

Nous avons également pu constater qu'avec la solution NTi développée par AUMERIAL, appréhender l'IBM i depuis .NET n'a rien de complexe, bien au contraire. La syntaxe est identique à celle de tous les autres fournisseurs de base de données et on peut faire de l'IBM i sans faire d'écran vert.

Là où NTi se différencie des autres solutions, c'est dans son intégration totale à .NET: peu importe l'architecture cible, notre application communique avec l'IBM i. C'est un point très important pour pouvoir faire tourner des charges de travail .NET/IBM i ailleurs que sur des VMs Windows... avec de belles économies à la clé et une vraie infrastructure moderne.

Enfin, que ce soit dans le développement de l'application ou dans sa publication, tout est simple, efficace et sans approximation. N'importe quel développeur peut maîtriser ces concepts et développer des applications métier performantes et résolument modernes.

Merci pour votre attention dans la lecture de cet article, je suis à votre disposition pour toute question, précision ou remarque autour des sujets abordés ci-dessus. Dans un prochain article je couvrirai l'utilisation de ressources plus typées IBM i comme les commandes CL et l'appel de programmes RPG depuis .NET avec NTi.


Rémi ROUILLOT