Синтаксис выражений — это совокупность всех возможностей работы с выражениями в шаблонах Cloud Assembly.

Примечание: Выражения Cloud Assembly отличаются от регулярных выражений.

Представленный ниже синтаксис частично представлен в примерах, приведенных в разделе Выражения Cloud Assembly.

Литералы

Поддерживаются следующие литералы.

  • Логическое значение: истина или ложь
  • Целое число
  • Число с плавающей запятой
  • Строка

    Обратная косая черта используется в качестве escape-символа для одинарных и двойных кавычек, а также для самой себя.

    Escape-последовательность для " выглядит как \"

    Escape-последовательность для ' выглядит как \'

    Escape-последовательность для \ выглядит как \\

    Escape-последовательность для кавычек нужна только в строках, заключенных в кавычки того же типа, как показано в следующем примере.

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

  • NULL

Переменные сред

Имена сред:

  • orgId
  • projectId
  • projectName
  • deploymentId
  • deploymentName
  • blueprintId
  • blueprintVersion
  • blueprintName
  • requestedBy (user)
  • requestedAt (time)

Синтаксис

env.ENV_NAME

Пример

${env.blueprintId}

Переменные ресурсов

Переменные ресурсов позволяют выполнять привязку к свойствам ресурсов из других ресурсов.

Синтаксис

resource.RESOURCE_NAME.PROPERTY_NAME

Имена ресурсов не могут содержать тире и точки. Символы подчеркивания разрешены.

Примеры:

  • ${resource.db.id}
  • ${resource.db.networks[0].address}
  • ${resource.app.id} (Возвращает строковое значение для некластерных ресурсов, если значение количества не указано; возвращает массив для кластерных ресурсов.)
  • ${resource.app[0].id} (возвращает первую запись для кластерных ресурсов)

Переменные ресурсов self

Переменные ресурсов self разрешены только для ресурсов, которые поддерживают стадию выделения. Переменные ресурсов self доступны только (или имеют только заданное значение) по окончании стадии выделения.

Синтаксис

self.property_name

Пример

${self.address} (возвращает адрес, назначенный на стадии выделения)

Следует отметить, что для ресурса с именем resource_x self.property_name и resource.resource_x.property_name являются одинаковыми и считаются рекурсивными ссылками.

Условия

Синтаксис

  • В качестве операторов равенства используются == и !=.
  • В качестве реляционных операторов используются <, >, <= и >=.
  • В качестве логических операторов используются &&, || и !.
  • В условиях используется следующий шаблон:

    выражение условия ? выражение истины :выражение лжи

Примеры:

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

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

Индекс счетчика кластеров

Синтаксис

count.index

Примеры:

  • Возвращает тип узла для кластерных ресурсов:

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

  • Устанавливает размер каждого диска во время выделения:
    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)}'
    
  • Дополнительные примеры см. в разделе Кластеры компьютеров и дисков в Cloud Assembly.

Арифметические операторы

Синтаксис

В качестве операторов используются +, , /, * и %.

Пример

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

Объединение строк

Синтаксис

${'ABC' + 'DEF'} эквивалентно ABCDEF.

Операторы «[ ]» и «.»

Обработка операторов «[ ]» и «.» в выражениях унифицирована в соответствии с ECMAScript.

Таким образом, expr.identifier будет эквивалентно expr["identifier"]. Идентификатор используется для создания литерала, значение которого равняется идентификатору, а затем оператор «[ ]» используется с этим значением.

Пример

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

Кроме того, если свойство содержит пробелы, в качестве разделителей используйте квадратные скобки и двойные кавычки вместо нотации с точкой.

Неправильно:

input.operating system

Правильно:

input["operating system"]

Создание карты

Синтаксис

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

Создание массива

Синтаксис

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

Пример

${[1,2,3]}

Функции

Синтаксис

${function(arguments...)}

Пример

${to_lower(resource.app.name)}

