Add Kinetic and Zed support

* sync charm-helpers to classic charms
* change openstack-origin/source default to zed
* align testing with zed
* add new zed bundles
* add zed bundles to tests.yaml
* add zed tests to osci.yaml and .zuul.yaml
* update build-on and run-on bases
* add bindep.txt for py310
* sync tox.ini and requirements.txt for ruamel
* use charmcraft_channel 2.0/stable
* drop reactive plugin overrides
* move interface/layer env vars to charmcraft.yaml
* enable qos service plugin for neutron-api to ensure
  migrate-ovn-db action is successful

Change-Id: I6f94ff3e557413b6096493f839c0a5f217c017d3
Closes-Bug: #1988089
This commit is contained in:
Corey Bryant 2022-06-10 20:14:48 +00:00 committed by Alex Kavanagh
parent c5645ea0b9
commit 9a0e63964a
21 changed files with 140 additions and 408 deletions

View File

@ -1,4 +1,4 @@
- project: - project:
templates: templates:
- openstack-python3-charm-yoga-jobs - openstack-python3-charm-zed-jobs
- openstack-cover-jobs - openstack-cover-jobs

3
bindep.txt Normal file
View File

@ -0,0 +1,3 @@
libffi-dev [platform:dpkg]
libxml2-dev [platform:dpkg]
libxslt1-dev [platform:dpkg]

View File

@ -23,13 +23,13 @@ parts:
bases: bases:
- build-on: - build-on:
- name: ubuntu - name: ubuntu
channel: "20.04" channel: "22.04"
architectures: architectures:
- amd64 - amd64
run-on: run-on:
- name: ubuntu
channel: "20.04"
architectures: [amd64, s390x, ppc64el, arm64]
- name: ubuntu - name: ubuntu
channel: "22.04" channel: "22.04"
architectures: [amd64, s390x, ppc64el, arm64] architectures: [amd64, s390x, ppc64el, arm64]
- name: ubuntu
channel: "22.10"
architectures: [amd64, s390x, ppc64el, arm64]

View File

@ -467,7 +467,7 @@ def ns_query(address):
try: try:
answers = dns.resolver.query(address, rtype) answers = dns.resolver.query(address, rtype)
except dns.resolver.NXDOMAIN: except (dns.resolver.NXDOMAIN, dns.resolver.NoNameservers):
return None return None
if answers: if answers:

View File

@ -2560,14 +2560,18 @@ class OVSDPDKDeviceContext(OSContextGenerator):
:rtype: List[int] :rtype: List[int]
""" """
cores = [] cores = []
ranges = cpulist.split(',') if cpulist and re.match(r"^[0-9,\-^]*$", cpulist):
for cpu_range in ranges: ranges = cpulist.split(',')
if "-" in cpu_range: for cpu_range in ranges:
cpu_min_max = cpu_range.split('-') if "-" in cpu_range:
cores += range(int(cpu_min_max[0]), cpu_min_max = cpu_range.split('-')
int(cpu_min_max[1]) + 1) cores += range(int(cpu_min_max[0]),
else: int(cpu_min_max[1]) + 1)
cores.append(int(cpu_range)) elif "^" in cpu_range:
cpu_rm = cpu_range.split('^')
cores.remove(int(cpu_rm[1]))
else:
cores.append(int(cpu_range))
return cores return cores
def _numa_node_cores(self): def _numa_node_cores(self):
@ -2586,36 +2590,32 @@ class OVSDPDKDeviceContext(OSContextGenerator):
def cpu_mask(self): def cpu_mask(self):
"""Get hex formatted CPU mask """Get hex formatted CPU mask
The mask is based on using the first config:dpdk-socket-cores The mask is based on using the first config:dpdk-socket-cores
cores of each NUMA node in the unit. cores of each NUMA node in the unit.
:returns: hex formatted CPU mask :returns: hex formatted CPU mask
:rtype: str :rtype: str
""" """
return self.cpu_masks()['dpdk_lcore_mask'] num_cores = config('dpdk-socket-cores')
mask = 0
def cpu_masks(self):
"""Get hex formatted CPU masks
The mask is based on using the first config:dpdk-socket-cores
cores of each NUMA node in the unit, followed by the
next config:pmd-socket-cores
:returns: Dict of hex formatted CPU masks
:rtype: Dict[str, str]
"""
num_lcores = config('dpdk-socket-cores')
pmd_cores = config('pmd-socket-cores')
lcore_mask = 0
pmd_mask = 0
for cores in self._numa_node_cores().values(): for cores in self._numa_node_cores().values():
for core in cores[:num_lcores]: for core in cores[:num_cores]:
lcore_mask = lcore_mask | 1 << core mask = mask | 1 << core
for core in cores[num_lcores:][:pmd_cores]: return format(mask, '#04x')
pmd_mask = pmd_mask | 1 << core
return { @classmethod
'pmd_cpu_mask': format(pmd_mask, '#04x'), def pmd_cpu_mask(cls):
'dpdk_lcore_mask': format(lcore_mask, '#04x')} """Get hex formatted pmd CPU mask
The mask is based on config:pmd-cpu-set.
:returns: hex formatted CPU mask
:rtype: str
"""
mask = 0
cpu_list = cls._parse_cpu_list(config('pmd-cpu-set'))
if cpu_list:
for core in cpu_list:
mask = mask | 1 << core
return format(mask, '#x')
def socket_memory(self): def socket_memory(self):
"""Formatted list of socket memory configuration per socket. """Formatted list of socket memory configuration per socket.
@ -2694,6 +2694,7 @@ class OVSDPDKDeviceContext(OSContextGenerator):
ctxt['device_whitelist'] = self.device_whitelist() ctxt['device_whitelist'] = self.device_whitelist()
ctxt['socket_memory'] = self.socket_memory() ctxt['socket_memory'] = self.socket_memory()
ctxt['cpu_mask'] = self.cpu_mask() ctxt['cpu_mask'] = self.cpu_mask()
ctxt['pmd_cpu_mask'] = self.pmd_cpu_mask()
return ctxt return ctxt

