Skip to content

Commit 39742eb

Browse files
committed
adapt check pertaining to scs-0103-standard-flavors
Signed-off-by: Matthias Büchse <[email protected]>
1 parent 5cebb93 commit 39742eb

File tree

6 files changed

+107
-3
lines changed

6 files changed

+107
-3
lines changed

Tests/iaas/openstack_test.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
import openstack
1616

1717
from scs_0100_flavor_naming.flavor_names_check import \
18-
compute_scs_flavors, compute_scs_0100_syntax_check, compute_scs_0100_semantics_check
18+
compute_scs_flavors, compute_scs_0100_syntax_check, compute_scs_0100_semantics_check, \
19+
compute_flavor_spec
1920
from scs_0101_entropy.entropy_check import \
2021
compute_scs_0101_image_property, compute_scs_0101_flavor_property, compute_canonical_image, \
2122
compute_collected_vm_output, compute_scs_0101_entropy_avail, compute_scs_0101_rngd, \
@@ -29,6 +30,8 @@
2930
compute_scs_0102_prop_replace_frequency, compute_scs_0102_prop_provided_until, \
3031
compute_scs_0102_prop_uuid_validity, compute_scs_0102_prop_hotfix_hours, \
3132
compute_scs_0102_image_recency
33+
from scs_0103_standard_flavors.standard_flavors import \
34+
SCS_0103_CANONICAL_NAMES, compute_flavor_lookup, compute_scs_0103_flavor
3235

3336

3437
logger = logging.getLogger(__name__)
@@ -93,6 +96,22 @@ def make_container(cloud):
9396
c.scs_0102_prop_replace_frequency, c.scs_0102_prop_provided_until, c.scs_0102_prop_uuid_validity,
9497
c.scs_0102_image_recency,
9598
)))
99+
# scs_0103_standard_flavors
100+
c.add_function('flavor_lookup', lambda c: compute_flavor_lookup(c.flavors))
101+
for canonical_name in SCS_0103_CANONICAL_NAMES:
102+
nm = canonical_name.removeprefix('SCS-').lower().replace('-', '_')
103+
# NOTE we need cn=canonical_name below because anon function only catches a variable's CELL, not its value
104+
# i.e., if we use canonical_name inside it, we will only get its final value after the loop is done
105+
c.add_function(
106+
f'scs_0103_flavor_{nm}',
107+
lambda c, cn=canonical_name: compute_scs_0103_flavor(c.flavor_lookup, compute_flavor_spec(cn))
108+
)
109+
c.add_function('standard_flavors_check', lambda c: all((
110+
c.scs_0103_flavor_1v_4, c.scs_0103_flavor_2v_8, c.scs_0103_flavor_4v_16, c.scs_0103_flavor_8v_32,
111+
c.scs_0103_flavor_1v_2, c.scs_0103_flavor_2v_4, c.scs_0103_flavor_4v_8, c.scs_0103_flavor_8v_16,
112+
c.scs_0103_flavor_16v_32, c.scs_0103_flavor_1v_8, c.scs_0103_flavor_2v_16, c.scs_0103_flavor_4v_32,
113+
c.scs_0103_flavor_1l_1, c.scs_0103_flavor_2v_4_20s, c.scs_0103_flavor_4v_16_100s,
114+
)))
96115
return c
97116

98117