Табл. 1. Функции
Функция Описание
abs(number) Абсолютное значение числа
avg(array) Возвращает среднее от всех значений из массива чисел
base64_decode(string) Возвращает декодированное значение base64
base64_encode(string) Возвращает значение в кодировке base64
ceil(number) Возвращает наименьшее значение (ближайшее к отрицательной бесконечности), которое больше или равно аргументу и равно математическому целому значению
contains(array, value) Проверяет массив на наличие значение
contains(string, value) Проверяет строку на наличие значения
digest(value, type) Возвращает выборку по значению с использованием поддерживаемого типа (md5, sha1, sha256, sha384, sha512)
ends_with(subject, suffix) Проверяет, заканчивается ли строка темы (subject) строкой суффикса (suffix)
filter_by(array, filter)

Возвращает только записи массива, для которых успешно выполняется операция фильтрации

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

возвращает [2, 3]

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

возвращает [{"key2": 2}]

floor(number) Возвращает наибольшее значение (ближайшее к положительной бесконечности), которое меньше аргумента или равно ему и равно математическому целому значению
format(format, values...) Возвращает отформатированную строку с использованием формата и значений форматировщика класса Java.
from_json(string) Разбирает строку json
join(array, delim) Присоединяет массив строк с разделителем и возвращает строку
json_path(value, path) Сравнивает путь со значением с использованием XPath for JSON.
keys(map) Возвращает ключи сопоставления
length(array) Возвращает длину массива
length(string) Возвращает длину строки
map_by(array, operation)

Возвращает каждую запись массива с примененной для ней операцией

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

возвращает [10, 20]

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

возвращает ["1", "2"]

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

возвращает [{"key1":10},{"key2":20}]

map_to_object(array, keyname)

Возвращает массив пар «ключ:значение» для указанного имени ключа в сочетании со значениями из другого массива

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

возвращает массив пар «ключ:значение», содержащий поле ключа, которое называется «source», вместе со строками идентификатора диска.

Обратите внимание:

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

возвращает тот же результат

matches(string, regex) Проверяет, совпадает ли строка с регулярным выражением
max(array) Возвращает максимальное значение из массива чисел
merge(map, map) Возвращает объединенной сопоставление
min(array) Возвращает минимальное значение из массива чисел
not_null(array) Возвращает первую запись, которая не является пустой (null)
now() Возвращает текущее время в формате ISO-8601
range(start, stop) Возвращает последовательность чисел с шагом 1, которая начинается с начального числа и заканчивается непосредственно перед конечным числом
replace(string, target, replacement) Заменяет строку, содержащую целевой элемент string, строкой target
reverse(array) Обращает записи в массиве
slice(array, begin, end) Возвращает фрагмент массива с начального (begin) до конечного (end) индекса
split(string, delim) Разбивает строку с помощью разделителя и возвращает массив строк
starts_with(subject, prefix) Проверяет, начинается ли строка темы (subject) со строки префикса (prefix)
substring(string, begin, end) Возвращает подстроку строки с начального (begin) до конечного (end) индекса
sum(array) Возвращает сумму всех значений из массива чисел
to_json(value) Сериализирует значение как строку json
to_lower(str) Переводит все символы в строке в нижний регистр
to_number(string) Разбирает строку как число
to_string(value) Возвращает строковое представление значения
to_upper(str) Переводит все символы в строке в верхний регистр
trim(string) Удаляет начальные и конечные пробелы
url_encode(string) Выполняет кодировку строки с использовании спецификации кодировки url
uuid() Возвращает случайно сгенерированный универсальный уникальный идентификатор
values(map) Возвращает значения сопоставления

Устранение неполадок

В языке YAML двоеточие и пробел («: ») используются в качестве разделителя между ключом и значением в парах «ключ-значение». Синтаксис выражений зависит от YAML, поэтому использование в выражении пробела после двоеточия иногда приводит к сбоям.

Например, в следующем выражении наличие пробела между "win" : и "lin" приводит к сбою.

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

В работающем выражении пропущен пробел.

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

Если обработка выражения по прежнему завершается сбоем, попробуйте заключить всё выражение в одинарные кавычки, как показано ниже.

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