View File

@ -158,6 +158,7 @@ OPENSTACK_CODENAMES = OrderedDict([
('2021.1', 'wallaby'), ('2021.1', 'wallaby'),
('2021.2', 'xena'), ('2021.2', 'xena'),
('2022.1', 'yoga'), ('2022.1', 'yoga'),
('2022.2', 'zed'),
]) ])
# The ugly duckling - must list releases oldest to newest # The ugly duckling - must list releases oldest to newest
@ -400,13 +401,16 @@ def get_os_codename_version(vers):
error_out(e) error_out(e)
def get_os_version_codename(codename, version_map=OPENSTACK_CODENAMES): def get_os_version_codename(codename, version_map=OPENSTACK_CODENAMES,
raise_exception=False):
'''Determine OpenStack version number from codename.''' '''Determine OpenStack version number from codename.'''
for k, v in version_map.items(): for k, v in version_map.items():
if v == codename: if v == codename:
return k return k
e = 'Could not derive OpenStack version for '\ e = 'Could not derive OpenStack version for '\
'codename: %s' % codename 'codename: %s' % codename
if raise_exception:
raise ValueError(str(e))
error_out(e) error_out(e)

View File

@ -277,7 +277,7 @@ def service_resume(service_name, init_dir="/etc/init",
return started return started
def service(action, service_name, **kwargs): def service(action, service_name=None, **kwargs):
"""Control a system service. """Control a system service.
:param action: the action to take on the service :param action: the action to take on the service
@ -286,7 +286,9 @@ def service(action, service_name, **kwargs):
the form of key=value. the form of key=value.
""" """
if init_is_systemd(service_name=service_name): if init_is_systemd(service_name=service_name):
cmd = ['systemctl', action, service_name] cmd = ['systemctl', action]
if service_name is not None:
cmd.append(service_name)
else: else:
cmd = ['service', service_name, action] cmd = ['service', service_name, action]
for key, value in kwargs.items(): for key, value in kwargs.items():

View File

@ -30,6 +30,7 @@ UBUNTU_RELEASES = (
'hirsute', 'hirsute',
'impish', 'impish',
'jammy', 'jammy',
'kinetic',
) )

View File

@ -15,7 +15,8 @@
import os import os
import json import json
import inspect import inspect
from collections import Iterable, OrderedDict from collections import OrderedDict
from collections.abc import Iterable
from charmhelpers.core import host from charmhelpers.core import host
from charmhelpers.core import hookenv from charmhelpers.core import hookenv

View File

