391 lines
16 KiB
Python
391 lines
16 KiB
Python
from os import path
|
|
from unittest import TestCase
|
|
|
|
import yaml
|
|
from semver import Version
|
|
|
|
from release.context import ReleaseContext
|
|
from release.project import (ArtefactDescription, DeploymentCondition,
|
|
DeploymentDescription, HelmRelease,
|
|
HelmReleaseInfo, Npm, NpmReleaseInfo, OciImage,
|
|
OciImageReleaseInfo, ProjectDescription,
|
|
ProjectReleaseInfo, Sdist, SdistReleaseInfo,
|
|
Tarball, TarballReleaseInfo, Wheel,
|
|
WheelReleaseInfo, parse_project_description)
|
|
|
|
|
|
class TestProjectDescription(TestCase):
|
|
def test_can_describe_projects(self):
|
|
# resi-lib
|
|
ProjectDescription(
|
|
version_descriptor='src/python/Cargo.toml',
|
|
artefacts=[
|
|
ArtefactDescription(
|
|
generated=Wheel(pattern='./scratch/wheels/*.whl'))
|
|
])
|
|
|
|
# productdesignerd
|
|
ProjectDescription(
|
|
version_descriptor='bootstrap/setup.py',
|
|
artefacts=[
|
|
ArtefactDescription(
|
|
generated=OciImage(name='productdesignerd')
|
|
)],
|
|
deployments=[
|
|
DeploymentDescription(
|
|
condition=DeploymentCondition.PRE_RELEASE_ONLY,
|
|
deployment=HelmRelease(
|
|
release_name='productdesignerd-testing',
|
|
namespace='productdesignerd-testing')),
|
|
])
|
|
|
|
# masa-images
|
|
ProjectDescription(
|
|
version_descriptor='Cargo.toml',
|
|
artefacts=[
|
|
ArtefactDescription(
|
|
generated=OciImage(name='masa-images')),
|
|
ArtefactDescription(
|
|
generated=Wheel(pattern='./scratch/wheels/*.whl'))
|
|
],
|
|
deployments=[
|
|
DeploymentDescription(
|
|
condition=DeploymentCondition.PRE_RELEASE_ONLY,
|
|
deployment=HelmRelease(
|
|
release_name='masa-images-testing',
|
|
namespace='masa-images-testing')),
|
|
])
|
|
|
|
# yaac
|
|
ProjectDescription(
|
|
version_descriptor='version.txt',
|
|
artefacts=[
|
|
ArtefactDescription(generated=Tarball(
|
|
filename='/tmp/yaac.tar.gz',
|
|
package_name='yaac'))
|
|
])
|
|
|
|
# papyru
|
|
ProjectDescription(
|
|
version_descriptor='setup.py',
|
|
artefacts=[
|
|
ArtefactDescription(
|
|
generated=Sdist(
|
|
'./dist/papyru-${PAPYRU_PACKAGE_VERSION}.tar.gz'))
|
|
])
|
|
|
|
# productdesigner
|
|
ProjectDescription(
|
|
version_descriptor='package.json',
|
|
artefacts=[
|
|
ArtefactDescription(
|
|
generated=Npm('dist/browser')),
|
|
ArtefactDescription(
|
|
generated=OciImage(name='productdesigner')),
|
|
],
|
|
deployments=[
|
|
DeploymentDescription(
|
|
condition=DeploymentCondition.PRE_RELEASE_ONLY,
|
|
deployment=HelmRelease(
|
|
release_name='productdesigner-testing',
|
|
namespace='productdesigner-testing'))
|
|
])
|
|
|
|
# motacilla
|
|
ProjectDescription(
|
|
version_descriptor='setup.py',
|
|
artefacts=[
|
|
ArtefactDescription(generated=OciImage(name='motacilla')),
|
|
ArtefactDescription(generated=OciImage(name='motacilla-cdn')),
|
|
],
|
|
deployments=[
|
|
DeploymentDescription(
|
|
condition=DeploymentCondition.PRE_RELEASE_ONLY,
|
|
deployment=HelmRelease(
|
|
release_name='motacilla-de-testing',
|
|
namespace='motacilla-de-testing',
|
|
image_paths=['image.cms.tag', 'image.cdn.tag'])),
|
|
DeploymentDescription(
|
|
condition=DeploymentCondition.PRE_RELEASE_ONLY,
|
|
deployment=HelmRelease(
|
|
release_name='motacilla-schmidt-testing',
|
|
namespace='motacilla-schmidt-testing',
|
|
image_paths=['image.cms.tag', 'image.cdn.tag'])),
|
|
DeploymentDescription(
|
|
condition=DeploymentCondition.PRE_RELEASE_ONLY,
|
|
deployment=HelmRelease(
|
|
release_name='motacilla-be-testing',
|
|
namespace='motacilla-be-testing',
|
|
image_paths=['image.cms.tag', 'image.cdn.tag'])),
|
|
])
|
|
|
|
# prngl
|
|
ProjectDescription(
|
|
version_descriptor='Cargo.toml',
|
|
artefacts=[
|
|
ArtefactDescription(
|
|
version_descriptor='src/python/pyproject.toml',
|
|
generated=Wheel(pattern='./scratch/wheels/*.whl')),
|
|
ArtefactDescription(generated=OciImage(name='prngl')),
|
|
],
|
|
deployments=[
|
|
DeploymentDescription(
|
|
condition=DeploymentCondition.PRE_RELEASE_ONLY,
|
|
deployment=HelmRelease(
|
|
release_name='prngl-testing',
|
|
namespace='prngl-testing'))
|
|
])
|
|
|
|
def test_environment_variables(self):
|
|
# motacilla
|
|
desc = ProjectDescription(
|
|
version_descriptor=path.join(
|
|
path.dirname(__file__), 'assets/setup.py'),
|
|
artefacts=[
|
|
ArtefactDescription(generated=OciImage(
|
|
repository='remote', name='motacilla')),
|
|
ArtefactDescription(generated=OciImage(
|
|
repository='remote', name='motacilla-cdn')),
|
|
],
|
|
deployments=[
|
|
DeploymentDescription(
|
|
condition=DeploymentCondition.PRE_RELEASE_ONLY,
|
|
deployment=HelmRelease(
|
|
release_name='motacilla-de-testing',
|
|
namespace='motacilla-de-testing',
|
|
image_paths=['image.cms.tag', 'image.cdn.tag'])),
|
|
DeploymentDescription(
|
|
condition=DeploymentCondition.PRE_RELEASE_ONLY,
|
|
deployment=HelmRelease(
|
|
release_name='motacilla-schmidt-testing',
|
|
namespace='motacilla-schmidt-testing',
|
|
image_paths=['image.cms.tag', 'image.cdn.tag'])),
|
|
DeploymentDescription(
|
|
condition=DeploymentCondition.PRE_RELEASE_ONLY,
|
|
deployment=HelmRelease(
|
|
release_name='motacilla-be-testing',
|
|
namespace='motacilla-be-testing',
|
|
image_paths=['image.cms.tag', 'image.cdn.tag'])),
|
|
],
|
|
context=ReleaseContext(repository_name='resi',
|
|
ref_name='testing',
|
|
run_number=42,
|
|
is_pre_release=True,
|
|
commit_sha='0AB123',
|
|
gitea_instance='http://gitea.foo.intern')
|
|
)
|
|
|
|
self.maxDiff = None
|
|
self.assertEqual(
|
|
desc.environment_variables,
|
|
{
|
|
'RELEASE_IMAGE_TAG': '0AB123',
|
|
'RELEASE_IMAGE_LOCAL_NAME_MOTACILLA': 'motacilla:0AB123',
|
|
'RELEASE_IMAGE_LOCAL_NAME_MOTACILLA_CDN':
|
|
'motacilla-cdn:0AB123',
|
|
'RELEASE_IS_PRERELEASE': '1',
|
|
'RELEASE_PROJECT_CURRENT_VERSION': '2.10.4',
|
|
'RELEASE_PROJECT_PLANNED_VERSION': '2.10.4-dev42'
|
|
}
|
|
)
|
|
|
|
def test_tarball_release_info(self):
|
|
tarball = Tarball(filename='foo.tar.gz', package_name='foo')
|
|
self.assertEqual(
|
|
TarballReleaseInfo(
|
|
filename='foo.tar.gz',
|
|
package_name='foo',
|
|
version_str='1.2.3-dev4',
|
|
repository='https://gitea.puzzleyou.net'),
|
|
tarball.make_release_info(None, Version(1, 2, 3, 'dev4')))
|
|
|
|
def test_wheel_release_info(self):
|
|
wheel = Wheel(pattern='dist/wheels/*')
|
|
self.assertEqual(
|
|
WheelReleaseInfo(pattern='dist/wheels/*',
|
|
repository='gitea',
|
|
version_str='1.2.3.dev4'),
|
|
wheel.make_release_info(None, Version(1, 2, 3, 'dev4')))
|
|
|
|
def test_sdist_release_info(self):
|
|
sdist = Sdist(filename='somethingsomething.tar.gz')
|
|
self.assertEqual(
|
|
SdistReleaseInfo(version_str='1.2.3.dev4',
|
|
filename='somethingsomething.tar.gz',
|
|
repository='gitea'),
|
|
sdist.make_release_info(None, Version(1, 2, 3, 'dev4')))
|
|
|
|
def test_npm_release_info(self):
|
|
npm = Npm(directory='./')
|
|
self.assertEqual(
|
|
NpmReleaseInfo(directory='./'),
|
|
npm.make_release_info(None, Version(1, 2, 3, 'dev4')))
|
|
|
|
def test_helm_release_info(self):
|
|
helm = HelmRelease(release_name='foo',
|
|
namespace='bar',
|
|
image_paths=['foo.bar', 'baz.blubb'],
|
|
repository='ludicrous')
|
|
|
|
self.assertEqual(
|
|
HelmReleaseInfo(release_name='foo',
|
|
namespace='bar',
|
|
repository='ludicrous',
|
|
image_tag='v1.2.3-dev4',
|
|
image_paths=['foo.bar', 'baz.blubb'],
|
|
timeout='5m'),
|
|
helm.make_release_info(None, Version(1, 2, 3, 'dev4')))
|
|
|
|
def test_oci_image_release_info(self):
|
|
self.maxDiff = None
|
|
|
|
img = OciImage(name='test', repository='remote')
|
|
|
|
pre_release_version = Version(1, 33, 7, 'dev42')
|
|
pre_release_context = ReleaseContext(
|
|
repository_name='resi',
|
|
ref_name='testing',
|
|
run_number=42,
|
|
is_pre_release=True,
|
|
commit_sha='PROBABLY_BROKEN',
|
|
gitea_instance='http://gitea.foo.intern')
|
|
|
|
self.assertEqual(
|
|
OciImageReleaseInfo(
|
|
image_name='test',
|
|
local_tag='PROBABLY_BROKEN',
|
|
local_full_name='test:PROBABLY_BROKEN',
|
|
remote_full_names=[
|
|
'remote/test:v1.33.7-dev42',
|
|
'remote/test:testing.latest',
|
|
'remote/test:development',
|
|
],
|
|
tags=['v1.33.7-dev42', 'testing.latest', 'development']),
|
|
img.make_release_info(pre_release_context,
|
|
pre_release_version))
|
|
|
|
release_version = Version(1, 33, 7)
|
|
release_context = ReleaseContext(
|
|
repository_name='resi',
|
|
ref_name='master',
|
|
run_number=43,
|
|
is_pre_release=False,
|
|
commit_sha='finalv2',
|
|
gitea_instance='http://gitea.foo.intern')
|
|
|
|
self.assertEqual(
|
|
OciImageReleaseInfo(
|
|
image_name='test',
|
|
local_tag='finalv2',
|
|
local_full_name='test:finalv2',
|
|
remote_full_names=[
|
|
'remote/test:v1.33.7',
|
|
'remote/test:master.latest',
|
|
'remote/test:v1.33',
|
|
'remote/test:v1',
|
|
'remote/test:latest',
|
|
],
|
|
tags=['v1.33.7',
|
|
'master.latest',
|
|
'v1.33',
|
|
'v1',
|
|
'latest']),
|
|
img.make_release_info(release_context, release_version))
|
|
|
|
def test_project_release_info(self):
|
|
project_0 = ProjectDescription(
|
|
version_descriptor='test-assets/version.txt')
|
|
self.assertIsNone(project_0.release_info)
|
|
|
|
project_pre = ProjectDescription(
|
|
version_descriptor='test-assets/version.txt',
|
|
context=ReleaseContext(
|
|
repository_name='resi',
|
|
ref_name='testing',
|
|
run_number=42,
|
|
is_pre_release=True,
|
|
commit_sha='PROBABLY_BROKEN',
|
|
gitea_instance='http://gitea.foo.intern'))
|
|
|
|
self.assertEqual(
|
|
ProjectReleaseInfo(
|
|
gitea_release_title='Version 1.33.7-dev42',
|
|
gitea_release_description='',
|
|
gitea_is_prerelease=True,
|
|
gitea_git_commitish='PROBABLY_BROKEN',
|
|
git_tags=['v1.33.7-dev42', 'development'],
|
|
),
|
|
project_pre.release_info)
|
|
|
|
project = ProjectDescription(
|
|
version_descriptor='test-assets/version.txt',
|
|
context=ReleaseContext(
|
|
repository_name='resi',
|
|
ref_name='master',
|
|
run_number=42,
|
|
is_pre_release=False,
|
|
commit_sha='PROBABLY_BROKEN',
|
|
gitea_instance='http://gitea.foo.intern'))
|
|
|
|
self.assertEqual(
|
|
ProjectReleaseInfo(
|
|
gitea_release_title='Version 1.33.7',
|
|
gitea_release_description='',
|
|
gitea_is_prerelease=False,
|
|
gitea_git_commitish='PROBABLY_BROKEN',
|
|
git_tags=['v1.33.7', 'v1.33', 'v1', 'latest'],
|
|
),
|
|
project.release_info)
|
|
|
|
def test_load_from_file(self):
|
|
expected = ProjectDescription(
|
|
version_descriptor='test-assets/version.txt',
|
|
artefacts=[
|
|
ArtefactDescription(generated=OciImage(
|
|
name='productdesignerd')),
|
|
ArtefactDescription(
|
|
generated=OciImage(repository='remote', name='motacilla'),
|
|
version_descriptor='test-assets/Cargo.toml'),
|
|
|
|
ArtefactDescription(generated=Tarball(
|
|
filename='/tmp/yaac.tar.gz', package_name='yaac')),
|
|
ArtefactDescription(generated=Tarball(
|
|
filename='/tmp/yaac.tar.gz',
|
|
package_name='yaac',
|
|
repository='balls')),
|
|
|
|
ArtefactDescription(generated=Wheel(
|
|
pattern='./scratch/wheels/*.whl')),
|
|
ArtefactDescription(generated=Wheel(
|
|
pattern='./scratch/wheels/*.whl', repository='other')),
|
|
|
|
ArtefactDescription(generated=Sdist(
|
|
filename='./dist/papyru-0.0.1.tar.gz')),
|
|
ArtefactDescription(generated=Sdist(
|
|
filename='./dist/papyru-0.0.1.tar.gz',
|
|
repository='pypi')),
|
|
|
|
ArtefactDescription(generated=Npm(directory='./dist/browser')),
|
|
],
|
|
deployments=[
|
|
DeploymentDescription(
|
|
condition=DeploymentCondition.PRE_RELEASE_ONLY,
|
|
deployment=HelmRelease(
|
|
release_name='productdesignerd-testing')),
|
|
DeploymentDescription(
|
|
condition=DeploymentCondition.RELEASE_ONLY,
|
|
deployment=HelmRelease(
|
|
release_name='foo',
|
|
namespace='bar',
|
|
image_paths=['foo', 'bar', 'baz'],
|
|
repository='helms',
|
|
)),
|
|
])
|
|
|
|
with open(path.join(
|
|
path.dirname(__file__), 'assets/release.yaml'), 'r') as f:
|
|
project = parse_project_description(yaml.safe_load(f))
|
|
|
|
self.maxDiff = None
|
|
self.assertEqual(project, expected)
|