Use jinja2.pass_context instead of contextfilter

The contextfilter decorator was deprecated in jinja2 3.0.0, and has been
dropped in 3.1.0. This results in the following warning, and failed
attempts to use filters:

    [WARNING]: Skipping plugin (networks.py) as it seems to be invalid:
    module 'jinja2' has no attribute 'contextfilter'

This change switches to use the pass_context decorator. The minimum
version of Jinja2 is raised to 3 to ensure pass_context is present.

This change also includes some changes to address issues with image
builds in CI, caused by CentOS Scream.

1. disable IPA image builds in seed deploy jobs

IPA image builds will be split out into a separate job. For now, disable
them.

2. disable overcloud host image builds in seed deploy jobs

Overcloud host image builds will be split out into a separate job. For
now, disable them.

Depends-On: https://review.opendev.org/c/openstack/kayobe/+/835279
Change-Id: If657bf5b0117812d3c53942464cc41cf86cc8ad5
This commit is contained in:
Mark Goddard 2022-03-24 16:34:01 +00:00
parent 24b2da7cbc
commit c9c0019d7e
9 changed files with 63 additions and 53 deletions

View File

@ -496,7 +496,7 @@ def _add_to_result(result, prefix, device, config):
result[key] = config result[key] = config
@jinja2.contextfilter @jinja2.pass_context
def networkd_netdevs(context, names, inventory_hostname=None): def networkd_netdevs(context, names, inventory_hostname=None):
"""Return a dict representation of networkd NetDev configuration. """Return a dict representation of networkd NetDev configuration.
@ -546,7 +546,7 @@ def networkd_netdevs(context, names, inventory_hostname=None):
return result return result
@jinja2.contextfilter @jinja2.pass_context
def networkd_links(context, names, inventory_hostname=None): def networkd_links(context, names, inventory_hostname=None):
"""Return a dict representation of networkd link configuration. """Return a dict representation of networkd link configuration.
@ -562,7 +562,7 @@ def networkd_links(context, names, inventory_hostname=None):
return {} return {}
@jinja2.contextfilter @jinja2.pass_context
def networkd_networks(context, names, inventory_hostname=None): def networkd_networks(context, names, inventory_hostname=None):
"""Return a dict representation of networkd network configuration. """Return a dict representation of networkd network configuration.

View File

