Execution
Date 15 Dec 2025 10:19:13 +0000
Duration 00:23:12.82
Controller aio1.openstack.local
User root
Versions
Ansible 2.18.6
ara 1.7.4 / 1.7.4
Python 3.12.3
Summary
9 Hosts
618 Tasks
960 Results
108 Plays
456 Files
0 Records

File: /home/zuul/src/opendev.org/openstack/openstack-ansible-os_tempest/tasks/tempest_resources.yml

---
# Copyright 2014, Rackspace US, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# We set the python interpreter to the ansible runtime venv if
# the delegation is to localhost so that we get access to the
# appropriate python libraries in that venv. If the delegation
# is to another host, we assume that it is accessible by the
# system python instead.

- name: Ensure that all required variables are set when tempest_public_net_create is enabled
  ansible.builtin.assert:
    that:
      - tempest_public_net_name is defined
      - tempest_public_net_provider_type is defined
      - tempest_public_net_physical_name is defined
      - tempest_public_subnet_name is defined
      - tempest_public_subnet_cidr is defined
      - tempest_public_net_physical_name is defined
      - tempest_public_router_external is defined
  when:
    - tempest_public_net_create

- name: Ensure that all required variables are set when tempest_public_net_create is disabled
  ansible.builtin.assert:
    that:
      - tempest_neutron_public_network_id is defined
  when:
    - not tempest_public_net_create

- name: Ensure that all required variables are set when tempest_private_net_create is enabled
  ansible.builtin.assert:
    that:
      - tempest_private_net_name is defined
      - tempest_private_subnet_name is defined
      - tempest_private_subnet_cidr is defined
      - tempest_private_net_provider_type is defined
  when:
    - tempest_private_net_create

- name: Ensure that all required variables are set when tempest_router_create is enabled
  ansible.builtin.assert:
    that:
      - (tempest_public_net_create or tempest_neutron_public_network_id is defined)
      - tempest_private_net_create
  when:
    - tempest_router_create

- name: Ensure that all required variables are set when tempest_images_create is disabled
  ansible.builtin.assert:
    that:
      - tempest_glance_image_id_1 is defined
      - tempest_glance_image_id_2 is defined
  when:
    - not tempest_images_create

- name: Ensure that all required variables are set when tempest_flavors_create is enabled
  ansible.builtin.assert:
    that:
      - "tempest_flavors | length > 0"
  when:
    - tempest_flavors_create

- name: Ensure that all required variables are set when tempest_flavors_create is disabled
  ansible.builtin.assert:
    that:
      - tempest_nova_flavor_id_1 is defined
  when:
    - not tempest_flavors_create

- name: Ensures you have at least one image to upload
  ansible.builtin.assert:
    that:
      - "tempest_images | length > 0"
  when:
    - tempest_service_available_glance | bool
    - tempest_images_create | bool

- name: Creating OpenStack Projects
  ansible.builtin.include_role:
    name: openstack.osa.openstack_resources
  vars:
    openstack_resources_identity:
      domains:
        - name: "{{ tempest_domain_name }}"
      projects: |-
        {% set projects = [] %}
        {% for project in tempest_projects %}
        {%   set _ = projects.append({
                'name': project,
                'description': project ~ ' project',
                'domain': tempest_domain_name
        })  %}
        {% endfor %}
        {{ projects }}
  when:
    - tempest_projects_create | bool

- name: Get tempest project data
  delegate_to: "{{ tempest_service_setup_host }}"
  run_once: true
  vars:
    ansible_python_interpreter: "{{ tempest_service_setup_host_python_interpreter }}"
  block:
    - name: Get tempest project UUID
      openstack.cloud.project_info:
        cloud: "{{ tempest_cloud_name }}"
        interface: "{{ tempest_interface_name }}"
        domain: "{{ tempest_domain_name }}"
        name: "{{ project }}"
      loop: "{{ tempest_projects }}"
      loop_control:
        loop_var: project
        label: "{{ project }}"
      register: tempest_project_details

- name: Get demo project ID
  ansible.builtin.set_fact:
    keystone_demo_tenant_id: >-
      {{ (tempest_project_details.results | map(attribute='projects') | list | flatten | map(attribute='id') | list)[0] }}

