示例#1
0
    def test_containers_prefixed(self):
        service = Service('db',
                          client=self.mock_client,
                          image='foo',
                          project='myproject')

        self.mock_client.containers.return_value = [
            {
                'Image': 'busybox',
                'Id': 'OUT_1',
                'Names': ['/swarm-host-1/myproject', '/swarm-host-1/foo/bar']
            },
            {
                'Image': 'busybox',
                'Id': 'OUT_2',
                'Names': ['/swarm-host-1/myproject_db']
            },
            {
                'Image': 'busybox',
                'Id': 'OUT_3',
                'Names': ['/swarm-host-1/db_1']
            },
            {
                'Image':
                'busybox',
                'Id':
                'IN_1',
                'Names': [
                    '/swarm-host-1/myproject_db_1',
                    '/swarm-host-1/myproject_web_1/db'
                ]
            },
        ]
        self.assertEqual([c.id for c in service.containers()], ['IN_1'])
示例#2
0
    def test_create_container_no_build(self):
        self.mock_client.images.return_value = []
        service = Service('foo', client=self.mock_client, build='.')
        service.create_container(do_build=False)

        self.assertFalse(self.mock_client.images.called)
        self.assertFalse(self.mock_client.build.called)
示例#3
0
    def test_get_volumes_from_container(self):
        container_id = 'aabbccddee'
        service = Service(
            'test',
            volumes_from=[mock.Mock(id=container_id, spec=Container)])

        self.assertEqual(service._get_volumes_from(), [container_id])
示例#4
0
 def test_pull_image_no_tag(self):
     service = Service('foo', client=self.mock_client, image='ababab')
     service.pull()
     self.mock_client.pull.assert_called_once_with('ababab',
                                                   tag='latest',
                                                   insecure_registry=False,
                                                   stream=True)
示例#5
0
    def test_get_volumes_from_container(self):
        container_id = 'aabbccddee'
        service = Service(
            'test',
            volumes_from=[mock.Mock(id=container_id, spec=Container)])

        self.assertEqual(service._get_volumes_from(), [container_id])
示例#6
0
    def test_create_container_no_build(self):
        self.mock_client.images.return_value = []
        service = Service('foo', client=self.mock_client, build='.')
        service.create_container(do_build=False)

        self.assertFalse(self.mock_client.images.called)
        self.assertFalse(self.mock_client.build.called)
示例#7
0
文件: service_test.py 项目: Malet/fig
 def test_split_domainname_fqdn(self):
     service = Service('foo',
             hostname='name.domain.tld',
             client=self.mock_client)
     self.mock_client.containers.return_value = []
     opts = service._get_container_create_options({'image': 'foo'})
     self.assertEqual(opts['hostname'], 'name', 'hostname')
     self.assertEqual(opts['domainname'], 'domain.tld', 'domainname')
示例#8
0
 def test_split_domainname_fqdn(self):
     service = Service('foo',
             hostname='name.domain.tld',
             client=self.mock_client)
     self.mock_client.containers.return_value = []
     opts = service._get_container_create_options({'image': 'foo'})
     self.assertEqual(opts['hostname'], 'name', 'hostname')
     self.assertEqual(opts['domainname'], 'domain.tld', 'domainname')
示例#9
0
    def test_create_container_with_build(self):
        self.mock_client.images.return_value = []
        service = Service('foo', client=self.mock_client, build='.')
        service.build = mock.create_autospec(service.build)
        service.create_container(do_build=True)

        self.mock_client.images.assert_called_once_with(name=service.full_name)
        service.build.assert_called_once_with()
示例#10
0
 def test_pull_image_no_tag(self):
     service = Service('foo', client=self.mock_client, image='ababab')
     service.pull()
     self.mock_client.pull.assert_called_once_with(
         'ababab',
         tag='latest',
         insecure_registry=False,
         stream=True)
示例#11
0
    def test_create_container_with_build(self):
        self.mock_client.images.return_value = []
        service = Service('foo', client=self.mock_client, build='.')
        service.build = mock.create_autospec(service.build)
        service.create_container(do_build=True)

        self.mock_client.images.assert_called_once_with(name=service.full_name)
        service.build.assert_called_once_with()
示例#12
0
 def test_pull_image(self, mock_log):
     service = Service('foo', client=self.mock_client, image='someimage:sometag')
     service.pull(insecure_registry=True)
     self.mock_client.pull.assert_called_once_with(
         'someimage',
         tag='sometag',
         insecure_registry=True,
         stream=True)
     mock_log.info.assert_called_once_with('Pulling foo (someimage:sometag)...')
示例#13
0
    def test_get_container(self, mock_container_class):
        container_dict = dict(Name='default_foo_2')
        self.mock_client.containers.return_value = [container_dict]
        service = Service('foo', image='foo', client=self.mock_client)

        container = service.get_container(number=2)
        self.assertEqual(container, mock_container_class.from_ps.return_value)
        mock_container_class.from_ps.assert_called_once_with(
            self.mock_client, container_dict)
