This repository was archived by the owner on Oct 26, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 266
Expand file tree
/
Copy pathContainerManager.php
More file actions
110 lines (89 loc) · 3.38 KB
/
Copy pathContainerManager.php
File metadata and controls
110 lines (89 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<?php
namespace Docker\Manager;
use Docker\API\Resource\ContainerResource;
use Docker\Stream\AttachWebsocketStream;
use Docker\Stream\DockerRawStaticStream;
use Docker\Stream\DockerRawStream;
use Joli\Jane\OpenApi\Runtime\Client\QueryParam;
class ContainerManager extends ContainerResource
{
const FETCH_STREAM = 'stream';
/**
* {@inheritdoc}
*
* @return \Psr\Http\Message\ResponseInterface|DockerRawStream
*/
public function attach($id, $parameters = [], $fetch = self::FETCH_STREAM)
{
$response = parent::attach($id, $parameters, $fetch);
if ($response->getStatusCode() == 200 && DockerRawStream::HEADER == $response->getHeaderLine('Content-Type')) {
if ($fetch == self::FETCH_STREAM) {
return new DockerRawStream($response->getBody());
}
}
return $response;
}
/**
* {@inheritdoc}
*
* @return \Psr\Http\Message\ResponseInterface|AttachWebsocketStream
*/
public function attachWebsocket($id, $parameters = [], $fetch = self::FETCH_STREAM)
{
$queryParam = new QueryParam();
$queryParam->setDefault('logs', null);
$queryParam->setDefault('stream', null);
$queryParam->setDefault('stdin', null);
$queryParam->setDefault('stdout', null);
$queryParam->setDefault('stderr', null);
$url = '/containers/{id}/attach/ws';
$url = str_replace('{id}', $id, $url);
$url = $url . ('?' . $queryParam->buildQueryString($parameters));
$headers = array_merge([
'Host' => 'localhost',
'Origin' => 'php://docker-php',
'Upgrade' => 'websocket',
'Connection' => 'Upgrade',
'Sec-WebSocket-Version' => '13',
'Sec-WebSocket-Key' => base64_encode(uniqid()),
], $queryParam->buildHeaders($parameters));
$body = $queryParam->buildFormDataString($parameters);
$request = $this->messageFactory->createRequest('GET', $url, $headers, $body);
$response = $this->httpClient->sendRequest($request);
if ($response->getStatusCode() == 101) {
if ($fetch == self::FETCH_STREAM) {
return new AttachWebsocketStream($response->getBody());
}
}
return $response;
}
/**
* @inheritDoc
*
* @return \Psr\Http\Message\ResponseInterface|DockerRawStream|string[][]
*/
public function logs($id, $parameters = [], $fetch = self::FETCH_OBJECT) {
$response = parent::logs($id, $parameters, $fetch);
if ($response->getStatusCode() == 200) {
if ($fetch == self::FETCH_STREAM) {
return new DockerRawStream($response->getBody());
}
if ($fetch == self::FETCH_OBJECT) {
$dockerRawStream = new DockerRawStream($response->getBody());
$logs = [
'stdout' => [],
'stderr' => []
];
$dockerRawStream->onStdout(function ($logLine) use (&$logs) {
$logs['stdout'][] = $logLine;
});
$dockerRawStream->onStderr(function ($logLine) use (&$logs) {
$logs['stderr'][] = $logLine;
});
$dockerRawStream->wait();
return $logs;
}
}
return $response;
}
}