@git.zone/cli 3.2.0 → 4.0.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_ts/00_commitinfo_data.js +2 -2
- package/dist_ts/classes.gitzoneconfig.js +1 -1
- package/dist_ts/classes.project.js +1 -1
- package/dist_ts/gitzone.cli.js +1 -1
- package/dist_ts/gitzone.logging.js +1 -1
- package/dist_ts/helpers.changelog.js +1 -1
- package/dist_ts/helpers.climode.js +1 -1
- package/dist_ts/helpers.smartconfig.js +61 -11
- package/dist_ts/helpers.smartconfigmigrations.js +1 -1
- package/dist_ts/helpers.tsdocker.js +1 -1
- package/dist_ts/helpers.workflow.js +1 -1
- package/dist_ts/index.js +1 -1
- package/dist_ts/mod_audit/index.js +1 -1
- package/dist_ts/mod_commit/index.js +1 -1
- package/dist_ts/mod_commit/mod.helpers.js +1 -1
- package/dist_ts/mod_commit/mod.plugins.js +1 -1
- package/dist_ts/mod_commit/mod.ui.js +1 -1
- package/dist_ts/mod_config/classes.commitconfig.js +1 -1
- package/dist_ts/mod_config/classes.releaseconfig.js +1 -1
- package/dist_ts/mod_config/index.js +2 -2
- package/dist_ts/mod_config/mod.plugins.js +1 -1
- package/dist_ts/mod_deprecate/index.js +1 -1
- package/dist_ts/mod_deprecate/mod.plugins.js +1 -1
- package/dist_ts/mod_docker/classes.dockerpruner.js +7 -1
- package/dist_ts/mod_docker/index.js +1 -1
- package/dist_ts/mod_docker/mod.plugins.js +1 -1
- package/dist_ts/mod_format/classes.baseformatter.js +1 -1
- package/dist_ts/mod_format/classes.diffreporter.js +1 -1
- package/dist_ts/mod_format/classes.formatcontext.js +1 -1
- package/dist_ts/mod_format/classes.formatplanner.js +1 -1
- package/dist_ts/mod_format/classes.formatstats.js +1 -1
- package/dist_ts/mod_format/formatters/assets.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/cleanup.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/copy.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/gitignore.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/license.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/packagejson.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/prettier.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/readme.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/smartconfig.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/templates.formatter.js +1 -1
- package/dist_ts/mod_format/formatters/tsconfig.formatter.js +1 -1
- package/dist_ts/mod_format/index.js +1 -1
- package/dist_ts/mod_format/interfaces.format.js +1 -1
- package/dist_ts/mod_format/mod.plugins.js +1 -1
- package/dist_ts/mod_helpers/index.js +1 -1
- package/dist_ts/mod_helpers/mod.plugins.js +1 -1
- package/dist_ts/mod_meta/index.js +1 -1
- package/dist_ts/mod_meta/meta.classes.meta.js +1 -1
- package/dist_ts/mod_meta/meta.interfaces.js +1 -1
- package/dist_ts/mod_meta/meta.plugins.js +1 -1
- package/dist_ts/mod_open/index.js +1 -1
- package/dist_ts/mod_open/mod.plugins.js +1 -1
- package/dist_ts/mod_release/index.js +4 -4
- package/dist_ts/mod_release/mod.plugins.js +1 -1
- package/dist_ts/mod_services/classes.dockercontainer.d.ts +50 -3
- package/dist_ts/mod_services/classes.dockercontainer.js +646 -84
- package/dist_ts/mod_services/classes.globalregistry.d.ts +10 -24
- package/dist_ts/mod_services/classes.globalregistry.js +210 -62
- package/dist_ts/mod_services/classes.globalregistrystore.d.ts +48 -0
- package/dist_ts/mod_services/classes.globalregistrystore.js +156 -0
- package/dist_ts/mod_services/classes.interprocesslock.d.ts +21 -0
- package/dist_ts/mod_services/classes.interprocesslock.js +141 -0
- package/dist_ts/mod_services/classes.serviceconfiguration.d.ts +15 -12
- package/dist_ts/mod_services/classes.serviceconfiguration.js +188 -91
- package/dist_ts/mod_services/classes.servicedatamarker.d.ts +32 -7
- package/dist_ts/mod_services/classes.servicedatamarker.js +145 -49
- package/dist_ts/mod_services/classes.servicemanager.d.ts +70 -28
- package/dist_ts/mod_services/classes.servicemanager.js +995 -421
- package/dist_ts/mod_services/classes.servicenames.d.ts +8 -0
- package/dist_ts/mod_services/classes.servicenames.js +54 -0
- package/dist_ts/mod_services/classes.serviceoptions.js +1 -1
- package/dist_ts/mod_services/classes.servicepruner.d.ts +3 -0
- package/dist_ts/mod_services/classes.servicepruner.js +208 -46
- package/dist_ts/mod_services/helpers.js +1 -1
- package/dist_ts/mod_services/index.d.ts +2 -0
- package/dist_ts/mod_services/index.js +81 -58
- package/dist_ts/mod_services/mod.plugins.js +1 -1
- package/dist_ts/mod_standard/index.js +2 -2
- package/dist_ts/mod_standard/mod.plugins.js +1 -1
- package/dist_ts/mod_start/index.js +1 -1
- package/dist_ts/mod_start/mod.plugins.js +1 -1
- package/dist_ts/mod_template/index.js +1 -1
- package/dist_ts/mod_template/mod.plugins.js +1 -1
- package/dist_ts/mod_tools/classes.packagemanager.js +1 -1
- package/dist_ts/mod_tools/index.js +1 -1
- package/dist_ts/mod_tools/mod.plugins.js +1 -1
- package/dist_ts/paths.js +1 -1
- package/dist_ts/plugins.d.ts +3 -1
- package/dist_ts/plugins.js +4 -2
- package/dist_ts_migration/001.service-selection.d.ts +9 -0
- package/dist_ts_migration/001.service-selection.js +51 -0
- package/dist_ts_migration/002.runtime-config.d.ts +19 -0
- package/dist_ts_migration/002.runtime-config.js +170 -0
- package/dist_ts_migration/003.service-data-marker.d.ts +9 -0
- package/dist_ts_migration/003.service-data-marker.js +156 -0
- package/dist_ts_migration/004.global-registry.d.ts +13 -0
- package/dist_ts_migration/004.global-registry.js +165 -0
- package/dist_ts_migration/index.d.ts +11 -0
- package/dist_ts_migration/index.js +59 -0
- package/package.json +6 -3
- package/readme.hints.md +102 -25
- package/readme.md +123 -28
- package/readme.plan.md +29 -16
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/helpers.smartconfig.ts +63 -10
- package/ts/mod_config/index.ts +1 -1
- package/ts/mod_docker/classes.dockerpruner.ts +6 -0
- package/ts/mod_release/index.ts +3 -3
- package/ts/mod_services/classes.dockercontainer.ts +912 -96
- package/ts/mod_services/classes.globalregistry.ts +290 -89
- package/ts/mod_services/classes.globalregistrystore.ts +279 -0
- package/ts/mod_services/classes.interprocesslock.ts +189 -0
- package/ts/mod_services/classes.serviceconfiguration.ts +215 -108
- package/ts/mod_services/classes.servicedatamarker.ts +210 -52
- package/ts/mod_services/classes.servicemanager.ts +1332 -512
- package/ts/mod_services/classes.servicenames.ts +76 -0
- package/ts/mod_services/classes.servicepruner.ts +310 -52
- package/ts/mod_services/index.ts +89 -62
- package/ts/mod_standard/index.ts +1 -1
- package/ts/plugins.ts +4 -0
- package/ts_migration/001.service-selection.ts +77 -0
- package/ts_migration/002.runtime-config.ts +218 -0
- package/ts_migration/003.service-data-marker.ts +216 -0
- package/ts_migration/004.global-registry.ts +272 -0
- package/ts_migration/index.ts +83 -0
|
@@ -1,6 +1,81 @@
|
|
|
1
1
|
import * as plugins from './mod.plugins.js';
|
|
2
2
|
import * as helpers from './helpers.js';
|
|
3
3
|
import { logger } from '../gitzone.logging.js';
|
|
4
|
+
import { getServiceDataDirectory, markerProvesServiceDataDirectory, readServiceDataMarker, serviceBindOperation, serviceDataOwner, serviceOperationLabel, serviceToolLabel, } from './classes.servicedatamarker.js';
|
|
5
|
+
import { withServiceDataOperationLock } from './classes.interprocesslock.js';
|
|
6
|
+
export const fencedBindOperationSpecLabel = 'git.zone.operation-spec';
|
|
7
|
+
export const fencedBindOperationInvocationLabel = 'git.zone.operation-invocation';
|
|
8
|
+
export const fencedBindOperationSpec = '1';
|
|
9
|
+
export const fencedBindOperationStaleAfterMs = 60_000;
|
|
10
|
+
/** One Docker-reserved lock name for every canonical host bind target. */
|
|
11
|
+
export const getFencedBindOperationName = (hostPathArg) => {
|
|
12
|
+
const targetHash = plugins.crypto
|
|
13
|
+
.createHash('sha256')
|
|
14
|
+
.update(plugins.path.resolve(hostPathArg))
|
|
15
|
+
.digest('hex')
|
|
16
|
+
.slice(0, 24);
|
|
17
|
+
return `gitzone-services-bind-${targetHash}`;
|
|
18
|
+
};
|
|
19
|
+
const getServiceDataDeletionIntentPath = (projectPathArg, serviceArg) => plugins.path.join(plugins.path.resolve(projectPathArg), '.nogit', `.gitzone-delete-${serviceArg}.json`);
|
|
20
|
+
const getServiceDataQuarantinePath = (canonicalPathArg, tokenArg) => `${plugins.path.resolve(canonicalPathArg)}.gitzone-delete-${tokenArg}`;
|
|
21
|
+
const readServiceDataDeletionIntent = async (projectPathArg, serviceArg) => {
|
|
22
|
+
const projectPath = plugins.path.resolve(projectPathArg);
|
|
23
|
+
const canonicalPath = getServiceDataDirectory(projectPath, serviceArg);
|
|
24
|
+
const intentPath = getServiceDataDeletionIntentPath(projectPath, serviceArg);
|
|
25
|
+
try {
|
|
26
|
+
const stats = await plugins.fs.lstat(intentPath);
|
|
27
|
+
if (stats.isSymbolicLink() || !stats.isFile()) {
|
|
28
|
+
throw new Error(`Refusing non-regular service data deletion intent: ${intentPath}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (error.code === 'ENOENT') {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
let parsed;
|
|
38
|
+
try {
|
|
39
|
+
parsed = JSON.parse(await plugins.fs.readFile(intentPath, 'utf8'));
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
throw new Error(`Refusing invalid service data deletion intent: ${intentPath}`, {
|
|
43
|
+
cause: error,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
47
|
+
throw new Error(`Refusing invalid service data deletion intent: ${intentPath}`);
|
|
48
|
+
}
|
|
49
|
+
const intent = parsed;
|
|
50
|
+
const allowedKeys = [
|
|
51
|
+
'owner',
|
|
52
|
+
'kind',
|
|
53
|
+
'schemaVersion',
|
|
54
|
+
'projectPath',
|
|
55
|
+
'service',
|
|
56
|
+
'canonicalPath',
|
|
57
|
+
'quarantinePath',
|
|
58
|
+
'token',
|
|
59
|
+
'createdAt',
|
|
60
|
+
];
|
|
61
|
+
const token = intent.token;
|
|
62
|
+
if (Object.keys(intent).length !== allowedKeys.length ||
|
|
63
|
+
!Object.keys(intent).every((keyArg) => allowedKeys.includes(keyArg)) ||
|
|
64
|
+
intent.owner !== serviceDataOwner ||
|
|
65
|
+
intent.kind !== 'service-data-deletion' ||
|
|
66
|
+
intent.schemaVersion !== 1 ||
|
|
67
|
+
intent.projectPath !== projectPath ||
|
|
68
|
+
intent.service !== serviceArg ||
|
|
69
|
+
intent.canonicalPath !== canonicalPath ||
|
|
70
|
+
typeof token !== 'string' ||
|
|
71
|
+
!/^[a-f0-9]{32}$/u.test(token) ||
|
|
72
|
+
intent.quarantinePath !== getServiceDataQuarantinePath(canonicalPath, token) ||
|
|
73
|
+
typeof intent.createdAt !== 'string' ||
|
|
74
|
+
!intent.createdAt) {
|
|
75
|
+
throw new Error(`Refusing invalid service data deletion intent: ${intentPath}`);
|
|
76
|
+
}
|
|
77
|
+
return intent;
|
|
78
|
+
};
|
|
4
79
|
/** Sanitised failure from the shell-free Docker execution path. */
|
|
5
80
|
export class DockerArgvExecutionError extends Error {
|
|
6
81
|
exitCode;
|
|
@@ -19,6 +94,27 @@ export class DockerArgvExecutionError extends Error {
|
|
|
19
94
|
this.signal = optionsArg.signal;
|
|
20
95
|
}
|
|
21
96
|
}
|
|
97
|
+
const isExactStoppedBindHelperForTarget = (containerArg, hostPathArg, optionsArg) => {
|
|
98
|
+
const invocationId = containerArg.labels[fencedBindOperationInvocationLabel];
|
|
99
|
+
const expectedLabels = {
|
|
100
|
+
'git.zone.tool': serviceToolLabel,
|
|
101
|
+
'git.zone.service': optionsArg.service,
|
|
102
|
+
'git.zone.project-path': plugins.path.resolve(optionsArg.projectPath),
|
|
103
|
+
'git.zone.data-path': plugins.path.resolve(hostPathArg),
|
|
104
|
+
'git.zone.safe-to-prune': 'false',
|
|
105
|
+
[serviceOperationLabel]: serviceBindOperation,
|
|
106
|
+
[fencedBindOperationSpecLabel]: fencedBindOperationSpec,
|
|
107
|
+
[fencedBindOperationInvocationLabel]: invocationId,
|
|
108
|
+
};
|
|
109
|
+
const actualGitZoneLabels = Object.entries(containerArg.labels).filter(([keyArg]) => keyArg.startsWith('git.zone.'));
|
|
110
|
+
return (!containerArg.running &&
|
|
111
|
+
containerArg.name === getFencedBindOperationName(hostPathArg) &&
|
|
112
|
+
/^[a-f0-9]{32}$/u.test(invocationId || '') &&
|
|
113
|
+
actualGitZoneLabels.length === Object.keys(expectedLabels).length &&
|
|
114
|
+
Object.entries(expectedLabels).every(([keyArg, valueArg]) => containerArg.labels[keyArg] === valueArg) &&
|
|
115
|
+
containerArg.mountSources.length === 1 &&
|
|
116
|
+
plugins.path.resolve(containerArg.mountSources[0]) === plugins.path.resolve(hostPathArg));
|
|
117
|
+
};
|
|
22
118
|
/** Single-quote a value for safe interpolation into a bash command. */
|
|
23
119
|
export const shellQuote = (valueArg) => `'${valueArg.replace(/'/g, `'"'"'`)}'`;
|
|
24
120
|
const assertDockerUlimit = (nameArg, limitArg) => {
|
|
@@ -67,6 +163,81 @@ export const matchDockerUlimits = (inspectDataArg, expectedArg) => {
|
|
|
67
163
|
}
|
|
68
164
|
return 'match';
|
|
69
165
|
};
|
|
166
|
+
const isUnknownRecord = (valueArg) => {
|
|
167
|
+
return typeof valueArg === 'object' && valueArg !== null && !Array.isArray(valueArg);
|
|
168
|
+
};
|
|
169
|
+
const parseFencedBindInspection = (stdoutArg, expectedNameArg) => {
|
|
170
|
+
let parsed;
|
|
171
|
+
try {
|
|
172
|
+
parsed = JSON.parse(stdoutArg);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
throw new Error(`Docker returned an invalid bind-operation inspection for ${expectedNameArg}.`);
|
|
176
|
+
}
|
|
177
|
+
if (!Array.isArray(parsed) || parsed.length !== 1 || !isUnknownRecord(parsed[0])) {
|
|
178
|
+
throw new Error(`Docker returned an invalid bind-operation inspection for ${expectedNameArg}.`);
|
|
179
|
+
}
|
|
180
|
+
const inspected = parsed[0];
|
|
181
|
+
const config = inspected.Config;
|
|
182
|
+
const state = inspected.State;
|
|
183
|
+
const normalizedName = String(inspected.Name || '').replace(/^\//u, '');
|
|
184
|
+
const createdAtMs = Date.parse(String(inspected.Created || ''));
|
|
185
|
+
if (typeof inspected.Id !== 'string' ||
|
|
186
|
+
!/^[a-f0-9]{64}$/u.test(inspected.Id) ||
|
|
187
|
+
!/^gitzone-services-bind-[a-f0-9]{24}$/u.test(normalizedName) ||
|
|
188
|
+
(expectedNameArg !== undefined && normalizedName !== expectedNameArg) ||
|
|
189
|
+
!Number.isFinite(createdAtMs) ||
|
|
190
|
+
!isUnknownRecord(config) ||
|
|
191
|
+
typeof config.Image !== 'string' ||
|
|
192
|
+
typeof config.User !== 'string' ||
|
|
193
|
+
!Array.isArray(config.Entrypoint) ||
|
|
194
|
+
!config.Entrypoint.every((entry) => typeof entry === 'string') ||
|
|
195
|
+
!Array.isArray(config.Cmd) ||
|
|
196
|
+
!config.Cmd.every((entry) => typeof entry === 'string') ||
|
|
197
|
+
!isUnknownRecord(config.Labels) ||
|
|
198
|
+
!isUnknownRecord(state) ||
|
|
199
|
+
typeof state.Running !== 'boolean' ||
|
|
200
|
+
typeof state.Status !== 'string' ||
|
|
201
|
+
typeof state.ExitCode !== 'number' ||
|
|
202
|
+
!Array.isArray(inspected.Mounts)) {
|
|
203
|
+
throw new Error(`Docker returned an invalid bind-operation inspection for ${expectedNameArg}.`);
|
|
204
|
+
}
|
|
205
|
+
const labels = {};
|
|
206
|
+
for (const [key, value] of Object.entries(config.Labels)) {
|
|
207
|
+
if (typeof value !== 'string') {
|
|
208
|
+
throw new Error(`Docker returned an invalid bind-operation inspection for ${expectedNameArg}.`);
|
|
209
|
+
}
|
|
210
|
+
labels[key] = value;
|
|
211
|
+
}
|
|
212
|
+
const mounts = inspected.Mounts.map((mountArg) => {
|
|
213
|
+
if (!isUnknownRecord(mountArg) ||
|
|
214
|
+
mountArg.Type !== 'bind' ||
|
|
215
|
+
typeof mountArg.Source !== 'string' ||
|
|
216
|
+
typeof mountArg.Destination !== 'string' ||
|
|
217
|
+
typeof mountArg.RW !== 'boolean') {
|
|
218
|
+
throw new Error(`Docker returned an invalid bind-operation inspection for ${expectedNameArg}.`);
|
|
219
|
+
}
|
|
220
|
+
return {
|
|
221
|
+
source: plugins.path.resolve(mountArg.Source),
|
|
222
|
+
destination: mountArg.Destination,
|
|
223
|
+
readWrite: mountArg.RW,
|
|
224
|
+
};
|
|
225
|
+
});
|
|
226
|
+
return {
|
|
227
|
+
id: inspected.Id,
|
|
228
|
+
name: normalizedName,
|
|
229
|
+
createdAtMs,
|
|
230
|
+
image: config.Image,
|
|
231
|
+
running: state.Running,
|
|
232
|
+
status: state.Status,
|
|
233
|
+
exitCode: state.ExitCode,
|
|
234
|
+
user: config.User,
|
|
235
|
+
entrypoint: [...config.Entrypoint],
|
|
236
|
+
command: [...config.Cmd],
|
|
237
|
+
labels,
|
|
238
|
+
mounts,
|
|
239
|
+
};
|
|
240
|
+
};
|
|
70
241
|
export class DockerContainer {
|
|
71
242
|
smartshell;
|
|
72
243
|
/**
|
|
@@ -78,8 +249,9 @@ export class DockerContainer {
|
|
|
78
249
|
* @git.zone/tsdocker.
|
|
79
250
|
*/
|
|
80
251
|
queryTimeoutSeconds = 60;
|
|
81
|
-
/** Longer bound for
|
|
252
|
+
/** Longer bound for root-helper cleanup, which may delete a large tree. */
|
|
82
253
|
cleanupTimeoutSeconds = 600;
|
|
254
|
+
bindOperationDelay = async (millisecondsArg) => plugins.smartdelay.delayFor(millisecondsArg);
|
|
83
255
|
constructor() {
|
|
84
256
|
this.smartshell = new plugins.smartshell.Smartshell({
|
|
85
257
|
executor: 'bash',
|
|
@@ -167,22 +339,240 @@ export class DockerContainer {
|
|
|
167
339
|
if (optionsArg.restart) {
|
|
168
340
|
argv.push('--restart', optionsArg.restart);
|
|
169
341
|
}
|
|
342
|
+
if (optionsArg.user) {
|
|
343
|
+
argv.push('--user', optionsArg.user);
|
|
344
|
+
}
|
|
345
|
+
if (optionsArg.entrypoint) {
|
|
346
|
+
argv.push('--entrypoint', optionsArg.entrypoint);
|
|
347
|
+
}
|
|
170
348
|
argv.push(optionsArg.image);
|
|
171
349
|
if (optionsArg.command) {
|
|
172
350
|
argv.push(...optionsArg.command);
|
|
173
351
|
}
|
|
174
352
|
return this.execArgvInternal(argv, executionOptionsArg, childEnvironment);
|
|
175
353
|
}
|
|
354
|
+
assertFencedBindInspection(inspectionArg, optionsArg) {
|
|
355
|
+
const expectedGitZoneLabels = Object.entries(optionsArg.labels).filter(([key]) => key.startsWith('git.zone.'));
|
|
356
|
+
const actualGitZoneLabels = Object.entries(inspectionArg.labels).filter(([key]) => key.startsWith('git.zone.'));
|
|
357
|
+
const labelsMatch = expectedGitZoneLabels.length === actualGitZoneLabels.length &&
|
|
358
|
+
expectedGitZoneLabels.every(([key, value]) => inspectionArg.labels[key] === value);
|
|
359
|
+
const mountsMatch = inspectionArg.mounts.length === 1 &&
|
|
360
|
+
inspectionArg.mounts[0].source === plugins.path.resolve(optionsArg.hostPath) &&
|
|
361
|
+
inspectionArg.mounts[0].destination === optionsArg.containerPath &&
|
|
362
|
+
inspectionArg.mounts[0].readWrite;
|
|
363
|
+
if (inspectionArg.name !== optionsArg.name ||
|
|
364
|
+
inspectionArg.image !== optionsArg.image ||
|
|
365
|
+
inspectionArg.user !== '0' ||
|
|
366
|
+
inspectionArg.entrypoint.length !== 1 ||
|
|
367
|
+
inspectionArg.entrypoint[0] !== optionsArg.entrypoint ||
|
|
368
|
+
inspectionArg.command.length !== optionsArg.command.length ||
|
|
369
|
+
!inspectionArg.command.every((entry, index) => entry === optionsArg.command[index]) ||
|
|
370
|
+
!labelsMatch ||
|
|
371
|
+
!mountsMatch) {
|
|
372
|
+
throw new Error(`Refusing bind-operation container ${optionsArg.name}: exact ownership and configuration are not proven.`);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
assertRecoverableFencedBindInspection(inspectionArg, optionsArg, expectedNameArg) {
|
|
376
|
+
const expectedLabels = {
|
|
377
|
+
...optionsArg.labels,
|
|
378
|
+
[fencedBindOperationSpecLabel]: fencedBindOperationSpec,
|
|
379
|
+
};
|
|
380
|
+
const expectedGitZoneLabels = Object.entries(expectedLabels).filter(([key]) => key.startsWith('git.zone.'));
|
|
381
|
+
const actualGitZoneLabels = Object.entries(inspectionArg.labels).filter(([key]) => key.startsWith('git.zone.'));
|
|
382
|
+
const invocationId = inspectionArg.labels[fencedBindOperationInvocationLabel];
|
|
383
|
+
const labelsMatch = actualGitZoneLabels.length === expectedGitZoneLabels.length + 1 &&
|
|
384
|
+
expectedGitZoneLabels.every(([key, value]) => inspectionArg.labels[key] === value) &&
|
|
385
|
+
typeof invocationId === 'string' &&
|
|
386
|
+
/^[a-f0-9]{32}$/u.test(invocationId);
|
|
387
|
+
const mountMatches = inspectionArg.mounts.length === 1 &&
|
|
388
|
+
inspectionArg.mounts[0].source === plugins.path.resolve(optionsArg.hostPath) &&
|
|
389
|
+
inspectionArg.mounts[0].readWrite;
|
|
390
|
+
if (inspectionArg.name !== expectedNameArg ||
|
|
391
|
+
inspectionArg.image !== optionsArg.image ||
|
|
392
|
+
inspectionArg.user !== '0' ||
|
|
393
|
+
inspectionArg.entrypoint.length !== 1 ||
|
|
394
|
+
inspectionArg.entrypoint[0] !== optionsArg.entrypoint ||
|
|
395
|
+
inspectionArg.command.length !== optionsArg.command.length ||
|
|
396
|
+
!inspectionArg.command.every((entryArg, indexArg) => entryArg === optionsArg.command[indexArg]) ||
|
|
397
|
+
!labelsMatch ||
|
|
398
|
+
!mountMatches ||
|
|
399
|
+
inspectionArg.mounts[0].destination !== optionsArg.containerPath) {
|
|
400
|
+
throw new Error(`Refusing bind-operation container ${expectedNameArg}: canonical helper ownership is not proven.`);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
async readFencedBindInspection(referenceArg, expectedNameArg, executionOptionsArg) {
|
|
404
|
+
const result = await this.execArgv(['inspect', referenceArg], executionOptionsArg);
|
|
405
|
+
const inspection = parseFencedBindInspection(result.stdout, expectedNameArg);
|
|
406
|
+
if (/^[a-f0-9]{64}$/u.test(referenceArg) && inspection.id !== referenceArg) {
|
|
407
|
+
throw new Error(`Refusing bind-operation container ${expectedNameArg}: its immutable id changed.`);
|
|
408
|
+
}
|
|
409
|
+
return inspection;
|
|
410
|
+
}
|
|
411
|
+
async inspectFencedBindOperation(referenceArg, optionsArg, executionOptionsArg) {
|
|
412
|
+
const inspection = await this.readFencedBindInspection(referenceArg, optionsArg.name, executionOptionsArg);
|
|
413
|
+
this.assertFencedBindInspection(inspection, optionsArg);
|
|
414
|
+
return inspection;
|
|
415
|
+
}
|
|
416
|
+
async discoverFencedBindOperationId(nameArg, executionOptionsArg) {
|
|
417
|
+
const result = await this.execArgv([
|
|
418
|
+
'container',
|
|
419
|
+
'ls',
|
|
420
|
+
'-a',
|
|
421
|
+
'--no-trunc',
|
|
422
|
+
'--filter',
|
|
423
|
+
`name=^/${nameArg}$`,
|
|
424
|
+
'--format',
|
|
425
|
+
'{{.ID}}',
|
|
426
|
+
], executionOptionsArg);
|
|
427
|
+
const ids = result.stdout
|
|
428
|
+
.split(/\r?\n/u)
|
|
429
|
+
.map((entry) => entry.trim())
|
|
430
|
+
.filter(Boolean);
|
|
431
|
+
if (ids.length === 0) {
|
|
432
|
+
return undefined;
|
|
433
|
+
}
|
|
434
|
+
if (ids.length !== 1 || !/^[a-f0-9]{64}$/u.test(ids[0])) {
|
|
435
|
+
throw new Error(`Docker returned ambiguous bind-operation identity for ${nameArg}.`);
|
|
436
|
+
}
|
|
437
|
+
return ids[0];
|
|
438
|
+
}
|
|
439
|
+
async reclaimStaleFencedBindOperation(optionsArg, nameArg) {
|
|
440
|
+
const existingId = await this.discoverFencedBindOperationId(nameArg, optionsArg.executionOptions());
|
|
441
|
+
if (!existingId) {
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
const inspection = await this.readFencedBindInspection(existingId, nameArg, optionsArg.executionOptions());
|
|
445
|
+
this.assertRecoverableFencedBindInspection(inspection, optionsArg, nameArg);
|
|
446
|
+
if (inspection.running) {
|
|
447
|
+
throw new Error(`Bind-operation container ${nameArg} is still running.`);
|
|
448
|
+
}
|
|
449
|
+
if (inspection.status !== 'created' && inspection.status !== 'exited') {
|
|
450
|
+
throw new Error(`Refusing bind-operation container ${nameArg}: its stopped state is not proven.`);
|
|
451
|
+
}
|
|
452
|
+
if (Date.now() - inspection.createdAtMs < fencedBindOperationStaleAfterMs) {
|
|
453
|
+
throw new Error(`Bind-operation container ${nameArg} may belong to another active invocation.`);
|
|
454
|
+
}
|
|
455
|
+
// Non-forced removal is the atomic handoff: if another process starts the
|
|
456
|
+
// helper after inspection, Docker refuses removal instead of killing it.
|
|
457
|
+
await this.execArgv(['rm', inspection.id], optionsArg.executionOptions());
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Run one root bind-mount operation with a stopped-create and immutable-ID fence.
|
|
461
|
+
* Every ambiguous or failed path proves ownership again before forced removal.
|
|
462
|
+
*/
|
|
463
|
+
async runFencedBindOperation(optionsArg) {
|
|
464
|
+
if (Object.hasOwn(optionsArg.labels, fencedBindOperationSpecLabel) ||
|
|
465
|
+
Object.hasOwn(optionsArg.labels, fencedBindOperationInvocationLabel)) {
|
|
466
|
+
throw new Error('Fenced bind operation labels contain reserved lifecycle keys.');
|
|
467
|
+
}
|
|
468
|
+
if (optionsArg.labels[serviceOperationLabel] !== serviceBindOperation ||
|
|
469
|
+
optionsArg.labels['git.zone.safe-to-prune'] !== 'false') {
|
|
470
|
+
throw new Error('Fenced bind operation labels do not declare the protected helper contract.');
|
|
471
|
+
}
|
|
472
|
+
const operationName = getFencedBindOperationName(optionsArg.hostPath);
|
|
473
|
+
const invocationId = plugins.crypto.randomBytes(16).toString('hex');
|
|
474
|
+
const runtimeOptions = {
|
|
475
|
+
...optionsArg,
|
|
476
|
+
name: operationName,
|
|
477
|
+
labels: {
|
|
478
|
+
...optionsArg.labels,
|
|
479
|
+
[fencedBindOperationSpecLabel]: fencedBindOperationSpec,
|
|
480
|
+
[fencedBindOperationInvocationLabel]: invocationId,
|
|
481
|
+
},
|
|
482
|
+
};
|
|
483
|
+
await this.reclaimStaleFencedBindOperation(optionsArg, operationName);
|
|
484
|
+
const normalizeError = (errorArg) => errorArg instanceof Error
|
|
485
|
+
? errorArg
|
|
486
|
+
: new Error('Docker bind operation failed with a non-Error rejection.');
|
|
487
|
+
const rollbackErrors = [];
|
|
488
|
+
let operationError;
|
|
489
|
+
let containerId;
|
|
490
|
+
try {
|
|
491
|
+
const creation = await this.createArgv({
|
|
492
|
+
name: operationName,
|
|
493
|
+
image: runtimeOptions.image,
|
|
494
|
+
volumes: {
|
|
495
|
+
[plugins.path.resolve(runtimeOptions.hostPath)]: runtimeOptions.containerPath,
|
|
496
|
+
},
|
|
497
|
+
labels: runtimeOptions.labels,
|
|
498
|
+
user: '0',
|
|
499
|
+
entrypoint: runtimeOptions.entrypoint,
|
|
500
|
+
command: runtimeOptions.command,
|
|
501
|
+
}, runtimeOptions.executionOptions());
|
|
502
|
+
const createdContainerId = creation.stdout.trim();
|
|
503
|
+
if (!/^[a-f0-9]{64}$/u.test(createdContainerId)) {
|
|
504
|
+
throw new Error(`Docker returned an invalid id for bind operation ${operationName}.`);
|
|
505
|
+
}
|
|
506
|
+
containerId = createdContainerId;
|
|
507
|
+
const created = await this.inspectFencedBindOperation(containerId, runtimeOptions, runtimeOptions.executionOptions());
|
|
508
|
+
if (created.running || created.status !== 'created') {
|
|
509
|
+
throw new Error(`Bind-operation container ${operationName} was not created stopped.`);
|
|
510
|
+
}
|
|
511
|
+
await this.execArgv(['start', '--attach', containerId], runtimeOptions.executionOptions());
|
|
512
|
+
const completed = await this.inspectFencedBindOperation(containerId, runtimeOptions, runtimeOptions.executionOptions());
|
|
513
|
+
if (completed.running || completed.status !== 'exited' || completed.exitCode !== 0) {
|
|
514
|
+
throw new Error(`Bind-operation container ${operationName} did not exit successfully.`);
|
|
515
|
+
}
|
|
516
|
+
await this.execArgv(['rm', containerId], runtimeOptions.executionOptions());
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
catch (error) {
|
|
520
|
+
operationError = normalizeError(error);
|
|
521
|
+
}
|
|
522
|
+
if (!containerId) {
|
|
523
|
+
const rollbackTimeoutMs = runtimeOptions.rollbackTimeoutMs ?? 5_000;
|
|
524
|
+
const rollbackDeadlineAt = Date.now() + rollbackTimeoutMs;
|
|
525
|
+
while (!containerId) {
|
|
526
|
+
const remainingMs = Math.floor(rollbackDeadlineAt - Date.now());
|
|
527
|
+
if (remainingMs <= 0) {
|
|
528
|
+
break;
|
|
529
|
+
}
|
|
530
|
+
try {
|
|
531
|
+
const discoveredId = await this.discoverFencedBindOperationId(operationName, { timeoutMs: remainingMs });
|
|
532
|
+
if (discoveredId) {
|
|
533
|
+
const inspection = await this.inspectFencedBindOperation(discoveredId, runtimeOptions, { timeoutMs: Math.max(1, rollbackDeadlineAt - Date.now()) });
|
|
534
|
+
containerId = inspection.id;
|
|
535
|
+
break;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
catch (error) {
|
|
539
|
+
rollbackErrors.push(normalizeError(error));
|
|
540
|
+
break;
|
|
541
|
+
}
|
|
542
|
+
const remainingAfterDiscovery = Math.floor(rollbackDeadlineAt - Date.now());
|
|
543
|
+
if (remainingAfterDiscovery <= 0) {
|
|
544
|
+
break;
|
|
545
|
+
}
|
|
546
|
+
await this.bindOperationDelay(Math.min(100, remainingAfterDiscovery));
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
if (containerId) {
|
|
550
|
+
try {
|
|
551
|
+
await this.inspectFencedBindOperation(containerId, runtimeOptions, {
|
|
552
|
+
timeoutMs: runtimeOptions.rollbackTimeoutMs ?? 5_000,
|
|
553
|
+
});
|
|
554
|
+
await this.execArgv(['rm', '-f', containerId], {
|
|
555
|
+
timeoutMs: runtimeOptions.rollbackTimeoutMs ?? 5_000,
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
catch (error) {
|
|
559
|
+
rollbackErrors.push(normalizeError(error));
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
if (rollbackErrors.length > 0) {
|
|
563
|
+
throw new AggregateError([operationError, ...rollbackErrors], `Docker bind operation ${operationName} failed and cleanup could not be confirmed.`);
|
|
564
|
+
}
|
|
565
|
+
throw operationError;
|
|
566
|
+
}
|
|
176
567
|
/**
|
|
177
568
|
* Check if Docker is installed and available
|
|
178
569
|
*/
|
|
179
570
|
async checkDocker() {
|
|
180
571
|
try {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
return result.exitCode === 0;
|
|
572
|
+
await this.execArgv(['--version'], { timeoutMs: this.queryTimeoutSeconds * 1_000 });
|
|
573
|
+
return true;
|
|
184
574
|
}
|
|
185
|
-
catch
|
|
575
|
+
catch {
|
|
186
576
|
return false;
|
|
187
577
|
}
|
|
188
578
|
}
|
|
@@ -190,32 +580,27 @@ export class DockerContainer {
|
|
|
190
580
|
* Get container status
|
|
191
581
|
*/
|
|
192
582
|
async getStatus(containerName) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
const runningResult = await this.smartshell.exec(`docker ps --format '{{.Names}}' | grep -q "^${containerName}$"`);
|
|
196
|
-
if (runningResult.exitCode === 0) {
|
|
197
|
-
return 'running';
|
|
198
|
-
}
|
|
199
|
-
// Check if exists but stopped
|
|
200
|
-
const existsResult = await this.smartshell.exec(`docker ps -a --format '{{.Names}}' | grep -q "^${containerName}$"`);
|
|
201
|
-
if (existsResult.exitCode === 0) {
|
|
202
|
-
return 'stopped';
|
|
203
|
-
}
|
|
583
|
+
const ids = await this.listIds([`name=^/${containerName}$`]);
|
|
584
|
+
if (ids.length === 0) {
|
|
204
585
|
return 'not_exists';
|
|
205
586
|
}
|
|
206
|
-
|
|
207
|
-
|
|
587
|
+
const matches = (await this.inspectMany(ids)).filter((containerArg) => containerArg.name === containerName);
|
|
588
|
+
if (matches.length !== 1) {
|
|
589
|
+
throw new Error(`Docker returned ambiguous identity for container ${containerName}.`);
|
|
208
590
|
}
|
|
591
|
+
return matches[0].running ? 'running' : 'stopped';
|
|
209
592
|
}
|
|
210
593
|
/**
|
|
211
594
|
* Start a container
|
|
212
595
|
*/
|
|
213
596
|
async start(containerName) {
|
|
214
597
|
try {
|
|
215
|
-
|
|
216
|
-
|
|
598
|
+
await this.execArgv(['start', containerName], {
|
|
599
|
+
timeoutMs: this.queryTimeoutSeconds * 1_000,
|
|
600
|
+
});
|
|
601
|
+
return true;
|
|
217
602
|
}
|
|
218
|
-
catch
|
|
603
|
+
catch {
|
|
219
604
|
return false;
|
|
220
605
|
}
|
|
221
606
|
}
|
|
@@ -224,10 +609,12 @@ export class DockerContainer {
|
|
|
224
609
|
*/
|
|
225
610
|
async stop(containerName) {
|
|
226
611
|
try {
|
|
227
|
-
|
|
228
|
-
|
|
612
|
+
await this.execArgv(['stop', containerName], {
|
|
613
|
+
timeoutMs: this.queryTimeoutSeconds * 1_000,
|
|
614
|
+
});
|
|
615
|
+
return true;
|
|
229
616
|
}
|
|
230
|
-
catch
|
|
617
|
+
catch {
|
|
231
618
|
return false;
|
|
232
619
|
}
|
|
233
620
|
}
|
|
@@ -236,11 +623,12 @@ export class DockerContainer {
|
|
|
236
623
|
*/
|
|
237
624
|
async remove(containerName, force = false) {
|
|
238
625
|
try {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
626
|
+
await this.execArgv(['rm', ...(force ? ['-f'] : []), containerName], {
|
|
627
|
+
timeoutMs: this.queryTimeoutSeconds * 1_000,
|
|
628
|
+
});
|
|
629
|
+
return true;
|
|
242
630
|
}
|
|
243
|
-
catch
|
|
631
|
+
catch {
|
|
244
632
|
return false;
|
|
245
633
|
}
|
|
246
634
|
}
|
|
@@ -248,9 +636,9 @@ export class DockerContainer {
|
|
|
248
636
|
* Run a new container
|
|
249
637
|
*/
|
|
250
638
|
async run(options) {
|
|
251
|
-
let command =
|
|
639
|
+
let command = `${this.bounded(this.queryTimeoutSeconds)} run -d`;
|
|
252
640
|
// Add name
|
|
253
|
-
command += ` --name ${options.name}`;
|
|
641
|
+
command += ` --name ${shellQuote(options.name)}`;
|
|
254
642
|
// Add ports
|
|
255
643
|
if (options.ports) {
|
|
256
644
|
for (const [hostPort, containerPort] of Object.entries(options.ports)) {
|
|
@@ -282,7 +670,7 @@ export class DockerContainer {
|
|
|
282
670
|
command += ` --restart ${options.restart}`;
|
|
283
671
|
}
|
|
284
672
|
// Add image
|
|
285
|
-
command += ` ${options.image}`;
|
|
673
|
+
command += ` ${shellQuote(options.image)}`;
|
|
286
674
|
// Add command if provided
|
|
287
675
|
if (options.command) {
|
|
288
676
|
command += ` ${options.command}`;
|
|
@@ -338,11 +726,93 @@ export class DockerContainer {
|
|
|
338
726
|
return false;
|
|
339
727
|
}
|
|
340
728
|
}
|
|
729
|
+
/** Exact persisted quarantine path for an interrupted deletion, if present. */
|
|
730
|
+
async getPendingDataDeletionPath(projectPathArg, serviceArg) {
|
|
731
|
+
const intent = await readServiceDataDeletionIntent(projectPathArg, serviceArg);
|
|
732
|
+
if (!intent) {
|
|
733
|
+
return undefined;
|
|
734
|
+
}
|
|
735
|
+
if (await this.assertRegularDeletionDirectory(intent.quarantinePath)) {
|
|
736
|
+
return intent.quarantinePath;
|
|
737
|
+
}
|
|
738
|
+
if (await this.assertRegularDeletionDirectory(intent.canonicalPath)) {
|
|
739
|
+
return intent.canonicalPath;
|
|
740
|
+
}
|
|
741
|
+
// The intent still needs a locked cleanup pass even when deletion finished
|
|
742
|
+
// just before the process was interrupted.
|
|
743
|
+
return intent.quarantinePath;
|
|
744
|
+
}
|
|
745
|
+
getDataCleanupOperation(hostPathArg, imageArg, optionsArg) {
|
|
746
|
+
const hostPath = plugins.path.resolve(hostPathArg);
|
|
747
|
+
return {
|
|
748
|
+
image: imageArg,
|
|
749
|
+
hostPath,
|
|
750
|
+
containerPath: '/gitzone-target',
|
|
751
|
+
entrypoint: '/bin/sh',
|
|
752
|
+
command: [
|
|
753
|
+
'-c',
|
|
754
|
+
'rm -rf /gitzone-target/..?* /gitzone-target/.[!.]* /gitzone-target/*',
|
|
755
|
+
],
|
|
756
|
+
labels: {
|
|
757
|
+
'git.zone.tool': serviceToolLabel,
|
|
758
|
+
'git.zone.service': optionsArg.service,
|
|
759
|
+
'git.zone.project-path': plugins.path.resolve(optionsArg.projectPath),
|
|
760
|
+
'git.zone.data-path': hostPath,
|
|
761
|
+
'git.zone.safe-to-prune': 'false',
|
|
762
|
+
[serviceOperationLabel]: serviceBindOperation,
|
|
763
|
+
},
|
|
764
|
+
executionOptions: () => ({ timeoutMs: this.cleanupTimeoutSeconds * 1_000 }),
|
|
765
|
+
rollbackTimeoutMs: this.queryTimeoutSeconds * 1_000,
|
|
766
|
+
};
|
|
767
|
+
}
|
|
768
|
+
async writeServiceDataDeletionIntent(intentArg) {
|
|
769
|
+
const intentPath = getServiceDataDeletionIntentPath(intentArg.projectPath, intentArg.service);
|
|
770
|
+
const tempPath = `${intentPath}.tmp-${process.pid}-${plugins.crypto
|
|
771
|
+
.randomBytes(12)
|
|
772
|
+
.toString('hex')}`;
|
|
773
|
+
let handle;
|
|
774
|
+
try {
|
|
775
|
+
handle = await plugins.fs.open(tempPath, 'wx', 0o600);
|
|
776
|
+
await handle.writeFile(`${JSON.stringify(intentArg, null, 2)}\n`, 'utf8');
|
|
777
|
+
await handle.sync();
|
|
778
|
+
await handle.close();
|
|
779
|
+
handle = undefined;
|
|
780
|
+
await plugins.fs.rename(tempPath, intentPath);
|
|
781
|
+
}
|
|
782
|
+
catch (error) {
|
|
783
|
+
await handle?.close().catch(() => { });
|
|
784
|
+
await plugins.fs.rm(tempPath, { force: true }).catch(() => { });
|
|
785
|
+
throw new Error(`Could not persist service data deletion intent: ${intentPath}`, {
|
|
786
|
+
cause: error,
|
|
787
|
+
});
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
async assertRegularDeletionDirectory(pathArg) {
|
|
791
|
+
try {
|
|
792
|
+
const stats = await plugins.fs.lstat(pathArg);
|
|
793
|
+
if (stats.isSymbolicLink() || !stats.isDirectory()) {
|
|
794
|
+
throw new Error(`Refusing non-directory service data cleanup target: ${pathArg}`);
|
|
795
|
+
}
|
|
796
|
+
return true;
|
|
797
|
+
}
|
|
798
|
+
catch (error) {
|
|
799
|
+
if (error.code === 'ENOENT') {
|
|
800
|
+
return false;
|
|
801
|
+
}
|
|
802
|
+
throw error;
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
async renameDataDirectory(sourcePathArg, targetPathArg) {
|
|
806
|
+
await plugins.fs.rename(sourcePathArg, targetPathArg);
|
|
807
|
+
}
|
|
808
|
+
async deleteDataDirectory(pathArg) {
|
|
809
|
+
await plugins.fs.rm(pathArg, { recursive: true, force: true });
|
|
810
|
+
}
|
|
341
811
|
/**
|
|
342
812
|
* Remove a service data directory, escalating to a root one-off container
|
|
343
813
|
* when the invoking user cannot delete the contents.
|
|
344
814
|
*
|
|
345
|
-
* Service containers write as their own uid
|
|
815
|
+
* Service containers write as their own uid
|
|
346
816
|
* with restrictive modes, so a plain recursive delete only removes part of the
|
|
347
817
|
* tree. For MongoDB that left a half-deleted, corrupt WiredTiger dataset that
|
|
348
818
|
* crash-looped on the next start — so a partial delete is worse than none.
|
|
@@ -351,48 +821,134 @@ export class DockerContainer {
|
|
|
351
821
|
* The one-off container mounts only the target directory, so `rm -rf` inside
|
|
352
822
|
* it cannot reach anything else on the host.
|
|
353
823
|
*/
|
|
354
|
-
async removeDataDirectory(hostPathArg, imageArg) {
|
|
824
|
+
async removeDataDirectory(hostPathArg, imageArg, optionsArg) {
|
|
825
|
+
return withServiceDataOperationLock(optionsArg.projectPath, optionsArg.service, () => this.removeDataDirectoryLocked(hostPathArg, imageArg, optionsArg));
|
|
826
|
+
}
|
|
827
|
+
async removeDataDirectoryLocked(hostPathArg, imageArg, optionsArg) {
|
|
828
|
+
await optionsArg.preDeleteCheck?.();
|
|
829
|
+
const projectPath = plugins.path.resolve(optionsArg.projectPath);
|
|
355
830
|
const hostPath = plugins.path.resolve(hostPathArg);
|
|
356
|
-
if (
|
|
357
|
-
|
|
831
|
+
if (hostPath !== getServiceDataDirectory(projectPath, optionsArg.service)) {
|
|
832
|
+
throw new Error(`Refusing cleanup outside the canonical service data path: ${hostPath}`);
|
|
833
|
+
}
|
|
834
|
+
for (const pathComponent of [projectPath, plugins.path.dirname(hostPath)]) {
|
|
835
|
+
const stats = await plugins.fs.lstat(pathComponent);
|
|
836
|
+
if (stats.isSymbolicLink() || !stats.isDirectory()) {
|
|
837
|
+
throw new Error(`Refusing symbolic or non-directory cleanup path component: ${pathComponent}`);
|
|
838
|
+
}
|
|
358
839
|
}
|
|
359
|
-
|
|
840
|
+
let intent = await readServiceDataDeletionIntent(projectPath, optionsArg.service);
|
|
841
|
+
let canonicalExists = await this.assertRegularDeletionDirectory(hostPath);
|
|
842
|
+
let quarantinePath;
|
|
843
|
+
if (intent) {
|
|
844
|
+
quarantinePath = intent.quarantinePath;
|
|
845
|
+
}
|
|
846
|
+
else {
|
|
847
|
+
const token = plugins.crypto.randomBytes(16).toString('hex');
|
|
848
|
+
quarantinePath = getServiceDataQuarantinePath(hostPath, token);
|
|
849
|
+
intent = {
|
|
850
|
+
owner: serviceDataOwner,
|
|
851
|
+
kind: 'service-data-deletion',
|
|
852
|
+
schemaVersion: 1,
|
|
853
|
+
projectPath,
|
|
854
|
+
service: optionsArg.service,
|
|
855
|
+
canonicalPath: hostPath,
|
|
856
|
+
quarantinePath,
|
|
857
|
+
token,
|
|
858
|
+
createdAt: new Date().toISOString(),
|
|
859
|
+
};
|
|
860
|
+
}
|
|
861
|
+
let quarantineExists = await this.assertRegularDeletionDirectory(quarantinePath);
|
|
862
|
+
if (canonicalExists && quarantineExists) {
|
|
863
|
+
throw new Error(`Refusing ambiguous service data deletion with both canonical and quarantine paths present: ${hostPath}`);
|
|
864
|
+
}
|
|
865
|
+
if (optionsArg.service === 'objectstorage' && (canonicalExists || quarantineExists)) {
|
|
866
|
+
const marker = await readServiceDataMarker(projectPath);
|
|
867
|
+
if (!markerProvesServiceDataDirectory(marker, projectPath, optionsArg.service)) {
|
|
868
|
+
throw new Error(`Refusing ObjectStorage cleanup with unproven ownership: ${hostPath}`);
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
const targetPaths = [hostPath, quarantinePath];
|
|
872
|
+
const serviceContainerFilters = [
|
|
873
|
+
`label=git.zone.project-path=${projectPath}`,
|
|
874
|
+
`label=git.zone.service=${optionsArg.service}`,
|
|
875
|
+
];
|
|
876
|
+
let serviceContainerIds = await this.listIds(serviceContainerFilters);
|
|
877
|
+
if (serviceContainerIds.length > 0) {
|
|
878
|
+
const serviceContainers = await this.inspectMany(serviceContainerIds);
|
|
879
|
+
const helperTargets = new Set();
|
|
880
|
+
for (const container of serviceContainers) {
|
|
881
|
+
const helperTarget = targetPaths.find((targetPathArg) => isExactStoppedBindHelperForTarget(container, targetPathArg, optionsArg));
|
|
882
|
+
if (!helperTarget) {
|
|
883
|
+
throw new Error(`Refusing service data cleanup while container ${container.name} exists.`);
|
|
884
|
+
}
|
|
885
|
+
helperTargets.add(helperTarget);
|
|
886
|
+
}
|
|
887
|
+
for (const helperTarget of helperTargets) {
|
|
888
|
+
await this.reclaimStaleFencedBindOperation(this.getDataCleanupOperation(helperTarget, imageArg, optionsArg), getFencedBindOperationName(helperTarget));
|
|
889
|
+
}
|
|
890
|
+
serviceContainerIds = await this.listIds(serviceContainerFilters);
|
|
891
|
+
if (serviceContainerIds.length > 0) {
|
|
892
|
+
const [container] = await this.inspectMany(serviceContainerIds);
|
|
893
|
+
throw new Error(`Refusing service data cleanup while container ${container?.name || serviceContainerIds[0]} exists.`);
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
const containerMountSources = await this.listAllMountSources();
|
|
897
|
+
const mountConflict = containerMountSources.find((sourceArg) => targetPaths.some((targetPathArg) => helpers.pathsOverlap(targetPathArg, sourceArg)));
|
|
898
|
+
if (mountConflict) {
|
|
899
|
+
throw new Error(`Refusing mounted service data path: ${hostPath} or its quarantine is used by ${mountConflict}`);
|
|
900
|
+
}
|
|
901
|
+
if (!canonicalExists && !quarantineExists) {
|
|
902
|
+
if (await plugins.smartfs.file(getServiceDataDeletionIntentPath(projectPath, optionsArg.service)).exists()) {
|
|
903
|
+
await plugins.fs.rm(getServiceDataDeletionIntentPath(projectPath, optionsArg.service));
|
|
904
|
+
return true;
|
|
905
|
+
}
|
|
906
|
+
return false;
|
|
907
|
+
}
|
|
908
|
+
if (!(await plugins.smartfs.file(getServiceDataDeletionIntentPath(projectPath, optionsArg.service)).exists())) {
|
|
909
|
+
await this.writeServiceDataDeletionIntent(intent);
|
|
910
|
+
}
|
|
911
|
+
if (canonicalExists) {
|
|
912
|
+
try {
|
|
913
|
+
await this.renameDataDirectory(hostPath, quarantinePath);
|
|
914
|
+
}
|
|
915
|
+
catch (error) {
|
|
916
|
+
throw new Error(`Could not quarantine ${hostPath} before deletion; the persisted intent is safe to retry.`, { cause: error });
|
|
917
|
+
}
|
|
918
|
+
canonicalExists = false;
|
|
919
|
+
quarantineExists = true;
|
|
920
|
+
}
|
|
921
|
+
// All destructive work happens under the persisted quarantine name. A
|
|
922
|
+
// failure can leave bytes to resume, but never a partial canonical dataset.
|
|
360
923
|
try {
|
|
361
|
-
await
|
|
924
|
+
await this.deleteDataDirectory(quarantinePath);
|
|
362
925
|
}
|
|
363
|
-
catch
|
|
364
|
-
//
|
|
926
|
+
catch {
|
|
927
|
+
// Fall through to root-helper removal.
|
|
365
928
|
}
|
|
366
|
-
|
|
367
|
-
|
|
929
|
+
quarantineExists = await this.assertRegularDeletionDirectory(quarantinePath);
|
|
930
|
+
if (!quarantineExists) {
|
|
931
|
+
await plugins.fs.rm(getServiceDataDeletionIntentPath(projectPath, optionsArg.service));
|
|
932
|
+
return true;
|
|
368
933
|
}
|
|
369
934
|
if (!(await this.imageExists(imageArg))) {
|
|
370
|
-
throw new Error(`Cannot
|
|
371
|
-
`${imageArg} is not available locally to perform a
|
|
372
|
-
`Pull ${imageArg} and retry
|
|
373
|
-
}
|
|
374
|
-
// Empty the mounted directory from inside a root container, then remove the
|
|
375
|
-
// now-empty directory from the host.
|
|
376
|
-
const emptied = await this.runOneOff({
|
|
377
|
-
image: imageArg,
|
|
378
|
-
shell: 'sh',
|
|
379
|
-
command: 'rm -rf /gitzone-target/..?* /gitzone-target/.[!.]* /gitzone-target/*',
|
|
380
|
-
volumes: { [hostPath]: '/gitzone-target' },
|
|
381
|
-
user: '0',
|
|
382
|
-
});
|
|
383
|
-
if (!emptied) {
|
|
384
|
-
throw new Error(`Privileged cleanup of ${hostPath} failed`);
|
|
935
|
+
throw new Error(`Cannot finish removing quarantined data at ${quarantinePath}: its contents belong to the container user and image ` +
|
|
936
|
+
`${imageArg} is not available locally to perform a root-helper cleanup. ` +
|
|
937
|
+
`Pull ${imageArg} and retry; the canonical path remains absent and the deletion intent is preserved.`);
|
|
385
938
|
}
|
|
939
|
+
await this.runFencedBindOperation(this.getDataCleanupOperation(quarantinePath, imageArg, optionsArg));
|
|
386
940
|
try {
|
|
387
|
-
await
|
|
941
|
+
await this.deleteDataDirectory(quarantinePath);
|
|
388
942
|
}
|
|
389
943
|
catch (error) {
|
|
390
944
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
391
|
-
throw new Error(`Could not remove ${
|
|
945
|
+
throw new Error(`Could not remove quarantine ${quarantinePath} after root-helper cleanup: ${errorMessage}`);
|
|
392
946
|
}
|
|
393
|
-
if (await plugins.smartfs.directory(
|
|
394
|
-
throw new Error(`Refusing to report success: ${
|
|
947
|
+
if (await plugins.smartfs.directory(quarantinePath).exists()) {
|
|
948
|
+
throw new Error(`Refusing to report success: quarantine ${quarantinePath} still exists`);
|
|
395
949
|
}
|
|
950
|
+
await plugins.fs.rm(getServiceDataDeletionIntentPath(projectPath, optionsArg.service));
|
|
951
|
+
return true;
|
|
396
952
|
}
|
|
397
953
|
/**
|
|
398
954
|
* Execute a command in a running container
|
|
@@ -431,9 +987,8 @@ export class DockerContainer {
|
|
|
431
987
|
*/
|
|
432
988
|
async logs(containerName, lines) {
|
|
433
989
|
try {
|
|
434
|
-
const
|
|
435
|
-
|
|
436
|
-
return result.combinedOutput;
|
|
990
|
+
const result = await this.execArgv(['logs', ...(lines ? ['--tail', String(lines)] : []), containerName], { timeoutMs: this.queryTimeoutSeconds * 1_000 });
|
|
991
|
+
return `${result.stdout}${result.stderr}`;
|
|
437
992
|
}
|
|
438
993
|
catch (error) {
|
|
439
994
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -471,13 +1026,12 @@ export class DockerContainer {
|
|
|
471
1026
|
*/
|
|
472
1027
|
async inspect(containerName) {
|
|
473
1028
|
try {
|
|
474
|
-
const result = await this.
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
return null;
|
|
1029
|
+
const result = await this.execArgv(['inspect', containerName], {
|
|
1030
|
+
timeoutMs: this.queryTimeoutSeconds * 1_000,
|
|
1031
|
+
});
|
|
1032
|
+
return JSON.parse(result.stdout);
|
|
479
1033
|
}
|
|
480
|
-
catch
|
|
1034
|
+
catch {
|
|
481
1035
|
return null;
|
|
482
1036
|
}
|
|
483
1037
|
}
|
|
@@ -487,9 +1041,8 @@ export class DockerContainer {
|
|
|
487
1041
|
async getPortMappings(containerName) {
|
|
488
1042
|
try {
|
|
489
1043
|
// Use docker inspect without format to get full JSON, then extract PortBindings
|
|
490
|
-
const
|
|
491
|
-
if (
|
|
492
|
-
const inspectData = JSON.parse(result.stdout);
|
|
1044
|
+
const inspectData = await this.inspect(containerName);
|
|
1045
|
+
if (inspectData) {
|
|
493
1046
|
if (inspectData && inspectData[0] && inspectData[0].HostConfig && inspectData[0].HostConfig.PortBindings) {
|
|
494
1047
|
const portBindings = inspectData[0].HostConfig.PortBindings;
|
|
495
1048
|
const mappings = {};
|
|
@@ -519,12 +1072,15 @@ export class DockerContainer {
|
|
|
519
1072
|
* mistaking an unreachable daemon for "no containers exist".
|
|
520
1073
|
*/
|
|
521
1074
|
async listIds(filterArgs, includeStopped = true) {
|
|
522
|
-
const
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
}
|
|
1075
|
+
const argv = ['ps'];
|
|
1076
|
+
if (includeStopped)
|
|
1077
|
+
argv.push('-a');
|
|
1078
|
+
for (const filter of filterArgs)
|
|
1079
|
+
argv.push('--filter', filter);
|
|
1080
|
+
argv.push('--format', '{{.ID}}');
|
|
1081
|
+
const result = await this.execArgv(argv, {
|
|
1082
|
+
timeoutMs: this.queryTimeoutSeconds * 1_000,
|
|
1083
|
+
});
|
|
528
1084
|
if (!result.stdout.trim()) {
|
|
529
1085
|
return [];
|
|
530
1086
|
}
|
|
@@ -542,10 +1098,9 @@ export class DockerContainer {
|
|
|
542
1098
|
if (idsArg.length === 0) {
|
|
543
1099
|
return [];
|
|
544
1100
|
}
|
|
545
|
-
const result = await this.
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
}
|
|
1101
|
+
const result = await this.execArgv(['inspect', ...idsArg], {
|
|
1102
|
+
timeoutMs: this.queryTimeoutSeconds * 1_000,
|
|
1103
|
+
});
|
|
549
1104
|
let parsed;
|
|
550
1105
|
try {
|
|
551
1106
|
parsed = JSON.parse(result.stdout);
|
|
@@ -582,7 +1137,14 @@ export class DockerContainer {
|
|
|
582
1137
|
* mounted by anything running is never a deletion candidate.
|
|
583
1138
|
*/
|
|
584
1139
|
async listRunningMountSources() {
|
|
585
|
-
|
|
1140
|
+
return this.listMountSources(false);
|
|
1141
|
+
}
|
|
1142
|
+
/** Resolved host bind paths configured on running and stopped containers. */
|
|
1143
|
+
async listAllMountSources() {
|
|
1144
|
+
return this.listMountSources(true);
|
|
1145
|
+
}
|
|
1146
|
+
async listMountSources(includeStoppedArg) {
|
|
1147
|
+
const ids = await this.listIds([], includeStoppedArg);
|
|
586
1148
|
const containers = await this.inspectMany(ids);
|
|
587
1149
|
const sources = new Set();
|
|
588
1150
|
for (const container of containers) {
|
|
@@ -593,4 +1155,4 @@ export class DockerContainer {
|
|
|
593
1155
|
return [...sources];
|
|
594
1156
|
}
|
|
595
1157
|
}
|
|
596
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kb2NrZXJjb250YWluZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2Rfc2VydmljZXMvY2xhc3Nlcy5kb2NrZXJjb250YWluZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUErQy9DLG1FQUFtRTtBQUNuRSxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsS0FBSztJQUNqQyxRQUFRLENBQVU7SUFDbEIsTUFBTSxDQUFrQjtJQUV4QyxZQUFZLFVBQTRDO1FBQ3RELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRO1lBQ2hDLENBQUMsQ0FBQyxtQkFBbUIsVUFBVSxDQUFDLFNBQVMsSUFBSTtZQUM3QyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU07Z0JBQ2pCLENBQUMsQ0FBQyx3QkFBd0IsVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDN0MsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEtBQUssU0FBUztvQkFDakMsQ0FBQyxDQUFDLHNCQUFzQjtvQkFDeEIsQ0FBQyxDQUFDLG9CQUFvQixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEQsS0FBSyxDQUFDLGtCQUFrQixNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0NBQ0Y7QUFhRCx1RUFBdUU7QUFDdkUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsUUFBZ0IsRUFBVSxFQUFFLENBQUMsSUFBSSxRQUFR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
|
|
1158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kb2NrZXJjb250YWluZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9tb2Rfc2VydmljZXMvY2xhc3Nlcy5kb2NrZXJjb250YWluZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixnQ0FBZ0MsRUFDaEMscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFnQixHQUVqQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBaUU3RSxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyx5QkFBeUIsQ0FBQztBQUN0RSxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRywrQkFBK0IsQ0FBQztBQUNsRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFDM0MsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsTUFBTSxDQUFDO0FBRXRELDBFQUEwRTtBQUMxRSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFdBQW1CLEVBQVUsRUFBRTtJQUN4RSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTTtTQUM5QixVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ3BCLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN6QyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2IsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoQixPQUFPLHlCQUF5QixVQUFVLEVBQUUs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
|