
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
169 lines
6.7 KiB
Python
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
|