Esempio n. 1
0
    def test_filename(self, snap, expected):
        if "version" not in snap:
            snap_name = common.format_snap_name(snap, allow_empty_version=True)
        else:
            snap_name = common.format_snap_name(snap)

        assert snap_name == expected
Esempio n. 2
0
    def test_filename(self):
        if hasattr(self, 'allow_empty_version'):
            snap_name = common.format_snap_name(
                self.snap, allow_empty_version=self.allow_empty_version)
        else:
            snap_name = common.format_snap_name(self.snap)

        self.assertThat(snap_name, Equals(self.expected))
Esempio n. 3
0
    def test_filename(self):
        if hasattr(self, "allow_empty_version"):
            snap_name = common.format_snap_name(
                self.snap, allow_empty_version=self.allow_empty_version
            )
        else:
            snap_name = common.format_snap_name(self.snap)

        self.assertThat(snap_name, Equals(self.expected))
Esempio n. 4
0
    def __init__(self,
                 *,
                 output,
                 source,
                 project_options,
                 metadata,
                 container_name,
                 remote=None):
        if not output:
            output = common.format_snap_name(metadata)
        self._snap_output = output
        self._source = os.path.realpath(source)
        self._project_options = project_options
        self._metadata = metadata
        self._user = '******'
        self._project_folder = '/root/build_{}'.format(metadata['name'])

        if not remote:
            remote = _get_default_remote()
        _verify_remote(remote)
        self._container_name = '{}:snapcraft-{}'.format(remote, container_name)
        self._image = 'ubuntu:xenial'
        # Use a temporary folder the 'lxd' snap can access
        self._lxd_common_dir = os.path.expanduser(
            os.path.join('~', 'snap', 'lxd', 'common'))
        os.makedirs(self._lxd_common_dir, exist_ok=True)
Esempio n. 5
0
def pack(directory, output=None):
    mksquashfs_path = file_utils.get_tool_path("mksquashfs")

    snap = _snap_data_from_dir(directory)
    _run_snap_pack_verification(directory=directory)

    output_snap_name = output or common.format_snap_name(snap)
    # If a .snap-build exists at this point, when we are about to override
    # the snap blob, it is stale. We rename it so user have a chance to
    # recover accidentally lost assertions.
    snap_build = output_snap_name + "-build"
    if os.path.isfile(snap_build):
        _new = "{}.{}".format(snap_build, int(time.time()))
        logger.warning("Renaming stale build assertion to {}".format(_new))
        os.rename(snap_build, _new)

    _run_mksquashfs(
        mksquashfs_path,
        directory=directory,
        snap_name=snap["name"],
        snap_type=snap["type"],
        output_snap_name=output_snap_name,
    )

    return output_snap_name
    def __init__(self,
                 *,
                 source,
                 project_options,
                 metadata,
                 container_name,
                 output=None,
                 remote=None):
        if output is None:
            output = common.format_snap_name(metadata,
                                             allow_empty_version=True)
        self._snap_output = output
        self._source = os.path.realpath(source)
        self._project_options = project_options
        self._metadata = metadata
        self._user = '******'
        self._project_folder = '/root/build_{}'.format(metadata['name'])

        self._remote = remote
        self._container_name = 'snapcraft-{}'.format(container_name)
        self._image = 'ubuntu:xenial'
        # Use a temporary folder the 'lxd' snap can access
        self._lxd_common_dir = os.path.expanduser(
            os.path.join('~', 'snap', 'lxd', 'common'))
        os.makedirs(self._lxd_common_dir, exist_ok=True)
