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
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))
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))
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)
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)
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
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)
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
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)
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
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
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)
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
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()
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()
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))
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()
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()
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)
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))
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))
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"))