Ссылка на родительский элемент в выражении фильтра JMESPath

У меня есть следующий запрос JMESPath

query="Reservations[].Instances[].{ \
    InstanceId: InstanceId, \
    RootDeviceVolumeId: BlockDeviceMappings[?DeviceName==\`/dev/sda1\`] \
       | [].Ebs.VolumeId | [0], \
    RootDeviceName: RootDeviceName \
}"

aws ec2 describe-instances --query $query

что дает такой результат

+------------+------------------+----------------------+
| InstanceId | RootDeviceName   | RootDeviceVolumeId   |
+------------+------------------+----------------------+
|  i-12345678|  /dev/sda1       |  vol-abcdef12        |
|  i-98765432|  /dev/sda1       |  vol-ef123456        |
|  i-23456789|  /dev/sda1       |  vol-fedcba09        |
|  i-aabbccdd|  /dev/xvda       |  None                |
+------------+------------------+----------------------+

Я хотел бы найти способ ссылаться на RootDeviceName из выражения BlockDeviceMappings фильтра, а не жестко кодировать /dev/sda1 имя устройства, например, иногда /dev/xvda. Однако я не могу найти способ сослаться на родительский элемент в выражении фильтра.

Другой вариант - отобразить RootDeviceName и InstanceId на проекцию всех устройств, а затем передать это в выражение фильтра, но синтаксис, похоже, также не поддерживает включение родительских элементов в проекции.

Я что-то упустил или это просто ограничение синтаксиса JMESPath?


person Joe Taylor    schedule 23.02.2015    source источник


Ответы (2)


Нам понадобится какой-то механизм, который позволит вам привязать область видимости, что в настоящее время невозможно ... пока. Мне очень интересно добавить это. А пока вам придется использовать альтернативный инструмент.

person jamesls    schedule 23.02.2015
comment
Спасибо, что разъяснили это. Есть ли предложения по изменению этой части спецификации? - person Joe Taylor; 23.02.2015
comment
@jamesls, это все еще так в 2018 году? - person mattgathu; 26.03.2018

Если вы хотите добавить пользовательские функции в свой код Python, использующий JMESPath, существует грязный и уродливый способ сделать что-то подобное. Это нарушает правило «функции не должны иметь побочных эффектов». Вот суть: https://gist.github.com/martinvirtel/366235401cf7fbec503d53eb44109f25

Файл fetchstore.py в сущности добавляет функцию извлечения и сохранения в JMESPath. См. Тест или пример ниже, чтобы узнать, как это работает. Вот руководство по добавлению функций в ваш проект Python, использующий JMESPath: https://pypi.python.org/pypi/jmespath#custom-functions.

Вход:

 { "name" : "parent name",
    "data" : [
        { "x" : 1, "y" : 2 },
        { "x" : 3, "y" : 2 }
        ]
    }

Выражение JMESPath:

{ 
  name: store(name,'parent_name_attribute'), 
  data: data[][ fetch('parent_name_attribute'),x, y] 
}

Результат:

{
 "name": "parent name",
 "data": [
           [ "parent name", 1, 2 ],
           [ "parent name", 3, 2 ]
         ]
}
person mvtango    schedule 07.11.2017