Passed
Push — master ( cceb62...73295c )
by Julien
02:03
created

NewServiceEventCommand::newImageToBuild()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 34
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 22
dl 0
loc 34
rs 9.568
c 0
b 0
f 0
cc 3
nc 3
nop 1
1
<?php
2
3
namespace TheAentMachine\AentDockerCompose\Command;
4
5
use TheAentMachine\AentDockerCompose\DockerCompose\DockerComposeService;
6
use TheAentMachine\Aenthill\Aenthill;
7
use TheAentMachine\Aenthill\CommonDependencies;
8
use TheAentMachine\Aenthill\CommonEvents;
9
use TheAentMachine\Aenthill\CommonMetadata;
10
use TheAentMachine\Aenthill\Manifest;
11
use TheAentMachine\Aenthill\Pheromone;
12
use TheAentMachine\Command\AbstractJsonEventCommand;
13
use TheAentMachine\Exception\CommonAentsException;
14
use TheAentMachine\Exception\ManifestException;
15
use TheAentMachine\Exception\MissingEnvironmentVariableException;
16
use TheAentMachine\Service\Exception\ServiceException;
17
use TheAentMachine\Service\Service;
18
19
class NewServiceEventCommand extends AbstractJsonEventCommand
20
{
21
    protected function getEventName(): string
22
    {
23
        return CommonEvents::NEW_SERVICE_EVENT;
24
    }
25
26
    /**
27
     * @param array $payload
28
     * @return array|null
29
     * @throws ManifestException
30
     * @throws MissingEnvironmentVariableException
31
     * @throws ServiceException
32
     * @throws CommonAentsException
33
     */
34
    protected function executeJsonEvent(array $payload): ?array
35
    {
36
        $service = Service::parsePayload($payload);
37
        if (!$service->isForMyEnvType()) {
38
            return null;
39
        }
40
41
        $fileName = Manifest::mustGetMetadata(CommonMetadata::DOCKER_COMPOSE_FILENAME_KEY);
42
        $dockerComposePath = Pheromone::getContainerProjectDirectory() . '/' . $fileName;
43
44
        $this->getAentHelper()->title($fileName);
45
46
        // Virtual Host
47
        if ($service->getNeedVirtualHost()) {
48
            if (null === Manifest::getDependency(CommonDependencies::REVERSE_PROXY_KEY)) {
49
                $this->getAentHelper()->getCommonQuestions()->askForReverseProxy();
50
                $this->runAddReverseProxy($dockerComposePath);
51
            }
52
            $service = $this->newVirtualHost($service);
53
        }
54
55
        if ($service->getNeedBuild()) {
56
            $service = $this->newImageToBuild($service);
57
        }
58
59
        $serviceName = $service->getServiceName();
60
        $formattedPayload = DockerComposeService::dockerComposeServiceSerialize($service);
61
        $this->log->debug(\GuzzleHttp\json_encode($formattedPayload, JSON_PRETTY_PRINT));
62
63
        // docker-compose
64
        $dockerComposePath = Pheromone::getContainerProjectDirectory() . '/' . $fileName;
65
        DockerComposeService::mergeContentInDockerComposeFile($formattedPayload, $dockerComposePath, true);
66
67
        $this->output->writeln("Service <info>$serviceName</info> has been successfully added in <info>$fileName</info>!");
68
69
        return null;
70
    }
71
72
    /**
73
     * @param string $dockerComposePath
74
     * @throws ManifestException
75
     * @throws ServiceException
76
     */
77
    private function runAddReverseProxy(string $dockerComposePath): void
78
    {
79
        $reverseProxyKey = Manifest::mustGetDependency(CommonDependencies::REVERSE_PROXY_KEY);
80
        $repliedPayloads = Aenthill::runJson($reverseProxyKey, CommonEvents::ADD_EVENT, []);
81
        $payload = \GuzzleHttp\json_decode($repliedPayloads[0], true);
82
        $service = Service::parsePayload($payload);
83
        $formattedPayload = DockerComposeService::dockerComposeServiceSerialize($service);
84
        DockerComposeService::mergeContentInDockerComposeFile($formattedPayload, $dockerComposePath, true);
85
86
        $serviceName = $service->getServiceName();
87
        $fileName = Manifest::mustGetMetadata(CommonMetadata::DOCKER_COMPOSE_FILENAME_KEY);
88
        $this->output->writeln("Reverse proxy <info>$serviceName</info> has been successfully added in <info>$fileName</info>!");
89
    }
90
91
92
    /**
93
     * @param Service $service
94
     * @return Service
95
     * @throws ManifestException
96
     * @throws ServiceException
97
     */
98
    private function newVirtualHost(Service $service): Service
99
    {
100
        $reverseProxyKey = Manifest::mustGetDependency(CommonDependencies::REVERSE_PROXY_KEY);
101
        $repliedPayloads = Aenthill::runJson($reverseProxyKey, CommonEvents::NEW_VIRTUAL_HOST_EVENT, $service->jsonSerialize());
102
        $payload = \GuzzleHttp\json_decode($repliedPayloads[0], true);
103
        $service = Service::parsePayload($payload);
104
105
        $serviceName = $service->getServiceName();
106
        $this->output->writeln("A new virtual host has been successfully added for <info>$serviceName</info>!");
107
        $this->getAentHelper()->spacer();
108
109
        return $service;
110
    }
111
112
    /**
113
     * @param Service $service
114
     * @return Service
115
     */
116
    private function newImageToBuild(Service $service): Service
117
    {
118
        $imageBuilderAentID = Manifest::getDependency(CommonDependencies::IMAGE_BUILDER_KEY);
119
        if (null === $imageBuilderAentID) {
120
            return $service;
121
        }
122
123
        $repliedPayloads = Aenthill::runJson($imageBuilderAentID, CommonEvents::NEW_IMAGE_EVENT, $service->imageJsonSerialize());
124
        $payload = \GuzzleHttp\json_decode($repliedPayloads[0], true);
125
        $dockerfileName = $payload['dockerfileName'];
126
        $this->getAentHelper()->spacer();
127
128
        $CIAentID = Manifest::getDependency(CommonDependencies::CI_KEY);
129
        if (null === $CIAentID) {
130
            return $service;
131
        }
132
133
        $serviceName = $service->getServiceName();
134
135
        $repliedPayloads = Aenthill::runJson($CIAentID, CommonEvents::NEW_BUILD_IMAGE_JOB_EVENT, [
136
            'serviceName' => $serviceName,
137
            'dockerfileName' => $dockerfileName,
138
        ]);
139
        $payload = \GuzzleHttp\json_decode($repliedPayloads[0], true);
140
141
        $dockerImageName = $payload['dockerImageName'];
142
        $service->setImage($dockerImageName);
143
        $service->removeAllBindVolumes();
144
145
        $this->getAentHelper()->spacer();
146
        $this->output->writeln("Service <info>$serviceName</info> is now using image <info>$dockerImageName</info>!");
147
        $this->getAentHelper()->spacer();
148
149
        return $service;
150
    }
151
}
152