@ -141,25 +141,25 @@ def get_vlan_parent(device, vlan):
return re.sub(r'\.{}$'.format(vlan), '', device) return re.sub(r'\.{}$'.format(vlan), '', device)
@jinja2.contextfilter @jinja2.pass_context
def net_attr(context, name, attr, inventory_hostname=None): def net_attr(context, name, attr, inventory_hostname=None):
var_name = "%s_%s" % (name, attr) var_name = "%s_%s" % (name, attr)
return utils.get_hostvar(context, var_name, inventory_hostname) return utils.get_hostvar(context, var_name, inventory_hostname)
def _make_attr_filter(attr): def _make_attr_filter(attr):
@jinja2.contextfilter @jinja2.pass_context
def func(context, name, inventory_hostname=None): def func(context, name, inventory_hostname=None):
return net_attr(context, name, attr, inventory_hostname) return net_attr(context, name, attr, inventory_hostname)
return func return func
@jinja2.contextfilter @jinja2.pass_context
def net_vip_address(context, name, inventory_hostname=None): def net_vip_address(context, name, inventory_hostname=None):
return net_attr(context, name, 'vip_address', inventory_hostname) return net_attr(context, name, 'vip_address', inventory_hostname)
@jinja2.contextfilter @jinja2.pass_context
def net_ip(context, name, inventory_hostname=None): def net_ip(context, name, inventory_hostname=None):
ips = net_attr(context, name, 'ips', inventory_hostname) ips = net_attr(context, name, 'ips', inventory_hostname)
if ips: if ips:
@ -169,56 +169,56 @@ def net_ip(context, name, inventory_hostname=None):
return ips.get(inventory_hostname) return ips.get(inventory_hostname)
@jinja2.contextfilter @jinja2.pass_context
def net_interface(context, name, inventory_hostname=None): def net_interface(context, name, inventory_hostname=None):
return net_attr(context, name, 'interface', inventory_hostname) return net_attr(context, name, 'interface', inventory_hostname)
@jinja2.contextfilter @jinja2.pass_context
def net_no_ip(context, name, inventory_hostname=None): def net_no_ip(context, name, inventory_hostname=None):
return net_attr(context, name, 'no_ip', inventory_hostname) return net_attr(context, name, 'no_ip', inventory_hostname)
@jinja2.contextfilter @jinja2.pass_context
def net_cidr(context, name, inventory_hostname=None): def net_cidr(context, name, inventory_hostname=None):
return net_attr(context, name, 'cidr', inventory_hostname) return net_attr(context, name, 'cidr', inventory_hostname)
@jinja2.contextfilter @jinja2.pass_context
def net_mask(context, name, inventory_hostname=None): def net_mask(context, name, inventory_hostname=None):
cidr = net_cidr(context, name, inventory_hostname) cidr = net_cidr(context, name, inventory_hostname)
return str(netaddr.IPNetwork(cidr).netmask) if cidr is not None else None return str(netaddr.IPNetwork(cidr).netmask) if cidr is not None else None
@jinja2.contextfilter @jinja2.pass_context
def net_prefix(context, name, inventory_hostname=None): def net_prefix(context, name, inventory_hostname=None):
cidr = net_cidr(context, name, inventory_hostname) cidr = net_cidr(context, name, inventory_hostname)
return str(netaddr.IPNetwork(cidr).prefixlen) if cidr is not None else None return str(netaddr.IPNetwork(cidr).prefixlen) if cidr is not None else None
@jinja2.contextfilter @jinja2.pass_context
def net_gateway(context, name, inventory_hostname=None): def net_gateway(context, name, inventory_hostname=None):
return net_attr(context, name, 'gateway', inventory_hostname) return net_attr(context, name, 'gateway', inventory_hostname)
@jinja2.contextfilter @jinja2.pass_context
def net_allocation_pool_start(context, name, inventory_hostname=None): def net_allocation_pool_start(context, name, inventory_hostname=None):
return net_attr(context, name, 'allocation_pool_start', inventory_hostname) return net_attr(context, name, 'allocation_pool_start', inventory_hostname)
@jinja2.contextfilter @jinja2.pass_context
def net_allocation_pool_end(context, name, inventory_hostname=None): def net_allocation_pool_end(context, name, inventory_hostname=None):
return net_attr(context, name, 'allocation_pool_end', inventory_hostname) return net_attr(context, name, 'allocation_pool_end', inventory_hostname)
@jinja2.contextfilter @jinja2.pass_context
def net_inspection_allocation_pool_start(context, name, def net_inspection_allocation_pool_start(context, name,
inventory_hostname=None): inventory_hostname=None):
return net_attr(context, name, 'inspection_allocation_pool_start', return net_attr(context, name, 'inspection_allocation_pool_start',
inventory_hostname) inventory_hostname)
@jinja2.contextfilter @jinja2.pass_context
def net_inspection_allocation_pool_end(context, name, inventory_hostname=None): def net_inspection_allocation_pool_end(context, name, inventory_hostname=None):
return net_attr(context, name, 'inspection_allocation_pool_end', return net_attr(context, name, 'inspection_allocation_pool_end',
inventory_hostname) inventory_hostname)
@ -227,13 +227,13 @@ def net_inspection_allocation_pool_end(context, name, inventory_hostname=None):
net_inspection_gateway = _make_attr_filter('inspection_gateway') net_inspection_gateway = _make_attr_filter('inspection_gateway')
@jinja2.contextfilter @jinja2.pass_context
def net_neutron_allocation_pool_start(context, name, inventory_hostname=None): def net_neutron_allocation_pool_start(context, name, inventory_hostname=None):
return net_attr(context, name, 'neutron_allocation_pool_start', return net_attr(context, name, 'neutron_allocation_pool_start',
inventory_hostname) inventory_hostname)
@jinja2.contextfilter @jinja2.pass_context
def net_neutron_allocation_pool_end(context, name, inventory_hostname=None): def net_neutron_allocation_pool_end(context, name, inventory_hostname=None):
return net_attr(context, name, 'neutron_allocation_pool_end', return net_attr(context, name, 'neutron_allocation_pool_end',
inventory_hostname) inventory_hostname)
@ -242,12 +242,12 @@ def net_neutron_allocation_pool_end(context, name, inventory_hostname=None):
net_neutron_gateway = _make_attr_filter('neutron_gateway') net_neutron_gateway = _make_attr_filter('neutron_gateway')
@jinja2.contextfilter @jinja2.pass_context
def net_vlan(context, name, inventory_hostname=None): def net_vlan(context, name, inventory_hostname=None):
return net_attr(context, name, 'vlan', inventory_hostname) return net_attr(context, name, 'vlan', inventory_hostname)
@jinja2.contextfilter @jinja2.pass_context
def net_mtu(context, name, inventory_hostname=None): def net_mtu(context, name, inventory_hostname=None):
mtu = net_attr(context, name, 'mtu', inventory_hostname) mtu = net_attr(context, name, 'mtu', inventory_hostname)
if mtu is not None: if mtu is not None:
@ -264,7 +264,7 @@ net_ethtool_opts = _make_attr_filter('ethtool_opts')
net_zone = _make_attr_filter('zone') net_zone = _make_attr_filter('zone')
@jinja2.contextfilter @jinja2.pass_context
def net_libvirt_network_name(context, name, inventory_hostname=None): def net_libvirt_network_name(context, name, inventory_hostname=None):
"""Return the configured Libvirt name for a network. """Return the configured Libvirt name for a network.
@ -275,7 +275,7 @@ def net_libvirt_network_name(context, name, inventory_hostname=None):
return libvirt_name or name return libvirt_name or name
@jinja2.contextfilter @jinja2.pass_context
def net_bridge_ports(context, name, inventory_hostname=None): def net_bridge_ports(context, name, inventory_hostname=None):
return net_attr(context, name, 'bridge_ports', inventory_hostname) return net_attr(context, name, 'bridge_ports', inventory_hostname)
@ -326,7 +326,7 @@ def _validate_rules(rules):
"for CentOS") "for CentOS")
@jinja2.contextfilter @jinja2.pass_context
def net_interface_obj(context, name, inventory_hostname=None): def net_interface_obj(context, name, inventory_hostname=None):
"""Return a dict representation of a network interface. """Return a dict representation of a network interface.
@ -378,7 +378,7 @@ def net_interface_obj(context, name, inventory_hostname=None):
return interface return interface
@jinja2.contextfilter @jinja2.pass_context
def net_bridge_obj(context, name, inventory_hostname=None): def net_bridge_obj(context, name, inventory_hostname=None):
"""Return a dict representation of a network bridge interface. """Return a dict representation of a network bridge interface.
@ -432,7 +432,7 @@ def net_bridge_obj(context, name, inventory_hostname=None):
return interface return interface
@jinja2.contextfilter @jinja2.pass_context
def net_bond_obj(context, name, inventory_hostname=None): def net_bond_obj(context, name, inventory_hostname=None):
"""Return a dict representation of a network bond interface. """Return a dict representation of a network bond interface.
@ -523,27 +523,27 @@ def _net_interface_type(context, name, inventory_hostname):
return 'bond' return 'bond'
@jinja2.contextfilter @jinja2.pass_context
def net_is_ether(context, name, inventory_hostname=None): def net_is_ether(context, name, inventory_hostname=None):
return _net_interface_type(context, name, inventory_hostname) == 'ether' return _net_interface_type(context, name, inventory_hostname) == 'ether'
@jinja2.contextfilter @jinja2.pass_context
def net_is_bridge(context, name, inventory_hostname=None): def net_is_bridge(context, name, inventory_hostname=None):
return _net_interface_type(context, name, inventory_hostname) == 'bridge' return _net_interface_type(context, name, inventory_hostname) == 'bridge'
@jinja2.contextfilter @jinja2.pass_context
def net_is_bond(context, name, inventory_hostname=None): def net_is_bond(context, name, inventory_hostname=None):
return _net_interface_type(context, name, inventory_hostname) == 'bond' return _net_interface_type(context, name, inventory_hostname) == 'bond'
@jinja2.contextfilter @jinja2.pass_context
def net_is_vlan(context, name, inventory_hostname=None): def net_is_vlan(context, name, inventory_hostname=None):
return net_vlan(context, name) is not None return net_vlan(context, name) is not None
@jinja2.contextfilter @jinja2.pass_context
def net_is_vlan_interface(context, name, inventory_hostname=None): def net_is_vlan_interface(context, name, inventory_hostname=None):
device = get_and_validate_interface(context, name, inventory_hostname) device = get_and_validate_interface(context, name, inventory_hostname)
# Use a heuristic to match conventional VLAN names, ending with a # Use a heuristic to match conventional VLAN names, ending with a
@ -551,43 +551,43 @@ def net_is_vlan_interface(context, name, inventory_hostname=None):
return re.match(r"^[a-zA-Z0-9_\-]+\.[1-9][\d]{0,3}$", device) return re.match(r"^[a-zA-Z0-9_\-]+\.[1-9][\d]{0,3}$", device)
@jinja2.contextfilter @jinja2.pass_context
def net_select_ethers(context, names, inventory_hostname=None): def net_select_ethers(context, names, inventory_hostname=None):
return [name for name in names return [name for name in names
if net_is_ether(context, name, inventory_hostname)] if net_is_ether(context, name, inventory_hostname)]
@jinja2.contextfilter @jinja2.pass_context
def net_select_bridges(context, names, inventory_hostname=None): def net_select_bridges(context, names, inventory_hostname=None):
return [name for name in names return [name for name in names
if net_is_bridge(context, name, inventory_hostname)] if net_is_bridge(context, name, inventory_hostname)]
@jinja2.contextfilter @jinja2.pass_context
def net_select_bonds(context, names, inventory_hostname=None): def net_select_bonds(context, names, inventory_hostname=None):
return [name for name in names return [name for name in names
if net_is_bond(context, name, inventory_hostname)] if net_is_bond(context, name, inventory_hostname)]
@jinja2.contextfilter @jinja2.pass_context
def net_select_vlans(context, names, inventory_hostname=None): def net_select_vlans(context, names, inventory_hostname=None):
return [name for name in names return [name for name in names
if net_is_vlan(context, name, inventory_hostname)] if net_is_vlan(context, name, inventory_hostname)]
@jinja2.contextfilter @jinja2.pass_context
def net_select_vlan_interfaces(context, names, inventory_hostname=None): def net_select_vlan_interfaces(context, names, inventory_hostname=None):
return [name for name in names return [name for name in names
if net_is_vlan_interface(context, name, inventory_hostname)] if net_is_vlan_interface(context, name, inventory_hostname)]
@jinja2.contextfilter @jinja2.pass_context
def net_reject_vlans(context, names, inventory_hostname=None): def net_reject_vlans(context, names, inventory_hostname=None):
return [name for name in names return [name for name in names
if not net_is_vlan(context, name, inventory_hostname)] if not net_is_vlan(context, name, inventory_hostname)]
@jinja2.contextfilter @jinja2.pass_context
def net_configdrive_network_device(context, name, inventory_hostname=None): def net_configdrive_network_device(context, name, inventory_hostname=None):
device = net_interface(context, name, inventory_hostname) device = net_interface(context, name, inventory_hostname)
if not device: if not device:
@ -619,7 +619,7 @@ def net_configdrive_network_device(context, name, inventory_hostname=None):
return interface return interface
@jinja2.contextfilter @jinja2.pass_context
def net_libvirt_network(context, name, inventory_hostname=None): def net_libvirt_network(context, name, inventory_hostname=None):
"""Return a dict which describes the Libvirt network for a network. """Return a dict which describes the Libvirt network for a network.
@ -634,7 +634,7 @@ def net_libvirt_network(context, name, inventory_hostname=None):
} }
@jinja2.contextfilter @jinja2.pass_context
def net_libvirt_vm_network(context, name, inventory_hostname=None): def net_libvirt_vm_network(context, name, inventory_hostname=None):
"""Return a dict which describes the Libvirt VM's network for a network. """Return a dict which describes the Libvirt VM's network for a network.
@ -648,7 +648,7 @@ def net_libvirt_vm_network(context, name, inventory_hostname=None):
} }
@jinja2.contextfilter @jinja2.pass_context
def net_ovs_veths(context, names, inventory_hostname=None): def net_ovs_veths(context, names, inventory_hostname=None):
"""Return a list of virtual Ethernet pairs for OVS. """Return a list of virtual Ethernet pairs for OVS.

