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éfinition des composants et de liens
Les exemples suivants montrent comment les propriétés sont définies pour un composant et un lien.
[
{
"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"
}
]
}
]
}
...
][
{
"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
}
]
}
]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 :
componentlinkpolicy
- 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
policyuniquement. 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
policyuniquement. 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 :truefalse(par défaut)
- déprécié
- Optionnel. Pour le type
componentuniquement. 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
linkuniquement. 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-oneone-to-many
- source
- Pour le type
linkuniquement. 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 lesourceou letargetd'un composant, mais pas les deux. - cible
- Pour le type
linkuniquement. 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 lesourceou letargetd'un composant, mais pas les deux.
Attributs des composants, des liens et des règles
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 :
truefalse(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émenttypespécifié est utilisé. Les valeurs admises sont :radiomulti-string(pour une zone de texte multiligne)passwordpercentagedynamic(un bouton Ajouter ajoute alors d'autres attributs de manière dynamique)
Si letypeest défini surarray, l'affichage du tableau dépend de la spécification de l'élémentoptions.- Si l'élément
optionsest spécifié, une zone de liste s'affiche et les utilisateurs peuvent effectuer une sélection parmi les valeurs spécifiées. - Si
optionsn'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
invalidMessagen'est pas défini et que l'utilisateur spécifie une valeur qui se trouve en dehors des limitesminetmax. - 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 siinvalidMessagen'est pas défini et que l'utilisateur spécifie une valeurmaxqui est en dehors de cette limitemax. - maxOccurs
- Optionnel. Indique le nombre de liens pouvant être créés entre
un composant source et un composant cible. Si
maxOccursn'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-1est 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 siinvalidMessagen'est pas défini et que l'utilisateur spécifie une valeurminqui est en dehors de cette limitemin. - 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
nameetvalue. - 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
trueetfalse. - 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
minetmax. - objet
- Objet. Une valeur valide est un objet JSON.
- sampleValue
- Optionnel. Valeur par défaut pour la propriété.
| 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 |
![]() |
||
string |
|
![]() |
||
string |
options |
required |
![]() |
|
string |
radio |
options |
required |
![]() |
string |
password |
|
![]() |
|
string |
multi-string |
required |
![]() |
|
number |
|
![]() |
||
number |
percentage |
|
![]() |
|
file |
|
![]() |
||
range |
incrémentielles |
![]() |
||
range |
incrémentielles |
![]() |
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.
{
"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-defdans 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 = truene peut pas être désactivé. Les valeurs admises sont :truefalse
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.
"attributes" : [
{
"id" : "archive",
"label" : "ARCHIVE_LABEL",
"description" : "ARCHIVE_DESCRIPTION",
"type" : "file",
"required" : true,
"extensions" : [
"zip","tgz","tar.gz"
]
},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} )",
................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.
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,
...
}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.
<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.
- 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
transformAsest facultatif et peut avoir la valeurextendedoulinked. SitransformAsn'est pas spécifié, la règle est traitée en tant que règle étendue par défaut.
- La règle lié est le composant cible
- Le composant source est le composant qui est défini par la valeur
applicableTodans metadata.json.
- Tous les composants sont transformés avant tous les liens.
- 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.
{scriptdir}/Hello/install.py{scriptdir}/Hello/configure.py{scriptdir}/Hello/start.py
{scriptdir}/Hello/install.py{scriptdir}/Hello/HLPOLICY/install.py{scriptdir}/Hello/configure.py{scriptdir}/Hello/HLPOLICY/configure.py{scriptdir}/Hello/start.py
- Une nouveau composant avec un ensemble de scripts
Hello/HLPOLICYdoivent être ajoutés à la machine virtuelle. - Un objet
dependsdoit être ajouté au rôle Hello.
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.
[
{
"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"
}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.- Exporter l'application virtuelle.
- Modifier les fichiers messages.json sur le système de fichiers local.
- Importer l'application.










