Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion Tests/iaas/openstack_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@
from scs_0103_standard_flavors.standard_flavors import \
SCS_0103_CANONICAL_NAMES, compute_flavor_lookup, compute_scs_0103_flavor
from scs_0104_standard_images.standard_images import \
SCS_0104_IMAGE_SPECS, compute_scs_0104_source, compute_scs_0104_image
SCS_0104_IMAGE_SPECS, compute_scs_0104_source, compute_scs_0104_image, \
compute_image_lookup_ex, compute_scs_0104_source_ex, compute_scs_0104_source_capi, \
compute_scs_0104_image_ubuntu_latest
from scs_0114_volume_types.volume_types import \
compute_volume_type_lookup, compute_scs_0114_syntax_check, compute_scs_0114_aspect_type
from scs_0115_security_groups.security_groups import \
Expand Down Expand Up @@ -106,17 +108,22 @@ def make_container(cloud):
lambda c, cn=canonical_name: compute_scs_0103_flavor(c.flavor_lookup, compute_flavor_spec(cn))
)
# scs_0104_standard_images
c.add_function('image_lookup_ex', lambda c: compute_image_lookup_ex(c.images))
c.add_function('scs_0104_source_capi', lambda c: compute_scs_0104_source_capi(c.image_lookup))
c.add_function('scs_0104_source_capi_1', lambda c: compute_scs_0104_source(c.image_lookup, SCS_0104_IMAGE_SPECS['ubuntu-capi-image-1']))
c.add_function('scs_0104_source_capi_2', lambda c: compute_scs_0104_source(c.image_lookup, SCS_0104_IMAGE_SPECS['ubuntu-capi-image-2']))
c.add_function('scs_0104_source_ubuntu', lambda c: compute_scs_0104_source_ex(c.image_lookup_ex, 'ubuntu'))
c.add_function('scs_0104_source_ubuntu_2404', lambda c: compute_scs_0104_source(c.image_lookup, SCS_0104_IMAGE_SPECS['Ubuntu 24.04']))
c.add_function('scs_0104_source_ubuntu_2204', lambda c: compute_scs_0104_source(c.image_lookup, SCS_0104_IMAGE_SPECS['Ubuntu 22.04']))
c.add_function('scs_0104_source_ubuntu_2004', lambda c: compute_scs_0104_source(c.image_lookup, SCS_0104_IMAGE_SPECS['Ubuntu 20.04']))
c.add_function('scs_0104_source_debian', lambda c: compute_scs_0104_source_ex(c.image_lookup_ex, 'debian'))
c.add_function('scs_0104_source_debian_13', lambda c: compute_scs_0104_source(c.image_lookup, SCS_0104_IMAGE_SPECS['Debian 13']))
c.add_function('scs_0104_source_debian_12', lambda c: compute_scs_0104_source(c.image_lookup, SCS_0104_IMAGE_SPECS['Debian 12']))
c.add_function('scs_0104_source_debian_11', lambda c: compute_scs_0104_source(c.image_lookup, SCS_0104_IMAGE_SPECS['Debian 11']))
c.add_function('scs_0104_source_debian_10', lambda c: compute_scs_0104_source(c.image_lookup, SCS_0104_IMAGE_SPECS['Debian 10']))
c.add_function('scs_0104_image_capi_1', lambda c: compute_scs_0104_image(c.image_lookup, SCS_0104_IMAGE_SPECS['ubuntu-capi-image-1']))
c.add_function('scs_0104_image_capi_2', lambda c: compute_scs_0104_image(c.image_lookup, SCS_0104_IMAGE_SPECS['ubuntu-capi-image-2']))
c.add_function('scs_0104_image_ubuntu_latest', lambda c: compute_scs_0104_image_ubuntu_latest(c.image_lookup_ex))
c.add_function('scs_0104_image_ubuntu_2404', lambda c: compute_scs_0104_image(c.image_lookup, SCS_0104_IMAGE_SPECS['Ubuntu 24.04']))
c.add_function('scs_0104_image_ubuntu_2204', lambda c: compute_scs_0104_image(c.image_lookup, SCS_0104_IMAGE_SPECS['Ubuntu 22.04']))
c.add_function('scs_0104_image_ubuntu_2004', lambda c: compute_scs_0104_image(c.image_lookup, SCS_0104_IMAGE_SPECS['Ubuntu 20.04']))
Expand Down
78 changes: 77 additions & 1 deletion Tests/iaas/scs_0104_standard_images/standard_images.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from collections import defaultdict
from datetime import date
import logging
import re

