La syntaxe d'expression expose toutes les fonctionnalités disponibles des expressions dans les modèles Automation Assembler.

Note : Les expressions Automation Assembler doivent être différentes des expressions régulières (regex).

La syntaxe suivante n'est que partiellement représentée dans les exemples fournis dans Expressions Automation Assembler.

Littéraux

Les littéraux suivants sont pris en charge :

  • Booléen (vrai ou faux)
  • Entier
  • Virgule flottante
  • Chaîne

    Une barre oblique place les guillemets, les guillemets simples et les barres obliques inverses dans une séquence d'échappement :

    " est placé dans une séquence d'échappement en tant que \"

    ' est placé dans une séquence d'échappement en tant que \'

    \ est placé dans une séquence d'échappement en tant que \\

    Les guillemets ne doivent être précédés d'un caractère d'échappement que s'ils apparaissent dans une chaîne délimitée par des guillemets de même type, comme dans l'exemple ci-dessous.

    "I am a \"double quoted\" string inside \"double quotes\"."

  • Null

Variables d'environnement

Noms d'environnement :

  • orgId
  • projectId
  • projectName
  • deploymentId
  • deploymentName
  • blueprintId
  • blueprintVersion
  • blueprintName
  • requestedBy (utilisateur)
  • requestedAt (heure)

Syntaxe :

env.ENV_NAME

Exemple :

${env.blueprintId}

Variables de ressource

Les variables de ressource vous permettent de lier les propriétés de ressource à partir d'autres ressources.

Syntaxe :

resource.RESOURCE_NAME.PROPERTY_NAME

Les noms de ressources ne peuvent pas contenir de tirets ou de points. Les traits de soulignement sont autorisés.

