Exemple #1
0
    def test_project_up_with_no_deps(self):
        project = Project.from_dicts(
            name='composetest',
            service_dicts=build_service_dicts({
                'console': {
                    'image': 'busybox:latest',
                    'command': ["top"],
                },
                'data': {
                    'image': 'busybox:latest',
                    'command': ["top"]
                },
                'db': {
                    'image': 'busybox:latest',
                    'command': ["top"],
                    'volumes_from': ['data'],
                },
                'web': {
                    'image': 'busybox:latest',
                    'command': ["top"],
                    'links': ['db'],
                },
            }),
            client=self.client,
        )
        project.start()
        self.assertEqual(len(project.containers()), 0)

        project.up(['db'], start_deps=False)
        self.assertEqual(len(project.containers(stopped=True)), 2)
        self.assertEqual(len(project.get_service('web').containers()), 0)
        self.assertEqual(len(project.get_service('db').containers()), 1)
        self.assertEqual(len(project.get_service('data').containers()), 0)
        self.assertEqual(len(project.get_service('data').containers(stopped=True)), 1)
        self.assertEqual(len(project.get_service('console').containers()), 0)
Exemple #2
0
    def test_net_from_container(self):
        net_container = Container.create(
            self.client,
            image='busybox:latest',
            name='composetest_net_container',
            command='top'
        )
        net_container.start()

        project = Project.from_dicts(
            name='composetest',
            service_dicts=config.from_dictionary({
                'web': {
                    'image': 'busybox:latest',
                    'net': 'container:composetest_net_container'
                },
            }),
            client=self.client,
        )

        project.up()

        web = project.get_service('web')
        self.assertEqual(web._get_net(), 'container:' + net_container.id)

        project.kill()
        project.remove_stopped()
Exemple #3
0
    def __init__(self):
        docstring = getdoc(Usage)
        options = None
        try:
            options = docopt(docstring,
                             argv=sys.argv[1:],
                             version=__version__,
                             options_first=True)
        except DocoptExit:
            raise SystemExit(docstring)

        if 'ps' in options and options['ps']:
            self._ps()
            return

        if 'exec' in options and options['exec']:
            self._exec(options['PROJECT'], options['SERVICE'],
                       options['COMMANDS'])
            return

        # 'command' references a function on this class
        command = options['COMMAND']
        if not hasattr(self, command):
            print('{command} command not found'.format(command=command))
            sys.exit(1)

        projectname = options['PROJECT']
        servicenames = options['SERVICES']

        client = docker_client()
        config = self._get_config(projectname)
        project = Project.from_dicts(projectname, config, client)

        handle = getattr(self, command)
        handle(project, projectname, servicenames)
Exemple #4
0
    def test_use_net_from_service(self):
        container_name = 'test_aaa_1'
        mock_client = mock.create_autospec(docker.Client)
        mock_client.containers.return_value = [
            {
                "Name": container_name,
                "Names": [container_name],
                "Id": container_name,
                "Image": 'busybox:latest'
            }
        ]
        project = Project.from_dicts('test', [
            {
                'name': 'aaa',
                'image': 'busybox:latest'
            },
            {
                'name': 'test',
                'image': 'busybox:latest',
                'net': 'container:aaa'
            }
        ], mock_client)

        service = project.get_service('test')
        self.assertEqual(service._get_net(), 'container:' + container_name)
Exemple #5
0
    def test_net_from_container(self):
        net_container = Container.create(
            self.client,
            image='busybox:latest',
            name='composetest_net_container',
            command='top',
            labels={LABEL_PROJECT: 'composetest'},
        )
        net_container.start()

        project = Project.from_dicts(
            name='composetest',
            service_dicts=build_service_dicts({
                'web': {
                    'image': 'busybox:latest',
                    'net': 'container:composetest_net_container'
                },
            }),
            client=self.client,
        )

        project.up()

        web = project.get_service('web')
        self.assertEqual(web.net.mode, 'container:' + net_container.id)