View File

@ -20,17 +20,17 @@ import jinja2
from kayobe.plugins.action import kolla_ansible_host_vars from kayobe.plugins.action import kolla_ansible_host_vars
@jinja2.contextfilter @jinja2.pass_context
def _net_interface(context, name): def _net_interface(context, name):
return context.get(name + '_interface') return context.get(name + '_interface')
@jinja2.contextfilter @jinja2.pass_context
def _net_vlan(context, name): def _net_vlan(context, name):
return context.get(name + '_vlan') return context.get(name + '_vlan')
@jinja2.contextfilter @jinja2.pass_context
def _net_select_bridges(context, names): def _net_select_bridges(context, names):
return [name for name in names return [name for name in names
if (_net_interface(context, name) or "").startswith("br")] if (_net_interface(context, name) or "").startswith("br")]

View File

@ -0,0 +1,7 @@
---
# Don't build an IPA deployment image.
create_ipa_image: false
download_ipa: false
# Don't build a disk image. It takes time and can be unreliable.
create_image_via_dib: false

View File

@ -32,11 +32,3 @@ pip_trusted_hosts:
# are using for SSH to be removed. Use a dummy interface. # are using for SSH to be removed. Use a dummy interface.
aio_bridge_ports: aio_bridge_ports:
- dummy1 - dummy1
# Build seed deployment images (IPA) with extra-hardware element
ipa_build_images: true
ipa_build_dib_elements_extra:
- "extra-hardware"
# Build overcloud host image
overcloud_dib_build_host_images: true

