120 lines
3.1 KiB
Python
120 lines
3.1 KiB
Python
import pytest
|
|
import cattle
|
|
import subprocess
|
|
import sys
|
|
import os
|
|
import re
|
|
# import yaml
|
|
|
|
|
|
def _base():
|
|
return os.path.dirname(__file__)
|
|
|
|
|
|
def _file(f):
|
|
return os.path.join(_base(), '../../{}'.format(f))
|
|
|
|
|
|
class CatalogService(object):
|
|
def __init__(self, catalog_bin):
|
|
self.catalog_bin = catalog_bin
|
|
|
|
def assert_retcode(self, ret_code, *args):
|
|
p = self.call(*args)
|
|
r_code = p.wait()
|
|
assert r_code == ret_code
|
|
|
|
def call(self, *args, **kw):
|
|
cmd = [self.catalog_bin]
|
|
cmd.extend(args)
|
|
|
|
kw_args = {
|
|
'stdin': subprocess.PIPE,
|
|
'stdout': sys.stdout,
|
|
'stderr': sys.stderr,
|
|
'cwd': _base(),
|
|
}
|
|
|
|
kw_args.update(kw)
|
|
return subprocess.Popen(cmd, **kw_args)
|
|
|
|
|
|
@pytest.fixture(scope='session')
|
|
def catalog_bin():
|
|
c = '/usr/bin/rancher-catalog-service'
|
|
assert os.path.exists(c)
|
|
return c
|
|
|
|
|
|
@pytest.fixture(scope='session')
|
|
def catalog_service(catalog_bin):
|
|
return CatalogService(catalog_bin)
|
|
|
|
|
|
@pytest.fixture(scope='session')
|
|
def client():
|
|
url = 'http://localhost:8088/v1-catalog/schemas'
|
|
return cattle.from_env(url=url)
|
|
|
|
|
|
@pytest.fixture(scope='session')
|
|
def templates(client):
|
|
templates = client.list_template()
|
|
assert len(templates) > 0
|
|
return templates
|
|
|
|
|
|
@pytest.fixture(scope='session')
|
|
def requests():
|
|
return requests.Session()
|
|
|
|
|
|
@pytest.fixture(scope='session')
|
|
def template_details(client, templates):
|
|
for template in templates:
|
|
template.versionDetails = {}
|
|
for version, link in template.versionLinks.iteritems():
|
|
template.versionDetails[version] = client._get(link)
|
|
return templates
|
|
|
|
|
|
def test_validate_exits_normal(catalog_service):
|
|
catalog_service.assert_retcode(
|
|
0, '-catalogUrl',
|
|
_file('./'),
|
|
'-validate', '-port', '18088')
|
|
|
|
|
|
def test_stack_name(templates):
|
|
hostname_label = re.compile(r'^[a-zA-Z0-9\-]{1,63}$')
|
|
for template in templates:
|
|
# stack_name must be a valid hostname label
|
|
assert hostname_label.match(template.id.split(':')[-1].split('*')[-1])
|
|
|
|
|
|
def test_maintainers(templates):
|
|
maintainer = re.compile(r'^([\S]+ ){2,5}<[^@]+@[^@]+\.[^@]+>$')
|
|
for template in templates:
|
|
# Maintainer will soon be a requirement
|
|
# assert template.maintainer
|
|
if template.maintainer:
|
|
assert maintainer.match(template.maintainer)
|
|
|
|
|
|
def test_versions(templates):
|
|
for template in templates:
|
|
# default version must be defined
|
|
assert template.defaultVersion
|
|
# template with default version must be defined
|
|
assert template.versionLinks[template.defaultVersion]
|
|
|
|
|
|
def test_template_questions(template_details):
|
|
for template in template_details:
|
|
for _, template in template.versionDetails.iteritems():
|
|
# there must exist a rancher-compose.yml file
|
|
assert template.files['rancher-compose.yml']
|
|
# rancherConfig = yaml.load(template.files['rancher-compose.yml'])
|
|
# there must exist at least one question
|
|
# assert len(rancherConfig['.catalog']['questions']) > 0
|