Exemple #6
0
    def test_project_up_with_no_deps(self):
        project = Project.from_dicts(
            name='composetest',
            service_dicts=config.from_dictionary({
                'console': {
                    'image': 'busybox:latest',
                    'command': ["top"],
                },
                'data': {
                    'image': 'busybox:latest',
                    'command': ["top"]
                },
                'db': {
                    'image': 'busybox:latest',
                    'command': ["top"],
                    'volumes_from': ['data'],
                },
                'web': {
                    'image': 'busybox:latest',
                    'command': ["top"],
                    'links': ['db'],
                },
            }),
            client=self.client,
        )
        project.start()
        self.assertEqual(len(project.containers()), 0)

        project.up(['db'], start_deps=False)
        self.assertEqual(len(project.containers(stopped=True)), 2)
        self.assertEqual(len(project.get_service('web').containers()), 0)
        self.assertEqual(len(project.get_service('db').containers()), 1)
        self.assertEqual(len(project.get_service('data').containers()), 0)
        self.assertEqual(len(project.get_service('data').containers(stopped=True)), 1)
        self.assertEqual(len(project.get_service('console').containers()), 0)
    def test_use_net_from_service(self):
        container_name = 'test_aaa_1'
        mock_client = mock.create_autospec(docker.Client)
        mock_client.containers.return_value = [
            {
                "Name": container_name,
                "Names": [container_name],
                "Id": container_name,
                "Image": 'busybox:latest'
            }
        ]
        project = Project.from_dicts('test', [
            {
                'name': 'aaa',
                'image': 'busybox:latest'
            },
            {
                'name': 'test',
                'image': 'busybox:latest',
                'net': 'container:aaa'
            }
        ], mock_client)

        service = project.get_service('test')
        self.assertEqual(service._get_net(), 'container:' + container_name)
Exemple #8
0
    def test_project_up_starts_depends(self):
        project = Project.from_dicts(
            name='composetest',
            service_dicts=config.from_dictionary({
                'console': {
                    'image': 'busybox:latest',
                    'command': ["top"],
                },
                'data': {
                    'image': 'busybox:latest',
                    'command': ["top"]
                },
                'db': {
                    'image': 'busybox:latest',
                    'command': ["top"],
                    'volumes_from': ['data'],
                },
                'web': {
                    'image': 'busybox:latest',
                    'command': ["top"],
                    'links': ['db'],
                },
            }),
            client=self.client,
        )
        project.start()
        self.assertEqual(len(project.containers()), 0)

        project.up(['web'])
        self.assertEqual(len(project.containers()), 3)
        self.assertEqual(len(project.get_service('web').containers()), 1)
        self.assertEqual(len(project.get_service('db').containers()), 1)
        self.assertEqual(len(project.get_service('data').containers()), 1)
        self.assertEqual(len(project.get_service('console').containers()), 0)
 def test_container_without_name(self):
     self.mock_client.containers.return_value = [
         {
             'Image': 'busybox:latest',
             'Id': '1',
             'Name': '1'
         },
         {
             'Image': 'busybox:latest',
             'Id': '2',
             'Name': None
         },
         {
             'Image': 'busybox:latest',
             'Id': '3'
         },
     ]
     self.mock_client.inspect_container.return_value = {
         'Id': '1',
         'Config': {
             'Labels': {
                 LABEL_SERVICE: 'web',
             },
         },
     }
     project = Project.from_dicts(
         'test',
         [{
             'name': 'web',
             'image': 'busybox:latest',
         }],
         self.mock_client,
     )
     self.assertEqual([c.id for c in project.containers()], ['1'])
Exemple #10
0
    def test_project_up_starts_depends(self):
        project = Project.from_dicts(
            name='composetest',
            service_dicts=build_service_dicts({
                'console': {
                    'image': 'busybox:latest',
                    'command': ["top"],
                },
                'data': {
                    'image': 'busybox:latest',
                    'command': ["top"]
                },
                'db': {
                    'image': 'busybox:latest',
                    'command': ["top"],
                    'volumes_from': ['data'],
                },
                'web': {
                    'image': 'busybox:latest',
                    'command': ["top"],
                    'links': ['db'],
                },
            }),
            client=self.client,
        )
        project.start()
        self.assertEqual(len(project.containers()), 0)

        project.up(['web'])
        self.assertEqual(len(project.containers()), 3)
        self.assertEqual(len(project.get_service('web').containers()), 1)
        self.assertEqual(len(project.get_service('db').containers()), 1)
        self.assertEqual(len(project.get_service('data').containers()), 1)
        self.assertEqual(len(project.get_service('console').containers()), 0)
