Modélisation d'application

Le fichier appmodel/metadata.json décrit les composants, les liens et les règles implémentés dans le plug-in.

D'autres fichiers de ce répertoire sont référencés à partir de metadata.json, principalement des fichiers image pour les icônes à afficher dans Pattern Builder. Les métadonnées décrivent comment le générateur de canevas affiche visuellement des composants, des liens et des règles et déterminent quels paramètres de configuration sont affichés pour les utilisateurs.

Définition des composants et de liens

Les exemples suivants montrent comment les propriétés sont définies pour un composant et un lien.

Figure 1. Exemple de composant à partir du plug-in WebSphere Application Server
[
   {
      "id":"WAS",
      "label":"Web Application (WAS)",
      "description":"Web application on a WAS instance",
      "type":"component",
      "thumbnail":"appmodel/images/thumbnail/WAS.gif",
      "image":"appmodel/images/WAS.gif",
      "attributes":[
         {
            "id":"archive",
            "label":"WAR/EAR File",
            "description":"Name of the WAR file",
            "type":"file",
            "required": true
         } ,
         {
            "id":"WAS_Version",
            "label":"WAS Version",
            "description"
              :"Version of WebSphere Application Server",
            "sampleValue":"7.0",
            "type":"string",
            "options":[
               {
                  "name":"WebSphere Application Server 7.0",
                  "value":"7.0"
               }
            ]
         }
      ]
   }
...
]
Figure 2. Exemple de lien du plug-in wasdb2
[
   {
      "id":"WASDB2",
      "label":"Data source of DB2",
      "type":"link",
      "source":[
         "WAS"
      ],
      "target":[
         "DB2"
      ],

      "multiplicity": "many-to-one"
      "attributes":[
         {
            "id":"jndiDataSource",
            "label":"JNDI Name of Data Source",
            "type":"string",
            "required": true
         },
         {
            "id":"XADataSource",
            "label":"Two-Phase TX Support",
            "description":"DataSource implementation type",
            "type":"boolean",
            "sampleValue":true
         }
      ]
   }
]
Les métadonnées constituent un tableau d'objets widget-def avec les paramètres de configuration suivants :
ID
Obligatoire. Doit être unique dans tous les plug-in du type de canevas.
libellé
Obligatoire. Libellé de l'entrée dans le panneau Actifs du générateur de canevas.
description
Optionnel. Infobulle pour l'entrée dans le panneau Actifs du générateur de canevas.
type
Obligatoire. Type d'élément que vous définissez. Les valeurs admises sont les suivantes :
  • component
  • link
  • policy
miniature
Optionnel. URL de l'icône 48x48 (relative au plug-in).
image
Optionnel. URL de l'icône 64x64 (relative au plug-in).
attributs
Liste d'objets attribute-def, décrits dans la section suivante.
applicableTo
Pour le type policy uniquement. ID du type de composant auquel la règle peut être associée. Le générateur de canevas n'autorise pas d'autres associations. Utilisez un caractère générique (*) pour permettre l'association de la règle à tout type de composant.
applicationPolicy
Pour le type policy uniquement. Si cet attribut a la valeur true, la règle ne s'affiche que dans les règles disponibles au niveau de l'application et ne peut pas être associée à un composant. Les valeurs admises sont les suivantes :
  • true
  • false (par défaut)
déprécié
Optionnel. Pour le type component uniquement. Utilisez ce paramètre pour marquer un composant particulier comme obsolète. Le composant s'affiche avec une icône d'avertissement dans le panneau Actifs du générateur de canevas. L'utilisateur peut cliquer sur X pour supprimer le composant de l'application, mais cette modification n'est pas conservée. Les valeurs admises sont les suivantes :
  • true (par défaut)
  • false
multiplicity
Pour le type link uniquement. Utilisez ce paramètre pour définir le nombre de liens pouvant être créé entre une source et une cible données. Un message d'avertissement s'affiche lors de la création, de l'importation ou du déploiement d'un canevas si la contrainte n'est pas respectée. Les valeurs admises sont les suivantes :
  • many-to-many (par défaut)
  • one-to-one
  • one-to-many
