Skip to content

Commit 832ed19

Browse files
committed
Merge pull request #14 from iamluc/feature/refacto
Minor refacto + bug fixes
2 parents b8c8a03 + b092f5e commit 832ed19

File tree

7 files changed

+65
-67
lines changed

7 files changed

+65
-67
lines changed

.travis.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ install: composer install --prefer-source
1212
script: vendor/bin/phpunit --configuration phpunit.xml.dist
1313

1414
before_deploy:
15-
- curl -LSs http://box-project.github.io/box2/installer.php | php
16-
- php box.phar build
15+
- curl -LSs http://box-project.github.io/box2/installer.php | php
16+
- php box.phar build
1717

1818
deploy:
1919
provider: releases
2020
skip_cleanup: true
2121
api_key:
22-
secure: NuHZx1ORZGojbPuY2ZZrB1BNfe2UUmO5wBv4dM6Qu2WluU0zp96LmKlOsbNml6k167cKj4R1AHgbVsbBARjtUeoYNBYti1G5/m2iXjRRqfPGNkuhG7A2THnYtrLqRb2jCI3hypsZSpOtj//4N+Q3CEKT9nd69HeV90/cAFd+YgDN5ldk9mhHbMnFAJ5hAFzYzUg2zukExVWObWkQ9Y3nP/zJ8jQvmvfiS2yLO+DjPEDH63rQorCbFh9SI0hSWXUQxTtbUk8Jj1H46Mrp9RAZlNhfEL2HiUt4S6lKciCQxkZ3P9yXp8ebjYPqH7fPPhn8G3ewYQqGFG/AYQGX463eyh0VAIt4PbJyIeqtEoPKC1h16b7a9tVt2kroQMImkYV1pwKg/aNZ0x9T3PXBjaCU8Mb5qrUvYpIoxjONI2qxi6lDV0kikumzhFnbfayFTA004ybl+yL1Ag3LxXyqo2jeu3vzX0e9kSDbQD1Cf4lp0riDkbKIDrJ8Ptqv67QV+dcAPyynDkRYDvPoSRKnraVKtHeRu1P5XHH7gpL/xdU8UnvO83ofDaLu923fkDE/dlGNhR/MU8P4EMWC4U/y0ROp1Wx27+qatrzCFZBlJVjtq6urTZ5Z6fMrD9f/Nelu8UR4CI8hnWMFl+UQVoQpSDYYVh71DHPU1QK+A/TpGI4GYm8=
22+
secure: "xYPmNWQNTRqLSQinnM64dRqDGAm6bKYODFmGdVLwjNqbICMHR0/sF00EPwBgIsXF100xbnjgJVRXD7lbL7nUYXWyzR2EcaW8yOxhYC0BYQMpOGI6RF0p+sMskCI5hb8Y+FT++nQZTwHPo9MtrAv2ec5r42RO2K0YM6WS6URsCqbTQnDtWcLReszRrLGVy41tkdlse9uqk63IbJmRwLunMkQBJ/BhVSRDl5Qm+Q3aDhjckZanX4QH0UrR75azut3CUIQ1l/wVF9dhKPHuvIc5+3qwkxqgOmaBFozE2hvlviWCunQsZMpaWG9L3v19VzuvypDvvvK+rhwytXsOO2gz0JGh/AL6TsonGqePYdESE7tBZ+sJz5tZ0q0yqEOLGSlxa7i5bF3KN3PCqK8eBdgBHWWDnWgO0blmPFKLYaehxZqnDHr8w5bHlW2yS1fYq8X5zkmz1fbkjpPFXX6TWsm8imlKsqzhSPBTrF+E/6f91TOLlv7tXIA0hi7Ex4ZOuzUCSs6qYWfPYPKWnguL8kmkG9wKnFahQwxVz2CM2ZPxhNQ8j03ao+wkBr6+pt6KhghqYJQ83c5GrzDXJWXbpuNdFt+RfPVLT0w17tWj3H80b/QZFa2TKQtSZ41jnAKPHHt3m178s3DfpQ6Hf1Zi1kvru0jiGKdph94j7zcYeB7uV3A="
2323
file: bin/docker-hostmanager.phar
2424
on:
2525
tags: true

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ FROM iamluc/composer
22

33
ADD . /usr/local/src/docker-hostmanager
44

5-
RUN composer install --no-interaction --prefer-dist --working-dir=/usr/local/src/docker-hostmanager \
5+
RUN composer install --no-interaction --no-dev --prefer-dist --working-dir=/usr/local/src/docker-hostmanager \
66
&& ln -s /usr/local/src/docker-hostmanager/bin/docker-hostmanager /usr/local/bin/docker-hostmanager
77