Esempio n. 7
0
def snap(project_options, directory=None, output=None):
    if directory:
        prime_dir = os.path.abspath(directory)
        snap = _snap_data_from_dir(prime_dir)
    else:
        # make sure the full lifecycle is executed
        prime_dir = project_options.prime_dir
        execute('prime', project_options)
        snap = _snap_data_from_dir(prime_dir)

    snap_name = output or common.format_snap_name(snap)

    # If a .snap-build exists at this point, when we are about to override
    # the snap blob, it is stale. We rename it so user have a chance to
    # recover accidentally lost assertions.
    snap_build = snap_name + '-build'
    if os.path.isfile(snap_build):
        _new = '{}.{}'.format(snap_build, int(time.time()))
        logger.warning('Renaming stale build assertion to {}'.format(_new))
        os.rename(snap_build, _new)

    # These options need to match the review tools:
    # http://bazaar.launchpad.net/~click-reviewers/click-reviewers-tools/trunk/view/head:/clickreviews/common.py#L38
    mksquashfs_args = ['-noappend', '-comp', 'xz', '-no-xattrs']
    if snap['type'] != 'os':
        mksquashfs_args.append('-all-root')

    with Popen(['mksquashfs', prime_dir, snap_name] + mksquashfs_args,
               stdout=PIPE,
               stderr=STDOUT) as proc:
        ret = None
        if is_dumb_terminal():
            logger.info('Snapping {!r} ...'.format(snap['name']))
            ret = proc.wait()
        else:
            message = '\033[0;32m\rSnapping {!r}\033[0;32m '.format(
                snap['name'])
            progress_indicator = ProgressBar(
                widgets=[message, AnimatedMarker()], maxval=7)
            progress_indicator.start()

            ret = proc.poll()
            count = 0

            while ret is None:
                if count >= 7:
                    progress_indicator.start()
                    count = 0
                progress_indicator.update(count)
                count += 1
                time.sleep(.2)
                ret = proc.poll()
        print('')
        if ret != 0:
            logger.error(proc.stdout.read().decode('utf-8'))
            raise RuntimeError('Failed to create snap {!r}'.format(snap_name))

        logger.debug(proc.stdout.read().decode('utf-8'))

    return snap_name
Esempio n. 8
0
    def __init__(
        self,
        *,
        source,
        project_options,
        metadata,
        container_name,
        output=None,
        remote=None
    ):
        if output is None:
            output = common.format_snap_name(metadata, allow_empty_version=True)
        self._snap_output = output
        self._source = os.path.realpath(source)
        self._project_options = project_options
        self._metadata = metadata
        self._user = "******"
        self._project_folder = "/root/build_{}".format(metadata["name"])

        self._remote = remote
        self._container_name = "snapcraft-{}".format(container_name)
        self._image = "ubuntu:xenial"
        # Use a temporary folder the 'lxd' snap can access
        self._lxd_common_dir = os.path.expanduser(
            os.path.join("~", "snap", "lxd", "common")
        )
        os.makedirs(self._lxd_common_dir, exist_ok=True)
Esempio n. 9
0
def pack(directory, output=None):
    mksquashfs_path = file_utils.get_tool_path("mksquashfs")

    snap = _snap_data_from_dir(directory)
    # Verify that the snap command is available and use it to
    # validate the layout.
    # The snap command will most likely be found as it lives in
    # core and the snapcraft snap lives on top of it (on the side
    # rather).
    if os.path.exists(_SNAP_PATH):
        _run_snap_pack_verification(directory=directory)
    elif snap.get("license"):
        logger.warning(
            "Could not find {!r}, validation of the license string will only "
            "take place once pushed to the store.".format(_SNAP_PATH))

    output_snap_name = output or common.format_snap_name(snap)
    # If a .snap-build exists at this point, when we are about to override
    # the snap blob, it is stale. We rename it so user have a chance to
    # recover accidentally lost assertions.
    snap_build = output_snap_name + "-build"
    if os.path.isfile(snap_build):
        _new = "{}.{}".format(snap_build, int(time.time()))
        logger.warning("Renaming stale build assertion to {}".format(_new))
        os.rename(snap_build, _new)

    _run_mksquashfs(
        mksquashfs_path,
        directory=directory,
        snap_name=snap["name"],
        snap_type=snap["type"],
        output_snap_name=output_snap_name,
    )

    return output_snap_name