@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import contextlib
import os import os
import hashlib import hashlib
import re import re
@ -24,11 +25,15 @@ from charmhelpers.payload.archive import (
get_archive_handler, get_archive_handler,
extract, extract,
) )
from charmhelpers.core.hookenv import (
env_proxy_settings,
)
from charmhelpers.core.host import mkdir, check_hash from charmhelpers.core.host import mkdir, check_hash
from urllib.request import ( from urllib.request import (
build_opener, install_opener, urlopen, urlretrieve, build_opener, install_opener, urlopen, urlretrieve,
HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler,
ProxyHandler
) )
from urllib.parse import urlparse, urlunparse, parse_qs from urllib.parse import urlparse, urlunparse, parse_qs
from urllib.error import URLError from urllib.error import URLError
@ -50,6 +55,20 @@ def splitpasswd(user):
return user, None return user, None
@contextlib.contextmanager
def proxy_env():
"""
Creates a context which temporarily modifies the proxy settings in os.environ.
"""
restore = {**os.environ} # Copy the current os.environ
juju_proxies = env_proxy_settings() or {}
os.environ.update(**juju_proxies) # Insert or Update the os.environ
yield os.environ
for key in juju_proxies:
del os.environ[key] # remove any keys which were added or updated
os.environ.update(**restore) # restore any original values
class ArchiveUrlFetchHandler(BaseFetchHandler): class ArchiveUrlFetchHandler(BaseFetchHandler):
""" """
Handler to download archive files from arbitrary URLs. Handler to download archive files from arbitrary URLs.
@ -80,6 +99,7 @@ class ArchiveUrlFetchHandler(BaseFetchHandler):
# propagate all exceptions # propagate all exceptions
# URLError, OSError, etc # URLError, OSError, etc
proto, netloc, path, params, query, fragment = urlparse(source) proto, netloc, path, params, query, fragment = urlparse(source)
handlers = []
if proto in ('http', 'https'): if proto in ('http', 'https'):
auth, barehost = splituser(netloc) auth, barehost = splituser(netloc)
if auth is not None: if auth is not None:
@ -89,10 +109,13 @@ class ArchiveUrlFetchHandler(BaseFetchHandler):
# Realm is set to None in add_password to force the username and password # Realm is set to None in add_password to force the username and password
# to be used whatever the realm # to be used whatever the realm
passman.add_password(None, source, username, password) passman.add_password(None, source, username, password)
authhandler = HTTPBasicAuthHandler(passman) handlers.append(HTTPBasicAuthHandler(passman))
opener = build_opener(authhandler)
install_opener(opener) with proxy_env():
response = urlopen(source) handlers.append(ProxyHandler())
opener = build_opener(*handlers)
install_opener(opener)
response = urlopen(source)
try: try:
with open(dest, 'wb') as dest_file: with open(dest, 'wb') as dest_file:
dest_file.write(response.read()) dest_file.write(response.read())

View File

@ -222,6 +222,14 @@ CLOUD_ARCHIVE_POCKETS = {
'yoga/proposed': 'focal-proposed/yoga', 'yoga/proposed': 'focal-proposed/yoga',
'focal-yoga/proposed': 'focal-proposed/yoga', 'focal-yoga/proposed': 'focal-proposed/yoga',
'focal-proposed/yoga': 'focal-proposed/yoga', 'focal-proposed/yoga': 'focal-proposed/yoga',
# Zed
'zed': 'jammy-updates/zed',
'jammy-zed': 'jammy-updates/zed',
'jammy-zed/updates': 'jammy-updates/zed',
'jammy-updates/zed': 'jammy-updates/zed',
'zed/proposed': 'jammy-proposed/zed',
'jammy-zed/proposed': 'jammy-proposed/zed',
'jammy-proposed/zed': 'jammy-proposed/zed',
} }
@ -248,6 +256,7 @@ OPENSTACK_RELEASES = (
'wallaby', 'wallaby',
'xena', 'xena',
'yoga', 'yoga',
'zed',
) )
@ -274,6 +283,7 @@ UBUNTU_OPENSTACK_RELEASE = OrderedDict([
('hirsute', 'wallaby'), ('hirsute', 'wallaby'),
('impish', 'xena'), ('impish', 'xena'),
('jammy', 'yoga'), ('jammy', 'yoga'),
('kinetic', 'zed'),
]) ])

View File

@ -17,8 +17,8 @@ description: |
tags: tags:
- openstack - openstack
series: series:
- focal
- jammy - jammy
- kinetic
extra-bindings: extra-bindings:
data: data:
provides: provides:

View File

@ -1,52 +1,9 @@
- project: - project:
templates: templates:
- charm-unit-jobs-py38
- charm-unit-jobs-py310 - charm-unit-jobs-py310
check: - charm-zed-functional-jobs
jobs:
# migrate-ovn tests fail on wallaby and above due to:
# https://bugs.launchpad.net/charm-neutron-openvswitch/+bug/1951856
- migrate-ovn-focal-xena-dvr-snat
- migrate-ovn-impish-xena-dvr-snat:
voting: false
- migrate-ovn-focal-yoga-dvr-snat:
voting: false
- migrate-ovn-jammy-yoga-dvr-snat:
voting: false
vars: vars:
needs_charm_build: true needs_charm_build: true
charm_build_name: neutron-openvswitch charm_build_name: neutron-openvswitch
build_type: charmcraft build_type: charmcraft
charmcraft_channel: 2.0/stable
- job:
name: migrate-ovn-focal-xena-dvr-snat
parent: func-target
dependencies:
- charm-build
- osci-lint
- tox-py38
- name: tox-py310
soft: true
vars:
tox_extra_args: migrate-ovn:focal-xena-dvr-snat
- job:
name: migrate-ovn-focal-yoga-dvr-snat
parent: func-target
dependencies:
- migrate-ovn-focal-xena-dvr-snat
vars:
tox_extra_args: migrate-ovn:focal-yoga-dvr-snat
- job:
name: migrate-ovn-impish-xena-dvr-snat
parent: func-target
dependencies:
- migrate-ovn-focal-xena-dvr-snat
vars:
tox_extra_args: migrate-ovn:impish-xena-dvr-snat
- job:
name: migrate-ovn-jammy-yoga-dvr-snat
parent: func-target
dependencies:
- migrate-ovn-focal-xena-dvr-snat
vars:
tox_extra_args: migrate-ovn:jammy-yoga-dvr-snat