source
Pour le type link uniquement. ID du type de composant à partir duquel le lien peut être créé. Utilisez un caractère générique (*) pour autoriser la création d'un lien à partir de tout type de composant, autre que le composant lui-même, vers ce composant.
Remarque: le caractère générique peut être utilisé uniquement pour le source ou le target d'un composant, mais pas les deux.
cible
Pour le type link uniquement. ID du type de composant vers lequel le lien peut être créé. Utilisez un caractère générique (*) pour autoriser la création d'un lien à partir de tout type de composant, autre que le composant lui-même, vers ce composant.
Remarque: le caractère générique peut être utilisé uniquement pour le source ou le target d'un composant, mais pas les deux.

Attributs des composants, des liens et des règles

Les propriétés suivantes peuvent être définies pour les objets attribute-def :
générateur
Optionnel. Indique si l'attribut s'affiche dans la feuille de propriétés du générateur de canevas. Les valeurs admises sont les suivantes :
  • true (par défaut)
  • false
déployable
Optionnel. Indique si l'attribut s'affiche dans la page de paramètres de déploiement d'application virtuelle. Les valeurs admises sont les suivantes :
  • true
  • false (par défaut)
description
Optionnel. Description de la propriété que l'utilisateur peut configurer.
déprécié
Optionnel. Utilisez cette propriété pour marquer un attribut particulier comme obsolète. L'utilisateur reçoit un message indiquant que l'attribut est obsolète au chargement de l'application. Une fois l'application chargée, l'attribut s'affiche avec (Obsolète) en regard du libellé. L'utilisateur peut cliquer sur supprimer pour supprimer l'attribut de l'application. Les valeurs admises sont les suivantes :
  • true (par défaut)
  • false