Esempio n. 10
0
    def __init__(self, *, output, source, project_options,
                 metadata, container_name, remote=None):
        if not output:
            output = common.format_snap_name(metadata)
        self._snap_output = output
        self._source = os.path.realpath(source)
        self._project_options = project_options
        self._metadata = metadata
        self._project_folder = '/root/build_{}'.format(metadata['name'])

        if not remote:
            remote = _get_default_remote()
        _verify_remote(remote)
        self._container_name = '{}:snapcraft-{}'.format(remote, container_name)
        server_environment = self._get_remote_info()['environment']
        # Use the server architecture to avoid emulation overhead
        try:
            kernel = server_environment['kernel_architecture']
        except KeyError:
            kernel = server_environment['kernelarchitecture']
        self._server_arch = _get_deb_arch(kernel)
        if not self._server_arch:
            raise ContainerConnectionError(
                'Unrecognized server architecture {}'.format(kernel))
        self._image = 'ubuntu:xenial/{}'.format(self._server_arch)
        # Use a temporary folder the 'lxd' snap can access
        lxd_common_dir = os.path.expanduser(
            os.path.join('~', 'snap', 'lxd', 'common'))
        os.makedirs(lxd_common_dir, exist_ok=True)
        self.tmp_dir = tempfile.mkdtemp(prefix='snapcraft', dir=lxd_common_dir)
Esempio n. 11
0
def pack(directory, output=None):
    mksquashfs_path = file_utils.get_tool_path('mksquashfs')

    # Check for our prerequesite external command early
    repo.check_for_command(mksquashfs_path)

    snap = _snap_data_from_dir(directory)
    output_snap_name = output or common.format_snap_name(snap)

    # If a .snap-build exists at this point, when we are about to override
    # the snap blob, it is stale. We rename it so user have a chance to
    # recover accidentally lost assertions.
    snap_build = output_snap_name + '-build'
    if os.path.isfile(snap_build):
        _new = '{}.{}'.format(snap_build, int(time.time()))
        logger.warning('Renaming stale build assertion to {}'.format(_new))
        os.rename(snap_build, _new)

    _run_mksquashfs(mksquashfs_path,
                    directory=directory,
                    snap_name=snap['name'],
                    snap_type=snap['type'],
                    output_snap_name=output_snap_name)

    return output_snap_name
Esempio n. 12
0
def pack(directory, output=None):
    mksquashfs_path = file_utils.get_tool_path("mksquashfs")

    # Check for our prerequesite external command early
    repo.check_for_command(mksquashfs_path)

    snap = _snap_data_from_dir(directory)
    output_snap_name = output or common.format_snap_name(snap)

    # If a .snap-build exists at this point, when we are about to override
    # the snap blob, it is stale. We rename it so user have a chance to
    # recover accidentally lost assertions.
    snap_build = output_snap_name + "-build"
    if os.path.isfile(snap_build):
        _new = "{}.{}".format(snap_build, int(time.time()))
        logger.warning("Renaming stale build assertion to {}".format(_new))
        os.rename(snap_build, _new)

    _run_mksquashfs(
        mksquashfs_path,
        directory=directory,
        snap_name=snap["name"],
        snap_type=snap["type"],
        output_snap_name=output_snap_name,
    )

    return output_snap_name
Esempio n. 13
0
    def __init__(self,
                 *,
                 output,
                 source,
                 project_options,
                 metadata,
                 container_name,
                 remote=None):
        if not output:
            output = common.format_snap_name(metadata)
        self._snap_output = output
        self._source = os.path.realpath(source)
        self._project_options = project_options
        self._metadata = metadata
        self._project_folder = 'build_{}'.format(metadata['name'])

        if not remote:
            remote = _get_default_remote()
        _verify_remote(remote)
        self._container_name = '{}:snapcraft-{}'.format(remote, container_name)
        # Use the server architecture to avoid emulation overhead
        kernel = self._get_remote_info()['environment']['kernel_architecture']
        deb_arch = _get_deb_arch(kernel)
        if not deb_arch:
            raise SnapcraftEnvironmentError(
                'Unrecognized server architecture {}'.format(kernel))
        self._host_arch = deb_arch
        self._image = 'ubuntu:xenial/{}'.format(deb_arch)
