def verify_container_mountpoints(self, container_name): """ Verify that all mount points exist within the target system. If a target mount point is missing, raise a fatal error. Hint: It is assumed that the mount points within the target get created during the configuration phase. """ if self._suppress_shared_folders(): return test_cmd = [lxc_exec(), 'exec', container_name, '--', 'true'] result = run(test_cmd, check=False, stderr=subprocess.PIPE) if result.returncode != 0: raise FatalError(( '''The communication with the container '{}' failed with the message '{}'.''' ).format(container_name, result.stderr)) mountpoints = self.get_mountpoints() for mountpoint in mountpoints: cmd = [ lxc_exec(), 'exec', container_name, '--', 'test', '-d', mountpoint ] if run(cmd, check=False).returncode != 0: raise FatalError(( '''Please make sure that '{}' is valid mount point in the container '{}'.\n''' '''Hint: Use an appropriate playbook that generates those mount points\n''' ''' by using the variable 'edi_shared_folder_mountpoints'.''' ).format(mountpoint, container_name))
def get_container_ip_addr(container_name, interface): cmd = [ lxc_exec(), 'exec', container_name, '--', 'ip', '-4', 'addr', 'show', interface ] raw_ip_result = run(cmd, stdout=subprocess.PIPE).stdout return re.findall(r'^\s*inet\s([0-9\.]*)/.*', raw_ip_result, re.MULTILINE)[0]
def test_is_bridge_available(): bridge_name = "edibrtesttest42" assert not is_bridge_available(bridge_name) create_bridge(bridge_name) assert is_bridge_available(bridge_name) with pytest.raises(CalledProcessError): create_bridge(bridge_name) cmd = [lxc_exec(), "network", "delete", bridge_name] run(cmd) assert not is_bridge_available(bridge_name)
def verify_shared_folder(container_name): base_dict = get_base_dictionary() random_file = get_random_string(20) workspace_folder = 'edi-workspace' cmd = [lxc_exec(), 'exec', container_name, '--', 'sudo', '-u', base_dict.get('edi_current_user_name'), 'touch', os.path.join(base_dict.get('edi_current_user_target_home_directory'), workspace_folder, random_file)] run(cmd) shared_file = os.path.join(base_dict.get('edi_current_user_host_home_directory'), workspace_folder, random_file) stat = os.stat(shared_file) assert stat.st_gid == base_dict.get('edi_current_user_gid') assert stat.st_uid == base_dict.get('edi_current_user_uid') os.remove(shared_file)
def test_create_buster_image(capsys): print(os.getcwd()) with workspace(): edi_exec = os.path.join(get_project_root(), 'bin', 'edi') project_name = 'pytest-{}'.format(get_random_string(6)) config_command = [ edi_exec, 'config', 'init', project_name, 'debian-buster-{}'.format(get_debian_architecture()) ] run(config_command) # run as non root parser = edi._setup_command_line_interface() cli_args = parser.parse_args( ['image', 'create', '{}-develop.yml'.format(project_name)]) Create().run_cli(cli_args) out, err = capsys.readouterr() print(out) assert not err lxc_compression_algo = get_server_image_compression_algorithm() lxc_export_extension = get_file_extension_from_image_compression_algorithm( lxc_compression_algo) images = [ os.path.join( get_artifact_dir(), '{}-develop_edicommand_image_bootstrap_di.tar.gz'.format( project_name)), os.path.join( get_artifact_dir(), '{}-develop_edicommand_lxc_prepare_di.tar.gz'.format( project_name)), os.path.join( get_artifact_dir(), '{}-develop_edicommand_lxc_export{}'.format( project_name, lxc_export_extension)), os.path.join(get_artifact_dir(), '{}-develop.result'.format(project_name)), ] for image in images: assert os.path.isfile(image) image_store_items = [ "{}-develop_edicommand_lxc_import_di".format(project_name), "{}-develop_edicommand_lxc_publish".format(project_name) ] lxc_image_list_cmd = [lxc_exec(), 'image', 'list'] result = run(lxc_image_list_cmd, stdout=subprocess.PIPE) for image_store_item in image_store_items: assert image_store_item in result.stdout parser = edi._setup_command_line_interface() cli_args = parser.parse_args([ 'image', 'create', '--clean', '{}-develop.yml'.format(project_name) ]) Create().run_cli(cli_args) parser = edi._setup_command_line_interface() cli_args = parser.parse_args([ 'image', 'create', '--recursive-clean', '8', '{}-develop.yml'.format(project_name) ]) Create().run_cli(cli_args) for image in images: assert not os.path.isfile(image) result = run(lxc_image_list_cmd, stdout=subprocess.PIPE) for image_store_item in image_store_items: assert image_store_item not in result.stdout
def test_build_stretch_container(capsys, datadir): with workspace(): edi_exec = os.path.join(get_project_root(), 'bin', 'edi') project_name = 'pytest-{}'.format(get_random_string(6)) config_command = [ edi_exec, 'config', 'init', project_name, 'debian-stretch-{}'.format(get_debian_architecture()) ] run(config_command) # run as non root # enable ssh server and create a default user modify_develop_overlay(project_name) # copy pub key into default pub key folder prepare_pub_key(datadir) container_name = 'pytest-{}'.format(get_random_string(6)) parser = edi._setup_command_line_interface() cli_args = parser.parse_args([ '-v', 'lxc', 'configure', container_name, '{}-develop.yml'.format(project_name) ]) Configure().run_cli(cli_args) out, err = capsys.readouterr() print(out) assert not err images = [ os.path.join( get_artifact_dir(), '{}-develop_edicommand_image_bootstrap.tar.gz'.format( project_name)), os.path.join( get_artifact_dir(), '{}-develop_edicommand_lxc_prepare.tar.gz'.format( project_name)) ] for image in images: assert os.path.isfile(image) lxc_image_list_cmd = [lxc_exec(), 'image', 'list'] result = run(lxc_image_list_cmd, stdout=subprocess.PIPE) assert project_name in result.stdout parser = edi._setup_command_line_interface() cli_args = parser.parse_args( ['-v', 'clean', '{}-develop.yml'.format(project_name)]) Clean().run_cli(cli_args) for image in images: assert not os.path.isfile(image) result = run(lxc_image_list_cmd, stdout=subprocess.PIPE) assert project_name not in result.stdout verification_command = [ lxc_exec(), 'exec', container_name, '--', 'cat', '/etc/os-release' ] result = run(verification_command, stdout=subprocess.PIPE) assert '''VERSION_ID="9"''' in result.stdout assert 'ID=debian' in result.stdout os.chmod(os.path.join(str(datadir), 'keys'), 0o700) os.chmod(os.path.join(str(datadir), 'keys', 'test_id_rsa'), 0o600) container_ip = get_container_ip_addr(container_name, 'lxcif0') ssh_cmd = [ 'ssh', '-i', str(os.path.join(str(datadir), 'keys', 'test_id_rsa')), '-o', 'UserKnownHostsFile=/dev/null', '-o', 'StrictHostKeyChecking=no', 'testuser@{}'.format(container_ip), 'true' ] # ssh command should work without password due to proper ssh key setup! run(ssh_cmd, sudo=True, timeout=5) verify_shared_folder(container_name) stop_command = [lxc_exec(), 'stop', container_name] run(stop_command) delete_command = [lxc_exec(), 'delete', container_name] run(delete_command)