88
ENV HOSTS_FILE=/hosts

bin/docker-hostmanager

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ if (PHP_SAPI !== 'cli') {
77

88
require __DIR__.'/../vendor/autoload.php';
99

10-
use DockerHostManager\Command\RunCommand;
10+
use DockerHostManager\Command\SynchronizeHostsCommand;
1111
use Symfony\Component\Console\Application;
1212

1313
$application = new Application('DockerHostManager', '@package_version@');
14-
$application->add(new RunCommand());
14+
$application->add(new SynchronizeHostsCommand());
15+
$application->setDefaultCommand('synchronize-hosts');
1516
$application->run();
Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,39 @@
22

33
namespace DockerHostManager\Command;
44

5-
use DockerHostManager\Application;
5+
use Docker\Http\DockerClient;
6+
use DockerHostManager\Docker\Docker;
7+
use DockerHostManager\Synchronizer;
68
use Symfony\Component\Console\Command\Command;
7-
use Symfony\Component\Console\Input\InputArgument;
89
use Symfony\Component\Console\Input\InputInterface;
10+
use Symfony\Component\Console\Input\InputOption;
911
use Symfony\Component\Console\Output\OutputInterface;
1012

11-
class RunCommand extends Command
13+
class SynchronizeHostsCommand extends Command
1214
{
1315
protected function configure()
1416
{
1517
$this
1618
->setName('synchronize-hosts')
1719
->setDescription('Run the application')
18-
->addArgument(
20+
->addOption(
1921
'entrypoint',
20-
InputArgument::OPTIONAL,
22+
'p',
23+
InputOption::VALUE_REQUIRED,
2124
'The docker entrypoint',
2225
getenv('DOCKER_ENTRYPOINT') ?: 'unix:///var/run/docker.sock'
2326
)
24-
->addArgument(
27+
->addOption(
2528
'hosts_file',
26-
InputArgument::OPTIONAL,
29+
'f',
30+
InputOption::VALUE_REQUIRED,
2731
'The host file to update',
2832
getenv('HOSTS_FILE') ?: '/etc/hosts'
2933
)
30-
->addArgument(
34+
->addOption(
3135
'tld',
32-
InputArgument::OPTIONAL,
36+
't',
37+
InputOption::VALUE_REQUIRED,
3338
'The TLD to use',
3439
getenv('TLD') ?: '.docker'
3540
)
@@ -38,10 +43,12 @@ protected function configure()
3843

3944
protected function execute(InputInterface $input, OutputInterface $output)
4045
{
41-
$app = new Application(
42-
$input->getArgument('entrypoint'),
43-
$input->getArgument('hosts_file'),
44-
$input->getArgument('tld')
46+
$client = new DockerClient([], $input->getOption('entrypoint'));
47+
48+
$app = new Synchronizer(
49+
new Docker($client),
50+
$input->getOption('hosts_file'),
51+
$input->getOption('tld')
4552
);
4653

4754
$app->run();
Lines changed: 30 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -3,91 +3,74 @@
33
namespace DockerHostManager;
44

55
use Docker\Container;
6+
use Docker\Exception\APIException;
67
use Docker\Exception\ContainerNotFoundException;
78
use DockerHostManager\Docker\Docker;
89
use DockerHostManager\Docker\Event;
9-
use Docker\Http\DockerClient;
1010

11-
class Application
11+
class Synchronizer
1212
{
1313
const START_TAG = '## docker-hostmanager-start';
1414
const END_TAG = '## docker-hostmanager-end';
1515

16-
/** @var string */
17-
private $entrypoint;
16+
/** @var Docker */
17+
private $docker;
1818
/** @var string */
1919
private $hostsFile;
2020
/** @var string */
2121
private $tld;
2222

23-
/** @var Docker */
24-
private $docker;
2523
/** @var array Container */
2624
private $activeContainers = [];
2725

2826
/**
29-
* @param string $entrypoint
27+
* @param Docker $docker
3028
* @param string $hostsFile
3129
* @param string $tld
3230
*/
33-
public function __construct($entrypoint, $hostsFile, $tld)
31+
public function __construct(Docker $docker, $hostsFile, $tld)
3432
{
35-
$this->entrypoint = $entrypoint;
33+
$this->docker = $docker;
3634
$this->hostsFile = $hostsFile;
3735
$this->tld = $tld;
38-
$client = new DockerClient([], $this->entrypoint);
39-
$this->docker = new Docker($client);
4036
}
4137

4238
public function run()
4339
{
40+
if (!is_writable($this->hostsFile)) {
41+
throw new \RuntimeException(sprintf('File "%s" is not writable.', $this->hostsFile));
42+
}
43+
4444
$this->init();
4545
$this->listen();
4646
}
4747

4848
private function init()
4949
{
50-
$this->activeContainers = array_filter($this->docker->getContainerManager()->findAll(), function (Container $container) {
51-
$this->docker->getContainerManager()->inspect($container);
50+
foreach ($this->docker->getContainerManager()->findAll() as $container) {
51+
if ($this->isExposed($container)) {
52+
$this->activeContainers[$container->getId()] = $container;
53+
}
54+
}
5255

53-
return $this->isExposed($container);
54-
});
5556
$this->write();
5657
}
5758

5859
private function listen()
5960
{
6061
$this->docker->listenEvents(function (Event $event) {
6162
$container = $this->docker->getContainerManager()->find($event->getId());
62-
$this->docker->getContainerManager()->inspect($container);
63+
if (null === $container) {
64+
return;
65+
}
66+
6367
if ($this->isExposed($container)) {
64-
$this->addActiveContainer($container);
68+
$this->activeContainers[$container->getId()] = $container;
6569
} else {
66-
$this->removeActiveContainer($container);
70+
unset($this->activeContainers[$container->getId()]);
6771
}
68-
$this->write();
69-
});
70-
}
7172

72-
/**
73-
* @param Container $container
74-
*/
75-
private function addActiveContainer(Container $container)
76-
{
77-
$id = $container->getId();
78-
if (!empty($this->activeContainers[$id])) {
79-
return;
80-
}
81-
$this->activeContainers[$id] = $container;
82-
}
83-
84-
/**
85-
* @param Container $container
86-
*/
87-
private function removeActiveContainer(Container $container)
88-
{
89-
$this->activeContainers = array_filter($this->activeContainers, function (Container $c) use ($container) {
90-
return $c->getId() !== $container->getId();
73+
$this->write();
9174
});
9275
}
9376

@@ -121,8 +104,6 @@ function (Container $container) {
121104
*/
122105
private function getHostsLines(Container $container)
123106
{
124-
$this->docker->getContainerManager()->inspect($container);
125-
126107
$lines = [];
127108
$hosts = $this->getContainerHosts($container);
128109
foreach ($this->getContainerIps($container) as $ip) {
@@ -183,6 +164,13 @@ private function getContainerHosts(Container $container)
183164
*/
184165
private function isExposed(Container $container)
185166
{
167+
try {
168+
$this->docker->getContainerManager()->inspect($container);
169+
} catch (APIException $e) {
170+
// Happen on "docker build"
171+
return false;
172+
}
173+
186174
$inspection = $container->getRuntimeInformations();
187175
if (empty($inspection['NetworkSettings']['Ports']) || empty($inspection['State']['Running'])) {
188176
return false;

tests/DockerHostManager/ApplicationTest.php renamed to tests/DockerHostManager/SynchronizerTest.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,19 @@
33
namespace Test\DockerHostManager;
44

55
use Docker\Docker;
6-
use Docker\Http\DockerClient;
7-
use DockerHostManager\Application;
6+
use DockerHostManager\Synchronizer;
87
use Test\Utils\PropertyAccessor;
98

10-
class ApplicationTest extends \PHPUnit_Framework_TestCase
9+
class SynchronizerTest extends \PHPUnit_Framework_TestCase
1110
{
1211
public function testThatAppCanBeConstructed()
1312
{
14-
$application = new Application('unix:///var/run/docker.sock', '/etc/hosts', 'docker');
13+
$docker = $this->prophesize('DockerHostManager\Docker\Docker');
14+
$docker = $docker->reveal();
1515

16-
$this->assertSame('unix:///var/run/docker.sock', PropertyAccessor::getProperty($application, 'entrypoint'));
16+
$application = new Synchronizer($docker, '/etc/hosts', 'docker');
17+
18+
$this->assertSame($docker, PropertyAccessor::getProperty($application, 'docker'));
1719
$this->assertSame('/etc/hosts', PropertyAccessor::getProperty($application, 'hostsFile'));
1820
$this->assertSame('docker', PropertyAccessor::getProperty($application, 'tld'));
1921
$this->assertInstanceOf(Docker::class, PropertyAccessor::getProperty($application, 'docker'));

tests/bootstrap.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
<?php
22

3-
require __DIR__ . '/../vendor/autoload.php';
3+
require __DIR__.'/../vendor/autoload.php';

0 commit comments

Comments
 (0)