Esempio n. 14
0
def snap(project_options, directory=None, output=None):
    if directory:
        snap_dir = os.path.abspath(directory)
        snap = _snap_data_from_dir(snap_dir)
    else:
        # make sure the full lifecycle is executed
        snap_dir = project_options.snap_dir
        snap = execute('prime', project_options)

    snap_name = output or common.format_snap_name(snap)

    # If a .snap-build exists at this point, when we are about to override
    # the snap blob, it is stale. We rename it so user have a chance to
    # recover accidentally lost assertions.
    snap_build = snap_name + '-build'
    if os.path.isfile(snap_build):
        _new = '{}.{}'.format(snap_build, int(time.time()))
        logger.warning('Renaming stale build assertion to {}'.format(_new))
        os.rename(snap_build, _new)

    # These options need to match the review tools:
    # http://bazaar.launchpad.net/~click-reviewers/click-reviewers-tools/trunk/view/head:/clickreviews/common.py#L38
    mksquashfs_args = ['-noappend', '-comp', 'xz', '-no-xattrs']
    if snap['type'] != 'os':
        mksquashfs_args.append('-all-root')

    with Popen(['mksquashfs', snap_dir, snap_name] + mksquashfs_args,
               stdout=PIPE, stderr=STDOUT) as proc:
        ret = None
        if is_dumb_terminal():
            logger.info('Snapping {!r} ...'.format(snap['name']))
            ret = proc.wait()
        else:
            message = '\033[0;32m\rSnapping {!r}\033[0;32m '.format(
                snap['name'])
            progress_indicator = ProgressBar(
                widgets=[message, AnimatedMarker()], maxval=7)
            progress_indicator.start()

            ret = proc.poll()
            count = 0

            while ret is None:
                if count >= 7:
                    progress_indicator.start()
                    count = 0
                progress_indicator.update(count)
                count += 1
                time.sleep(.2)
                ret = proc.poll()
        print('')
        if ret != 0:
            logger.error(proc.stdout.read().decode('utf-8'))
            raise RuntimeError('Failed to create snap {!r}'.format(snap_name))

        logger.debug(proc.stdout.read().decode('utf-8'))

    logger.info('Snapped {}'.format(snap_name))
    return snap_name
Esempio n. 15
0
def cleanbuild(project_options, remote=''):
    config = snapcraft.internal.load_config(project_options)
    tar_filename = '{}_{}_source.tar.bz2'.format(
        config.data['name'], config.data['version'])

    with tarfile.open(tar_filename, 'w:bz2') as t:
        t.add(os.path.curdir, filter=_create_tar_filter(tar_filename))

    snap_filename = common.format_snap_name(config.data)
    lxd.Cleanbuilder(snap_filename, tar_filename, project_options,
                     remote=remote).execute()
Esempio n. 16
0
def cleanbuild(project_options, remote=''):
    config = snapcraft.internal.load_config(project_options)
    tar_filename = '{}_{}_source.tar.bz2'.format(config.data['name'],
                                                 config.data['version'])

    with tarfile.open(tar_filename, 'w:bz2') as t:
        t.add(os.path.curdir, filter=_create_tar_filter(tar_filename))

    snap_filename = common.format_snap_name(config.data)
    lxd.Cleanbuilder(snap_filename,
                     tar_filename,
                     project_options,
                     remote=remote).execute()
