drydock/python/tests/unit/test_schema_validation.py
Sergiy Markin 108a3c1ee4 Fix deprecated code
This PS replaces deprecared module pkg_resources,
also fixes the schema validation by adding
specific schema draft to choose in order to
prevent the processor to fall back to use the
latest draft that may potentially cause issues.

Also switched to quay.io/airshipit for base ubuntu
image

Change-Id: I687ef267ee3b027e80815e8852c8edcab5b5b727
2024-12-23 20:55:29 +00:00

169 lines
6.7 KiB
Python

import pylibyaml # noqa: F401 # patch pyyaml to use libyaml bindings
import yaml
import jsonschema
from importlib.resources import files
import os
import shutil
import pytest
from jsonschema.exceptions import ValidationError
class BaseSchemaValidationTest(object):
def _test_validate(self, schema, expect_failure, input_files, input):
"""validates input yaml against schema.
:param schema: schema yaml file
:param expect_failure: should the validation pass or fail.
:param input_files: pytest fixture used to access the test input files
:param input: test input yaml doc filename"""
schema_dir = str(files('drydock_provisioner') / 'schemas')
schema_filename = os.path.join(schema_dir, schema)
schema_file = open(schema_filename, 'r')
schema = yaml.safe_load(schema_file)
input_file = input_files.join(input)
instance_file = open(str(input_file), 'r')
instance = yaml.safe_load(instance_file)
if expect_failure:
with pytest.raises(ValidationError):
jsonschema.validate(instance['spec'], schema['data'])
else:
jsonschema.validate(instance['spec'], schema['data'])
class TestValidation(BaseSchemaValidationTest):
def test_validate_baremetalNode(self, input_files):
self._test_validate('baremetalNode.yaml', False, input_files,
"baremetalNode.yaml")
def test_validate_baremetalNode2(self, input_files):
self._test_validate('baremetalNode.yaml', False, input_files,
"baremetalNode2.yaml")
def test_invalidate_baremetalNode(self, input_files):
self._test_validate('baremetalNode.yaml', True, input_files,
"invalid_baremetalNode.yaml")
def test_invalidate_baremetalNode2(self, input_files):
self._test_validate('baremetalNode.yaml', True, input_files,
"invalid_baremetalNode2.yaml")
def test_validate_hardwareProfile(self, input_files):
self._test_validate('hardwareProfile.yaml', False, input_files,
"hardwareProfile.yaml")
def test_invalidate_hardwareProfile(self, input_files):
self._test_validate('hardwareProfile.yaml', True, input_files,
"invalid_hardwareProfile.yaml")
def test_validate_hostProfile(self, input_files):
self._test_validate('hostProfile.yaml', False, input_files,
"hostProfile.yaml")
def test_validate_hostProfile2(self, input_files):
self._test_validate('hostProfile.yaml', False, input_files,
"hostProfile2.yaml")
def test_invalidate_hostProfile(self, input_files):
self._test_validate('hostProfile.yaml', True, input_files,
"invalid_hostProfile.yaml")
def test_invalidate_hostProfile2(self, input_files):
self._test_validate('hostProfile.yaml', True, input_files,
"invalid_hostProfile2.yaml")
def test_validate_network(self, input_files):
self._test_validate('network.yaml', False, input_files, "network.yaml")
def test_validate_network2(self, input_files):
self._test_validate('network.yaml', False, input_files,
"network2.yaml")
def test_validate_network3(self, input_files):
self._test_validate('network.yaml', False, input_files,
"network3.yaml")
def test_validate_network4(self, input_files):
self._test_validate('network.yaml', False, input_files,
"network4.yaml")
def test_validate_network5(self, input_files):
self._test_validate('network.yaml', False, input_files,
"network5.yaml")
def test_invalidate_network(self, input_files):
self._test_validate('network.yaml', True, input_files,
"invalid_network.yaml")
def test_invalidate_network2(self, input_files):
self._test_validate('network.yaml', True, input_files,
"invalid_network2.yaml")
def test_invalidate_network3(self, input_files):
self._test_validate('network.yaml', True, input_files,
"invalid_network3.yaml")
def test_invalidate_network4(self, input_files):
self._test_validate('network.yaml', True, input_files,
"invalid_network4.yaml")
def test_invalidate_network5(self, input_files):
self._test_validate('network.yaml', True, input_files,
"invalid_network5.yaml")
def test_validate_networkLink(self, input_files):
self._test_validate('networkLink.yaml', False, input_files,
"networkLink.yaml")
def test_validate_networkLink2(self, input_files):
self._test_validate('networkLink.yaml', False, input_files,
"networkLink2.yaml")
def test_validate_networkLink3(self, input_files):
self._test_validate('networkLink.yaml', False, input_files,
"networkLink3.yaml")
def test_invalidate_networkLink(self, input_files):
self._test_validate('networkLink.yaml', True, input_files,
"invalid_networkLink.yaml")
def test_invalidate_networkLink2(self, input_files):
self._test_validate('networkLink.yaml', True, input_files,
"invalid_networkLink2.yaml")
def test_invalidate_networkLink3(self, input_files):
self._test_validate('networkLink.yaml', True, input_files,
"invalid_networkLink3.yaml")
def test_validate_region(self, input_files):
self._test_validate('region.yaml', False, input_files, "region.yaml")
def test_invalidate_region(self, input_files):
self._test_validate('region.yaml', True, input_files,
"invalid_region.yaml")
def test_validate_rack(self, input_files):
self._test_validate('rack.yaml', False, input_files, "rack.yaml")
def test_invalidate_rack(self, input_files):
self._test_validate('rack.yaml', True, input_files,
"invalid_rack.yaml")
@pytest.fixture(scope='module')
def input_files(self, tmpdir_factory, request):
tmpdir = tmpdir_factory.mktemp('data')
samples_dir = os.path.dirname(str(
request.fspath)) + "/" + "../yaml_samples"
samples = os.listdir(samples_dir)
for f in samples:
src_file = samples_dir + "/" + f
dst_file = str(tmpdir) + "/" + f
shutil.copyfile(src_file, dst_file)
return tmpdir