@generacy-ai/control-plane 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/errors.d.ts +1 -1
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/routes/app-config.d.ts +1 -1
- package/dist/src/routes/app-config.d.ts.map +1 -1
- package/dist/src/routes/app-config.js +5 -16
- package/dist/src/routes/app-config.js.map +1 -1
- package/dist/src/routes/lifecycle.d.ts.map +1 -1
- package/dist/src/routes/lifecycle.js +64 -1
- package/dist/src/routes/lifecycle.js.map +1 -1
- package/dist/src/schemas.d.ts +73 -4
- package/dist/src/schemas.d.ts.map +1 -1
- package/dist/src/schemas.js +23 -0
- package/dist/src/schemas.js.map +1 -1
- package/dist/src/services/docker-engine-client.d.ts +57 -0
- package/dist/src/services/docker-engine-client.d.ts.map +1 -0
- package/dist/src/services/docker-engine-client.js +326 -0
- package/dist/src/services/docker-engine-client.js.map +1 -0
- package/dist/src/services/docker-engine-types.d.ts +152 -0
- package/dist/src/services/docker-engine-types.d.ts.map +1 -0
- package/dist/src/services/docker-engine-types.js +37 -0
- package/dist/src/services/docker-engine-types.js.map +1 -0
- package/dist/src/services/worker-enumeration.d.ts +31 -0
- package/dist/src/services/worker-enumeration.d.ts.map +1 -0
- package/dist/src/services/worker-enumeration.js +71 -0
- package/dist/src/services/worker-enumeration.js.map +1 -0
- package/dist/src/services/worker-scaler.d.ts +128 -0
- package/dist/src/services/worker-scaler.d.ts.map +1 -0
- package/dist/src/services/worker-scaler.js +405 -0
- package/dist/src/services/worker-scaler.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import { DockerEngineError, DockerDaemonUnavailableError, } from './docker-engine-types.js';
|
|
3
|
+
const DEFAULT_DOCKER_HOST = 'unix:///var/run/docker-host.sock';
|
|
4
|
+
const DEFAULT_REQUEST_TIMEOUT = 30_000;
|
|
5
|
+
export class DockerEngineClient {
|
|
6
|
+
socketPath;
|
|
7
|
+
requestTimeout;
|
|
8
|
+
constructor(options = {}) {
|
|
9
|
+
const dockerHost = options.dockerHost ?? process.env['DOCKER_HOST'] ?? DEFAULT_DOCKER_HOST;
|
|
10
|
+
if (!dockerHost.startsWith('unix://')) {
|
|
11
|
+
throw new Error(`DOCKER_HOST must use unix:// scheme (got "${dockerHost}"); TCP not supported by this client`);
|
|
12
|
+
}
|
|
13
|
+
this.socketPath = dockerHost.slice('unix://'.length);
|
|
14
|
+
this.requestTimeout = options.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT;
|
|
15
|
+
}
|
|
16
|
+
async listContainers(opts = {}) {
|
|
17
|
+
const query = {};
|
|
18
|
+
if (opts.all)
|
|
19
|
+
query['all'] = 'true';
|
|
20
|
+
if (opts.filters) {
|
|
21
|
+
// Docker expects filters as a URL-encoded JSON object of label→value-array maps.
|
|
22
|
+
const labelFilters = [];
|
|
23
|
+
const otherFilters = {};
|
|
24
|
+
for (const [key, values] of Object.entries(opts.filters)) {
|
|
25
|
+
if (key === 'label') {
|
|
26
|
+
labelFilters.push(...values);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
otherFilters[key] = values;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const filterObj = { ...otherFilters };
|
|
33
|
+
if (labelFilters.length > 0)
|
|
34
|
+
filterObj['label'] = labelFilters;
|
|
35
|
+
query['filters'] = JSON.stringify(filterObj);
|
|
36
|
+
}
|
|
37
|
+
const path = `/containers/json${this.buildQueryString(query)}`;
|
|
38
|
+
const res = await this.request('GET', path);
|
|
39
|
+
this.assertOk(res, path);
|
|
40
|
+
return JSON.parse(res.body);
|
|
41
|
+
}
|
|
42
|
+
async inspectContainer(id) {
|
|
43
|
+
const path = `/containers/${encodeURIComponent(id)}/json`;
|
|
44
|
+
const res = await this.request('GET', path);
|
|
45
|
+
this.assertOk(res, path);
|
|
46
|
+
return JSON.parse(res.body);
|
|
47
|
+
}
|
|
48
|
+
async createContainer(name, config) {
|
|
49
|
+
const path = `/containers/create?name=${encodeURIComponent(name)}`;
|
|
50
|
+
const res = await this.request('POST', path, JSON.stringify(config));
|
|
51
|
+
this.assertOk(res, path, 201);
|
|
52
|
+
return JSON.parse(res.body);
|
|
53
|
+
}
|
|
54
|
+
async startContainer(id) {
|
|
55
|
+
const path = `/containers/${encodeURIComponent(id)}/start`;
|
|
56
|
+
const res = await this.request('POST', path);
|
|
57
|
+
this.assertOk(res, path, 204);
|
|
58
|
+
}
|
|
59
|
+
async stopContainer(id) {
|
|
60
|
+
const path = `/containers/${encodeURIComponent(id)}/stop`;
|
|
61
|
+
const res = await this.request('POST', path);
|
|
62
|
+
// Engine returns 204 on stop, 304 if already stopped (both fine).
|
|
63
|
+
if (res.statusCode === 204 || res.statusCode === 304)
|
|
64
|
+
return;
|
|
65
|
+
this.assertOk(res, path, 204);
|
|
66
|
+
}
|
|
67
|
+
async removeContainer(id, opts = {}) {
|
|
68
|
+
const query = opts.force ? '?force=true' : '';
|
|
69
|
+
const path = `/containers/${encodeURIComponent(id)}${query}`;
|
|
70
|
+
const res = await this.request('DELETE', path);
|
|
71
|
+
this.assertOk(res, path, 204);
|
|
72
|
+
}
|
|
73
|
+
async connectNetwork(networkId, body) {
|
|
74
|
+
const path = `/networks/${encodeURIComponent(networkId)}/connect`;
|
|
75
|
+
const res = await this.request('POST', path, JSON.stringify(body));
|
|
76
|
+
this.assertOk(res, path);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Subscribe to the Docker Engine `/events` stream.
|
|
80
|
+
*
|
|
81
|
+
* Returns an async iterable that yields one `EngineEvent` per newline-delimited
|
|
82
|
+
* JSON line from the daemon. The stream is long-lived; consumers should
|
|
83
|
+
* implement their own reconnect/backoff. The iterator returns when:
|
|
84
|
+
* - the daemon closes the stream (e.g. its own restart),
|
|
85
|
+
* - the consumer breaks out of the `for await` loop, or
|
|
86
|
+
* - `opts.signal` aborts.
|
|
87
|
+
*
|
|
88
|
+
* Throws `DockerDaemonUnavailableError` if the initial socket connection is
|
|
89
|
+
* refused or the socket file is missing.
|
|
90
|
+
*/
|
|
91
|
+
streamContainerEvents(opts) {
|
|
92
|
+
const socketPath = this.socketPath;
|
|
93
|
+
const filtersParam = encodeURIComponent(JSON.stringify(opts.filters));
|
|
94
|
+
const path = `/events?filters=${filtersParam}`;
|
|
95
|
+
const signal = opts.signal;
|
|
96
|
+
return {
|
|
97
|
+
[Symbol.asyncIterator]() {
|
|
98
|
+
let res = null;
|
|
99
|
+
let buffer = '';
|
|
100
|
+
let ended = false;
|
|
101
|
+
const eventQueue = [];
|
|
102
|
+
let pendingResolve = null;
|
|
103
|
+
let pendingReject = null;
|
|
104
|
+
let initError = null;
|
|
105
|
+
let connected = false;
|
|
106
|
+
const settle = () => {
|
|
107
|
+
if (!pendingResolve && !pendingReject)
|
|
108
|
+
return;
|
|
109
|
+
if (initError && !connected) {
|
|
110
|
+
const reject = pendingReject;
|
|
111
|
+
pendingResolve = null;
|
|
112
|
+
pendingReject = null;
|
|
113
|
+
reject?.(initError);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (eventQueue.length > 0) {
|
|
117
|
+
const value = eventQueue.shift();
|
|
118
|
+
const resolve = pendingResolve;
|
|
119
|
+
pendingResolve = null;
|
|
120
|
+
pendingReject = null;
|
|
121
|
+
resolve?.({ value, done: false });
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (ended) {
|
|
125
|
+
const resolve = pendingResolve;
|
|
126
|
+
pendingResolve = null;
|
|
127
|
+
pendingReject = null;
|
|
128
|
+
resolve?.({ value: undefined, done: true });
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
const handleLine = (line) => {
|
|
132
|
+
const trimmed = line.trim();
|
|
133
|
+
if (trimmed.length === 0)
|
|
134
|
+
return;
|
|
135
|
+
try {
|
|
136
|
+
const parsed = JSON.parse(trimmed);
|
|
137
|
+
eventQueue.push(parsed);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
console.warn(`[docker-engine-client] skipping malformed /events line: ${trimmed.slice(0, 200)} (${err instanceof Error ? err.message : String(err)})`);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
const req = http.request({
|
|
144
|
+
socketPath,
|
|
145
|
+
path,
|
|
146
|
+
method: 'GET',
|
|
147
|
+
headers: { Host: 'docker' },
|
|
148
|
+
}, (response) => {
|
|
149
|
+
res = response;
|
|
150
|
+
const statusCode = response.statusCode ?? 0;
|
|
151
|
+
if (statusCode < 200 || statusCode >= 300) {
|
|
152
|
+
// Consume body for the error message, then signal initError.
|
|
153
|
+
let body = '';
|
|
154
|
+
response.on('data', (chunk) => {
|
|
155
|
+
body += chunk.toString();
|
|
156
|
+
});
|
|
157
|
+
response.on('end', () => {
|
|
158
|
+
initError = new DockerEngineError(statusCode, path, body || '<no body>');
|
|
159
|
+
settle();
|
|
160
|
+
});
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
connected = true;
|
|
164
|
+
response.setEncoding('utf8');
|
|
165
|
+
response.on('data', (chunk) => {
|
|
166
|
+
buffer += chunk;
|
|
167
|
+
let idx = buffer.indexOf('\n');
|
|
168
|
+
while (idx !== -1) {
|
|
169
|
+
const line = buffer.slice(0, idx);
|
|
170
|
+
buffer = buffer.slice(idx + 1);
|
|
171
|
+
handleLine(line);
|
|
172
|
+
idx = buffer.indexOf('\n');
|
|
173
|
+
}
|
|
174
|
+
settle();
|
|
175
|
+
});
|
|
176
|
+
response.on('end', () => {
|
|
177
|
+
if (buffer.length > 0) {
|
|
178
|
+
handleLine(buffer);
|
|
179
|
+
buffer = '';
|
|
180
|
+
}
|
|
181
|
+
ended = true;
|
|
182
|
+
settle();
|
|
183
|
+
});
|
|
184
|
+
response.on('error', (err) => {
|
|
185
|
+
if (!ended) {
|
|
186
|
+
initError = err;
|
|
187
|
+
ended = true;
|
|
188
|
+
settle();
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
req.on('error', (err) => {
|
|
193
|
+
const code = err.code;
|
|
194
|
+
if (!connected) {
|
|
195
|
+
if (code === 'ECONNREFUSED' || code === 'ENOENT') {
|
|
196
|
+
initError = new DockerDaemonUnavailableError(socketPath, err);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
initError = err;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
ended = true;
|
|
203
|
+
settle();
|
|
204
|
+
});
|
|
205
|
+
const abortHandler = () => {
|
|
206
|
+
ended = true;
|
|
207
|
+
try {
|
|
208
|
+
req.destroy();
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
// ignore
|
|
212
|
+
}
|
|
213
|
+
if (res) {
|
|
214
|
+
try {
|
|
215
|
+
res.destroy();
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// ignore
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
settle();
|
|
222
|
+
};
|
|
223
|
+
if (signal) {
|
|
224
|
+
if (signal.aborted) {
|
|
225
|
+
abortHandler();
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
signal.addEventListener('abort', abortHandler, { once: true });
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
req.end();
|
|
232
|
+
return {
|
|
233
|
+
next() {
|
|
234
|
+
return new Promise((resolve, reject) => {
|
|
235
|
+
pendingResolve = resolve;
|
|
236
|
+
pendingReject = reject;
|
|
237
|
+
settle();
|
|
238
|
+
});
|
|
239
|
+
},
|
|
240
|
+
return() {
|
|
241
|
+
ended = true;
|
|
242
|
+
try {
|
|
243
|
+
req.destroy();
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
// ignore
|
|
247
|
+
}
|
|
248
|
+
if (res) {
|
|
249
|
+
try {
|
|
250
|
+
res.destroy();
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
// ignore
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (signal) {
|
|
257
|
+
signal.removeEventListener('abort', abortHandler);
|
|
258
|
+
}
|
|
259
|
+
return Promise.resolve({ value: undefined, done: true });
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
buildQueryString(query) {
|
|
266
|
+
const entries = Object.entries(query);
|
|
267
|
+
if (entries.length === 0)
|
|
268
|
+
return '';
|
|
269
|
+
return '?' + entries.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join('&');
|
|
270
|
+
}
|
|
271
|
+
assertOk(res, endpoint, expected = 200) {
|
|
272
|
+
if (res.statusCode === expected)
|
|
273
|
+
return;
|
|
274
|
+
if (res.statusCode >= 200 && res.statusCode < 300)
|
|
275
|
+
return;
|
|
276
|
+
let engineMessage = res.body;
|
|
277
|
+
try {
|
|
278
|
+
const parsed = JSON.parse(res.body);
|
|
279
|
+
if (parsed.message)
|
|
280
|
+
engineMessage = parsed.message;
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
// Body wasn't JSON — keep raw text.
|
|
284
|
+
}
|
|
285
|
+
throw new DockerEngineError(res.statusCode, endpoint, engineMessage);
|
|
286
|
+
}
|
|
287
|
+
request(method, path, body) {
|
|
288
|
+
return new Promise((resolve, reject) => {
|
|
289
|
+
const req = http.request({
|
|
290
|
+
socketPath: this.socketPath,
|
|
291
|
+
path,
|
|
292
|
+
method,
|
|
293
|
+
headers: {
|
|
294
|
+
...(body !== undefined && {
|
|
295
|
+
'Content-Type': 'application/json',
|
|
296
|
+
'Content-Length': Buffer.byteLength(body),
|
|
297
|
+
}),
|
|
298
|
+
},
|
|
299
|
+
}, (res) => {
|
|
300
|
+
let data = '';
|
|
301
|
+
res.on('data', (chunk) => {
|
|
302
|
+
data += chunk.toString();
|
|
303
|
+
});
|
|
304
|
+
res.on('end', () => {
|
|
305
|
+
resolve({ statusCode: res.statusCode ?? 500, body: data });
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
req.setTimeout(this.requestTimeout, () => {
|
|
309
|
+
req.destroy(new Error('Docker Engine API request timeout'));
|
|
310
|
+
});
|
|
311
|
+
req.on('error', (err) => {
|
|
312
|
+
const code = err.code;
|
|
313
|
+
if (code === 'ECONNREFUSED' || code === 'ENOENT') {
|
|
314
|
+
reject(new DockerDaemonUnavailableError(this.socketPath, err));
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
reject(err);
|
|
318
|
+
});
|
|
319
|
+
if (body !== undefined) {
|
|
320
|
+
req.write(body);
|
|
321
|
+
}
|
|
322
|
+
req.end();
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=docker-engine-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-engine-client.js","sourceRoot":"","sources":["../../../src/services/docker-engine-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
export type ContainerState = 'running' | 'exited' | 'paused' | 'restarting' | 'dead' | 'created';
|
|
2
|
+
export interface ContainerSummary {
|
|
3
|
+
Id: string;
|
|
4
|
+
Names: string[];
|
|
5
|
+
Labels: Record<string, string>;
|
|
6
|
+
State: ContainerState;
|
|
7
|
+
NetworkSettings?: {
|
|
8
|
+
Networks?: Record<string, {
|
|
9
|
+
NetworkID: string;
|
|
10
|
+
}>;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface NetworkEndpoint {
|
|
14
|
+
NetworkID: string;
|
|
15
|
+
Aliases?: string[];
|
|
16
|
+
IPAddress?: string;
|
|
17
|
+
IPPrefixLen?: number;
|
|
18
|
+
IPAMConfig?: {
|
|
19
|
+
IPv4Address?: string;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export interface HealthConfig {
|
|
23
|
+
Test?: string[];
|
|
24
|
+
Interval?: number;
|
|
25
|
+
Timeout?: number;
|
|
26
|
+
Retries?: number;
|
|
27
|
+
StartPeriod?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface Mount {
|
|
30
|
+
Type: 'bind' | 'volume' | 'tmpfs';
|
|
31
|
+
Source?: string;
|
|
32
|
+
Target: string;
|
|
33
|
+
ReadOnly?: boolean;
|
|
34
|
+
BindOptions?: {
|
|
35
|
+
Propagation?: string;
|
|
36
|
+
};
|
|
37
|
+
VolumeOptions?: {
|
|
38
|
+
NoCopy?: boolean;
|
|
39
|
+
Labels?: Record<string, string>;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export interface ContainerInspect {
|
|
43
|
+
Id: string;
|
|
44
|
+
Name: string;
|
|
45
|
+
Image: string;
|
|
46
|
+
Config: {
|
|
47
|
+
Hostname?: string;
|
|
48
|
+
Domainname?: string;
|
|
49
|
+
User?: string;
|
|
50
|
+
Env?: string[];
|
|
51
|
+
Cmd?: string[];
|
|
52
|
+
Entrypoint?: string[] | string;
|
|
53
|
+
Labels?: Record<string, string>;
|
|
54
|
+
WorkingDir?: string;
|
|
55
|
+
Healthcheck?: HealthConfig;
|
|
56
|
+
StopSignal?: string;
|
|
57
|
+
StopTimeout?: number;
|
|
58
|
+
ExposedPorts?: Record<string, Record<string, never>>;
|
|
59
|
+
};
|
|
60
|
+
HostConfig: {
|
|
61
|
+
Binds?: string[];
|
|
62
|
+
Mounts?: Mount[];
|
|
63
|
+
NetworkMode?: string;
|
|
64
|
+
RestartPolicy?: {
|
|
65
|
+
Name: string;
|
|
66
|
+
MaximumRetryCount?: number;
|
|
67
|
+
};
|
|
68
|
+
LogConfig?: {
|
|
69
|
+
Type: string;
|
|
70
|
+
Config: Record<string, string>;
|
|
71
|
+
};
|
|
72
|
+
Resources?: {
|
|
73
|
+
Memory?: number;
|
|
74
|
+
MemorySwap?: number;
|
|
75
|
+
CpuShares?: number;
|
|
76
|
+
CpusetCpus?: string;
|
|
77
|
+
};
|
|
78
|
+
SecurityOpt?: string[];
|
|
79
|
+
CapAdd?: string[];
|
|
80
|
+
CapDrop?: string[];
|
|
81
|
+
Devices?: {
|
|
82
|
+
PathOnHost: string;
|
|
83
|
+
PathInContainer: string;
|
|
84
|
+
CgroupPermissions: string;
|
|
85
|
+
}[];
|
|
86
|
+
Init?: boolean;
|
|
87
|
+
IpcMode?: string;
|
|
88
|
+
PidMode?: string;
|
|
89
|
+
ReadonlyRootfs?: boolean;
|
|
90
|
+
Tmpfs?: Record<string, string>;
|
|
91
|
+
};
|
|
92
|
+
NetworkSettings: {
|
|
93
|
+
Networks: Record<string, NetworkEndpoint>;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export interface NetworkEndpointCreate {
|
|
97
|
+
Aliases?: string[];
|
|
98
|
+
IPAMConfig?: {
|
|
99
|
+
IPv4Address?: string;
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export interface ContainerCreateBody {
|
|
103
|
+
Hostname?: string;
|
|
104
|
+
User?: string;
|
|
105
|
+
Env?: string[];
|
|
106
|
+
Cmd?: string[];
|
|
107
|
+
Entrypoint?: string[] | string;
|
|
108
|
+
Image: string;
|
|
109
|
+
Labels?: Record<string, string>;
|
|
110
|
+
WorkingDir?: string;
|
|
111
|
+
Healthcheck?: HealthConfig;
|
|
112
|
+
StopSignal?: string;
|
|
113
|
+
StopTimeout?: number;
|
|
114
|
+
ExposedPorts?: Record<string, Record<string, never>>;
|
|
115
|
+
HostConfig: ContainerInspect['HostConfig'];
|
|
116
|
+
NetworkingConfig: {
|
|
117
|
+
EndpointsConfig: Record<string, NetworkEndpointCreate>;
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
export interface NetworkConnectBody {
|
|
121
|
+
Container: string;
|
|
122
|
+
EndpointConfig?: NetworkEndpointCreate;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Narrowed shape of a Docker Engine `/events` line. Only the fields we read.
|
|
126
|
+
* Stable across Engine API v1.41+.
|
|
127
|
+
*/
|
|
128
|
+
export interface EngineEvent {
|
|
129
|
+
Type: 'container';
|
|
130
|
+
Action: string;
|
|
131
|
+
id?: string;
|
|
132
|
+
Actor?: {
|
|
133
|
+
ID?: string;
|
|
134
|
+
Attributes?: Record<string, string>;
|
|
135
|
+
};
|
|
136
|
+
time?: number;
|
|
137
|
+
timeNano?: number;
|
|
138
|
+
}
|
|
139
|
+
export declare class DockerEngineError extends Error {
|
|
140
|
+
readonly name = "DockerEngineError";
|
|
141
|
+
readonly statusCode: number;
|
|
142
|
+
readonly endpoint: string;
|
|
143
|
+
readonly engineMessage: string;
|
|
144
|
+
constructor(statusCode: number, endpoint: string, engineMessage: string);
|
|
145
|
+
}
|
|
146
|
+
export declare class DockerDaemonUnavailableError extends Error {
|
|
147
|
+
readonly name = "DockerDaemonUnavailableError";
|
|
148
|
+
readonly socketPath: string;
|
|
149
|
+
readonly cause?: Error;
|
|
150
|
+
constructor(socketPath: string, cause?: Error);
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=docker-engine-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-engine-types.d.ts","sourceRoot":"","sources":["../../../src/services/docker-engine-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Docker Engine API DTOs and error classes.
|
|
2
|
+
//
|
|
3
|
+
// PascalCase matches the Docker daemon's wire format directly — used as-is in
|
|
4
|
+
// TypeScript types rather than translating to camelCase (saves a layer).
|
|
5
|
+
//
|
|
6
|
+
// Type definitions cover only the fields we read; full responses arrive as
|
|
7
|
+
// `unknown` from node:http and are narrowed at the boundary.
|
|
8
|
+
//
|
|
9
|
+
// Stable across Docker Engine API v1.41+ (matches apt-installed docker on
|
|
10
|
+
// Ubuntu 22+ and the daemon mounted via DooD in cluster-base).
|
|
11
|
+
export class DockerEngineError extends Error {
|
|
12
|
+
name = 'DockerEngineError';
|
|
13
|
+
statusCode;
|
|
14
|
+
endpoint;
|
|
15
|
+
engineMessage;
|
|
16
|
+
constructor(statusCode, endpoint, engineMessage) {
|
|
17
|
+
super(`Docker Engine API ${endpoint} returned ${statusCode}: ${engineMessage}`);
|
|
18
|
+
this.statusCode = statusCode;
|
|
19
|
+
this.endpoint = endpoint;
|
|
20
|
+
this.engineMessage = engineMessage;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class DockerDaemonUnavailableError extends Error {
|
|
24
|
+
name = 'DockerDaemonUnavailableError';
|
|
25
|
+
socketPath;
|
|
26
|
+
cause;
|
|
27
|
+
constructor(socketPath, cause) {
|
|
28
|
+
// Message is 'DOCKER_DAEMON_UNAVAILABLE' so existing string-match code paths
|
|
29
|
+
// in lifecycle.ts can continue to discriminate by message before the route
|
|
30
|
+
// handler migrates to instanceof checks.
|
|
31
|
+
super('DOCKER_DAEMON_UNAVAILABLE');
|
|
32
|
+
this.socketPath = socketPath;
|
|
33
|
+
if (cause)
|
|
34
|
+
this.cause = cause;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=docker-engine-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-engine-types.js","sourceRoot":"","sources":["../../../src/services/docker-engine-types.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,EAAE;AACF,8EAA8E;AAC9E,yEAAyE;AACzE,EAAE;AACF,2EAA2E;AAC3E,6DAA6D;AAC7D,EAAE;AACF,0EAA0E;AAC1E,+DAA+D;AAuI/D,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACxB,IAAI,GAAG,mBAAmB,CAAC;IACpC,UAAU,CAAS;IACnB,QAAQ,CAAS;IACjB,aAAa,CAAS;IAE/B,YAAY,UAAkB,EAAE,QAAgB,EAAE,aAAqB;QACrE,KAAK,CAAC,qBAAqB,QAAQ,aAAa,UAAU,KAAK,aAAa,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACnC,IAAI,GAAG,8BAA8B,CAAC;IAC/C,UAAU,CAAS;IACV,KAAK,CAAS;IAEhC,YAAY,UAAkB,EAAE,KAAa;QAC3C,6EAA6E;QAC7E,2EAA2E;QAC3E,yCAAyC;QACzC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker enumeration helpers: discover the compose project name and list
|
|
3
|
+
* worker replicas via the Docker Engine API.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from worker-scaler.ts (#714) so both the scaler and the
|
|
6
|
+
* orchestrator's RelayBridge can enumerate workers without dragging in the
|
|
7
|
+
* scale-write paths, env-file rewriting, etc. Pure move — no behavior change.
|
|
8
|
+
*/
|
|
9
|
+
import { DockerEngineClient } from './docker-engine-client.js';
|
|
10
|
+
import type { ContainerState } from './docker-engine-types.js';
|
|
11
|
+
export interface WorkerReplica {
|
|
12
|
+
id: string;
|
|
13
|
+
number: number;
|
|
14
|
+
name: string;
|
|
15
|
+
state: ContainerState;
|
|
16
|
+
networkIds: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Discover the compose project name by inspecting the orchestrator's own
|
|
20
|
+
* container. Falls back to COMPOSE_PROJECT_NAME env var. Throws if neither
|
|
21
|
+
* resolves — happens when running outside compose (dev mode, raw docker run).
|
|
22
|
+
*/
|
|
23
|
+
export declare function computeProjectName(client: DockerEngineClient): Promise<string>;
|
|
24
|
+
/**
|
|
25
|
+
* Enumerate worker containers for the given compose project. Includes
|
|
26
|
+
* stopped/exited replicas. Containers with missing or non-numeric
|
|
27
|
+
* `com.docker.compose.container-number` labels are skipped with a warning —
|
|
28
|
+
* defensive against manually-added containers.
|
|
29
|
+
*/
|
|
30
|
+
export declare function enumerateWorkers(client: DockerEngineClient, project: string): Promise<WorkerReplica[]>;
|
|
31
|
+
//# sourceMappingURL=worker-enumeration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-enumeration.d.ts","sourceRoot":"","sources":["../../../src/services/worker-enumeration.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,cAAc,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAcpF;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,EAAE,CAAC,CAqC1B"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker enumeration helpers: discover the compose project name and list
|
|
3
|
+
* worker replicas via the Docker Engine API.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from worker-scaler.ts (#714) so both the scaler and the
|
|
6
|
+
* orchestrator's RelayBridge can enumerate workers without dragging in the
|
|
7
|
+
* scale-write paths, env-file rewriting, etc. Pure move — no behavior change.
|
|
8
|
+
*/
|
|
9
|
+
import { hostname } from 'node:os';
|
|
10
|
+
/**
|
|
11
|
+
* Discover the compose project name by inspecting the orchestrator's own
|
|
12
|
+
* container. Falls back to COMPOSE_PROJECT_NAME env var. Throws if neither
|
|
13
|
+
* resolves — happens when running outside compose (dev mode, raw docker run).
|
|
14
|
+
*/
|
|
15
|
+
export async function computeProjectName(client) {
|
|
16
|
+
const selfHostname = hostname();
|
|
17
|
+
try {
|
|
18
|
+
const inspect = await client.inspectContainer(selfHostname);
|
|
19
|
+
const project = inspect.Config.Labels?.['com.docker.compose.project'];
|
|
20
|
+
if (project)
|
|
21
|
+
return project;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Hostname may not be the container ID (e.g. when overridden in compose).
|
|
25
|
+
}
|
|
26
|
+
const envProject = process.env['COMPOSE_PROJECT_NAME'];
|
|
27
|
+
if (envProject)
|
|
28
|
+
return envProject;
|
|
29
|
+
throw new Error('ORCHESTRATOR_NOT_COMPOSE_MANAGED');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Enumerate worker containers for the given compose project. Includes
|
|
33
|
+
* stopped/exited replicas. Containers with missing or non-numeric
|
|
34
|
+
* `com.docker.compose.container-number` labels are skipped with a warning —
|
|
35
|
+
* defensive against manually-added containers.
|
|
36
|
+
*/
|
|
37
|
+
export async function enumerateWorkers(client, project) {
|
|
38
|
+
const summaries = await client.listContainers({
|
|
39
|
+
all: true,
|
|
40
|
+
filters: {
|
|
41
|
+
label: [
|
|
42
|
+
`com.docker.compose.project=${project}`,
|
|
43
|
+
'com.docker.compose.service=worker',
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
const replicas = [];
|
|
48
|
+
for (const summary of summaries) {
|
|
49
|
+
const numberLabel = summary.Labels?.['com.docker.compose.container-number'];
|
|
50
|
+
const parsedNumber = numberLabel ? parseInt(numberLabel, 10) : NaN;
|
|
51
|
+
if (!Number.isInteger(parsedNumber) || parsedNumber < 1) {
|
|
52
|
+
console.warn(`[worker-scaler] skipping container ${summary.Id} with missing/invalid container-number label: ${numberLabel ?? '<none>'}`);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const networkIds = summary.NetworkSettings?.Networks
|
|
56
|
+
? Object.values(summary.NetworkSettings.Networks).map((n) => n.NetworkID)
|
|
57
|
+
: [];
|
|
58
|
+
// `Names` arrives with a leading '/' from Engine — strip for readability.
|
|
59
|
+
const rawName = summary.Names[0] ?? '';
|
|
60
|
+
const name = rawName.startsWith('/') ? rawName.slice(1) : rawName;
|
|
61
|
+
replicas.push({
|
|
62
|
+
id: summary.Id,
|
|
63
|
+
number: parsedNumber,
|
|
64
|
+
name,
|
|
65
|
+
state: summary.State,
|
|
66
|
+
networkIds,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return replicas;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=worker-enumeration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-enumeration.js","sourceRoot":"","sources":["../../../src/services/worker-enumeration.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAYnC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAA0B;IACjE,MAAM,YAAY,GAAG,QAAQ,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,4BAA4B,CAAC,CAAC;QACtE,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;IAC5E,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACvD,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAElC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;AACtD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAA0B,EAC1B,OAAe;IAEf,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC;QAC5C,GAAG,EAAE,IAAI;QACT,OAAO,EAAE;YACP,KAAK,EAAE;gBACL,8BAA8B,OAAO,EAAE;gBACvC,mCAAmC;aACpC;SACF;KACF,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,qCAAqC,CAAC,CAAC;QAC5E,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,IAAI,CACV,sCAAsC,OAAO,CAAC,EAAE,iDAAiD,WAAW,IAAI,QAAQ,EAAE,CAC3H,CAAC;YACF,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,QAAQ;YAClD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACzE,CAAC,CAAC,EAAE,CAAC;QACP,0EAA0E;QAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,MAAM,EAAE,YAAY;YACpB,IAAI;YACJ,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|