displayType
Optionnel. Indique comment les propriétés sont affichées dans l'interface utilisateur. Si vous n'indiquez pas de valeur pour displayType, la valeur par défaut de l'élément type spécifié est utilisé. Les valeurs admises sont :
  • radio
  • multi-string (pour une zone de texte multiligne)
  • password
  • percentage
  • dynamic (un bouton Ajouter ajoute alors d'autres attributs de manière dynamique)
Si le type est défini sur array, l'affichage du tableau dépend de la spécification de l'élément options.
  • Si l'élément options est spécifié, une zone de liste s'affiche et les utilisateurs peuvent effectuer une sélection parmi les valeurs spécifiées.
  • Si options n'est pas spécifié, une zone de texte à plusieurs lignes s'affiche et les valeurs du tableau qui sont entrées par l'utilisateur doivent être séparées par une virgule (,).
Extensions
Optionnel. Tableau de chaînes indiquant une extension de fichier valide. Utilisé uniquement lorsque le type est file.
ID
Obligatoire. Doit être unique dans le composant, le lien ou la règle que vous définissez.
invalidMessage
Optionnel. Message à afficher si la valeur spécifiée par l'utilisateur n'est pas valide.
Remarque: un message par défaut s'affiche si invalidMessage n'est pas défini et que l'utilisateur spécifie une valeur qui se trouve en dehors des limites min et max .
libellé
Obligatoire. Libellé affiché dans la feuille de propriétés du générateur de canevas.
max
Optionnel. Valeur maximale pour le type range.
Remarque: un message par défaut s'affiche si invalidMessage n'est pas défini et que l'utilisateur spécifie une valeur max qui est en dehors de cette limite max .
maxOccurs
Optionnel. Indique le nombre de liens pouvant être créés entre un composant source et un composant cible. Si maxOccurs n'est pas utilisé ou que sa valeur est égale à -1, un nombre illimité de liens peuvent être créés entre le composant source et le composant cible. Si une valeur autre que -1 est spécifiée, le nombre de liens entre le composant source et le composant cible ne peut pas dépasser la valeur spécifiée.
min.
Optionnel. Valeur minimale pour le type range.
Remarque: un message par défaut s'affiche si invalidMessage n'est pas défini et que l'utilisateur spécifie une valeur min qui est en dehors de cette limite min .
options
Optionnel. Tableau d'objets pour les valeurs de propriétés que l'utilisateur peut choisir dans l'interface utilisateur. Comme indiqué dans l'exemple de plug-in WebSphere® Application Server , les clés sont name et value.
referenceKey
Optionnel. Nom logique pour une référence de ressource définie dans un fichier WAR, EAR ou OSGi. Pour plus d'informations sur les références de ressource, voir Références de ressource.
referenceType
Optionnel. Sert à identifier le type de référence de ressource dans un fichier WAR, EAR ou OSGi. Pour plus d'informations sur les références de ressource, voir Références de ressource.
regExp
Optionnel. Expression régulière pour la valeur d'entrée de type string. Permet de vérifier s'il existe des entrées valides.
Remarque: Si vous utilisez un caractère spécial dans l'expression régulière, tel que \d, vous devez utiliser un caractère d'échappement: \. Par exemple, "regExp": "\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}".
obligatoire
Optionnel. Indique si la propriété est requise. Les valeurs admises sont les suivantes :
  • true (par défaut)
  • false
type
Obligatoire. Type de propriété. Les types suivants sont pris en charge :
tableau
Une liste de valeurs, qui sont séparées par des virgules. Les valeurs doivent être des chaînes. Par exemple, ["item 1", "item 2", "item 3"].
booléen
Les valeurs admises sont true et false.
String
Le texte qui est placé entre guillemets. Par exemple, "item 1".
nombre
Nombre. Par exemple, 3.1415926.
fichier
Fichier téléchargé par l'utilisateur. Chaîne qui indique le chemin et le nom du fichier. Par exemple, "./archive/test.war".
plage
Sous forme de plage de valeurs. Utilisée avec les propriétés min et max.
objet
Objet. Une valeur valide est un objet JSON.
sampleValue
Optionnel. Valeur par défaut pour la propriété.
Les exemples suivants présentent le mode d'affichage de différents attributs dans l'interface.
Tableau 1. Exemples d'attributs
type displayType options contraintes Exemple
array      

Une zone de texte à plusieurs lignes s'affiche et les valeurs entrées par l'utilisateur doivent être séparées par une virgule.

array   options  

Une zone de liste s'affiche dans laquelle l'utilisateur peut sélectionner une ou plusieurs valeurs.

boolean     required exemple de valeur booléenne
string    
regExp
required
exemple de chaîne
string   options required exemple de chaîne avec des options de liste déroulante
string radio options required exemple de chaîne avec des options de bouton d'option
string password  
regExp
required
Exemple de mot de passe
string multi-string   required Exemple de chaîne multiple (zone de texte)
number    
required
min
max
exemple de nombre
number percentage  
required
min
max
exemple de pourcentage
file    
required
extensions
exemple de fichier pour le téléchargement
range    
required
min
max
incrémentielles
exemple de plage
range    
required
min
max
incrémentielles
exemple de plage

Groupes d'attributs

Tous les attributs de composants, les liens et les règles peuvent être regroupés dans appmodel/metadata.json. Un groupe peut être activé ou désactivé. Si un groupe est désactivé, tous les attributs qu'il contient sont supprimés de l'application virtuelle.

L'exemple suivant illustre un groupe d'attributs dans la règle de mise à l'échelle WebSphere Application Server :
{
        "id": "ScalingPolicyofWAS",
        "label": "SCALLING_LABEL",
        "type": "policy",
        "applicableTo": [
            "WAR",
            "EAR",
            "OSGiEBA" 
        ],
        "thumbnail": "appmodel/images/thumbnail/ClusterPolicy_48.png",
        "image": "appmodel/images/ClusterPolicy_64.png",
        "description": "SCALLING_DESCRIPTION",
        "groups": [  
            {
                "id" : "CPUBased",
                "label": "SCALE_POLICY_TYPE_CPU",
                "defaultValue" : false,
                "attributes": [
                    "CPU.Used" ,
                    "triggerTime.CPUBased",
                    "actionType.CPUBased"
                ],
				"description":"SCALE_POLICY_TYPE_CPU_DESCRIPTION" 
            } ,
             {
                "id" : "MemoryBased",
                "label": "SCALE_POLICY_TYPE_MEMORY",
                "defaultValue" : false,
                "attributes": [
                    "Memory.Used" ,
                    "triggerTime.MemoryBased",
                    "actionType.MemoryBased"
                ],
				"description":"SCALE_POLICY_TYPE_MEMORY_DESCRIPTION" 
            } ,
            {
                "id" : "ResponseBased",
                "label": "SCALE_POLICY_TYPE_RESPONSE",
                "defaultValue" : false,
                "attributes": [
                    "WAS_WebApplications.max_service_time",
                    "triggerTime.ResponseBased" 
                ],
				"description":"SCALE_POLICY_TYPE_RESPONSE_DESCRIPTION" 
            } ,
            {              
                "id" : "DBConnectBased",
                "label": "SCALE_POLICY_TYPE_DBCONNECTION",
                "defaultValue" : false,
                "attributes": [              
                    "WAS_JDBCConnectionPools.wait_time",
                    "WAS_JDBCConnectionPools.percent_used" ,
		            "triggerTime.DBConnectBased" 
                ],
				"description":"SCALE_POLICY_TYPE_DBCONNECTION_DESCRIPTION" 
            } 
        ],
        "attributes": [
        	{"id" : "version",
        	 "label" : "no display",
        	  "builder": false,
        	  "type" : "string",
        	  "sampleValue": "1"        	  
        	},
            {
                "id": "CPU.Used",
                "label": "SCALE_ATTRIBUTES_CPU",
                "type": "range",
                "displayType": "percentage",
                "required": false,
                "max": 100,
                "min": 10,
                "sampleValue": [
                    20,
                    80 
                ],
                "description": "SCALE_ATTRIBUTES_CPU_DESCRIPTION" 
            },
       ......
        ] 
    },
Les propriétés de l'objet de groupe sont les suivantes :
ID
Obligatoire. Doit être unique dans le composant, le lien ou la règle que vous définissez.
libellé
Obligatoire. Libellé affiché dans le panneau du générateur de canevas.
attributs
Obligatoire. Liste des ID d'objet attribute-def dans ce composant, lien ou règle.
catégorie
Optionnel. Une catégorie qui est associée au groupe. Les groupes ayant le même nom de catégorie sont exclusifs les uns des autres.
obligatoire
Optionnel. Indique si un groupe est requis. Un groupe avec required = true ne peut pas être désactivé. Les valeurs admises sont :
  • true
  • false

Gestion d'un fichier téléchargé

Pour le type file, votre plug-in doit inclure la gestion du fichier téléchargé par un utilisateur.

Lorsqu'un fichier est téléchargé par un utilisateur, il est placé dans l'entrepôt. Lorsque le modèle d'application est transformé en document de topologie, la définition vm-template doit inclure un paramètre pour le fichier. Ce paramètre active le script de cycle de vie sur la machine virtuelle déployée afin de permettre la récupération du fichier sur cette machine et, le cas échéant, l'extraction de son contenu.

Par exemple, metadata.json définit un fichier d'archivage.
"attributes"  : [
  {
  "id"          : "archive",
  "label"       : "ARCHIVE_LABEL",
  "description" : "ARCHIVE_DESCRIPTION",
  "type"        : "file",
  "required"    : true,
  "extensions"  : [
  "zip","tgz","tar.gz" 
  ] 
},
L'élément vm-template inclut alors un paramètre ARCHIVE qui référence l'attribut avec l'ID archive.
 "roles"    : [
  {
  ................
  "name"         : "",
  "type"         : "",
  "parms":{
  "ARCHIVE"   : "$provider.generateArtifactPath( $applicationUrl, ${attributes.archive} )",
  ................
Un script de cycle de vie sur la machine virtuelle déployée peut ensuite référencer le paramètre ARCHIVE pour extraire le fichier. Dans cet exemple, l'utilitaire maestro.downloadx télécharge et extrait le fichier. Vous pouvez également utiliser maestro.download pour télécharger le fichier sans extraire le contenu.
ARCHIVE = maestro.parms['ARCHIVE']
# Download and unzip archive file
logger.debug("Starting to download the archive file...")
maestro.downloadx(ARCHIVE, deployDir)

Définition de correctifs temporaires

Les utilisateurs peuvent télécharger un correctif temporaire IBM® et l'ajouter au catalogue en tant que correctif d'urgence. Un correctif temporaire disponible dans le catalogue peut être ajouté à un canevas d'application virtuelle à l'aide du générateur de canevas afin qu'il soit installé lors du déploiement. Actuellement, seuls les correctifs temporaires WebSphere Application Server pour les déploiements basés sur IBM Web Application Pattern sont pris en charge au niveau du composant.

Utilisez une règle de correctif temporaire au niveau de l'application pour installer les mises à jour du type de canevas et des plug-in lors du déploiement.

Lorsqu'un correctif temporaire est ajouté à un canevas d'application virtuelle, le système ajoute les URL des correctifs temporaires sélectionnés au document de modèle d'application appmodel.json en tant qu'attributs:
"attributes": {
		"archive": "artifacts/simple2.war", 
		"ifixes": [
			"https://localhost:9443/services/ifixes/1/scriptArchive.zip",
			"https://localhost:9443/services/ifixes/2/scriptArchive.zip"
		], 
		"ignoreFailedIfix": true,
        ...
}
Lors du déploiement, le modèle d'application est transformé en document de topologie (topology.json) et vm-template comporte un paramètre IFIXES qui référence les URL des correctifs temporaires. Par exemple, le document de topologie inclut :
"roles": [
    {
      ...
      "parms": {
         "ARCHIVE": "$$1",
         "RESTART_INTERVAL": 24,
         "KEYSTORES_PASSWORD": "<xor>BSdtBiUPOwwGbCVr",
         "IFIXES": [
             "https://localhost:9443/services/ifixes/1/scriptArchive.zip",
             "https://localhost:9443/services/ifixes/2/scriptArchive.zip"
         ],
         "USERID": "virtuser",
         "PASSWORD": "$$2",
         "ignoreFailedIfix": "true",
         "hugePageSize": 2048
      },
      ...
    }
]

Le script de cycle de vie sur la machine virtuelle déployée prend les informations figurant dans le document de topologie pour télécharger les correctifs temporaires sur la machine virtuelle déployée et installer ceux applicables.

Références de ressource

Une référence de ressource est un nom logique qui permet de localiser une ressource externe pour une application. Au moment du déploiement, les références sont liées à l'emplacement physique (nom JNDI global) de la ressource dans l'environnement cible. Dans le générateur de canevas, le système analyse un canevas d'application virtuelle pour rechercher toutes les références dans les fichiers EAR, WAR ou OSGi téléchargés. Le système mappe ensuite les références de ressource qu'il trouve lors du processus d'analyse vers les références de ressource définies dans vos plug-in.

Quand vous incluez referenceType et referenceKey dans une définition de propriété dans metadata.json, vous pouvez obtenir les valeurs de la définition de référence de ressource dans le descripteur de déploiement du fichier EAR, WAR ou OSGi.

Par exemple, si le descripteur de déploiement dans une source de données inclut cette définition de référence de ressource :
<resource-ref>
	<res-ref-name>jdbc/TradeDataSource</res-ref-name>
   <res-type>javax.sql.DataSource</res-type>
</resource-ref>
Les métadonnées du composant WASDB2 ont une propriété appelée resourceRefs qui mappe vers cette définition :
{
  "id"           : "resourceRefs",
  "label"        : "DS_RESOURCE_REFERENCE_LABEL",
  "type"         : "array",
  "required"     :  false,
  "description"  : "DS_RESOURCE_REFERENCE_DESC",
  "referenceType": "javax.sql.DataSource",
  "referenceKey" : "res-ref-name"
}
La valeur de referenceType correspond à l'élément res-type dans le descripteur de déploiement et la valeur de referenceKey correspond à l'élément res-ref-name. Par conséquent, la valeur jdbc/TradeDataSource dans le descripteur de déploiement est considérée comme candidate pour la propriété resourceRefs.

Règles

Une règle est un objet JSONObject défini dans metadata.json. Les règles s'appliquent à des composants.

Il existe deux approches pour la définition d'une règle.
Extended (type 1)

Cette implémentation est celle par défaut. Pour une règle étendue, les transformations de composant, de règle et de composant sont étroitement associées et sont généralement implémentées et transmises dans le même plug-in. TopologyProvider dispose de la méthode getPolicy(JSONObject component, String policyName) permettant à la transformation de composant d'accéder aux règles et à leurs attributs. Une règle étendue est tout simplement un ensemble supplémentaire d'attributs qui sont ajoutées à un composant. Ces attributs sont traités par la transformation pour le composant.

Règle liée (type 2)

Dans une approche de règle liée, une règle définie dans un plug-in permet d'étendre les capacités d'un composant existant défini dans un autre plug-in.

Dans les deux cas, la définition de la règle est la même dans metadata.json. L'exemple de règle qui est fourni dans le kit de développement de plug-in comporte la règle suivante :
Figure 3. Exemple de règle
"id": "xpolicy",
"type": "policy",
"applicableTo": [  "Hello"  ],
"attributes": [ {}, ... ]
"id" : "HLPolicy",
"type" : "policy",
"transformAs" : "linked",
"applicableTo" : [ "Hello" 
"attributes" : [
   {
   "id" : "lp1",
   "label" : "linked policy value1",
   "type" : "string",
   "required" : true,
   "sampleValue" : "sample linked policy value"
   }
] 

Le paramètre transformAs est facultatif et peut avoir la valeur extended ou linked. Si transformAs n'est pas spécifié, la règle est traitée en tant que règle étendue par défaut.

Dans Pattern Builder, l'expérience utilisateur est la même pour les deux types de règles. Toutefois, la différence entre les deux types de règle se trouve dans l'implémentation. Du point de vue de la perspective d'implémentation, une règle liée devient un composant avec des attributs. Un lien est créé du composant de règle vers le composant modifié par la règle.
  • La règle lié est le composant cible
  • Le composant source est le composant qui est défini par la valeur applicableTo dans metadata.json.
La sélection des composants source et cible permet une implémentation aisée des règles liées au moyen des transformations de modèle Velocity, ce qui distingue cette fonction de l'implémentation de règles étendues.
Lorsque le modèle d'application est traité :
  1. Tous les composants sont transformés avant tous les liens.
  2. Si le composant source du lien 1 est le lien cible du lien 2, le lien 1 est transformé avant le lien 2.

Implémentation de règle liée

L'exemple de règle liée HLPolicy devient un lien du composant (HLPolicy) avec un lien du composant Hello vers le composant HLPolicy. Lors du déploiement, le composant Hello est d'abord transformé et toutes ses règles par défaut sont traitées par le transformateur de composant Hello . Le composant Hello dépend du composant HelloCenter. Le composant HelloCenter est également transformé, soit avant, soit après le composant Hello. Le composant HLPolicy est également transformé, et l'ordre entre ces trois composants est indéterminé. Ensuite, le lien hclink entre Hello et HelloCenter est traité. Le lien entre Hello et HLPolicy est traité, mais l'ordre de traitement de ces liens est indéterminé, car le composant Hello est la source de chaque lien.

Le composant Hello est déployé sur une machine virtuelle avec un rôle Hello et les scripts de cycle de vie de rôle correspondant. Ces artefacts définissent le comportement de base. L'exemple de règle modifie ce comportement de base. Le plug-in HLPolicy fournit d'autres scripts de cycle de vie. La modélisation de la règle en tant que dépendance d'extension du rôle permet d'ajouter d'autres comportements.

Sans la règle, l'agent de charge de travail exécute les scripts de rôle dans cet ordre :
  • {scriptdir}/Hello/install.py
  • {scriptdir}/Hello/configure.py
  • {scriptdir}/Hello/start.py
Lorsque la règle est ajoutée, plusieurs scripts sont inclus :
  • {scriptdir}/Hello/install.py
  • {scriptdir}/Hello/HLPOLICY/install.py
  • {scriptdir}/Hello/configure.py
  • {scriptdir}/Hello/HLPOLICY/configure.py
  • {scriptdir}/Hello/start.py
Remarque: tous les scripts sont facultatifs, mais cet exemple montre ce qui est possible.
Pour créer cette implémentation, les artefacts suivants sont requis :
  • Une nouveau composant avec un ensemble de scripts Hello/HLPOLICY doivent être ajoutés à la machine virtuelle.
  • Un objet depends doit être ajouté au rôle Hello.
Le transformateur de règles (modèles Velocity HLPolicyTransform.java ou hlpolicy{component,link}.vm) ajoute ces deux artefacts.
Remarque: Il existe deux types d'objet depends : role et extension. Les deux sont similaires en ce sens qu'ils peuvent insérer des scripts dans le rôle de base. La différence réside dans le fait qu'une dépendance de rôle représente une dépendance vis-à-vis d'un autre rôle, de sorte que les modifications apportées à ce dernier déclenchent l'exécution du script {role}/{dependency}/changed.py. Les dépendances d'extension ne disposent pas d'un script changed.py. Dans un document de topologie, la différence réside dans le fait que l'objet depends possède ou non un attribut "rôle". L'extrait suivant de topology.json est généré à partir du modèle de canevas et affiche les deux types de dépendances. Le premier objet depends est une dépendance de rôle et le second, une dépendance d'extension :
{
   "roles":[
      {
         "type":"Hello",
         "name":"hello",
         "parms":{
            "Hello_Sender":"Ann"
         },
         "depends":[
            {
               "role":"Hello_Center_Plugin-hcenter.HelloCenter",
               "parms":{
                  "HC_Receiver":"Bob",
                  "inst_id":1
               },
               "type":"HCenter"
            },
            {
               "parms":{
                  "lp1":"my linked policy value"
               },
               "type":"HLPOLICY"
            } 

Globalisation

Vous pouvez traduire les attributs d'un plug-in à l'aide de fichiers messages.json.

Créez un dossier d'environnement local avec des sous-dossiers, au format ISO 3166-1 alpha-2, qui contient le fichier messages.json de chaque langue prise en charge par votre plug-in.

Par exemple, si metadata.json contient :
[
    {
        "id": "Hello",
        "label": "Hello_Label",
        "description": "Hello_Desc",
        "thumbnail": "appmodel/images/thumbnail/Hello.png",
        "image": "appmodel/images/Hello.png",
        "type": "component",
        "attributes": [
            {
                "id": "sender",
                "label": "Sender_Label",
                "description": "Sender_Desc",
                "required": true,
                "type": "string",
                "regExp": "\\w*",
                "invalidMessage": "Invalid_Sender_Msg" 
            }          
        ]
    }
]
et operation.json contient:
{
    "Hello": [
        {
            "id": "HelloMessage",
            "label": "Hello_Label",
            "description": "Inlet_Desc",
            "target": "Any",
            "aggregator" : "none",
            "script": "send.py HelloMessage",
            "attributes": [
                {
                    "label": "Username_Label",
                    "type": "string",
                    "id": "UserName",
					"displayType": "string",                    
                    "description": "Inlet_Desc" 
                }
            ] 
        }
      ]
}  
le fichier messages.json du répertoire plugin.com.ibm.sample.hello\plugin\appmodel\locales\en\ contient :
{
	"Hello_Label": "Hello Plugin",
	"Username_Label": "Username",
	"Inlet_Desc":"Deployment inlet to check for registered users",
	"Sender_Label":"Sender Name",
     "Sender_Desc":"Greeting message sender"
}
Les attributs Hello_Label, Username_Label, Inlet_Desc, Sender_Labelet Sender_Desc sont traduits pour l'utilisateur lorsqu'il accède au plug-in via Pattern Builder.
Remarque: vous ne pouvez pas mettre à jour messages.json via l'interface utilisateur Pattern Builder . Pour mettre à jour messages.json, vous devez :
  1. Exporter l'application virtuelle.
  2. Modifier les fichiers messages.json sur le système de fichiers local.
  3. Importer l'application.