Exemples :

  • ${resource.db.id}
  • ${resource.db.networks[0].address}
  • ${resource.app.id} (Renvoyer la chaîne pour les ressources hors cluster, où le nombre n'est pas spécifié. Renvoyer le tableau pour les ressources en cluster.)
  • ${resource.app[0].id} (Renvoyer la première entrée pour les ressources en cluster.)

Variables self de ressource

Les variables self de ressource sont autorisées uniquement pour les ressources prenant en charge la phase d'allocation. Les variables self de ressource sont uniquement disponibles (ou ont uniquement une valeur définie) une fois la phase d'allocation terminée.

Syntaxe :

self.property_name

Exemple :

${self.address} (Renvoyer l'adresse attribuée lors de la phase d'allocation.)

Notez que pour une ressource nommée resource_x, self.property_name et resource.resource_x.property_name sont les mêmes et sont considérés comme des autoréférences.

Conditions

Syntaxe :

  • Les opérateurs d'égalité sont == et !=.
  • Les opérateurs relationnels sont < > <= et >=.
  • Les opérateurs logiques sont && || et !.
  • Les conditions utilisent le modèle :

    expression de condition ? expression vraie :expression fausse

Exemples :

${input.count < 5 && input.size == 'small'}

${input.count < 2 ? "small":"large"}

Index du nombre de clusters

Syntaxe :

count.index

Exemples :

  • Renvoyer le type de nœud pour les ressources en cluster :

    ${count.index == 0 ? "primary":"secondary"}

  • Définissez la taille de chaque disque lors de l'allocation :
    inputs:
      disks:
        type: array
        minItems: 0
        maxItems: 12
        items:
          type: object
          properties:
            size:
              type: integer
              title: Size (GB)
              minSize: 1
              maxSize: 2048
    resources:
      Cloud_vSphere_Disk_1:
        type: Cloud.vSphere.Disk
        allocatePerInstance: true
        properties:
          capacityGb: '${input.disks[count.index].size}'
          count: '${length(input.disks)}'
    
  • Pour obtenir plus d'exemples, consultez Clusters de machines et de disques dans Automation Assembler.

Opérateurs arithmétiques

Syntaxe :

Les opérateurs sont + / * et %.

Exemple :

${(input.count + 5) * 2}

Concaténation de chaînes

Syntaxe :

${'ABC' + 'DEF'} correspond à ABCDEF.

Opérateurs [ ] et .

L'expression suit ECMAScript lors de l'unification du traitement des opérateurs [ ] et . .

Par conséquent, expr.identifier équivaut à expr["identifier"]. L'identifiant est utilisé pour construire un littéral dont la valeur est l'identifiant, puis l'opérateur [ ] est utilisé avec cette valeur.

Exemple :

${resource.app.networks[0].address}

En outre, lorsqu'une propriété inclut un espace, délimitez-la avec des crochets et des guillemets au lieu d'utiliser la notation par points.

Incorrect :

input.operating system

Correct :

input["operating system"]

Construction de la carte

Syntaxe :

${{'key1':'value1', 'key2':input.key2}}

Construction d'un groupe

Syntaxe :

${['key1','key2']}

Exemple :

${[1,2,3]}

Fonctions

Syntaxe :

${fonction(arguments...)}

Exemple :

${to_lower(resource.app.name)}

Tableau 1. Fonctions
Fonction Description
abs(nombre) Valeur absolue de nombre
avg(tableau) Renvoyer la moyenne de toutes les valeurs d'un tableau de nombres
base64_decode(chaîne) Renvoyer la valeur base 64 décodée
base64_encode(chaîne) Renvoyer la valeur codée en base 64
ceil(nombre) Renvoie la plus petite valeur (la plus proche de l'infini négatif) qui est supérieure ou égale à l'argument, et est égale à un entier mathématique.
contains(tableau, valeur) Vérifier si le tableau contient une valeur
contains(chaîne, valeur) Vérifier si la chaîne contient une valeur
digest(valeur, type) Renvoyer le résumé d'une valeur en utilisant le type pris en charge (md5, sha1, sha256, sha384, sha512)
ends_with(objet, suffixe) Vérifier si la chaîne de l'objet se termine par une chaîne de suffixe
filter_by(tableau, filtre)

Renvoyer uniquement les entrées de tableau qui passent l'opération de filtre

filter_by([1,2,3,4], x => x >= 2 && x <= 3)

renvoie [2, 3]

filter_by({'key1':1, 'key2':2}, (k,v) => v != 1)

renvoie [{"key2": 2}]

floor(nombre) Renvoie la valeur la plus grande (la plus proche de l'infini positif) qui est inférieure ou égale à l'argument, et est égale à un entier mathématique
format(format, valeurs...) Renvoyer une chaîne formatée en n'utilisant le format et les valeurs du formateur de classe Java.
from_json(chaîne) Analyser la chaîne JSON
join(tableau, délimiteur) Joindre un tableau de chaînes avec un délimiteur et renvoyer une chaîne
json_path(valeur, chemin) Évaluer le chemin par rapport à la valeur à l'aide de XPath for JSON.
keys(mappage) Renvoyer les clés du mappage
length(tableau) Renvoyer la longueur d'un tableau
length(chaîne) Renvoyer la longueur d'une chaîne
map_by(tableau, opération)

Renvoyer chaque entrée de tableau avec une opération lui étant appliquée

map_by([1,2], x => x * 10)

renvoie [10, 20]

map_by([1,2], x => to_string(x))

renvoie ["1", "2"]

map_by({'key1':1, 'key2':2}, (k,v) => {k:v*10})

renvoie [{"key1":10},{"key2":20}]

map_to_object(tableau, nom de clé)

Renvoyer un tableau de paires clé:valeur du nom de clé spécifié couplé avec des valeurs d'un autre tableau

map_to_object(resource.Disk[*].id, "source")

renvoie un tableau de paires clé:valeur qui a un champ de clé appelé source couplée avec des chaînes d'ID de disque

Notez que

map_by(resource.Disk[*].id, id => {'source':id})

renvoie le même résultat

matches(chaîne, regex) Vérifier si la chaîne correspond à une expression regex
max(tableau) Renvoyer la valeur maximale d'un tableau de nombres
merge(mappage, mappage) Renvoyer un mappage fusionné
min(tableau) Renvoyer la valeur minimale d'un tableau de nombres
not_null(tableau) Renvoyer la première entrée non null
now() Renvoyer l'heure actuelle au format ISO-8601
range(début, arrêt) Renvoyer une série de nombres par incréments de 1 qui commence par le numéro de début et se termine juste avant le numéro d'arrêt
replace(chaîne, cible, remplacement) Remplacer la chaîne contenant une chaîne cible par une chaîne cible
reverse(tableau) Inverser les entrées du tableau
slice(tableau, début, fin) Renvoyer la tranche d'un tableau de l'index de début à l'index de fin
split(chaîne, délimiteur) Fractionner la chaîne avec un délimiteur et renvoyer un tableau de chaînes
starts_with(objet, préfixe) Vérifier si la chaîne de l'objet commence par une chaîne de préfixe
substring(chaîne, début, fin) Renvoyer la sous-chaîne de la chaîne de l'index de début à l'index de fin
sum(tableau) Renvoyer la somme de toutes les valeurs d'un tableau de nombres
to_json(valeur) Sérialiser la valeur en tant que chaîne JSON
to_lower(chaîne) Convertir la chaîne en minuscules
to_number(chaîne) Analyser la chaîne en tant que nombre
to_string(valeur) Renvoyer la représentation en chaîne de la valeur
to_upper(chaîne) Convertir la chaîne en majuscules
trim(chaîne) Supprimer les espaces de début et de fin
url_encode(chaîne) Coder une chaîne à l'aide d'une spécification de codage URL
uuid() Renvoyer un UUID généré de manière aléatoire
values(mappage) Renvoyer les valeurs du mappage

Opérateurs ternaires imbriqués

Lors de l'utilisation d'opérateurs ternaires imbriqués avec des chaînes paramétrées, tenez compte des éléments suivants.
  • L'expression doit être encapsulée à l'intérieur d'accolades précédées d'un signe dollar (par exemple, ${...}).
  • Évitez les signes dollar ($) au milieu de l'expression, car cela pourrait empêcher l'évaluation de l'expression ${...} externe dans son ensemble.
  • Suivez la structure des opérateurs ternaires (par exemple, A ? B :C) quels que soient les niveaux d'imbrication dont vous disposez. Utilisez des parenthèses () pour prendre en charge cette imbrication. Par exemple, A ? (B1 ? B2 :(B3 ? B4 :B5)) :C.
Exemple sans chaîne paramétrée :
${input.backup == "Yes" ? (input.region == "Region1" ? "Hello1" :"No-Backup") :"Test"}
Exemple avec chaîne paramétrée :
${input.backup == "Yes" ? (input.region == "Region1" ? (env.projectName + "-NOAPP-01-14-WDC") :(input.region == "Region2" ? (env.projectName + "-NOAPP-01-14-CDC") :(input.region == "Sitel" ? (env.projectName + "-NOAPP-01-14-Sitel") :"No-Backup"))) :"Test"}
Exemple dans une ressource d'un fichier YAML :
Cloud_Machine_1:
    type: Cloud.Machine
    properties:
      image: imageName
      count: ${input.machineCount}
      flavor: small
      snapshotLimit: 1
      tags:
        - key: BGNAME
          value: ${env.projectName}
        - key: Veeam
          value: ${input.backup == "Yes" ? (input.region == "Region1" ? (env.projectName + "-NOAPP-01-14-WDC") :(input.region == "Region2" ? (env.projectName + "-NOAPP-01-14-CDC") :(input.region == "Sitel" ? (env.projectName + "-NOAPP-01-14-Sitel") :"No-Backup"))) :"Test"}

Dépannage

Le langage YAML utilise le signe deux-points et un espace (« : ») comme séparateur des paires clé-valeur. La syntaxe d'expression dépend de YAML. Par conséquent, un espace après deux-points peut parfois entraîner l'échec d'une expression.

Par exemple, l'espace entre "win" : et "lin" dans l'expression suivante provoque un échec.

${contains(input.image,"Windows") == true ? "win" : "lin"}

L'expression de travail omet l'espace.

${contains(input.image,"Windows") == true ? "win" :"lin"}

Si une expression continue d'échouer, essayez de mettre l'expression entière entre des marques, comme indiqué.

ezOS: '${contains(input.image,"Windows") == true ? "win" :"lin"}'