View File

@ -11,9 +11,6 @@ pbr==5.6.0
simplejson>=2.2.0 simplejson>=2.2.0
netifaces>=0.10.4 netifaces>=0.10.4
# Build requirements
cffi==1.14.6; python_version < '3.6' # cffi 1.15.0 drops support for py35.
# NOTE: newer versions of cryptography require a Rust compiler to build, # NOTE: newer versions of cryptography require a Rust compiler to build,
# see # see
# * https://github.com/openstack-charmers/zaza/issues/421 # * https://github.com/openstack-charmers/zaza/issues/421
@ -27,8 +24,6 @@ netaddr>0.7.16,<0.8.0
Jinja2>=2.6 # BSD License (3 clause) Jinja2>=2.6 # BSD License (3 clause)
six>=1.9.0 six>=1.9.0
# dnspython 2.0.0 dropped py3.5 support dnspython
dnspython<2.0.0; python_version < '3.6'
dnspython; python_version >= '3.6'
psutil>=1.1.1,<2.0.0 psutil>=1.1.1,<2.0.0

View File

@ -8,7 +8,6 @@
# all of its own requirements and if it doesn't, fix it there. # all of its own requirements and if it doesn't, fix it there.
# #
pyparsing<3.0.0 # aodhclient is pinned in zaza and needs pyparsing < 3.0.0, but cffi also needs it, so pin here. pyparsing<3.0.0 # aodhclient is pinned in zaza and needs pyparsing < 3.0.0, but cffi also needs it, so pin here.
cffi==1.14.6; python_version < '3.6' # cffi 1.15.0 drops support for py35.
setuptools<50.0.0 # https://github.com/pypa/setuptools/commit/04e3df22df840c6bb244e9b27bc56750c44b7c85 setuptools<50.0.0 # https://github.com/pypa/setuptools/commit/04e3df22df840c6bb244e9b27bc56750c44b7c85
requests>=2.18.4 requests>=2.18.4
@ -19,25 +18,12 @@ stestr>=2.2.0
# https://github.com/mtreinish/stestr/issues/145 # https://github.com/mtreinish/stestr/issues/145
cliff<3.0.0 cliff<3.0.0
# Dependencies of stestr. Newer versions use keywords that didn't exist in
# python 3.5 yet (e.g. "ModuleNotFoundError")
importlib-metadata<3.0.0; python_version < '3.6'
importlib-resources<3.0.0; python_version < '3.6'
# Some Zuul nodes sometimes pull newer versions of these dependencies which
# dropped support for python 3.5:
osprofiler<2.7.0;python_version<'3.6'
stevedore<1.31.0;python_version<'3.6'
debtcollector<1.22.0;python_version<'3.6'
oslo.utils<=3.41.0;python_version<'3.6'
coverage>=4.5.2 coverage>=4.5.2
pyudev # for ceph-* charm unit tests (need to fix the ceph-* charm unit tests/mocking) pyudev # for ceph-* charm unit tests (need to fix the ceph-* charm unit tests/mocking)
git+https://github.com/openstack-charmers/zaza.git#egg=zaza git+https://github.com/openstack-charmers/zaza.git#egg=zaza
git+https://github.com/openstack-charmers/zaza-openstack-tests.git#egg=zaza.openstack git+https://github.com/openstack-charmers/zaza-openstack-tests.git#egg=zaza.openstack
# Needed for charm-glance: # Needed for charm-glance:
git+https://opendev.org/openstack/tempest.git#egg=tempest;python_version>='3.6' git+https://opendev.org/openstack/tempest.git#egg=tempest
tempest<24.0.0;python_version<'3.6'
croniter # needed for charm-rabbitmq-server unit tests croniter # needed for charm-rabbitmq-server unit tests

View File