Exemple #11
0
    def test_net_from_service(self):
        project = Project.from_dicts(
            name='composetest',
            service_dicts=config.from_dictionary({
                'net': {
                    'image': 'busybox:latest',
                    'command': ["top"]
                },
                'web': {
                    'image': 'busybox:latest',
                    'net': 'container:net',
                    'command': ["top"]
                },
            }),
            client=self.client,
        )

        project.up()

        web = project.get_service('web')
        net = project.get_service('net')
        self.assertEqual(web._get_net(), 'container:' + net.containers()[0].id)

        project.kill()
        project.remove_stopped()
Exemple #12
0
    def test_net_from_container(self):
        net_container = Container.create(
            self.client,
            image='busybox:latest',
            name='composetest_net_container',
            command='top',
            labels={LABEL_PROJECT: 'composetest'},
        )
        net_container.start()

        project = Project.from_dicts(
            name='composetest',
            service_dicts=build_service_dicts({
                'web': {
                    'image': 'busybox:latest',
                    'net': 'container:composetest_net_container'
                },
            }),
            client=self.client,
        )

        project.up()

        web = project.get_service('web')
        self.assertEqual(web.net.mode, 'container:' + net_container.id)
Exemple #13
0
 def make_project(self, cfg):
     details = config.ConfigDetails(
         'working_dir',
         [config.ConfigFile(None, cfg)])
     return Project.from_dicts(
         name='composetest',
         client=self.client,
         service_dicts=config.load(details))
Exemple #14
0
 def make_project(self, cfg):
     details = config.ConfigDetails(
         'working_dir',
         [config.ConfigFile(None, cfg)])
     return Project.from_dicts(
         name='composetest',
         client=self.client,
         service_dicts=config.load(details))
 def test_net_unset(self):
     project = Project.from_dicts('test', [{
         'name': 'test',
         'image': 'busybox:latest',
     }], self.mock_client)
     service = project.get_service('test')
     self.assertEqual(service._get_net(), None)
     self.assertNotIn('NetworkMode', service._get_container_host_config({}))
Exemple #16
0
    def _ps(self):
        client = docker_client()
        projectnames = self._get_projectnames_in_dir()
        containers = client.containers(all=True)
        unknown = {}
        for container in containers:
            unknown[container['Id']] = client.inspect_container(
                container['Id'])
        if len(projectnames) != 0:
            print()
        for projectname in projectnames:
            config = self._get_config(projectname)
            project = Project.from_dicts(
                projectname,
                config,
                client)
            services = project.get_services()

            counts = {}

            for service in services:
                c = service.containers(stopped=True) + service.containers(one_off=True)
                if len(c) == 0:
                    if not 'Uncreated' in counts:
                        counts['Uncreated'] = 0
                    counts['Uncreated'] += 1
                for container in c:
                    del unknown[container.id]
                    if not container.human_readable_state in counts:
                        counts[container.human_readable_state] = 0
                    counts[container.human_readable_state] += 1

            humancounts = []
            for state in counts:
                humancounts.append('{count} {state}'.format(
                    count=counts[state],
                    state=state))
            print('  {name: <24}{counts}'.format(
                name=projectname,
                counts=','.join(humancounts)))

        if len(unknown) != 0:
            print()
            print('  Containers not tracked by compose/tugboat:')
            print()
        for key in unknown:
            detail = unknown[key]
            name = detail['Name']
            if name.startswith('/'):
                name = name[1:]
            ip = detail['NetworkSettings']['IPAddress']
            if ip == '':
                ip = '(host)'
            print('  {name: <24}{state: <12}{ip: <17}'.format(
                name=name,
                state='',
                ip=ip))
        print()
