diff --git a/README.md b/README.md
index 6f0b93e..82ab705 100644
--- a/README.md
+++ b/README.md
@@ -44,6 +44,7 @@ This collection includes the following roles for managing OpenShift Virtualizati
* [aap_seed](roles/aap_seed/README.md) - Seed AAP with Migration Factory Configuration as Code content
* [mtv_provider](roles/mtv_provider/README.md) - Create MTV/Forklift source provider CRs on OpenShift target clusters. Designed to run from AAP with credential injection.
+* [mtv_query_inventory](roles/mtv_query_inventory/README.md) - Queries MTV inventory.
* [utility_aap_deploy](roles/utility_aap_deploy/README.md) - Deploys an instance of Ansible Automation Platform.
* [utility_openshift_target_credential](roles/utility_openshift_target_credential/README.md) - A utility role to manage OpenShift target cluster credentials for migration
diff --git a/roles/mtv_query_inventory/README.md b/roles/mtv_query_inventory/README.md
new file mode 100644
index 0000000..ebc84c4
--- /dev/null
+++ b/roles/mtv_query_inventory/README.md
@@ -0,0 +1,286 @@
+
+# 📃 Role overview
+
+
+
+
+## mtv_query_inventory
+
+```
+Role belongs to infra/openshift_virtualization_migration
+Namespace - infra
+Collection - openshift_virtualization_migration
+Version - 1.25.0
+Repository - https://github.com/redhat-cop/openshift_virtualization_migration
+```
+
+Description: Queries MTV inventory.
+
+### Argument Specifications
+
+
+🧩 Argument Specifications in `meta/argument_specs`
+
+#### Key: main
+
+* **Description**: Query the MTV (Migration Toolkit for Virtualization) inventory.
+* **Options**:
+ * **mtv_query_inventory_api_scheme**:
+ * **Required**: False
+ * **Type**: str
+ * **Default**: https
+ * **Description**: Scheme to use when constructing the MTV Inventory URL.
+ * **mtv_query_inventory_endpoint_path**:
+ * **Required**: True
+ * **Type**: str
+ * **Default**: none
+ * **Description**: Relative path to the MTV inventory retrieval endpoint (eg. /providers).
+ * **mtv_query_inventory_namespace**:
+ * **Required**: False
+ * **Type**: str
+ * **Default**: openshift-mtv
+ * **Description**: Namespace containing the MTV inventory service.
+ * **mtv_query_inventory_openshift_api_key**:
+ * **Required**: True
+ * **Type**: str
+ * **Default**: none
+ * **Description**: OpenShift API key.
+ * **mtv_query_inventory_openshift_ca_cert_path**:
+ * **Required**: False
+ * **Type**: str
+ * **Default**: none
+ * **Description**: Path to the OpenShift CA Certificate.
+ * **mtv_query_inventory_openshift_host**:
+ * **Required**: True
+ * **Type**: str
+ * **Default**: none
+ * **Description**: OpenShift host (eg. https://api.openshift.example.com:6443).
+ * **mtv_query_inventory_openshift_verify_ssl**:
+ * **Required**: False
+ * **Type**: bool
+ * **Default**: True
+ * **Description**: Whether to verify SSL certificates.
+ * **mtv_query_inventory_result_var**:
+ * **Required**: False
+ * **Type**: str
+ * **Default**: mtv_query_inventory_query_result
+ * **Description**: Name of the variable to store the query result.
+ * **mtv_query_inventory_retrieval_method**:
+ * **Required**: False
+ * **Type**: str
+ * **Default**: api
+ * **Description**: Method to retrieve inventory data from MTV.
+ * **Choices**:
+ * api
+ * exec
+ * **mtv_query_inventory_route_name**:
+ * **Required**: False
+ * **Type**: str
+ * **Default**: forklift-inventory
+ * **Description**: MTV Inventory Route Name.
+ * **mtv_query_inventory_secure_logging**:
+ * **Required**: False
+ * **Type**: bool
+ * **Default**: True
+ * **Description**: Whether to enable secure logging.
+ * **mtv_query_inventory_service_name**:
+ * **Required**: False
+ * **Type**: str
+ * **Default**: forklift-inventory
+ * **Description**: MTV Inventory Service Name.
+ * **mtv_query_inventory_url**:
+ * **Required**: False
+ * **Type**: str
+ * **Default**:
+ * **Description**: URL of the MTV Inventory Service. If not provided, the URL will be determined from the MTV Inventory Route.
+
+
+
+### Defaults
+
+**These are static variables with lower priority**
+
+#### File: defaults/main.yml
+
+| Var | Type | Value |Choices |Required | Title |
+|--------------|--------------|-------------|-------------|-------------|-------------|
+| [`mtv_query_inventory_api_scheme`](defaults/main.yml#L52) | str | `https` | None | False | MTV Retrieval Method |
+| [`mtv_query_inventory_endpoint_path`](defaults/main.yml#L57) | NoneType | `None` | None | True | MTV Inventory Retrieval Endpoint |
+| [`mtv_query_inventory_namespace`](defaults/main.yml#L84) | str | `openshift-mtv` | None | False | Inventory Namespace |
+| [`mtv_query_inventory_openshift_api_key`](defaults/main.yml#L14) | str | `` | None | True | OpenShift API Key |
+| [`mtv_query_inventory_openshift_ca_cert_path`](defaults/main.yml#L29) | str | `` | None | False | OpenShift CA Certificate Path |
+| [`mtv_query_inventory_openshift_host`](defaults/main.yml#L6) | str | `` | None | True | OpenShift Host |
+| [`mtv_query_inventory_openshift_verify_ssl`](defaults/main.yml#L38) | str | `` | None | False | OpenShift Verify SSL |
+| [`mtv_query_inventory_query_delay`](defaults/main.yml#L99) | int | `5` | None | False | Inventory Query Delay |
+| [`mtv_query_inventory_query_retries`](defaults/main.yml#L94) | int | `5` | None | False | Inventory Query Retries |
+| [`mtv_query_inventory_result_var`](defaults/main.yml#L89) | str | `mtv_query_inventory_query_result` | None | False | Inventory Result Variable |
+| [`mtv_query_inventory_retrieval_method`](defaults/main.yml#L47) | str | `api` | None | False | MTV Retrieval Method |
+| [`mtv_query_inventory_route_name`](defaults/main.yml#L74) | str | `forklift-inventory` | None | False | Inventory Route Name |
+| [`mtv_query_inventory_secure_logging`](defaults/main.yml#L69) | str | `{{ secure_logging ¦ default(true) }}` | None | False | Secure Logging |
+| [`mtv_query_inventory_service_name`](defaults/main.yml#L79) | str | `forklift-inventory` | None | False | Inventory Service Name |
+| [`mtv_query_inventory_url`](defaults/main.yml#L64) | str | `` | None | False | Inventory URL |
+
+🖇️ Full descriptions for vars in defaults/main.yml
+
+`mtv_query_inventory_api_scheme`: Method to retrieve inventory data from MTV. Valid options are 'api' and 'exec'.
+
+`mtv_query_inventory_endpoint_path`: MTV inventory retrieval endpoint.
+
+`mtv_query_inventory_namespace`: Inventory Namespace
+
+`mtv_query_inventory_openshift_api_key`: OpenShift API key.
+
+`mtv_query_inventory_openshift_ca_cert_path`: Path to the OpenShift CA Certificate.
+
+`mtv_query_inventory_openshift_host`: OpenShift host.
+
+`mtv_query_inventory_openshift_verify_ssl`: Whether to verify SSL certificates.
+
+`mtv_query_inventory_query_delay`: Delay between inventory query retries in seconds.
+
+`mtv_query_inventory_query_retries`: Number of retries for the inventory queries.
+
+`mtv_query_inventory_result_var`: Name of the variable to store the query result.
+
+`mtv_query_inventory_retrieval_method`: Method to retrieve inventory data from MTV. Valid options are 'api' and 'exec'.
+
+`mtv_query_inventory_route_name`: Inventory Route Name
+
+`mtv_query_inventory_secure_logging`: Whether to enable secure logging.
+
+`mtv_query_inventory_service_name`: Inventory Service Name
+
+`mtv_query_inventory_url`: >-
+
+
+
+### Vars
+
+**These are variables with higher priority**
+
+#### File: vars/main.yml
+
+| Var | Type | Value |
+|--------------|--------------|-------------|
+| [__mtv_query_inventory_valid_retrieval_methods](vars/main.yml#L2) | list | `[]` |
+| [__mtv_query_inventory_valid_retrieval_methods.0](vars/main.yml#L3) | str | `api` |
+| [__mtv_query_inventory_valid_retrieval_methods.1](vars/main.yml#L4) | str | `exec` |
+
+### Tasks
+
+#### File: tasks/main.yml
+
+| Name | Module | Has Conditions |
+| ---- | ------ | --------- |
+| Verify valid retrieval method provided | `ansible.builtin.assert` | False |
+| Verify MTV inventory endpoint is provided | `ansible.builtin.assert` | False |
+| Query MTV inventory via api | `ansible.builtin.include_tasks` | True |
+| Query MTV inventory via exec | `ansible.builtin.include_tasks` | True |
+
+#### File: tasks/query_api.yml
+
+| Name | Module | Has Conditions |
+| ---- | ------ | --------- |
+| query_api ¦ Determine MTV Inventory URL | `block` | True |
+| query_api ¦ Locate MTV Inventory Route | `kubernetes.core.k8s_info` | False |
+| query_api ¦ Fail if MTV Inventory Route not found | `ansible.builtin.fail` | True |
+| query_api ¦ Set MTV Inventory URL | `ansible.builtin.set_fact` | False |
+| query_api ¦ Execute Query (api) | `ansible.builtin.uri` | False |
+| query_api ¦ Set Inventory Result Fact | `ansible.builtin.set_fact` | False |
+
+#### File: tasks/query_exec.yml
+
+| Name | Module | Has Conditions |
+| ---- | ------ | --------- |
+| query_exec ¦ Obtain the name of a Running Forklift Inventory Pod | `kubernetes.core.k8s_info` | False |
+| query_exec ¦ Set name of the MTV Inventory Pod | `ansible.builtin.set_fact` | False |
+| query_exec ¦ Execute Query (exec) | `kubernetes.core.k8s_exec` | False |
+| query_exec ¦ Set Result Fact | `ansible.builtin.set_fact` | False |
+
+## Task Flow Graphs
+
+### Graph for main.yml
+
+```mermaid
+flowchart TD
+Start
+classDef block stroke:#3498db,stroke-width:2px;
+classDef task stroke:#4b76bb,stroke-width:2px;
+classDef includeTasks stroke:#16a085,stroke-width:2px;
+classDef importTasks stroke:#34495e,stroke-width:2px;
+classDef includeRole stroke:#2980b9,stroke-width:2px;
+classDef importRole stroke:#699ba7,stroke-width:2px;
+classDef includeVars stroke:#8e44ad,stroke-width:2px;
+classDef rescue stroke:#665352,stroke-width:2px;
+
+ Start-->|Task| Verify_valid_retrieval_method_provided0[verify valid retrieval method provided]:::task
+ Verify_valid_retrieval_method_provided0-->|Task| Verify_MTV_inventory_endpoint_is_provided1[verify mtv inventory endpoint is provided]:::task
+ Verify_MTV_inventory_endpoint_is_provided1-->|Include task| Query_MTV_inventory_via_api_query_api_yml_2[query mtv inventory via api
When: **mtv query inventory retrieval method api**
include_task: query api yml]:::includeTasks
+ Query_MTV_inventory_via_api_query_api_yml_2-->|Include task| Query_MTV_inventory_via_exec_query_exec_yml_3[query mtv inventory via exec
When: **mtv query inventory retrieval method exec**
include_task: query exec yml]:::includeTasks
+ Query_MTV_inventory_via_exec_query_exec_yml_3-->End
+```
+
+### Graph for query_api.yml
+
+```mermaid
+flowchart TD
+Start
+classDef block stroke:#3498db,stroke-width:2px;
+classDef task stroke:#4b76bb,stroke-width:2px;
+classDef includeTasks stroke:#16a085,stroke-width:2px;
+classDef importTasks stroke:#34495e,stroke-width:2px;
+classDef includeRole stroke:#2980b9,stroke-width:2px;
+classDef importRole stroke:#699ba7,stroke-width:2px;
+classDef includeVars stroke:#8e44ad,stroke-width:2px;
+classDef rescue stroke:#665352,stroke-width:2px;
+
+ Start-->|Block Start| query_api___Determine_MTV_Inventory_URL0_block_start_0[[query api determine mtv inventory url
When: **mtv query inventory url default true
length 0**]]:::block
+ query_api___Determine_MTV_Inventory_URL0_block_start_0-->|Task| query_api___Locate_MTV_Inventory_Route0[query api locate mtv inventory route]:::task
+ query_api___Locate_MTV_Inventory_Route0-->|Task| query_api___Fail_if_MTV_Inventory_Route_not_found1[query api fail if mtv inventory route not found
When: **mtv query inventory route info is not defined or
mtv query inventory route info resources is not
defined or mtv query inventory route info
resources length 0**]:::task
+ query_api___Fail_if_MTV_Inventory_Route_not_found1-->|Task| query_api___Set_MTV_Inventory_URL2[query api set mtv inventory url]:::task
+ query_api___Set_MTV_Inventory_URL2-.->|End of Block| query_api___Determine_MTV_Inventory_URL0_block_start_0
+ query_api___Set_MTV_Inventory_URL2-->|Task| query_api___Execute_Query__api_1[query api execute query api ]:::task
+ query_api___Execute_Query__api_1-->|Task| query_api___Set_Inventory_Result_Fact2[query api set inventory result fact]:::task
+ query_api___Set_Inventory_Result_Fact2-->End
+```
+
+### Graph for query_exec.yml
+
+```mermaid
+flowchart TD
+Start
+classDef block stroke:#3498db,stroke-width:2px;
+classDef task stroke:#4b76bb,stroke-width:2px;
+classDef includeTasks stroke:#16a085,stroke-width:2px;
+classDef importTasks stroke:#34495e,stroke-width:2px;
+classDef includeRole stroke:#2980b9,stroke-width:2px;
+classDef importRole stroke:#699ba7,stroke-width:2px;
+classDef includeVars stroke:#8e44ad,stroke-width:2px;
+classDef rescue stroke:#665352,stroke-width:2px;
+
+ Start-->|Task| query_exec___Obtain_the_name_of_a_Running_Forklift_Inventory_Pod0[query exec obtain the name of a running forklift
inventory pod]:::task
+ query_exec___Obtain_the_name_of_a_Running_Forklift_Inventory_Pod0-->|Task| query_exec___Set_name_of_the_MTV_Inventory_Pod1[query exec set name of the mtv inventory pod]:::task
+ query_exec___Set_name_of_the_MTV_Inventory_Pod1-->|Task| query_exec___Execute_Query__exec_2[query exec execute query exec ]:::task
+ query_exec___Execute_Query__exec_2-->|Task| query_exec___Set_Result_Fact3[query exec set result fact]:::task
+ query_exec___Set_Result_Fact3-->End
+```
+
+## Author Information
+
+Red Hat
+
+## License
+
+GPL-3.0-only
+
+## Minimum Ansible Version
+
+2.15.0
+
+## Platforms
+
+No platforms specified.
+
+
\ No newline at end of file
diff --git a/roles/mtv_query_inventory/defaults/main.yml b/roles/mtv_query_inventory/defaults/main.yml
new file mode 100644
index 0000000..479949e
--- /dev/null
+++ b/roles/mtv_query_inventory/defaults/main.yml
@@ -0,0 +1,100 @@
+---
+
+# title: OpenShift Host
+# required: True
+# description: OpenShift host.
+mtv_query_inventory_openshift_host: >-
+ {{
+ lookup('env', 'K8S_AUTH_HOST') | default(openshift_host, true)
+ }}
+
+# title: OpenShift API Key
+# required: True
+# description: OpenShift API key.
+mtv_query_inventory_openshift_api_key: >-
+ {{
+ lookup('env', 'K8S_AUTH_API_KEY')
+ | default(
+ openshift_credential.openshift_api_key
+ | default(openshift_credential.openshift_temporary_api_key)
+ if openshift_credential is defined
+ else openshift_api_key | default(openshift_temporary_api_key),
+ true
+ )
+ }}
+
+# title: OpenShift CA Certificate Path
+# required: False
+# description: Path to the OpenShift CA Certificate.
+mtv_query_inventory_openshift_ca_cert_path: >-
+ {{
+ lookup('env', 'K8S_AUTH_SSL_CA_CERT')
+ | default(openshift_ca_cert_path | default(omit), true)
+ }}
+
+# title: OpenShift Verify SSL
+# required: False
+# description: Whether to verify SSL certificates.
+mtv_query_inventory_openshift_verify_ssl: >-
+ {{
+ lookup('env', 'K8S_AUTH_VERIFY_SSL')
+ | default(openshift_verify_ssl | default(true), true)
+ }}
+
+# title: MTV Retrieval Method
+# required: False
+# description: Method to retrieve inventory data from MTV. Valid options are 'api' and 'exec'.
+mtv_query_inventory_retrieval_method: api
+
+# title: MTV Retrieval Method
+# required: False
+# description: Method to retrieve inventory data from MTV. Valid options are 'api' and 'exec'.
+mtv_query_inventory_api_scheme: https
+
+# title: MTV Inventory Retrieval Endpoint
+# required: True
+# description: MTV inventory retrieval endpoint.
+mtv_query_inventory_endpoint_path:
+
+# title: Inventory URL
+# required: False
+# description: >-
+# URL of the MTV Inventory Service. If not provided,
+# the URL will be determined from the MTV Inventory Route.
+mtv_query_inventory_url: ""
+
+# title: Secure Logging
+# required: False
+# description: Whether to enable secure logging.
+mtv_query_inventory_secure_logging: "{{ secure_logging | default(true) }}"
+
+# title: Inventory Route Name
+# required: False
+# description: Inventory Route Name
+mtv_query_inventory_route_name: forklift-inventory
+
+# title: Inventory Service Name
+# required: False
+# description: Inventory Service Name
+mtv_query_inventory_service_name: forklift-inventory
+
+# title: Inventory Namespace
+# required: False
+# description: Inventory Namespace
+mtv_query_inventory_namespace: "openshift-mtv"
+
+# title: Inventory Result Variable
+# required: False
+# description: Name of the variable to store the query result.
+mtv_query_inventory_result_var: mtv_query_inventory_query_result
+
+# title: Inventory Query Retries
+# required: False
+# description: Number of retries for the inventory queries.
+mtv_query_inventory_query_retries: 5
+
+# title: Inventory Query Delay
+# required: False
+# description: Delay between inventory query retries in seconds.
+mtv_query_inventory_query_delay: 5
+...
diff --git a/roles/mtv_query_inventory/meta/argument_specs.yml b/roles/mtv_query_inventory/meta/argument_specs.yml
new file mode 100644
index 0000000..7901417
--- /dev/null
+++ b/roles/mtv_query_inventory/meta/argument_specs.yml
@@ -0,0 +1,86 @@
+---
+argument_specs:
+ main:
+ short_description: Query the MTV (Migration Toolkit for Virtualization) inventory.
+ options:
+ mtv_query_inventory_openshift_host:
+ type: str
+ required: true
+ description: OpenShift host (eg. https://api.openshift.example.com:6443).
+
+ mtv_query_inventory_openshift_api_key:
+ type: str
+ required: true
+ description: OpenShift API key.
+
+ mtv_query_inventory_openshift_ca_cert_path:
+ type: str
+ required: false
+ description: Path to the OpenShift CA Certificate.
+
+ mtv_query_inventory_openshift_verify_ssl:
+ type: bool
+ required: false
+ default: true
+ description: Whether to verify SSL certificates.
+
+ mtv_query_inventory_retrieval_method:
+ type: str
+ required: false
+ default: "api"
+ choices:
+ - api
+ - exec
+ description: >-
+ Method to retrieve inventory data from MTV.
+
+ mtv_query_inventory_api_scheme:
+ type: str
+ required: false
+ default: "https"
+ description: Scheme to use when constructing the MTV Inventory URL.
+
+ mtv_query_inventory_url:
+ type: str
+ required: false
+ default: ""
+ description: >-
+ URL of the MTV Inventory Service. If not provided,
+ the URL will be determined from the MTV Inventory Route.
+
+ mtv_query_inventory_endpoint_path:
+ type: str
+ required: true
+ description: Relative path to the MTV inventory retrieval endpoint (eg. /providers).
+
+ mtv_query_inventory_secure_logging:
+ type: bool
+ required: false
+ default: true
+ description: Whether to enable secure logging.
+
+ mtv_query_inventory_route_name:
+ type: str
+ required: false
+ default: "forklift-inventory"
+ description: MTV Inventory Route Name.
+
+ mtv_query_inventory_service_name:
+ type: str
+ required: false
+ default: "forklift-inventory"
+ description: MTV Inventory Service Name.
+
+ mtv_query_inventory_namespace:
+ type: str
+ required: false
+ default: "openshift-mtv"
+ description: Namespace containing the MTV inventory service.
+
+ mtv_query_inventory_result_var:
+ type: str
+ required: false
+ default: "mtv_query_inventory_query_result"
+ description: >-
+ Name of the variable to store the query result.
+...
diff --git a/roles/mtv_query_inventory/meta/main.yml b/roles/mtv_query_inventory/meta/main.yml
new file mode 100644
index 0000000..ab2dc43
--- /dev/null
+++ b/roles/mtv_query_inventory/meta/main.yml
@@ -0,0 +1,10 @@
+---
+galaxy_info:
+ author: Red Hat
+ description: Queries MTV inventory.
+ company: "Red Hat"
+ license: GPL-3.0-only
+ min_ansible_version: 2.15.0
+ galaxy_tags: []
+dependencies: []
+...
diff --git a/roles/mtv_query_inventory/tasks/main.yml b/roles/mtv_query_inventory/tasks/main.yml
new file mode 100644
index 0000000..304271f
--- /dev/null
+++ b/roles/mtv_query_inventory/tasks/main.yml
@@ -0,0 +1,31 @@
+---
+
+- name: Verify valid retrieval method provided
+ ansible.builtin.assert:
+ that:
+ - mtv_query_inventory_retrieval_method in __mtv_query_inventory_valid_retrieval_methods
+ fail_msg: >-
+ "{{ mtv_query_inventory_retrieval_method }} is not a valid MTV inventory retrieval method.
+ Valid options are {{ __mtv_query_inventory_valid_retrieval_methods | join(', ') }}."
+ quiet: true
+
+- name: Verify MTV inventory endpoint is provided
+ ansible.builtin.assert:
+ that:
+ - mtv_query_inventory_endpoint_path | default('', true) | length > 0
+ - mtv_query_inventory_endpoint_path is ansible.builtin.match('^/[a-zA-Z0-9_\\-/]*(\\?[a-zA-Z0-9_\\-/.%&=]*)?$')
+ fail_msg: >-
+ Invalid MTV inventory endpoint provided: {{ mtv_query_inventory_endpoint_path }}.
+ Ensure that a valid URL context path is provided for the MTV inventory endpoint.
+ quiet: true
+
+- name: Query MTV inventory via api
+ when: mtv_query_inventory_retrieval_method == 'api'
+ ansible.builtin.include_tasks:
+ file: query_api.yml
+
+- name: Query MTV inventory via exec
+ when: mtv_query_inventory_retrieval_method == 'exec'
+ ansible.builtin.include_tasks:
+ file: query_exec.yml
+...
diff --git a/roles/mtv_query_inventory/tasks/query_api.yml b/roles/mtv_query_inventory/tasks/query_api.yml
new file mode 100644
index 0000000..50052a7
--- /dev/null
+++ b/roles/mtv_query_inventory/tasks/query_api.yml
@@ -0,0 +1,60 @@
+---
+- name: query_api | Determine MTV Inventory URL
+ when: mtv_query_inventory_url | default('', true) | length == 0
+ block:
+ - name: query_api | Locate MTV Inventory Route
+ no_log: "{{ mtv_query_inventory_secure_logging }}"
+ kubernetes.core.k8s_info:
+ host: "{{ mtv_query_inventory_openshift_host }}"
+ api_key: "{{ mtv_query_inventory_openshift_api_key }}"
+ validate_certs: "{{ mtv_query_inventory_openshift_verify_ssl }}"
+ ca_cert: "{{ mtv_query_inventory_openshift_ca_cert_path | default(omit) }}"
+ api_version: route.openshift.io/v1
+ kind: Route
+ name: "{{ mtv_query_inventory_route_name }}"
+ namespace: "{{ mtv_query_inventory_namespace }}"
+ register: __mtv_query_inventory_route_info
+ retries: "{{ mtv_query_inventory_query_retries }}"
+ until:
+ - __mtv_query_inventory_route_info.resources is defined
+ - __mtv_query_inventory_route_info.resources | length > 0
+ delay: "{{ mtv_query_inventory_query_delay }}"
+
+ - name: query_api | Fail if MTV Inventory Route not found
+ ansible.builtin.fail:
+ msg: >-
+ MTV Inventory Route {{ mtv_query_inventory_route_name }}
+ not found in namespace {{ mtv_query_inventory_namespace }}.
+ Ensure that the MTV Inventory Route is created and accessible.
+ when: >-
+ __mtv_query_inventory_route_info is not defined
+ or __mtv_query_inventory_route_info.resources is not defined
+ or __mtv_query_inventory_route_info.resources | length == 0
+
+ - name: query_api | Set MTV Inventory URL
+ ansible.builtin.set_fact:
+ mtv_query_inventory_url: >-
+ {{ mtv_query_inventory_api_scheme }}://{{ __mtv_query_inventory_route_info.resources[0].spec.host }}
+
+- name: query_api | Execute Query (api)
+ ansible.builtin.uri:
+ url: "{{ mtv_query_inventory_url }}{{ mtv_query_inventory_endpoint_path }}"
+ method: GET
+ body_format: json
+ status_code: 200
+ return_content: true
+ validate_certs: "{{ mtv_query_inventory_openshift_verify_ssl }}"
+ ca_cert: "{{ mtv_query_inventory_openshift_ca_cert_path | default(omit) }}"
+ headers:
+ Authorization: Bearer {{ mtv_query_inventory_openshift_api_key }}
+ register: __mtv_query_inventory_query_result
+ retries: "{{ mtv_query_inventory_query_retries }}"
+ until: __mtv_query_inventory_query_result.status == 200
+ delay: "{{ mtv_query_inventory_query_delay }}"
+ no_log: "{{ mtv_query_inventory_secure_logging }}"
+
+- name: query_api | Set Inventory Result Fact # noqa var-naming[no-jinja]
+ ansible.builtin.set_fact:
+ "{{ mtv_query_inventory_query_result_var | default(mtv_query_inventory_result_var) }}": >-
+ {{ __mtv_query_inventory_query_result.json }}
+...
diff --git a/roles/mtv_query_inventory/tasks/query_exec.yml b/roles/mtv_query_inventory/tasks/query_exec.yml
new file mode 100644
index 0000000..f7af440
--- /dev/null
+++ b/roles/mtv_query_inventory/tasks/query_exec.yml
@@ -0,0 +1,51 @@
+---
+
+- name: query_exec | Obtain the name of a Running Forklift Inventory Pod
+ kubernetes.core.k8s_info:
+ kind: EndpointSlice
+ host: "{{ mtv_query_inventory_openshift_host }}"
+ api_key: "{{ mtv_query_inventory_openshift_api_key }}"
+ validate_certs: "{{ mtv_query_inventory_openshift_verify_ssl }}"
+ ca_cert: "{{ mtv_query_inventory_openshift_ca_cert_path | default(omit) }}"
+ namespace: "{{ mtv_query_inventory_namespace }}"
+ label_selectors:
+ kubernetes.io/service-name={{ mtv_query_inventory_service_name }}
+ register: _mtv_query_inventory_endpoint_slice
+ until:
+ - "'resources' in _mtv_query_inventory_endpoint_slice"
+ - _mtv_query_inventory_endpoint_slice.resources | length > 0
+ - "'endpoints' in (_mtv_query_inventory_endpoint_slice.resources | first)"
+ - (_mtv_query_inventory_endpoint_slice.resources | first).endpoints | length > 0
+ retries: "{{ mtv_query_inventory_query_retries }}"
+ delay: "{{ mtv_query_inventory_query_delay }}"
+ no_log: "{{ mtv_query_inventory_secure_logging }}"
+
+- name: query_exec | Set name of the MTV Inventory Pod
+ ansible.builtin.set_fact:
+ mtv_query_inventory_exec_pod_name: >-
+ {{ (((_mtv_query_inventory_endpoint_slice.resources | first).endpoints | first)).targetRef.name }}
+
+- name: query_exec | Execute Query (exec)
+ kubernetes.core.k8s_exec:
+ host: "{{ mtv_query_inventory_openshift_host }}"
+ api_key: "{{ mtv_query_inventory_openshift_api_key }}"
+ validate_certs: "{{ mtv_query_inventory_openshift_verify_ssl }}"
+ ca_cert: "{{ mtv_query_inventory_openshift_ca_cert_path | default(omit) }}"
+ namespace: "{{ mtv_query_inventory_namespace }}"
+ pod: "{{ mtv_query_inventory_exec_pod_name }}"
+ command: >-
+ curl -k -s
+ -H "Authorization: Bearer {{ mtv_query_inventory_openshift_api_key }}"
+ https://localhost:8443{{ mtv_query_inventory_endpoint_path }}
+ register: _mtv_query_inventory_query_result
+ retries: "{{ mtv_query_inventory_query_retries }}"
+ until: _mtv_query_inventory_query_result.rc == 0
+ delay: "{{ mtv_query_inventory_query_delay }}"
+ changed_when: false
+ no_log: "{{ mtv_query_inventory_secure_logging }}"
+
+- name: query_exec | Set Result Fact # noqa var-naming[no-jinja]
+ ansible.builtin.set_fact:
+ "{{ mtv_query_inventory_query_result_var | default(mtv_query_inventory_result_var) }}": >-
+ {{ _mtv_query_inventory_query_result.stdout | from_json }}
+...
diff --git a/roles/mtv_query_inventory/tests/inventory b/roles/mtv_query_inventory/tests/inventory
new file mode 100644
index 0000000..2fbb50c
--- /dev/null
+++ b/roles/mtv_query_inventory/tests/inventory
@@ -0,0 +1 @@
+localhost
diff --git a/roles/mtv_query_inventory/vars/main.yml b/roles/mtv_query_inventory/vars/main.yml
new file mode 100644
index 0000000..73a2f30
--- /dev/null
+++ b/roles/mtv_query_inventory/vars/main.yml
@@ -0,0 +1,5 @@
+---
+__mtv_query_inventory_valid_retrieval_methods:
+ - api
+ - exec
+...