﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Catégorie Concepts - Constellation</title>
	<atom:link href="https://developer.myconstellation.io/concepts/feed/" rel="self" type="application/rss+xml" />
	<link>https://developer.myconstellation.io/concepts/</link>
	<description>Votre plateforme d&#039;interconnexion</description>
	<lastBuildDate>Mon, 04 Feb 2019 16:24:36 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.11</generator>

<image>
	<url>https://developer.myconstellation.io/wp-content/uploads/2016/02/256x256-e1457476015859.png</url>
	<title>Catégorie Concepts - Constellation</title>
	<link>https://developer.myconstellation.io/concepts/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>L&#8217;architecture Constellation et les différents acteurs : sentinelle, package, contrôleur et consommateur</title>
		<link>https://developer.myconstellation.io/concepts/architecture-constellation-et-les-differents-acteurs/</link>
					<comments>https://developer.myconstellation.io/concepts/architecture-constellation-et-les-differents-acteurs/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 09 Aug 2016 12:28:55 +0000</pubDate>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Sentinel]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Consommateur]]></category>
		<category><![CDATA[Contrôleur]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2139</guid>

					<description><![CDATA[<p>Une Constellation est constituée des éléments suivants : Un serveur Constellation Des sentinelles Constellation Des packages déployés sur ces sentinelles Des contrôleurs et consommateurs qui peuvent se connecter au serveur Les Sentinelles Une sentinelle est un agent de déploiement pour</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/architecture-constellation-et-les-differents-acteurs/">L&rsquo;architecture Constellation et les différents acteurs : sentinelle, package, contrôleur et consommateur</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Une Constellation est constituée des éléments suivants :</p>
<ul>
<li>Un serveur Constellation</li>
<li>Des sentinelles Constellation</li>
<li>Des packages déployés sur ces sentinelles</li>
<li>Des contrôleurs et consommateurs qui peuvent se connecter au serveur</li>
</ul>
<h3>Les Sentinelles</h3>
<p>Une sentinelle est un agent de déploiement pour Constellation. Concrètement il s’agit d’une application (ou service) installée sur un système Windows ou Linux et qui tourne en tache de fond.</p>
<p>Le rôle d&rsquo;une sentinelle est d’exécuter les ordres provenant du serveur Constellation pour :</p>
<ul>
<li>Déployer des packages, c’est à dire télécharger des packages (= des programmes) depuis le serveur et les démarrer localement</li>
<li>Contrôler les packages déployés sur la sentinelle (démarrer, arrêter ou redémarrer un package)</li>
<li>Remonter les informations au serveur Constellation sur chaque package (état, consommation des ressources CPU et RAM, etc..)</li>
</ul>
<p>Une fois une sentinelle installée et enregistrée dans une Constellation, il est possible depuis l’API ou la Console de suivre son état.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-6.png"><img loading="lazy" class="alignnone colorbox-2139" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Sentinelles Constellation" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-6.png" alt="Sentinelles Constellation" width="244" height="126" border="0" /></a></p>
<h3>Les packages</h3>
<p>Les packages sont des applications graphiques ou non graphiques (services) stockées dans le “Package Repository” du serveur Constellation et qui seront déployés sur des sentinelles de la Constellation.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-7.png"><img class="colorbox-2139"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-7.png" alt="image" width="244" height="78" border="0" /></a></p>
<p>Vous pouvez déployer autant de package que vous souhaitez sur chaque sentinelle. Une fois le package démarré, vous retrouverez son état et sa consommation de ressource dans la Console ou via l’API. Vous pourrez également l’arrêter, le redémarrer ou forcer la mise à jour du package.</p>
<p>Le package lui-même remonte ses logs dans Constellation et récupère ses paramètres de configuration (les Settings) depuis Constellation.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-8.png"><img class="colorbox-2139"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-8.png" alt="image" width="244" height="116" border="0" /></a></p>
<p>Ainsi si vous souhaitez changer une variable de configuration de l’un de vos packages, vous pouvez le faire directement depuis l’API ou la Console et propager cette mise à jour au package en question.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-9.png"><img class="colorbox-2139"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-9.png" alt="image" width="244" height="184" border="0" /></a></p>
<p align="left">Chaque package peut produire des données publiées dans ce que l&rsquo;on nomme des « <a href="/concepts/stateobjects/">StateObjects</a> » qui seront accessibles par les autres packages et les consommateurs (comme une page Web) de sa Constellation. De même un package peut consommer les StateObjects produits par les autres packages de la Constellation.</p>
<p align="left">Enfin chaque package peut échanger des messages avec les autres packages ou consommateurs connectés sur les hubs Constellation ce qui permet par exemple d’invoquer des méthodes sur d’autre système (ce que l&rsquo;on nomme les <a href="/concepts/messaging-message-scope-messagecallback-saga/">MessageCallbacks</a>).</p>
<p align="left">A noter qu&rsquo;il existe aussi une notion de « package virtuel » expliquée à <a href="/concepts/sentinels-packages-virtuels/">la page suivante</a>.</p>
<h3 align="left">Les consommateurs</h3>
<p align="left">Le serveur Constellation expose une interface REST ainsi qu&rsquo;un hub nommé « <a href="/concepts/les-differents-hubs-et-interfaces-rest-du-serveur-constellation/">Consumer</a> » à destination des « consommateurs ».</p>
<p align="left">Une page Web par exemple est un consommateur, c’est à dire qu’elle se connecte à Constellation pour interroger des StateObjects ou envoyer/recevoir des messages mais elle n’est pas considérée comme un package dans le sens où une page Web n&rsquo;est pas un programme déployé et démarré par une sentinelle (son cycle de vie est lié au navigateur du client). Un “consommateur” ne peut ni produire des logs ni avoir de settings ou encore publier des StateObjects. Il ne fait que consommer ni plus ni moins !</p>
<h3 align="left">Les contrôleurs</h3>
<p align="left">Le serveur Constellation expose un hub nommé “<a href="/concepts/les-differents-hubs-et-interfaces-rest-du-serveur-constellation/">Controller</a>” permettant contrôler des éléments de la Constellation comme arrêter/démarrer des packages, s’abonner et récupérer en temps réel les logs des packages de la Constellation, propager les changements de configuration dans la Constellation, suivre l&rsquo; état et la consommation des ressources de chaque packages, etc…</p>
<p align="left">Ce hub est notamment utilisé par la Console Constellation pour vous fournir une interface de pilotage de votre Constellation.</p>
<p align="left">Pour se connecter sur ce hub, le credential utilisé pour l’authentification doit avoir la clé « <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">EnableControlHub</a> » activée.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/architecture-constellation-et-les-differents-acteurs/">L&rsquo;architecture Constellation et les différents acteurs : sentinelle, package, contrôleur et consommateur</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/concepts/architecture-constellation-et-les-differents-acteurs/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Sentinelles et Packages « virtuels »</title>
		<link>https://developer.myconstellation.io/concepts/sentinels-packages-virtuels/</link>
					<comments>https://developer.myconstellation.io/concepts/sentinels-packages-virtuels/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 09 Aug 2016 12:29:33 +0000</pubDate>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Virtuel]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Sentinel]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2141</guid>

					<description><![CDATA[<p>Constellation met en œuvre des sentinelles (agent de déploiement) permettant de déployer des packages assurant ainsi les taches de supervision et d’administration, c&#8217;est ce que l&#8217;on appelle l&#8217;Orchestration. Tout cela est possible sur de véritables systèmes d’exploitation, tel que Windows</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/sentinels-packages-virtuels/">Sentinelles et Packages « virtuels »</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Constellation met en œuvre des sentinelles (agent de déploiement) permettant de déployer des packages assurant ainsi les taches de supervision et d’administration, c&rsquo;est ce que l&rsquo;on appelle l&rsquo;Orchestration.</p>
<p>Tout cela est possible sur de véritables systèmes d’exploitation, tel que Windows ou Linux, car en effet un package n’est ni plus ni moins qu’une application ou un programme (graphique ou non) déployé sur une sentinelle. La vie d’un package est ainsi contrôlée par Constellation.</p>
<p><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/constellation-proto-board.png"><img loading="lazy" class=" wp-image-819 aligncenter colorbox-2141" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/constellation-proto-board-300x102.png" alt="" width="450" height="153" srcset="https://developer.myconstellation.io/wp-content/uploads/2016/03/constellation-proto-board-300x102.png 300w, https://developer.myconstellation.io/wp-content/uploads/2016/03/constellation-proto-board-768x260.png 768w, https://developer.myconstellation.io/wp-content/uploads/2016/03/constellation-proto-board.png 989w" sizes="(max-width: 450px) 100vw, 450px" /></a></p>
<p>Seulement ce mécanisme n’est pas toujours possible. Si vous prenez un Arduino/ESP, NetDuino/Gadgeteer ou équivalent, il n’y a pas de notion de “processus”. Le programme est directement « téléversé » lors de l’opération de programmation de la puce. Une fois débranché, le microprogramme fonctionne de manière autonome mais il n’est pas possible de le modifier.</p>
<p>Autre exemple : un script Powershell. Le “programme” est dans le script lui-même. Il n’a pas de capacité de s’auto-programmer.</p>
<p>C’est pour cela que Constellation apporte cette notion de “sentinelles et packages <strong>virtuels</strong>”. En effet, une sentinelle virtuelle n&rsquo;existe pas dans le sens il n&rsquo;y a pas de « sentinelle » capable de déployer un package. Cette notion existe seulement décrire l&rsquo;identité du package « virtuel ». Le package existe dans le sens où il fait partie de l&rsquo;objet ou du script, mais il n&rsquo;est ni stocké et ni déployé par la Constellation, il est « virtuel ».</p>
<p>Prenez l’exemple d’une sonde de température réalisée avec un Arduino/ESP8266 et connectée à Constellation.</p>
<p>Vous allez déclarer dans votre Constellation une sentinelle “virtuelle” nommée “CapteurSalon”. Cette sentinelle « contiendra » (virtuellement) un package virtuel nommé “Temperature”. Ce package est virtuel car il n’y a aucun package de ce nom dans le repository de votre serveur.</p>
<p>Dans votre microprogramme Arduino/ESP, vous allez identifier votre Arduino comme étant la sentinelle “CapteurSalon” exécutant le package “Temperature”.</p>
<p>Vous serez alors connecté à Constellation et votre package “virtuel” pourra exploiter les différentes fonctionnalités de la Constellation :</p>
<ul>
<li>Récupération des settings définis sur le serveur</li>
<li>Envoi des logs</li>
<li>Production de StateObjects</li>
<li>Exploitation des StateObjects de la Constellation</li>
<li>Echange de messages pour l’invocation de méthode (les MessageCallbacks)</li>
</ul>
<p>D&rsquo;un point vue Constellation, il s&rsquo;agit d&rsquo;un véritable package. Le package se nomme « Temperature » et est exécuté par la sentinelle « CapteurSalon ». Il s&rsquo;agit en tout point d&rsquo;un véritable package à la différence qu&rsquo;il n&rsquo;y pas la partie “orchestration”, c’est à dire qu’on ne pourra pas l’arrêter/démarrer à distance ce package ou encore déployer de nouvelles versions du package depuis Constellation.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/sentinels-packages-virtuels/">Sentinelles et Packages « virtuels »</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/concepts/sentinels-packages-virtuels/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Messaging : Message, Scope, MessageCallback et Saga</title>
		<link>https://developer.myconstellation.io/concepts/messaging-message-scope-messagecallback-saga/</link>
					<comments>https://developer.myconstellation.io/concepts/messaging-message-scope-messagecallback-saga/#comments</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 16 Mar 2016 14:40:29 +0000</pubDate>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Saga]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[MessageScope]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=1349</guid>

					<description><![CDATA[<p>Tous systèmes connectés dans Constellation (les packages réels ou virtuels et les consommateurs) peuvent tous envoyer ou recevoir des messages (sauf si des autorisations restreignent cela). Message &#38; Scope Les notions de base du Messaging de Constellation sont : Un message</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/messaging-message-scope-messagecallback-saga/">Messaging : Message, Scope, MessageCallback et Saga</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Tous systèmes connectés dans Constellation (les packages réels ou virtuels et les consommateurs) peuvent tous envoyer ou recevoir des messages (sauf si des autorisations restreignent cela).</p>
<h3>Message &amp; Scope</h3>
<p>Les notions de base du Messaging de Constellation sont :</p>
<p>Un message :</p>
<ul>
<li>porte obligatoirement une clé (le MessageKey), en quelque sorte l’équivalent du “Sujet” d’un mail.</li>
<li>peut contenir optionnellement un contenu, nommé “Data”</li>
<li>est envoyé à un scope.</li>
</ul>
<p>Un scope :</p>
<ul>
<li>défini les destinataires d’un message</li>
<li>peut être de différents types :
<ul>
<li>All : c’est à dire que tous les systèmes connectés dans Constellation recevront le message (y compris l’émetteur)</li>
<li>Other : tout le monde sauf l’émetteur</li>
<li>Package : cible un ou plusieurs packages</li>
<li>Sentinel : cible tous les packages hébergés sur les sentinelles visées par le scope</li>
<li>Group : cible les packages ou consommateurs appartenant aux groupes visés par le scope</li>
</ul>
</li>
</ul>
<p>Les scopes “Package”, “Sentinel” et “Group” peuvent déclarer une liste de packages, de sentinelles et de groupes.</p>
<ul>
<li>Lorsque l’on cible une sentinelle, on vise tous les packages qu’elle héberge.</li>
<li>Lorsque l’on cible un package, on vise toutes les instances de ce package sur les sentinelles de votre Constellation.</li>
</ul>
<p>Si vous voulez cibler un seul package en particulier, vous devez obligatoirement créer un scope de type Package et définir le nom du package <strong>préfixé</strong> du nom de la sentinelle avec la nomenclature “SENTINEL/Package”.</p>
<p>Chaque package ou consommateur peut s’inscrire à un groupe ou être inscrit d’office dans la configuration du serveur (lire <a href="/constellation-platform/constellation-server/fichier-de-configuration/">l’article sur les groupes</a>).</p>
<h3>MessageCallback</h3>
<p>Les messages dans Constellation servent essentiellement à invoquer des méthodes. On appelle cela des “MessageCallbacks” le fait de lier un message à une fonction de votre programme.</p>
<p>Il s’agit tout simplement déclarer une méthode de votre code comme « MessageCallback », c’est à dire que si le package reçoit un message dont la clé du message est le nom d’une méthode déclarée comme MessageCallback, alors cette méthode sera invoquée. Le contenu du message reçu (c’est à dire les “Datas”)  contiendra les paramètres de la méthode.</p>
<p>De la même façon, pour invoquer une méthode d’un autre package, il suffit d’envoyer un message dont la clé est la méthode à invoquer avec comme contenu de message les paramètres à passer à cette méthode.</p>
<h3>Les Sagas</h3>
<p>Chaque message envoyé dans Constellation est à sens unique. Il n’y a aucun retour.</p>
<p>Un message est envoyé à un scope,  il peut ne jamais être reçu (si « personne » n’est visée par le scope) ou à l’inverse être reçu par tout le monde.</p>
<p>Cependant il y a certain cas où il est indispensable d’obtenir une réponse à un message ! Comme en programmation, il n’y a pas que des procédures, il y a aussi des fonctions.</p>
<p>Pour cela, Constellation propose le concept de “Saga”. Une saga est un identifiant porté par un scope. Pour faire l’analogie, “<em>La guerre des étoiles</em>”, “<em>L&rsquo;Empire contre-attaque</em> » ou “<em>Le Retour du Jedi</em>” sont trois films distincts qui portent le même identifiant de Saga : “Star Wars”.</p>
<p>Il en va de même pour les messages Constellation. Pour “répondre”, il suffit d’envoyer un message “de réponse” à un scope qui vise l’émetteur du message original en prenant soin d’utiliser le même identifiant de saga.</p>
<p>Ainsi l’émetteur en recevant ce message, pourra savoir qu’il s’agit de la réponse à son message car il retrouvera le même identifiant de saga.</p>
<p>Bien entendu l’identifiant de Saga doit être unique et aléatoire pour chaque couple “Request / Response” .</p>
<p>De ce fait, lorsque l’on reçoit un message, si le scope porte un identifiant de Saga cela veut dire que l’émetteur a envoyé le message “dans une Saga”, il s’attend donc à recevoir une réponse. Le clé d’un message de réponse est toujours “__Response”.</p>
<h3>Auto-description des MessageCallbacks</h3>
<p>Chaque packages (virtuel ou non) doit ou devrait déclarer son “Package Descriptor”.</p>
<p>Il s’agit de la description du package qui contient entre autre les MessageCallbacks du package, c’est à dire les méthodes que le package expose dans la Constellation.</p>
<p>Le <a href="/constellation-platform/constellation-console/messagecallbacks-explorer/">MessageCallback Explorer</a> de la Console Constellation exploite les “Package Descriptors” connus pour créer la liste de l&rsquo;ensemble des MessageCallbacks exposés par les package d&rsquo;une Constellation avec le détail des paramètres en entrée et le type de retour. Il est également possible d&rsquo;invoquer ces MC avec une interface de test et de générer le code pour invoquer ces MC sur les différentes API de Constellation.</p>
<p><a href="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-59.png"><img loading="lazy" class="wp-image-4600 aligncenter colorbox-1349" title="MessageCallbacks Explorer" src="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-59-300x91.png" alt="MessageCallbacks Explorer" width="323" height="98" srcset="https://developer.myconstellation.io/wp-content/uploads/2017/05/image-59-300x91.png 300w, https://developer.myconstellation.io/wp-content/uploads/2017/05/image-59.png 605w" sizes="(max-width: 323px) 100vw, 323px" /></a></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/messaging-message-scope-messagecallback-saga/">Messaging : Message, Scope, MessageCallback et Saga</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/concepts/messaging-message-scope-messagecallback-saga/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Les StateObjects</title>
		<link>https://developer.myconstellation.io/concepts/stateobjects/</link>
					<comments>https://developer.myconstellation.io/concepts/stateobjects/#comments</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 09 Aug 2016 12:31:32 +0000</pubDate>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[StateObject]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2145</guid>

					<description><![CDATA[<p>Les StateObjects sont des objets de données produits et publiés par des packages qu’ils soient “réels” ou “virtuels” d&#8217;une Constellation. Ils représentent des variables de type simple (numérique, chaîne de caractère, booléen, etc..) ou de type complexe (objet formaté en</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/stateobjects/">Les StateObjects</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Les StateObjects sont des objets de données produits et publiés par des packages qu’ils soient “réels” ou “virtuels” d&rsquo;une Constellation.</p>
<p>Ils représentent des variables de type simple (numérique, chaîne de caractère, booléen, etc..) ou de type complexe (objet formaté en JSON).</p>
<p>Les StateObjects sont tous stockés sur le serveur Constellation et peuvent être interrogés par n’importe quels packages ou consommateurs de la Constellation (sauf si des autorisations restreignent l’accès).</p>
<h3>Le StateObject</h3>
<p>Chaque StateObject comporte :</p>
<ul>
<li>Le nom de la sentinelle et du package qui a produit le StateObject</li>
<li>Un nom (la clé d&rsquo;un StateObject)</li>
<li>Une valeur</li>
<li>Une date de mise à jour</li>
<li>Une durée de vie en seconde (“0” si infinie)</li>
<li>Un type</li>
<li>Des métadatas (dictionnaire de clé / valeur)</li>
</ul>
<p>Dans la philosophie Constellation, chaque package (<a href="/concepts/sentinels-packages-virtuels/">virtuel ou non</a>) publie des StateObjects représentant des « variables publiques ».</p>
<p>Par exemple un capteur de température Arduino publiera des StateObjects sur la température ou humidité qu’il relève, un package comme le “HWMonitor” publiera des StateObjects sur les compteurs hardware qu’il mesure (consommation CPU, RAM, etc..), ou encore un package comme celui “Paradox” publiera des StateObjects pour chaque zone d’un système d’alarme où chaque StateObject contiendra un objet indiquant l’état de la zone (ouverte/fermée, en alarme ou non, en défaut ou non, etc..).</p>
<p>Le « <a href="/constellation-platform/constellation-console/stateobjects-explorer/">StateObject Explorer</a> » de la Console Constellation permet d’explorer l’ensemble des StateObjects de la Constellation :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-27.png"><img loading="lazy" class="alignnone colorbox-2145" title="Le StateObjects Explorer" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-26.png" alt="Le StateObjects Explorer" width="350" height="176" border="0" /></a></p>
<p align="left">Avec la possibilité de visualiser tous les détails et de vous abonner aux mises à jour en temps réel :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-28.png"><img loading="lazy" class="alignnone colorbox-2145" title="Détail d'un StateObject" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-27.png" alt="Détail d'un StateObject" width="350" height="251" border="0" /></a></p>
<p style="text-align: left;" align="center">La capture ci-dessus montre un StateObject produit par le package “NetAtmo” qui représente le détail d’un capteur NetAtmo (Id, version du firmware, nom du capteur, statuts de la communication, niveau de la batterie, etc..).</p>
<p style="text-align: left;" align="center">Comme chaque package peut publier des StateObjects dans Constellation, il est possible en interrogeant les StateObjects de votre Constellation de connaitre en temps réel l’état de tous vos systèmes (ou du moins “le dernier état connu”).</p>
<p style="text-align: left;" align="center">A noter que l’unicité d’un StateObject est obtenu par le triplet : “Sentinel + Package + Nom” car un nom de StateObject est unique pour une <a href="/concepts/instance-package-versioning-et-resolution/#Sentinel_Package_Instance_de_package">instance de package</a> (couple Sentinel / Package), de même qu’un package est un unique pour une sentinelle et qu’une sentinelle est unique dans une Constellation.</p>
<h3>Interrogation, abonnement et filtre</h3>
<p>Dans les librairies Constellation (<a href="/client-api/javascript-api/">JavaScript</a>, <a href="/client-api/net-package-api/">.NET</a>, <a href="/client-api/python-api/">Python</a>, <a href="/client-api/arduino-esp-api/">Arduino</a>, etc..) et d’un point de vue plus générique avec les <a href="/client-api/rest-api/">interfaces REST</a> Constellation vous allez retrouver les mêmes fonctionnalités :</p>
<ul>
<li>Le “Request” de StateObject</li>
<li>Le “Subscribe” de StateObject</li>
</ul>
<p>Le “Request” permet de récupérer la dernière valeur connue d’un ou de plusieurs StateObjects.</p>
<p>Le ”Subscribe” permet de créer un abonnement sur un ou plusieurs StateObjects. Une fois abonné, vous serez notifié en temps réel des qu’un StateObject de votre abonnement est mis à jour.</p>
<p>Dans ces deux méthodes vous serez amené à définir le ou les StateObjects que vous souhaitez récupérer ou suivre. Pour cela vous devez définir un filtre en indiquant :</p>
<ul>
<li>Le nom de la sentinelle du StateObject</li>
<li>Le nom du package du StateObject</li>
<li>Le nom du StateObject</li>
<li>Le type du StateObject</li>
</ul>
<p>Pour chaque filtre vous pourrez appliquer le wildcard “*” pour accepter toutes les valeurs possibles.</p>
<p>Ainsi appliquer le filtre <em>/</em>/<em>/</em> sélectionnera tous les StateObjects de votre Constellation. N’oubliez pas que l’unicité d’un StateObject est obtenue par le triplet : “Sentinel + Package + Nom”.</p>
<p>Quelques exemples :</p>
<ul>
<li>*/Demo/*/* : sélectionne tous les StateObjects du package “Demo” quelque soit la sentinelle</li>
<li>MonPC/Demo/*/* : sélectionne tous les StateObjects du package “Demo” de la sentinelle “MonPC”</li>
<li>MonPC/*/*/* : tous les StateObjects produits sur la sentinelle MonPC</li>
<li>MonPC/*/*/MyData : tous les StateObjects de type “MyData” et produits sur la sentinelle MonPC</li>
<li>MonPC/Demo/ABC/* : le StateObject ABC du package Demo sur la sentinelle MonPC</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/stateobjects/">Les StateObjects</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/concepts/stateobjects/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>La sécurité : AccessKey, Credential et Authorization</title>
		<link>https://developer.myconstellation.io/concepts/securite-accesskey-credential-authorization/</link>
					<comments>https://developer.myconstellation.io/concepts/securite-accesskey-credential-authorization/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 09 Aug 2016 12:30:20 +0000</pubDate>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Credential]]></category>
		<category><![CDATA[AccessKey]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[Securité]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2143</guid>

					<description><![CDATA[<p>Tous les appels (HTTP) au serveur Constellation doivent être authentifiés. Pour cela, nous utilisons une clé d’accès que l’on nomme “AccessKey”. L’AccessKey Chaque requête au serveur Constellation comporte soit dans les paramètres de l’URL (querystring) soit dans les entêtes (headers)</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/securite-accesskey-credential-authorization/">La sécurité : AccessKey, Credential et Authorization</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Tous les appels (HTTP) au serveur Constellation doivent être authentifiés. Pour cela, nous utilisons une clé d’accès que l’on nomme “AccessKey”.</p>
<h3>L’AccessKey</h3>
<p>Chaque requête au serveur Constellation comporte soit dans les paramètres de l’URL (querystring) soit dans les entêtes (headers) HTTP trois informations :</p>
<ul>
<li><u>SentinelName</u> : le nom de la sentinelle</li>
<li><u>PackageName</u> : le nom du package</li>
<li><u>AccessKey</u> : la clé d’accès</li>
</ul>
<p>Les paramètres “SentinelName” et “PackageName” permettent d’identifier le package qui réalise la requête car un package (virtuel ou non) est toujours associé à une sentinelle (virtuelle ou non).</p>
<p>En fait le couple “SentinelName/PackageName” forme l’identifiant unique du package (nommé <a href="/concepts/instance-package-versioning-et-resolution/">instance de package</a>) dans la Constellation et l’AccessKey peut être comparé au “mot de passe”.</p>
<p>Une sentinelle (virtuelle ou non) déclarée dans la <a href="/constellation-platform/constellation-server/fichier-de-configuration/">configuration de votre Constellation</a> doit obligatoirement être associée à une clé d’accès et les packages (virtuels ou non) déclarés sur une sentinelle utilisent implicitement la même clé d’accès ou bien peuvent redéfinir une clé spécifique.</p>
<p>Il y a quelques cas particuliers :</p>
<ul>
<li>Lorsqu&rsquo;une sentinelle produit des logs, son “PackageName” est “Sentinel”</li>
<li>Pour les consommateurs ou contrôleurs, le “SentinelName” est soit “Consumer” ou soit “Controller” et le “PackageName” sert de “FriendlyName” pour les logs</li>
<li>Dans le cas de l’utilisation de la fonction de “Debug on Constellation” depuis le SDK VisualStudio, le “SentinelName” est “Developer”</li>
</ul>
<h3>Les Credentials</h3>
<p>Dans le <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">fichier de configuration de votre Constellation</a>, on ne déclare pas l’AccessKey directement sur une sentinelle ou un package.</p>
<p>En effet une sentinelle est associée à un credential et un package utilise implicitement le même credential que sa sentinelle ou bien redéfini son propre credential.</p>
<p>Un credential comporte obligatoirement deux propriétés :</p>
<ul>
<li>Le nom (unique) du credential</li>
<li>L’AccessKey</li>
</ul>
<p>Pour authentifier une requête, le serveur Constellation regardera alors si l’AccessKey de la requête correspond bien à celle déclarée pour le credential utilisé par le couple Sentinel/Package.</p>
<p>Un credential peut définir les propriétés suivantes :</p>
<ul>
<li><u>Enable</u> : indique si le credential est activé ou désactivé</li>
<li><u>EnableControlHub</u> : indique si le credential peut se connecter sur le hub de contrôle (pour l’administration de la Constellation)</li>
<li><u>EnableManagementAPI</u> : indique si le credential peut se connecter à l’API de Management (pour l’édition de la configuration)</li>
<li><u>EnableDeveloperAccess</u> : indique si le credential peut utiliser la sentinelle virtuelle “Developer” pour debugger des packages (utilisé par le SDK Visual Studio)</li>
</ul>
<p>Vous pouvez gérer les credentials depuis <a href="/constellation-platform/constellation-console/gerer-credentials-avec-la-console-constellation/">la Console Constellation</a> ou depuis <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">le fichier de configuration</a>.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-11.png"><img class="colorbox-2143"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Manage Credential" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-11.png" alt="Manage Credential" width="354" height="141" border="0" /></a></p>
<h3>Login et AccessKey</h3>
<p>L’AccessKey doit être une chaîne de caractère assez longue et sera utilisée un peu comme un mot de passe pour l’authentification.</p>
<p>Cependant il est assez compliqué de retenir un AccessKey surtout comparé à un couple “login / password” que nous utilisons au quotidien.</p>
<p>C’est pourquoi la Console Constellation, les installeurs Constellation ou encore le SDK Constellation propose d’utiliser un login/password pour générer un AccessKey.</p>
<p>La formule est très simple : <strong>AccessKey = sha1(login + password)</strong>. En clair une clé d’accès peut être obtenue par le hash SHA1 de la concaténation du login avec un mot de passe.</p>
<p>Par exemple, si mon login est “<u>admin</u>” et que mon mot de passe est “<u>P@</u><u>ssw0rd</u>” alors ma clé d’accès (AccessKey) sera <u>a5761adf00e4060f05fab7017b32905cc9e5d540</u> (= le hash SHA1 de “adminP@ssw0rd”).</p>
<h3>Les Authorizations</h3>
<p>Par défaut un credential actif (<em>enable=true</em>) à le droit d’interroger (<em>Request</em> ou <em>Subscribe</em>) tous les StateObjects de votre Constellation sans restriction ou d&rsquo;envoyer des messages à n’importe quel scope ou encore de s’abonner n’importe quel groupe.</p>
<p>Imaginez maintenant que vous réalisez une page Web en <a href="/client-api/javascript-api/">Javascript</a> connectée à votre Constellation pour afficher les valeurs de quelques StateObjects en temps réel ou encore pour envoyer des messages pour contrôler certains dispositifs.</p>
<p>Dans le cas présent, si il s’agit d’une page JavaScript, le code est “client-side”, donc n’importe quelle personne ayant accès à cette page pourra visualiser le code source et récupérer l’AccessKey utilisée.</p>
<p>En clair si vous développez un petit morceau de Javscript pour afficher en temps réel la consommation de votre CPU (StateObject produit par le package HWMonitor par exemple) sur votre site Web, n’importe qui pourrait récupérer votre clé d’accès et suivre en temps réel le statut de votre alarme, votre courbe de poids, la température de votre chambre, le volume de votre ampli, etc… Ou pire encore, envoyer différents messages dans votre Constellation pour éteindre des machines, allumer des lumières, ouvrir la porte de garage, augmenter le chauffage, etc…</p>
<p>Un concept « d&rsquo;autorisation” a été introduite dans la version 1.8 de Constellation pour restreindre les droits sur une clé d’accès (AccessKey) sur les éléments suivants :</p>
<ul>
<li>L’interrogation des StateObjects</li>
<li>L’envoi de message (invocation des MessageCallback)</li>
<li>L’abonnement à des groupes de message</li>
</ul>
<p>De ce fait, si vous souhaitez afficher par exemple la consommation de votre CPU de telle machine, vous allez créer un credential qui n’aura que le droit (autorisation) de visualiser ce StateObject ni plus ni moins.</p>
<p>Plus d’information, consultez l&rsquo;article dédié à <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">la configuration des autorisations</a>.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/securite-accesskey-credential-authorization/">La sécurité : AccessKey, Credential et Authorization</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/concepts/securite-accesskey-credential-authorization/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Les différents hubs et interfaces REST du serveur Constellation</title>
		<link>https://developer.myconstellation.io/concepts/les-differents-hubs-et-interfaces-rest-du-serveur-constellation/</link>
					<comments>https://developer.myconstellation.io/concepts/les-differents-hubs-et-interfaces-rest-du-serveur-constellation/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 12 Aug 2016 14:19:15 +0000</pubDate>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Consumer]]></category>
		<category><![CDATA[Controller]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Hub]]></category>
		<category><![CDATA[Sentinel]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[Configuration]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2279</guid>

					<description><![CDATA[<p>Le serveur Constellation est accessible en HTTP ou HTTPS sur une ou plusieurs URIs. Il héberge des hubs et des interfaces HTTP/REST. De plus il peut également héberger des fichiers statiques en configurant le “fileServer” ce qui permet par exemple</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/les-differents-hubs-et-interfaces-rest-du-serveur-constellation/">Les différents hubs et interfaces REST du serveur Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Le serveur Constellation est accessible en HTTP ou <a href="/constellation-platform/constellation-server/configuration-ssl/">HTTPS</a> sur <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_listenUris">une ou plusieurs URIs</a>.</p>
<p>Il héberge des hubs et des interfaces HTTP/REST. De plus il peut également héberger des fichiers statiques en configurant le “<a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_fileServer">fileServer</a>” ce qui permet par exemple l’auto-hébergement de la console Constellation (<a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_fileServer">plus d’info ici</a>).</p>
<p>Les hubs Constellation sont basés sur la technologie SignalR permettant d&rsquo;exposer des canaux de communication bi-directionnels et temps réel en HTTP long-polling, server-event ou WebSocket en fonction des capacités du client.</p>
<p>Les interfaces HTTP/REST sont en fait des contrôleurs WebAPI exposant des méthodes en HTTP/REST. Les interfaces HTTP/REST permettent d’exposer des fonctionnalités de Constellation de manière très simple pour les devices ou frameworks ne pouvant supporter SignalR.</p>
<p>Il existe 4 hubs :</p>
<ul>
<li>Constellation</li>
<li>Consumer</li>
<li>Controller</li>
<li>Sentinel</li>
</ul>
<p>Ainsi que 3 interfaces HTTP/REST :</p>
<ul>
<li>Constellation</li>
<li>Consumer</li>
<li>Management</li>
</ul>
<p>Le hub et l’interface HTTP “Constellation” sont utilisés par les packages Constellation (réels ou virtuels). Ils exposent des méthodes pour écrire des logs, pour récupérer les settings, pour publier ou interroger des StateObjects, envoyer ou recevoir des messages, etc…</p>
<p>Le hub et l’interface HTTP “Consumer” sont utilisés par les “consommateurs”. Par exemple une page Web est un consommateur, c’est à dire qu’elle se connecte à Constellation pour interroger des StateObjects ou envoyer/recevoir des messages mais elle n’est pas un package (son cycle de vie est lié au navigateur du client). Un “consommateur” ne peut pas produire des logs, avoir de settings ou encore publier des StateObjects.</p>
<p>Le hub “Controller” expose des méthodes pour contrôler la Constellation comme arrêter/démarrer des packages, s’abonner et récupérer en temps réel les logs des packages de la Constellation, propager les changements de configuration dans la Constellation, suivre les états et consommation des ressources des packages, etc… Ce hub est notamment utilisé par la Console Constellation pour vous fournir une interface de pilotage de votre Constellation. Pour pouvez également vous connecter et exploiter les fonctionnalités de contrôle de <a href="/client-api/javascript-api/controler-constellation-api-javascript/">vos pages Web</a> ou <a href="/client-api/net-package-api/controlmanager/">packages .NET</a>.</p>
<p>Le hub “Sentinel” est un hub privé réservé aux sentinelles de la Constellation. C’est sur ce hub que les sentinelles s’enregistrent, remontent les états des packages qu’elles supervisent, etc…</p>
<p>Enfin l’interface HTTP “Management” aussi nommée “Management API” est une API HTTP/REST de management du serveur permettant la gestion des sentinelles, des packages, des settings, des credentials, etc… Cette API est notamment utilisée par la Console Constellation pour vous fournir une interface d&rsquo;administration de votre Constellation.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/les-differents-hubs-et-interfaces-rest-du-serveur-constellation/">Les différents hubs et interfaces REST du serveur Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/concepts/les-differents-hubs-et-interfaces-rest-du-serveur-constellation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Instance de package, package, versioning, multi-instances et résolution des packages</title>
		<link>https://developer.myconstellation.io/concepts/instance-package-versioning-et-resolution/</link>
					<comments>https://developer.myconstellation.io/concepts/instance-package-versioning-et-resolution/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Thu, 11 Aug 2016 12:27:29 +0000</pubDate>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[PackageInfo.xml]]></category>
		<category><![CDATA[Sentinel]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Instance]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Manifest]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2246</guid>

					<description><![CDATA[<p>Un package est une application avec ou sans une interface graphique qu’on déploie et exécute sur une sentinelle de votre Constellation (plus d’information ici). Concrètement un package est un fichier ZIP qui contient un exécutable (exe) qui sera exécuté et</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/instance-package-versioning-et-resolution/">Instance de package, package, versioning, multi-instances et résolution des packages</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Un package est une application avec ou sans une interface graphique qu’on déploie et exécute sur une sentinelle de votre Constellation (<a href="/concepts/architecture-constellation-sentinel-package/#Les_packages">plus d’information ici</a>).</p>
<p>Concrètement un package est un fichier ZIP qui contient un exécutable (exe) qui sera exécuté et supervisé par une sentinelle.</p>
<h3>Sentinel + Package = Instance de package</h3>
<p>Par défaut, Constellation va utiliser le package dont le nom est celui de l’instance que vous déclarez dans la <a href="/constellation-platform/constellation-server/fichier-de-configuration/">configuration</a>.</p>
<p>Par exemple, pour déployer le package “HWMonitor” sur la sentinelle nommée “SENTINEL-DEMO”, on écrira dans le <a href="/constellation-platform/constellation-server/fichier-de-configuration/">fichier de configuration</a> :</p>
<p></p><pre class="crayon-plain-tag">&lt;sentinel name="SENTINEL-DEMO" credential="Standard"&gt;
    &lt;packages&gt;    
      &lt;package name="HWMonitor"&gt;&lt;/package&gt;
    &lt;/packages&gt;
&lt;/sentinel&gt;</pre><p></p>
<p>L’attribut “name” du package est le <strong>nom de l’instance</strong> du package. On parlera alors de l’instance “SENTINEL-DEMO/HWMonitor” pour identifier de manière unique l’instance de ce package dans une Constellation.</p>
<p>Lors du déploiement, <strong>Constellation va analyser chaque package dans son repository pour récupérer celui dont le nom déclaré son </strong><a href="/concepts/package-manifest/"><strong>manifeste</strong></a><strong> correspond</strong> au nom de notre instance.</p>
<p>Dans le cas où il ne trouve aucun package dont le <a href="/concepts/package-manifest/">manifeste</a> déclare le nom de package recherché, il va tenter de sélectionner le package à partir du fichier “&lt;nom d’instance&gt;.zip”. Si ce fichier n’existe pas alors une erreur sera levée dans les logs de la Constellation.</p>
<p>Dans notre cas, Constellation va analyser chaque package de son repository (c’est à dire chaque fichier .ZIP) pour récupérer celui qui a dans son <a href="/concepts/package-manifest/">manifeste</a> (<em>PackageInfo.xml</em>) déclaré la propriété “Name” à “HWMonitor”. Si il ne le trouve pas, il va tenter de récupérer le package par le nom de fichier “HWMonitor.zip”.</p>
<h3>Versioning des packages</h3>
<p>En plus du nom du package, le <a href="/concepts/package-manifest/">manifeste</a> (<em>PackageInfo.xml</em>) déclare également d’autre information comme la version du package.</p>
<p>Le “Package Repository” d’un serveur Constellation peut donc contenir plusieurs versions d’un même package.</p>
<p>Par exemple, imaginez les packages suivants stockés dans le “Package Repository” de votre serveur Constellation :</p>
<ul>
<li>HWMonitor.zip (avec dans le manifeste: Name=”HWMonitor” et Version=”1.0”)</li>
<li>HWMonitor-1.1.zip (avec dans le manifeste: Name=”HWMonitor” et Version=”1.1”)</li>
<li>HWMonitor-1.2.zip (avec dans le manifeste: Name=”HWMonitor” et Version=”1.2”)</li>
</ul>
<p><u>Note</u> : la nomenclature des noms des fichiers dans le repository n’a aucune importance.</p>
<p>Si dans votre <a href="/constellation-platform/constellation-server/fichier-de-configuration/">fichier de configuration</a> vous déclarez simplement la ligne suivante :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="HWMonitor"&gt;&lt;/package&gt;</pre><p></p>
<p>Constellation trouvera donc 3 packages qui correspondent (car l&rsquo;attribut name=”HWMonitor” dans les trois packages). Dans ce cas, le serveur <strong>Constellation va sélectionner le package dont la version est la plus haute</strong>.</p>
<p>Ainsi dans cet exemple, c’est le package “HWMonitor-1.2.zip” qui sera déployé sur la sentinelle pour l’instance “HWMonitor”.</p>
<h3>Résolution explicite du fichier d’un package</h3>
<p>Jusqu’à présent la règle est donc d’utiliser le fichier dont le nom du package (d&rsquo;après son manifeste) correspond au nom de l’instance déclarée (package “HWMonitor &lt;&gt; instance “HWMonitor”) et si plusieurs fichiers correspondent on sélectionne la version la plus haute. A contrario, si aucun fichier n’est trouvé, on tente d’utiliser le fichier “&lt;nom d’instance&gt;.zip”.</p>
<p>C’est donc une résolution “implicite” du fichier du package qui est réalisée par le serveur Constellation.</p>
<p>Toutefois il est possible de contourner ce comportement et de<strong> définir explicitement le fichier d’un package à utiliser grâce à l’attribut “filename”</strong>.</p>
<p>Si dans votre <a href="/constellation-platform/constellation-server/fichier-de-configuration/">fichier de configuration</a> vous déclarez la ligne suivante :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="HWMonitor" filename="HWMonitor-1.1.zip"&gt;&lt;/package&gt;</pre><p></p>
<p>Vous définissez explicitement que cette instance nommée “HWMonitor” utilisera le package contenu dans le fichier “HWMonitor-1.1.zip”. On peut donc forcer l’utilisation d’une version spécifique en déclarant explicitement le fichier à utiliser pour une instance d’un package.</p>
<p>On aurait aussi pu écrire :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="HWMonitor" filename="DemoPackage.zip"&gt;&lt;/package&gt;</pre><p></p>
<p>C’est à dire qu’on déclare une instance d’un package nommée “HWMonitor” utilisant le package contenu dans le fichier “DemoPackage.zip”, ce qui n’a pas de sens mais est tout à fait possible !</p>
<p>Ainsi pour résumer, <strong>Constellation utilise donc en priorité le fichier défini par l’attribut “filename”</strong>. Dans le cas contraire on applique la règle implicite définie précédement.</p>
<h3>Instances multiples d’un même package</h3>
<p>Avec cet attribut “filename” il devient possible de déployer plusieurs instances d’un même package sur une même sentinelle tant que le nom d&rsquo;instance est différent.</p>
<p>Prenez la configuration suivante :</p>
<p></p><pre class="crayon-plain-tag">&lt;sentinel name="SENTINEL-DEMO" credential="Standard"&gt;
    &lt;packages&gt;    
      &lt;package name="HWMonitor1" filename="HWMonitor.zip"&gt;&lt;/package&gt;
      &lt;package name="HWMonitor2" filename="HWMonitor.zip"&gt;&lt;/package&gt;
   &lt;/packages&gt;
&lt;/sentinel&gt;</pre><p></p>
<p>Dans cet exemple, on a deux instances du package “HWMonitor.zip” qui seront déployées sur “SENTINEL-DEMO”.</p>
<p>Ces instances “SENTINEL-DEMO/HWMonitor1” et “SENTINEL-DEMO/HWMonitor2” sont deux instances différentes dans votre Constellation et peuvent avoir des configuration (settings) différentes mais elles sont basées sur le même code, car elles partagent la même source (le package “HWMonitor.zip”).</p>
<p><strong>Vous pouvez donc déployer le même package plusieurs fois sur une même sentinelle en déclarant plusieurs instances (name) du même package (filename)</strong>.</p>
<h3>Résolution semi-implicite / semi-explicite d’un package</h3>
<p>Le problème des instances multiples est que vous déclarez explicitement le fichier (filename) à utiliser.</p>
<p>Dans l’exemple précèdent “SENTINEL-DEMO/HWMonitor1” et “SENTINEL-DEMO/HWMonitor2” sont des instances du même package “HWMonitor.zip” qui d’après les exemples précédents correspond à la version “1.0” du package “HWMonitor”.</p>
<p>Toujours d’après les exemples précédents, on dispose également de la version 1.1 et 1.2 de ce package dans le « Package Repository »  (fichiers HWMonitor-1.1.zip et HWMonitor-1.2.zip).</p>
<p>Pour mettre à jour ces deux instances (“SENTINEL-DEMO/HWMonitor1” et “SENTINEL-DEMO/HWMonitor2”) vers une version plus récente, disons la version 1.2, il faudra modifier à la fois l’attribut “filename” de l’instance “HWMonitor1” mais également celui de l&rsquo;instance de “HWMonitor2”.</p>
<p>Ce qui revient à écrire :</p>
<p></p><pre class="crayon-plain-tag">&lt;sentinel name="SENTINEL-DEMO" credential="Standard"&gt;
    &lt;packages&gt;    
      &lt;package name="HWMonitor1" filename="HWMonitor-1.2.zip"&gt;&lt;/package&gt;
      &lt;package name="HWMonitor2" filename="HWMonitor-1.2.zip"&gt;&lt;/package&gt;
   &lt;/packages&gt;
&lt;/sentinel&gt;</pre><p></p>
<p>Pour éviter cela, il y a un “mode intermédiaire” qu’on pourrait nommer résolution “semi-implicite” ou “semi-explicite” car il s’agit d’un mixte de ces deux modes !</p>
<p>Pour l’utiliser, <strong>il suffit d’omettre l’extension “.zip” dans l’attribut “filename”</strong>.</p>
<p>Dans notre exemple, déclarez simplement :</p>
<p></p><pre class="crayon-plain-tag">&lt;sentinel name="SENTINEL-DEMO" credential="Standard"&gt;
    &lt;packages&gt;    
      &lt;package name="HWMonitor1" filename="HWMonitor"&gt;&lt;/package&gt;
      &lt;package name="HWMonitor2" filename="HWMonitor"&gt;&lt;/package&gt;
   &lt;/packages&gt;
&lt;/sentinel&gt;</pre><p></p>
<p>On a toujours deux instances “HWMonitor1” et “HWMonitor2” et ces deux instances déclarent le “filename” à “HWMonitor”.</p>
<p>Sans l’extension “.zip”, “HWMonitor” ne correspond à aucun <u>fichier</u> de notre repository et c’est donc là que<strong> Constellation réalise une résolution partielle : semi-explicite / semi-implicite</strong>.</p>
<p><strong>Cette résolution partielle sélectionne la dernière version du package qui porte le nom déclaré dans attribut “filename”</strong> (ici nommé “HWMonitor”).</p>
<p>Ainsi en ajoutant la version 1.3 du package “HWMonitor” dans notre repository, les deux instances seront mises à jour avec la version 1.3 de ce package sans avoir besoin de modifier la configuration de notre Constellation.</p>
<h3>Pour résumer</h3>
<ul>
<li>Un package déployé sur une sentinelle est une instance de package (couple Sentinelle/Package)</li>
<li>Chaque instance a son propre cycle de vie, sa propre configuration et sa propre identité dans la Constellation</li>
<li>Il n’y a pas de lien entre le nom du package et le nom de l’instance du package, vous pouvez nommer vos instances sans restriction à partir du moment où elles sont uniques pour une même sentinelle</li>
<li>Vous pouvez avoir plusieurs instances d’un même package sur une même sentinelle</li>
<li>Vous pouvez également avoir plusieurs instances de versions différentes d’un même package sur une même sentinelle</li>
<li>Les packages (fichiers ZIP) sont tous stockés dans le “Package Repository” du serveur</li>
<li>Pour résoudre le package à utiliser pour une instance :
<ol>
<li>Si l’attribut “filename” est défini :
<ol>
<li>Et qu’il correspond à un fichier du “Package Repository”, c’est ce package qui sera utilisé pour l’instance du package</li>
<li>Sinon, sans extension .ZIP, on utilise la version la plus haute du package dont le nom (déclaré dans le manifeste) est celui déclaré dans l’attribut “filename”</li>
</ol>
</li>
<li>Sinon, sans l’attribut “filename” :
<ol>
<li>On utilise la version la plus haute du package dont le nom (déclaré dans le manifeste) est celui déclaré dans l’attribut “name” (c’est à dire le nom de l’instance du package)</li>
<li>Sinon on utilise le package qui se nomme &lt;name&gt;.zip si ce fichier existe dans le “Package Repository”</li>
<li>Sinon une erreur est levée</li>
</ol>
</li>
</ol>
</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/instance-package-versioning-et-resolution/">Instance de package, package, versioning, multi-instances et résolution des packages</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/concepts/instance-package-versioning-et-resolution/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Le Package Manifest</title>
		<link>https://developer.myconstellation.io/concepts/package-manifest/</link>
					<comments>https://developer.myconstellation.io/concepts/package-manifest/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Wed, 16 Mar 2016 14:16:21 +0000</pubDate>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[PackageManifest]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=1345</guid>

					<description><![CDATA[<p>Le fichier XML “PackageInfo.xml” représente le manifeste d’un package Constellation. Il doit être présent à la racine de chaque package. Il contient toutes les informations décrivant un package. Ce fichier est automatiquement créé par Visual Studio lorsque vous créez un</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/package-manifest/">Le Package Manifest</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Le fichier XML “PackageInfo.xml” représente le manifeste d’un package Constellation. Il doit être présent à la racine de chaque package. Il contient toutes les informations décrivant un package.</p>
<p>Ce fichier est automatiquement créé par Visual Studio lorsque vous créez un projet de type Constellation.</p>
<p>Il contient trois parties :</p>
<ol>
<li>Les informations générales sur votre package</li>
<li>Les informations de compatibilité du package</li>
<li>Les informations sur les settings du packages</li>
</ol>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;Package xmlns="http://schemas.myconstellation.io/Constellation/1.8/PackageManifest"
         Name="DemoPackage" 
         Version="1.0"
         Author="Sebastien Warin"         
         URL="http://sebastien.warin.Fr"
         Description="Demo package for Constellation"
         RequestLastStateObjectsOnStart="true"
         EnableControlHub="false"&gt;
  &lt;Compatibility constellationVersion="1.8"&gt;
    &lt;Platforms&gt;
      &lt;Platform id="Win32NT" isCompliant="true" /&gt;
      &lt;Platform id="MacOSX" isCompliant="false" /&gt;
      &lt;Platform id="Unix" isCompliant="true" /&gt;
    &lt;/Platforms&gt;
  &lt;/Compatibility&gt;
  &lt;Settings&gt;
    &lt;Setting name="MonInterval" type="Int32" defaultValue="2016" isRequired="false" /&gt;
    &lt;Setting name="MyConfigElement" type="ConfigurationSection" isRequired="true" schemaXSD="MyPackageConfigurationDesigner.xsd" /&gt;
  &lt;/Settings&gt;
&lt;/Package&gt;</pre><p></p>
<h3>Informations générales</h3>
<p>Vous pouvez définir sur l’élément racine “Package” les attributs suivants :</p>
<ul>
<li><u>Name</u> : le nom du package (il s’agit de l’identifiant). Si pas défini, le nom du package est le nom du fichier (sans l’extension ”.zip”)</li>
<li><u>Description</u> : le texte de description de votre package tel qu’il apparaîtra sur le catalogue</li>
<li><u>Author</u> : nom de l’auteur du package</li>
<li><u>URL</u> : URL de l’auteur</li>
<li><u>PackageUrl</u> : URL spécifique au package</li>
<li><u>Version</u> : version du package. Si pas défini, la version du package est le numéro de version de l’assembly.</li>
<li><u>Icon</u> : chemin relatif vers l’icone du package</li>
<li><u>ExecutableFilename</u> : le nom de l’exécutable du package. Si pas défini, l’exécutable est le “&lt;nom du package&gt;.exe”</li>
<li><u>RequestLastStateObjectsOnStart</u> : booléen indiquant si vous souhaitez recevoir les StateObjects produits par votre package lors de sa dernière exécution. (<a href="/client-api/net-package-api/persistance-de-donnes-dans-un-package/#Utiliser_les_StateObjects_comme_stockage">voir ici</a>)</li>
<li><u>EnableControlHub</u> : booléen indiquant si vous souhaitez connecter votre package au hub de contrôle. (<a href="/client-api/net-package-api/controlmanager/">voir ici</a>)</li>
</ul>
<h3>Informations de compatibilité</h3>
<p>Vous pouvez définir des informations quant à la compatibilité de votre package.</p>
<p>Sur l’élément “Compatibility” vous pouvez indiquer les attributs suivants :</p>
<ul>
<li><u>dotNetTargetPlatform</u> : version du framework .NET utilisée (net40 ou net45)</li>
<li><u>constellationVersion</u> : version de la Constellation utilisée (“1.7” ou “1.8” à l’heure actuelle)</li>
</ul>
<p>Vous pouvez également ajouter des éléments enfants “Platforms” pour indiquer les plateformes supportées. Chaque “Platform” définie les attributs :</p>
<ul>
<li><u>id</u> : identifiant de la plateforme (Win32NT, Unix ou MacOSX)</li>
<li><u>isCompliant</u> : booléen indiquant si la plateforme est supportée ou non</li>
</ul>
<p>Par exemple si vous développez un package Python exploitant les GPIO d’un Raspberry, vous allez indiquer :</p>
<p></p><pre class="crayon-plain-tag">&lt;Platforms&gt;
  &lt;Platform id="Win32NT" isCompliant="false" /&gt;
  &lt;Platform id="Unix" isCompliant="true" /&gt;
  &lt;Platform id="MacOS" isCompliant="false" /&gt;
&lt;/Platforms&gt;</pre><p></p>
<p>A l’inverse, un package comme HWMonitor qui utilise des API spécifiques à Windows, vous allez indiquer qu’il n’est pas compatible sur Unix/Linux et MacOS par les lignes :</p>
<p></p><pre class="crayon-plain-tag">&lt;Platforms&gt;
  &lt;Platform id="Win32NT" isCompliant="true" /&gt;
  &lt;Platform id="Unix" isCompliant="false" /&gt;
  &lt;Platform id="MacOS" isCompliant="false" /&gt;
&lt;/Platforms&gt;</pre><p></p>
<p>Au démarrage d’un package, la sentinelle lancera des “Warnings” dans les logs Constellation si le package ne respecte pas le contrat de compatibilité sans toutefois bloquer le démarrage.</p>
<p>Ces informations servent également pour la Console Constellation, afin de vous donner des informations lors de la ajout et configuration des packages de votre Constellation.</p>
<h3>Informations sur les Settings du package</h3>
<p>Enfin, la troisième et dernière partie du manifeste sert à décrire les settings utilisés par un package.</p>
<p>La déclaration des settings dans le manifeste n’a pas impact sur le fonctionnement du package mais il permet de décrire les clés de configuration utilisées par le package pour que des outils tel que la Console Constellation puisse proposer une interface graphique de configuration pour chaque package. Il est donc vivement recommandé de décrire les settings de ses packages. De plus il est possible de définir des valeurs par défaut dans le manifeste.</p>
<p>Chaque setting déclaré dans le manifeste doit obligatoirement comporter les attributs suivants  :</p>
<ul>
<li><u>Name</u> : le nom (clé) du setting</li>
<li><u>Type</u> : le type du setting</li>
</ul>
<p>Le type peut être :</p>
<ul>
<li><u>Boolean</u> : un booléen (true/false)</li>
<li><u>Double</u> : un double</li>
<li><u>String</u> : un chaine de caractère</li>
<li><u>Int32</u> : un entier (32 bits)</li>
<li><u>Int64</u> : un long (64 bits)</li>
<li><u>ConfigurationSection</u> : un section de configuration .NET</li>
<li><u>DateTime</u> : un DateTime</li>
<li><u>TimeSpan</u> : une durée</li>
<li><u>XmlDocument</u> : un document XML</li>
<li><u>JsonObject</u> : un objet JSON (objet ou tableau)</li>
</ul>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;Settings&gt;
  &lt;Setting name="MyStringSetting" type="String"  /&gt;
  &lt;Setting name="MyIntSetting" type="Int32" /&gt;
  &lt;Setting name="MyBoolSetting" type="Boolean" /&gt;
  &lt;Setting name="MyXmlDocument" type="XmlDocument" /&gt;
  &lt;Setting name="MyJsonObject" type="JsonObject" /&gt;
&lt;/Settings&gt;</pre><p></p>
<p>Sur chaque setting déclaré, vous pouvez également définir les attributs suivants :</p>
<ul>
<li>“<u>isRequiered</u>“ : indique si le setting est obligatoire ou non (par défaut “false”). Si le setting n’est pas déclaré, une erreur est levée.</li>
<li>“<u>description</u>” : permettant de donner une explication sur le setting (affichée à l’utilisateur sur la Console Constellation)</li>
<li>“<span style="text-decoration: underline;">defaultValue</span>” : la valeur par défaut du setting si le setting n’est pas déclaré (<a href="/client-api/net-package-api/settings/#Resolution_des_settings">plus d&rsquo;info</a>)</li>
<li>“<u>schemaXSD</u>” : indique le nom du fichier du schéma XSD (chemin relatif au package) que la valeur XML doit valider (seulement pour les settings de type XmlDocument ou ConfigurationSection)</li>
<li>“<u>ignoreLocalValue</u>” : si “true” alors la valeur définie dans le fichier local App.config est ignorée  (<a href="/client-api/net-package-api/settings/#Declarez_des_settings_dans_votre_configuration_local">plus d’info</a>)</li>
<li>“<u>ignoreDefaultValue</u>” : si “true” alors la valeur par défaut définie dans le manifeste est ignorée</li>
</ul>
<p>Pour les settings XmlDocument, ConfigurationSection et JsonObject vous pouvez également ajouter une sous-section &lt;defaultContent&gt; sur vos settings pour définir le contenu par défaut.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;Settings&gt;
  &lt;Setting name="MyStringSetting" type="String" description="This is a String setting" ignoreLocalValue="true" /&gt;
  &lt;Setting name="MyIntSetting" type="Int32" isRequired="false" defaultValue="1234"  /&gt;
  &lt;Setting name="MyBoolSetting" type="Boolean" /&gt;
  &lt;Setting name="MyXmlDocument" type="XmlDocument" schemaXSD="MonSchema.xsd" /&gt;
  &lt;Setting name="MyJsonObject" type="JsonObject" isRequired="true" ignoreDefaultValue="true"&gt;
    &lt;defaultContent&gt;
      &lt;![CDATA[
      {
        "Number": 123,
        "String" : "This is a test (local)",
        "Boolean": true
      }
      ]]&gt;
    &lt;/defaultContent&gt;
  &lt;/Setting&gt;
&lt;/Settings&gt;</pre><p></p>
<p>A lire également : <a href="/client-api/net-package-api/settings">Les Settings d&rsquo;un package</a></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/package-manifest/">Le Package Manifest</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/concepts/package-manifest/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Mise en cache de page à l’aide de Disk: Enhanced 

Served from: developer.myconstellation.io @ 2026-01-21 12:08:04 by W3 Total Cache
-->