Exemple #17
0
 def test_net_unset(self):
     project = Project.from_dicts('test', [
         {
             'name': 'test',
             'image': 'busybox:latest',
         }
     ], self.mock_client)
     service = project.get_service('test')
     self.assertEqual(service._get_net(), None)
     self.assertNotIn('NetworkMode', service._get_container_host_config({}))
 def test_use_net_from_container(self):
     container_id = 'aabbccddee'
     container_dict = dict(Name='aaa', Id=container_id)
     self.mock_client.inspect_container.return_value = container_dict
     project = Project.from_dicts('test', [{
         'name': 'test',
         'image': 'busybox:latest',
         'net': 'container:aaa'
     }], self.mock_client)
     service = project.get_service('test')
     self.assertEqual(service._get_net(), 'container:' + container_id)
 def test_use_volumes_from_container(self):
     container_id = 'aabbccddee'
     container_dict = dict(Name='aaa', Id=container_id)
     self.mock_client.inspect_container.return_value = container_dict
     project = Project.from_dicts('test', [{
         'name': 'test',
         'image': 'busybox:latest',
         'volumes_from': ['aaa']
     }], self.mock_client)
     self.assertEqual(
         project.get_service('test')._get_volumes_from(), [container_id])
Exemple #20
0
 def test_volumes_from_service(self):
     service_dicts = build_service_dicts(
         {
             "data": {"image": "busybox:latest", "volumes": ["/var/data"]},
             "db": {"image": "busybox:latest", "volumes_from": ["data"]},
         }
     )
     project = Project.from_dicts(name="composetest", service_dicts=service_dicts, client=self.client)
     db = project.get_service("db")
     data = project.get_service("data")
     self.assertEqual(db.volumes_from, [data])
Exemple #21
0
    def _ps(self):
        client = docker_client()
        projectnames = self._get_projectnames_in_dir()
        containers = client.containers(all=True)
        unknown = {}
        for container in containers:
            unknown[container['Id']] = client.inspect_container(
                container['Id'])
        if len(projectnames) != 0:
            print()
        for projectname in projectnames:
            config = self._get_config(projectname)
            project = Project.from_dicts(projectname, config, client)
            services = project.get_services()

            counts = {}

            for service in services:
                c = service.containers(stopped=True) + service.containers(
                    one_off=True)
                if len(c) == 0:
                    if not 'Uncreated' in counts:
                        counts['Uncreated'] = 0
                    counts['Uncreated'] += 1
                for container in c:
                    del unknown[container.id]
                    if not container.human_readable_state in counts:
                        counts[container.human_readable_state] = 0
                    counts[container.human_readable_state] += 1

            humancounts = []
            for state in counts:
                humancounts.append('{count} {state}'.format(
                    count=counts[state], state=state))
            print('  {name: <24}{counts}'.format(name=projectname,
                                                 counts=','.join(humancounts)))

        if len(unknown) != 0:
            print()
            print('  Containers not tracked by compose/tugboat:')
            print()
        for key in unknown:
            detail = unknown[key]
            name = detail['Name']
            if name.startswith('/'):
                name = name[1:]
            ip = detail['NetworkSettings']['IPAddress']
            if ip == '':
                ip = '(host)'
            print('  {name: <24}{state: <12}{ip: <17}'.format(name=name,
                                                              state='',
                                                              ip=ip))
        print()
Exemple #22
0
 def test_use_volumes_from_container(self):
     container_id = 'aabbccddee'
     container_dict = dict(Name='aaa', Id=container_id)
     self.mock_client.inspect_container.return_value = container_dict
     project = Project.from_dicts('test', [
         {
             'name': 'test',
             'image': 'busybox:latest',
             'volumes_from': ['aaa']
         }
     ], self.mock_client)
     self.assertEqual(project.get_service('test')._get_volumes_from(), [container_id])
Exemple #23
0
def _fetch_project(name, config):
    """
    Wrap the call to Project.from_config as it has side effects
    :param name: name for the project
    :type name: str
    :param config: dictionary configuration
    :type config: dict
    :return: the docker-compose Project
    :rtype: Project
    """
    # get the Project Ready dictionary list. No Working Dir for us
    config_dicts = from_dictionary(config, working_dir='')
    return Project.from_dicts(name, config_dicts, docker_client())
Exemple #24
0
 def test_use_net_from_container(self):
     container_id = 'aabbccddee'
     container_dict = dict(Name='aaa', Id=container_id)
     self.mock_client.inspect_container.return_value = container_dict
     project = Project.from_dicts('test', [
         {
             'name': 'test',
             'image': 'busybox:latest',
             'net': 'container:aaa'
         }
     ], self.mock_client)
     service = project.get_service('test')
     self.assertEqual(service._get_net(), 'container:' + container_id)