示例#14
0
    def test_get_container(self, mock_container_class):
        container_dict = dict(Name='default_foo_2')
        self.mock_client.containers.return_value = [container_dict]
        service = Service('foo', client=self.mock_client)

        container = service.get_container(number=2)
        self.assertEqual(container, mock_container_class.from_ps.return_value)
        mock_container_class.from_ps.assert_called_once_with(
            self.mock_client, container_dict)
示例#15
0
    def test_get_volumes_from_service_container_exists(self):
        container_ids = ['aabbccddee', '12345']
        from_service = mock.create_autospec(Service)
        from_service.containers.return_value = [
            mock.Mock(id=container_id, spec=Container)
            for container_id in container_ids
        ]
        service = Service('test', volumes_from=[from_service])

        self.assertEqual(service._get_volumes_from(), container_ids)
示例#16
0
    def test_containers_prefixed(self):
        service = Service('db', client=self.mock_client, project='myproject')

        self.mock_client.containers.return_value = [
            {'Image': 'busybox', 'Id': 'OUT_1', 'Names': ['/swarm-host-1/myproject', '/swarm-host-1/foo/bar']},
            {'Image': 'busybox', 'Id': 'OUT_2', 'Names': ['/swarm-host-1/myproject_db']},
            {'Image': 'busybox', 'Id': 'OUT_3', 'Names': ['/swarm-host-1/db_1']},
            {'Image': 'busybox', 'Id': 'IN_1', 'Names': ['/swarm-host-1/myproject_db_1', '/swarm-host-1/myproject_web_1/db']},
        ]
        self.assertEqual([c.id for c in service.containers()], ['IN_1'])
示例#17
0
    def test_get_volumes_from_service_container_exists(self):
        container_ids = ['aabbccddee', '12345']
        from_service = mock.create_autospec(Service)
        from_service.containers.return_value = [
            mock.Mock(id=container_id, spec=Container)
            for container_id in container_ids
        ]
        service = Service('test', volumes_from=[from_service], image='foo')

        self.assertEqual(service._get_volumes_from(), container_ids)
示例#18
0
    def test_get_volumes_from_service_no_container(self):
        container_id = 'abababab'
        from_service = mock.create_autospec(Service)
        from_service.containers.return_value = []
        from_service.create_container.return_value = mock.Mock(id=container_id,
                                                               spec=Container)
        service = Service('test', image='foo', volumes_from=[from_service])

        self.assertEqual(service._get_volumes_from(), [container_id])
        from_service.create_container.assert_called_once_with()
示例#19
0
 def test_parse_environment(self):
     service = Service('foo',
             environment=['NORMAL=F1', 'CONTAINS_EQUALS=F=2', 'TRAILING_EQUALS='],
             client=self.mock_client,
             image='image_name',
         )
     options = service._get_container_create_options({})
     self.assertEqual(
         options['environment'],
         {'NORMAL': 'F1', 'CONTAINS_EQUALS': 'F=2', 'TRAILING_EQUALS': ''}
         )
示例#20
0
 def test_create_container_latest_is_used_when_no_tag_specified(
         self, mock_container):
     mock_container.create.side_effect = APIError(
         "oops", mock.Mock(status_code=404), "No such image")
     service = Service('foo', client=self.mock_client, image='someimage')
     with self.assertRaises(APIError):
         service.create_container()
     self.mock_client.pull.assert_called_once_with('someimage',
                                                   tag='latest',
                                                   insecure_registry=False,
                                                   stream=True)
示例#21
0
文件: service_test.py 项目: Malet/fig
 def test_parse_environment(self):
     service = Service('foo',
             environment=['NORMAL=F1', 'CONTAINS_EQUALS=F=2', 'TRAILING_EQUALS='],
             client=self.mock_client,
             image='image_name',
         )
     options = service._get_container_create_options({})
     self.assertEqual(
         options['environment'],
         {'NORMAL': 'F1', 'CONTAINS_EQUALS': 'F=2', 'TRAILING_EQUALS': ''}
         )
示例#22
0
文件: service_test.py 项目: Malet/fig
 def test_env_from_multiple_files(self):
     service = Service('foo',
             env_file=['tests/fixtures/env/one.env', 'tests/fixtures/env/two.env'],
             client=self.mock_client,
             image='image_name',
         )
     options = service._get_container_create_options({})
     self.assertEqual(
         options['environment'],
         {'ONE': '2', 'TWO': '1', 'THREE': '3', 'FOO': 'baz', 'DOO': 'dah'}
         )