@ -1,223 +0,0 @@
variables:
openstack-origin: &openstack-origin cloud:focal-yoga
series: &series focal
machines:
0:
constraints: "mem=3072M"
1:
constraints: "mem=3072M"
2:
constraints: "mem=3072M"
3: {}
4: {}
5: {}
6: {}
7: {}
8:
constraints: "root-disk=20G mem=4G"
9:
constraints: "root-disk=20G mem=4G"
10: {}
11: {}
12: {}
# We specify machine placements for these to improve iteration
# time, given that machine "0" comes up way before machine "7"
applications:
keystone-mysql-router:
charm: ch:mysql-router
channel: latest/edge
nova-mysql-router:
charm: ch:mysql-router
channel: latest/edge
glance-mysql-router:
charm: ch:mysql-router
channel: latest/edge
neutron-mysql-router:
charm: ch:mysql-router
channel: latest/edge
placement-mysql-router:
charm: ch:mysql-router
channel: latest/edge
vault-mysql-router:
charm: ch:mysql-router
channel: latest/edge
mysql-innodb-cluster:
charm: ch:mysql-innodb-cluster
num_units: 3
options:
source: *openstack-origin
to:
- '0'
- '1'
- '2'
channel: latest/edge
rabbitmq-server:
charm: ch:rabbitmq-server
num_units: 1
options:
source: *openstack-origin
to:
- '3'
channel: latest/edge
neutron-api:
charm: ch:neutron-api
series: *series
num_units: 1
options:
manage-neutron-plugin-legacy-mode: true
overlay-network-type: 'vxlan'
l2-population: True
flat-network-providers: physnet1
neutron-security-groups: true
openstack-origin: *openstack-origin
enable-dvr: True
to:
- '4'
channel: yoga/edge
keystone:
charm: ch:keystone
num_units: 1
options:
openstack-origin: *openstack-origin
to:
- '5'
channel: yoga/edge
glance:
charm: ch:glance
num_units: 1
options:
openstack-origin: *openstack-origin
to:
- '6'
channel: yoga/edge
neutron-openvswitch:
charm: ../../neutron-openvswitch.charm
options:
use-dvr-snat: True
bridge-mappings: physnet1:br-ex
enable-local-dhcp-and-metadata: True
nova-cloud-controller:
charm: ch:nova-cloud-controller
num_units: 1
options:
network-manager: Neutron
openstack-origin: *openstack-origin
to:
- '7'
channel: yoga/edge
nova-compute:
charm: ch:nova-compute
num_units: 2
options:
config-flags: default_ephemeral_format=ext4
enable-live-migration: true
enable-resize: true
migration-auth-type: ssh
openstack-origin: *openstack-origin
to:
- '8'
- '9'
channel: yoga/edge
placement:
charm: ch:placement
num_units: 1
options:
openstack-origin: *openstack-origin
to:
- '10'
channel: yoga/edge
vault-mysql-router:
charm: ch:mysql-router
channel: latest/edge
vault:
charm: ch:vault
num_units: 1
to:
- '11'
channel: latest/edge
ovn-central:
charm: ch:ovn-central
num_units: 3
options:
source: *openstack-origin
to:
- '12'
channel: latest/edge
neutron-api-plugin-ovn:
charm: ch:neutron-api-plugin-ovn
channel: yoga/edge
ovn-chassis:
charm: ch:ovn-chassis
options:
# start new units paused to allow unit by unit OVS to OVN migration
new-units-paused: true
channel: latest/edge
relations:
- - 'neutron-api:amqp'
- 'rabbitmq-server:amqp'
- - 'neutron-api:neutron-api'
- 'nova-cloud-controller:neutron-api'
- - 'neutron-api:identity-service'
- 'keystone:identity-service'
- - 'nova-compute:neutron-plugin'
- 'neutron-openvswitch:neutron-plugin'
- - 'neutron-api:neutron-plugin-api'
- 'neutron-openvswitch:neutron-plugin-api'
- - 'nova-cloud-controller:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-compute:amqp'
- 'rabbitmq-server:amqp'
- - 'neutron-openvswitch:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-cloud-controller:identity-service'
- 'keystone:identity-service'
- - 'nova-cloud-controller:cloud-compute'
- 'nova-compute:cloud-compute'
- - 'glance:identity-service'
- 'keystone:identity-service'
- - 'glance:amqp'
- 'rabbitmq-server:amqp'
- - 'nova-compute:image-service'
- 'glance:image-service'
- - 'nova-cloud-controller:image-service'
- 'glance:image-service'
- - 'placement:identity-service'
- 'keystone:identity-service'
- - 'placement:placement'
- 'nova-cloud-controller:placement'
- ["keystone:shared-db", "keystone-mysql-router:shared-db"]
- ["glance:shared-db", "glance-mysql-router:shared-db"]
- ["nova-cloud-controller:shared-db", "nova-mysql-router:shared-db"]
- ["neutron-api:shared-db", "neutron-mysql-router:shared-db"]
- ["placement:shared-db", "placement-mysql-router:shared-db"]
- ["keystone-mysql-router:db-router", "mysql-innodb-cluster:db-router"]
- ["nova-mysql-router:db-router", "mysql-innodb-cluster:db-router"]
- ["glance-mysql-router:db-router", "mysql-innodb-cluster:db-router"]
- ["neutron-mysql-router:db-router", "mysql-innodb-cluster:db-router"]
- ["placement-mysql-router:db-router", "mysql-innodb-cluster:db-router"]
# We need to defer the addition of the neutron-api-plugin-ovn subordinate
# relation to the functional test as the test will first validate the legacy
# Neutron ML2+OVS topology, migrate it to OVN and then confirm connectivity
# post migration.
#
# - - neutron-api-plugin-ovn:neutron-plugin
# - neutron-api:neutron-plugin-api-subordinate
- - ovn-central:certificates
- vault:certificates
- - ovn-central:ovsdb-cms
- neutron-api-plugin-ovn:ovsdb-cms
- - ovn-chassis:nova-compute
- nova-compute:neutron-plugin
- - ovn-chassis:certificates
- vault:certificates
- - ovn-chassis:ovsdb
- ovn-central:ovsdb
- - vault:certificates
- neutron-api-plugin-ovn:certificates
- - vault:shared-db
- vault-mysql-router:shared-db
- - vault-mysql-router:db-router
- mysql-innodb-cluster:db-router