def get_project(compose_file=COMPOSE_FILE):
    from compose import __version__ as compose_version
    from compose.config import find, load
    from compose.project import Project
    from compose.cli.docker_client import docker_client

    if compose_version.startswith('1.4'):
        yaml_file = find('.', str(compose_file))
    else:
        # compose >= 1.5
        yaml_file = find('.', [str(compose_file)])

    config = load(yaml_file)
    return Project.from_dicts(PROJECT_NAME, config, docker_client())
 def test_from_config(self):
     dicts = config.from_dictionary({
         'web': {
             'image': 'busybox:latest',
         },
         'db': {
             'image': 'busybox:latest',
         },
     })
     project = Project.from_dicts('composetest', dicts, None)
     self.assertEqual(len(project.services), 2)
     self.assertEqual(project.get_service('web').name, 'web')
     self.assertEqual(project.get_service('web').options['image'], 'busybox:latest')
     self.assertEqual(project.get_service('db').name, 'db')
     self.assertEqual(project.get_service('db').options['image'], 'busybox:latest')
Exemple #27
0
 def test_from_dict(self):
     project = Project.from_dicts('composetest', [
         {
             'name': 'web',
             'image': 'busybox:latest'
         },
         {
             'name': 'db',
             'image': 'busybox:latest'
         },
     ], None)
     self.assertEqual(len(project.services), 2)
     self.assertEqual(project.get_service('web').name, 'web')
     self.assertEqual(project.get_service('web').options['image'], 'busybox:latest')
     self.assertEqual(project.get_service('db').name, 'db')
     self.assertEqual(project.get_service('db').options['image'], 'busybox:latest')
Exemple #28
0
 def test_from_dict(self):
     project = Project.from_dicts('composetest', [
         {
             'name': 'web',
             'image': 'busybox:latest'
         },
         {
             'name': 'db',
             'image': 'busybox:latest'
         },
     ], None)
     self.assertEqual(len(project.services), 2)
     self.assertEqual(project.get_service('web').name, 'web')
     self.assertEqual(project.get_service('web').options['image'], 'busybox:latest')
     self.assertEqual(project.get_service('db').name, 'db')
     self.assertEqual(project.get_service('db').options['image'], 'busybox:latest')
Exemple #29
0
    def test_net_from_service(self):
        project = Project.from_dicts(
            name="composetest",
            service_dicts=build_service_dicts(
                {
                    "net": {"image": "busybox:latest", "command": ["top"]},
                    "web": {"image": "busybox:latest", "net": "container:net", "command": ["top"]},
                }
            ),
            client=self.client,
        )

        project.up()

        web = project.get_service("web")
        net = project.get_service("net")
        self.assertEqual(web.net.mode, "container:" + net.containers()[0].id)
Exemple #30
0
 def test_volumes_from_container(self):
     data_container = Container.create(
         self.client,
         image="busybox:latest",
         volumes=["/var/data"],
         name="composetest_data_container",
         labels={LABEL_PROJECT: "composetest"},
     )
     project = Project.from_dicts(
         name="composetest",
         service_dicts=build_service_dicts(
             {"db": {"image": "busybox:latest", "volumes_from": ["composetest_data_container"]}}
         ),
         client=self.client,
     )
     db = project.get_service("db")
     self.assertEqual(db.volumes_from, [data_container])
Exemple #31
0
    def test_use_volumes_from_service_container(self, mock_return):
        container_ids = ['aabbccddee', '12345']
        mock_return.return_value = [
            mock.Mock(id=container_id, spec=Container)
            for container_id in container_ids
        ]

        project = Project.from_dicts('test', [{
            'name': 'vol',
            'image': 'busybox:latest'
        }, {
            'name': 'test',
            'image': 'busybox:latest',
            'volumes_from': ['vol']
        }], None)
        self.assertEqual(
            project.get_service('test')._get_volumes_from(), container_ids)
Exemple #32
0
    def test_use_volumes_from_service_container(self, mock_return):
        container_ids = ['aabbccddee', '12345']
        mock_return.return_value = [
            mock.Mock(id=container_id, spec=Container)
            for container_id in container_ids]

        project = Project.from_dicts('test', [
            {
                'name': 'vol',
                'image': 'busybox:latest'
            },
            {
                'name': 'test',
                'image': 'busybox:latest',
                'volumes_from': ['vol']
            }
        ], None)
        self.assertEqual(project.get_service('test')._get_volumes_from(), container_ids)
