Пример #1
0
    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))
Пример #2
0
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]
Пример #3
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)
Пример #4
0
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)
Пример #5
0
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
Пример #6
0
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)