pegleg/tests/unit/engine/test_site_collect.py

130 lines
4.3 KiB
Python

# Copyright 2018 AT&T Intellectual Property. All other rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import mock
import os
import shutil
import yaml
import click
from pegleg.engine import site
from pegleg.engine.util import deckhand
from tests.unit.fixtures import create_tmp_deployment_files
def _site_definition(site_name):
SITE_DEFINITION = {
'schema': 'pegleg/SiteDefinition/v1',
'metadata': {
'storagePolicy': 'cleartext',
'schema': 'metadata/Document/v1',
'layeringDefinition': {
'abstract': False,
'layer': 'site'
},
'name': site_name
},
'data': {
'site_type': site_name,
'revision': 'v1.0'
}
}
return SITE_DEFINITION
def _expected_document_names(site_name):
EXPECTED_DOCUMENT_NAMES = [
'global-common', 'global-v1.0',
'%s-type-common' % site_name,
'%s-type-v1.0' % site_name,
_site_definition(site_name)["metadata"]["name"],
'%s-chart' % site_name,
'%s-passphrase' % site_name, 'deployment-version'
]
return EXPECTED_DOCUMENT_NAMES
def _test_site_collect_to_file(tmpdir, site_name, collection_path):
try:
collection_path = tmpdir.mkdir("cicd_path")
collection_str_path = str(collection_path)
site.collect(site_name, collection_str_path)
deployment_files = collection_path.join('deployment_files.yaml')
assert deployment_files.isfile()
with open(str(deployment_files), 'r') as f:
lines = f.read()
deployment_documents = list(yaml.safe_load_all(lines))
assert sorted(_expected_document_names(site_name)) == sorted(
[x['metadata']['name'] for x in deployment_documents])
assert "pegleg/DeploymentData/v1" in lines
# Make sure our generated YAMLs are valid
deckhand.deckhand_render(
documents=deployment_documents,
fail_on_missing_sub_src=False,
validate=True,
)
finally:
if os.path.exists(collection_str_path):
shutil.rmtree(collection_str_path, ignore_errors=True)
def test_site_collect_to_file(tmpdir, create_tmp_deployment_files):
_test_site_collect_to_file(tmpdir, "cicd", "cicd_path")
_test_site_collect_to_file(tmpdir, "lab", "lab_path")
def _test_site_collect_to_stdout(site_name):
# 2nd arg of None will force redirection to stdout.
with mock.patch.object(click, 'echo') as mock_echo:
site.collect(site_name, None)
expected_names = _expected_document_names(site_name)
all_lines = [x[1][0].strip() for x in mock_echo.mock_calls]
assert all_lines, "Nothing written to stdout"
assert any("pegleg/DeploymentData/v1" in line for line in all_lines)
for expected in expected_names:
assert 'name: {}'.format(expected) in all_lines
def test_site_collect_to_stdout(create_tmp_deployment_files):
_test_site_collect_to_stdout("cicd")
_test_site_collect_to_stdout("lab")
def test_read_and_format_yaml(tmpdir):
# Validate the case where the YAML already begins with leading --- and ends
# with trailing ... -- there should be no change.
tempdir = tmpdir.mkdir(__name__)
tempfile = tempdir.join("test-manifests-1.yaml")
# Check that Linux-style newline is output instead when \r\n is provided.
tempfile.write("---\r\nfoo:bar\r\n...\r\n")
output = list(site._read_and_format_yaml(str(tempfile)))
expected = ['---\n', 'foo:bar\n', '...\n']
assert expected == output
# Validate the case where the YAML is missing --- & ... and check that
# they are added.
tempfile = tempdir.join("test-manifests-2.yaml")
tempfile.write("foo:bar\n")
output = list(site._read_and_format_yaml(str(tempfile)))
expected = ['---\n', 'foo:bar\n', '...\n']
assert expected == output