Exemple #33
0
    def test_from_dict_sorts_in_dependency_order(self):
        project = Project.from_dicts('composetest', [{
            'name': 'web',
            'image': 'busybox:latest',
            'links': ['db'],
        }, {
            'name': 'db',
            'image': 'busybox:latest',
            'volumes_from': ['volume']
        }, {
            'name': 'volume',
            'image': 'busybox:latest',
            'volumes': ['/tmp'],
        }], None)

        self.assertEqual(project.services[0].name, 'volume')
        self.assertEqual(project.services[1].name, 'db')
        self.assertEqual(project.services[2].name, 'web')
 def test_use_volumes_from_service_no_container(self):
     container_name = 'test_vol_1'
     self.mock_client.containers.return_value = [{
         "Name": container_name,
         "Names": [container_name],
         "Id": container_name,
         "Image": 'busybox:latest'
     }]
     project = Project.from_dicts('test', [{
         'name': 'vol',
         'image': 'busybox:latest'
     }, {
         'name': 'test',
         'image': 'busybox:latest',
         'volumes_from': ['vol']
     }], self.mock_client)
     self.assertEqual(
         project.get_service('test')._get_volumes_from(), [container_name])
Exemple #35
0
 def test_volumes_from_service(self):
     service_dicts = build_service_dicts({
         'data': {
             'image': 'busybox:latest',
             'volumes': ['/var/data'],
         },
         'db': {
             'image': 'busybox:latest',
             'volumes_from': ['data'],
         },
     })
     project = Project.from_dicts(
         name='composetest',
         service_dicts=service_dicts,
         client=self.client,
     )
     db = project.get_service('db')
     data = project.get_service('data')
     self.assertEqual(db.volumes_from, [VolumeFromSpec(data, 'rw')])
Exemple #36
0
 def test_volumes_from_service(self):
     service_dicts = build_service_dicts({
         'data': {
             'image': 'busybox:latest',
             'volumes': ['/var/data'],
         },
         'db': {
             'image': 'busybox:latest',
             'volumes_from': ['data'],
         },
     })
     project = Project.from_dicts(
         name='composetest',
         service_dicts=service_dicts,
         client=self.client,
     )
     db = project.get_service('db')
     data = project.get_service('data')
     self.assertEqual(db.volumes_from, [data])
Exemple #37
0
 def test_volumes_from_service(self):
     service_dicts = config.from_dictionary({
         'data': {
             'image': 'busybox:latest',
             'volumes': ['/var/data'],
         },
         'db': {
             'image': 'busybox:latest',
             'volumes_from': ['data'],
         },
     }, working_dir='.')
     project = Project.from_dicts(
         name='composetest',
         service_dicts=service_dicts,
         client=self.client,
     )
     db = project.get_service('db')
     data = project.get_service('data')
     self.assertEqual(db.volumes_from, [data])
Exemple #38
0
    def test_use_net_from_service(self):
        container_name = 'test_aaa_1'
        self.mock_client.containers.return_value = [{
            "Name": container_name,
            "Names": [container_name],
            "Id": container_name,
            "Image": 'busybox:latest'
        }]
        project = Project.from_dicts('test', [{
            'name': 'aaa',
            'image': 'busybox:latest'
        }, {
            'name': 'test',
            'image': 'busybox:latest',
            'net': 'container:aaa'
        }], self.mock_client)

        service = project.get_service('test')
        self.assertEqual(service.net.mode, 'container:' + container_name)
Exemple #39
0
 def test_volumes_from_container(self):
     data_container = Container.create(
         self.client,
         image='busybox:latest',
         volumes=['/var/data'],
         name='composetest_data_container',
         labels={LABEL_PROJECT: 'composetest'},
     )
     project = Project.from_dicts(
         name='composetest',
         service_dicts=build_service_dicts({
             'db': {
                 'image': 'busybox:latest',
                 'volumes_from': ['composetest_data_container'],
             },
         }),
         client=self.client,
     )
     db = project.get_service('db')
     self.assertEqual(db._get_volumes_from(), [data_container.id + ':rw'])
