A sintaxe da expressão expõe todos os recursos disponíveis de expressões em modelos do Automation Assembler.

Observação: As expressões do Automation Assembler não são iguais a expressões regulares(regex).

A sintaxe a seguir só é parcialmente representada nos exemplos mostrados em Expressões do Automation Assembler.

Literais

Há suporte para os seguintes literais:

  • Boolean (verdadeiro ou falso)
  • Inteiro
  • Ponto flutuante
  • Cadeia de caracteres

    Barra invertida com aspas duplas, aspas simples e barra invertida em si:

    " é deixada como \"

    ' é deixada como \'

    \ é deixada como \\

    As aspas só precisam ser deixadas dentro de uma cadeia de caracteres fechada com o mesmo tipo de aspas, como mostra o exemplo a seguir.

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

  • Nulo

Variáveis de ambiente

Nomes de ambiente:

  • orgId
  • projectId
  • projectName
  • deploymentId
  • deploymentName
  • blueprintId
  • blueprintVersion
  • blueprintName
  • requestedBy (usuário)
  • requestedAt (hora)

Sintaxe:

env.ENV_NAME

Exemplo:

${env.blueprintId}

Variáveis de recurso

As variáveis de recurso permitem vincular a propriedades de recursos de outros recursos.

Sintaxe:

resource.RESOURCE_NAME.PROPERTY_NAME

Os nomes de recursos não podem conter traços ou pontos. Sublinhados são permitidos.

Exemplos:

  • ${resource.db.id}
  • ${resource.db.networks[0].address}
  • ${resource.app.id} (retornar a cadeia de caracteres para recursos não agrupados em cluster, onde a contagem não é especificada. Retorne a matriz para recursos agrupados em cluster.)
  • ${resource.app[0].id} (retornar a primeira entrada para recursos agrupados em cluster.)

Autovariáveis de recurso

Autovariáveis de recursos são permitidas apenas para recursos que oferecem suporte à fase de alocação. Autovariáveis de recursos apenas estão disponíveis (ou apenas têm um conjunto de valores) após a conclusão da fase de alocação.

Sintaxe:

self.property_name

Exemplo:

${self.address} (retornar o endereço atribuído durante a fase de alocação.)

Observe que, para um recurso denominado resource_x, self.property_name e resource.resource_x.property_name são idênticas e ambas são consideradas autoreferências.

Condições

Sintaxe:

  • Os operadores de igualdade são == e !=.
  • Os operadores relacionais são < > <= e >=.
  • Os operadores lógicos são && || e !.
  • Os condicionais usam o padrão:

    condition-expression ? true-expression :false-expression

Exemplos:

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

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

Índice de contagem do cluster

Sintaxe:

count.index

Exemplos:

  • Retorne o tipo de nó para recursos agrupados em cluster:

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

  • Defina o tamanho de cada disco durante a alocação:
    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)}'
    
  • Para mais exemplos, consulte Clusters de máquina e disco no Automation Assembler.

Operadores aritméticos

Sintaxe:

Os operadores são + / * e %.

Exemplo:

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

Concatenação de cadeia de caracteres

Sintaxe:

${'ABC' + 'DEF'} avalia como ABCDEF.

Operadores [ ] e .

A expressão segue o ECMAScript ao unificar o tratamento de [ ] e . operadores.

Portanto, expr.identifier é equivalente a expr["identifier"]. O identificador é usado para construir um literal cujo valor é o identificador e, em seguida, o operador [ ] é usado com esse valor.

Exemplo:

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

Além disso, quando uma propriedade inclui um espaço, delimite-a com colchetes e aspas duplas em vez de usar a notação de pontos.

Incorreto:

input.operating system

Correto:

input["operating system"]

Construção do mapa

Sintaxe:

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

Construção da matriz

Sintaxe:

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

Exemplo:

${[1,2,3]}

Funções

Sintaxe:

${função(argumentos...)}

Exemplo:

${to_lower(resource.app.name)}

Tabela 1. Funções
Função Descrição
abs(número) Valor de número absoluto
avg(matriz) Retorna a média de todos os valores da matriz de números
base64_decode(cadeia de caracteres) Retorna o valor de base64 decodificado
base64_encode(cadeia de caracteres) Retorna o valor codificado de base64
ceil(número) Retorna o valor menor (mais próximo ao infinito negativo) que é maior ou igual ao argumento e é igual a um inteiro matemático
contains(matriz, valor) Verifica se a matriz contém um valor
contains(cadeia de caracteres, valor) Verifica se a cadeia de caracteres contém um valor
digest(valor, tipo) Retorna resumo do valor usando o tipo suportado (md5, sha1, sha256, sha384, sha512)
ends_with(assunto, sufixo) Verifica se a cadeia de caracteres do assunto termina com cadeia de caracteres de sufixo
filter_by(matriz, filtro)