Expand Down Expand Up @@ -53,6 +55,18 @@
""")
SCS_0104_IMAGE_SPECS = {key: {'name': key, **val} for key, val in _specs.items()}

IMAGE_SOURCES = {
'debian': ['https://cloud.debian.org/images/cloud/', 'https://cdimage.debian.org/cdimage/cloud/'],
'ubuntu': ['https://cloud-images.ubuntu.com/'],
}
CAPI_RE = re.compile(r"ubuntu-capi-image( |-)v[0-9]\.[0-9]+(\.[0-9]+)?")
CAPI_SOURCES = [
'https://nbg1.your-objectstorage.com/osism/openstack-k8s-capi-images/',
'https://swift.services.a.regiocloud.tech/swift/v1/AUTH_b182637428444b9aa302bb8d5a5a418c/openstack-k8s-capi-images/',
]
CAPI_PURPOSE = 'k8snode'
CAPI_DESC = 'https://github.com/osism/k8s-capi-images'


def _lookup_images(image_lookup, image_spec):
name_scheme = image_spec.get('name_scheme')
Expand All @@ -65,17 +79,32 @@ def _lookup_images(image_lookup, image_spec):
return [img]


def compute_image_lookup_ex(images):
"""Compute image lookup via os_distro, for all images with os_purpose=generic"""
lookup = defaultdict(list)
for img in images:
if not img.os_distro:
continue
if img.properties.get('os_purpose', '') != 'generic':
continue
lookup[img.os_distro].append(img)
return lookup


def compute_scs_0104_source(image_lookup, image_spec):
"""
This test ensures that every image matching `image_spec` has the correct `image_source`.

For an impression of what these specs look like, refer to `SCS_0104_IMAGE_SPECS`.
"""
matches = _lookup_images(image_lookup, image_spec)
return _check_image_source(matches, image_spec['source'])


def _check_image_source(matches, sources):
errors = 0
for image in matches:
img_source = image.properties.get('image_source', '')
sources = image_spec['source']
if not isinstance(sources, (tuple, list)):
sources = [sources]
if not any(img_source.startswith(src) for src in sources):
Expand All @@ -84,6 +113,32 @@ def compute_scs_0104_source(image_lookup, image_spec):
return not errors


def compute_scs_0104_source_ex(image_lookup_ex, os_distro):
matches = image_lookup_ex.get(os_distro, ())
logger.debug(f"matches for {os_distro!r}: {', '.join([match.name for match in matches]) or 'none'}")
return _check_image_source(matches, IMAGE_SOURCES[os_distro])


def compute_scs_0104_source_capi(
image_lookup, rex=CAPI_RE, sources=CAPI_SOURCES, purpose=CAPI_PURPOSE, desc=CAPI_DESC,
):
matches = [img for name, img in image_lookup.items() if rex.match(name)]
logger.debug(f"matches for CAPI: {', '.join([match.name for match in matches]) or '(none)'}")
errors = 0
if not _check_image_source(matches, sources):
errors += 1
for img in matches:
actual = img.properties.get('os_purpose', '(not set)')
if actual != purpose:
errors += 1
logger.error(f"Image {img.name!r} should have os_purpose {purpose!r}, has {actual!r}")
actual = img.properties.get('image_description', '(not set)')
if actual != desc:
errors += 1
logger.error(f"Image {img.name!r} should have image_description {desc!r}, has {actual!r}")
return not errors


def compute_scs_0104_image(image_lookup, image_spec):
"""
This test ensures that a certain image is present, as specified by `image_spec`.
Expand All @@ -95,3 +150,24 @@ def compute_scs_0104_image(image_lookup, image_spec):
logger.error(f"Missing image '{image_spec['name']}'")
return False
return True