Exemple #40
0
 def test_volumes_from_container(self):
     data_container = Container.create(
         self.client,
         image='busybox:latest',
         volumes=['/var/data'],
         name='composetest_data_container',
         labels={LABEL_PROJECT: 'composetest'},
     )
     project = Project.from_dicts(
         name='composetest',
         service_dicts=build_service_dicts({
             'db': {
                 'image': 'busybox:latest',
                 'volumes_from': ['composetest_data_container'],
             },
         }),
         client=self.client,
     )
     db = project.get_service('db')
     self.assertEqual(db.volumes_from, [data_container])
Exemple #41
0
    def test_use_volumes_from_service_container(self):
        container_ids = ['aabbccddee', '12345']

        project = Project.from_dicts(
            'test', [{
                'name': 'vol',
                'image': 'busybox:latest'
            }, {
                'name': 'test',
                'image': 'busybox:latest',
                'volumes_from': [VolumeFromSpec('vol', 'rw')]
            }], None)
        with mock.patch.object(Service, 'containers') as mock_return:
            mock_return.return_value = [
                mock.Mock(id=container_id, spec=Container)
                for container_id in container_ids
            ]
            self.assertEqual(
                project.get_service('test')._get_volumes_from(),
                [container_ids[0] + ':rw'])
Exemple #42
0
    def test_use_volumes_from_service_container(self):
        container_ids = ['aabbccddee', '12345']

        project = Project.from_dicts('test', [
            {
                'name': 'vol',
                'image': 'busybox:latest'
            },
            {
                'name': 'test',
                'image': 'busybox:latest',
                'volumes_from': [VolumeFromSpec('vol', 'rw')]
            }
        ], None)
        with mock.patch.object(Service, 'containers') as mock_return:
            mock_return.return_value = [
                mock.Mock(id=container_id, spec=Container)
                for container_id in container_ids]
            self.assertEqual(
                project.get_service('test')._get_volumes_from(),
                [container_ids[0] + ':rw'])
Exemple #43
0
    def test_project_up_starts_depends(self):
        project = Project.from_dicts(
            name="composetest",
            service_dicts=build_service_dicts(
                {
                    "console": {"image": "busybox:latest", "command": ["top"]},
                    "data": {"image": "busybox:latest", "command": ["top"]},
                    "db": {"image": "busybox:latest", "command": ["top"], "volumes_from": ["data"]},
                    "web": {"image": "busybox:latest", "command": ["top"], "links": ["db"]},
                }
            ),
            client=self.client,
        )
        project.start()
        self.assertEqual(len(project.containers()), 0)

        project.up(["web"])
        self.assertEqual(len(project.containers()), 3)
        self.assertEqual(len(project.get_service("web").containers()), 1)
        self.assertEqual(len(project.get_service("db").containers()), 1)
        self.assertEqual(len(project.get_service("data").containers()), 1)
        self.assertEqual(len(project.get_service("console").containers()), 0)
Exemple #44
0
    def test_from_dict_sorts_in_dependency_order(self):
        project = Project.from_dicts('composetest', [
            {
                'name': 'web',
                'image': 'busybox:latest',
                'links': ['db'],
            },
            {
                'name': 'db',
                'image': 'busybox:latest',
                'volumes_from': ['volume']
            },
            {
                'name': 'volume',
                'image': 'busybox:latest',
                'volumes': ['/tmp'],
            }
        ], None)

        self.assertEqual(project.services[0].name, 'volume')
        self.assertEqual(project.services[1].name, 'db')
        self.assertEqual(project.services[2].name, 'web')
Exemple #45
0
    def test_volumes_from_container(self):
        data_container = Container.create(
            self.client,
            image='busybox:latest',
            volumes=['/var/data'],
            name='composetest_data_container',
        )
        project = Project.from_dicts(
            name='composetest',
            service_dicts=config.from_dictionary({
                'db': {
                    'image': 'busybox:latest',
                    'volumes_from': ['composetest_data_container'],
                },
            }),
            client=self.client,
        )
        db = project.get_service('db')
        self.assertEqual(db.volumes_from, [data_container])

        project.kill()
        project.remove_stopped()
Exemple #46
0
    def test_net_from_container(self):
        net_container = Container.create(
            self.client,
            image="busybox:latest",
            name="composetest_net_container",
            command="top",
            labels={LABEL_PROJECT: "composetest"},
        )
        net_container.start()

        project = Project.from_dicts(
            name="composetest",
            service_dicts=build_service_dicts(
                {"web": {"image": "busybox:latest", "net": "container:composetest_net_container"}}
            ),
            client=self.client,
        )

        project.up()

        web = project.get_service("web")
        self.assertEqual(web.net.mode, "container:" + net_container.id)