示例#23
0
 def test_env_from_multiple_files(self):
     service = Service('foo',
             env_file=['tests/fixtures/env/one.env', 'tests/fixtures/env/two.env'],
             client=self.mock_client,
             image='image_name',
         )
     options = service._get_container_create_options({})
     self.assertEqual(
         options['environment'],
         {'ONE': '2', 'TWO': '1', 'THREE': '3', 'FOO': 'baz', 'DOO': 'dah'}
         )
示例#24
0
    def test_get_volumes_from_service_no_container(self):
        container_id = 'abababab'
        from_service = mock.create_autospec(Service)
        from_service.containers.return_value = []
        from_service.create_container.return_value = mock.Mock(
            id=container_id,
            spec=Container)
        service = Service('test', volumes_from=[from_service])

        self.assertEqual(service._get_volumes_from(), [container_id])
        from_service.create_container.assert_called_once_with()
示例#25
0
    def test_recreate_container(self, _):
        mock_container = mock.create_autospec(Container)
        service = Service('foo', client=self.mock_client, image='someimage')
        new_container = service.recreate_container(mock_container)

        mock_container.stop.assert_called_once_with()
        self.mock_client.rename.assert_called_once_with(
            mock_container.id,
            '%s_%s' % (mock_container.short_id, mock_container.name))

        new_container.start.assert_called_once_with()
        mock_container.remove.assert_called_once_with()
示例#26
0
 def test_create_container_latest_is_used_when_no_tag_specified(self, mock_container):
     mock_container.create.side_effect = APIError(
         "oops",
         mock.Mock(status_code=404),
         "No such image")
     service = Service('foo', client=self.mock_client, image='someimage')
     with self.assertRaises(APIError):
         service.create_container()
     self.mock_client.pull.assert_called_once_with(
         'someimage',
         tag='latest',
         insecure_registry=False,
         stream=True)
示例#27
0
文件: service_test.py 项目: Malet/fig
 def test_resolve_environment_from_file(self):
     os.environ['FILE_DEF'] = 'E1'
     os.environ['FILE_DEF_EMPTY'] = 'E2'
     os.environ['ENV_DEF'] = 'E3'
     service = Service('foo',
             env_file=['tests/fixtures/env/resolve.env'],
             client=self.mock_client,
             image='image_name',
         )
     options = service._get_container_create_options({})
     self.assertEqual(
         options['environment'],
         {'FILE_DEF': 'F1', 'FILE_DEF_EMPTY': '', 'ENV_DEF': 'E3', 'NO_DEF': ''}
         )
示例#28
0
 def test_resolve_environment_from_file(self):
     os.environ['FILE_DEF'] = 'E1'
     os.environ['FILE_DEF_EMPTY'] = 'E2'
     os.environ['ENV_DEF'] = 'E3'
     service = Service('foo',
             env_file=['tests/fixtures/env/resolve.env'],
             client=self.mock_client,
             image='image_name',
         )
     options = service._get_container_create_options({})
     self.assertEqual(
         options['environment'],
         {'FILE_DEF': 'F1', 'FILE_DEF_EMPTY': '', 'ENV_DEF': 'E3', 'NO_DEF': ''}
         )
示例#29
0
 def test_start_container_uses_tagged_image_if_it_exists(self):
     self.client.build('tests/fixtures/simple-dockerfile', tag='composetest_test')
     service = Service(
         name='test',
         client=self.client,
         build='this/does/not/exist/and/will/throw/error',
         project='composetest',
     )
     container = create_and_start_container(service)
     container.wait()
     self.assertIn('success', container.logs())
示例#30
0
 def test_start_container_builds_images(self):
     service = Service(
         name='test',
         client=self.client,
         build='tests/fixtures/simple-dockerfile',
         project='composetest',
     )
     container = create_and_start_container(service)
     container.wait()
     self.assertIn('success', container.logs())
     self.assertEqual(len(self.client.images(name='composetest_test')), 1)
示例#31
0
    def test_create_container_from_insecure_registry(
            self,
            mock_log,
            mock_container):
        service = Service('foo', client=self.mock_client, image='someimage:sometag')
        mock_response = mock.Mock(Response)
        mock_response.status_code = 404
        mock_response.reason = "Not Found"
        mock_container.create.side_effect = APIError(
            'Mock error', mock_response, "No such image")

        # We expect the APIError because our service requires a
        # non-existent image.
        with self.assertRaises(APIError):
            service.create_container(insecure_registry=True)

        self.mock_client.pull.assert_called_once_with(
            'someimage:sometag',
            insecure_registry=True,
            stream=True)
        mock_log.info.assert_called_once_with(
            'Pulling image someimage:sometag...')