def compute_scs_0104_image_ubuntu_latest(image_lookup_ex, os_distro='ubuntu'):
"""
This test ensures that current Ubuntu LTS is present.
"""
today = date.today()
acceptable_year = today.year - today.year % 1
acceptable = [f'{acceptable_year % 100:2d}.04']
if date.year == acceptable_year and today.month <= 4:
acceptable.append(f'{acceptable_year % 100 - 2}.04')
matches = [
image
for image in image_lookup_ex.get(os_distro, ())
if image.os_version in acceptable
]
logger.debug(f"matches for current {os_distro!r} LTS: {', '.join([match.name for match in matches]) or '(none)'}")
if not matches:
logger.error(f"Missing generic {os_distro} image with os_version in {acceptable!r}")
return False
return True
25 changes: 22 additions & 3 deletions Tests/scs-compatible-iaas.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -185,12 +185,18 @@ scripts:
- id: scs-0103-flavor-16v-128
description: Check presence of flavor `SCS-16V-128`.
url: https://docs.scs.community/standards/scs-0103-w1-standard-flavors-implementation#automated-tests
- id: scs-0104-source-capi
description: CAPI images adhere to canonical image source, os_purpose and image_description.
url: https://docs.scs.community/standards/scs-0104-w1-standard-images-implementation#automated-tests
- id: scs-0104-source-capi-1
description: CAPI images adhere to canonical image source.
url: https://docs.scs.community/standards/scs-0104-w1-standard-images-implementation#automated-tests
- id: scs-0104-source-capi-2
description: CAPI images adhere to canonical image source.
url: https://docs.scs.community/standards/scs-0104-w1-standard-images-implementation#automated-tests
- id: scs-0104-source-ubuntu
description: Ubuntu images adhere to canonical image source.
url: https://docs.scs.community/standards/scs-0104-w1-standard-images-implementation#automated-tests
- id: scs-0104-source-ubuntu-2404
description: Ubuntu 24.04 images adhere to canonical image source.
url: https://docs.scs.community/standards/scs-0104-w1-standard-images-implementation#automated-tests
Expand All @@ -200,6 +206,9 @@ scripts:
- id: scs-0104-source-ubuntu-2004
description: Ubuntu 20.04 images adhere to canonical image source.
url: https://docs.scs.community/standards/scs-0104-w1-standard-images-implementation#automated-tests
- id: scs-0104-source-debian
description: Debian images adhere to canonical image source.
url: https://docs.scs.community/standards/scs-0104-w1-standard-images-implementation#automated-tests
- id: scs-0104-source-debian-13
description: Debian 13 images adhere to canonical image source.
url: https://docs.scs.community/standards/scs-0104-w1-standard-images-implementation#automated-tests
Expand All @@ -215,6 +224,9 @@ scripts:
- id: scs-0104-image-capi-1
description: CAPI image is present (naming scheme v1).
url: https://docs.scs.community/standards/scs-0104-w1-standard-images-implementation#automated-tests
- id: scs-0104-image-ubuntu-latest
description: Current Ubuntu LTS image is present.
url: https://docs.scs.community/standards/scs-0104-w1-standard-images-implementation#automated-tests
- id: scs-0104-image-ubuntu-2404
description: Ubuntu 24.04 image is present (by name).
url: https://docs.scs.community/standards/scs-0104-w1-standard-images-implementation#automated-tests
Expand Down Expand Up @@ -458,6 +470,15 @@ modules:
recommended:
- scs-0104-image-capi-2
- scs-0104-image-debian-12
- id: scs-0104-v2
name: Standard images
url: https://docs.scs.community/standards/scs-0104-v2-standard-images
targets:
main:
- scs-0104-source-capi
- scs-0104-source-ubuntu
- scs-0104-source-debian
- scs-0104-image-ubuntu-latest
- id: scs-0114-v1
name: Volume Types
url: https://docs.scs.community/standards/scs-0114-v1-volume-type-standard
Expand Down Expand Up @@ -580,9 +601,7 @@ versions:
- scs-0101-v1
- scs-0102-v2 # instead of scs-0102-v1
- scs-0103-v1
- ref: scs-0104-v1-2
parameters:
image_spec: https://raw.githubusercontent.com/SovereignCloudStack/standards/main/Tests/iaas/scs-0104-v1-images-v5.yaml
- scs-0104-v2 # instead of scs-0104-v1
- scs-0114-v1
- scs-0115-v1
- scs-0116-v1
Expand Down
Loading