- name: Creating OpenStack resources
  ansible.builtin.include_role:
    name: openstack.osa.openstack_resources
  vars:
    _private_network:
      name: "{{ tempest_private_net_name }}"
      network_type: "{{ tempest_private_net_provider_type }}"
      physical_network: "{{ tempest_private_net_physical_name | default(omit) }}"
      segmentation_id: "{{ tempest_private_net_seg_id | default(omit) }}"
      mtu: "{{ tempest_private_net_mtu | default(omit) }}"
      project: "{{ keystone_demo_tenant_id }}"
      subnets:
        - name: "{{ tempest_private_subnet_name }}"
          cidr: "{{ tempest_private_subnet_cidr }}"
          dhcp: false

    _public_network:
      name: "{{ tempest_public_net_name }}"
      network_type: "{{ tempest_public_net_provider_type }}"
      physical_network: "{{ tempest_public_net_physical_name | default(omit) }}"
      segmentation_id: "{{ tempest_public_net_seg_id | default(omit) }}"
      external: "{{ tempest_public_router_external }}"
      project: "{{ keystone_demo_tenant_id }}"
      shared: "{{ tempest_public_net_shared }}"
      subnets:
        - name: "{{ tempest_public_subnet_name }}"
          cidr: "{{ tempest_public_subnet_cidr }}"
          allocation_start: "{{ tempest_public_subnet_allocation_pools.split('-')[0] | default(omit) }}"
          allocation_end: "{{ tempest_public_subnet_allocation_pools.split('-')[1] | default(omit) }}"
          gateway: "{{ tempest_public_subnet_gateway_ip | default(omit) }}"

    _router:
      name: router
      network: "{{ tempest_public_net_name }}"
      interfaces:
        - "{{ tempest_private_subnet_name }}"
      project: "{{ keystone_demo_tenant_id }}"
    _compute_resources:
      flavors:
        - specs: "{{ tempest_flavors }}"

    _image_resources:
      images: "{{ tempest_images | default([]) }}"

    _network_resources: |-
      {% set resources = {'networks': [], 'routers': [], 'security_groups': []} %}
      {% if tempest_private_net_create | bool %}
      {%   set _ = resources['networks'].append(_private_network) %}
      {% endif %}
      {% if tempest_public_net_create | bool %}
      {%   set _ = resources['networks'].append(_public_network) %}
      {% endif %}
      {% if tempest_router_create | bool %}
      {%   set _ = resources['routers'].append(_router) %}
      {% endif %}
      {{ resources }}
    openstack_resources_setup_host: "{{ tempest_service_setup_host }}"
    openstack_resources_python_interpreter: "{{ tempest_service_setup_host_python_interpreter }}"
    openstack_resources_cloud_name: "{{ tempest_cloud_name }}"
    openstack_resources_interface: "{{ tempest_interface_name }}"
    openstack_resources_network: "{{ tempest_service_available_neutron | ternary(_network_resources, {}) }}"
    openstack_resources_image: "{{ (tempest_service_available_glance and tempest_images_create) | ternary(_image_resources, {}) }}"
    openstack_resources_compute: "{{ (tempest_service_available_nova and tempest_flavors_create) | ternary(_compute_resources, {}) }}"

- name: Get tempest resources data
  delegate_to: "{{ tempest_service_setup_host }}"
  run_once: true
  vars:
    ansible_python_interpreter: "{{ tempest_service_setup_host_python_interpreter }}"
  block:
    - name: Get tempest images
      openstack.cloud.image_info:
        cloud: "{{ tempest_cloud_name }}"
        interface: "{{ tempest_interface_name }}"
        filters:
          "name": "{{ image['name'] }}"
          "tags":
            - "managed_by_tempest"
      loop: "{{ tempest_images }}"
      loop_control:
        loop_var: image
        label: "{{ image['name'] }}"
      register: tempest_image_details
      when:
        - tempest_service_available_glance | bool
        - tempest_images_create | bool

    - name: Get tempest public network UUID
      openstack.cloud.networks_info:
        cloud: "{{ tempest_cloud_name }}"
        interface: "{{ tempest_interface_name }}"
        name: "{{ tempest_public_net_name }}"
        filters:
          project_id: "{{ keystone_demo_tenant_id }}"
      register: tempest_public_network_details
      when:
        - tempest_service_available_neutron | bool
        - tempest_public_net_create | bool

    - name: Get tempest router details
      openstack.cloud.routers_info:
        cloud: "{{ tempest_cloud_name }}"
        interface: "{{ tempest_interface_name }}"
        name: router
        filters:
          project_id: "{{ keystone_demo_tenant_id }}"
      when:
        - tempest_service_available_neutron | bool
        - tempest_router_create | bool

# These facts are used in tempest.conf.j2; we set an empty string if it is not
# set above to ensure the template will parse correctly.
- name: Store first tempest image id
  vars:
    res: "{{ tempest_image_details['results'] | map(attribute='images') | flatten }}"
  ansible.builtin.set_fact:
    tempest_glance_image_id_1: "{{ res[0]['id'] | default('') }}"
    tempest_glance_image_id_2: "{{ res[-1]['id'] | default('') }}"
  when:
    - tempest_service_available_glance | bool
    - tempest_images_create | bool

- name: Store tempest flavor id
  ansible.builtin.set_fact:
    tempest_nova_flavor_id_1: "{{ tempest_service_available_nova | ternary(tempest_flavors[0]['id'], '1') }}"
    tempest_nova_flavor_id_2: "{{ tempest_service_available_nova | ternary(tempest_flavors[-1]['id'], '2') }}"
  when:
    - tempest_service_available_nova | bool
    - tempest_flavors_create | bool

- name: Store neutron public network id
  ansible.builtin.set_fact:
    tempest_neutron_public_network_id: "{{ tempest_service_available_neutron | ternary(tempest_public_network_details['networks'][0]['id'], '') }}"
  when:
    - tempest_service_available_neutron | bool
    - tempest_public_net_create | bool

- name: Get router admin state and ip address
  ansible.builtin.set_fact:
    router_admin_state: "{{ _add_router['routers'][0]['is_admin_state_up'] }}"
    router_ip: "{{ _add_router['routers'][0]['external_gateway_info']['external_fixed_ips'][0]['ip_address'] }}"
  when:
    - tempest_service_available_neutron | bool
    - tempest_router_create | bool

- name: Ping router ip address
  ansible.builtin.shell: |
    set -e
    ping -c2 "{{ router_ip }}"
  register: _ping_router
  changed_when: false
  until: _ping_router is success
  retries: 5
  delay: 10
  when:
    - tempest_router_create | bool
    - tempest_service_available_neutron | bool
    - router_admin_state | bool
    - tempest_network_ping_gateway | bool
    - tempest_public_net_provider_type not in ['local']