@git.zone/cli 3.2.1 → 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 +1 -1
- 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_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
|
@@ -3,191 +3,339 @@ import * as helpers from './helpers.js';
|
|
|
3
3
|
import { ServiceConfiguration, getS3BucketNameValidationError, } from './classes.serviceconfiguration.js';
|
|
4
4
|
import { DockerContainer, matchDockerUlimits, } from './classes.dockercontainer.js';
|
|
5
5
|
import { GlobalRegistry } from './classes.globalregistry.js';
|
|
6
|
-
import { getServiceContainerLabels, recordServiceDataDirectory, serviceImages, } from './classes.servicedatamarker.js';
|
|
6
|
+
import { getLegacyMinioDataDirectory, getServiceContainerLabels, getServiceDataDirectory, hasExactServiceContainerLabels, markerProvesServiceDataDirectory, objectStorageImage, readServiceDataMarker, recordServiceDataDirectory, serviceBindOperation, serviceImages, serviceNames, serviceOperationLabel, serviceToolLabel, } from './classes.servicedatamarker.js';
|
|
7
|
+
import { readPersistedServiceConfiguration } from './classes.servicenames.js';
|
|
8
|
+
import { withServiceDataOperationLock } from './classes.interprocesslock.js';
|
|
9
|
+
import { runServiceMigrations, } from '../../dist_ts_migration/index.js';
|
|
7
10
|
import { logger } from '../gitzone.logging.js';
|
|
11
|
+
import { readSmartconfigFile, setCliConfigValueInData, writeSmartconfigFile, } from '../helpers.smartconfig.js';
|
|
12
|
+
export const getServiceManagerMigrationScopes = (operationArg) => [
|
|
13
|
+
'global-registry',
|
|
14
|
+
'service-selection',
|
|
15
|
+
'runtime-config',
|
|
16
|
+
...(['start', 'restart', 'reconfigure', 'clean'].includes(operationArg)
|
|
17
|
+
? ['service-data-marker']
|
|
18
|
+
: []),
|
|
19
|
+
];
|
|
8
20
|
export const mongoServiceUlimits = {
|
|
9
21
|
nofile: {
|
|
10
22
|
soft: 65_536,
|
|
11
23
|
hard: 65_536,
|
|
12
24
|
},
|
|
13
25
|
};
|
|
14
|
-
export const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const minioAliasSetupScript = 'mc alias set gitzone-local http://127.0.0.1:9000 "$MINIO_ROOT_USER" "$MINIO_ROOT_PASSWORD" >/dev/null';
|
|
20
|
-
const defaultMinioClock = {
|
|
26
|
+
export const objectStorageReconciliationTimeoutMs = 30_000;
|
|
27
|
+
const objectStorageProbeTimeoutCapMs = 2_000;
|
|
28
|
+
const objectStorageProbeIntervalMs = 250;
|
|
29
|
+
const objectStorageRollbackTimeoutMs = 5_000;
|
|
30
|
+
const defaultObjectStorageClock = {
|
|
21
31
|
now: () => Date.now(),
|
|
22
32
|
delay: async (millisecondsArg) => plugins.smartdelay.delayFor(millisecondsArg),
|
|
23
33
|
};
|
|
24
|
-
class
|
|
34
|
+
class ObjectStorageStageError extends Error {
|
|
25
35
|
constructor(stageArg, timedOutArg, causeArg) {
|
|
26
36
|
const message = timedOutArg
|
|
27
|
-
? `
|
|
28
|
-
: `
|
|
37
|
+
? `ObjectStorage ${stageArg} did not complete before the shared reconciliation deadline.`
|
|
38
|
+
: `ObjectStorage ${stageArg} failed.`;
|
|
29
39
|
super(message, causeArg === undefined ? undefined : { cause: causeArg });
|
|
30
|
-
this.name = '
|
|
40
|
+
this.name = 'ObjectStorageStageError';
|
|
31
41
|
}
|
|
32
42
|
}
|
|
33
|
-
const
|
|
34
|
-
return new
|
|
43
|
+
const objectStorageStageError = (stageArg, timedOutArg, causeArg) => {
|
|
44
|
+
return new ObjectStorageStageError(stageArg, timedOutArg, causeArg);
|
|
35
45
|
};
|
|
36
|
-
const
|
|
37
|
-
if (errorArg instanceof MinioStageError && errorArg.cause !== undefined) {
|
|
38
|
-
return errorArg.cause;
|
|
39
|
-
}
|
|
40
|
-
return errorArg;
|
|
41
|
-
};
|
|
42
|
-
const normalizeMinioLifecycleError = (errorArg) => {
|
|
46
|
+
const normalizeObjectStorageLifecycleError = (errorArg) => {
|
|
43
47
|
return errorArg instanceof Error
|
|
44
48
|
? errorArg
|
|
45
|
-
: new Error('
|
|
49
|
+
: new Error('ObjectStorage lifecycle failed with a non-Error rejection.');
|
|
46
50
|
};
|
|
47
51
|
const isUnknownRecord = (valueArg) => {
|
|
48
52
|
return typeof valueArg === 'object' && valueArg !== null && !Array.isArray(valueArg);
|
|
49
53
|
};
|
|
50
|
-
const
|
|
54
|
+
export const objectStorageExpectedEntrypoint = ['/usr/bin/tini', '--'];
|
|
55
|
+
export const objectStorageExpectedCommand = [
|
|
56
|
+
'deno',
|
|
57
|
+
'run',
|
|
58
|
+
'--allow-all',
|
|
59
|
+
'mod.ts',
|
|
60
|
+
'server',
|
|
61
|
+
];
|
|
62
|
+
export const objectStorageExpectedHealthcheck = {
|
|
63
|
+
test: [
|
|
64
|
+
'CMD-SHELL',
|
|
65
|
+
`deno eval "const response = await fetch('http://127.0.0.1:3000/readyz'); Deno.exit(response.ok ? 0 : 1);"`,
|
|
66
|
+
],
|
|
67
|
+
interval: 30_000_000_000,
|
|
68
|
+
timeout: 5_000_000_000,
|
|
69
|
+
startPeriod: 10_000_000_000,
|
|
70
|
+
retries: 3,
|
|
71
|
+
};
|
|
72
|
+
const parseObjectStorageIdentity = (stdoutArg, expectedContainerNameArg) => {
|
|
51
73
|
let parsed;
|
|
52
74
|
try {
|
|
53
75
|
parsed = JSON.parse(stdoutArg);
|
|
54
76
|
}
|
|
55
77
|
catch {
|
|
56
|
-
throw new Error(`Docker returned an invalid
|
|
78
|
+
throw new Error(`Docker returned an invalid ObjectStorage identity for ${expectedContainerNameArg}.`);
|
|
57
79
|
}
|
|
58
80
|
if (!Array.isArray(parsed) || parsed.length !== 1 || !isUnknownRecord(parsed[0])) {
|
|
59
|
-
throw new Error(`Docker returned an invalid
|
|
81
|
+
throw new Error(`Docker returned an invalid ObjectStorage identity for ${expectedContainerNameArg}.`);
|
|
82
|
+
}
|
|
83
|
+
const inspected = parsed[0];
|
|
84
|
+
const state = inspected.State;
|
|
85
|
+
const config = inspected.Config;
|
|
86
|
+
const normalizedName = typeof inspected.Name === 'string' ? inspected.Name.replace(/^\//u, '') : undefined;
|
|
87
|
+
if (typeof inspected.Id !== 'string' ||
|
|
88
|
+
!/^[a-f0-9]{64}$/u.test(inspected.Id) ||
|
|
89
|
+
normalizedName !== expectedContainerNameArg ||
|
|
90
|
+
!isUnknownRecord(state) ||
|
|
91
|
+
typeof state.Running !== 'boolean' ||
|
|
92
|
+
typeof state.Status !== 'string' ||
|
|
93
|
+
!isUnknownRecord(config) ||
|
|
94
|
+
(config.Labels !== null && config.Labels !== undefined && !isUnknownRecord(config.Labels))) {
|
|
95
|
+
throw new Error(`Docker returned an invalid ObjectStorage identity for ${expectedContainerNameArg}.`);
|
|
96
|
+
}
|
|
97
|
+
const labels = {};
|
|
98
|
+
for (const [keyArg, valueArg] of Object.entries(config.Labels || {})) {
|
|
99
|
+
if (typeof valueArg !== 'string') {
|
|
100
|
+
throw new Error(`Docker returned an invalid ObjectStorage identity for ${expectedContainerNameArg}.`);
|
|
101
|
+
}
|
|
102
|
+
labels[keyArg] = valueArg;
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
id: inspected.Id,
|
|
106
|
+
name: normalizedName,
|
|
107
|
+
running: state.Running,
|
|
108
|
+
status: state.Status,
|
|
109
|
+
labels,
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
const parseObjectStorageInspection = (stdoutArg, expectedContainerNameArg) => {
|
|
113
|
+
let parsed;
|
|
114
|
+
try {
|
|
115
|
+
parsed = JSON.parse(stdoutArg);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
throw new Error(`Docker returned an invalid ObjectStorage inspection for ${expectedContainerNameArg}.`);
|
|
119
|
+
}
|
|
120
|
+
if (!Array.isArray(parsed) || parsed.length !== 1 || !isUnknownRecord(parsed[0])) {
|
|
121
|
+
throw new Error(`Docker returned an invalid ObjectStorage inspection for ${expectedContainerNameArg}.`);
|
|
60
122
|
}
|
|
61
123
|
const inspected = parsed[0];
|
|
62
124
|
const state = inspected.State;
|
|
63
125
|
const config = inspected.Config;
|
|
64
126
|
const hostConfig = inspected.HostConfig;
|
|
127
|
+
const healthcheck = isUnknownRecord(config) ? config.Healthcheck : undefined;
|
|
128
|
+
const restartPolicy = isUnknownRecord(hostConfig) ? hostConfig.RestartPolicy : undefined;
|
|
65
129
|
const normalizedName = typeof inspected.Name === 'string' ? inspected.Name.replace(/^\//u, '') : undefined;
|
|
66
130
|
if (typeof inspected.Id !== 'string' ||
|
|
67
131
|
!/^[a-f0-9]{64}$/u.test(inspected.Id) ||
|
|
68
132
|
normalizedName !== expectedContainerNameArg ||
|
|
69
133
|
!isUnknownRecord(state) ||
|
|
70
134
|
typeof state.Running !== 'boolean' ||
|
|
135
|
+
typeof state.Status !== 'string' ||
|
|
71
136
|
!isUnknownRecord(config) ||
|
|
137
|
+
typeof config.Image !== 'string' ||
|
|
138
|
+
typeof config.User !== 'string' ||
|
|
139
|
+
!Array.isArray(config.Cmd) ||
|
|
140
|
+
!config.Cmd.every((entryArg) => typeof entryArg === 'string') ||
|
|
141
|
+
!Array.isArray(config.Entrypoint) ||
|
|
142
|
+
!config.Entrypoint.every((entryArg) => typeof entryArg === 'string') ||
|
|
72
143
|
!isUnknownRecord(hostConfig) ||
|
|
73
144
|
!isUnknownRecord(hostConfig.PortBindings) ||
|
|
145
|
+
!isUnknownRecord(restartPolicy) ||
|
|
146
|
+
typeof restartPolicy.Name !== 'string' ||
|
|
74
147
|
!Array.isArray(config.Env) ||
|
|
75
|
-
!config.Env.every((entryArg) => typeof entryArg === 'string')
|
|
76
|
-
|
|
148
|
+
!config.Env.every((entryArg) => typeof entryArg === 'string') ||
|
|
149
|
+
!isUnknownRecord(config.Labels) ||
|
|
150
|
+
!isUnknownRecord(healthcheck) ||
|
|
151
|
+
!Array.isArray(healthcheck.Test) ||
|
|
152
|
+
!healthcheck.Test.every((entryArg) => typeof entryArg === 'string') ||
|
|
153
|
+
typeof healthcheck.Interval !== 'number' ||
|
|
154
|
+
typeof healthcheck.Timeout !== 'number' ||
|
|
155
|
+
typeof healthcheck.StartPeriod !== 'number' ||
|
|
156
|
+
typeof healthcheck.Retries !== 'number' ||
|
|
157
|
+
!Array.isArray(inspected.Mounts)) {
|
|
158
|
+
throw new Error(`Docker returned an invalid ObjectStorage inspection for ${expectedContainerNameArg}.`);
|
|
77
159
|
}
|
|
78
160
|
const labels = {};
|
|
79
|
-
|
|
80
|
-
if (
|
|
81
|
-
throw new Error(`Docker returned an invalid
|
|
82
|
-
}
|
|
83
|
-
for (const [key, value] of Object.entries(config.Labels)) {
|
|
84
|
-
if (typeof value !== 'string') {
|
|
85
|
-
throw new Error(`Docker returned an invalid MinIO inspection for ${expectedContainerNameArg}.`);
|
|
86
|
-
}
|
|
87
|
-
labels[key] = value;
|
|
161
|
+
for (const [key, value] of Object.entries(config.Labels)) {
|
|
162
|
+
if (typeof value !== 'string') {
|
|
163
|
+
throw new Error(`Docker returned an invalid ObjectStorage inspection for ${expectedContainerNameArg}.`);
|
|
88
164
|
}
|
|
165
|
+
labels[key] = value;
|
|
89
166
|
}
|
|
167
|
+
const mounts = inspected.Mounts.map((mountArg) => {
|
|
168
|
+
if (!isUnknownRecord(mountArg) ||
|
|
169
|
+
mountArg.Type !== 'bind' ||
|
|
170
|
+
typeof mountArg.Source !== 'string' ||
|
|
171
|
+
typeof mountArg.Destination !== 'string' ||
|
|
172
|
+
typeof mountArg.RW !== 'boolean') {
|
|
173
|
+
throw new Error(`Docker returned an invalid ObjectStorage inspection for ${expectedContainerNameArg}.`);
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
source: plugins.path.resolve(mountArg.Source),
|
|
177
|
+
destination: mountArg.Destination,
|
|
178
|
+
readWrite: mountArg.RW,
|
|
179
|
+
};
|
|
180
|
+
});
|
|
90
181
|
return {
|
|
91
182
|
id: inspected.Id,
|
|
92
183
|
name: normalizedName,
|
|
93
184
|
running: state.Running,
|
|
185
|
+
status: state.Status,
|
|
186
|
+
image: config.Image,
|
|
94
187
|
portBindings: hostConfig.PortBindings,
|
|
95
188
|
environmentEntries: config.Env,
|
|
96
189
|
labels,
|
|
190
|
+
mounts,
|
|
191
|
+
restartPolicy: restartPolicy.Name,
|
|
192
|
+
command: [...config.Cmd],
|
|
193
|
+
entrypoint: [...config.Entrypoint],
|
|
194
|
+
user: config.User,
|
|
195
|
+
healthcheck: {
|
|
196
|
+
test: [...healthcheck.Test],
|
|
197
|
+
interval: healthcheck.Interval,
|
|
198
|
+
timeout: healthcheck.Timeout,
|
|
199
|
+
startPeriod: healthcheck.StartPeriod,
|
|
200
|
+
retries: healthcheck.Retries,
|
|
201
|
+
},
|
|
97
202
|
};
|
|
98
203
|
};
|
|
99
|
-
const
|
|
204
|
+
const objectStoragePortMatches = (portBindingsArg, containerPortArg, expectedHostPortArg) => {
|
|
100
205
|
const bindings = portBindingsArg[containerPortArg];
|
|
101
206
|
return (Array.isArray(bindings) &&
|
|
102
|
-
bindings.
|
|
207
|
+
bindings.length === 1 &&
|
|
208
|
+
isUnknownRecord(bindings[0]) &&
|
|
209
|
+
bindings[0].HostIp === '127.0.0.1' &&
|
|
210
|
+
bindings[0].HostPort === expectedHostPortArg);
|
|
103
211
|
};
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
throw new Error('MinIO reconciliation requires a full immutable Docker container id.');
|
|
108
|
-
}
|
|
109
|
-
const clock = optionsArg.clock || defaultMinioClock;
|
|
110
|
-
const deadlineAt = optionsArg.deadlineAt ?? clock.now() + minioReconciliationTimeoutMs;
|
|
111
|
-
if (!Number.isFinite(deadlineAt)) {
|
|
112
|
-
throw new Error('MinIO reconciliation deadline must be finite');
|
|
212
|
+
const isS3BucketNotFound = (errorArg) => {
|
|
213
|
+
if (!isUnknownRecord(errorArg)) {
|
|
214
|
+
return false;
|
|
113
215
|
}
|
|
216
|
+
const metadata = errorArg.$metadata;
|
|
217
|
+
return (errorArg.name === 'NoSuchBucket' ||
|
|
218
|
+
errorArg.name === 'NotFound' ||
|
|
219
|
+
(isUnknownRecord(metadata) && metadata.httpStatusCode === 404));
|
|
220
|
+
};
|
|
221
|
+
/** Create the configured bucket only after an authenticated 404, then verify by HEAD. */
|
|
222
|
+
export const reconcileObjectStorageBucket = async (optionsArg) => {
|
|
223
|
+
const clock = optionsArg.clock || defaultObjectStorageClock;
|
|
224
|
+
const deadlineAt = optionsArg.deadlineAt ?? clock.now() + objectStorageReconciliationTimeoutMs;
|
|
114
225
|
const remainingMs = () => Math.floor(deadlineAt - clock.now());
|
|
115
|
-
const
|
|
226
|
+
const sendWithDeadline = async (stageArg, commandArg) => {
|
|
116
227
|
const remaining = remainingMs();
|
|
117
228
|
if (remaining <= 0) {
|
|
118
|
-
throw
|
|
119
|
-
}
|
|
229
|
+
throw objectStorageStageError(stageArg, true);
|
|
230
|
+
}
|
|
231
|
+
const controller = new AbortController();
|
|
232
|
+
let timedOut = false;
|
|
233
|
+
const timeoutPromise = new Promise((_resolve, reject) => {
|
|
234
|
+
const timer = setTimeout(() => {
|
|
235
|
+
timedOut = true;
|
|
236
|
+
controller.abort();
|
|
237
|
+
reject(objectStorageStageError(stageArg, true));
|
|
238
|
+
}, remaining);
|
|
239
|
+
controller.signal.addEventListener('abort', () => clearTimeout(timer), { once: true });
|
|
240
|
+
});
|
|
120
241
|
try {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
242
|
+
await Promise.race([
|
|
243
|
+
optionsArg.smartBucket.storageClient.send(commandArg, {
|
|
244
|
+
abortSignal: controller.signal,
|
|
245
|
+
}),
|
|
246
|
+
timeoutPromise,
|
|
247
|
+
]);
|
|
124
248
|
}
|
|
125
249
|
catch (error) {
|
|
126
|
-
|
|
250
|
+
if (timedOut || error instanceof ObjectStorageStageError) {
|
|
251
|
+
throw objectStorageStageError(stageArg, true);
|
|
252
|
+
}
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
controller.abort();
|
|
127
257
|
}
|
|
128
258
|
};
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
259
|
+
let primaryError;
|
|
260
|
+
try {
|
|
261
|
+
if (!Number.isFinite(deadlineAt)) {
|
|
262
|
+
throw new Error('ObjectStorage reconciliation deadline must be finite.');
|
|
263
|
+
}
|
|
264
|
+
let bucketMissing = false;
|
|
265
|
+
try {
|
|
266
|
+
await sendWithDeadline('authenticated bucket lookup', new plugins.s3.HeadBucketCommand({ Bucket: optionsArg.bucket }));
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
if (error instanceof ObjectStorageStageError) {
|
|
270
|
+
throw error;
|
|
271
|
+
}
|
|
272
|
+
if (!isS3BucketNotFound(error)) {
|
|
273
|
+
throw objectStorageStageError('authenticated bucket lookup', false);
|
|
274
|
+
}
|
|
275
|
+
bucketMissing = true;
|
|
276
|
+
}
|
|
277
|
+
let createFailed = false;
|
|
278
|
+
if (bucketMissing) {
|
|
132
279
|
try {
|
|
133
|
-
|
|
280
|
+
await sendWithDeadline('bucket creation', new plugins.s3.CreateBucketCommand({ Bucket: optionsArg.bucket }));
|
|
134
281
|
}
|
|
135
|
-
catch
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
lastCause = currentCause;
|
|
139
|
-
}
|
|
140
|
-
const remaining = remainingMs();
|
|
141
|
-
if (remaining <= 0) {
|
|
142
|
-
throw minioStageError(stageArg, true, lastCause);
|
|
143
|
-
}
|
|
144
|
-
await clock.delay(Math.min(minioProbeIntervalMs, remaining));
|
|
145
|
-
if (remainingMs() <= 0) {
|
|
146
|
-
throw minioStageError(stageArg, true, lastCause);
|
|
147
|
-
}
|
|
282
|
+
catch {
|
|
283
|
+
// A timed-out or disconnected create can still have reached the server.
|
|
284
|
+
createFailed = true;
|
|
148
285
|
}
|
|
149
286
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
'
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
287
|
+
const verificationTimeout = Math.min(30_000, remainingMs());
|
|
288
|
+
if (verificationTimeout <= 0) {
|
|
289
|
+
throw objectStorageStageError('bucket verification', true);
|
|
290
|
+
}
|
|
291
|
+
let verification;
|
|
292
|
+
try {
|
|
293
|
+
verification = await optionsArg.smartBucket.checkReadiness(optionsArg.bucket, {
|
|
294
|
+
timeoutMs: verificationTimeout,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
throw objectStorageStageError('bucket verification', false);
|
|
299
|
+
}
|
|
300
|
+
if (!verification.ready) {
|
|
301
|
+
throw objectStorageStageError(createFailed ? 'bucket creation and verification' : 'bucket verification', verification.reason === 'timeout');
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
primaryError = normalizeObjectStorageLifecycleError(error);
|
|
306
|
+
}
|
|
307
|
+
let closeError;
|
|
308
|
+
try {
|
|
309
|
+
await optionsArg.smartBucket.close();
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
closeError = objectStorageStageError('S3 client cleanup', false);
|
|
313
|
+
}
|
|
314
|
+
if (primaryError && closeError) {
|
|
315
|
+
throw new AggregateError([primaryError, closeError], 'ObjectStorage bucket reconciliation failed and S3 client cleanup could not be confirmed.');
|
|
316
|
+
}
|
|
317
|
+
if (primaryError) {
|
|
318
|
+
throw primaryError;
|
|
319
|
+
}
|
|
320
|
+
if (closeError) {
|
|
321
|
+
throw closeError;
|
|
322
|
+
}
|
|
184
323
|
};
|
|
185
324
|
export class ServiceManager {
|
|
186
325
|
config;
|
|
187
326
|
docker;
|
|
188
327
|
enabledServices = null;
|
|
189
328
|
globalRegistry;
|
|
190
|
-
|
|
329
|
+
objectStorageClock = defaultObjectStorageClock;
|
|
330
|
+
fetchImplementation = globalThis.fetch;
|
|
331
|
+
smartBucketFactory = (configArg) => new plugins.smartbucket.SmartBucket({
|
|
332
|
+
endpoint: '127.0.0.1',
|
|
333
|
+
port: parseInt(configArg.S3_PORT),
|
|
334
|
+
useSsl: false,
|
|
335
|
+
region: configArg.S3_REGION,
|
|
336
|
+
accessKey: configArg.S3_ACCESSKEY,
|
|
337
|
+
accessSecret: configArg.S3_SECRETKEY,
|
|
338
|
+
});
|
|
191
339
|
constructor() {
|
|
192
340
|
this.config = new ServiceConfiguration();
|
|
193
341
|
this.docker = new DockerContainer();
|
|
@@ -196,7 +344,11 @@ export class ServiceManager {
|
|
|
196
344
|
/**
|
|
197
345
|
* Initialize the service manager
|
|
198
346
|
*/
|
|
199
|
-
async init() {
|
|
347
|
+
async init(operationArg) {
|
|
348
|
+
await runServiceMigrations({
|
|
349
|
+
projectPath: process.cwd(),
|
|
350
|
+
scopes: getServiceManagerMigrationScopes(operationArg),
|
|
351
|
+
});
|
|
200
352
|
// Check Docker availability
|
|
201
353
|
if (!(await this.docker.checkDocker())) {
|
|
202
354
|
logger.log('error', 'Error: Docker is not installed. Please install Docker first.');
|
|
@@ -220,7 +372,7 @@ export class ServiceManager {
|
|
|
220
372
|
// Any services command run in a project counts as activity. Without this
|
|
221
373
|
// lastActive only advanced on start, so an actively used project could look
|
|
222
374
|
// stale to the reaper.
|
|
223
|
-
await this.globalRegistry.touchProject(process.cwd());
|
|
375
|
+
await this.withProjectServiceLocks(process.cwd(), () => this.globalRegistry.touchProject(process.cwd()));
|
|
224
376
|
}
|
|
225
377
|
/**
|
|
226
378
|
* Human phrasing for where the auth mode came from. A declared auth-off is
|
|
@@ -247,10 +399,9 @@ export class ServiceManager {
|
|
|
247
399
|
* Load service configuration from .smartconfig.json
|
|
248
400
|
*/
|
|
249
401
|
async loadServiceConfiguration() {
|
|
250
|
-
const
|
|
251
|
-
const gitzoneConfig = smartconfigInstance.dataFor('@git.zone/cli', {});
|
|
402
|
+
const persistedServices = await readPersistedServiceConfiguration(process.cwd());
|
|
252
403
|
// Check if services array exists
|
|
253
|
-
if (
|
|
404
|
+
if (persistedServices.length === 0) {
|
|
254
405
|
// Prompt user to select services
|
|
255
406
|
const smartinteract = new plugins.smartinteract.SmartInteract();
|
|
256
407
|
const response = await smartinteract.askQuestion({
|
|
@@ -259,43 +410,28 @@ export class ServiceManager {
|
|
|
259
410
|
message: 'Which services do you want to enable for this project?',
|
|
260
411
|
choices: [
|
|
261
412
|
{ name: 'MongoDB', value: 'mongodb' },
|
|
262
|
-
{ name: '
|
|
413
|
+
{ name: 'ObjectStorage (S3)', value: 'objectstorage' },
|
|
263
414
|
{ name: 'Elasticsearch', value: 'elasticsearch' }
|
|
264
415
|
],
|
|
265
|
-
default: ['mongodb', '
|
|
416
|
+
default: ['mongodb', 'objectstorage', 'elasticsearch']
|
|
266
417
|
});
|
|
267
|
-
const enabledServices = response.value || ['mongodb', '
|
|
418
|
+
const enabledServices = response.value || ['mongodb', 'objectstorage', 'elasticsearch'];
|
|
268
419
|
this.enabledServices = enabledServices;
|
|
269
420
|
// Save to .smartconfig.json
|
|
270
421
|
await this.saveServiceConfiguration(enabledServices);
|
|
271
422
|
}
|
|
272
423
|
else {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
logger.log('info', `🔧 Enabled services: ${enabledServices.join(', ')}`);
|
|
424
|
+
this.enabledServices = persistedServices;
|
|
425
|
+
logger.log('info', `🔧 Enabled services: ${persistedServices.join(', ')}`);
|
|
276
426
|
}
|
|
277
427
|
}
|
|
278
428
|
/**
|
|
279
429
|
* Save service configuration to .smartconfig.json
|
|
280
430
|
*/
|
|
281
431
|
async saveServiceConfiguration(services) {
|
|
282
|
-
const
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
if (await plugins.smartfs.file(smartconfigPath).exists()) {
|
|
286
|
-
const content = await plugins.smartfs.file(smartconfigPath).encoding('utf8').read();
|
|
287
|
-
smartconfigData = JSON.parse(content);
|
|
288
|
-
}
|
|
289
|
-
// Update @git.zone/cli.services
|
|
290
|
-
if (!smartconfigData['@git.zone/cli']) {
|
|
291
|
-
smartconfigData['@git.zone/cli'] = {};
|
|
292
|
-
}
|
|
293
|
-
smartconfigData['@git.zone/cli'].services = services;
|
|
294
|
-
// Write back to .smartconfig.json
|
|
295
|
-
await plugins.smartfs
|
|
296
|
-
.file(smartconfigPath)
|
|
297
|
-
.encoding('utf8')
|
|
298
|
-
.write(JSON.stringify(smartconfigData, null, 2));
|
|
432
|
+
const smartconfigData = await readSmartconfigFile(process.cwd());
|
|
433
|
+
setCliConfigValueInData(smartconfigData, 'services', services);
|
|
434
|
+
await writeSmartconfigFile(smartconfigData, process.cwd());
|
|
299
435
|
logger.log('ok', `✅ Saved service configuration to .smartconfig.json`);
|
|
300
436
|
logger.log('info', `🔧 Enabled services: ${services.join(', ')}`);
|
|
301
437
|
}
|
|
@@ -315,14 +451,24 @@ export class ServiceManager {
|
|
|
315
451
|
* prove the directory is reclaimable instead of guessing from its path.
|
|
316
452
|
*/
|
|
317
453
|
async prepareDataDirectory(serviceArg, dataPathArg) {
|
|
318
|
-
await plugins.smartfs.directory(dataPathArg).
|
|
319
|
-
|
|
454
|
+
if (await plugins.smartfs.directory(dataPathArg).exists()) {
|
|
455
|
+
await recordServiceDataDirectory(process.cwd(), serviceArg);
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
// Publish ownership first: interruption can leave an absent directory with
|
|
459
|
+
// a harmless claim, but never an unmarked directory that blocks recovery.
|
|
460
|
+
await recordServiceDataDirectory(process.cwd(), serviceArg);
|
|
461
|
+
await this.createDataDirectory(dataPathArg);
|
|
462
|
+
}
|
|
320
463
|
return getServiceContainerLabels({
|
|
321
464
|
projectPath: process.cwd(),
|
|
322
465
|
service: serviceArg,
|
|
323
466
|
dataPath: dataPathArg,
|
|
324
467
|
});
|
|
325
468
|
}
|
|
469
|
+
async createDataDirectory(dataPathArg) {
|
|
470
|
+
await plugins.smartfs.directory(dataPathArg).recursive().create();
|
|
471
|
+
}
|
|
326
472
|
/**
|
|
327
473
|
* Register this project with the global registry.
|
|
328
474
|
*
|
|
@@ -338,16 +484,16 @@ export class ServiceManager {
|
|
|
338
484
|
projectName: config.PROJECT_NAME,
|
|
339
485
|
containers: {
|
|
340
486
|
mongo: containers.mongo,
|
|
341
|
-
|
|
487
|
+
objectstorage: containers.objectstorage,
|
|
342
488
|
elasticsearch: containers.elasticsearch,
|
|
343
489
|
},
|
|
344
490
|
ports: {
|
|
345
491
|
mongo: parseInt(config.MONGODB_PORT),
|
|
346
492
|
s3: parseInt(config.S3_PORT),
|
|
347
|
-
|
|
493
|
+
s3Ui: parseInt(config.S3_UI_PORT),
|
|
348
494
|
elasticsearch: parseInt(config.ELASTICSEARCH_PORT),
|
|
349
495
|
},
|
|
350
|
-
enabledServices: this.enabledServices || ['mongodb', '
|
|
496
|
+
enabledServices: this.enabledServices || ['mongodb', 'objectstorage', 'elasticsearch'],
|
|
351
497
|
});
|
|
352
498
|
}
|
|
353
499
|
/**
|
|
@@ -361,10 +507,10 @@ export class ServiceManager {
|
|
|
361
507
|
await this.startMongoDB();
|
|
362
508
|
first = false;
|
|
363
509
|
}
|
|
364
|
-
if (this.isServiceEnabled('
|
|
510
|
+
if (this.isServiceEnabled('objectstorage')) {
|
|
365
511
|
if (!first)
|
|
366
512
|
console.log();
|
|
367
|
-
await this.
|
|
513
|
+
await this.startObjectStorage();
|
|
368
514
|
first = false;
|
|
369
515
|
}
|
|
370
516
|
if (this.isServiceEnabled('elasticsearch')) {
|
|
@@ -385,7 +531,7 @@ export class ServiceManager {
|
|
|
385
531
|
async stopAll() {
|
|
386
532
|
await this.stopMongoDB();
|
|
387
533
|
console.log();
|
|
388
|
-
await this.
|
|
534
|
+
await this.stopObjectStorage();
|
|
389
535
|
console.log();
|
|
390
536
|
await this.stopElasticsearch();
|
|
391
537
|
}
|
|
@@ -398,6 +544,19 @@ export class ServiceManager {
|
|
|
398
544
|
* (localhost:MONGODB_PORT) is reachable from host and container alike.
|
|
399
545
|
*/
|
|
400
546
|
async startMongoDB() {
|
|
547
|
+
await withServiceDataOperationLock(process.cwd(), 'mongodb', () => this.startMongoDBLocked());
|
|
548
|
+
}
|
|
549
|
+
async assertNoPendingDataDeletion(serviceArg) {
|
|
550
|
+
const pendingPath = await this.docker.getPendingDataDeletionPath(process.cwd(), serviceArg);
|
|
551
|
+
if (pendingPath) {
|
|
552
|
+
throw new Error(`Pending ${serviceArg} data deletion must finish before startup: ${pendingPath}. ` +
|
|
553
|
+
'Run `gitzone services clean --yes` to resume the recorded cleanup.');
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
async startMongoDBLocked() {
|
|
557
|
+
await this.config.reloadFromDisk();
|
|
558
|
+
await this.assertNoPendingDataDeletion('mongodb');
|
|
559
|
+
await this.globalRegistry.touchProject(process.cwd());
|
|
401
560
|
logger.log('note', '📦 MongoDB:');
|
|
402
561
|
const config = this.config.getConfig();
|
|
403
562
|
const containers = this.config.getContainerNames();
|
|
@@ -646,228 +805,442 @@ export class ServiceManager {
|
|
|
646
805
|
logger.log('error', ' Replica set not ready after 30s — transactions unavailable');
|
|
647
806
|
return false;
|
|
648
807
|
}
|
|
649
|
-
async
|
|
808
|
+
async inspectObjectStorageContainer(containerReferenceArg, expectedContainerNameArg, dockerTimeoutArg) {
|
|
650
809
|
const result = await this.docker.execArgv(['inspect', containerReferenceArg], dockerTimeoutArg());
|
|
651
|
-
return
|
|
652
|
-
}
|
|
653
|
-
async
|
|
654
|
-
const
|
|
655
|
-
const
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
if (hasExactCurrentLabels) {
|
|
659
|
-
return;
|
|
660
|
-
}
|
|
661
|
-
const refusal = () => new Error(`Refusing to use MinIO container ${inspectionArg.name}: ` +
|
|
662
|
-
'its ownership is not proven for the current project.');
|
|
663
|
-
if (!allowLegacyRegistryArg) {
|
|
664
|
-
throw refusal();
|
|
665
|
-
}
|
|
666
|
-
// Any ownership label is authoritative. A partial, stale, or foreign set
|
|
667
|
-
// must never be reinterpreted through the legacy registry fallback.
|
|
668
|
-
if (actualGitZoneLabels.length > 0 || Object.keys(inspectionArg.labels).length > 0) {
|
|
669
|
-
throw refusal();
|
|
670
|
-
}
|
|
671
|
-
// Containers created before labels were introduced may be reclaimed only
|
|
672
|
-
// when the old global registry has one unambiguous claim for this exact
|
|
673
|
-
// name and the current resolved project path.
|
|
674
|
-
const currentProjectPath = plugins.path.resolve(process.cwd());
|
|
675
|
-
const registryProjects = await this.globalRegistry.getAllProjects();
|
|
676
|
-
const claims = Object.entries(registryProjects).filter(([, project]) => project.containers.minio === inspectionArg.name);
|
|
677
|
-
if (claims.length !== 1) {
|
|
678
|
-
throw refusal();
|
|
810
|
+
return parseObjectStorageInspection(result.stdout, expectedContainerNameArg);
|
|
811
|
+
}
|
|
812
|
+
async inspectObjectStorageIdentity(containerReferenceArg, expectedContainerNameArg, dockerTimeoutArg) {
|
|
813
|
+
const result = await this.docker.execArgv(['inspect', containerReferenceArg], dockerTimeoutArg());
|
|
814
|
+
const identity = parseObjectStorageIdentity(result.stdout, expectedContainerNameArg);
|
|
815
|
+
if (/^[a-f0-9]{64}$/u.test(containerReferenceArg) && identity.id !== containerReferenceArg) {
|
|
816
|
+
throw new Error(`Refusing ObjectStorage container ${expectedContainerNameArg}: its immutable id changed.`);
|
|
679
817
|
}
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
818
|
+
return identity;
|
|
819
|
+
}
|
|
820
|
+
async discoverContainerIdByExactName(containerNameArg, dockerTimeoutArg) {
|
|
821
|
+
const result = await this.docker.execArgv([
|
|
822
|
+
'container',
|
|
823
|
+
'ls',
|
|
824
|
+
'-a',
|
|
825
|
+
'--no-trunc',
|
|
826
|
+
'--filter',
|
|
827
|
+
`name=^/${containerNameArg}$`,
|
|
828
|
+
'--format',
|
|
829
|
+
'{{.ID}}',
|
|
830
|
+
], dockerTimeoutArg());
|
|
831
|
+
const ids = result.stdout
|
|
832
|
+
.split(/\r?\n/u)
|
|
833
|
+
.map((entry) => entry.trim())
|
|
834
|
+
.filter(Boolean);
|
|
835
|
+
if (ids.length === 0) {
|
|
836
|
+
return undefined;
|
|
837
|
+
}
|
|
838
|
+
if (ids.length !== 1 || !/^[a-f0-9]{64}$/u.test(ids[0])) {
|
|
839
|
+
throw new Error(`Docker returned ambiguous identity for container ${containerNameArg}.`);
|
|
840
|
+
}
|
|
841
|
+
return ids[0];
|
|
842
|
+
}
|
|
843
|
+
assertObjectStorageOwnership(inspectionArg, expectedLabelsArg) {
|
|
844
|
+
if (!hasExactServiceContainerLabels(inspectionArg.labels, expectedLabelsArg)) {
|
|
845
|
+
throw new Error(`Refusing to use ObjectStorage container ${inspectionArg.name}: ` +
|
|
846
|
+
'its ownership is not proven for the current project.');
|
|
684
847
|
}
|
|
685
848
|
}
|
|
686
|
-
async
|
|
687
|
-
const inspection = await this.
|
|
849
|
+
async revalidateObjectStorageContainer(containerIdArg, expectedContainerNameArg, expectedLabelsArg, dockerTimeoutArg) {
|
|
850
|
+
const inspection = await this.inspectObjectStorageContainer(containerIdArg, expectedContainerNameArg, dockerTimeoutArg);
|
|
688
851
|
if (inspection.id !== containerIdArg) {
|
|
689
|
-
throw new Error(`Refusing to use
|
|
852
|
+
throw new Error(`Refusing to use ObjectStorage container ${expectedContainerNameArg}: ` +
|
|
690
853
|
'its immutable id changed during reconciliation.');
|
|
691
854
|
}
|
|
692
|
-
|
|
855
|
+
this.assertObjectStorageOwnership(inspection, expectedLabelsArg);
|
|
693
856
|
return inspection;
|
|
694
857
|
}
|
|
695
|
-
|
|
696
|
-
* Start MinIO service
|
|
697
|
-
*/
|
|
698
|
-
async startMinIO() {
|
|
699
|
-
logger.log('note', '📦 S3/MinIO:');
|
|
858
|
+
objectStorageConfigurationMatches(inspectionArg, expectedLabelsArg) {
|
|
700
859
|
const config = this.config.getConfig();
|
|
701
|
-
const containers = this.config.getContainerNames();
|
|
702
860
|
const directories = this.config.getDataDirectories();
|
|
703
|
-
|
|
861
|
+
const expectedEnvironment = {
|
|
862
|
+
OBJST_PORT: '9000',
|
|
863
|
+
UI_PORT: '3000',
|
|
864
|
+
OBJST_STORAGE_DIR: '/data',
|
|
865
|
+
OBJST_ACCESS_KEY: config.S3_ACCESSKEY,
|
|
866
|
+
OBJST_SECRET_KEY: config.S3_SECRETKEY,
|
|
867
|
+
OBJST_ADMIN_PASSWORD: config.S3_ADMIN_PASSWORD,
|
|
868
|
+
OBJST_REGION: config.S3_REGION,
|
|
869
|
+
};
|
|
870
|
+
const controlledEnvironmentEntries = inspectionArg.environmentEntries.filter((entryArg) => {
|
|
871
|
+
const separatorIndex = entryArg.indexOf('=');
|
|
872
|
+
const name = separatorIndex === -1 ? entryArg : entryArg.slice(0, separatorIndex);
|
|
873
|
+
return name === 'UI_PORT' || name.startsWith('OBJST_');
|
|
874
|
+
});
|
|
875
|
+
const readEnvironment = (nameArg) => {
|
|
876
|
+
const prefix = `${nameArg}=`;
|
|
877
|
+
const matches = inspectionArg.environmentEntries.filter((entry) => entry.startsWith(prefix));
|
|
878
|
+
return matches.length === 1 ? matches[0].slice(prefix.length) : undefined;
|
|
879
|
+
};
|
|
880
|
+
const portKeys = Object.keys(inspectionArg.portBindings).sort();
|
|
881
|
+
const expectedPortKeys = ['3000/tcp', '9000/tcp'];
|
|
882
|
+
const healthcheckMatches = inspectionArg.healthcheck.test.length === objectStorageExpectedHealthcheck.test.length &&
|
|
883
|
+
inspectionArg.healthcheck.test.every((entry, index) => entry === objectStorageExpectedHealthcheck.test[index]) &&
|
|
884
|
+
inspectionArg.healthcheck.interval === objectStorageExpectedHealthcheck.interval &&
|
|
885
|
+
inspectionArg.healthcheck.timeout === objectStorageExpectedHealthcheck.timeout &&
|
|
886
|
+
inspectionArg.healthcheck.startPeriod === objectStorageExpectedHealthcheck.startPeriod &&
|
|
887
|
+
inspectionArg.healthcheck.retries === objectStorageExpectedHealthcheck.retries;
|
|
888
|
+
return (inspectionArg.image === objectStorageImage &&
|
|
889
|
+
portKeys.length === expectedPortKeys.length &&
|
|
890
|
+
portKeys.every((entry, index) => entry === expectedPortKeys[index]) &&
|
|
891
|
+
objectStoragePortMatches(inspectionArg.portBindings, '9000/tcp', config.S3_PORT) &&
|
|
892
|
+
objectStoragePortMatches(inspectionArg.portBindings, '3000/tcp', config.S3_UI_PORT) &&
|
|
893
|
+
inspectionArg.mounts.length === 1 &&
|
|
894
|
+
inspectionArg.mounts[0].source === plugins.path.resolve(directories.objectstorage) &&
|
|
895
|
+
inspectionArg.mounts[0].destination === '/data' &&
|
|
896
|
+
inspectionArg.mounts[0].readWrite &&
|
|
897
|
+
controlledEnvironmentEntries.length === Object.keys(expectedEnvironment).length &&
|
|
898
|
+
Object.entries(expectedEnvironment).every(([name, value]) => readEnvironment(name) === value) &&
|
|
899
|
+
hasExactServiceContainerLabels(inspectionArg.labels, expectedLabelsArg) &&
|
|
900
|
+
inspectionArg.restartPolicy === 'unless-stopped' &&
|
|
901
|
+
inspectionArg.command.length === objectStorageExpectedCommand.length &&
|
|
902
|
+
inspectionArg.command.every((entry, index) => entry === objectStorageExpectedCommand[index]) &&
|
|
903
|
+
inspectionArg.entrypoint.length === objectStorageExpectedEntrypoint.length &&
|
|
904
|
+
inspectionArg.entrypoint.every((entry, index) => entry === objectStorageExpectedEntrypoint[index]) &&
|
|
905
|
+
inspectionArg.user === 'objectstorage' &&
|
|
906
|
+
healthcheckMatches);
|
|
907
|
+
}
|
|
908
|
+
async assertNoSymlinkedObjectStoragePath(dataPathArg) {
|
|
909
|
+
const projectPath = plugins.path.resolve(process.cwd());
|
|
910
|
+
const expectedPath = getServiceDataDirectory(projectPath, 'objectstorage');
|
|
911
|
+
if (plugins.path.resolve(dataPathArg) !== expectedPath) {
|
|
912
|
+
throw new Error(`Refusing non-canonical ObjectStorage data path: ${dataPathArg}`);
|
|
913
|
+
}
|
|
914
|
+
for (const candidate of [projectPath, plugins.path.join(projectPath, '.nogit'), expectedPath]) {
|
|
915
|
+
try {
|
|
916
|
+
if ((await plugins.fs.lstat(candidate)).isSymbolicLink()) {
|
|
917
|
+
throw new Error(`Refusing symbolic-link ObjectStorage path component: ${candidate}`);
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
catch (error) {
|
|
921
|
+
if (error.code !== 'ENOENT') {
|
|
922
|
+
throw error;
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
async prepareObjectStorageDataDirectory(dockerTimeoutArg) {
|
|
928
|
+
const projectPath = plugins.path.resolve(process.cwd());
|
|
929
|
+
const dataPath = this.config.getDataDirectories().objectstorage;
|
|
930
|
+
await this.assertNoSymlinkedObjectStoragePath(dataPath);
|
|
931
|
+
const exists = await plugins.smartfs.directory(dataPath).exists();
|
|
932
|
+
const marker = await readServiceDataMarker(projectPath);
|
|
933
|
+
if (exists && !markerProvesServiceDataDirectory(marker, projectPath, 'objectstorage')) {
|
|
934
|
+
throw new Error(`Refusing existing ObjectStorage data directory with unproven ownership: ${dataPath}`);
|
|
935
|
+
}
|
|
936
|
+
if (!exists) {
|
|
937
|
+
await recordServiceDataDirectory(projectPath, 'objectstorage');
|
|
938
|
+
await this.createDataDirectory(dataPath);
|
|
939
|
+
}
|
|
940
|
+
const labels = getServiceContainerLabels({
|
|
941
|
+
projectPath,
|
|
942
|
+
service: 'objectstorage',
|
|
943
|
+
dataPath,
|
|
944
|
+
});
|
|
945
|
+
await this.docker.runFencedBindOperation({
|
|
946
|
+
image: objectStorageImage,
|
|
947
|
+
hostPath: dataPath,
|
|
948
|
+
containerPath: '/data',
|
|
949
|
+
entrypoint: '/bin/chown',
|
|
950
|
+
command: ['-R', 'objectstorage:objectstorage', '/data'],
|
|
951
|
+
labels: {
|
|
952
|
+
'git.zone.tool': serviceToolLabel,
|
|
953
|
+
'git.zone.service': 'objectstorage',
|
|
954
|
+
'git.zone.project-path': projectPath,
|
|
955
|
+
'git.zone.data-path': plugins.path.resolve(dataPath),
|
|
956
|
+
'git.zone.safe-to-prune': 'false',
|
|
957
|
+
[serviceOperationLabel]: serviceBindOperation,
|
|
958
|
+
},
|
|
959
|
+
executionOptions: dockerTimeoutArg,
|
|
960
|
+
rollbackTimeoutMs: objectStorageRollbackTimeoutMs,
|
|
961
|
+
});
|
|
962
|
+
return labels;
|
|
963
|
+
}
|
|
964
|
+
async repairObjectStorageMarkerFromOwnedContainer(dataPathArg) {
|
|
965
|
+
const projectPath = plugins.path.resolve(process.cwd());
|
|
966
|
+
await this.assertNoSymlinkedObjectStoragePath(dataPathArg);
|
|
967
|
+
if (!(await plugins.smartfs.directory(dataPathArg).exists())) {
|
|
968
|
+
throw new Error(`Refusing owned ObjectStorage container with a missing data directory: ${dataPathArg}`);
|
|
969
|
+
}
|
|
970
|
+
const marker = await readServiceDataMarker(projectPath);
|
|
971
|
+
if (!markerProvesServiceDataDirectory(marker, projectPath, 'objectstorage')) {
|
|
972
|
+
// recordServiceDataDirectory rejects an invalid/foreign marker, so only an
|
|
973
|
+
// absent or valid mergeable claim is repaired from exact container labels.
|
|
974
|
+
await recordServiceDataDirectory(projectPath, 'objectstorage');
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
async assertNoLegacyMinioResources(dockerTimeoutArg) {
|
|
978
|
+
const projectPath = plugins.path.resolve(process.cwd());
|
|
979
|
+
const containers = this.config.getContainerNames();
|
|
980
|
+
const projects = await this.globalRegistry.getAllProjects();
|
|
981
|
+
const registryEntry = Object.entries(projects).find(([registeredPath]) => plugins.path.resolve(registeredPath) === projectPath)?.[1];
|
|
982
|
+
const candidateNames = new Set([containers.legacyMinio]);
|
|
983
|
+
if (registryEntry?.legacy?.minioContainer) {
|
|
984
|
+
candidateNames.add(registryEntry.legacy.minioContainer);
|
|
985
|
+
}
|
|
986
|
+
const existingContainers = [];
|
|
987
|
+
for (const candidateName of candidateNames) {
|
|
988
|
+
if (await this.discoverContainerIdByExactName(candidateName, dockerTimeoutArg)) {
|
|
989
|
+
existingContainers.push(candidateName);
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
const legacyDataPath = getLegacyMinioDataDirectory(projectPath);
|
|
993
|
+
const legacyDataExists = await plugins.smartfs.directory(legacyDataPath).exists();
|
|
994
|
+
if (existingContainers.length === 0 && !legacyDataExists) {
|
|
995
|
+
return;
|
|
996
|
+
}
|
|
997
|
+
const evidence = [
|
|
998
|
+
...existingContainers.map((name) => `container ${name}`),
|
|
999
|
+
...(legacyDataExists ? [`data directory ${legacyDataPath}`] : []),
|
|
1000
|
+
].join(', ');
|
|
1001
|
+
throw new Error(`Legacy MinIO state blocks ObjectStorage startup: ${evidence}. ` +
|
|
1002
|
+
'GitZone will not start, stop, remove, or reuse these resources because their disk layout is not compatible with SmartStorage. ' +
|
|
1003
|
+
'Recovery: (1) export the required bucket data with your existing legacy tooling; ' +
|
|
1004
|
+
'(2) stop and rename the legacy container and move .nogit/miniodata to a preserved backup location; ' +
|
|
1005
|
+
'(3) run `gitzone services start s3`; ' +
|
|
1006
|
+
'(4) import the backup with an external S3 client and verify every required object before disposing of the legacy backup.');
|
|
1007
|
+
}
|
|
1008
|
+
/** Read-only preflight used before restart or reconfigure may stop anything. */
|
|
1009
|
+
async assertObjectStorageStartupAllowed() {
|
|
1010
|
+
this.assertObjectStorageConfigurationSafe();
|
|
1011
|
+
await this.assertNoLegacyMinioResources(() => ({ timeoutMs: 60_000 }));
|
|
1012
|
+
}
|
|
1013
|
+
assertObjectStorageConfigurationSafe() {
|
|
1014
|
+
const config = this.config.getConfig();
|
|
704
1015
|
const bucketValidationError = getS3BucketNameValidationError(config.S3_BUCKET);
|
|
705
1016
|
if (bucketValidationError) {
|
|
706
1017
|
throw new Error(`Invalid S3_BUCKET in .nogit/env.json: ${bucketValidationError}. ` +
|
|
707
1018
|
'Choose a valid custom bucket name or remove the field to regenerate the project default.');
|
|
708
1019
|
}
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
1020
|
+
this.config.assertObjectStorageCredentialsAreSafe();
|
|
1021
|
+
}
|
|
1022
|
+
async waitForObjectStorageReadiness(configArg, deadlineAtArg) {
|
|
1023
|
+
while (true) {
|
|
1024
|
+
const remaining = Math.floor(deadlineAtArg - this.objectStorageClock.now());
|
|
1025
|
+
if (remaining <= 0) {
|
|
1026
|
+
throw objectStorageStageError('management readiness', true);
|
|
1027
|
+
}
|
|
1028
|
+
const controller = new AbortController();
|
|
1029
|
+
const probeTimeoutMs = Math.max(1, Math.min(objectStorageProbeTimeoutCapMs, remaining));
|
|
1030
|
+
let probeTimedOut = false;
|
|
1031
|
+
let timer;
|
|
1032
|
+
const fetchPromise = this.fetchImplementation(`http://127.0.0.1:${configArg.S3_UI_PORT}/readyz`, { signal: controller.signal });
|
|
1033
|
+
const timeoutPromise = new Promise((_resolve, reject) => {
|
|
1034
|
+
timer = setTimeout(() => {
|
|
1035
|
+
probeTimedOut = true;
|
|
1036
|
+
controller.abort();
|
|
1037
|
+
reject(objectStorageStageError('management readiness', true));
|
|
1038
|
+
}, probeTimeoutMs);
|
|
1039
|
+
});
|
|
1040
|
+
try {
|
|
1041
|
+
const response = await Promise.race([fetchPromise, timeoutPromise]);
|
|
1042
|
+
const ready = response.ok;
|
|
1043
|
+
controller.abort();
|
|
1044
|
+
if (response.body) {
|
|
1045
|
+
void response.body.cancel().catch(() => { });
|
|
1046
|
+
}
|
|
1047
|
+
if (ready) {
|
|
1048
|
+
return;
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
catch {
|
|
1052
|
+
// Startup commonly refuses connections before the management listener binds.
|
|
1053
|
+
}
|
|
1054
|
+
finally {
|
|
1055
|
+
if (timer) {
|
|
1056
|
+
clearTimeout(timer);
|
|
1057
|
+
}
|
|
1058
|
+
controller.abort();
|
|
1059
|
+
if (probeTimedOut) {
|
|
1060
|
+
// A non-cooperative fetch may resolve after the timeout race. Consume
|
|
1061
|
+
// that late response as well so its body cannot retain a connection.
|
|
1062
|
+
void fetchPromise.then((responseArg) => {
|
|
1063
|
+
if (responseArg.body) {
|
|
1064
|
+
void responseArg.body.cancel().catch(() => { });
|
|
1065
|
+
}
|
|
1066
|
+
}, () => { });
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
const afterProbe = Math.floor(deadlineAtArg - this.objectStorageClock.now());
|
|
1070
|
+
if (afterProbe <= 0) {
|
|
1071
|
+
throw objectStorageStageError('management readiness', true);
|
|
1072
|
+
}
|
|
1073
|
+
await this.objectStorageClock.delay(Math.min(objectStorageProbeIntervalMs, afterProbe));
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
async createObjectStorageContainer(labelsArg, dockerTimeoutArg) {
|
|
1077
|
+
const config = this.config.getConfig();
|
|
1078
|
+
const containers = this.config.getContainerNames();
|
|
1079
|
+
const directories = this.config.getDataDirectories();
|
|
1080
|
+
const creationResult = await this.docker.createArgv({
|
|
1081
|
+
name: containers.objectstorage,
|
|
1082
|
+
image: objectStorageImage,
|
|
1083
|
+
ports: {
|
|
1084
|
+
[`127.0.0.1:${config.S3_PORT}`]: '9000',
|
|
1085
|
+
[`127.0.0.1:${config.S3_UI_PORT}`]: '3000',
|
|
1086
|
+
},
|
|
1087
|
+
volumes: { [directories.objectstorage]: '/data' },
|
|
1088
|
+
environment: {
|
|
1089
|
+
OBJST_PORT: '9000',
|
|
1090
|
+
UI_PORT: '3000',
|
|
1091
|
+
OBJST_STORAGE_DIR: '/data',
|
|
1092
|
+
OBJST_ACCESS_KEY: config.S3_ACCESSKEY,
|
|
1093
|
+
OBJST_SECRET_KEY: config.S3_SECRETKEY,
|
|
1094
|
+
OBJST_ADMIN_PASSWORD: config.S3_ADMIN_PASSWORD,
|
|
1095
|
+
OBJST_REGION: config.S3_REGION,
|
|
1096
|
+
},
|
|
1097
|
+
labels: labelsArg,
|
|
1098
|
+
restart: 'unless-stopped',
|
|
1099
|
+
}, dockerTimeoutArg());
|
|
1100
|
+
const containerId = creationResult.stdout.trim();
|
|
1101
|
+
if (!/^[a-f0-9]{64}$/u.test(containerId)) {
|
|
1102
|
+
throw new Error(`Docker returned an invalid id while creating ${containers.objectstorage}.`);
|
|
1103
|
+
}
|
|
1104
|
+
const inspection = await this.revalidateObjectStorageContainer(containerId, containers.objectstorage, labelsArg, dockerTimeoutArg);
|
|
1105
|
+
if (inspection.running || inspection.status !== 'created') {
|
|
1106
|
+
throw new Error(`ObjectStorage container ${containers.objectstorage} was not created stopped.`);
|
|
1107
|
+
}
|
|
1108
|
+
if (!this.objectStorageConfigurationMatches(inspection, labelsArg)) {
|
|
1109
|
+
throw new Error(`ObjectStorage container ${containers.objectstorage} does not match the required runtime configuration.`);
|
|
1110
|
+
}
|
|
1111
|
+
return inspection;
|
|
1112
|
+
}
|
|
1113
|
+
/** Start or reconcile the canonical ObjectStorage service. */
|
|
1114
|
+
async startObjectStorage() {
|
|
1115
|
+
await withServiceDataOperationLock(process.cwd(), 'objectstorage', () => this.startObjectStorageLocked());
|
|
1116
|
+
}
|
|
1117
|
+
async startObjectStorageLocked() {
|
|
1118
|
+
await this.config.reloadFromDisk();
|
|
1119
|
+
await this.assertNoPendingDataDeletion('objectstorage');
|
|
1120
|
+
await this.globalRegistry.touchProject(process.cwd());
|
|
1121
|
+
logger.log('note', '📦 S3/ObjectStorage:');
|
|
1122
|
+
const config = this.config.getConfig();
|
|
1123
|
+
const containers = this.config.getContainerNames();
|
|
1124
|
+
const directories = this.config.getDataDirectories();
|
|
1125
|
+
this.assertObjectStorageConfigurationSafe();
|
|
1126
|
+
const deadlineAt = this.objectStorageClock.now() + objectStorageReconciliationTimeoutMs;
|
|
712
1127
|
const dockerTimeout = () => {
|
|
713
|
-
const remaining = Math.floor(deadlineAt - this.
|
|
1128
|
+
const remaining = Math.floor(deadlineAt - this.objectStorageClock.now());
|
|
714
1129
|
if (remaining <= 0) {
|
|
715
|
-
throw
|
|
1130
|
+
throw objectStorageStageError('container setup', true);
|
|
716
1131
|
}
|
|
717
1132
|
return { timeoutMs: Math.max(1, remaining) };
|
|
718
1133
|
};
|
|
1134
|
+
const expectedLabels = getServiceContainerLabels({
|
|
1135
|
+
projectPath: process.cwd(),
|
|
1136
|
+
service: 'objectstorage',
|
|
1137
|
+
dataPath: directories.objectstorage,
|
|
1138
|
+
});
|
|
719
1139
|
const startedContainerIds = [];
|
|
720
|
-
const startById = async (containerIdArg) => {
|
|
1140
|
+
const startById = async (containerIdArg, ownedByInvocationArg) => {
|
|
721
1141
|
const executionOptions = dockerTimeout();
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
1142
|
+
if (ownedByInvocationArg) {
|
|
1143
|
+
startedContainerIds.push(containerIdArg);
|
|
1144
|
+
}
|
|
725
1145
|
await this.docker.execArgv(['start', containerIdArg], executionOptions);
|
|
1146
|
+
if (!ownedByInvocationArg) {
|
|
1147
|
+
startedContainerIds.push(containerIdArg);
|
|
1148
|
+
}
|
|
726
1149
|
};
|
|
727
1150
|
let outcome;
|
|
728
1151
|
try {
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
'ls',
|
|
732
|
-
'-a',
|
|
733
|
-
'--filter',
|
|
734
|
-
`name=${containers.minio}`,
|
|
735
|
-
'--format',
|
|
736
|
-
'{{.Names}}',
|
|
737
|
-
], dockerTimeout());
|
|
738
|
-
const containerExists = listResult.stdout
|
|
739
|
-
.split(/\r?\n/u)
|
|
740
|
-
.map((lineArg) => lineArg.trim())
|
|
741
|
-
.includes(containers.minio);
|
|
1152
|
+
await this.assertNoLegacyMinioResources(dockerTimeout);
|
|
1153
|
+
const existingId = await this.discoverContainerIdByExactName(containers.objectstorage, dockerTimeout);
|
|
742
1154
|
let initialInspection;
|
|
743
|
-
if (
|
|
744
|
-
initialInspection = await this.
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
await this.assertMinioOwnership(initialInspection, minioLabels, true);
|
|
1155
|
+
if (existingId) {
|
|
1156
|
+
initialInspection = await this.inspectObjectStorageContainer(existingId, containers.objectstorage, dockerTimeout);
|
|
1157
|
+
this.assertObjectStorageOwnership(initialInspection, expectedLabels);
|
|
1158
|
+
await this.repairObjectStorageMarkerFromOwnedContainer(directories.objectstorage);
|
|
748
1159
|
}
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
if (initialInspection) {
|
|
752
|
-
const apiMatches = minioPortMatches(initialInspection.portBindings, '9000/tcp', config.S3_PORT);
|
|
753
|
-
const consoleMatches = minioPortMatches(initialInspection.portBindings, '9001/tcp', config.S3_CONSOLE_PORT);
|
|
754
|
-
const readExactEnvironmentValue = (nameArg) => {
|
|
755
|
-
const prefix = `${nameArg}=`;
|
|
756
|
-
const matches = initialInspection.environmentEntries.filter((entryArg) => entryArg.startsWith(prefix));
|
|
757
|
-
return matches.length === 1 ? matches[0].slice(prefix.length) : undefined;
|
|
758
|
-
};
|
|
759
|
-
credentialsChanged =
|
|
760
|
-
readExactEnvironmentValue('MINIO_ROOT_USER') !== config.S3_ACCESSKEY ||
|
|
761
|
-
readExactEnvironmentValue('MINIO_ROOT_PASSWORD') !== config.S3_SECRETKEY;
|
|
762
|
-
needsRecreate = !apiMatches || !consoleMatches || credentialsChanged;
|
|
1160
|
+
else {
|
|
1161
|
+
await this.config.validateObjectStoragePorts();
|
|
763
1162
|
}
|
|
1163
|
+
const needsRecreate = !!initialInspection &&
|
|
1164
|
+
!this.objectStorageConfigurationMatches(initialInspection, expectedLabels);
|
|
764
1165
|
let activeInspection;
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
1166
|
+
if (!initialInspection || needsRecreate) {
|
|
1167
|
+
const labels = await this.prepareObjectStorageDataDirectory(dockerTimeout);
|
|
1168
|
+
if (initialInspection) {
|
|
1169
|
+
logger.log('note', ' Runtime configuration changed, recreating container...');
|
|
1170
|
+
await this.revalidateObjectStorageContainer(initialInspection.id, containers.objectstorage, expectedLabels, dockerTimeout);
|
|
1171
|
+
await this.docker.execArgv(['rm', '-f', initialInspection.id], dockerTimeout());
|
|
1172
|
+
}
|
|
1173
|
+
else {
|
|
1174
|
+
logger.log('note', ' Creating container...');
|
|
1175
|
+
}
|
|
1176
|
+
activeInspection = await this.createObjectStorageContainer(labels, dockerTimeout);
|
|
1177
|
+
await startById(activeInspection.id, true);
|
|
1178
|
+
outcome = initialInspection
|
|
1179
|
+
? 'Recreated with canonical configuration and reconciled'
|
|
1180
|
+
: 'Created, started, and reconciled';
|
|
776
1181
|
}
|
|
777
|
-
else if (
|
|
1182
|
+
else if (!initialInspection.running) {
|
|
778
1183
|
logger.log('note', ' Starting existing container...');
|
|
779
1184
|
activeInspection = initialInspection;
|
|
780
|
-
|
|
781
|
-
await startById(activeInspection.id);
|
|
1185
|
+
await startById(activeInspection.id, false);
|
|
782
1186
|
outcome = 'Started and reconciled';
|
|
783
1187
|
}
|
|
784
|
-
else if (!initialInspection) {
|
|
785
|
-
logger.log('note', ' Creating container...');
|
|
786
|
-
activeInspection = await this.createMinioContainer(minioLabels, dockerTimeout);
|
|
787
|
-
activeAllowsLegacyRegistry = false;
|
|
788
|
-
await startById(activeInspection.id);
|
|
789
|
-
outcome = 'Created, started, and reconciled';
|
|
790
|
-
}
|
|
791
1188
|
else {
|
|
792
1189
|
logger.log('note', ' Already running; reconciling bucket...');
|
|
793
1190
|
activeInspection = initialInspection;
|
|
794
|
-
activeAllowsLegacyRegistry = true;
|
|
795
1191
|
outcome = 'Already running and reconciled';
|
|
796
1192
|
}
|
|
797
|
-
|
|
798
|
-
await
|
|
799
|
-
|
|
800
|
-
|
|
1193
|
+
await this.revalidateObjectStorageContainer(activeInspection.id, containers.objectstorage, expectedLabels, dockerTimeout);
|
|
1194
|
+
await this.waitForObjectStorageReadiness(config, deadlineAt);
|
|
1195
|
+
await reconcileObjectStorageBucket({
|
|
1196
|
+
smartBucket: this.smartBucketFactory(config),
|
|
801
1197
|
bucket: config.S3_BUCKET,
|
|
802
1198
|
deadlineAt,
|
|
803
|
-
clock: this.
|
|
1199
|
+
clock: this.objectStorageClock,
|
|
804
1200
|
});
|
|
1201
|
+
const finalInspection = await this.revalidateObjectStorageContainer(activeInspection.id, containers.objectstorage, expectedLabels, dockerTimeout);
|
|
1202
|
+
if (!finalInspection.running) {
|
|
1203
|
+
throw new Error(`ObjectStorage container ${containers.objectstorage} stopped during reconciliation.`);
|
|
1204
|
+
}
|
|
805
1205
|
}
|
|
806
1206
|
catch (error) {
|
|
807
|
-
const originalError =
|
|
1207
|
+
const originalError = normalizeObjectStorageLifecycleError(error);
|
|
808
1208
|
const rollbackErrors = [];
|
|
809
1209
|
for (let index = startedContainerIds.length - 1; index >= 0; index--) {
|
|
810
1210
|
try {
|
|
811
|
-
await this.
|
|
812
|
-
|
|
813
|
-
|
|
1211
|
+
const rollbackInspection = await this.revalidateObjectStorageContainer(startedContainerIds[index], containers.objectstorage, expectedLabels, () => ({ timeoutMs: objectStorageRollbackTimeoutMs }));
|
|
1212
|
+
if (rollbackInspection.running) {
|
|
1213
|
+
await this.docker.execArgv(['stop', startedContainerIds[index]], {
|
|
1214
|
+
timeoutMs: objectStorageRollbackTimeoutMs,
|
|
1215
|
+
});
|
|
1216
|
+
}
|
|
814
1217
|
}
|
|
815
1218
|
catch (rollbackError) {
|
|
816
|
-
rollbackErrors.push(
|
|
1219
|
+
rollbackErrors.push(normalizeObjectStorageLifecycleError(rollbackError));
|
|
817
1220
|
}
|
|
818
1221
|
}
|
|
819
1222
|
if (rollbackErrors.length > 0) {
|
|
820
|
-
throw new AggregateError([originalError, ...rollbackErrors], '
|
|
1223
|
+
throw new AggregateError([originalError, ...rollbackErrors], 'ObjectStorage startup failed and rollback could not stop every container started by this invocation.');
|
|
821
1224
|
}
|
|
822
1225
|
throw originalError;
|
|
823
1226
|
}
|
|
824
1227
|
logger.log('ok', ` ${outcome} ✓`);
|
|
825
1228
|
logger.log('ok', ` Bucket '${config.S3_BUCKET}' exists and is authenticated ✓`);
|
|
826
|
-
logger.log('info', ` Container: ${containers.
|
|
827
|
-
logger.log('info', `
|
|
1229
|
+
logger.log('info', ` Container: ${containers.objectstorage}`);
|
|
1230
|
+
logger.log('info', ` S3 API: http://127.0.0.1:${config.S3_PORT}`);
|
|
828
1231
|
logger.log('info', ` Bucket: ${config.S3_BUCKET}`);
|
|
829
|
-
logger.log('info', `
|
|
830
|
-
logger.log('info', ` Console: http://${config.S3_HOST}:${config.S3_CONSOLE_PORT} (credentials: ***)`);
|
|
831
|
-
}
|
|
832
|
-
/** Create stopped MinIO, inspect its id, and prove exact current labels. */
|
|
833
|
-
async createMinioContainer(labelsArg, dockerTimeoutArg) {
|
|
834
|
-
const config = this.config.getConfig();
|
|
835
|
-
const containers = this.config.getContainerNames();
|
|
836
|
-
const directories = this.config.getDataDirectories();
|
|
837
|
-
const creationResult = await this.docker.createArgv({
|
|
838
|
-
name: containers.minio,
|
|
839
|
-
image: 'minio/minio',
|
|
840
|
-
ports: {
|
|
841
|
-
[config.S3_PORT]: '9000',
|
|
842
|
-
[config.S3_CONSOLE_PORT]: '9001',
|
|
843
|
-
},
|
|
844
|
-
volumes: {
|
|
845
|
-
[directories.minio]: '/data',
|
|
846
|
-
},
|
|
847
|
-
environment: {
|
|
848
|
-
MINIO_ROOT_USER: config.S3_ACCESSKEY,
|
|
849
|
-
MINIO_ROOT_PASSWORD: config.S3_SECRETKEY,
|
|
850
|
-
},
|
|
851
|
-
labels: labelsArg,
|
|
852
|
-
restart: 'unless-stopped',
|
|
853
|
-
command: ['server', '/data', '--console-address', ':9001'],
|
|
854
|
-
}, dockerTimeoutArg());
|
|
855
|
-
const containerId = creationResult.stdout.trim();
|
|
856
|
-
if (!/^[a-f0-9]{64}$/u.test(containerId)) {
|
|
857
|
-
throw new Error(`Docker returned an invalid id while creating ${containers.minio}.`);
|
|
858
|
-
}
|
|
859
|
-
const inspection = await this.inspectMinioContainer(containerId, containers.minio, dockerTimeoutArg);
|
|
860
|
-
if (inspection.id !== containerId) {
|
|
861
|
-
throw new Error(`Refusing to start MinIO container ${containers.minio}: ` +
|
|
862
|
-
'Docker inspection did not return the created immutable id.');
|
|
863
|
-
}
|
|
864
|
-
await this.assertMinioOwnership(inspection, labelsArg, false);
|
|
865
|
-
return inspection;
|
|
1232
|
+
logger.log('info', ` Management UI: http://127.0.0.1:${config.S3_UI_PORT}`);
|
|
866
1233
|
}
|
|
867
1234
|
/**
|
|
868
1235
|
* Start Elasticsearch service
|
|
869
1236
|
*/
|
|
870
1237
|
async startElasticsearch() {
|
|
1238
|
+
await withServiceDataOperationLock(process.cwd(), 'elasticsearch', () => this.startElasticsearchLocked());
|
|
1239
|
+
}
|
|
1240
|
+
async startElasticsearchLocked() {
|
|
1241
|
+
await this.config.reloadFromDisk();
|
|
1242
|
+
await this.assertNoPendingDataDeletion('elasticsearch');
|
|
1243
|
+
await this.globalRegistry.touchProject(process.cwd());
|
|
871
1244
|
logger.log('note', '📦 Elasticsearch:');
|
|
872
1245
|
const config = this.config.getConfig();
|
|
873
1246
|
const containers = this.config.getContainerNames();
|
|
@@ -959,6 +1332,10 @@ export class ServiceManager {
|
|
|
959
1332
|
* Stop MongoDB service
|
|
960
1333
|
*/
|
|
961
1334
|
async stopMongoDB() {
|
|
1335
|
+
await withServiceDataOperationLock(process.cwd(), 'mongodb', () => this.stopMongoDBLocked());
|
|
1336
|
+
}
|
|
1337
|
+
async stopMongoDBLocked() {
|
|
1338
|
+
await this.config.reloadFromDisk();
|
|
962
1339
|
logger.log('note', '📦 MongoDB:');
|
|
963
1340
|
const containers = this.config.getContainerNames();
|
|
964
1341
|
const status = await this.docker.getStatus(containers.mongo);
|
|
@@ -974,29 +1351,42 @@ export class ServiceManager {
|
|
|
974
1351
|
logger.log('note', ' Not running');
|
|
975
1352
|
}
|
|
976
1353
|
}
|
|
977
|
-
/**
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
1354
|
+
/** Stop only an exactly owned canonical ObjectStorage container. */
|
|
1355
|
+
async stopObjectStorage() {
|
|
1356
|
+
await withServiceDataOperationLock(process.cwd(), 'objectstorage', () => this.stopObjectStorageLocked());
|
|
1357
|
+
}
|
|
1358
|
+
async stopObjectStorageLocked() {
|
|
1359
|
+
await this.config.reloadFromDisk();
|
|
1360
|
+
logger.log('note', '📦 S3/ObjectStorage:');
|
|
982
1361
|
const containers = this.config.getContainerNames();
|
|
983
|
-
const
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
1362
|
+
const directories = this.config.getDataDirectories();
|
|
1363
|
+
const labels = getServiceContainerLabels({
|
|
1364
|
+
projectPath: process.cwd(),
|
|
1365
|
+
service: 'objectstorage',
|
|
1366
|
+
dataPath: directories.objectstorage,
|
|
1367
|
+
});
|
|
1368
|
+
const timeout = () => ({ timeoutMs: 60_000 });
|
|
1369
|
+
const id = await this.discoverContainerIdByExactName(containers.objectstorage, timeout);
|
|
1370
|
+
if (!id) {
|
|
1371
|
+
logger.log('note', ' Not running');
|
|
1372
|
+
return;
|
|
991
1373
|
}
|
|
992
|
-
|
|
1374
|
+
const inspection = await this.revalidateObjectStorageContainer(id, containers.objectstorage, labels, timeout);
|
|
1375
|
+
if (!inspection.running) {
|
|
993
1376
|
logger.log('note', ' Not running');
|
|
1377
|
+
return;
|
|
994
1378
|
}
|
|
1379
|
+
await this.docker.execArgv(['stop', inspection.id], timeout());
|
|
1380
|
+
logger.log('ok', ' Stopped ✓');
|
|
995
1381
|
}
|
|
996
1382
|
/**
|
|
997
1383
|
* Stop Elasticsearch service
|
|
998
1384
|
*/
|
|
999
1385
|
async stopElasticsearch() {
|
|
1386
|
+
await withServiceDataOperationLock(process.cwd(), 'elasticsearch', () => this.stopElasticsearchLocked());
|
|
1387
|
+
}
|
|
1388
|
+
async stopElasticsearchLocked() {
|
|
1389
|
+
await this.config.reloadFromDisk();
|
|
1000
1390
|
logger.log('note', '📦 Elasticsearch:');
|
|
1001
1391
|
const containers = this.config.getContainerNames();
|
|
1002
1392
|
const status = await this.docker.getStatus(containers.elasticsearch);
|
|
@@ -1041,16 +1431,62 @@ export class ServiceManager {
|
|
|
1041
1431
|
const mongo = await describe('mongodb', containers.mongo, directories.mongo, config.MONGODB_PORT, this.config.getMongoConnectionString());
|
|
1042
1432
|
mongo.authEnabled = this.config.isMongoAuthEnabled();
|
|
1043
1433
|
mongo.authSource = this.config.getMongoAuthSource();
|
|
1044
|
-
const
|
|
1434
|
+
const objectStorageDataExists = await plugins.smartfs.directory(directories.objectstorage).exists();
|
|
1435
|
+
const objectStorageLabels = getServiceContainerLabels({
|
|
1436
|
+
projectPath: process.cwd(),
|
|
1437
|
+
service: 'objectstorage',
|
|
1438
|
+
dataPath: directories.objectstorage,
|
|
1439
|
+
});
|
|
1440
|
+
const objectStorageId = await this.discoverContainerIdByExactName(containers.objectstorage, () => ({ timeoutMs: 60_000 }));
|
|
1441
|
+
let objectStorageStatus = 'not_exists';
|
|
1442
|
+
let objectStorageOwnership = 'absent';
|
|
1443
|
+
if (objectStorageId) {
|
|
1444
|
+
const inspection = await this.inspectObjectStorageIdentity(objectStorageId, containers.objectstorage, () => ({ timeoutMs: 60_000 }));
|
|
1445
|
+
objectStorageStatus = inspection.running ? 'running' : 'stopped';
|
|
1446
|
+
objectStorageOwnership = hasExactServiceContainerLabels(inspection.labels, objectStorageLabels)
|
|
1447
|
+
? 'owned'
|
|
1448
|
+
: 'conflict';
|
|
1449
|
+
}
|
|
1450
|
+
const objectstorage = {
|
|
1451
|
+
service: 'objectstorage',
|
|
1452
|
+
enabled: this.isServiceEnabled('objectstorage'),
|
|
1453
|
+
container: containers.objectstorage,
|
|
1454
|
+
status: objectStorageStatus,
|
|
1455
|
+
port: config.S3_PORT,
|
|
1456
|
+
connectionString: `http://127.0.0.1:${config.S3_PORT}`,
|
|
1457
|
+
managementUi: `http://127.0.0.1:${config.S3_UI_PORT}`,
|
|
1458
|
+
dataDirectory: directories.objectstorage,
|
|
1459
|
+
dataSizeBytes: objectStorageDataExists
|
|
1460
|
+
? await helpers.getDirectorySize(directories.objectstorage)
|
|
1461
|
+
: 0,
|
|
1462
|
+
portAvailable: objectStorageStatus === 'not_exists'
|
|
1463
|
+
? await helpers.isPortAvailable(parseInt(config.S3_PORT))
|
|
1464
|
+
: null,
|
|
1465
|
+
ownership: objectStorageOwnership,
|
|
1466
|
+
};
|
|
1045
1467
|
const elasticsearch = await describe('elasticsearch', containers.elasticsearch, directories.elasticsearch, config.ELASTICSEARCH_PORT, config.ELASTICSEARCH_URL);
|
|
1468
|
+
const projectPath = plugins.path.resolve(process.cwd());
|
|
1469
|
+
const registryProjects = await this.globalRegistry.getAllProjects();
|
|
1470
|
+
const registryProject = Object.entries(registryProjects).find(([registeredPath]) => plugins.path.resolve(registeredPath) === projectPath)?.[1];
|
|
1471
|
+
const legacyDataDirectory = getLegacyMinioDataDirectory(projectPath);
|
|
1472
|
+
const legacyContainerExists = await this.discoverContainerIdByExactName(containers.legacyMinio, () => ({ timeoutMs: 60_000 }));
|
|
1046
1473
|
return {
|
|
1047
1474
|
project: {
|
|
1048
1475
|
name: config.PROJECT_NAME,
|
|
1049
1476
|
path: process.cwd(),
|
|
1050
1477
|
enabledServices: this.enabledServices || [],
|
|
1051
1478
|
},
|
|
1052
|
-
services: { mongodb: mongo,
|
|
1053
|
-
|
|
1479
|
+
services: { mongodb: mongo, objectstorage, elasticsearch },
|
|
1480
|
+
legacy: {
|
|
1481
|
+
...(registryProject?.legacy?.minioContainer
|
|
1482
|
+
? { minioContainer: registryProject.legacy.minioContainer }
|
|
1483
|
+
: legacyContainerExists
|
|
1484
|
+
? { minioContainer: containers.legacyMinio }
|
|
1485
|
+
: {}),
|
|
1486
|
+
minioDataDirectory: legacyDataDirectory,
|
|
1487
|
+
minioDataExists: await plugins.smartfs.directory(legacyDataDirectory).exists(),
|
|
1488
|
+
},
|
|
1489
|
+
totalDataBytes: mongo.dataSizeBytes + objectstorage.dataSizeBytes + elasticsearch.dataSizeBytes,
|
|
1054
1490
|
};
|
|
1055
1491
|
}
|
|
1056
1492
|
/**
|
|
@@ -1060,6 +1496,7 @@ export class ServiceManager {
|
|
|
1060
1496
|
helpers.printHeader('Service Status');
|
|
1061
1497
|
const config = this.config.getConfig();
|
|
1062
1498
|
const containers = this.config.getContainerNames();
|
|
1499
|
+
const structuredStatus = await this.collectStatus();
|
|
1063
1500
|
logger.log('info', `Project: ${config.PROJECT_NAME}`);
|
|
1064
1501
|
console.log();
|
|
1065
1502
|
// MongoDB status
|
|
@@ -1096,48 +1533,56 @@ export class ServiceManager {
|
|
|
1096
1533
|
}
|
|
1097
1534
|
break;
|
|
1098
1535
|
}
|
|
1099
|
-
//
|
|
1100
|
-
const
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1536
|
+
// ObjectStorage status
|
|
1537
|
+
const objectstorage = structuredStatus.services.objectstorage;
|
|
1538
|
+
if (objectstorage.ownership === 'conflict') {
|
|
1539
|
+
logger.log('error', `📦 S3/ObjectStorage: ownership conflict for ${objectstorage.container}; refusing to treat it as managed`);
|
|
1540
|
+
}
|
|
1541
|
+
else
|
|
1542
|
+
switch (objectstorage.status) {
|
|
1543
|
+
case 'running':
|
|
1544
|
+
logger.log('ok', '📦 S3/ObjectStorage: 🟢 Running');
|
|
1545
|
+
logger.log('info', ` ├─ Container: ${containers.objectstorage}`);
|
|
1546
|
+
logger.log('info', ` ├─ API: http://127.0.0.1:${config.S3_PORT}`);
|
|
1547
|
+
logger.log('info', ` ├─ Management UI: http://127.0.0.1:${config.S3_UI_PORT}`);
|
|
1548
|
+
logger.log('info', ` └─ Bucket: ${config.S3_BUCKET}`);
|
|
1549
|
+
break;
|
|
1550
|
+
case 'stopped':
|
|
1551
|
+
logger.log('note', '📦 S3/ObjectStorage: 🟡 Stopped');
|
|
1552
|
+
logger.log('info', ` ├─ Container: ${containers.objectstorage}`);
|
|
1553
|
+
logger.log('info', ` ├─ API Port: ${config.S3_PORT}`);
|
|
1554
|
+
logger.log('info', ` └─ Management UI Port: ${config.S3_UI_PORT}`);
|
|
1555
|
+
break;
|
|
1556
|
+
case 'not_exists':
|
|
1557
|
+
logger.log('info', '📦 S3/ObjectStorage: ⚪ Not installed');
|
|
1558
|
+
// Check port availability
|
|
1559
|
+
const s3Port = parseInt(config.S3_PORT);
|
|
1560
|
+
const s3UiPort = parseInt(config.S3_UI_PORT);
|
|
1561
|
+
const s3Available = await helpers.isPortAvailable(s3Port);
|
|
1562
|
+
const uiAvailable = await helpers.isPortAvailable(s3UiPort);
|
|
1563
|
+
if (!s3Available || !uiAvailable) {
|
|
1564
|
+
if (!s3Available) {
|
|
1565
|
+
logger.log('error', ` ├─ ⚠️ API Port ${s3Port} is in use`);
|
|
1566
|
+
}
|
|
1567
|
+
else {
|
|
1568
|
+
logger.log('info', ` ├─ API Port ${s3Port} is available`);
|
|
1569
|
+
}
|
|
1570
|
+
if (!uiAvailable) {
|
|
1571
|
+
logger.log('error', ` └─ ⚠️ Management UI Port ${s3UiPort} is in use`);
|
|
1572
|
+
}
|
|
1573
|
+
else {
|
|
1574
|
+
logger.log('info', ` └─ Management UI Port ${s3UiPort} is available`);
|
|
1575
|
+
}
|
|
1125
1576
|
}
|
|
1126
1577
|
else {
|
|
1127
1578
|
logger.log('info', ` ├─ API Port ${s3Port} is available`);
|
|
1579
|
+
logger.log('info', ` └─ Management UI Port ${s3UiPort} is available`);
|
|
1128
1580
|
}
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
}
|
|
1135
|
-
}
|
|
1136
|
-
else {
|
|
1137
|
-
logger.log('info', ` ├─ API Port ${s3Port} is available`);
|
|
1138
|
-
logger.log('info', ` └─ Console Port ${s3ConsolePort} is available`);
|
|
1139
|
-
}
|
|
1140
|
-
break;
|
|
1581
|
+
break;
|
|
1582
|
+
}
|
|
1583
|
+
if (structuredStatus.legacy.minioContainer ||
|
|
1584
|
+
structuredStatus.legacy.minioDataExists) {
|
|
1585
|
+
logger.log('note', ' Legacy MinIO resources are preserved and block automatic ObjectStorage startup; run `gitzone services start s3` for exact migration instructions.');
|
|
1141
1586
|
}
|
|
1142
1587
|
// Elasticsearch status
|
|
1143
1588
|
const esStatus = await this.docker.getStatus(containers.elasticsearch);
|
|
@@ -1179,7 +1624,7 @@ export class ServiceManager {
|
|
|
1179
1624
|
const directories = this.config.getDataDirectories();
|
|
1180
1625
|
const entries = [
|
|
1181
1626
|
{ label: 'MongoDB', path: directories.mongo },
|
|
1182
|
-
{ label: 'S3/
|
|
1627
|
+
{ label: 'S3/ObjectStorage', path: directories.objectstorage },
|
|
1183
1628
|
{ label: 'Elasticsearch', path: directories.elasticsearch },
|
|
1184
1629
|
];
|
|
1185
1630
|
console.log();
|
|
@@ -1193,11 +1638,20 @@ export class ServiceManager {
|
|
|
1193
1638
|
total += size;
|
|
1194
1639
|
logger.log('info', ` ${entry.label}: ${helpers.formatBytes(size)} (${entry.path})`);
|
|
1195
1640
|
}
|
|
1641
|
+
const legacyDataPath = getLegacyMinioDataDirectory(process.cwd());
|
|
1642
|
+
const legacyDataExists = await plugins.smartfs.directory(legacyDataPath).exists();
|
|
1196
1643
|
if (total === 0) {
|
|
1197
|
-
logger.log('info', ' No service data directories present');
|
|
1644
|
+
logger.log('info', ' No canonical service data directories present');
|
|
1645
|
+
}
|
|
1646
|
+
else {
|
|
1647
|
+
logger.log('info', ` Total: ${helpers.formatBytes(total)}`);
|
|
1648
|
+
}
|
|
1649
|
+
if (legacyDataExists) {
|
|
1650
|
+
logger.log('note', ` Legacy MinIO data is preserved and excluded from cleanup: ${legacyDataPath}`);
|
|
1651
|
+
}
|
|
1652
|
+
if (total === 0 && !legacyDataExists) {
|
|
1198
1653
|
return;
|
|
1199
1654
|
}
|
|
1200
|
-
logger.log('info', ` Total: ${helpers.formatBytes(total)}`);
|
|
1201
1655
|
logger.log('note', ' Remove containers but keep data: `gitzone services remove`; remove data too: `gitzone services clean`');
|
|
1202
1656
|
}
|
|
1203
1657
|
/**
|
|
@@ -1217,18 +1671,20 @@ export class ServiceManager {
|
|
|
1217
1671
|
logger.log('info', ` Data: ${this.config.getDataDirectories().mongo}`);
|
|
1218
1672
|
logger.log('info', ` Connection: ${this.config.getMongoConnectionString()}`);
|
|
1219
1673
|
console.log();
|
|
1220
|
-
logger.log('note', 'S3/
|
|
1674
|
+
logger.log('note', 'S3/ObjectStorage:');
|
|
1221
1675
|
logger.log('info', ` Host: ${config.S3_HOST}`);
|
|
1222
1676
|
logger.log('info', ` API Port: ${config.S3_PORT}`);
|
|
1223
|
-
logger.log('info', `
|
|
1677
|
+
logger.log('info', ` Management UI Port: ${config.S3_UI_PORT}`);
|
|
1224
1678
|
logger.log('info', ' Access Key: ***');
|
|
1225
1679
|
logger.log('info', ' Secret Key: ***');
|
|
1680
|
+
logger.log('info', ' Admin Password: ***');
|
|
1226
1681
|
logger.log('info', ` Bucket: ${config.S3_BUCKET}`);
|
|
1227
1682
|
logger.log('info', ` Use SSL: ${config.S3_USESSL}`);
|
|
1228
|
-
logger.log('info', `
|
|
1229
|
-
logger.log('info', `
|
|
1683
|
+
logger.log('info', ` Region: ${config.S3_REGION}`);
|
|
1684
|
+
logger.log('info', ` Container: ${this.config.getContainerNames().objectstorage}`);
|
|
1685
|
+
logger.log('info', ` Data: ${this.config.getDataDirectories().objectstorage}`);
|
|
1230
1686
|
logger.log('info', ` Endpoint: ${config.S3_ENDPOINT}`);
|
|
1231
|
-
logger.log('info', `
|
|
1687
|
+
logger.log('info', ` Management UI: http://127.0.0.1:${config.S3_UI_PORT}`);
|
|
1232
1688
|
console.log();
|
|
1233
1689
|
logger.log('note', 'Elasticsearch:');
|
|
1234
1690
|
logger.log('info', ` Host: ${config.ELASTICSEARCH_HOST}:${config.ELASTICSEARCH_PORT}`);
|
|
@@ -1278,15 +1734,35 @@ export class ServiceManager {
|
|
|
1278
1734
|
logger.log('note', 'MongoDB container is not running');
|
|
1279
1735
|
}
|
|
1280
1736
|
break;
|
|
1281
|
-
case '
|
|
1737
|
+
case 'objectstorage':
|
|
1282
1738
|
case 's3':
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
const
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1739
|
+
{
|
|
1740
|
+
const directories = this.config.getDataDirectories();
|
|
1741
|
+
const labels = getServiceContainerLabels({
|
|
1742
|
+
projectPath: process.cwd(),
|
|
1743
|
+
service: 'objectstorage',
|
|
1744
|
+
dataPath: directories.objectstorage,
|
|
1745
|
+
});
|
|
1746
|
+
const timeout = () => ({ timeoutMs: 60_000 });
|
|
1747
|
+
const id = await this.discoverContainerIdByExactName(containers.objectstorage, timeout);
|
|
1748
|
+
if (!id) {
|
|
1749
|
+
logger.log('note', 'S3/ObjectStorage container does not exist');
|
|
1750
|
+
break;
|
|
1751
|
+
}
|
|
1752
|
+
await this.revalidateObjectStorageContainer(id, containers.objectstorage, labels, timeout);
|
|
1753
|
+
helpers.printHeader(`S3/ObjectStorage Logs (last ${lines} lines)`);
|
|
1754
|
+
const result = await this.docker.execArgv(['logs', '--tail', String(lines), id], timeout());
|
|
1755
|
+
const config = this.config.getConfig();
|
|
1756
|
+
let output = `${result.stdout}${result.stderr}`;
|
|
1757
|
+
const secrets = Array.from(new Set([
|
|
1758
|
+
config.S3_ACCESSKEY,
|
|
1759
|
+
config.S3_SECRETKEY,
|
|
1760
|
+
config.S3_ADMIN_PASSWORD,
|
|
1761
|
+
].filter(Boolean))).sort((secretA, secretB) => secretB.length - secretA.length);
|
|
1762
|
+
for (const secret of secrets) {
|
|
1763
|
+
output = output.split(secret).join('***');
|
|
1764
|
+
}
|
|
1765
|
+
console.log(output);
|
|
1290
1766
|
}
|
|
1291
1767
|
break;
|
|
1292
1768
|
case 'elasticsearch':
|
|
@@ -1304,7 +1780,7 @@ export class ServiceManager {
|
|
|
1304
1780
|
case '':
|
|
1305
1781
|
await this.showLogs('mongo', lines);
|
|
1306
1782
|
console.log();
|
|
1307
|
-
await this.showLogs('
|
|
1783
|
+
await this.showLogs('objectstorage', lines);
|
|
1308
1784
|
console.log();
|
|
1309
1785
|
await this.showLogs('elasticsearch', lines);
|
|
1310
1786
|
break;
|
|
@@ -1317,36 +1793,132 @@ export class ServiceManager {
|
|
|
1317
1793
|
* Remove containers
|
|
1318
1794
|
*/
|
|
1319
1795
|
async removeContainers() {
|
|
1796
|
+
await this.withProjectServiceLocks(process.cwd(), () => this.removeContainersLocked());
|
|
1797
|
+
}
|
|
1798
|
+
async removeContainersLocked() {
|
|
1799
|
+
await this.config.reloadFromDisk();
|
|
1320
1800
|
const containers = this.config.getContainerNames();
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1801
|
+
const directories = this.config.getDataDirectories();
|
|
1802
|
+
const projectPath = plugins.path.resolve(process.cwd());
|
|
1803
|
+
const registryProjects = await this.globalRegistry.getAllProjects();
|
|
1804
|
+
const registryProject = Object.entries(registryProjects).find(([registeredPathArg]) => plugins.path.resolve(registeredPathArg) === projectPath)?.[1];
|
|
1805
|
+
const targets = new Map();
|
|
1806
|
+
const addTarget = (serviceArg, nameArg, registeredArg) => {
|
|
1807
|
+
if (!nameArg)
|
|
1808
|
+
return;
|
|
1809
|
+
const existing = targets.get(nameArg);
|
|
1810
|
+
if (existing && existing.service !== serviceArg) {
|
|
1811
|
+
throw new Error(`Refusing ambiguous service container name: ${nameArg}`);
|
|
1326
1812
|
}
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1813
|
+
targets.set(nameArg, {
|
|
1814
|
+
service: serviceArg,
|
|
1815
|
+
name: nameArg,
|
|
1816
|
+
registered: registeredArg || existing?.registered === true,
|
|
1817
|
+
});
|
|
1818
|
+
};
|
|
1819
|
+
addTarget('mongodb', containers.mongo, false);
|
|
1820
|
+
addTarget('objectstorage', containers.objectstorage, false);
|
|
1821
|
+
addTarget('elasticsearch', containers.elasticsearch, false);
|
|
1822
|
+
addTarget('mongodb', registryProject?.containers.mongo, true);
|
|
1823
|
+
addTarget('objectstorage', registryProject?.containers.objectstorage, true);
|
|
1824
|
+
addTarget('elasticsearch', registryProject?.containers.elasticsearch, true);
|
|
1825
|
+
const plannedRemovals = [];
|
|
1826
|
+
for (const target of targets.values()) {
|
|
1827
|
+
const id = await this.discoverContainerIdByExactName(target.name, () => ({ timeoutMs: 60_000 }));
|
|
1828
|
+
if (!id)
|
|
1829
|
+
continue;
|
|
1830
|
+
const inspections = await this.docker.inspectMany([id]);
|
|
1831
|
+
const inspection = inspections[0];
|
|
1832
|
+
if (!inspection || inspection.id !== id || inspection.name !== target.name) {
|
|
1833
|
+
throw new Error(`Refusing ambiguous service container identity: ${target.name}`);
|
|
1332
1834
|
}
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1835
|
+
const expectedLabels = getServiceContainerLabels({
|
|
1836
|
+
projectPath,
|
|
1837
|
+
service: target.service,
|
|
1838
|
+
dataPath: target.service === 'mongodb'
|
|
1839
|
+
? directories.mongo
|
|
1840
|
+
: target.service === 'objectstorage'
|
|
1841
|
+
? directories.objectstorage
|
|
1842
|
+
: directories.elasticsearch,
|
|
1843
|
+
});
|
|
1844
|
+
const labelOwned = hasExactServiceContainerLabels(inspection.labels, expectedLabels);
|
|
1845
|
+
const hasGitZoneLabels = Object.keys(inspection.labels).some((keyArg) => keyArg.startsWith('git.zone.'));
|
|
1846
|
+
const registryClaims = Object.entries(registryProjects).flatMap(([registeredPathArg, projectArg]) => {
|
|
1847
|
+
const claims = [];
|
|
1848
|
+
if (projectArg.containers.mongo === target.name) {
|
|
1849
|
+
claims.push({ projectPath: plugins.path.resolve(registeredPathArg), service: 'mongodb' });
|
|
1850
|
+
}
|
|
1851
|
+
if (projectArg.containers.objectstorage === target.name) {
|
|
1852
|
+
claims.push({
|
|
1853
|
+
projectPath: plugins.path.resolve(registeredPathArg),
|
|
1854
|
+
service: 'objectstorage',
|
|
1855
|
+
});
|
|
1856
|
+
}
|
|
1857
|
+
if (projectArg.containers.elasticsearch === target.name) {
|
|
1858
|
+
claims.push({
|
|
1859
|
+
projectPath: plugins.path.resolve(registeredPathArg),
|
|
1860
|
+
service: 'elasticsearch',
|
|
1861
|
+
});
|
|
1862
|
+
}
|
|
1863
|
+
return claims;
|
|
1864
|
+
});
|
|
1865
|
+
const registryOwned = !hasGitZoneLabels &&
|
|
1866
|
+
target.registered &&
|
|
1867
|
+
target.service !== 'objectstorage' &&
|
|
1868
|
+
registryClaims.length === 1 &&
|
|
1869
|
+
registryClaims[0].projectPath === projectPath &&
|
|
1870
|
+
registryClaims[0].service === target.service;
|
|
1871
|
+
if (!labelOwned && !registryOwned) {
|
|
1872
|
+
throw new Error(`Refusing to remove container with unproven ownership: ${target.name}`);
|
|
1338
1873
|
}
|
|
1339
|
-
|
|
1340
|
-
|
|
1874
|
+
plannedRemovals.push({ service: target.service, name: target.name, inspection });
|
|
1875
|
+
}
|
|
1876
|
+
if (plannedRemovals.some((removalArg) => removalArg.service === 'objectstorage') &&
|
|
1877
|
+
(await plugins.smartfs.directory(directories.objectstorage).exists())) {
|
|
1878
|
+
await this.repairObjectStorageMarkerFromOwnedContainer(directories.objectstorage);
|
|
1879
|
+
}
|
|
1880
|
+
for (const removal of plannedRemovals) {
|
|
1881
|
+
await this.docker.execArgv(['rm', '-f', removal.inspection.id], { timeoutMs: 60_000 });
|
|
1882
|
+
const label = removal.service === 'mongodb'
|
|
1883
|
+
? 'MongoDB'
|
|
1884
|
+
: removal.service === 'objectstorage'
|
|
1885
|
+
? 'S3/ObjectStorage'
|
|
1886
|
+
: 'Elasticsearch';
|
|
1887
|
+
logger.log('ok', ` ${label} container removed ✓`);
|
|
1888
|
+
}
|
|
1889
|
+
if (plannedRemovals.length === 0) {
|
|
1341
1890
|
logger.log('note', ' No containers to remove');
|
|
1342
1891
|
}
|
|
1343
|
-
//
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
const
|
|
1347
|
-
|
|
1348
|
-
|
|
1892
|
+
// Re-read and prove every current claim absent while all service locks are
|
|
1893
|
+
// still held. A concurrent internal start cannot appear between this check
|
|
1894
|
+
// and the compare-delete registry transaction.
|
|
1895
|
+
const currentProjects = await this.globalRegistry.getAllProjects();
|
|
1896
|
+
const currentProject = Object.entries(currentProjects).find(([registeredPathArg]) => plugins.path.resolve(registeredPathArg) === projectPath)?.[1];
|
|
1897
|
+
const legacyDataExists = await plugins.smartfs.directory(getLegacyMinioDataDirectory(projectPath)).exists();
|
|
1898
|
+
if (currentProject && !currentProject.legacy?.minioContainer && !legacyDataExists) {
|
|
1899
|
+
const labeledIds = await this.docker.listIds([
|
|
1900
|
+
`label=git.zone.project-path=${projectPath}`,
|
|
1901
|
+
]);
|
|
1902
|
+
let registeredContainerExists = labeledIds.length > 0;
|
|
1903
|
+
for (const containerName of Object.values(currentProject.containers)) {
|
|
1904
|
+
if (!containerName)
|
|
1905
|
+
continue;
|
|
1906
|
+
if (await this.discoverContainerIdByExactName(containerName, () => ({ timeoutMs: 60_000 }))) {
|
|
1907
|
+
registeredContainerExists = true;
|
|
1908
|
+
break;
|
|
1909
|
+
}
|
|
1910
|
+
}
|
|
1911
|
+
if (!registeredContainerExists) {
|
|
1912
|
+
await this.globalRegistry.unregisterProject(process.cwd(), currentProject);
|
|
1913
|
+
}
|
|
1914
|
+
}
|
|
1915
|
+
}
|
|
1916
|
+
async withProjectServiceLocks(projectPathArg, actionArg, serviceIndexArg = 0) {
|
|
1917
|
+
const service = serviceNames[serviceIndexArg];
|
|
1918
|
+
if (!service) {
|
|
1919
|
+
return actionArg();
|
|
1349
1920
|
}
|
|
1921
|
+
return withServiceDataOperationLock(projectPathArg, service, () => this.withProjectServiceLocks(projectPathArg, actionArg, serviceIndexArg + 1));
|
|
1350
1922
|
}
|
|
1351
1923
|
/**
|
|
1352
1924
|
* Clean data directories
|
|
@@ -1355,23 +1927,28 @@ export class ServiceManager {
|
|
|
1355
1927
|
const directories = this.config.getDataDirectories();
|
|
1356
1928
|
const targets = [
|
|
1357
1929
|
{ label: 'MongoDB', service: 'mongodb', path: directories.mongo },
|
|
1358
|
-
{ label: 'S3/
|
|
1930
|
+
{ label: 'S3/ObjectStorage', service: 'objectstorage', path: directories.objectstorage },
|
|
1359
1931
|
{ label: 'Elasticsearch', service: 'elasticsearch', path: directories.elasticsearch },
|
|
1360
1932
|
];
|
|
1361
1933
|
let cleaned = false;
|
|
1362
1934
|
for (const target of targets) {
|
|
1363
|
-
|
|
1935
|
+
const removed = await this.docker.removeDataDirectory(target.path, serviceImages[target.service], {
|
|
1936
|
+
projectPath: process.cwd(),
|
|
1937
|
+
service: target.service,
|
|
1938
|
+
});
|
|
1939
|
+
if (!removed) {
|
|
1364
1940
|
continue;
|
|
1365
1941
|
}
|
|
1366
|
-
// Escalates to a privileged one-off container when needed; throws rather
|
|
1367
|
-
// than leaving a partially deleted (and for MongoDB, corrupt) directory.
|
|
1368
|
-
await this.docker.removeDataDirectory(target.path, serviceImages[target.service]);
|
|
1369
1942
|
logger.log('ok', ` ${target.label} data removed ✓`);
|
|
1370
1943
|
cleaned = true;
|
|
1371
1944
|
}
|
|
1372
1945
|
if (!cleaned) {
|
|
1373
1946
|
logger.log('note', ' No data to clean');
|
|
1374
1947
|
}
|
|
1948
|
+
const legacyDataPath = getLegacyMinioDataDirectory(process.cwd());
|
|
1949
|
+
if (await plugins.smartfs.directory(legacyDataPath).exists()) {
|
|
1950
|
+
logger.log('note', ` Legacy MinIO data was preserved and not modified: ${legacyDataPath}`);
|
|
1951
|
+
}
|
|
1375
1952
|
}
|
|
1376
1953
|
/**
|
|
1377
1954
|
* Configure which services are enabled
|
|
@@ -1379,7 +1956,7 @@ export class ServiceManager {
|
|
|
1379
1956
|
async configureServices() {
|
|
1380
1957
|
logger.log('note', 'Select which services to enable for this project:');
|
|
1381
1958
|
console.log();
|
|
1382
|
-
const currentServices = this.enabledServices || ['mongodb', '
|
|
1959
|
+
const currentServices = this.enabledServices || ['mongodb', 'objectstorage', 'elasticsearch'];
|
|
1383
1960
|
const smartinteract = new plugins.smartinteract.SmartInteract();
|
|
1384
1961
|
const response = await smartinteract.askQuestion({
|
|
1385
1962
|
name: 'services',
|
|
@@ -1387,12 +1964,12 @@ export class ServiceManager {
|
|
|
1387
1964
|
message: 'Which services do you want to enable?',
|
|
1388
1965
|
choices: [
|
|
1389
1966
|
{ name: 'MongoDB', value: 'mongodb' },
|
|
1390
|
-
{ name: '
|
|
1967
|
+
{ name: 'ObjectStorage (S3)', value: 'objectstorage' },
|
|
1391
1968
|
{ name: 'Elasticsearch', value: 'elasticsearch' }
|
|
1392
1969
|
],
|
|
1393
1970
|
default: currentServices
|
|
1394
1971
|
});
|
|
1395
|
-
const enabledServices = response.value || ['mongodb', '
|
|
1972
|
+
const enabledServices = response.value || ['mongodb', 'objectstorage', 'elasticsearch'];
|
|
1396
1973
|
this.enabledServices = enabledServices;
|
|
1397
1974
|
// Save to .smartconfig.json
|
|
1398
1975
|
await this.saveServiceConfiguration(enabledServices);
|
|
@@ -1403,24 +1980,9 @@ export class ServiceManager {
|
|
|
1403
1980
|
*/
|
|
1404
1981
|
async reconfigure() {
|
|
1405
1982
|
helpers.printHeader('Reconfiguring Services');
|
|
1406
|
-
|
|
1407
|
-
//
|
|
1408
|
-
|
|
1409
|
-
if (await this.docker.exists(containers.mongo)) {
|
|
1410
|
-
await this.docker.stop(containers.mongo);
|
|
1411
|
-
logger.log('ok', ' MongoDB stopped ✓');
|
|
1412
|
-
}
|
|
1413
|
-
if (await this.docker.exists(containers.minio)) {
|
|
1414
|
-
await this.docker.stop(containers.minio);
|
|
1415
|
-
logger.log('ok', ' S3/MinIO stopped ✓');
|
|
1416
|
-
}
|
|
1417
|
-
if (await this.docker.exists(containers.elasticsearch)) {
|
|
1418
|
-
await this.docker.stop(containers.elasticsearch);
|
|
1419
|
-
logger.log('ok', ' Elasticsearch stopped ✓');
|
|
1420
|
-
}
|
|
1421
|
-
// Reconfigure ports
|
|
1422
|
-
await this.config.reconfigurePorts();
|
|
1423
|
-
// Ask if user wants to restart services
|
|
1983
|
+
await this.withProjectServiceLocks(process.cwd(), () => this.reconfigureLocked());
|
|
1984
|
+
// Ask if user wants to restart services after releasing the reconfiguration
|
|
1985
|
+
// locks; startAll acquires the same locks one service at a time.
|
|
1424
1986
|
const smartinteract = new plugins.smartinteract.SmartInteract();
|
|
1425
1987
|
const response = await smartinteract.askQuestion({
|
|
1426
1988
|
name: 'restart',
|
|
@@ -1431,7 +1993,19 @@ export class ServiceManager {
|
|
|
1431
1993
|
if (response.value) {
|
|
1432
1994
|
console.log();
|
|
1433
1995
|
await this.startAll();
|
|
1996
|
+
await this.registerWithGlobalRegistry();
|
|
1434
1997
|
}
|
|
1435
1998
|
}
|
|
1999
|
+
async reconfigureLocked() {
|
|
2000
|
+
await this.config.reloadFromDisk();
|
|
2001
|
+
await this.assertNoLegacyMinioResources(() => ({ timeoutMs: 60_000 }));
|
|
2002
|
+
// Stop existing containers
|
|
2003
|
+
logger.log('note', '🛑 Stopping existing containers...');
|
|
2004
|
+
await this.stopMongoDBLocked();
|
|
2005
|
+
await this.stopObjectStorageLocked();
|
|
2006
|
+
await this.stopElasticsearchLocked();
|
|
2007
|
+
// Reconfigure ports
|
|
2008
|
+
await this.config.reconfigurePorts();
|
|
2009
|
+
}
|
|
1436
2010
|
}
|
|
1437
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXJ2aWNlbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL21vZF9zZXJ2aWNlcy9jbGFzc2VzLnNlcnZpY2VtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLG9CQUFvQixFQUNwQiw4QkFBOEIsR0FDL0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGtCQUFrQixHQUduQixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLDBCQUEwQixFQUMxQixhQUFhLEdBRWQsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFtQy9DLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLE1BQU07S0FDYjtDQUNnQyxDQUFDO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLE1BQU0sQ0FBQztBQUNuRCxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUNyQyxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQUNqQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUNyQyxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUM7QUFDbkMsTUFBTSxxQkFBcUIsR0FDekIsdUdBQXVHLENBQUM7QUFpQjFHLE1BQU0saUJBQWlCLEdBQThCO0lBQ25ELEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ3JCLEtBQUssRUFBRSxL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
|
|
2011
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXJ2aWNlbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL21vZF9zZXJ2aWNlcy9jbGFzc2VzLnNlcnZpY2VtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLG9CQUFvQixFQUNwQiw4QkFBOEIsR0FFL0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGtCQUFrQixHQUduQixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLHlCQUF5QixFQUN6Qix1QkFBdUIsRUFDdkIsOEJBQThCLEVBQzlCLGdDQUFnQyxFQUNoQyxrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLDBCQUEwQixFQUMxQixvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLFlBQVksRUFDWixxQkFBcUIsRUFDckIsZ0JBQWdCLEdBRWpCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0UsT0FBTyxFQUNMLG9CQUFvQixHQUVyQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHVCQUF1QixFQUN2QixvQkFBb0IsR0FDckIsTUFBTSwyQkFBMkIsQ0FBQztBQXFDbkMsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsQ0FDOUMsWUFBc0MsRUFDWixFQUFFLENBQUM7SUFDN0IsaUJB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
|