def test_deb(deb_archive, tmpdir): project = deb_archive.project # archive files should be extracted to the empty directory # to correctly check archive contents extract_dir = os.path.join(tmpdir, 'extract') os.makedirs(extract_dir) # unpack ar process = subprocess.run(['ar', 'x', deb_archive.filepath], cwd=extract_dir) assert process.returncode == 0, 'Error during unpacking of deb archive' for filename in ['debian-binary', 'control.tar.xz', 'data.tar.xz']: assert os.path.exists(os.path.join(extract_dir, filename)) # check debian-binary with open(os.path.join(extract_dir, 'debian-binary')) as debian_binary_file: assert debian_binary_file.read() == '2.0\n' # check data.tar.xz with tarfile.open( name=os.path.join(extract_dir, 'data.tar.xz')) as data_arch: data_dir = os.path.join(extract_dir, 'data') data_arch.extractall(path=data_dir) check_package_files(project, data_dir) assert_filemodes(project, data_dir) # check control.tar.xz with tarfile.open( name=os.path.join(extract_dir, 'control.tar.xz')) as control_arch: control_dir = os.path.join(extract_dir, 'control') control_arch.extractall(path=control_dir) for filename in ['control', 'preinst', 'postinst']: assert os.path.exists(os.path.join(control_dir, filename)) if not tarantool_enterprise_is_used(): assert_tarantool_dependency_deb( os.path.join(control_dir, 'control')) # check if postinst script set owners correctly with open(os.path.join(control_dir, 'postinst')) as postinst_script_file: postinst_script = postinst_script_file.read() assert 'chown -R root:root /usr/share/tarantool/{}'.format( project.name) in postinst_script assert 'chown root:root /etc/systemd/system/{}.service'.format( project.name) in postinst_script assert 'chown root:root /etc/systemd/system/{}@.service'.format( project.name) in postinst_script assert 'chown root:root /usr/lib/tmpfiles.d/{}.conf'.format( project.name) in postinst_script
def test_pack(docker_image, tmpdir, docker_client): project = docker_image.project image_name = docker_image.name container = docker_client.containers.create(docker_image.name) container_distribution_dir = '/usr/share/tarantool/{}'.format(project.name) # check if distribution dir was created command = '[ -d "{}" ] && echo true || echo false'.format(container_distribution_dir) output = run_command_on_image(docker_client, image_name, command) assert output == 'true' # get distribution dir contents arhive_path = os.path.join(tmpdir, 'distribution_dir.tar') with open(arhive_path, 'wb') as f: bits, _ = container.get_archive(container_distribution_dir) for chunk in bits: f.write(chunk) with tarfile.open(arhive_path) as arch: arch.extractall(path=os.path.join(tmpdir, 'usr/share/tarantool')) os.remove(arhive_path) assert_distribution_dir_contents( dir_contents=recursive_listdir(os.path.join(tmpdir, 'usr/share/tarantool/', project.name)), project=project, ) assert_filemodes(project, tmpdir) container.remove() if not tarantool_enterprise_is_used(): # check if tarantool was installed command = 'yum list installed 2>/dev/null | grep tarantool' output = run_command_on_image(docker_client, image_name, command) packages_list = output.split('\n') assert any(['tarantool' in package for package in packages_list]) # check tarantool version command = 'tarantool --version' output = run_command_on_image(docker_client, image_name, command) m = re.search(r'Tarantool\s+(\d+.\d+)', output) assert m is not None installed_version = m.group(1) m = re.search(r'(\d+.\d+)', tarantool_version()) assert m is not None expected_version = m.group(1) assert installed_version == expected_version
def test_tgz_pack(project, tgz_archive, tmpdir): with tarfile.open(name=tgz_archive['name']) as tgz_arch: # usr/share/tarantool is added to coorectly run assert_filemodes distribution_dir = os.path.join(tmpdir, 'usr/share/tarantool', project['name']) os.makedirs(distribution_dir, exist_ok=True) tgz_arch.extractall(path=os.path.join(tmpdir, 'usr/share/tarantool')) assert_dir_contents(files_list=recursive_listdir(distribution_dir), exp_files_list=project['distribution_files_list'], exp_rocks_content=project['rocks_content']) validate_version_file(project, distribution_dir) assert_filemodes(project, tmpdir)
def test_tgz(tgz_archive, tmpdir): project = tgz_archive.project # archive files should be extracted to the empty directory # to correctly check archive contents extract_dir = os.path.join(tmpdir, 'extract') os.makedirs(extract_dir) with tarfile.open(name=tgz_archive.filepath) as tgz_arch: # usr/share/tarantool is added to correctly run assert_filemodes distribution_dir = os.path.join(extract_dir, 'usr/share/tarantool', project.name) os.makedirs(distribution_dir, exist_ok=True) tgz_arch.extractall( path=os.path.join(extract_dir, 'usr/share/tarantool')) assert_distribution_dir_contents( dir_contents=recursive_listdir(distribution_dir), project=project) validate_version_file(project, distribution_dir) assert_filemodes(project, extract_dir)
def test_pack(docker_image, tmpdir, docker_client): project = docker_image.project image_name = docker_image.name container = docker_client.containers.create(docker_image.name) container_distribution_dir = '/usr/share/tarantool/{}'.format(project.name) # check if distribution dir was created command = '[ -d "{}" ] && echo true || echo false'.format( container_distribution_dir) output = run_command_on_image(docker_client, image_name, command) assert output == 'true' # get distribution dir contents arhive_path = os.path.join(tmpdir, 'distribution_dir.tar') with open(arhive_path, 'wb') as f: bits, _ = container.get_archive(container_distribution_dir) for chunk in bits: f.write(chunk) with tarfile.open(arhive_path) as arch: arch.extractall(path=os.path.join(tmpdir, 'usr/share/tarantool')) os.remove(arhive_path) distribution_dir_contents = recursive_listdir( os.path.join(tmpdir, 'usr/share/tarantool/', project.name)) # The runtime image is built using Dockerfile.<random-string> in the # distribution directory # This dockerfile name should be added to project distribution files set # to correctly check distribution directory contents for f in distribution_dir_contents: if f.startswith('Dockerfile') and f not in [ 'Dockerfile.build.cartridge', 'Dockerfile.cartridge' ]: project.distribution_files.add(f) break assert_distribution_dir_contents( dir_contents=recursive_listdir( os.path.join(tmpdir, 'usr/share/tarantool/', project.name)), project=project, ) assert_filemodes(project, tmpdir) container.remove() if project.image_runtime_requirements_filepath is not None: command = 'ls {}'.format(project.image_runtime_requirements_filepath) output = run_command_on_image(docker_client, image_name, command) assert output == project.image_runtime_requirements_filepath if not tarantool_enterprise_is_used(): # check if tarantool was installed command = 'yum list installed 2>/dev/null | grep tarantool' output = run_command_on_image(docker_client, image_name, command) packages_list = output.split('\n') assert any(['tarantool' in package for package in packages_list]) # check tarantool version command = 'tarantool --version' output = run_command_on_image(docker_client, image_name, command) m = re.search(r'Tarantool\s+(\d+.\d+)', output) assert m is not None installed_version = m.group(1) m = re.search(r'(\d+.\d+)', tarantool_version()) assert m is not None expected_version = m.group(1) assert installed_version == expected_version
def test_docker_pack(project, docker_image, tmpdir, docker_client): image_name = docker_image['name'] container = docker_client.containers.create(image_name) container_distribution_dir = '/usr/share/tarantool/{}'.format(project['name']) # check if distribution dir was created command = '[ -d "{}" ] && echo true || echo false'.format(container_distribution_dir) output = run_command_on_image(docker_client, image_name, command) assert output == 'true' # get distribution dir contents arhive_path = os.path.join(tmpdir, 'distribution_dir.tar') with open(arhive_path, 'wb') as f: bits, _ = container.get_archive(container_distribution_dir) for chunk in bits: f.write(chunk) with tarfile.open(arhive_path) as arch: arch.extractall(path=os.path.join(tmpdir, 'usr/share/tarantool')) os.remove(arhive_path) assert_dir_contents( files_list=recursive_listdir(os.path.join(tmpdir, 'usr/share/tarantool/', project['name'])), exp_files_list=project['distribution_files_list'], exp_rocks_content=project['rocks_content'], skip_tarantool_binaries=True ) assert_filemodes(project, tmpdir) container.remove() if tarantool_enterprise_is_used(): # check tarantool and tarantoolctl binaries command = '[ -d "/usr/share/tarantool/tarantool-enterprise/" ] && echo true || echo false' output = run_command_on_image(docker_client, image_name, command) assert output == 'true' command = 'cd /usr/share/tarantool/tarantool-enterprise/ && find .' output = run_command_on_image(docker_client, image_name, command) files_list = output.split('\n') files_list.remove('.') dir_contents = [ os.path.normpath(filename) for filename in files_list ] assert 'tarantool' in dir_contents assert 'tarantoolctl' in dir_contents else: # check if tarantool was installed command = 'yum list installed 2>/dev/null | grep tarantool' output = run_command_on_image(docker_client, image_name, command) packages_list = output.split('\n') assert any(['tarantool' in package for package in packages_list]) # check tarantool version command = 'yum info tarantool' output = run_command_on_image(docker_client, image_name, command) m = re.search(r'Version\s+:\s+(\d+)\.(\d+).', output) assert m is not None installed_version = m.groups() m = re.search(r'(\d+)\.(\d+)\.\d+', tarantool_version()) assert m is not None expected_version = m.groups() assert installed_version == expected_version