示例#32
0
    def test_create_container_from_insecure_registry(
            self,
            mock_log,
            mock_container):
        service = Service('foo', client=self.mock_client, image='someimage:sometag')
        mock_response = mock.Mock(Response)
        mock_response.status_code = 404
        mock_response.reason = "Not Found"
        mock_container.create.side_effect = APIError(
            'Mock error', mock_response, "No such image")

        # We expect the APIError because our service requires a
        # non-existent image.
        with self.assertRaises(APIError):
            service.create_container(insecure_registry=True)

        self.mock_client.pull.assert_called_once_with(
            'someimage:sometag',
            insecure_registry=True,
            stream=True)
        mock_log.info.assert_called_once_with(
            'Pulling image someimage:sometag...')
示例#33
0
    def test_recreate_containers_with_image_declared_volume(self):
        service = Service(
            project='composetest',
            name='db',
            client=self.client,
            build='tests/fixtures/dockerfile-with-volume',
        )

        old_container = create_and_start_container(service)
        self.assertEqual(old_container.get('Volumes').keys(), ['/data'])
        volume_path = old_container.get('Volumes')['/data']

        service.recreate_containers()
        new_container = service.containers()[0]
        service.start_container(new_container)
        self.assertEqual(new_container.get('Volumes').keys(), ['/data'])
        self.assertEqual(new_container.get('Volumes')['/data'], volume_path)
示例#34
0
    def test_recreate_containers_with_image_declared_volume(self):
        service = Service(
            project='composetest',
            name='db',
            client=self.client,
            build='tests/fixtures/dockerfile-with-volume',
        )

        old_container = create_and_start_container(service)
        self.assertEqual(old_container.get('Volumes').keys(), ['/data'])
        volume_path = old_container.get('Volumes')['/data']

        service.recreate_containers()
        new_container = service.containers()[0]
        service.start_container(new_container)
        self.assertEqual(new_container.get('Volumes').keys(), ['/data'])
        self.assertEqual(new_container.get('Volumes')['/data'], volume_path)
示例#35
0
 def test_env_nonexistent_file(self):
     self.assertRaises(ConfigError, lambda: Service('foo', env_file='tests/fixtures/env/nonexistent.env'))
示例#36
0
    def test_get_volumes_from_intermediate_container(self):
        container_id = 'aabbccddee'
        service = Service('test')
        container = mock.Mock(id=container_id, spec=Container)

        self.assertEqual(service._get_volumes_from(container), [container_id])
示例#37
0
 def test_config_validation(self):
     self.assertRaises(ConfigError, lambda: Service(name='foo', port=['8000']))
     Service(name='foo', ports=['8000'])
示例#38
0
 def test_latest_is_used_when_tag_is_not_specified(self):
     service = Service('foo', client=self.mock_client, image='someimage')
     Container.create = mock.Mock()
     service.create_container()
     self.assertEqual(Container.create.call_args[1]['image'], 'someimage:latest')
示例#39
0
    def test_get_volumes_from_intermediate_container(self):
        container_id = 'aabbccddee'
        service = Service('test')
        container = mock.Mock(id=container_id, spec=Container)

        self.assertEqual(service._get_volumes_from(container), [container_id])
示例#40
0
 def test_latest_is_used_when_tag_is_not_specified(self):
     service = Service('foo', client=self.mock_client, image='someimage')
     Container.create = mock.Mock()
     service.create_container()
     self.assertEqual(Container.create.call_args[1]['image'], 'someimage:latest')
示例#41
0
    def test_get_container_not_found(self):
        self.mock_client.containers.return_value = []
        service = Service('foo', client=self.mock_client, image='foo')

        self.assertRaises(ValueError, service.get_container)
示例#42
0
    def test_name_validations(self):
        self.assertRaises(ConfigError, lambda: Service(name=''))

        self.assertRaises(ConfigError, lambda: Service(name=' '))
        self.assertRaises(ConfigError, lambda: Service(name='/'))
        self.assertRaises(ConfigError, lambda: Service(name='!'))
        self.assertRaises(ConfigError, lambda: Service(name='\xe2'))
        self.assertRaises(ConfigError, lambda: Service(name='_'))
        self.assertRaises(ConfigError, lambda: Service(name='____'))
        self.assertRaises(ConfigError, lambda: Service(name='foo_bar'))
        self.assertRaises(ConfigError, lambda: Service(name='__foo_bar__'))

        Service('a', image='foo')
        Service('foo', image='foo')
示例#43
0
 def test_project_validation(self):
     self.assertRaises(ConfigError, lambda: Service('bar'))
     self.assertRaises(ConfigError, lambda: Service(name='foo', project='_', image='foo'))
     Service(name='foo', project='bar', image='foo')
示例#44
0
    def test_get_volumes_from_previous_container(self):
        container_id = 'aabbccddee'
        service = Service('test', image='foo')
        container = mock.Mock(id=container_id, spec=Container, image='foo')

        self.assertEqual(service._get_volumes_from(container), [container_id])