Esempio n. 17
0
def snap(project_options, directory=None, output=None):
    if directory:
        snap_dir = os.path.abspath(directory)
        snap = _snap_data_from_dir(snap_dir)
    else:
        # make sure the full lifecycle is executed
        snap_dir = project_options.snap_dir
        snap = execute('prime', project_options)

    snap_name = output or common.format_snap_name(snap)

    # These options need to match the review tools:
    # http://bazaar.launchpad.net/~click-reviewers/click-reviewers-tools/trunk/view/head:/clickreviews/common.py#L38
    mksquashfs_args = ['-noappend', '-comp', 'xz', '-no-xattrs']
    if snap['type'] != 'os':
        mksquashfs_args.append('-all-root')

    with Popen(['mksquashfs', snap_dir, snap_name] + mksquashfs_args,
               stdout=PIPE,
               stderr=STDOUT) as proc:
        ret = None
        if os.isatty(sys.stdout.fileno()):
            message = '\033[0;32m\rSnapping {!r}\033[0;32m '.format(
                snap['name'])
            progress_indicator = ProgressBar(
                widgets=[message, AnimatedMarker()], maxval=7)
            progress_indicator.start()

            ret = proc.poll()
            count = 0

            while ret is None:
                if count >= 7:
                    progress_indicator.start()
                    count = 0
                progress_indicator.update(count)
                count += 1
                time.sleep(.2)
                ret = proc.poll()
        else:
            logger.info('Snapping {!r} ...'.format(snap['name']))
            ret = proc.wait()
        print('')
        if ret != 0:
            logger.error(proc.stdout.read().decode('utf-8'))
            raise RuntimeError('Failed to create snap {!r}'.format(snap_name))

        logger.debug(proc.stdout.read().decode('utf-8'))

    logger.info('Snapped {}'.format(snap_name))
Esempio n. 18
0
def snap(project_options, directory=None, output=None):
    if directory:
        snap_dir = os.path.abspath(directory)
        snap = _snap_data_from_dir(snap_dir)
    else:
        # make sure the full lifecycle is executed
        snap_dir = project_options.snap_dir
        snap = execute('prime', project_options)

    snap_name = output or common.format_snap_name(snap)

    # These options need to match the review tools:
    # http://bazaar.launchpad.net/~click-reviewers/click-reviewers-tools/trunk/view/head:/clickreviews/common.py#L38
    mksquashfs_args = ['-noappend', '-comp', 'xz', '-no-xattrs']
    if snap['type'] != 'os':
        mksquashfs_args.append('-all-root')

    with Popen(['mksquashfs', snap_dir, snap_name] + mksquashfs_args,
               stdout=PIPE, stderr=STDOUT) as proc:
        ret = None
        if os.isatty(sys.stdout.fileno()):
            message = '\033[0;32m\rSnapping {!r}\033[0;32m '.format(
                    snap['name'])
            progress_indicator = ProgressBar(
                widgets=[message, AnimatedMarker()], maxval=7)
            progress_indicator.start()

            ret = proc.poll()
            count = 0

            while ret is None:
                if count >= 7:
                    progress_indicator.start()
                    count = 0
                progress_indicator.update(count)
                count += 1
                time.sleep(.2)
                ret = proc.poll()
        else:
            logger.info('Snapping {!r} ...'.format(snap['name']))
            ret = proc.wait()
        print('')
        if ret != 0:
            logger.error(proc.stdout.read().decode('utf-8'))
            raise RuntimeError('Failed to create snap {!r}'.format(snap_name))

        logger.debug(proc.stdout.read().decode('utf-8'))

    logger.info('Snapped {}'.format(snap_name))
Esempio n. 19
0
def cleanbuild(project_options):
    if not repo.is_package_installed('lxd'):
        raise EnvironmentError(
            'The lxd package is not installed, in order to use `cleanbuild` '
            'you must install lxd onto your system. Refer to the '
            '"Ubuntu Desktop and Ubuntu Server" section on '
            'https://linuxcontainers.org/lxd/getting-started-cli/'
            '#ubuntu-desktop-and-ubuntu-server to enable a proper setup.')

    config = snapcraft.internal.load_config(project_options)
    tar_filename = '{}_{}_source.tar.bz2'.format(
        config.data['name'], config.data['version'])

    with tarfile.open(tar_filename, 'w:bz2') as t:
        t.add(os.path.curdir, filter=_create_tar_filter(tar_filename))

    snap_filename = common.format_snap_name(config.data)
    lxd.Cleanbuilder(snap_filename, tar_filename, project_options).execute()
