Sommaire
Vous pouvez créer des packages Constellation Python avec Visual Studio ou alors sans IDE avec l’outil en ligne de commande nommé « Constellation Package Tools CLI ».
Nous allons dans cet article créer, tester et déployer sur votre Constellation un package Python avec cet outil.
Prérequis
Le « Constellation Package Tools CLI » est un outil en ligne de commande compatible Windows et Linux. Il est écrit en Python et s’installe via PIP avec la commande :
1 |
pip install constellation-pkgtools-cli |
Sur Windows vous devriez au préalable avoir installé Python 2.7 ainsi que l’outil « pip » et les libraires « pyzmq » et « enum34 ». La procédure complète d’installation est décrite sur cette page.
Via une invite de commande, tapez la commande ci-dessus :
Sur Linux, vous devez également avoir installé Python 2.7 (généralement installé par défaut), l’outil « pip » et les libraires « pyzmq » et « enum34 » sans oublier le moteur Mono. Pour cela, utilisez le WPI (Web Platform Installer) pour installer une sentinelle Constellation. Celui-ci se chargera de déployer l’ensemble des prérequis nécessaire.
La commande « ctln »
Une fois le package Python « constellation-pkgtools-cli » installé via PIP, vous aurez accès à une commande nommée « ctln » (abréviation de Constellation)
Cette commande vous permettra de créer de nouveau package, les tester et déployer en local ou directement sur un serveur Constellation.
Créer son premier package Python
Pour créer un nouveau package utilisez simplement la commande “create” en spécifiant le nom de votre package. Par exemple :
1 |
ctln create <mon projet> |
Et voilà, votre package “MyFirstPackage” est créé dans le répertoire du même nom !
Template de package
Chaque package est créé à partir d’un template. Vous pouvez lister les templates avec la commande :
1 |
ctln template list |
A l’heure où est écrit cet article il y a deux templates de type “projet” :
- Python Base Template : le template de base (créé par défaut)
- Python Demo template : package Python avec du code de “demo”
Lorsque vous créez un package avec la commande “ctln create”, le template “python-base” est sélectionné par défaut.
Vous pouvez cependant préciser l’Id du template à utiliser dans la commande “ctln create”. Par exemple pour créer un package sur base du template de demo :
1 |
ctln create <mon projet> python-demo |
Il y a aussi des templates de type “item”, c’est à dire des templates pour les scripts que vous allez rajouter par la suite à votre package.
Mise à jour du template
Comme vous le constatez dans le listing des templates ci-dessus, chaque template comporte un numéro de version car ils sont amenés à évoluer notamment en cas de mise à jour des librairies Constellation.
Avec le SDK Constellation Visual Studio, les nouvelles versions des librairies sont diffusées avec NuGet. Ici avec cet outil en ligne de commande, les nouvelles librairies sont embarquées dans des mises à jour des templates.
Ainsi pour mettre à jour vos packages, vous pouvez tout simplement mettre à jour le template de votre package par la commande :
1 |
ctln update |
Cette commande doit être lancé depuis le répertorie racine de votre package.
Notez également que la mise à jour est “intelligente” dans la mesure où elle n’écrase pas vos fichiers de configuration, le manifeste du package ou encore vos scripts Python.
Développer son package
Le développement de package Python est expliqué dans cet article. Bien que l’article se base sur Visual Studio, l’API Python est strictement identique.
Ainsi, pour rappel, vous avez à la racine de votre projet le fichier « PackageInfo.xml » qui contient l’ensemble des informations de votre package (plus de détail ici) mais aussi le fichier de configuration nommé « PythonPackageHost.exe.config » qui contient la liste des scripts Python à lancer.
Les bases du développement d’un script Constellation Python sont expliquées ici.
Pour faciliter le développement, vous n’êtes pas obligé de modifier manuellement le fichier de configuration pour gérer les scripts Python. Pour cela vous avez à disposition différentes commandes pour lister, ajouter, renommer ou supprimer des scripts.
Lister les scripts du package
Les scripts Constellation Python lancés par votre package peuvent être listés par la commande :
1 |
ctln pyscript list |
Ici votre package « MyFirstPackage » ne contient qu’un seul script nommé « Main.py » dans le répertoire Scripts du package.
Ajouter des scripts Python
Pour ajouter un script Constellation Python, vous pouvez soit ajouter un script existant sur votre système de fichier dans votre package ou soit créer un nouveau script à partir d’un modèle (template).
Ajouter un script existant
Pour un script existant, il suffit d’utiliser l’option « add » :
1 |
ctln pyscript add <filepath> [--filename=<name>] |
Vous devez spécifier le chemin complet vers votre fichier à ajouter (filepath) et optionnellement le nom du fichier une fois ajouté dans votre package.
Par exemple la commande ci-dessous ajoutera dans votre package le fichier « ~/demo/MyDemo.py » sous le nom « DemoSeb.py »
1 |
ctln pyscript add ~/demo/MyDemo.py --filename=DemoSeb.py |
Ajouter de nouveau script
L’action la plus courante sera de créer un nouveau script Python dans votre package avec l’action « new » via la commande suivante :
1 |
ctln pyscript new <filename> [<item_template_name>] |
Vous devez obligatoirement spécifier le nom du fichier (filename) avec ou sans l’extension .py (rajoutée automatiquement). Le script sera créé dans le répertoire Scripts de votre package et automatiquement déclaré dans la configuration.
Vous pouvez également spécifier l’identifiant du template à utiliser. Les templates peuvent être listés avec la commande « ctln template list » comme vu ci-dessus. A l’heure où cet article est écrit il y a trois templates de type « item » :
- « python-base » : le template de base
- « python-demo » : un template avec du code de demonstration
- « python-empty » : un squelette vide
Si vous ne précisez pas l’identifiant, c’est le template « python-base » qui sera utilisé.
Par exemple ajoutons à notre package un deuxième script (avec le template de base) :
1 |
ctln pyscript new Main2 |
Rajoutons également un troisieme scriupt de démonstation en utilisant le template de demo (python-demo) :
1 |
ctln pyscript new DemoConstellation python-demo |
Notre package a maintenant trois scripts : Main.py (créé avec le template du package), Main2.py (créé ci-dessus avec le template de base), DemoConstellation.py (créé avec le template de demo) :
Renommer ou supprimer des scripts
Vous pouvez renommer les scripts du package avec l’option “rename”. Par exemple renommons “DemoConstellation” par “Demo” (les extensions “.py” sont optionnelles) :
1 |
ctln pyscript rename DemoConstellation Demo |
Pour supprimer des scripts il suffit d’utiliser l’option “remove” en spécifiant le nom du script (avec ou sans son extension .py).
Par exemple supprimons les deux fichiers “Main2.py” et “Demo.py” que nous avons ajoutés (et renommés) ci-dessus :
1 2 |
ctln pyscript remove Main2 ctln pyscript remove Demo |
Editer les scripts Python du package
Une fois vos scripts ajoutés, renommés ou supprimés avec la commande “ctln”, libre à vous d’utiliser votre éditeur de texte préféré pour éditer votre code !
Par exemple de le cas ici présent d’un accès SSH Linux, je pourrais utiliser “nano” ou “vim” (ou encore Notepad++ sur ma station WIndows via un tranfert SCP avec WInSCP par exemple).
1 |
nano Scripts/Main.py |
Ici le script “Main” défini une fonction de démarrage (OnStart) et une fonction de fermeture (OnExit). Pour rappel, les bases de l’API Constellation Python sont expliquées ici.
Notez simplement que dans cet exemple, le WriteInfo déclenché au démarrage (OnStart) écrit un log dasn Constellation de type “Information” en concaténant dans un message textuel les propriétés suivantes :
-
“PackageName” : le nom du package
-
“SentinelName” : le nom de la sentinelle sur laquelle est déployée ce package
-
“IsStandAlone” : un booléen indiquant si le package tourne de façon indépendante ou hébergée au sein d’une sentinelle
-
“IsConnected” : un booléen indiquant si le package est connecté ou non à une Constellation
Tester son package
Pour tester notre package en local, il suffit de lancer la commande suivante :
1 |
ctln run |
Comme vous pouvez le lire sur la console, le nom de la sentinelle affichée est “local sandbox” étant donné que la propriété IsStandalone est true (la propriété SentinelName est None). En effet votre package n’est pas déployé/démarré par Constellation sur une véritable sentinelle. Il est juste démarré en “standalone” par la commande “run”.
De plus la propriété “IsConnected” est false car votre package n’est pas connecté à une Constellation.
Vous pouvez donc tester des éléments de base de votre package mais de façon déconnecté, il manquera donc plusieurs fonctionnalités (les logs produits resterons local dans votre console, pas d’accès aux settings hormis ceux déclarés en local, la publication ou consommation de StateObjects sera impossible tout comme l’invocation ou l’exposition de MessageCallbacks).
Pour tester votre package complètement, il est possible de le lancer en local tout en le connectant à une Constellation.
Tout d’abord, il faudra déclarer des serveurs Constellation dans l’outil ctln.
Ajouter et gérer des serveurs Constellation
Les commandes sont les suivantes :
1 2 3 4 5 |
ctln server list ctln server (add | set) <name> --url=<url> --accesskey=<key> ctln server (add | set) <name> --url=<url> --username=<user> ctln server check <name> ctln server remove <name> |
Vous pouvez lister les serveurs, ajouter ou mettre à jour des serveurs avec la clé d’accès ou un couple login/password, tester la connectivité ou supprimer des serveurs.
Par exemple je dispose d’une Constellation installée à l’adresse : http://pc-seb.ajsinfo.loc:8088. Un credential basé sur le couple login/password “admin/seb” a été configuré. Je peux donc ajouter ce serveur que je nommerai ici “pc-seb” via la commande :
1 |
ctln server add pc-seb --url=http://pc-seb.ajsinfo.loc:8088 --username=admin |
Le serveur ajouté est testé au moment de l’ajout mais vous pouvez à tout moment tester la connectivité vers cette Constellation avec la commande “ctln server check”. Par exemple pour tester la Constellation nommée “pc-seb” :
1 |
ctln server check pc-seb |
Tester son package dans Constellation
Maintenant que nous avons ajouté un serveur Constellation dans l’outil, nous pouvons relancé notre package en le connectant à notre Constellation nommée “pc-seb” via la commande :
1 |
ctln run --server=pc-seb |
Le package démarre toujours dans la « sandbox locale » (IsStandalone = true) mais cette fois ci il est connecté à ma Constellation nommée « pc-seb » (IsConnected = true).
D’ailleurs en lançant la Console Constellation je peux maintenant suivre en temps réel les logs de ce package, les StatesObjects qu’il produit ou encore les MessageCallbacks qu’il expose.
Publier son package
Une fois le package développé et testé, il ne reste plus qu’à le packager pour pouvoir le déployer dans Constellation.
Vous pouvez soit le packager dans un fichier en local (que vous pourrez uploader sur une Constellation ou échanger avec d’autre) ou soit le déployer directement dans une Constellation référencée dans l’outil.
Par exemple pour publier ce package dans un fichier local dans le répertoire “/home/pi” :
1 |
ctln publish --output=/home/pi |
Maintenant, pour déployer ce même package directement sur une Constellation, il suffit simplement de spécifier le nom du serveur Constellation enregistré sur la commande “publish”.
Par exemple pour publier ce package sur la Constellation nommée ici “pc-seb” :
1 |
ctln publish pc-seb |
En vous rendant sur le Package Repository de votre Console Constellation, votre package fraîchement publié sera prêt à être déployé sur vos sentinelles Windows ou Linux de votre Constellation.
Next steps
Pour en savoir plus sur le développement de package en Python :
- Retour sur les bases de l’API Python (produire des logs, accéder aux settings, publier des StateObjects)
- Exposer vos fonctions Python dans Constellation (les MessageCallbacks)
- Invoquer des MessageCallbacks des autres packages de votre Constellation en Python
- Consommer les StateObjects de votre Constellation
Démarrez la discussion sur le forum Constellation