View File

@ -74,9 +74,10 @@ applications:
neutron-security-groups: true neutron-security-groups: true
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
enable-dvr: True enable-dvr: True
enable-qos: True
to: to:
- '4' - '4'
channel: yoga/edge channel: latest/edge
keystone: keystone:
charm: ch:keystone charm: ch:keystone
num_units: 1 num_units: 1
@ -84,7 +85,7 @@ applications:
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
to: to:
- '5' - '5'
channel: yoga/edge channel: latest/edge
glance: glance:
charm: ch:glance charm: ch:glance
num_units: 1 num_units: 1
@ -92,7 +93,7 @@ applications:
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
to: to:
- '6' - '6'
channel: yoga/edge channel: latest/edge
neutron-openvswitch: neutron-openvswitch:
charm: ../../neutron-openvswitch.charm charm: ../../neutron-openvswitch.charm
options: options:
@ -107,7 +108,7 @@ applications:
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
to: to:
- '7' - '7'
channel: yoga/edge channel: latest/edge
nova-compute: nova-compute:
charm: ch:nova-compute charm: ch:nova-compute
num_units: 2 num_units: 2
@ -120,7 +121,7 @@ applications:
to: to:
- '8' - '8'
- '9' - '9'
channel: yoga/edge channel: latest/edge
placement: placement:
charm: ch:placement charm: ch:placement
num_units: 1 num_units: 1
@ -128,7 +129,7 @@ applications:
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
to: to:
- '10' - '10'
channel: yoga/edge channel: latest/edge
vault-mysql-router: vault-mysql-router:
charm: ch:mysql-router charm: ch:mysql-router
channel: latest/edge channel: latest/edge
@ -148,7 +149,7 @@ applications:
channel: latest/edge channel: latest/edge
neutron-api-plugin-ovn: neutron-api-plugin-ovn:
charm: ch:neutron-api-plugin-ovn charm: ch:neutron-api-plugin-ovn
channel: yoga/edge channel: latest/edge
ovn-chassis: ovn-chassis:
charm: ch:ovn-chassis charm: ch:ovn-chassis
options: options:

View File