Retornar apenas as entradas de matriz que passam a operação de filtro

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

retorna [2, 3]

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

retorna [{"key2": 2}]

floor(número) Retorna o valor maior (mais próximo ao infinito positivo) que é menor ou igual ao argumento e é igual a um inteiro matemático
format(formato, valores...) Retorna uma cadeia de caracteres formatada usando o formato e os valores do Formatador de Classe Java.
from_json(cadeia de caracteres) Analisa a cadeia de caracteres json
join(matriz, delim.) Associa a matriz de cadeias de caracteres a um delimitador e retornar uma cadeia de caracteres
json_path(valor, caminho) Avalia o caminho contra o valor usando XPath para JSON.
keys(mapa) Retorna chaves do mapa
length(matriz) Retorna comprimento da matriz
length(cadeia de caracteres) Retorna comprimento da cadeia de caracteres
map_by(matriz, operação)

Retornar cada entrada de matriz com uma operação aplicada a ela

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

retorna [10, 20]

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

retorna ["1", "2"]

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

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

map_to_object(matriz, keyname)

Retornar uma matriz de pares key:value do nome de chave especificado emparelhado com valores de outra matriz

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

retorna uma matriz de pares key:value que tem um campo de chave chamado origem emparelhada com cadeias de caracteres de ID de disco

Observe que

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

retorna o mesmo resultado

matches(cadeia de caracteres, regex) Verifica se a cadeia de caracteres corresponde a uma expressão Regex
max(matriz) Retorna o valor máximo da matriz de números
merge(mapa, mapa) Retorna um mapa mesclado
min(matriz) Retorna o valor mínimo da matriz de números
not_null(matriz) Retorna a primeira entrada que não é nula
now() Retorna a hora atual no formato ISO-8601
intervalo(início, parada) Retornar uma série de números em incrementos de 1 que começa com o número de início e termina antes do número de parada
replace(cadeia de caracteres, destino, substituição) Substitui a cadeia de caracteres contendo cadeia de destino com cadeia de destino
reverse(matriz) Reverte entradas da matriz
slice(matriz, início, fim) Retorna a fatia da matriz do índice inicial para o índice final
split(cadeia de caracteres, delim.) Divide a cadeia de caracteres com um delimitador e retornar matriz de cadeias de caracteres
starts_with(assunto, prefixo) Verifica se a cadeia de caracteres do assunto começa com a cadeia de prefixo
substring(cadeia de caracteres, início, fim) Retorna a subcadeia de caracteres do índice inicial até o índice final
sum(matriz) Retorna a soma de todos os valores da matriz de números
to_json(valor) Coloca em série o valor como cadeia de caracteres json
to_lower(cad.) Converte a cadeia de caracteres em minúsculas
to_number(cadeia de caracteres) Analisa a cadeia de caracteres como número
to_string(valor) Retorna representação de cadeia de caracteres do valor
to_upper(cad.) Converte a cadeia de caracteres em maiúsculas
trim(cadeia de caracteres) Remove espaços à esquerda e à direita
url_encode(cadeia de caracteres) Codifica a cadeia de caracteres usando a especificação de codificação da URL
uuid() Retorna UUID gerado aleatoriamente
values(mapa) Retorna valores do mapa

Operadores ternary aninhados

Ao usar operadores ternary aninhados com cadeias de caracteres parametrizadas, considere o seguinte.
  • A expressão deve ser colocada dentro de um cifrão e chaves, como ${...}.
  • Evite cifrões ($) no meio da expressão porque isso pode impedir a avaliação de toda a expressão exterior ${...}.
  • Siga a estrutura ternária do operador, como A ? B :C, independentemente de quantos níveis de aninhamento você tenha. Use colchetes redondos () para oferecer suporte a esse aninhamento. Por exemplo, A ? (B1 ? B2 :(B3 ? B4 :B5)) :C.
Exemplo sem cadeia de caracteres parametrizada:
${input.backup == "Yes" ? (input.region == "Region1" ? "Hello1" :"No-Backup") :"Test"}
Exemplo com cadeia de caracteres parametrizada:
${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"}
Exemplo em um recurso em um 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"}

Solução de problemas

A linguagem YAML usa dois pontos e espaço (": ") como o separador entre chave e valor em pares de chave-valor. A sintaxe da expressão depende do YAML. Portanto, um espaço depois de dois pontos às vezes pode fazer com que uma expressão falhe.

Por exemplo, o espaço entre "win" : e "lin" na expressão a seguir causa uma falha.

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

A expressão de trabalho omite o espaço.

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

Se uma expressão continuar a falhar, tente colocar toda a expressão em marcas de verificação, conforme mostrado.

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