Ejemplo n.º 1
0
 def make_containerbuild(self):
     return lxd.Cleanbuilder(
         output="snap.snap",
         source="project.tar",
         project=self.project,
         remote=self.remote,
     )
Ejemplo n.º 2
0
    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']),
        ])
Ejemplo n.º 3
0
    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']),
        ])
Ejemplo n.º 4
0
    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'])
        ])
Ejemplo n.º 5
0
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()
Ejemplo n.º 6
0
 def make_containerbuild(self):
     return lxd.Cleanbuilder(
         output="snap.snap",
         source="project.tar",
         metadata={"name": "project"},
         project_options=self.project_options,
         remote=self.remote,
     )
Ejemplo n.º 7
0
    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]),
        ])
Ejemplo n.º 8
0
    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')
Ejemplo n.º 9
0
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
Ejemplo n.º 10
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))
    lxd.Cleanbuilder(source=tar_filename,
                     project_options=project_options,
                     metadata=config.get_metadata(), remote=remote).execute()
Ejemplo n.º 11
0
    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")
Ejemplo n.º 12
0
    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]),
        ])
Ejemplo n.º 13
0
    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')
Ejemplo n.º 14
0
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()
Ejemplo n.º 15
0
    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)
Ejemplo n.º 16
0
    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)
Ejemplo n.º 17
0
    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')
Ejemplo n.º 18
0
    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)
Ejemplo n.º 19
0
    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']'"))
Ejemplo n.º 20
0
    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)
Ejemplo n.º 21
0
    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)
Ejemplo n.º 22
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()
Ejemplo n.º 23
0
    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'"))
Ejemplo n.º 24
0
 def make_containerbuild(self):
     return lxd.Cleanbuilder(output='snap.snap', source='project.tar',
                             metadata={'name': 'project'},
                             project_options=self.project_options,
                             remote=self.remote)