@ -1,7 +1,7 @@
variables: variables:
openstack-origin: &openstack-origin cloud:focal-xena openstack-origin: &openstack-origin cloud:jammy-zed
series: &series focal series: &series jammy
machines: machines:
0: 0:
@ -74,9 +74,10 @@ applications:
neutron-security-groups: true neutron-security-groups: true
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
enable-dvr: True enable-dvr: True
enable-qos: True
to: to:
- '4' - '4'
channel: yoga/edge channel: latest/edge
keystone: keystone:
charm: ch:keystone charm: ch:keystone
num_units: 1 num_units: 1
@ -84,7 +85,7 @@ applications:
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
to: to:
- '5' - '5'
channel: yoga/edge channel: latest/edge
glance: glance:
charm: ch:glance charm: ch:glance
num_units: 1 num_units: 1
@ -92,7 +93,7 @@ applications:
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
to: to:
- '6' - '6'
channel: yoga/edge channel: latest/edge
neutron-openvswitch: neutron-openvswitch:
charm: ../../neutron-openvswitch.charm charm: ../../neutron-openvswitch.charm
options: options:
@ -107,7 +108,7 @@ applications:
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
to: to:
- '7' - '7'
channel: yoga/edge channel: latest/edge
nova-compute: nova-compute:
charm: ch:nova-compute charm: ch:nova-compute
num_units: 2 num_units: 2
@ -120,7 +121,7 @@ applications:
to: to:
- '8' - '8'
- '9' - '9'
channel: yoga/edge channel: latest/edge
placement: placement:
charm: ch:placement charm: ch:placement
num_units: 1 num_units: 1
@ -128,7 +129,7 @@ applications:
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
to: to:
- '10' - '10'
channel: yoga/edge channel: latest/edge
vault-mysql-router: vault-mysql-router:
charm: ch:mysql-router charm: ch:mysql-router
channel: latest/edge channel: latest/edge
@ -148,7 +149,7 @@ applications:
channel: latest/edge channel: latest/edge
neutron-api-plugin-ovn: neutron-api-plugin-ovn:
charm: ch:neutron-api-plugin-ovn charm: ch:neutron-api-plugin-ovn
channel: yoga/edge channel: latest/edge
ovn-chassis: ovn-chassis:
charm: ch:ovn-chassis charm: ch:ovn-chassis
options: options:

View File

@ -1,7 +1,7 @@
variables: variables:
openstack-origin: &openstack-origin distro openstack-origin: &openstack-origin distro
series: &series impish series: &series kinetic
machines: machines:
0: 0:
@ -74,9 +74,10 @@ applications:
neutron-security-groups: true neutron-security-groups: true
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
enable-dvr: True enable-dvr: True
enable-qos: True
to: to:
- '4' - '4'
channel: yoga/edge channel: latest/edge
keystone: keystone:
charm: ch:keystone charm: ch:keystone
num_units: 1 num_units: 1
@ -84,7 +85,7 @@ applications:
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
to: to:
- '5' - '5'
channel: yoga/edge channel: latest/edge
glance: glance:
charm: ch:glance charm: ch:glance
num_units: 1 num_units: 1
@ -92,7 +93,7 @@ applications:
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
to: to:
- '6' - '6'
channel: yoga/edge channel: latest/edge
neutron-openvswitch: neutron-openvswitch:
charm: ../../neutron-openvswitch.charm charm: ../../neutron-openvswitch.charm
options: options:
@ -107,7 +108,7 @@ applications:
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
to: to:
- '7' - '7'
channel: yoga/edge channel: latest/edge
nova-compute: nova-compute:
charm: ch:nova-compute charm: ch:nova-compute
num_units: 2 num_units: 2
@ -120,7 +121,7 @@ applications:
to: to:
- '8' - '8'
- '9' - '9'
channel: yoga/edge channel: latest/edge
placement: placement:
charm: ch:placement charm: ch:placement
num_units: 1 num_units: 1
@ -128,7 +129,7 @@ applications:
openstack-origin: *openstack-origin openstack-origin: *openstack-origin
to: to:
- '10' - '10'
channel: yoga/edge channel: latest/edge
vault-mysql-router: vault-mysql-router:
charm: ch:mysql-router charm: ch:mysql-router
channel: latest/edge channel: latest/edge
@ -148,7 +149,7 @@ applications:
channel: latest/edge channel: latest/edge
neutron-api-plugin-ovn: neutron-api-plugin-ovn:
charm: ch:neutron-api-plugin-ovn charm: ch:neutron-api-plugin-ovn
channel: yoga/edge channel: latest/edge
ovn-chassis: ovn-chassis:
charm: ch:ovn-chassis charm: ch:ovn-chassis
options: options:

View File

