all: children: zuul_unreachable: hosts: {} hosts: controller: ansible_connection: ssh ansible_host: 3.143.217.79 ansible_port: 22 ansible_python_interpreter: auto ansible_user: zuul-worker nodepool: az: us-east-2b cloud: AWS external_id: i-07b3b3bdf74babfd8 host_id: null interface_ip: 3.143.217.79 label: ansible-fedora-37-1vcpu private_ipv4: 172.16.85.179 private_ipv6: null provider: ansible-us-east-2 public_ipv4: 3.143.217.79 public_ipv6: null region: us-east-2 slot: null zuul_use_fetch_output: true vars: zuul: _inheritance_path: - '' - '' - '' - '' ansible_version: '8' artifacts: - branch: main change: '2344' job: build-ansible-collection metadata: type: zuul_manifest name: Zuul Manifest patchset: 31db89a1986e6df597d98574ba01018ed42b9a15 project: ansible-collections/community.aws url: https://997c70408e6c47ac51dd-14b219e290455602ac0062c23a62d17d.ssl.cf1.rackcdn.com/ansible/839089371372424bb5b17cc9af405e12/zuul-manifest.json - branch: main change: '2344' job: build-ansible-collection metadata: type: ansible_collection version: 11.0.0 name: community.aws patchset: 31db89a1986e6df597d98574ba01018ed42b9a15 project: ansible-collections/community.aws url: https://997c70408e6c47ac51dd-14b219e290455602ac0062c23a62d17d.ssl.cf1.rackcdn.com/ansible/839089371372424bb5b17cc9af405e12/artifacts/community-aws-11.0.0.tar.gz - branch: main change: '2344' job: build-ansible-collection metadata: type: ansible_collection version: 11.0.0 name: amazon.aws patchset: 31db89a1986e6df597d98574ba01018ed42b9a15 project: ansible-collections/community.aws url: https://997c70408e6c47ac51dd-14b219e290455602ac0062c23a62d17d.ssl.cf1.rackcdn.com/ansible/839089371372424bb5b17cc9af405e12/artifacts/amazon-aws-11.0.0.tar.gz attempts: 1 branch: main build: 135f6ffd46974dcd858d532519eb74ef build_refs: - branch: main change: '2344' change_message: "feat: add DynamoDB query lookup plugin for AWS tables\n\n# Add DynamoDB Query Lookup Plugin\r\n\r\n## SUMMARY\r\n\r\nThis PR adds a new lookup plugin `dynamodb_query` that enables querying AWS DynamoDB tables directly from Ansible playbooks. The plugin provides a convenient way to retrieve configuration data, application settings, and other dynamic values stored in DynamoDB tables as part of infrastructure-as-code workflows.\r\n\r\nThe plugin supports both Query (efficient, partition key-based) and Scan (full table scan) operations, with comprehensive support for DynamoDB features including secondary indexes, filter expressions, projection expressions, and automatic pagination.\r\n\r\n### Key Capabilities\r\n\r\n- Query items by partition key with optional sort key conditions\r\n- Support for all DynamoDB sort key operators (EQ, LT, LE, GT, GE, BEGINS_WITH, BETWEEN)\r\n- Query Global Secondary Indexes (GSI) and Local Secondary Indexes (LSI)\r\n- Filter expressions with expression attribute names and values\r\n- Projection expressions to retrieve specific attributes\r\n- Automatic pagination with configurable limits\r\n- Full support for all DynamoDB data types including Sets (SS, NS, BS)\r\n\r\n### Use Cases\r\n\r\n- Retrieve application configuration from DynamoDB tables\r\n- Query deployment metadata and environment-specific settings\r\n- Fetch dynamic inventory data stored in DynamoDB\r\n- Access feature flags and runtime configuration\r\n- Retrieve secrets metadata (not the secrets themselves)\r\n\r\n## ISSUE TYPE\r\n\r\n- New Plugin Pull Request\r\n\r\n## COMPONENT NAME\r\n\r\n`dynamodb_query` (lookup plugin)\r\n\r\n## ADDITIONAL INFORMATION\r\n\r\n### Implementation Details\r\n\r\nThe plugin is built on top of `AWSLookupBase` and follows Ansible AWS collection best practices:\r\n\r\n- Uses `boto3` with automatic retry decorators for resilience\r\n- Proper error handling with informative error messages\r\n- Supports all standard AWS authentication methods (credentials, profiles, IAM roles)\r\n- Handles DynamoDB pagination automatically\r\n- Deserializes all DynamoDB data types to native Python types\r\n\r\n### Testing\r\n\r\nComprehensive test coverage has been implemented:\r\n\r\n#### Unit Tests (28 tests, ~90% code coverage)\r\n\r\n- **Basic query operations** - partition key, sort key, operators\r\n- **All sort key operators** - EQ, LT, LE, GT, GE, BEGINS_WITH, BETWEEN (including validation)\r\n- **Filter expressions** - with expression attribute names/values\r\n- **Projection expressions** - string and list formats\r\n- **Scan operations** - full table scans\r\n- **Pagination handling** - automatic pagination and with limits\r\n- **Error handling** - ResourceNotFoundException, ValidationException, missing parameters\r\n- **Data type deserialization** - String, Number, Boolean, List, Map, NULL, Binary, Sets (SS, NS, BS)\r\n- **Secondary indexes** - GSI queries\r\n- **Advanced parameters** - limit, descending order, pagination with limit\r\n\r\n#### Integration Tests (34 tests)\r\n\r\n- All sort key operators (EQ, LT, LE, GT, GE, BEGINS_WITH, BETWEEN)\r\n- Global Secondary Index (GSI) and Local Secondary Index (LSI)\r\n- Filter expressions with built-in functions (`attribute_exists`, `size`, `contains`)\r\n- Projection expressions (string and list formats)\r\n- Expression attribute names and values\r\n- Pagination (automatic and with limit)\r\n- All DynamoDB data types including Sets (SS, NS, BS)\r\n- Empty results and error handling\r\n- Scan operations\r\n- Descending sort order\r\n\r\n### Documentation\r\n\r\nComplete documentation included:\r\n\r\n- Module documentation with parameter descriptions\r\n- 10+ usage examples covering common scenarios\r\n- Return value documentation\r\n\r\n### Example Usage\r\n\r\n#### Simple Query by Partition Key\r\n\r\n```yaml\r\n- name: Get user data\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Users',\r\n partition_key='user_id',\r\n \ partition_value='12345') }}\"\r\n```\r\n\r\n#### Query with Sort Key and Filter\r\n\r\n```yaml\r\n- name: Get recent active orders\r\n \ ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Orders',\r\n partition_key='user_id',\r\n \ partition_value='12345',\r\n sort_key='order_date',\r\n \ sort_value='2024-01-01',\r\n sort_operator='GE',\r\n \ filter_expression='#status = :active',\r\n expression_attribute_names={'#status': 'status'},\r\n expression_attribute_values={':active': 'active'}) }}\"\r\n```\r\n\r\n#### Query Using Global Secondary Index\r\n\r\n```yaml\r\n- name: Find user by email\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Users',\r\n index_name='email-index',\r\n \ partition_key='email',\r\n partition_value='[email protected]') }}\"\r\n```\r\n\r\n#### Query with Projection Expression\r\n\r\n```yaml\r\n- name: Get specific user attributes\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n table_name='Users',\r\n \ partition_key='user_id',\r\n partition_value='12345',\r\n \ projection_expression=['user_id', 'name', 'email']) }}\"\r\n```\r\n\r\n#### Query with Limit and Descending Order\r\n\r\n```yaml\r\n- name: Get last 10 orders\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Orders',\r\n partition_key='user_id',\r\n \ partition_value='12345',\r\n limit=10,\r\n \ scan_index_forward=false) }}\"\r\n```\r\n\r\n#### Scan Operation\r\n\r\n```yaml\r\n- name: Scan small table with filter\r\n ansible.builtin.debug:\r\n \ msg: \"{{ lookup('community.aws.dynamodb_query',\r\n table_name='Config',\r\n \ operation='scan',\r\n filter_expression='#env = :prod',\r\n expression_attribute_names={'#env': 'environment'},\r\n \ expression_attribute_values={':prod': 'production'},\r\n \ limit=100) }}\"\r\n```\r\n\r\n### Tested With\r\n\r\n- Python 3.11, 3.12, 3.13\r\n- ansible-core 2.14+\r\n- boto3 1.34.0+\r\n- botocore 1.34.0+\r\n\r\nAll sanity tests and integration tests pass successfully.\r\n\r\n### Related Documentation\r\n\r\n- [DynamoDB Query API](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html)\r\n- [DynamoDB Scan API](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html)\r\n- [DynamoDB Data Types](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html)\r\n- [Ansible Lookup Plugins](https://docs.ansible.com/ansible/latest/plugins/lookup.html)\r\n" change_url: https://github.com/ansible-collections/community.aws/pull/2344 commit_id: 31db89a1986e6df597d98574ba01018ed42b9a15 patchset: 31db89a1986e6df597d98574ba01018ed42b9a15 project: canonical_hostname: github.com canonical_name: github.com/ansible-collections/community.aws name: ansible-collections/community.aws short_name: community.aws src_dir: src/github.com/ansible-collections/community.aws topic: null buildset: 68a34ca4caea4fc488c03f1e7b4c9d41 buildset_refs: - branch: main change: '2344' change_message: "feat: add DynamoDB query lookup plugin for AWS tables\n\n# Add DynamoDB Query Lookup Plugin\r\n\r\n## SUMMARY\r\n\r\nThis PR adds a new lookup plugin `dynamodb_query` that enables querying AWS DynamoDB tables directly from Ansible playbooks. The plugin provides a convenient way to retrieve configuration data, application settings, and other dynamic values stored in DynamoDB tables as part of infrastructure-as-code workflows.\r\n\r\nThe plugin supports both Query (efficient, partition key-based) and Scan (full table scan) operations, with comprehensive support for DynamoDB features including secondary indexes, filter expressions, projection expressions, and automatic pagination.\r\n\r\n### Key Capabilities\r\n\r\n- Query items by partition key with optional sort key conditions\r\n- Support for all DynamoDB sort key operators (EQ, LT, LE, GT, GE, BEGINS_WITH, BETWEEN)\r\n- Query Global Secondary Indexes (GSI) and Local Secondary Indexes (LSI)\r\n- Filter expressions with expression attribute names and values\r\n- Projection expressions to retrieve specific attributes\r\n- Automatic pagination with configurable limits\r\n- Full support for all DynamoDB data types including Sets (SS, NS, BS)\r\n\r\n### Use Cases\r\n\r\n- Retrieve application configuration from DynamoDB tables\r\n- Query deployment metadata and environment-specific settings\r\n- Fetch dynamic inventory data stored in DynamoDB\r\n- Access feature flags and runtime configuration\r\n- Retrieve secrets metadata (not the secrets themselves)\r\n\r\n## ISSUE TYPE\r\n\r\n- New Plugin Pull Request\r\n\r\n## COMPONENT NAME\r\n\r\n`dynamodb_query` (lookup plugin)\r\n\r\n## ADDITIONAL INFORMATION\r\n\r\n### Implementation Details\r\n\r\nThe plugin is built on top of `AWSLookupBase` and follows Ansible AWS collection best practices:\r\n\r\n- Uses `boto3` with automatic retry decorators for resilience\r\n- Proper error handling with informative error messages\r\n- Supports all standard AWS authentication methods (credentials, profiles, IAM roles)\r\n- Handles DynamoDB pagination automatically\r\n- Deserializes all DynamoDB data types to native Python types\r\n\r\n### Testing\r\n\r\nComprehensive test coverage has been implemented:\r\n\r\n#### Unit Tests (28 tests, ~90% code coverage)\r\n\r\n- **Basic query operations** - partition key, sort key, operators\r\n- **All sort key operators** - EQ, LT, LE, GT, GE, BEGINS_WITH, BETWEEN (including validation)\r\n- **Filter expressions** - with expression attribute names/values\r\n- **Projection expressions** - string and list formats\r\n- **Scan operations** - full table scans\r\n- **Pagination handling** - automatic pagination and with limits\r\n- **Error handling** - ResourceNotFoundException, ValidationException, missing parameters\r\n- **Data type deserialization** - String, Number, Boolean, List, Map, NULL, Binary, Sets (SS, NS, BS)\r\n- **Secondary indexes** - GSI queries\r\n- **Advanced parameters** - limit, descending order, pagination with limit\r\n\r\n#### Integration Tests (34 tests)\r\n\r\n- All sort key operators (EQ, LT, LE, GT, GE, BEGINS_WITH, BETWEEN)\r\n- Global Secondary Index (GSI) and Local Secondary Index (LSI)\r\n- Filter expressions with built-in functions (`attribute_exists`, `size`, `contains`)\r\n- Projection expressions (string and list formats)\r\n- Expression attribute names and values\r\n- Pagination (automatic and with limit)\r\n- All DynamoDB data types including Sets (SS, NS, BS)\r\n- Empty results and error handling\r\n- Scan operations\r\n- Descending sort order\r\n\r\n### Documentation\r\n\r\nComplete documentation included:\r\n\r\n- Module documentation with parameter descriptions\r\n- 10+ usage examples covering common scenarios\r\n- Return value documentation\r\n\r\n### Example Usage\r\n\r\n#### Simple Query by Partition Key\r\n\r\n```yaml\r\n- name: Get user data\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Users',\r\n partition_key='user_id',\r\n \ partition_value='12345') }}\"\r\n```\r\n\r\n#### Query with Sort Key and Filter\r\n\r\n```yaml\r\n- name: Get recent active orders\r\n \ ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Orders',\r\n partition_key='user_id',\r\n \ partition_value='12345',\r\n sort_key='order_date',\r\n \ sort_value='2024-01-01',\r\n sort_operator='GE',\r\n \ filter_expression='#status = :active',\r\n expression_attribute_names={'#status': 'status'},\r\n expression_attribute_values={':active': 'active'}) }}\"\r\n```\r\n\r\n#### Query Using Global Secondary Index\r\n\r\n```yaml\r\n- name: Find user by email\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Users',\r\n index_name='email-index',\r\n \ partition_key='email',\r\n partition_value='[email protected]') }}\"\r\n```\r\n\r\n#### Query with Projection Expression\r\n\r\n```yaml\r\n- name: Get specific user attributes\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n table_name='Users',\r\n \ partition_key='user_id',\r\n partition_value='12345',\r\n \ projection_expression=['user_id', 'name', 'email']) }}\"\r\n```\r\n\r\n#### Query with Limit and Descending Order\r\n\r\n```yaml\r\n- name: Get last 10 orders\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Orders',\r\n partition_key='user_id',\r\n \ partition_value='12345',\r\n limit=10,\r\n \ scan_index_forward=false) }}\"\r\n```\r\n\r\n#### Scan Operation\r\n\r\n```yaml\r\n- name: Scan small table with filter\r\n ansible.builtin.debug:\r\n \ msg: \"{{ lookup('community.aws.dynamodb_query',\r\n table_name='Config',\r\n \ operation='scan',\r\n filter_expression='#env = :prod',\r\n expression_attribute_names={'#env': 'environment'},\r\n \ expression_attribute_values={':prod': 'production'},\r\n \ limit=100) }}\"\r\n```\r\n\r\n### Tested With\r\n\r\n- Python 3.11, 3.12, 3.13\r\n- ansible-core 2.14+\r\n- boto3 1.34.0+\r\n- botocore 1.34.0+\r\n\r\nAll sanity tests and integration tests pass successfully.\r\n\r\n### Related Documentation\r\n\r\n- [DynamoDB Query API](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html)\r\n- [DynamoDB Scan API](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html)\r\n- [DynamoDB Data Types](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html)\r\n- [Ansible Lookup Plugins](https://docs.ansible.com/ansible/latest/plugins/lookup.html)\r\n" change_url: https://github.com/ansible-collections/community.aws/pull/2344 commit_id: 31db89a1986e6df597d98574ba01018ed42b9a15 patchset: 31db89a1986e6df597d98574ba01018ed42b9a15 project: canonical_hostname: github.com canonical_name: github.com/ansible-collections/community.aws name: ansible-collections/community.aws short_name: community.aws src_dir: src/github.com/ansible-collections/community.aws topic: null change: '2344' change_message: "feat: add DynamoDB query lookup plugin for AWS tables\n\n# Add DynamoDB Query Lookup Plugin\r\n\r\n## SUMMARY\r\n\r\nThis PR adds a new lookup plugin `dynamodb_query` that enables querying AWS DynamoDB tables directly from Ansible playbooks. The plugin provides a convenient way to retrieve configuration data, application settings, and other dynamic values stored in DynamoDB tables as part of infrastructure-as-code workflows.\r\n\r\nThe plugin supports both Query (efficient, partition key-based) and Scan (full table scan) operations, with comprehensive support for DynamoDB features including secondary indexes, filter expressions, projection expressions, and automatic pagination.\r\n\r\n### Key Capabilities\r\n\r\n- Query items by partition key with optional sort key conditions\r\n- Support for all DynamoDB sort key operators (EQ, LT, LE, GT, GE, BEGINS_WITH, BETWEEN)\r\n- Query Global Secondary Indexes (GSI) and Local Secondary Indexes (LSI)\r\n- Filter expressions with expression attribute names and values\r\n- Projection expressions to retrieve specific attributes\r\n- Automatic pagination with configurable limits\r\n- Full support for all DynamoDB data types including Sets (SS, NS, BS)\r\n\r\n### Use Cases\r\n\r\n- Retrieve application configuration from DynamoDB tables\r\n- Query deployment metadata and environment-specific settings\r\n- Fetch dynamic inventory data stored in DynamoDB\r\n- Access feature flags and runtime configuration\r\n- Retrieve secrets metadata (not the secrets themselves)\r\n\r\n## ISSUE TYPE\r\n\r\n- New Plugin Pull Request\r\n\r\n## COMPONENT NAME\r\n\r\n`dynamodb_query` (lookup plugin)\r\n\r\n## ADDITIONAL INFORMATION\r\n\r\n### Implementation Details\r\n\r\nThe plugin is built on top of `AWSLookupBase` and follows Ansible AWS collection best practices:\r\n\r\n- Uses `boto3` with automatic retry decorators for resilience\r\n- Proper error handling with informative error messages\r\n- Supports all standard AWS authentication methods (credentials, profiles, IAM roles)\r\n- Handles DynamoDB pagination automatically\r\n- Deserializes all DynamoDB data types to native Python types\r\n\r\n### Testing\r\n\r\nComprehensive test coverage has been implemented:\r\n\r\n#### Unit Tests (28 tests, ~90% code coverage)\r\n\r\n- **Basic query operations** - partition key, sort key, operators\r\n- **All sort key operators** - EQ, LT, LE, GT, GE, BEGINS_WITH, BETWEEN (including validation)\r\n- **Filter expressions** - with expression attribute names/values\r\n- **Projection expressions** - string and list formats\r\n- **Scan operations** - full table scans\r\n- **Pagination handling** - automatic pagination and with limits\r\n- **Error handling** - ResourceNotFoundException, ValidationException, missing parameters\r\n- **Data type deserialization** - String, Number, Boolean, List, Map, NULL, Binary, Sets (SS, NS, BS)\r\n- **Secondary indexes** - GSI queries\r\n- **Advanced parameters** - limit, descending order, pagination with limit\r\n\r\n#### Integration Tests (34 tests)\r\n\r\n- All sort key operators (EQ, LT, LE, GT, GE, BEGINS_WITH, BETWEEN)\r\n- Global Secondary Index (GSI) and Local Secondary Index (LSI)\r\n- Filter expressions with built-in functions (`attribute_exists`, `size`, `contains`)\r\n- Projection expressions (string and list formats)\r\n- Expression attribute names and values\r\n- Pagination (automatic and with limit)\r\n- All DynamoDB data types including Sets (SS, NS, BS)\r\n- Empty results and error handling\r\n- Scan operations\r\n- Descending sort order\r\n\r\n### Documentation\r\n\r\nComplete documentation included:\r\n\r\n- Module documentation with parameter descriptions\r\n- 10+ usage examples covering common scenarios\r\n- Return value documentation\r\n\r\n### Example Usage\r\n\r\n#### Simple Query by Partition Key\r\n\r\n```yaml\r\n- name: Get user data\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Users',\r\n partition_key='user_id',\r\n \ partition_value='12345') }}\"\r\n```\r\n\r\n#### Query with Sort Key and Filter\r\n\r\n```yaml\r\n- name: Get recent active orders\r\n \ ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Orders',\r\n partition_key='user_id',\r\n \ partition_value='12345',\r\n sort_key='order_date',\r\n \ sort_value='2024-01-01',\r\n sort_operator='GE',\r\n \ filter_expression='#status = :active',\r\n expression_attribute_names={'#status': 'status'},\r\n expression_attribute_values={':active': 'active'}) }}\"\r\n```\r\n\r\n#### Query Using Global Secondary Index\r\n\r\n```yaml\r\n- name: Find user by email\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Users',\r\n index_name='email-index',\r\n \ partition_key='email',\r\n partition_value='[email protected]') }}\"\r\n```\r\n\r\n#### Query with Projection Expression\r\n\r\n```yaml\r\n- name: Get specific user attributes\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n table_name='Users',\r\n \ partition_key='user_id',\r\n partition_value='12345',\r\n \ projection_expression=['user_id', 'name', 'email']) }}\"\r\n```\r\n\r\n#### Query with Limit and Descending Order\r\n\r\n```yaml\r\n- name: Get last 10 orders\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Orders',\r\n partition_key='user_id',\r\n \ partition_value='12345',\r\n limit=10,\r\n \ scan_index_forward=false) }}\"\r\n```\r\n\r\n#### Scan Operation\r\n\r\n```yaml\r\n- name: Scan small table with filter\r\n ansible.builtin.debug:\r\n \ msg: \"{{ lookup('community.aws.dynamodb_query',\r\n table_name='Config',\r\n \ operation='scan',\r\n filter_expression='#env = :prod',\r\n expression_attribute_names={'#env': 'environment'},\r\n \ expression_attribute_values={':prod': 'production'},\r\n \ limit=100) }}\"\r\n```\r\n\r\n### Tested With\r\n\r\n- Python 3.11, 3.12, 3.13\r\n- ansible-core 2.14+\r\n- boto3 1.34.0+\r\n- botocore 1.34.0+\r\n\r\nAll sanity tests and integration tests pass successfully.\r\n\r\n### Related Documentation\r\n\r\n- [DynamoDB Query API](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html)\r\n- [DynamoDB Scan API](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html)\r\n- [DynamoDB Data Types](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html)\r\n- [Ansible Lookup Plugins](https://docs.ansible.com/ansible/latest/plugins/lookup.html)\r\n" change_url: https://github.com/ansible-collections/community.aws/pull/2344 child_jobs: [] commit_id: 31db89a1986e6df597d98574ba01018ed42b9a15 event_id: 76cfe9f0-a605-11f0-8a4f-89c19f6ef3dc executor: hostname: ze04.softwarefactory-project.io inventory_file: /var/lib/zuul/builds/135f6ffd46974dcd858d532519eb74ef/ansible/inventory.yaml log_root: /var/lib/zuul/builds/135f6ffd46974dcd858d532519eb74ef/work/logs result_data_file: /var/lib/zuul/builds/135f6ffd46974dcd858d532519eb74ef/work/results.json src_root: /var/lib/zuul/builds/135f6ffd46974dcd858d532519eb74ef/work/src work_root: /var/lib/zuul/builds/135f6ffd46974dcd858d532519eb74ef/work items: - branch: main change: '2344' change_message: "feat: add DynamoDB query lookup plugin for AWS tables\n\n# Add DynamoDB Query Lookup Plugin\r\n\r\n## SUMMARY\r\n\r\nThis PR adds a new lookup plugin `dynamodb_query` that enables querying AWS DynamoDB tables directly from Ansible playbooks. The plugin provides a convenient way to retrieve configuration data, application settings, and other dynamic values stored in DynamoDB tables as part of infrastructure-as-code workflows.\r\n\r\nThe plugin supports both Query (efficient, partition key-based) and Scan (full table scan) operations, with comprehensive support for DynamoDB features including secondary indexes, filter expressions, projection expressions, and automatic pagination.\r\n\r\n### Key Capabilities\r\n\r\n- Query items by partition key with optional sort key conditions\r\n- Support for all DynamoDB sort key operators (EQ, LT, LE, GT, GE, BEGINS_WITH, BETWEEN)\r\n- Query Global Secondary Indexes (GSI) and Local Secondary Indexes (LSI)\r\n- Filter expressions with expression attribute names and values\r\n- Projection expressions to retrieve specific attributes\r\n- Automatic pagination with configurable limits\r\n- Full support for all DynamoDB data types including Sets (SS, NS, BS)\r\n\r\n### Use Cases\r\n\r\n- Retrieve application configuration from DynamoDB tables\r\n- Query deployment metadata and environment-specific settings\r\n- Fetch dynamic inventory data stored in DynamoDB\r\n- Access feature flags and runtime configuration\r\n- Retrieve secrets metadata (not the secrets themselves)\r\n\r\n## ISSUE TYPE\r\n\r\n- New Plugin Pull Request\r\n\r\n## COMPONENT NAME\r\n\r\n`dynamodb_query` (lookup plugin)\r\n\r\n## ADDITIONAL INFORMATION\r\n\r\n### Implementation Details\r\n\r\nThe plugin is built on top of `AWSLookupBase` and follows Ansible AWS collection best practices:\r\n\r\n- Uses `boto3` with automatic retry decorators for resilience\r\n- Proper error handling with informative error messages\r\n- Supports all standard AWS authentication methods (credentials, profiles, IAM roles)\r\n- Handles DynamoDB pagination automatically\r\n- Deserializes all DynamoDB data types to native Python types\r\n\r\n### Testing\r\n\r\nComprehensive test coverage has been implemented:\r\n\r\n#### Unit Tests (28 tests, ~90% code coverage)\r\n\r\n- **Basic query operations** - partition key, sort key, operators\r\n- **All sort key operators** - EQ, LT, LE, GT, GE, BEGINS_WITH, BETWEEN (including validation)\r\n- **Filter expressions** - with expression attribute names/values\r\n- **Projection expressions** - string and list formats\r\n- **Scan operations** - full table scans\r\n- **Pagination handling** - automatic pagination and with limits\r\n- **Error handling** - ResourceNotFoundException, ValidationException, missing parameters\r\n- **Data type deserialization** - String, Number, Boolean, List, Map, NULL, Binary, Sets (SS, NS, BS)\r\n- **Secondary indexes** - GSI queries\r\n- **Advanced parameters** - limit, descending order, pagination with limit\r\n\r\n#### Integration Tests (34 tests)\r\n\r\n- All sort key operators (EQ, LT, LE, GT, GE, BEGINS_WITH, BETWEEN)\r\n- Global Secondary Index (GSI) and Local Secondary Index (LSI)\r\n- Filter expressions with built-in functions (`attribute_exists`, `size`, `contains`)\r\n- Projection expressions (string and list formats)\r\n- Expression attribute names and values\r\n- Pagination (automatic and with limit)\r\n- All DynamoDB data types including Sets (SS, NS, BS)\r\n- Empty results and error handling\r\n- Scan operations\r\n- Descending sort order\r\n\r\n### Documentation\r\n\r\nComplete documentation included:\r\n\r\n- Module documentation with parameter descriptions\r\n- 10+ usage examples covering common scenarios\r\n- Return value documentation\r\n\r\n### Example Usage\r\n\r\n#### Simple Query by Partition Key\r\n\r\n```yaml\r\n- name: Get user data\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Users',\r\n partition_key='user_id',\r\n \ partition_value='12345') }}\"\r\n```\r\n\r\n#### Query with Sort Key and Filter\r\n\r\n```yaml\r\n- name: Get recent active orders\r\n \ ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Orders',\r\n partition_key='user_id',\r\n \ partition_value='12345',\r\n sort_key='order_date',\r\n \ sort_value='2024-01-01',\r\n sort_operator='GE',\r\n \ filter_expression='#status = :active',\r\n expression_attribute_names={'#status': 'status'},\r\n expression_attribute_values={':active': 'active'}) }}\"\r\n```\r\n\r\n#### Query Using Global Secondary Index\r\n\r\n```yaml\r\n- name: Find user by email\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Users',\r\n index_name='email-index',\r\n \ partition_key='email',\r\n partition_value='[email protected]') }}\"\r\n```\r\n\r\n#### Query with Projection Expression\r\n\r\n```yaml\r\n- name: Get specific user attributes\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n table_name='Users',\r\n \ partition_key='user_id',\r\n partition_value='12345',\r\n \ projection_expression=['user_id', 'name', 'email']) }}\"\r\n```\r\n\r\n#### Query with Limit and Descending Order\r\n\r\n```yaml\r\n- name: Get last 10 orders\r\n ansible.builtin.debug:\r\n msg: \"{{ lookup('community.aws.dynamodb_query',\r\n \ table_name='Orders',\r\n partition_key='user_id',\r\n \ partition_value='12345',\r\n limit=10,\r\n \ scan_index_forward=false) }}\"\r\n```\r\n\r\n#### Scan Operation\r\n\r\n```yaml\r\n- name: Scan small table with filter\r\n ansible.builtin.debug:\r\n \ msg: \"{{ lookup('community.aws.dynamodb_query',\r\n table_name='Config',\r\n \ operation='scan',\r\n filter_expression='#env = :prod',\r\n expression_attribute_names={'#env': 'environment'},\r\n \ expression_attribute_values={':prod': 'production'},\r\n \ limit=100) }}\"\r\n```\r\n\r\n### Tested With\r\n\r\n- Python 3.11, 3.12, 3.13\r\n- ansible-core 2.14+\r\n- boto3 1.34.0+\r\n- botocore 1.34.0+\r\n\r\nAll sanity tests and integration tests pass successfully.\r\n\r\n### Related Documentation\r\n\r\n- [DynamoDB Query API](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html)\r\n- [DynamoDB Scan API](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html)\r\n- [DynamoDB Data Types](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html)\r\n- [Ansible Lookup Plugins](https://docs.ansible.com/ansible/latest/plugins/lookup.html)\r\n" change_url: https://github.com/ansible-collections/community.aws/pull/2344 commit_id: 31db89a1986e6df597d98574ba01018ed42b9a15 patchset: 31db89a1986e6df597d98574ba01018ed42b9a15 project: canonical_hostname: github.com canonical_name: github.com/ansible-collections/community.aws name: ansible-collections/community.aws short_name: community.aws src_dir: src/github.com/ansible-collections/community.aws topic: null job: ansible-galaxy-importer jobtags: [] max_attempts: 3 message: ZmVhdDogYWRkIER5bmFtb0RCIHF1ZXJ5IGxvb2t1cCBwbHVnaW4gZm9yIEFXUyB0YWJsZXMKCiMgQWRkIER5bmFtb0RCIFF1ZXJ5IExvb2t1cCBQbHVnaW4NCg0KIyMgU1VNTUFSWQ0KDQpUaGlzIFBSIGFkZHMgYSBuZXcgbG9va3VwIHBsdWdpbiBgZHluYW1vZGJfcXVlcnlgIHRoYXQgZW5hYmxlcyBxdWVyeWluZyBBV1MgRHluYW1vREIgdGFibGVzIGRpcmVjdGx5IGZyb20gQW5zaWJsZSBwbGF5Ym9va3MuIFRoZSBwbHVnaW4gcHJvdmlkZXMgYSBjb252ZW5pZW50IHdheSB0byByZXRyaWV2ZSBjb25maWd1cmF0aW9uIGRhdGEsIGFwcGxpY2F0aW9uIHNldHRpbmdzLCBhbmQgb3RoZXIgZHluYW1pYyB2YWx1ZXMgc3RvcmVkIGluIER5bmFtb0RCIHRhYmxlcyBhcyBwYXJ0IG9mIGluZnJhc3RydWN0dXJlLWFzLWNvZGUgd29ya2Zsb3dzLg0KDQpUaGUgcGx1Z2luIHN1cHBvcnRzIGJvdGggUXVlcnkgKGVmZmljaWVudCwgcGFydGl0aW9uIGtleS1iYXNlZCkgYW5kIFNjYW4gKGZ1bGwgdGFibGUgc2Nhbikgb3BlcmF0aW9ucywgd2l0aCBjb21wcmVoZW5zaXZlIHN1cHBvcnQgZm9yIER5bmFtb0RCIGZlYXR1cmVzIGluY2x1ZGluZyBzZWNvbmRhcnkgaW5kZXhlcywgZmlsdGVyIGV4cHJlc3Npb25zLCBwcm9qZWN0aW9uIGV4cHJlc3Npb25zLCBhbmQgYXV0b21hdGljIHBhZ2luYXRpb24uDQoNCiMjIyBLZXkgQ2FwYWJpbGl0aWVzDQoNCi0gUXVlcnkgaXRlbXMgYnkgcGFydGl0aW9uIGtleSB3aXRoIG9wdGlvbmFsIHNvcnQga2V5IGNvbmRpdGlvbnMNCi0gU3VwcG9ydCBmb3IgYWxsIER5bmFtb0RCIHNvcnQga2V5IG9wZXJhdG9ycyAoRVEsIExULCBMRSwgR1QsIEdFLCBCRUdJTlNfV0lUSCwgQkVUV0VFTikNCi0gUXVlcnkgR2xvYmFsIFNlY29uZGFyeSBJbmRleGVzIChHU0kpIGFuZCBMb2NhbCBTZWNvbmRhcnkgSW5kZXhlcyAoTFNJKQ0KLSBGaWx0ZXIgZXhwcmVzc2lvbnMgd2l0aCBleHByZXNzaW9uIGF0dHJpYnV0ZSBuYW1lcyBhbmQgdmFsdWVzDQotIFByb2plY3Rpb24gZXhwcmVzc2lvbnMgdG8gcmV0cmlldmUgc3BlY2lmaWMgYXR0cmlidXRlcw0KLSBBdXRvbWF0aWMgcGFnaW5hdGlvbiB3aXRoIGNvbmZpZ3VyYWJsZSBsaW1pdHMNCi0gRnVsbCBzdXBwb3J0IGZvciBhbGwgRHluYW1vREIgZGF0YSB0eXBlcyBpbmNsdWRpbmcgU2V0cyAoU1MsIE5TLCBCUykNCg0KIyMjIFVzZSBDYXNlcw0KDQotIFJldHJpZXZlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gZnJvbSBEeW5hbW9EQiB0YWJsZXMNCi0gUXVlcnkgZGVwbG95bWVudCBtZXRhZGF0YSBhbmQgZW52aXJvbm1lbnQtc3BlY2lmaWMgc2V0dGluZ3MNCi0gRmV0Y2ggZHluYW1pYyBpbnZlbnRvcnkgZGF0YSBzdG9yZWQgaW4gRHluYW1vREINCi0gQWNjZXNzIGZlYXR1cmUgZmxhZ3MgYW5kIHJ1bnRpbWUgY29uZmlndXJhdGlvbg0KLSBSZXRyaWV2ZSBzZWNyZXRzIG1ldGFkYXRhIChub3QgdGhlIHNlY3JldHMgdGhlbXNlbHZlcykNCg0KIyMgSVNTVUUgVFlQRQ0KDQotIE5ldyBQbHVnaW4gUHVsbCBSZXF1ZXN0DQoNCiMjIENPTVBPTkVOVCBOQU1FDQoNCmBkeW5hbW9kYl9xdWVyeWAgKGxvb2t1cCBwbHVnaW4pDQoNCiMjIEFERElUSU9OQUwgSU5GT1JNQVRJT04NCg0KIyMjIEltcGxlbWVudGF0aW9uIERldGFpbHMNCg0KVGhlIHBsdWdpbiBpcyBidWlsdCBvbiB0b3Agb2YgYEFXU0xvb2t1cEJhc2VgIGFuZCBmb2xsb3dzIEFuc2libGUgQVdTIGNvbGxlY3Rpb24gYmVzdCBwcmFjdGljZXM6DQoNCi0gVXNlcyBgYm90bzNgIHdpdGggYXV0b21hdGljIHJldHJ5IGRlY29yYXRvcnMgZm9yIHJlc2lsaWVuY2UNCi0gUHJvcGVyIGVycm9yIGhhbmRsaW5nIHdpdGggaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZXMNCi0gU3VwcG9ydHMgYWxsIHN0YW5kYXJkIEFXUyBhdXRoZW50aWNhdGlvbiBtZXRob2RzIChjcmVkZW50aWFscywgcHJvZmlsZXMsIElBTSByb2xlcykNCi0gSGFuZGxlcyBEeW5hbW9EQiBwYWdpbmF0aW9uIGF1dG9tYXRpY2FsbHkNCi0gRGVzZXJpYWxpemVzIGFsbCBEeW5hbW9EQiBkYXRhIHR5cGVzIHRvIG5hdGl2ZSBQeXRob24gdHlwZXMNCg0KIyMjIFRlc3RpbmcNCg0KQ29tcHJlaGVuc2l2ZSB0ZXN0IGNvdmVyYWdlIGhhcyBiZWVuIGltcGxlbWVudGVkOg0KDQojIyMjIFVuaXQgVGVzdHMgKDI4IHRlc3RzLCB+OTAlIGNvZGUgY292ZXJhZ2UpDQoNCi0gKipCYXNpYyBxdWVyeSBvcGVyYXRpb25zKiogLSBwYXJ0aXRpb24ga2V5LCBzb3J0IGtleSwgb3BlcmF0b3JzDQotICoqQWxsIHNvcnQga2V5IG9wZXJhdG9ycyoqIC0gRVEsIExULCBMRSwgR1QsIEdFLCBCRUdJTlNfV0lUSCwgQkVUV0VFTiAoaW5jbHVkaW5nIHZhbGlkYXRpb24pDQotICoqRmlsdGVyIGV4cHJlc3Npb25zKiogLSB3aXRoIGV4cHJlc3Npb24gYXR0cmlidXRlIG5hbWVzL3ZhbHVlcw0KLSAqKlByb2plY3Rpb24gZXhwcmVzc2lvbnMqKiAtIHN0cmluZyBhbmQgbGlzdCBmb3JtYXRzDQotICoqU2NhbiBvcGVyYXRpb25zKiogLSBmdWxsIHRhYmxlIHNjYW5zDQotICoqUGFnaW5hdGlvbiBoYW5kbGluZyoqIC0gYXV0b21hdGljIHBhZ2luYXRpb24gYW5kIHdpdGggbGltaXRzDQotICoqRXJyb3IgaGFuZGxpbmcqKiAtIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24sIG1pc3NpbmcgcGFyYW1ldGVycw0KLSAqKkRhdGEgdHlwZSBkZXNlcmlhbGl6YXRpb24qKiAtIFN0cmluZywgTnVtYmVyLCBCb29sZWFuLCBMaXN0LCBNYXAsIE5VTEwsIEJpbmFyeSwgU2V0cyAoU1MsIE5TLCBCUykNCi0gKipTZWNvbmRhcnkgaW5kZXhlcyoqIC0gR1NJIHF1ZXJpZXMNCi0gKipBZHZhbmNlZCBwYXJhbWV0ZXJzKiogLSBsaW1pdCwgZGVzY2VuZGluZyBvcmRlciwgcGFnaW5hdGlvbiB3aXRoIGxpbWl0DQoNCiMjIyMgSW50ZWdyYXRpb24gVGVzdHMgKDM0IHRlc3RzKQ0KDQotIEFsbCBzb3J0IGtleSBvcGVyYXRvcnMgKEVRLCBMVCwgTEUsIEdULCBHRSwgQkVHSU5TX1dJVEgsIEJFVFdFRU4pDQotIEdsb2JhbCBTZWNvbmRhcnkgSW5kZXggKEdTSSkgYW5kIExvY2FsIFNlY29uZGFyeSBJbmRleCAoTFNJKQ0KLSBGaWx0ZXIgZXhwcmVzc2lvbnMgd2l0aCBidWlsdC1pbiBmdW5jdGlvbnMgKGBhdHRyaWJ1dGVfZXhpc3RzYCwgYHNpemVgLCBgY29udGFpbnNgKQ0KLSBQcm9qZWN0aW9uIGV4cHJlc3Npb25zIChzdHJpbmcgYW5kIGxpc3QgZm9ybWF0cykNCi0gRXhwcmVzc2lvbiBhdHRyaWJ1dGUgbmFtZXMgYW5kIHZhbHVlcw0KLSBQYWdpbmF0aW9uIChhdXRvbWF0aWMgYW5kIHdpdGggbGltaXQpDQotIEFsbCBEeW5hbW9EQiBkYXRhIHR5cGVzIGluY2x1ZGluZyBTZXRzIChTUywgTlMsIEJTKQ0KLSBFbXB0eSByZXN1bHRzIGFuZCBlcnJvciBoYW5kbGluZw0KLSBTY2FuIG9wZXJhdGlvbnMNCi0gRGVzY2VuZGluZyBzb3J0IG9yZGVyDQoNCiMjIyBEb2N1bWVudGF0aW9uDQoNCkNvbXBsZXRlIGRvY3VtZW50YXRpb24gaW5jbHVkZWQ6DQoNCi0gTW9kdWxlIGRvY3VtZW50YXRpb24gd2l0aCBwYXJhbWV0ZXIgZGVzY3JpcHRpb25zDQotIDEwKyB1c2FnZSBleGFtcGxlcyBjb3ZlcmluZyBjb21tb24gc2NlbmFyaW9zDQotIFJldHVybiB2YWx1ZSBkb2N1bWVudGF0aW9uDQoNCiMjIyBFeGFtcGxlIFVzYWdlDQoNCiMjIyMgU2ltcGxlIFF1ZXJ5IGJ5IFBhcnRpdGlvbiBLZXkNCg0KYGBgeWFtbA0KLSBuYW1lOiBHZXQgdXNlciBkYXRhDQogIGFuc2libGUuYnVpbHRpbi5kZWJ1ZzoNCiAgICBtc2c6ICJ7eyBsb29rdXAoJ2NvbW11bml0eS5hd3MuZHluYW1vZGJfcXVlcnknLA0KICAgICAgICAgICAgICAgICAgICAgdGFibGVfbmFtZT0nVXNlcnMnLA0KICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX2tleT0ndXNlcl9pZCcsDQogICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fdmFsdWU9JzEyMzQ1JykgfX0iDQpgYGANCg0KIyMjIyBRdWVyeSB3aXRoIFNvcnQgS2V5IGFuZCBGaWx0ZXINCg0KYGBgeWFtbA0KLSBuYW1lOiBHZXQgcmVjZW50IGFjdGl2ZSBvcmRlcnMNCiAgYW5zaWJsZS5idWlsdGluLmRlYnVnOg0KICAgIG1zZzogInt7IGxvb2t1cCgnY29tbXVuaXR5LmF3cy5keW5hbW9kYl9xdWVyeScsDQogICAgICAgICAgICAgICAgICAgICB0YWJsZV9uYW1lPSdPcmRlcnMnLA0KICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX2tleT0ndXNlcl9pZCcsDQogICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fdmFsdWU9JzEyMzQ1JywNCiAgICAgICAgICAgICAgICAgICAgIHNvcnRfa2V5PSdvcmRlcl9kYXRlJywNCiAgICAgICAgICAgICAgICAgICAgIHNvcnRfdmFsdWU9JzIwMjQtMDEtMDEnLA0KICAgICAgICAgICAgICAgICAgICAgc29ydF9vcGVyYXRvcj0nR0UnLA0KICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2V4cHJlc3Npb249JyNzdGF0dXMgPSA6YWN0aXZlJywNCiAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fYXR0cmlidXRlX25hbWVzPXsnI3N0YXR1cyc6ICdzdGF0dXMnfSwNCiAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fYXR0cmlidXRlX3ZhbHVlcz17JzphY3RpdmUnOiAnYWN0aXZlJ30pIH19Ig0KYGBgDQoNCiMjIyMgUXVlcnkgVXNpbmcgR2xvYmFsIFNlY29uZGFyeSBJbmRleA0KDQpgYGB5YW1sDQotIG5hbWU6IEZpbmQgdXNlciBieSBlbWFpbA0KICBhbnNpYmxlLmJ1aWx0aW4uZGVidWc6DQogICAgbXNnOiAie3sgbG9va3VwKCdjb21tdW5pdHkuYXdzLmR5bmFtb2RiX3F1ZXJ5JywNCiAgICAgICAgICAgICAgICAgICAgIHRhYmxlX25hbWU9J1VzZXJzJywNCiAgICAgICAgICAgICAgICAgICAgIGluZGV4X25hbWU9J2VtYWlsLWluZGV4JywNCiAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9rZXk9J2VtYWlsJywNCiAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl92YWx1ZT0nW2VtYWlsIHByb3RlY3RlZF0nKSB9fSINCmBgYA0KDQojIyMjIFF1ZXJ5IHdpdGggUHJvamVjdGlvbiBFeHByZXNzaW9uDQoNCmBgYHlhbWwNCi0gbmFtZTogR2V0IHNwZWNpZmljIHVzZXIgYXR0cmlidXRlcw0KICBhbnNpYmxlLmJ1aWx0aW4uZGVidWc6DQogICAgbXNnOiAie3sgbG9va3VwKCdjb21tdW5pdHkuYXdzLmR5bmFtb2RiX3F1ZXJ5JywNCiAgICAgICAgICAgICAgICAgICAgIHRhYmxlX25hbWU9J1VzZXJzJywNCiAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9rZXk9J3VzZXJfaWQnLA0KICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3ZhbHVlPScxMjM0NScsDQogICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uX2V4cHJlc3Npb249Wyd1c2VyX2lkJywgJ25hbWUnLCAnZW1haWwnXSkgfX0iDQpgYGANCg0KIyMjIyBRdWVyeSB3aXRoIExpbWl0IGFuZCBEZXNjZW5kaW5nIE9yZGVyDQoNCmBgYHlhbWwNCi0gbmFtZTogR2V0IGxhc3QgMTAgb3JkZXJzDQogIGFuc2libGUuYnVpbHRpbi5kZWJ1ZzoNCiAgICBtc2c6ICJ7eyBsb29rdXAoJ2NvbW11bml0eS5hd3MuZHluYW1vZGJfcXVlcnknLA0KICAgICAgICAgICAgICAgICAgICAgdGFibGVfbmFtZT0nT3JkZXJzJywNCiAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9rZXk9J3VzZXJfaWQnLA0KICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3ZhbHVlPScxMjM0NScsDQogICAgICAgICAgICAgICAgICAgICBsaW1pdD0xMCwNCiAgICAgICAgICAgICAgICAgICAgIHNjYW5faW5kZXhfZm9yd2FyZD1mYWxzZSkgfX0iDQpgYGANCg0KIyMjIyBTY2FuIE9wZXJhdGlvbg0KDQpgYGB5YW1sDQotIG5hbWU6IFNjYW4gc21hbGwgdGFibGUgd2l0aCBmaWx0ZXINCiAgYW5zaWJsZS5idWlsdGluLmRlYnVnOg0KICAgIG1zZzogInt7IGxvb2t1cCgnY29tbXVuaXR5LmF3cy5keW5hbW9kYl9xdWVyeScsDQogICAgICAgICAgICAgICAgICAgICB0YWJsZV9uYW1lPSdDb25maWcnLA0KICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uPSdzY2FuJywNCiAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9leHByZXNzaW9uPScjZW52ID0gOnByb2QnLA0KICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl9hdHRyaWJ1dGVfbmFtZXM9eycjZW52JzogJ2Vudmlyb25tZW50J30sDQogICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uX2F0dHJpYnV0ZV92YWx1ZXM9eyc6cHJvZCc6ICdwcm9kdWN0aW9uJ30sDQogICAgICAgICAgICAgICAgICAgICBsaW1pdD0xMDApIH19Ig0KYGBgDQoNCiMjIyBUZXN0ZWQgV2l0aA0KDQotIFB5dGhvbiAzLjExLCAzLjEyLCAzLjEzDQotIGFuc2libGUtY29yZSAyLjE0Kw0KLSBib3RvMyAxLjM0LjArDQotIGJvdG9jb3JlIDEuMzQuMCsNCg0KQWxsIHNhbml0eSB0ZXN0cyBhbmQgaW50ZWdyYXRpb24gdGVzdHMgcGFzcyBzdWNjZXNzZnVsbHkuDQoNCiMjIyBSZWxhdGVkIERvY3VtZW50YXRpb24NCg0KLSBbRHluYW1vREIgUXVlcnkgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9uZHluYW1vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUXVlcnkuaHRtbCkNCi0gW0R5bmFtb0RCIFNjYW4gQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9uZHluYW1vZGIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfU2Nhbi5odG1sKQ0KLSBbRHluYW1vREIgRGF0YSBUeXBlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbmR5bmFtb2RiL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9Ib3dJdFdvcmtzLk5hbWluZ1J1bGVzRGF0YVR5cGVzLmh0bWwpDQotIFtBbnNpYmxlIExvb2t1cCBQbHVnaW5zXShodHRwczovL2RvY3MuYW5zaWJsZS5jb20vYW5zaWJsZS9sYXRlc3QvcGx1Z2lucy9sb29rdXAuaHRtbCkNCg== patchset: 31db89a1986e6df597d98574ba01018ed42b9a15 pipeline: third-party-check playbook_context: playbook_projects: trusted/project_0/github.com/ansible/zuul-config: canonical_name: github.com/ansible/zuul-config checkout: master commit: 9cec676fdc5b2a7fbf401767643a3c48545c082f trusted/project_1/opendev.org/zuul/zuul-jobs: canonical_name: opendev.org/zuul/zuul-jobs checkout: master commit: 3f62739c27168ebe05c65ba9b26a90fe6a6268df untrusted/project_0/github.com/ansible/ansible-zuul-jobs: canonical_name: github.com/ansible/ansible-zuul-jobs checkout: master commit: f22f22e05a919f76989979ce0a538febe2c4e73f untrusted/project_1/github.com/ansible/zuul-config: canonical_name: github.com/ansible/zuul-config checkout: master commit: 9cec676fdc5b2a7fbf401767643a3c48545c082f untrusted/project_2/opendev.org/zuul/zuul-jobs: canonical_name: opendev.org/zuul/zuul-jobs checkout: master commit: 3f62739c27168ebe05c65ba9b26a90fe6a6268df playbooks: - path: untrusted/project_0/github.com/ansible/ansible-zuul-jobs/playbooks/ansible-galaxy-importer/run.yaml roles: - checkout: master checkout_description: playbook branch link_name: ansible/playbook_0/role_0/zuul-jobs link_target: untrusted/project_0/github.com/ansible/ansible-zuul-jobs role_path: ansible/playbook_0/role_0/zuul-jobs/roles - checkout: master checkout_description: project default branch link_name: ansible/playbook_0/role_1/zuul-config link_target: untrusted/project_1/github.com/ansible/zuul-config role_path: ansible/playbook_0/role_1/zuul-config/roles - checkout: master checkout_description: project default branch link_name: ansible/playbook_0/role_2/zuul-jobs link_target: untrusted/project_2/opendev.org/zuul/zuul-jobs role_path: ansible/playbook_0/role_2/zuul-jobs/roles post_review: false project: canonical_hostname: github.com canonical_name: github.com/ansible-collections/community.aws name: ansible-collections/community.aws short_name: community.aws src_dir: src/github.com/ansible-collections/community.aws projects: github.com/ansible-collections/community.aws: canonical_hostname: github.com canonical_name: github.com/ansible-collections/community.aws checkout: main checkout_description: zuul branch commit: 5aa6a0b9586dca32b757beb4efbe14e6d4352562 name: ansible-collections/community.aws required: false short_name: community.aws src_dir: src/github.com/ansible-collections/community.aws github.com/ansible-network/releases: canonical_hostname: github.com canonical_name: github.com/ansible-network/releases checkout: master checkout_description: project default branch commit: 646b310655c531e4904be07f4ff8fc3a29addd09 name: ansible-network/releases required: true short_name: releases src_dir: src/github.com/ansible-network/releases ref: refs/pull/2344/head resources: {} tenant: ansible timeout: 1800 topic: null voting: false zuul_use_fetch_output: true