Exemple #47
0
    def test_net_from_service(self):
        project = Project.from_dicts(
            name='composetest',
            service_dicts=build_service_dicts({
                'net': {
                    'image': 'busybox:latest',
                    'command': ["top"]
                },
                'web': {
                    'image': 'busybox:latest',
                    'net': 'container:net',
                    'command': ["top"]
                },
            }),
            client=self.client,
        )

        project.up()

        web = project.get_service('web')
        net = project.get_service('net')
        self.assertEqual(web.net.mode, 'container:' + net.containers()[0].id)
Exemple #48
0
 def test_use_volumes_from_service_no_container(self):
     container_name = 'test_vol_1'
     self.mock_client.containers.return_value = [
         {
             "Name": container_name,
             "Names": [container_name],
             "Id": container_name,
             "Image": 'busybox:latest'
         }
     ]
     project = Project.from_dicts('test', [
         {
             'name': 'vol',
             'image': 'busybox:latest'
         },
         {
             'name': 'test',
             'image': 'busybox:latest',
             'volumes_from': ['vol']
         }
     ], self.mock_client)
     self.assertEqual(project.get_service('test')._get_volumes_from(), [container_name])
Exemple #49
0
    def test_net_from_service(self):
        project = Project.from_dicts(
            name='composetest',
            service_dicts=build_service_dicts({
                'net': {
                    'image': 'busybox:latest',
                    'command': ["top"]
                },
                'web': {
                    'image': 'busybox:latest',
                    'net': 'container:net',
                    'command': ["top"]
                },
            }),
            client=self.client,
        )

        project.up()

        web = project.get_service('web')
        net = project.get_service('net')
        self.assertEqual(web.net.mode, 'container:' + net.containers()[0].id)
Exemple #50
0
 def test_container_without_name(self):
     self.mock_client.containers.return_value = [
         {'Image': 'busybox:latest', 'Id': '1', 'Name': '1'},
         {'Image': 'busybox:latest', 'Id': '2', 'Name': None},
         {'Image': 'busybox:latest', 'Id': '3'},
     ]
     self.mock_client.inspect_container.return_value = {
         'Id': '1',
         'Config': {
             'Labels': {
                 LABEL_SERVICE: 'web',
             },
         },
     }
     project = Project.from_dicts(
         'test',
         [{
             'name': 'web',
             'image': 'busybox:latest',
         }],
         self.mock_client,
     )
     self.assertEqual([c.id for c in project.containers()], ['1'])
Exemple #51
0
    def test_project_up_starts_depends(self):
        project = Project.from_dicts(
            name='composetest',
            service_dicts=config.from_dictionary({
                'console': {
                    'image': 'busybox:latest',
                    'command': ["/bin/sleep", "300"],
                },
                'data': {
                    'image': 'busybox:latest',
                    'command': ["/bin/sleep", "300"]
                },
                'db': {
                    'image': 'busybox:latest',
                    'command': ["/bin/sleep", "300"],
                    'volumes_from': ['data'],
                },
                'web': {
                    'image': 'busybox:latest',
                    'command': ["/bin/sleep", "300"],
                    'links': ['db'],
                },
            }),
            client=self.client,
        )
        project.start()
        self.assertEqual(len(project.containers()), 0)

        project.up(['web'])
        self.assertEqual(len(project.containers()), 3)
        self.assertEqual(len(project.get_service('web').containers()), 1)
        self.assertEqual(len(project.get_service('db').containers()), 1)
        self.assertEqual(len(project.get_service('data').containers()), 1)
        self.assertEqual(len(project.get_service('console').containers()), 0)

        project.kill()
        project.remove_stopped()
Exemple #52
0
 def make_project(self, cfg):
     return Project.from_dicts(name='composetest',
                               client=self.client,
                               service_dicts=config.load(
                                   config.ConfigDetails(
                                       cfg, 'working_dir', None)))
Exemple #53
0
 def make_project(self, cfg):
     return Project.from_dicts(
         name='composetest',
         client=self.client,
         service_dicts=config.from_dictionary(cfg),
     )