Sommaire
Le hub de contrôle permet d’accéder à différentes fonctions de pilotage de votre Constellation.
Voyons en détail comment contrôler votre Constellation depuis un package C#/.NET.
Accéder au hub de contrôle
Tout d’abord il faut déclarer que votre package souhaite un accès au hub de contrôle. Pour cela vous devez ajouter l’attribut “EnableControlHub” à true dans le manifeste de votre package (fichier PackageInfo.xml).
Ensuite, il faut que votre package se connecte à votre Constellation avec une “Access Key” qui possède l’autorisation d’accès au hub de contrôle.
Il faut ajouter l’attribut “enableControlHub” à true sur un de vos credentials et affecter ce credential à votre package :
Ainsi votre package pourra accéder au hub de contrôle de contrôle. Vous devriez d’ailleurs toujours tester la propriété “HasControlManager” pour gérer les erreurs où l’accès au hub de contrôle n’est possible.
1 2 3 4 5 6 7 8 |
if (PackageHost.HasControlManager) { PackageHost.WriteInfo("ControlHub OK"); } else { PackageHost.WriteError("ControlHub access denied !"); } |
Suivre les sentinelles et leurs statuts
Il y a deux manières d’obtenir la liste des sentinelles enregistrées dans votre Constellation :
- RequestSentinelsList : vous retourne la liste des sentinelles en une seule fois par l’événement “SentinelsListUpdated”
- RequestSentinelUpdates : vous retourne l’état de chaque sentinelle dans l’événement “SentinelUpdated” (cet événement est levé pour chaque sentinelle)
En principe pour récupérer la liste des sentinelles de votre Constellation, vous utiliserez toujours la première méthode.
Par exemple :
1 2 3 4 5 6 7 8 9 10 11 12 |
PackageHost.ControlManager.SentinelsListUpdated += (s, e) => { PackageHost.WriteInfo("Il y a {0} sentinelle(s)", e.Sentinels.Count); foreach (SentinelInfo sentinel in e.Sentinels) { PackageHost.WriteInfo("Sentinelle '{0}' (Plateforme: {1}) => IsConnected = {2}", sentinel.Description.SentinelName, sentinel.Description.Platform, sentinel.IsConnected); } }; PackageHost.ControlManager.RequestSentinelsList(); |
Vous pouvez également vous abonner en temps réel aux mises à jour des sentinelles de votre Constellation.
Pour cela il faut activer la réception des mises à jour :
1 |
PackageHost.ControlManager.ReceiveSentinelUpdates = true; |
Puis attacher un handler sur l’événement “SentinelUpdated” qui se produit à chaque mise à jour d’une sentinelle :
1 2 3 4 5 6 7 |
PackageHost.ControlManager.SentinelUpdated += (s, e) => { PackageHost.WriteInfo("Sentinelle '{0}' (Plateforme: {1}) => IsConnected = {2}", e.Sentinel.Description.SentinelName, e.Sentinel.Description.Platform, e.Sentinel.IsConnected); }; |
Superviser les packages
Récupérer les packages d’une sentinelle
Pour récupérer la liste des packages qui sont déployés sur une sentinelle vous devez attacher un handler sur l’événement “PackagesListUpdated” et appeler la méthode “RequestPackagesList” en spécifiant le nom de la sentinelle.
Pour exemple :
1 2 3 4 5 |
PackageHost.ControlManager.PackagesListUpdated += (s, e) => { PackageHost.WriteInfo("Il y a {0} package(s) sur la sentinelle {1}", e.Packages.Count, e.SentinelName); }; PackageHost.ControlManager.RequestPackagesList("MA-SENTINELLE"); |
Chaque “PackageInfo” contient différentes informations sur l’instance du package (description du package, état du package, état de la connexion, version du package, etc…) :
1 2 3 4 |
foreach (PackageInfo package in e.Packages) { PackageHost.WriteInfo("Package '{0}' - Etat = {1}", package.Package.Name, package.State); } |
Suivre l’état des packages
Vous pouvez aussi vous abonnez aux mises à jour des états des packages :
1 |
PackageHost.ControlManager.ReceivePackageState = true; |
Vous pourrez ensuite être notifier de tout changement d’état de vos packages dans votre Constellation :
1 2 3 4 |
PackageHost.ControlManager.PackageStateUpdated += (s, e) => { PackageHost.WriteInfo("Le package '{0}' est maintenant dans l'état {1}", e.PackageName, e.State); }; |
Suivre la consommation des packages
Vous pouvez aussi récupérer la consommation des ressources (CPU et RAM) de vos packages :
1 |
PackageHost.ControlManager.ReceivePackageUsage = true; |
Par exemple, on pourrait écrire un warning si un package consomme plus de 50% du CPU :
1 2 3 4 5 6 7 8 |
PackageHost.ControlManager.PackageUsageUpdated += (s, e) => { if (e.CPU > 50) // Package consommant plus de 50% du CPU à un instant T { PackageHost.WriteWarn("Le package {0} consomme maintenant plus de 50% !!! CPU={1}% RAM={2}ko", e.PackageName, e.CPU, e.RAM / 1024); } }; |
Contrôler les packages
Vous pouvez démarrer un package sur une sentinelle avec la méthode “StartPackage” :
1 2 |
// Démrrage du package "MonPremierPackage" sur la sentinelle "MON-PC" PackageHost.ControlManager.StartPackage("MON-PC", "MonPremierPackage"); |
Ou encore l’arrêter avec la méthode “StopPackage” :
1 2 |
// Arret du package "MonPremierPackage" sur la sentinelle "MON-PC" PackageHost.ControlManager.StopPackage("MON-PC", "MonPremierPackage"); |
Pour redémarrer (Stop puis Start) un package sur une sentinelle donnée, utilisez la méthode “RestartPackage” :
1 2 |
// Redémarrage du package "MonPremierPackage" sur la sentinelle "MON-PC" PackageHost.ControlManager.RestartPackage("MON-PC", "MonPremierPackage"); |
Enfin pour mettre à jour un package, utilisez la méthode “ReloadPackage”.
Un “reload” stoppe le package, ordonne à la sentinelle de re-télécharger le package sur le serveur, le déploie en local avant de le démarrer.
1 2 |
// Mise à jour du package "MonPremierPackage" sur la sentinelle "MON-PC" PackageHost.ControlManager.ReloadPackage("MON-PC", "MonPremierPackage"); |
Accéder aux logs en temps réel
Pour récupérer les logs produits par vos sentinelles et packages dans votre Constellation, activez la propriété suivante :
1 |
PackageHost.ControlManager.ReceivePackageLog = true; |
Il suffit ensuite d’attacher handler sur l’événement “LogEntryReceived “.
Vous recevrez en paramètre un objet “LogEntry” qui contient toutes les informations sur un log (le message, la date, le couple Sentinelle/Package à l’origine du log et la sévérité du message).
Par exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
PackageHost.ControlManager.LogEntryReceived += (s, e) => { if (e.LogEntry.PackageName != PackageHost.PackageInstanceName) // Ne pas prendre les logs de ce package pour éviter la boucle ;) { // On log des logs, juste pour l'exemple ;) PackageHost.WriteInfo("Je reçois un log daté du {0} du package {1} sur la sentinelle {2} de type {3}." + "Message = {4}", e.LogEntry.Date.ToString(), e.LogEntry.SentinelName, e.LogEntry.PackageName, e.LogEntry.Level, e.LogEntry.Message); } }; |
Notez qu’ici on logue dans Constellation (“WriteInfo”) les logs des autres packages (d’où le <if>). Ca n’a pas de sens, c’est juste pour l’exemple !
Récupérer la description des packages
Comme vous le savez, tous les MessageCallbacks ainsi que les types personnalisés utilisés en entrée ou en sortie sont décrits dans un PackageDescriptor tout comme les types personnalisés des StateObjects.
En vous connectant au hub de contrôle vous pouvez récupérer le PackageDescriptor de chaque package. Par exemple :
1 2 3 4 5 6 7 8 9 10 |
PackageHost.ControlManager.PackageDescriptorUpdated += (s, e) => { PackageHost.WriteInfo("Pour le package {0}, il y a {1} MessageCallback(s) associés à " + "{2} type(s) ainsi que {3} type(s) de StateObject", e.PackageName, e.Descriptor.MessageCallbacks.Count, e.Descriptor.MessageCallbackTypes.Count, e.Descriptor.StateObjectTypes.Count); }; PackageHost.ControlManager.RequestPackageDescriptor("MonPremierPackage"); |
Purger les StateObjects
Pour supprimer tous les StateObjects d’un package déployé une sentinelle :
1 |
PackageHost.ControlManager.PurgeStateObjects("MON-PC", "MonPremierPackage"); |
Vous pouvez aussi spécifier le nom du StateObject, pour supprimer un StateObject en particulier (identifié par son nom) :
1 |
PackageHost.ControlManager.PurgeStateObjects("MON-PC", "MonPremierPackage", "Demo"); |
Ou encore, tous les StateObjects d’un type particulier d’une instance de package :
1 |
PackageHost.ControlManager.PurgeStateObjects("MON-PC", "MonPremierPackage", type:"TypeDemo"); |
Recharger la configuration
Vous pouvez recharger et déployer la configuration Constellation en invoquant la méthode :
1 |
PackageHost.ControlManager.ReloadServerConfiguration(); |
Vous pouvez également passer un booléen pour indiquer si il faut déployer la configuration (c’est à dire pousser la configuration sur chaque sentinelle et package). Par défaut, la valeur est à “true” (la configuration est déployée).
Autrement :
1 |
PackageHost.ControlManager.ReloadServerConfiguration(false); |
Démarrez la discussion sur le forum Constellation