
Updated basedeployment_data to have version from site-definition.yaml and implemented exception if no global revision existed. Change-Id: I14caf8244a7d36201e9cc4ebc90e310d594743ec
240 lines
7.7 KiB
Python
240 lines
7.7 KiB
Python
# 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 copy
|
|
import os
|
|
import shutil
|
|
import textwrap
|
|
|
|
import pytest
|
|
import yaml
|
|
|
|
from pegleg import config
|
|
from pegleg.engine import site
|
|
from pegleg.engine.util import files
|
|
|
|
_SITE_TEST_STRUCTURE = {
|
|
'directories': {
|
|
'secrets': {
|
|
'directories': {
|
|
'passphrases': {
|
|
'files': {}
|
|
},
|
|
},
|
|
},
|
|
},
|
|
'files': {}
|
|
}
|
|
|
|
_SITE_DEFINITION = textwrap.dedent(
|
|
"""
|
|
---
|
|
schema: pegleg/SiteDefinition/v1
|
|
metadata:
|
|
layeringDefinition: {abstract: false, layer: site}
|
|
name: %(sitename)s
|
|
schema: metadata/Document/v1
|
|
storagePolicy: cleartext
|
|
data:
|
|
repositories:
|
|
global:
|
|
revision: v1.0
|
|
url: http://nowhere.com
|
|
site_type: %(sitename)s
|
|
...
|
|
""")
|
|
|
|
_LAYERING_DEFINITION = textwrap.dedent(
|
|
"""
|
|
---
|
|
schema: deckhand/LayeringPolicy/v1
|
|
metadata:
|
|
schema: metadata/Control/v1
|
|
name: layering-policy
|
|
data:
|
|
layerOrder:
|
|
- site
|
|
""")
|
|
|
|
_PLAINTEXT_SECRET = textwrap.dedent(
|
|
"""
|
|
---
|
|
schema: deckhand/Passphrase/v1
|
|
metadata:
|
|
schema: metadata/Document/v1
|
|
name: plaintext-secret
|
|
layeringDefinition:
|
|
abstract: false
|
|
layer: site
|
|
storagePolicy: cleartext
|
|
data: dde25e24d263e476cdcd
|
|
...
|
|
""")
|
|
|
|
_MANAGED_SECRET = textwrap.dedent(
|
|
"""
|
|
---
|
|
schema: pegleg/PeglegManagedDocument/v1
|
|
metadata:
|
|
name: managed-secret
|
|
schema: metadata/Document/v1
|
|
labels: {}
|
|
layeringDefinition:
|
|
abstract: false
|
|
layer: site
|
|
storagePolicy: cleartext
|
|
data:
|
|
managedDocument:
|
|
schema: deckhand/Certificate/v1
|
|
metadata:
|
|
layeringDefinition:
|
|
abstract: false
|
|
layer: site
|
|
name: managed-secret
|
|
schema: metadata/Document/v1
|
|
storagePolicy: cleartext
|
|
data: |
|
|
-----BEGIN CERTIFICATE-----
|
|
MIIDSDCCAjCgAwIBAgIUaAjhb47nDilYQacmkdtprW42gHowDQYJKoZIhvcNAQEL
|
|
BQAwKjETMBEGA1UEChMKS3ViZXJuZXRlczETMBEGA1UEAxMKa3ViZXJuZXRlczAe
|
|
Fw0xOTA3MTEyMjQ4MDBaFw0yNDA3MDkyMjQ4MDBaMCoxEzARBgNVBAoTCkt1YmVy
|
|
bmV0ZXMxEzARBgNVBAMTCmt1YmVybmV0ZXMwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
|
DwAwggEKAoIBAQDVi4YbTvjC+txSiclIJpJGE7YQe9t2nOfEyBykIwbi70GgcVyR
|
|
vNVN4bXQglG5EOVOv/A6DPQ3VIB4OsidPigwR7p8CCNl9yzVDSnhFtdcDv/Xw0z2
|
|
aBjvOMS1cBj9QzJIE04vct1sH1BQQ2l3PyOXtOalj1URFm+RLm2Lj+JiCnaxIV3g
|
|
Rp+CtiyYWwwfW+3GbDJGuXjIlch6zHa3BynoqvZBbWvMQ1hUn/iBKUtxtfHNDtoz
|
|
Xn5S6Cxzz2l7XaHtotKtlHwkH+U701nvj8vLev0EgDcESbl6yGqgHJIL6UieQlXL
|
|
4uKm8r9ThIhUuGBnDieydZNuVNpIPRVFeb0jAgMBAAGjZjBkMA4GA1UdDwEB/wQE
|
|
AwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1UdDgQWBBS7TMynvzvifS00ysY9
|
|
TGwjdejl3DAfBgNVHSMEGDAWgBS7TMynvzvifS00ysY9TGwjdejl3DANBgkqhkiG
|
|
9w0BAQsFAAOCAQEAglQGmrNz+BDq2CKq68JSGXhi5PCZ1NwmJmQekI+8jdV8Hd7g
|
|
urnoZGoMk1i7ZiL8YiOkiZNNWolKSF5whH/COBVBtTkYaPhCKfMDOi2sIVftv0q8
|
|
jkCIajudTCdf2ZcxB6/T+5wVUipjHtYzylTEaBhg171jc9P9vinSK6WSI6Q8wPCA
|
|
oPNHlBNg/YAErDuKsfeoBudpRakbHuucDEL9BLwOAoC1bBBQgOP6/j1A+5hVZ9bl
|
|
d1YXxkDR6odHEndfMTYHAtdiuYY6D2F3c6tESgnuksuAIuHRLnptIKrbC4HzBZG7
|
|
A8glSdSPBaCjMV8jnl2ge0XnIWbKYWXrWBaLIQ==
|
|
-----END CERTIFICATE-----
|
|
...
|
|
""")
|
|
|
|
_ENCRYPTED_SECRET = textwrap.dedent(
|
|
"""
|
|
---
|
|
schema: pegleg/PeglegManagedDocument/v1
|
|
metadata:
|
|
name: encrypted-secret
|
|
schema: metadata/Document/v1
|
|
labels: {}
|
|
layeringDefinition:
|
|
abstract: false
|
|
layer: site
|
|
storagePolicy: cleartext
|
|
data:
|
|
managedDocument:
|
|
schema: deckhand/Passphrase/v1
|
|
metadata:
|
|
layeringDefinition:
|
|
abstract: false
|
|
layer: site
|
|
storagePolicy: encrypted
|
|
name: encrypted-secret
|
|
schema: metadata/Document/v1
|
|
data: !!binary |
|
|
Z0FBQUFBQmVxeHkwQ2JCYy1lMmFIU0ZCcGJTdUp4OFlyM2t4TmYwRXJndTRVTFE5SFozYVd0eFVJ
|
|
SkhPRTdCRGppb3NhVjFQRkN0WXhaSmZWdjRHZkZTUzFBU0xGSS1vdWVVYUUxaEVfN1d5RmdUNkFw
|
|
RXM2NjA9
|
|
encrypted:
|
|
by: alexanderhughes
|
|
at: '2020-04-30T18:45:08.794873'
|
|
...
|
|
""")
|
|
|
|
|
|
@pytest.fixture()
|
|
def create_tmp_site_structure(tmpdir):
|
|
"""Fixture that creates a temporary site directory structure
|
|
|
|
:returns: Function pointer, which, when called, creates a temporary file
|
|
structure.
|
|
|
|
"""
|
|
def _create_tmp_folder_system(sitename):
|
|
"""Creates a temporary site folder system.
|
|
|
|
:param str sitename: Name of the site.
|
|
"""
|
|
# Create site directories and files.
|
|
p = tmpdir.mkdir("deployment_files")
|
|
config.set_site_repo(p.strpath)
|
|
|
|
site_definition = copy.deepcopy(_SITE_DEFINITION)
|
|
site_definition = site_definition % {'sitename': sitename}
|
|
|
|
test_structure = copy.deepcopy(_SITE_TEST_STRUCTURE)
|
|
test_structure['files']['site-definition.yaml'] = yaml.safe_load(
|
|
site_definition)
|
|
test_structure['files']['layering-definition.yaml'] = yaml.safe_load(
|
|
_LAYERING_DEFINITION)
|
|
test_structure['directories']['secrets']['directories']['passphrases'][
|
|
'files']['plaintext.yaml'] = yaml.safe_load(_PLAINTEXT_SECRET)
|
|
test_structure['directories']['secrets']['directories']['passphrases'][
|
|
'files']['managed.yaml'] = yaml.safe_load(_MANAGED_SECRET)
|
|
test_structure['directories']['secrets']['directories']['passphrases'][
|
|
'files']['encrypted.yaml'] = yaml.safe_load(_ENCRYPTED_SECRET)
|
|
|
|
test_path = os.path.join(p.strpath, files._site_path(sitename))
|
|
files._create_tree(test_path, tree=test_structure)
|
|
|
|
return p.strpath
|
|
|
|
try:
|
|
yield _create_tmp_folder_system
|
|
finally:
|
|
temp_path = config.get_site_repo()
|
|
if temp_path != './' and os.path.exists(temp_path):
|
|
shutil.rmtree(temp_path, ignore_errors=True)
|
|
|
|
|
|
def test_site_render(create_tmp_site_structure):
|
|
sitename = "test"
|
|
rootpath = create_tmp_site_structure(sitename)
|
|
docs = site.get_rendered_docs(sitename)
|
|
|
|
assert len(
|
|
docs) == 5 # Site-definition, layering definition, 3 secrets documents
|
|
for doc in docs:
|
|
if doc['metadata']['name'] == 'plaintext-secret':
|
|
doc2 = yaml.safe_load(_PLAINTEXT_SECRET)
|
|
assert doc2 == doc
|
|
elif doc['metadata']['name'] == 'managed-secret':
|
|
doc2 = yaml.safe_load(_MANAGED_SECRET)
|
|
assert doc2['data']['managedDocument'] == doc
|
|
elif doc['metadata']['name'] == 'encrypted-secret':
|
|
doc2 = yaml.safe_load(_ENCRYPTED_SECRET)
|
|
doc2['data']['managedDocument']['data'] = doc2['data'][
|
|
'managedDocument']['data'].decode()
|
|
assert doc2['data']['managedDocument'] == doc
|
|
|
|
|
|
def test_deployment_version_doc(create_tmp_site_structure):
|
|
"""
|
|
Testing of deployment-version document generated by collect and render commands.
|
|
Checks for expected values of resulting document.
|
|
"""
|
|
|
|
version = "v1.0"
|
|
sitename = "test"
|
|
rootpath = create_tmp_site_structure(sitename)
|
|
rendered_doc = site.get_deployment_data_doc(sitename)
|
|
assert rendered_doc['data']['site_type'] == sitename
|
|
assert rendered_doc['data']['version'] == version
|