Passed
Push — test ( fa30dd...bc3c71 )
by Tom
02:20
created

StepContainers::execKillAndRemove()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 3
eloc 4
c 1
b 0
f 1
nc 4
nop 4
dl 0
loc 8
ccs 5
cts 5
cp 1
crap 3
rs 10
1
<?php
2
3
/* this file is part of pipelines */
4
5
namespace Ktomk\Pipelines\Runner;
6
7
use Ktomk\Pipelines\Cli\Docker;
8
use Ktomk\Pipelines\Cli\Exec;
9
use Ktomk\Pipelines\Cli\Streams;
10
use Ktomk\Pipelines\File\Definitions\Service;
11
use Ktomk\Pipelines\File\Pipeline\Step;
12
use Ktomk\Pipelines\Lib;
13
use Ktomk\Pipelines\Runner\Containers\NameBuilder;
14
use Ktomk\Pipelines\Runner\Docker\ImageLogin;
15
16
/**
17
 * Class StepContainers
18
 *
19
 * Extraction of more generic container functionality from the
20
 * StepContainer that is more specific and did host them since
21
 * introducing services
22
 *
23
 *
24
 * @package Ktomk\Pipelines\Runner
25
 */
26
class StepContainers
27
{
28
    /**
29
     * @var Step
30
     */
31
    private $step;
32
33
    /**
34
     * @var Exec
35
     */
36
    private $exec;
37
38
    /**
39
     * kill and remove static implementation
40
     *
41
     * @param Exec $exec
42
     * @param string|string[] $idOrIds container id(s) or name(s)
43
     * @param bool $kill
44
     * @param bool $remove
45
     *
46
     * @return void
47
     */
48 2
    public static function execKillAndRemove(Exec $exec, $idOrIds, $kill, $remove)
49
    {
50 2
        if ($kill) {
51 2
            Docker::create($exec)->getProcessManager()->kill($idOrIds);
52
        }
53
54 2
        if ($remove) {
55 2
            Docker::create($exec)->getProcessManager()->remove($idOrIds);
56
        }
57 2
    }
58
59
    /**
60
     * @param Exec $exec
61
     * @param array $args
62
     *
63
     * @return array array(int $status, string $out, string $err, string|null $id)
64
     */
65 1
    public static function execRun(Exec $exec, array $args)
66
    {
67 1
        $status = $exec->capture('docker', Lib::merge('run', $args), $out, $err);
68
69 1
        $id = null;
70 1
        if (0 === $status) {
71 1
            $id = rtrim($out) ?: null;
72
        }
73
74 1
        return array($status, $out, $err, $id);
75
    }
76
77
    /**
78
     * @param Exec $exec
79
     * @param Service $service
80
     * @param callable $resolver
81
     * @param string $prefix
82
     * @param string $project
83
     *
84
     * @return array(int $status, array $network)
85
     */
86 1
    public static function execRunServiceContainer(Exec $exec, Service $service, $resolver, $prefix, $project)
87
    {
88 1
        $execRunServiceRunner = self::execRunServiceContainerImpl($exec, $service, $resolver, $prefix, $project);
89
90 1
        return $execRunServiceRunner(false, '--detach');
91
    }
92
93
    /**
94
     * @param Exec $exec
95
     * @param Service $service
96
     * @param callable $resolver
97
     * @param string $prefix
98
     * @param string $project
99
     *
100
     * @return array
101
     */
102 1
    public static function execRunServiceContainerAttached(Exec $exec, Service $service, $resolver, $prefix, $project)
103
    {
104 1
        $execRunServiceRunner = self::execRunServiceContainerImpl($exec, $service, $resolver, $prefix, $project);
105
106 1
        return $execRunServiceRunner(true, '--rm');
107
    }
108
109
    /**
110
     * @param Exec $exec
111
     * @param Service $service
112
     * @param callable $resolver
113
     * @param string $prefix
114
     * @param string $project
115
     *
116
     * @return \Closure
117
     */
118
    public static function execRunServiceContainerImpl(Exec $exec, Service $service, $resolver, $prefix, $project)
119
    {
120
        /**
121
         * @param bool $pass (or capture)
122
         * @param string $additionalArg
123
         *
124
         * @return array
125
         */
126 3
        return function ($pass, $additionalArg) use ($exec, $service, $resolver, $prefix, $project) {
127 3
            $network = array('--network', 'host');
128 3
            $image = $service->getImage();
129 3
            ImageLogin::loginImage($exec, $resolver, null, $image);
130
131 3
            $containerName = NameBuilder::serviceContainerName($prefix, $service->getName(), $project);
132
133 3
            $variables = $resolver($service->getVariables());
134
135
            $args = array(
136 3
                $network, '--name',
137 3
                $containerName,
138 3
                $additionalArg,
139 3
                Env::createArgVarDefinitions('-e', $variables),
140 3
                $image->getName(),
141
            );
142
143 3
            $status = $pass
144 2
                ? $exec->pass('docker', Lib::merge('run', $args))
145 3
                : $exec->capture('docker', Lib::merge('run', $args), $out, $err);
146
147 3
            return array($status, $network);
148 3
        };
149
    }
150
151
    /**
152
     * @param Exec $exec
153
     * @param Streams $streams
154
     * @param string|string[] $idOrIds
155
     * @param int $status
156
     * @param Flags $flags
157
     * @param string $message
158
     * @param string $id
159
     *
160
     * @return void
161
     *
162
     * @see StepRunner::shutdownStepContainer
163
     */
164 1
    public static function execShutdownContainer(Exec $exec, Streams $streams, $idOrIds, $status, Flags $flags, $message)
165
    {
166
        # keep container on error
167 1
        if (0 !== $status && $flags->keepOnError()) {
168 1
            $streams->err(sprintf("error, %s\n", $message));
169
170 1
            return;
171
        }
172
173
        # keep or kill/remove container
174 1
        StepContainers::execKillAndRemove($exec, $idOrIds, $flags->killContainer(), $flags->removeContainer());
175
176 1
        if ($flags->keep()) {
177 1
            $streams->out(sprintf("%s\n", $message));
178
        }
179 1
    }
180
181
    /**
182
     * StepContainers constructor.
183
     *
184
     * @param Step $step
185
     */
186 1
    public function __construct(Step $step, Exec $exec)
187
    {
188 1
        $this->step = $step;
189 1
        $this->exec = $exec;
190 1
    }
191
}
192