View File

@ -30,6 +30,12 @@
path: "{{ kayobe_config_src_dir }}/etc/kayobe/kolla/config/bifrost" path: "{{ kayobe_config_src_dir }}/etc/kayobe/kolla/config/bifrost"
state: "directory" state: "directory"
# NOTE(mgoddard): Use dib.yml, since it takes precedence over bifrost.yml.
- name: Ensure bifrost overrides file exists
template:
src: bifrost-overrides.yml.j2
dest: "{{ kayobe_config_src_dir }}/etc/kayobe/kolla/config/bifrost/dib.yml"
- name: Ensure kayobe is installed - name: Ensure kayobe is installed
shell: shell:
cmd: dev/install.sh &> {{ logs_dir }}/ansible/install cmd: dev/install.sh &> {{ logs_dir }}/ansible/install

View File

@ -0,0 +1,4 @@
---
fixes:
- |
Fixes an issue seen when using Jinja2 3.1.0.

View File

@ -1,4 +1,5 @@
pbr>=2.0 # Apache-2.0 pbr>=2.0 # Apache-2.0
Jinja2>3 # BSD
ansible>=4,<6.0 # GPLv3 ansible>=4,<6.0 # GPLv3
cliff>=3.1.0 # Apache cliff>=3.1.0 # Apache
netaddr!=0.7.16,>=0.7.13 # BSD netaddr!=0.7.16,>=0.7.13 # BSD

View File

@ -36,7 +36,7 @@ roles:
- src: stackhpc.libvirt-vm - src: stackhpc.libvirt-vm
version: v1.14.2 version: v1.14.2
- src: stackhpc.luks - src: stackhpc.luks
version: 0.4.1 version: 0.4.2
- src: stackhpc.mellanox-switch - src: stackhpc.mellanox-switch
version: v1.0.0 version: v1.0.0
- src: stackhpc.os-images - src: stackhpc.os-images