@ -6,28 +6,23 @@ charm_name: neutron-openvswitch
# OVS to OVN. # OVS to OVN.
smoke_bundles: smoke_bundles:
- migrate-ovn: focal-xena-dvr-snat - jammy-yoga
gate_bundles: gate_bundles:
- migrate-ovn: focal-xena-dvr-snat - jammy-yoga
- migrate-ovn: impish-xena-dvr-snat
dev_bundles: dev_bundles:
- migrate-ovn: focal-yoga-dvr-snat - jammy-yoga
- migrate-ovn: jammy-yoga-dvr-snat - jammy-zed
- kinetic-zed
configure: configure:
- zaza.openstack.charm_tests.vault.setup.auto_initialize_no_validation
- zaza.openstack.charm_tests.glance.setup.add_lts_image - zaza.openstack.charm_tests.glance.setup.add_lts_image
- zaza.openstack.charm_tests.neutron.setup.basic_overcloud_network - zaza.openstack.charm_tests.neutron.setup.basic_overcloud_network
- zaza.openstack.charm_tests.nova.setup.create_flavors - zaza.openstack.charm_tests.nova.setup.create_flavors
- zaza.openstack.charm_tests.nova.setup.manage_ssh_key - zaza.openstack.charm_tests.nova.setup.manage_ssh_key
- migrate-ovn: - zaza.openstack.charm_tests.ovn.setup.pre_migration_configuration
- zaza.openstack.charm_tests.vault.setup.auto_initialize_no_validation
- zaza.openstack.charm_tests.glance.setup.add_lts_image
- zaza.openstack.charm_tests.neutron.setup.basic_overcloud_network
- zaza.openstack.charm_tests.nova.setup.create_flavors
- zaza.openstack.charm_tests.nova.setup.manage_ssh_key
- zaza.openstack.charm_tests.ovn.setup.pre_migration_configuration
configure_options: configure_options:
configure_gateway_ext_port_use_juju_wait: false configure_gateway_ext_port_use_juju_wait: false
@ -52,21 +47,14 @@ target_deploy_status:
tests: tests:
- zaza.openstack.charm_tests.neutron.tests.NeutronOVSDeferredRestartTest - zaza.openstack.charm_tests.neutron.tests.NeutronOVSDeferredRestartTest
- zaza.openstack.charm_tests.neutron.tests.NeutronNetworkingTest - zaza.openstack.charm_tests.neutron.tests.NeutronNetworkingTest
- zaza.openstack.charm_tests.neutron.tests.NeutronOpenvSwitchTest
- zaza.openstack.charm_tests.neutron.tests.NeutronOvsVsctlTest - zaza.openstack.charm_tests.neutron.tests.NeutronOvsVsctlTest
- zaza.openstack.charm_tests.neutron.tests.NeutronBridgePortMappingTest - zaza.openstack.charm_tests.neutron.tests.NeutronBridgePortMappingTest
- migrate-ovn: - zaza.openstack.charm_tests.ovn.tests.OVSOVNMigrationTest
- zaza.openstack.charm_tests.neutron.tests.NeutronOVSDeferredRestartTest - zaza.openstack.charm_tests.neutron.tests.NeutronNetworkingTest
- zaza.openstack.charm_tests.neutron.tests.NeutronNetworkingTest
- zaza.openstack.charm_tests.neutron.tests.NeutronOvsVsctlTest
- zaza.openstack.charm_tests.neutron.tests.NeutronBridgePortMappingTest
- zaza.openstack.charm_tests.ovn.tests.OVSOVNMigrationTest
- zaza.openstack.charm_tests.neutron.tests.NeutronNetworkingTest
tests_options: tests_options:
# NOTE: This allows us to run the NeutronNetworkingTest multiple times while # NOTE: This allows us to run the NeutronNetworkingTest multiple times while
# reusing the instances created for the first run. This both saves time and # reusing the instances created for the first run. This both saves time and
# allows verifying instances survive a SDN migration. # allows verifying instances survive a SDN migration.
zaza.openstack.charm_tests.neutron.tests.NeutronNetworkingTest.test_instances_have_networking.run_resource_cleanup: false zaza.openstack.charm_tests.neutron.tests.NeutronNetworkingTest.test_instances_have_networking.run_resource_cleanup: false
force_deploy: force_deploy:
- impish-xena-dvr-snat - kinetic-zed-dvr-snat
- jammy-yoga-dvr-snat

33
tox.ini
View File

@ -48,42 +48,23 @@ basepython = python3
deps = -r{toxinidir}/build-requirements.txt deps = -r{toxinidir}/build-requirements.txt
commands = commands =
charmcraft clean charmcraft clean
charmcraft -v build charmcraft -v pack
{toxinidir}/rename.sh {toxinidir}/rename.sh
[testenv:py310]
basepython = python3.10
deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
[testenv:py3] [testenv:py3]
basepython = python3 basepython = python3
deps = -r{toxinidir}/requirements.txt deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt -r{toxinidir}/test-requirements.txt
[testenv:py36]
basepython = python3.6
deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
commands = stestr run --slowest {posargs}
[testenv:py38]
basepython = python3.8
deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
commands = stestr run --slowest {posargs}
[testenv:py39]
basepython = python3.9
deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
commands = stestr run --slowest {posargs}
[testenv:py310]
basepython = python3.10
deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
commands = stestr run --slowest {posargs}
[testenv:pep8] [testenv:pep8]
basepython = python3 basepython = python3
deps = flake8==3.9.2 deps = flake8==3.9.2
charm-tools==2.8.3 git+https://github.com/juju/charm-tools.git
commands = flake8 {posargs} hooks unit_tests tests actions lib files commands = flake8 {posargs} hooks unit_tests tests actions lib files
charm-proof charm-proof