Esempio n. 20
0
def cleanbuild(project_options):
    if not repo.is_package_installed('lxd'):
        raise EnvironmentError(
            'The lxd package is not installed, in order to use `cleanbuild` '
            'you must install lxd onto your system. Refer to the '
            '"Ubuntu Desktop and Ubuntu Server" section on '
            'https://linuxcontainers.org/lxd/getting-started-cli/'
            '#ubuntu-desktop-and-ubuntu-server to enable a proper setup.')

    config = snapcraft.internal.load_config(project_options)
    tar_filename = '{}_{}_source.tar.bz2'.format(config.data['name'],
                                                 config.data['version'])

    with tarfile.open(tar_filename, 'w:bz2') as t:
        t.add(os.path.curdir, filter=_create_tar_filter(tar_filename))

    snap_filename = common.format_snap_name(config.data)
    lxd.Cleanbuilder(snap_filename, tar_filename, project_options).execute()
Esempio n. 21
0
    def __init__(self,
                 *,
                 output,
                 source,
                 project_options,
                 metadata,
                 container_name,
                 remote=None):
        if not output:
            output = common.format_snap_name(metadata)
        self._snap_output = output
        self._source = os.path.realpath(source)
        self._project_options = project_options
        self._metadata = metadata
        self._project_folder = 'build_{}'.format(metadata['name'])

        if not remote:
            remote = _get_default_remote()
        _verify_remote(remote)
        self._container_name = '{}:snapcraft-{}'.format(remote, container_name)
Esempio n. 22
0
def snap(project_options, directory=None, output=None):
    if directory:
        snap_dir = os.path.abspath(directory)
        snap = _snap_data_from_dir(snap_dir)
    else:
        # make sure the full lifecycle is executed
        snap_dir = project_options.snap_dir
        snap = execute('strip', project_options)

    snap_name = output or common.format_snap_name(snap)

    logger.info('Snapping {}'.format(snap_name))
    # These options need to match the review tools:
    # http://bazaar.launchpad.net/~click-reviewers/click-reviewers-tools/trunk/view/head:/clickreviews/common.py#L38
    mksquashfs_args = ['-noappend', '-comp', 'xz', '-no-xattrs']
    if snap['type'] != 'os':
        mksquashfs_args.append('-all-root')

    subprocess.check_call(['mksquashfs', snap_dir, snap_name] +
                          mksquashfs_args)
    logger.info('Snapped {}'.format(snap_name))
Esempio n. 23
0
def snap(project_options, directory=None, output=None):
    if directory:
        snap_dir = os.path.abspath(directory)
        snap = _snap_data_from_dir(snap_dir)
    else:
        # make sure the full lifecycle is executed
        snap_dir = project_options.snap_dir
        snap = execute('strip', project_options)

    snap_name = output or common.format_snap_name(snap)

    logger.info('Snapping {}'.format(snap_name))
    # These options need to match the review tools:
    # http://bazaar.launchpad.net/~click-reviewers/click-reviewers-tools/trunk/view/head:/clickreviews/common.py#L38
    mksquashfs_args = ['-noappend', '-comp', 'xz', '-no-xattrs']
    if snap['type'] != 'os':
        mksquashfs_args.append('-all-root')

    subprocess.check_call(
        ['mksquashfs', snap_dir, snap_name] + mksquashfs_args)
    logger.info('Snapped {}'.format(snap_name))
Esempio n. 24
0
def test_version_missing_and_not_allowed_is_error():
    # This is to not experience unexpected results given the
    # fact that version is not allowed.
    with pytest.raises(KeyError):
        common.format_snap_name(dict(name="name"))