Completed
Push — master ( ca39d5...12bd24 )
by Danny
10:03
created

SupervisorConfiguration::generate()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 41
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 41
ccs 0
cts 36
cp 0
rs 8.8571
c 0
b 0
f 0
cc 1
eloc 18
nc 1
nop 0
crap 2
1
<?php
2
3
namespace MyOnlineStore\Bundle\RabbitMqManagerBundle\Configuration\Supervisor;
4
5
use MyOnlineStore\Bundle\RabbitMqManagerBundle\Configuration\Section\SectionCollection;
6
use MyOnlineStore\Bundle\RabbitMqManagerBundle\Process\ProcessBuilderFactoryInterface;
7
use Supervisor\Configuration\Section\Program;
8
9
class SupervisorConfiguration
10
{
11
    /**
12
     * @var SupervisorSectionFactoryInterface
13
     */
14
    private $sectionFactory;
15
16
    /**
17
     * @var ProcessBuilderFactoryInterface
18
     */
19
    private $processBuilderFactory;
20
21
    /**
22
     * @var string
23
     */
24
    private $path;
25
26
    /**
27
     * @param SupervisorSectionFactoryInterface $sectionFactory
28
     * @param ProcessBuilderFactoryInterface    $processBuilderFactory
29
     * @param string                            $path
30
     */
31
    public function __construct(
32
        SupervisorSectionFactoryInterface $sectionFactory,
33
        ProcessBuilderFactoryInterface $processBuilderFactory,
34
        $path
35
    ) {
36
        $this->sectionFactory = $sectionFactory;
37
        $this->processBuilderFactory = $processBuilderFactory;
38
        $this->path = $path;
39
    }
40
41
    public function generate()
42
    {
43
        $sections = new SectionCollection();
44
45
        $sections->addSection(
46
            $this->sectionFactory->createUnixHttpServer(
47
                [
48
                    'file' => sprintf('%s/supervisord.sock', $this->path),
49
                    'chmod' => 700,
50
                ]
51
            )
52
        );
53
54
        $sections->addSection(
55
            $this->sectionFactory->createSupervisord(
56
                [
57
                    'logfile' => sprintf('%s/supervisord.log', $this->path),
58
                    'pidfile' => sprintf('%s/supervisord.pid', $this->path),
59
                ]
60
            )
61
        );
62
63
        $sections->addSection(
64
            $this->sectionFactory->createRpcInterface(
65
                'supervisor',
66
                [
67
                    'supervisor.rpcinterface_factory' => 'supervisor.rpcinterface:make_main_rpcinterface',
68
                ]
69
            )
70
        );
71
72
        $sections->addSection(
73
            $this->sectionFactory->createSupervisorctl(
74
                [
75
                    'serverurl' => sprintf('unix://%s/supervisord.sock', $this->path),
76
                ]
77
            )
78
        );
79
80
        return $sections;
81
    }
82
83
    /**
84
     * @param string $name
85
     * @param array  $properties
86
     *
87
     * @return Program
88
     */
89
    public function generateProgram($name, array $properties = [])
90
    {
91
        return $this->sectionFactory->createProgram($name, $properties);
92
    }
93
94
    /**
95
     * @param array       $consumer
96
     * @param null|string $route
97
     *
98
     * @return array
99
     */
100
    public function getBundleProperties(array $consumer, $route = null)
101
    {
102
        $processBuilder = $this->processBuilderFactory->create();
103
        $processBuilder->setPrefix(['php']);
104
        $processBuilder->add($consumer['command']['console']);
105
106
        foreach ($consumer['command']['arguments'] as $argument) {
107
            $processBuilder->add($argument);
108
        }
109
110
        $processBuilder->add(sprintf('--messages=%s', $consumer['messages']));
111
112
        if (null !== $route) {
113
            $processBuilder->add(sprintf('--route=%s', $route));
114
        }
115
116
        $processBuilder->add($consumer['command']['command']);
117
        $processBuilder->add($consumer['name']);
118
        $process = $processBuilder->getProcess();
119
120
        return [
121
            'command' => $process->getCommandLine(),
122
            'process_name' => '%(program_name)s%(process_num)02d',
123
            'numprocs' => $consumer['supervisor']['count'],
124
            'startsecs' => $consumer['supervisor']['startsecs'],
125
            'autorestart' => $consumer['supervisor']['autorestart'],
126
            'stopsignal' => $consumer['supervisor']['stopsignal'],
127
            'stopwaitsecs' => $consumer['supervisor']['stopwaitsecs'],
128
        ];
129
    }
130
131
    /**
132
     * @param array       $consumer
133
     * @param null|string $consumerConfiguration
134
     *
135
     * @return array
136
     */
137
    public function getConsumerProperties(array $consumer, $consumerConfiguration = null)
138
    {
139
        $processBuilder = $this->processBuilderFactory->create();
140
        $processBuilder->setPrefix(['php']);
141
        $processBuilder->add($consumer['command']['console']);
142
143
        foreach ($consumer['command']['arguments'] as $argument) {
144
            $processBuilder->add($argument);
145
        }
146
147
        $processBuilder->add($consumer['command']['command']);
148
        $processBuilder->add($consumer['name']);
149
150
        $consumerProcessBuilder = $this->processBuilderFactory->create();
151
        $consumerProcessBuilder->setPrefix(['rabbitmq-cli-consumer']);
152
        $consumerProcessBuilder->add('--strict-exit-code');
153
        $consumerProcessBuilder->add('--include');
154
        $consumerProcessBuilder->add(sprintf('--configuration=%s', $consumerConfiguration));
155
        $consumerProcessBuilder->add(sprintf('--executable=%s', $processBuilder->getProcess()->getCommandLine()));
156
157
        $process = $consumerProcessBuilder->getProcess();
158
159
        return [
160
            'command' => $process->getCommandLine(),
161
            'process_name' => '%(program_name)s%(process_num)02d',
162
            'numprocs' => $consumer['supervisor']['count'],
163
            'startsecs' => $consumer['supervisor']['startsecs'],
164
            'autorestart' => $consumer['supervisor']['autorestart'],
165
            'stopsignal' => $consumer['supervisor']['stopsignal'],
166
            'stopwaitsecs' => $consumer['supervisor']['stopwaitsecs'],
167
        ];
168
    }
169
}
170