Tests/iaas/scs_0100_flavor_naming/flavor_names_check.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ def compute_scs_flavors(flavors: typing.List[openstack.compute.v2.flavor.Flavor]
3535
return result
3636

3737

38+
def compute_flavor_spec(canonical_name: str) -> dict:
39+
# this is a helper for tying together scs_0100 and scs_0103
40+
return flavor_names.flavorname_to_dict(flavor_names.parser_v3(canonical_name))
41+
42+
3843
def compute_scs_0100_syntax_check(scs_flavors: list) -> bool:
3944
problems = [flv.name for flv, flavorname in scs_flavors if not flavorname]
4045
if problems:

Tests/iaas/standard-flavors/flavor-manager-input.py renamed to Tests/iaas/scs_0103_standard_flavors/flavor-manager-input.py

File renamed without changes.
File renamed without changes.
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import logging
2+
3+
4+
logger = logging.getLogger(__name__)
5+
6+
7+
NAME_KEY = "scs:name-v2"
8+
SCS_0103_CANONICAL_NAMES = (
9+
"SCS-1V-4",
10+
"SCS-2V-8",
11+
"SCS-4V-16",
12+
"SCS-8V-32",
13+
"SCS-1V-2",
14+
"SCS-2V-4",
15+
"SCS-4V-8",
16+
"SCS-8V-16",
17+
"SCS-16V-32",
18+
"SCS-1V-8",
19+
"SCS-2V-16",
20+
"SCS-4V-32",
21+
"SCS-1L-1",
22+
"SCS-2V-4-20s",
23+
"SCS-4V-16-100s",
24+
"SCS-1V-4-10",
25+
"SCS-2V-8-20",
26+
"SCS-4V-16-50",
27+
"SCS-8V-32-100",
28+
"SCS-1V-2-5",
29+
"SCS-2V-4-10",
30+
"SCS-4V-8-20",
31+
"SCS-8V-16-50",
32+
"SCS-16V-32-100",
33+
"SCS-1V-8-20",
34+
"SCS-2V-16-50",
35+
"SCS-4V-32-100",
36+
"SCS-1L-1-5",
37+
)
38+
39+
40+
def compute_flavor_lookup(flavors, name_key=NAME_KEY):
41+
# look up via extra_spec given by name_key
42+
by_name = {
43+
flavor.extra_specs[name_key]: flavor
44+
for flavor in flavors
45+
if name_key in flavor.extra_specs
46+
}
47+
# as a fallback, also allow flavor to be found by its actual name
48+
for flavor in flavors:
49+
if not flavor.name.startswith('SCS-'):
50+
continue
51+
by_name.setdefault(flavor.name, flavor)
52+
return by_name
53+
54+
55+
def compute_scs_0103_flavor(flavor_lookup, flavor_spec):
56+
canonical_name = flavor_spec[NAME_KEY]
57+
flavor = flavor_lookup.get(canonical_name)
58+
if flavor is None:
59+
logger.error(f'standard flavor missing: {canonical_name}')
60+
return False
61+
# check that flavor matches flavor_spec
62+
# cpu, ram, and disk should match, and they should match precisely for discoverability
63+
# also check extra_specs (ours are prefixed with 'scs:')
64+
comparison = [
65+
('vcpus', flavor.vcpus, flavor_spec['cpus']),
66+
('ram', flavor.ram, 1024 * flavor_spec['ram']),
67+
('disk', flavor.disk, flavor_spec.get('disk', 0)),
68+
] + [
69+
(key, value, flavor.extra_specs.get(key))
70+
for key, value in flavor_spec.items()
71+
if key.startswith("scs:")
72+
]
73+
report = [
74+
f'{key}: {a_val!r} should be {b_val!r}'
75+
for key, a_val, b_val in comparison
76+
if a_val != b_val
77+
]
78+
if report:
79+
logger.error(f"Flavor '{flavor.name}' violating constraints: {'; '.join(report)}")
80+
return not report

Tests/scs-compatible-iaas.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ modules:
8484
name: Standard flavors
8585
url: https://docs.scs.community/standards/scs-0103-v1-standard-flavors
8686
run:
87-
- executable: ./iaas/standard-flavors/flavors-openstack.py
88-
args: -c {os_cloud} -d ./iaas/scs-0103-v1-flavors.yaml
87+
- executable: ./iaas/openstack_test.py
88+
args: -c {os_cloud} standard-flavors-check
8989
testcases:
9090
- id: standard-flavors-check
9191
tags: [mandatory]

0 commit comments

Comments
 (0)