def make_containerbuild(self): return lxd.Cleanbuilder( output="snap.snap", source="project.tar", project=self.project, remote=self.remote, )
def test_cleanbuild(self, mock_pet): fake_logger = fixtures.FakeLogger(level=logging.INFO) self.useFixture(fake_logger) mock_pet.return_value = 'my-pet' project_options = ProjectOptions() lxd.Cleanbuilder('snap.snap', 'project.tar', project_options).execute() expected_arch = project_options.deb_arch self.assertEqual( 'Setting up container with project assets\n' 'Copying snapcraft cache into container\n' 'Waiting for a network connection...\n' 'Network connection established\n' 'Retrieved snap.snap\n', fake_logger.output) self.check_call_mock.assert_has_calls([ call([ 'lxc', 'launch', '-e', 'ubuntu:xenial/{}'.format(expected_arch), 'local:snapcraft-my-pet' ]), call([ 'lxc', 'config', 'set', 'local:snapcraft-my-pet', 'environment.SNAPCRAFT_SETUP_CORE', '1' ]), call([ 'lxc', 'file', 'push', 'project.tar', 'local:snapcraft-my-pet//root/project.tar' ]), call([ 'lxc', 'exec', 'local:snapcraft-my-pet', '--', 'tar', 'xvf', '/root/project.tar' ]), call([ 'lxc', 'exec', 'local:snapcraft-my-pet', '--', 'python3', '-c', 'import urllib.request; ' 'urllib.request.urlopen(' '"http://start.ubuntu.com/connectivity-check.html", ' 'timeout=5)' ]), call([ 'lxc', 'exec', 'local:snapcraft-my-pet', '--', 'apt-get', 'update' ]), call([ 'lxc', 'exec', 'local:snapcraft-my-pet', '--', 'apt-get', 'install', 'snapcraft', '-y' ]), call([ 'lxc', 'exec', 'local:snapcraft-my-pet', '--', 'snapcraft', 'snap', '--output', 'snap.snap' ]), call([ 'lxc', 'file', 'pull', 'local:snapcraft-my-pet//root/snap.snap', 'snap.snap' ]), call(['lxc', 'stop', '-f', 'local:snapcraft-my-pet']), ])
def test_cleanbuild_with_remote(self, mock_pet): mock_pet.return_value = 'my-pet' project_options = ProjectOptions() lxd.Cleanbuilder('snap.snap', 'project.tar', project_options, remote='my-remote').execute() expected_arch = project_options.deb_arch self.check_call_mock.assert_has_calls([ call(['lxc', 'launch', '-e', 'ubuntu:xenial/{}'.format(expected_arch), 'my-remote:snapcraft-my-pet']), call(['lxc', 'config', 'set', 'my-remote:snapcraft-my-pet', 'environment.SNAPCRAFT_SETUP_CORE', '1']), call(['lxc', 'file', 'push', 'project.tar', 'my-remote:snapcraft-my-pet//root/project.tar']), call(['lxc', 'exec', 'my-remote:snapcraft-my-pet', '--', 'tar', 'xvf', '/root/project.tar']), call(['lxc', 'exec', 'my-remote:snapcraft-my-pet', '--', 'python3', '-c', 'import urllib.request; ' 'urllib.request.urlopen(' '"http://start.ubuntu.com/connectivity-check.html", ' 'timeout=5)']), call(['lxc', 'exec', 'my-remote:snapcraft-my-pet', '--', 'apt-get', 'update']), call(['lxc', 'exec', 'my-remote:snapcraft-my-pet', '--', 'apt-get', 'install', 'snapcraft', '-y']), call(['lxc', 'exec', 'my-remote:snapcraft-my-pet', '--', 'snapcraft', 'snap', '--output', 'snap.snap']), call(['lxc', 'file', 'pull', 'my-remote:snapcraft-my-pet//root/snap.snap', 'snap.snap']), call(['lxc', 'stop', '-f', 'my-remote:snapcraft-my-pet']), ])
def test_cleanbuild(self, mock_pet, mock_call): fake_logger = fixtures.FakeLogger(level=logging.INFO) self.useFixture(fake_logger) mock_pet.return_value = 'my-pet' project_options = ProjectOptions() lxd.Cleanbuilder('snap.snap', 'project.tar', project_options).execute() expected_arch = project_options.deb_arch self.assertEqual( 'Setting up container with project assets\n' 'Waiting for a network connection...\n' 'Network connection established\n' 'Retrieved snap.snap\n', fake_logger.output) mock_call.assert_has_calls([ call([ 'lxc', 'remote', 'add', 'my-pet', 'https://images.linuxcontainers.org:8443' ]), call([ 'lxc', 'launch', '-e', 'my-pet:ubuntu/xenial/{}'.format(expected_arch), 'snapcraft-my-pet' ]), call([ 'lxc', 'file', 'push', 'project.tar', 'snapcraft-my-pet//root/project.tar' ]), call([ 'lxc', 'exec', 'snapcraft-my-pet', '--', 'tar', 'xvf', '/root/project.tar' ]), call([ 'lxc', 'exec', 'snapcraft-my-pet', '--', 'python3', '-c', 'import urllib.request; ' 'urllib.request.urlopen(' '"http://start.ubuntu.com/connectivity-check.html", ' 'timeout=5)' ]), call( ['lxc', 'exec', 'snapcraft-my-pet', '--', 'apt-get', 'update']), call([ 'lxc', 'exec', 'snapcraft-my-pet', '--', 'apt-get', 'install', 'snapcraft', '-y' ]), call([ 'lxc', 'exec', 'snapcraft-my-pet', '--', 'snapcraft', 'snap', '--output', 'snap.snap' ]), call([ 'lxc', 'file', 'pull', 'snapcraft-my-pet//root/snap.snap', 'snap.snap' ]), call(['lxc', 'stop', 'snapcraft-my-pet']), call(['lxc', 'remote', 'remove', 'my-pet']) ])
def _deprecated_cleanbuild(project_options, remote, config, tar_filename): if remote and not lxd._remote_is_valid(remote): raise errors.InvalidContainerRemoteError(remote) lxd.Cleanbuilder(source=tar_filename, project_options=project_options, metadata=config.get_metadata(), remote=remote).execute()
def make_containerbuild(self): return lxd.Cleanbuilder( output="snap.snap", source="project.tar", metadata={"name": "project"}, project_options=self.project_options, remote=self.remote, )
def test_cleanbuild(self, mock_pet): fake_lxd = tests.fixture_setup.FakeLXD() self.useFixture(fake_lxd) fake_logger = fixtures.FakeLogger(level=logging.INFO) self.useFixture(fake_logger) mock_pet.return_value = 'my-pet' project_options = ProjectOptions() metadata = {'name': 'project'} project_folder = 'build_project' lxd.Cleanbuilder(output='snap.snap', source='project.tar', metadata=metadata, remote=self.remote, project_options=project_options).execute() expected_arch = project_options.deb_arch self.assertEqual( 'Setting up container with project assets\n' 'Waiting for a network connection...\n' 'Network connection established\n' 'Retrieved snap.snap\n', fake_logger.output) container_name = '{}:snapcraft-my-pet'.format(self.remote) fake_lxd.check_call_mock.assert_has_calls([ call(['lxc', 'launch', '-e', 'ubuntu:xenial/{}'.format(expected_arch), container_name]), call(['lxc', 'config', 'set', container_name, 'environment.SNAPCRAFT_SETUP_CORE', '1']), call(['lxc', 'exec', container_name, '--env', 'HOME=/{}'.format(project_folder), '--', 'mkdir', project_folder]), call(['lxc', 'file', 'push', os.path.realpath('project.tar'), '{}/build_project/project.tar'.format(container_name)]), call(['lxc', 'exec', container_name, '--env', 'HOME=/{}'.format(project_folder), '--', 'tar', 'xvf', 'project.tar']), call(['lxc', 'exec', container_name, '--env', 'HOME=/{}'.format(project_folder), '--', 'python3', '-c', 'import urllib.request; ' 'urllib.request.urlopen(' '"http://start.ubuntu.com/connectivity-check.html", ' 'timeout=5)']), call(['lxc', 'exec', container_name, '--env', 'HOME=/{}'.format(project_folder), '--', 'apt-get', 'update']), call(['lxc', 'exec', container_name, '--env', 'HOME=/{}'.format(project_folder), '--', 'apt-get', 'install', 'snapcraft', '-y']), call(['lxc', 'exec', container_name, '--env', 'HOME=/{}'.format(project_folder), '--', 'snapcraft', 'snap', '--output', 'snap.snap']), call(['lxc', 'file', 'pull', '{}/{}/snap.snap'.format(container_name, project_folder), 'snap.snap']), call(['lxc', 'stop', '-f', container_name]), ])
def test_remote_does_not_exist(self, mock_sleep, mock_run): self.check_output_mock.side_effect = check_output_side_effect( fail_on_remote=True) project_options = ProjectOptions(debug=False) with ExpectedException(lxd.SnapcraftEnvironmentError, 'There are either.*my-remote.*'): lxd.Cleanbuilder('snap.snap', 'project.tar', project_options, remote='my-remote')
def _deprecated_cleanbuild(project: Project, remote: str, tar_filename: str) -> str: if remote and not lxd._remote_is_valid(remote): raise errors.InvalidContainerRemoteError(remote) builder = lxd.Cleanbuilder(source=tar_filename, project=project, remote=remote) builder.execute() return builder.snap_filename
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)) lxd.Cleanbuilder(source=tar_filename, project_options=project_options, metadata=config.get_metadata(), remote=remote).execute()
def test_wait_for_network_loops(self, mock_sleep, mock_call): mock_call.side_effect = CalledProcessError(-1, ['my-cmd']) cb = lxd.Cleanbuilder('snap.snap', 'project.tar', 'amd64') raised = self.assertRaises(CalledProcessError, cb._wait_for_network) self.assertEqual( str(raised), "Command '['my-cmd']' returned non-zero exit status -1")
def test_cleanbuild(self, mock_pet, mock_inject, mock_container_run): mock_container_run.side_effect = lambda cmd, **kwargs: cmd fake_lxd = tests.fixture_setup.FakeLXD() self.useFixture(fake_lxd) fake_logger = fixtures.FakeLogger(level=logging.INFO) self.useFixture(fake_logger) mock_pet.return_value = 'my-pet' project_options = ProjectOptions(target_deb_arch=self.target_arch) metadata = {'name': 'project'} project_folder = '/root/build_project' lxd.Cleanbuilder(output='snap.snap', source='project.tar', metadata=metadata, remote=self.remote, project_options=project_options).execute() expected_arch = 'amd64' self.assertIn('Setting up container with project assets\n' 'Waiting for a network connection...\n' 'Network connection established\n' 'Retrieved snap.snap\n', fake_logger.output) args = [] if self.target_arch: self.assertIn('Setting target machine to \'{}\'\n'.format( self.target_arch), fake_logger.output) args += ['--target-arch', self.target_arch] container_name = '{}:snapcraft-my-pet'.format(self.remote) fake_lxd.check_call_mock.assert_has_calls([ call(['lxc', 'launch', '-e', 'ubuntu:xenial/{}'.format(expected_arch), container_name]), call(['lxc', 'config', 'set', container_name, 'environment.SNAPCRAFT_SETUP_CORE', '1']), call(['lxc', 'config', 'set', container_name, 'environment.LC_ALL', 'C.UTF-8']), call(['lxc', 'file', 'push', os.path.realpath('project.tar'), '{}/root/build_project/project.tar'.format(container_name)]), ]) mock_container_run.assert_has_calls([ call(['mkdir', project_folder]), call(['tar', 'xvf', 'project.tar'], cwd=project_folder), call(['python3', '-c', 'import urllib.request; ' + 'urllib.request.urlopen(' + '"http://start.ubuntu.com/connectivity-check.html"' + ', timeout=5)']), call(['apt-get', 'update']), call(['snapcraft', 'snap', '--output', 'snap.snap', *args], cwd=project_folder), ]) fake_lxd.check_call_mock.assert_has_calls([ call(['lxc', 'file', 'pull', '{}{}/snap.snap'.format(container_name, project_folder), 'snap.snap']), call(['lxc', 'stop', '-f', container_name]), ])
def test_remote_does_not_exist(self, mock_run): self.useFixture(tests.fixture_setup.FakeLXD(fail_on_remote=True)) project_options = ProjectOptions(debug=False) metadata = {'name': 'project'} with ExpectedException(lxd.SnapcraftEnvironmentError, 'There are either.*my-remote.*'): lxd.Cleanbuilder(output='snap.snap', source='project.tar', metadata=metadata, project_options=project_options, remote='my-remote')
def cleanbuild(project_options, remote=''): if remote and not lxd._remote_is_valid(remote): raise errors.InvalidContainerRemoteError(remote) config = 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)) lxd.Cleanbuilder(source=tar_filename, project_options=project_options, metadata=config.get_metadata(), remote=remote).execute()
def test_lxc_check_fails(self, mock_sleep, mock_run): self.check_output_mock.side_effect = check_output_side_effect( fail_on_default=True) project_options = ProjectOptions(debug=False) with ExpectedException( lxd.SnapcraftEnvironmentError, 'You must have LXD installed in order to use cleanbuild. ' 'However, it is either not installed or not configured ' 'properly.\n' 'Refer to the documentation at ' 'https://linuxcontainers.org/lxd/getting-started-cli.'): lxd.Cleanbuilder('snap.snap', 'project.tar', project_options)
def test_failed_build_with_debug(self, mock_sleep, mock_run, mock_call): call_list = [] def run_effect(*args, **kwargs): call_list.append(args[0]) if args[0] == ['snapcraft', 'snap', '--output', 'snap.snap']: raise CalledProcessError(returncode=255, cmd=args[0]) mock_run.side_effect = run_effect project_options = ProjectOptions(debug=True) lxd.Cleanbuilder('snap.snap', 'project.tar', project_options).execute() self.assertIn(['bash', '-i'], call_list)
def test_remote_does_not_exist(self, mock_run): fake_lxd = tests.fixture_setup.FakeLXD() self.useFixture(fake_lxd) fake_lxd.check_output_mock.side_effect = CalledProcessError( 255, ['lxd', 'list', 'my-remote']) project_options = ProjectOptions(debug=False) metadata = {'name': 'project'} with ExpectedException(lxd.SnapcraftEnvironmentError, 'There are either.*my-remote.*'): lxd.Cleanbuilder(output='snap.snap', source='project.tar', metadata=metadata, project_options=project_options, remote='my-remote')
def test_lxc_check_fails(self, mock_run): self.useFixture(tests.fixture_setup.FakeLXD(fail_on_default=True)) project_options = ProjectOptions(debug=False) metadata = {'name': 'project'} with ExpectedException( lxd.SnapcraftEnvironmentError, 'You must have LXD installed in order to use cleanbuild. ' 'However, it is either not installed or not configured ' 'properly.\n' 'Refer to the documentation at ' 'https://linuxcontainers.org/lxd/getting-started-cli.'): lxd.Cleanbuilder(output='snap.snap', source='project.tar', metadata=metadata, project_options=project_options)
def test_wait_for_network_loops(self): fake_lxd = tests.fixture_setup.FakeLXD() self.useFixture(fake_lxd) fake_lxd.check_call_mock.side_effect = CalledProcessError( -1, ['my-cmd']) metadata = {'name': 'project'} cb = lxd.Cleanbuilder(output='snap.snap', source='project.tar', metadata=metadata, project_options='amd64') raised = self.assertRaises(CalledProcessError, cb._wait_for_network) self.assertThat(str(raised), Contains("Command '['my-cmd']'"))
def test_lxc_check_fails(self, mock_run): fake_lxd = tests.fixture_setup.FakeLXD() self.useFixture(fake_lxd) fake_lxd.check_output_mock.side_effect = FileNotFoundError('lxc') project_options = ProjectOptions(debug=False) metadata = {'name': 'project'} with ExpectedException( lxd.SnapcraftEnvironmentError, 'You must have LXD installed in order to use cleanbuild.\n' 'Refer to the documentation at ' 'https://linuxcontainers.org/lxd/getting-started-cli.'): lxd.Cleanbuilder(output='snap.snap', source='project.tar', metadata=metadata, project_options=project_options)
def test_failed_build_with_debug(self, mock_run): self.useFixture(tests.fixture_setup.FakeLXD()) call_list = [] def run_effect(*args, **kwargs): call_list.append(args[0]) if args[0] == ['snapcraft', 'snap', '--output', 'snap.snap']: raise CalledProcessError(returncode=255, cmd=args[0]) mock_run.side_effect = run_effect project_options = ProjectOptions(debug=True) metadata = {'name': 'project'} lxd.Cleanbuilder(output='snap.snap', source='project.tar', metadata=metadata, project_options=project_options).execute() self.assertIn(['bash', '-i'], call_list)
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 test_failed_container_never_created(self): fake_lxd = tests.fixture_setup.FakeLXD() self.useFixture(fake_lxd) def call_effect(*args, **kwargs): if args[0][:2] == ['lxc', 'launch']: raise CalledProcessError(returncode=255, cmd=args[0]) return fake_lxd.check_output_side_effect()(*args, **kwargs) fake_lxd.check_call_mock.side_effect = call_effect metadata = {'name': 'project'} raised = self.assertRaises( CalledProcessError, lxd.Cleanbuilder(output='snap.snap', source='project.tar', metadata=metadata, project_options=ProjectOptions()).execute) self.assertEquals(fake_lxd.status, None) # lxc launch should fail and no further commands should come after that self.assertThat(str(raised), Contains("Command '['lxc', 'launch'"))
def make_containerbuild(self): return lxd.Cleanbuilder(output='snap.snap', source='project.tar', metadata={'name': 'project'}, project_options=self.project_options, remote=self.remote)