anycloud 0.0.3 → 0.0.5
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/cli/commands/config/edit.js +15 -0
- package/dist/cli/commands/config/edit.js.map +1 -1
- package/dist/cli/commands/config/list.js +53 -18
- package/dist/cli/commands/config/list.js.map +1 -1
- package/dist/cli/commands/config/new.js +21 -0
- package/dist/cli/commands/config/new.js.map +1 -1
- package/dist/cli/commands/config/remove.js +10 -0
- package/dist/cli/commands/config/remove.js.map +1 -1
- package/dist/cli/commands/credentials/delete.js +10 -0
- package/dist/cli/commands/credentials/delete.js.map +1 -1
- package/dist/cli/commands/credentials/edit.js +16 -0
- package/dist/cli/commands/credentials/edit.js.map +1 -1
- package/dist/cli/commands/credentials/list.js +35 -13
- package/dist/cli/commands/credentials/list.js.map +1 -1
- package/dist/cli/commands/credentials/new.js +25 -0
- package/dist/cli/commands/credentials/new.js.map +1 -1
- package/dist/cli/commands/daemon/index.js +8 -6
- package/dist/cli/commands/daemon/index.js.map +1 -1
- package/dist/cli/commands/list.js +70 -19
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/login.js +10 -0
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/logs.js +95 -10
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/run.js +110 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/serve.js +15 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/status.js +113 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/terminate.js +122 -8
- package/dist/cli/commands/terminate.js.map +1 -1
- package/dist/cli/commands/upgrade.js +66 -8
- package/dist/cli/commands/upgrade.js.map +1 -1
- package/dist/cli/index.js +6 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/services/api-client.js +51 -49
- package/dist/cli/services/api-client.js.map +1 -1
- package/dist/cli/services/config.js +2 -0
- package/dist/cli/services/config.js.map +1 -1
- package/dist/cli/services/non-interactive.js +3 -3
- package/dist/cli/services/non-interactive.js.map +1 -1
- package/dist/cli/services/oauth.js +4 -5
- package/dist/cli/services/oauth.js.map +1 -1
- package/dist/cli/utils/env-parser.js +27 -0
- package/dist/cli/utils/env-parser.js.map +1 -0
- package/dist/cli/utils/output.js +42 -0
- package/dist/cli/utils/output.js.map +1 -1
- package/dist/daemon/cluster.js +122 -17
- package/dist/daemon/cluster.js.map +1 -1
- package/dist/daemon/docker.js +62 -21
- package/dist/daemon/docker.js.map +1 -1
- package/dist/daemon/preemption.js +127 -0
- package/dist/daemon/preemption.js.map +1 -0
- package/dist/daemon/server.js +128 -16
- package/dist/daemon/server.js.map +1 -1
- package/dist/shared/assets/clouds/azure/regions-per-type.json +21584 -1117
- package/dist/shared/id-generator.js +20 -0
- package/dist/shared/id-generator.js.map +1 -0
- package/dist/shared/types.js +5 -1
- package/dist/shared/types.js.map +1 -1
- package/package.json +16 -8
- package/dist/cli/commands/daemon/start.js +0 -32
- package/dist/cli/commands/daemon/start.js.map +0 -1
- package/dist/cli/commands/job.js +0 -71
- package/dist/cli/commands/job.js.map +0 -1
- package/dist/cli/commands/new.js +0 -15
- package/dist/cli/commands/new.js.map +0 -1
package/dist/cli/utils/output.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
|
+
import Table from 'cli-table3';
|
|
3
4
|
// Console output helpers with colors
|
|
4
5
|
export function printSuccess(message) {
|
|
5
6
|
console.log(chalk.green(` ✓ ${message}`));
|
|
@@ -33,4 +34,45 @@ export function createSpinner(text) {
|
|
|
33
34
|
color: 'cyan',
|
|
34
35
|
});
|
|
35
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Print cloud configurations table
|
|
39
|
+
* Used by both deployment list and config list commands
|
|
40
|
+
*/
|
|
41
|
+
export function printCloudConfigsTable(configs, options = {}) {
|
|
42
|
+
const { title = 'Cloud Configurations:', showCredentials = false } = options;
|
|
43
|
+
console.log(chalk.bold(` ${title}`));
|
|
44
|
+
console.log('');
|
|
45
|
+
const headers = showCredentials
|
|
46
|
+
? ['Config', 'Credentials', 'Region', 'VM Type', 'Spot']
|
|
47
|
+
: ['Config', 'Provider', 'Region', 'VM Type', 'Spot'];
|
|
48
|
+
const colWidths = showCredentials ? [20, 18, 18, 20, 8] : [20, 12, 18, 20, 8];
|
|
49
|
+
const table = new Table({
|
|
50
|
+
head: headers.map((h) => chalk.cyan(h)),
|
|
51
|
+
colWidths,
|
|
52
|
+
style: {
|
|
53
|
+
head: [],
|
|
54
|
+
border: ['dim'],
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
configs.forEach((config) => {
|
|
58
|
+
const spotValue = config.spot ? 'Yes' : 'No';
|
|
59
|
+
const row = showCredentials
|
|
60
|
+
? [
|
|
61
|
+
config.configName,
|
|
62
|
+
config.credentialsName,
|
|
63
|
+
config.region || 'default',
|
|
64
|
+
config.vmType || 'default',
|
|
65
|
+
spotValue,
|
|
66
|
+
]
|
|
67
|
+
: [
|
|
68
|
+
config.configName,
|
|
69
|
+
config.provider || 'default',
|
|
70
|
+
config.region || 'default',
|
|
71
|
+
config.vmType || 'default',
|
|
72
|
+
spotValue,
|
|
73
|
+
];
|
|
74
|
+
table.push(row);
|
|
75
|
+
});
|
|
76
|
+
console.log(table.toString());
|
|
77
|
+
}
|
|
36
78
|
//# sourceMappingURL=output.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/cli/utils/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAiB,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/cli/utils/output.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/cluster.js
CHANGED
|
@@ -4,37 +4,51 @@
|
|
|
4
4
|
import axios from 'axios';
|
|
5
5
|
import { promises as dns } from 'dns';
|
|
6
6
|
import crypto from 'crypto';
|
|
7
|
+
import { CloudType } from '../shared/types.js';
|
|
7
8
|
import { MetricsCollector } from './metrics.js';
|
|
9
|
+
import { PreemptionDetector } from './preemption.js';
|
|
8
10
|
import { log } from './logger.js';
|
|
9
11
|
const ACK_INTERVAL = 4 * 60 * 1000; // 4 minutes
|
|
10
12
|
const METRICS_INTERVAL = 60 * 1000; // 1 minute
|
|
11
|
-
|
|
12
|
-
|
|
13
|
+
// Configurable metadata endpoints (for testing)
|
|
14
|
+
const AWS_METADATA_URL = process.env.AWS_METADATA_URL || 'http://169.254.169.254';
|
|
15
|
+
const AZURE_METADATA_URL = process.env.AZURE_METADATA_URL || 'http://169.254.169.254';
|
|
16
|
+
const GCP_METADATA_URL = process.env.GCP_METADATA_URL || 'http://metadata.google.internal';
|
|
17
|
+
export class Coordinator {
|
|
18
|
+
constructor(deploymentSecret, conductorUrl) {
|
|
13
19
|
this.daemonProps = null;
|
|
14
20
|
this.clusterInfo = null;
|
|
15
21
|
this.privateIp = null;
|
|
16
22
|
this.publicIp = null;
|
|
17
23
|
this.ackInterval = null;
|
|
18
24
|
this.metricsInterval = null;
|
|
19
|
-
this.
|
|
25
|
+
this.preemptionDetector = null;
|
|
26
|
+
this.deploymentSecret = deploymentSecret;
|
|
20
27
|
this.metricsCollector = new MetricsCollector();
|
|
21
28
|
this.conductorUrl = conductorUrl;
|
|
22
29
|
}
|
|
23
30
|
/**
|
|
24
|
-
* Start
|
|
31
|
+
* Start deployment coordination
|
|
25
32
|
*/
|
|
26
33
|
async start(props) {
|
|
27
34
|
this.daemonProps = props;
|
|
28
35
|
// Get this VM's IP addresses
|
|
29
36
|
await this.discoverOwnIps();
|
|
37
|
+
// Detect cloud provider
|
|
38
|
+
const cloudProvider = await this.detectCloudProvider();
|
|
30
39
|
log.info('Cluster coordinator started', {
|
|
31
|
-
|
|
40
|
+
id: props.id,
|
|
32
41
|
privateIp: this.privateIp,
|
|
33
42
|
publicIp: this.publicIp,
|
|
43
|
+
cloudProvider,
|
|
34
44
|
});
|
|
35
45
|
// Start periodic tasks
|
|
36
46
|
this.startAckHeartbeat();
|
|
37
47
|
this.startMetricsCollection();
|
|
48
|
+
// Start preemption detection if running on a cloud provider
|
|
49
|
+
if (cloudProvider) {
|
|
50
|
+
this.startPreemptionDetection(cloudProvider);
|
|
51
|
+
}
|
|
38
52
|
}
|
|
39
53
|
/**
|
|
40
54
|
* Discover this VM's own IP addresses
|
|
@@ -79,8 +93,8 @@ export class ClusterCoordinator {
|
|
|
79
93
|
try {
|
|
80
94
|
await axios.post(`${this.conductorUrl}/v1/ack`, {
|
|
81
95
|
conductorToken: this.daemonProps.conductorToken,
|
|
82
|
-
|
|
83
|
-
|
|
96
|
+
id: this.daemonProps.id,
|
|
97
|
+
deploymentSecret: this.deploymentSecret,
|
|
84
98
|
});
|
|
85
99
|
log.debug('Ack sent successfully');
|
|
86
100
|
}
|
|
@@ -97,7 +111,7 @@ export class ClusterCoordinator {
|
|
|
97
111
|
try {
|
|
98
112
|
// Collect metrics
|
|
99
113
|
await this.metricsCollector.collect();
|
|
100
|
-
// Discover
|
|
114
|
+
// Discover deployment VMs from DNS
|
|
101
115
|
await this.discoverClusterVMs();
|
|
102
116
|
// If we're the leader, check if we need to scale
|
|
103
117
|
if (this.isLeader()) {
|
|
@@ -110,7 +124,7 @@ export class ClusterCoordinator {
|
|
|
110
124
|
}, METRICS_INTERVAL);
|
|
111
125
|
}
|
|
112
126
|
/**
|
|
113
|
-
* Discover all VMs in the
|
|
127
|
+
* Discover all VMs in the deployment via DNS TXT records
|
|
114
128
|
*/
|
|
115
129
|
async discoverClusterVMs() {
|
|
116
130
|
if (!this.daemonProps)
|
|
@@ -182,12 +196,7 @@ export class ClusterCoordinator {
|
|
|
182
196
|
}
|
|
183
197
|
log.info('Triggering scale operation', { scalingFactor });
|
|
184
198
|
try {
|
|
185
|
-
await axios.post(`${this.conductorUrl}/v1/scale`,
|
|
186
|
-
clusterId: this.daemonProps.clusterId,
|
|
187
|
-
conductorToken: this.daemonProps.conductorToken,
|
|
188
|
-
clusterFactor: scalingFactor,
|
|
189
|
-
image: this.daemonProps.image,
|
|
190
|
-
});
|
|
199
|
+
await axios.post(`${this.conductorUrl}/v1/scale`, this.daemonProps);
|
|
191
200
|
log.info('Scale request sent successfully');
|
|
192
201
|
}
|
|
193
202
|
catch (error) {
|
|
@@ -195,15 +204,111 @@ export class ClusterCoordinator {
|
|
|
195
204
|
}
|
|
196
205
|
}
|
|
197
206
|
/**
|
|
198
|
-
*
|
|
207
|
+
* Detect which cloud provider we're running on via metadata endpoints
|
|
199
208
|
*/
|
|
200
|
-
|
|
209
|
+
async detectCloudProvider() {
|
|
210
|
+
// Try AWS
|
|
211
|
+
try {
|
|
212
|
+
await axios.get(`${AWS_METADATA_URL}/latest/meta-data/`, {
|
|
213
|
+
timeout: 500,
|
|
214
|
+
});
|
|
215
|
+
return CloudType.AWS;
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Not AWS
|
|
219
|
+
}
|
|
220
|
+
// Try Azure
|
|
221
|
+
try {
|
|
222
|
+
await axios.get(`${AZURE_METADATA_URL}/metadata/instance?api-version=2020-07-01`, {
|
|
223
|
+
headers: { Metadata: 'true' },
|
|
224
|
+
timeout: 500,
|
|
225
|
+
});
|
|
226
|
+
return CloudType.Azure;
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// Not Azure
|
|
230
|
+
}
|
|
231
|
+
// Try GCP
|
|
232
|
+
try {
|
|
233
|
+
await axios.get(`${GCP_METADATA_URL}/computeMetadata/v1/instance/id`, {
|
|
234
|
+
headers: { 'Metadata-Flavor': 'Google' },
|
|
235
|
+
timeout: 500,
|
|
236
|
+
});
|
|
237
|
+
return CloudType.GCP;
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
// Not GCP
|
|
241
|
+
}
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Start monitoring for spot instance preemption
|
|
246
|
+
*/
|
|
247
|
+
startPreemptionDetection(cloudProvider) {
|
|
248
|
+
this.preemptionDetector = new PreemptionDetector(cloudProvider);
|
|
249
|
+
this.preemptionDetector.startMonitoring(async () => {
|
|
250
|
+
await this.handlePreemption(cloudProvider);
|
|
251
|
+
});
|
|
252
|
+
log.info('Preemption detection started', { cloudProvider });
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Handle preemption signal - trigger panic for replacement
|
|
256
|
+
*/
|
|
257
|
+
async handlePreemption(cloudProvider) {
|
|
258
|
+
const reason = `Spot instance preemption detected: ${cloudProvider}`;
|
|
259
|
+
log.error('PREEMPTION DETECTED', { cloudProvider });
|
|
260
|
+
try {
|
|
261
|
+
// Trigger panic immediately
|
|
262
|
+
await this.triggerPanic(reason);
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
log.error('Failed to send preemption panic', error);
|
|
266
|
+
// Even if panic fails, we'll be terminated soon anyway
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Trigger panic recovery by sending request to conductor.
|
|
271
|
+
* Used when daemon detects internal state corruption that cannot be self-healed.
|
|
272
|
+
* This triggers a zero-downtime upgrade to replace corrupted VMs with fresh instances.
|
|
273
|
+
*/
|
|
274
|
+
async triggerPanic(reason) {
|
|
275
|
+
if (!this.daemonProps) {
|
|
276
|
+
log.error('Cannot trigger panic - no DaemonProps available');
|
|
277
|
+
throw new Error('Cannot trigger panic: DaemonProps not initialized');
|
|
278
|
+
}
|
|
279
|
+
try {
|
|
280
|
+
log.error('DAEMON PANIC: Triggering self-recovery', { reason });
|
|
281
|
+
// Send panic request to conductor with full daemon props
|
|
282
|
+
await axios.post(`${this.conductorUrl}/v1/panic`, {
|
|
283
|
+
...this.daemonProps,
|
|
284
|
+
message: reason, // Include reason for debugging
|
|
285
|
+
}, { timeout: 30000 });
|
|
286
|
+
log.info('Panic request sent successfully - awaiting replacement');
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
log.error('Failed to send panic request', error);
|
|
290
|
+
throw error;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Stop deployment coordination.
|
|
295
|
+
* Safe to call multiple times (idempotent).
|
|
296
|
+
*/
|
|
297
|
+
async stop() {
|
|
298
|
+
log.info('Stopping cluster coordinator');
|
|
201
299
|
if (this.ackInterval) {
|
|
202
300
|
clearInterval(this.ackInterval);
|
|
301
|
+
this.ackInterval = null;
|
|
203
302
|
}
|
|
204
303
|
if (this.metricsInterval) {
|
|
205
304
|
clearInterval(this.metricsInterval);
|
|
305
|
+
this.metricsInterval = null;
|
|
306
|
+
}
|
|
307
|
+
if (this.preemptionDetector) {
|
|
308
|
+
this.preemptionDetector.stopMonitoring();
|
|
309
|
+
this.preemptionDetector = null;
|
|
206
310
|
}
|
|
311
|
+
log.info('Cluster coordinator stopped');
|
|
207
312
|
}
|
|
208
313
|
}
|
|
209
314
|
//# sourceMappingURL=cluster.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cluster.js","sourceRoot":"","sources":["../../src/daemon/cluster.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"cluster.js","sourceRoot":"","sources":["../../src/daemon/cluster.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAiC,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAChD,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AAE/C,gDAAgD;AAChD,MAAM,gBAAgB,GACpB,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,wBAAwB,CAAC;AAC3D,MAAM,kBAAkB,GACtB,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,wBAAwB,CAAC;AAC7D,MAAM,gBAAgB,GACpB,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,iCAAiC,CAAC;AAEpE,MAAM,OAAO,WAAW;IAYtB,YAAY,gBAAwB,EAAE,YAAoB;QAVlD,gBAAW,GAAuB,IAAI,CAAC;QAEvC,gBAAW,GAAuB,IAAI,CAAC;QACvC,cAAS,GAAkB,IAAI,CAAC;QAChC,aAAQ,GAAkB,IAAI,CAAC;QAC/B,gBAAW,GAA0B,IAAI,CAAC;QAC1C,oBAAe,GAA0B,IAAI,CAAC;QAC9C,uBAAkB,GAA8B,IAAI,CAAC;QAI3D,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC/C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,KAAkB;QAC5B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAEzB,6BAA6B;QAC7B,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5B,wBAAwB;QACxB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAEvD,GAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE;YACtC,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,aAAa;SACd,CAAC,CAAC;QAEH,uBAAuB;QACvB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,4DAA4D;QAC5D,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC;YACH,yCAAyC;YACzC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;YAEjC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBACnC,yBAAyB;oBACzB,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;wBAC3C,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC;wBAC7B,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,IAAI,IAAI,CAAC,SAAS;oBAAE,MAAM;YAC5B,CAAC;YAED,sCAAsC;YACtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,mCAAmC,EAAE;gBACpE,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAEjC,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE;gBAC1B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACxC,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,OAAO;YAE9B,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,SAAS,EAAE;oBAC9C,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc;oBAC/C,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE;oBACvB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;iBACpB,CAAC,CAAC;gBAEvB,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,EAAE,YAAY,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,sBAAsB;QAC5B,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YAC5C,IAAI,CAAC;gBACH,kBAAkB;gBAClB,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAEtC,mCAAmC;gBACnC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAEhC,iDAAiD;gBACjD,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;oBACpB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC7B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB;QAC9B,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAE9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACvC,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAEhD,MAAM,GAAG,GAAa,EAAE,CAAC;YAEzB,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAE5B,iFAAiF;gBACjF,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC7B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;oBAAE,SAAS;gBAEpD,MAAM,CAAC,EAAE,AAAD,EAAG,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;gBAE7D,GAAG,CAAC,IAAI,CAAC;oBACP,EAAE,EAAE,IAAI;oBACR,QAAQ;oBACR,SAAS;oBACT,MAAM;oBACN,KAAK;oBACL,IAAI,EAAE,IAAI,EAAE,oBAAoB;iBACjC,CAAC,CAAC;YACL,CAAC;YAED,+DAA+D;YAC/D,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAClC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACpC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACpC,OAAO,KAAK,GAAG,KAAK,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,GAAG;gBACjB,GAAG;gBACH,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE;aACpD,CAAC;YAEF,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBAC9B,OAAO,EAAE,GAAG,CAAC,MAAM;gBACnB,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ;aACpC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,IAAI,CAAC,KAAa;QACxB,OAAO,QAAQ,CACb,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAChE,EAAE,CACH,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,QAAQ;QACd,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAEtD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAExD,OAAO,MAAM,KAAK,UAAU,CAAC;IAC/B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAE9B,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,CAAC;QAErE,IAAI,aAAa,KAAK,GAAG,EAAE,CAAC;YAC1B,OAAO,CAAC,oBAAoB;QAC9B,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;QAE1D,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAEpE,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB;QAC/B,UAAU;QACV,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,gBAAgB,oBAAoB,EAAE;gBACvD,OAAO,EAAE,GAAG;aACb,CAAC,CAAC;YACH,OAAO,SAAS,CAAC,GAAG,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;QAED,YAAY;QACZ,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CACb,GAAG,kBAAkB,2CAA2C,EAChE;gBACE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;gBAC7B,OAAO,EAAE,GAAG;aACb,CACF,CAAC;YACF,OAAO,SAAS,CAAC,KAAK,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QAED,UAAU;QACV,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,gBAAgB,iCAAiC,EAAE;gBACpE,OAAO,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE;gBACxC,OAAO,EAAE,GAAG;aACb,CAAC,CAAC;YACH,OAAO,SAAS,CAAC,GAAG,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,aAAwB;QACvD,IAAI,CAAC,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAEhE,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,KAAK,IAAI,EAAE;YACjD,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,aAAwB;QACrD,MAAM,MAAM,GAAG,sCAAsC,aAAa,EAAE,CAAC;QAErE,GAAG,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;QAEpD,IAAI,CAAC;YACH,4BAA4B;YAC5B,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YACpD,uDAAuD;QACzD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAAC,MAAc;QAC/B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,GAAG,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC;YACH,GAAG,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAEhE,yDAAyD;YACzD,MAAM,KAAK,CAAC,IAAI,CACd,GAAG,IAAI,CAAC,YAAY,WAAW,EAC/B;gBACE,GAAG,IAAI,CAAC,WAAW;gBACnB,OAAO,EAAE,MAAM,EAAE,+BAA+B;aAClC,EAChB,EAAE,OAAO,EAAE,KAAK,EAAE,CACnB,CAAC;YAEF,GAAG,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACR,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAEzC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,CAAC;YACzC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC1C,CAAC;CACF"}
|
package/dist/daemon/docker.js
CHANGED
|
@@ -5,7 +5,7 @@ import Docker from 'dockerode';
|
|
|
5
5
|
import { log } from './logger.js';
|
|
6
6
|
import { DeploymentType } from '../shared/types.js';
|
|
7
7
|
const docker = new Docker();
|
|
8
|
-
const
|
|
8
|
+
const DEFAULT_SERVER_PORT = 8088;
|
|
9
9
|
export class DockerManager {
|
|
10
10
|
constructor() {
|
|
11
11
|
this.containerId = null;
|
|
@@ -14,22 +14,50 @@ export class DockerManager {
|
|
|
14
14
|
/**
|
|
15
15
|
* Run container from pre-built image
|
|
16
16
|
*/
|
|
17
|
-
async runFromImage(
|
|
17
|
+
async runFromImage(props) {
|
|
18
|
+
const { githubUsername, githubToken, image } = props;
|
|
18
19
|
try {
|
|
19
|
-
log.info('Pulling Docker image', {
|
|
20
|
-
//
|
|
21
|
-
const
|
|
20
|
+
log.info('Pulling Docker image', { image });
|
|
21
|
+
// Prepare authentication for private registries
|
|
22
|
+
const pullOptions = {};
|
|
23
|
+
if (githubToken && githubUsername && image.includes('ghcr.io')) {
|
|
24
|
+
log.info('Using GitHub authentication for private registry', {
|
|
25
|
+
username: githubUsername,
|
|
26
|
+
});
|
|
27
|
+
// GitHub Container Registry authentication using OAuth token
|
|
28
|
+
pullOptions.authconfig = {
|
|
29
|
+
username: githubUsername,
|
|
30
|
+
password: githubToken, // OAuth access token with read:packages scope
|
|
31
|
+
serveraddress: 'ghcr.io',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// Pull image with optional authentication
|
|
35
|
+
const stream = await docker.pull(image, pullOptions);
|
|
22
36
|
await new Promise((resolve, reject) => {
|
|
23
37
|
docker.modem.followProgress(stream, (err, res) => {
|
|
24
|
-
if (err)
|
|
38
|
+
if (err) {
|
|
39
|
+
log.error('Image pull failed', { error: err, image });
|
|
25
40
|
reject(err);
|
|
26
|
-
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
27
43
|
resolve(res);
|
|
44
|
+
}
|
|
45
|
+
}, (event) => {
|
|
46
|
+
// Log pull progress events
|
|
47
|
+
if (event.error) {
|
|
48
|
+
log.error('Pull event error', { event });
|
|
49
|
+
}
|
|
50
|
+
else if (event.status) {
|
|
51
|
+
log.debug('Pull progress', {
|
|
52
|
+
status: event.status,
|
|
53
|
+
id: event.id,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
28
56
|
});
|
|
29
57
|
});
|
|
30
|
-
log.info('Image pulled successfully', {
|
|
58
|
+
log.info('Image pulled successfully', { image });
|
|
31
59
|
// Run container
|
|
32
|
-
await this.runContainer(
|
|
60
|
+
await this.runContainer(props);
|
|
33
61
|
}
|
|
34
62
|
catch (error) {
|
|
35
63
|
log.error('Failed to run from image', error);
|
|
@@ -39,30 +67,43 @@ export class DockerManager {
|
|
|
39
67
|
/**
|
|
40
68
|
* Run Docker container with proper configuration
|
|
41
69
|
*/
|
|
42
|
-
async runContainer(
|
|
43
|
-
|
|
70
|
+
async runContainer(props) {
|
|
71
|
+
const { id, image, deploymentType, domain, env, githubToken } = props;
|
|
72
|
+
this.containerName = `anycloud-${id}`;
|
|
44
73
|
// Stop and remove existing container if it exists
|
|
45
74
|
await this.stopContainer();
|
|
46
75
|
log.info('Starting container', {
|
|
47
|
-
|
|
76
|
+
image,
|
|
48
77
|
containerName: this.containerName,
|
|
49
78
|
deploymentType,
|
|
50
79
|
});
|
|
51
80
|
// Only expose ports for app deployments (not for jobs)
|
|
52
81
|
const isJob = deploymentType === DeploymentType.Job;
|
|
53
|
-
const exposedPorts = isJob ? {} : { [`${
|
|
82
|
+
const exposedPorts = isJob ? {} : { [`${DEFAULT_SERVER_PORT}/tcp`]: {} };
|
|
54
83
|
const portBindings = isJob
|
|
55
84
|
? {}
|
|
56
|
-
: {
|
|
85
|
+
: {
|
|
86
|
+
[`${DEFAULT_SERVER_PORT}/tcp`]: [
|
|
87
|
+
{ HostPort: String(DEFAULT_SERVER_PORT) },
|
|
88
|
+
],
|
|
89
|
+
};
|
|
90
|
+
// Merge user-provided env vars with system env vars
|
|
91
|
+
// System env vars take priority
|
|
92
|
+
const userEnvArray = env
|
|
93
|
+
? Object.entries(env).map(([key, value]) => `${key}=${value}`)
|
|
94
|
+
: [];
|
|
95
|
+
const systemEnvArray = [
|
|
96
|
+
`ID=${id}`,
|
|
97
|
+
`DOMAIN=${domain}`,
|
|
98
|
+
`PORT=${DEFAULT_SERVER_PORT}`,
|
|
99
|
+
`DEPLOYMENT_TYPE=${deploymentType}`,
|
|
100
|
+
`GITHUB_TOKEN=${githubToken}`,
|
|
101
|
+
];
|
|
102
|
+
const mergedEnv = [...userEnvArray, ...systemEnvArray];
|
|
57
103
|
const container = await docker.createContainer({
|
|
58
|
-
Image:
|
|
104
|
+
Image: image,
|
|
59
105
|
name: this.containerName,
|
|
60
|
-
Env:
|
|
61
|
-
`CLUSTER_ID=${clusterId}`,
|
|
62
|
-
`DOMAIN=${domain}`,
|
|
63
|
-
`PORT=${APP_PORT}`,
|
|
64
|
-
`DEPLOYMENT_TYPE=${deploymentType}`,
|
|
65
|
-
],
|
|
106
|
+
Env: mergedEnv,
|
|
66
107
|
ExposedPorts: exposedPorts,
|
|
67
108
|
HostConfig: {
|
|
68
109
|
PortBindings: portBindings,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/daemon/docker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/daemon/docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spot instance preemption detection for AWS, Azure, and GCP
|
|
3
|
+
*/
|
|
4
|
+
import axios from 'axios';
|
|
5
|
+
import { CloudType } from '../shared/types.js';
|
|
6
|
+
import { log } from './logger.js';
|
|
7
|
+
const PREEMPTION_CHECK_INTERVAL = 5 * 1000; // 5 seconds
|
|
8
|
+
// Configurable metadata endpoints (for testing)
|
|
9
|
+
const AWS_METADATA_URL = process.env.AWS_METADATA_URL || 'http://169.254.169.254';
|
|
10
|
+
const AZURE_METADATA_URL = process.env.AZURE_METADATA_URL || 'http://169.254.169.254';
|
|
11
|
+
const GCP_METADATA_URL = process.env.GCP_METADATA_URL || 'http://metadata.google.internal';
|
|
12
|
+
/**
|
|
13
|
+
* Detects spot/preemptible instance preemption signals across cloud providers
|
|
14
|
+
*/
|
|
15
|
+
export class PreemptionDetector {
|
|
16
|
+
constructor(cloudProvider) {
|
|
17
|
+
this.checkInterval = null;
|
|
18
|
+
this.cloudProvider = cloudProvider;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Start monitoring for preemption signals
|
|
22
|
+
*/
|
|
23
|
+
startMonitoring(onPreemptionDetected) {
|
|
24
|
+
log.info('Starting preemption detection', {
|
|
25
|
+
provider: this.cloudProvider,
|
|
26
|
+
interval: PREEMPTION_CHECK_INTERVAL,
|
|
27
|
+
});
|
|
28
|
+
this.checkInterval = setInterval(async () => {
|
|
29
|
+
try {
|
|
30
|
+
const isPreempted = await this.checkForPreemption();
|
|
31
|
+
if (isPreempted) {
|
|
32
|
+
log.error('Preemption detected!', { provider: this.cloudProvider });
|
|
33
|
+
// Stop monitoring after detection
|
|
34
|
+
this.stopMonitoring();
|
|
35
|
+
onPreemptionDetected();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
// Don't log every failed check to avoid spam
|
|
40
|
+
// Metadata service may be temporarily unavailable
|
|
41
|
+
log.debug('Preemption check failed', error);
|
|
42
|
+
}
|
|
43
|
+
}, PREEMPTION_CHECK_INTERVAL);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Stop monitoring for preemption
|
|
47
|
+
*/
|
|
48
|
+
stopMonitoring() {
|
|
49
|
+
if (this.checkInterval) {
|
|
50
|
+
clearInterval(this.checkInterval);
|
|
51
|
+
this.checkInterval = null;
|
|
52
|
+
log.info('Stopped preemption detection');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check metadata service for preemption signal based on cloud provider
|
|
57
|
+
*/
|
|
58
|
+
async checkForPreemption() {
|
|
59
|
+
switch (this.cloudProvider) {
|
|
60
|
+
case CloudType.AWS:
|
|
61
|
+
return this.checkAwsPreemption();
|
|
62
|
+
case CloudType.Azure:
|
|
63
|
+
return this.checkAzurePreemption();
|
|
64
|
+
case CloudType.GCP:
|
|
65
|
+
return this.checkGcpPreemption();
|
|
66
|
+
default:
|
|
67
|
+
throw new Error(`Unsupported cloud provider: ${this.cloudProvider}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check AWS EC2 Spot Instance metadata for termination notice
|
|
72
|
+
*/
|
|
73
|
+
async checkAwsPreemption() {
|
|
74
|
+
// First, get IMDSv2 token
|
|
75
|
+
const tokenRes = await axios.put(`${AWS_METADATA_URL}/latest/api/token`, null, {
|
|
76
|
+
headers: {
|
|
77
|
+
'X-aws-ec2-metadata-token-ttl-seconds': '21600',
|
|
78
|
+
},
|
|
79
|
+
timeout: 2000,
|
|
80
|
+
});
|
|
81
|
+
const token = tokenRes.data;
|
|
82
|
+
// Query spot instance action endpoint
|
|
83
|
+
const res = await axios.get(`${AWS_METADATA_URL}/latest/meta-data/spot/instance-action`, {
|
|
84
|
+
headers: {
|
|
85
|
+
'X-aws-ec2-metadata-token': token,
|
|
86
|
+
},
|
|
87
|
+
timeout: 2000,
|
|
88
|
+
validateStatus: (status) => status === 200 || status === 404,
|
|
89
|
+
});
|
|
90
|
+
// 404 means no preemption scheduled
|
|
91
|
+
return res.status === 200;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Check Azure Scheduled Events API for preemption signal
|
|
95
|
+
*/
|
|
96
|
+
async checkAzurePreemption() {
|
|
97
|
+
const res = await axios.get(`${AZURE_METADATA_URL}/metadata/scheduledevents?api-version=2020-07-01`, {
|
|
98
|
+
headers: {
|
|
99
|
+
Metadata: 'true',
|
|
100
|
+
},
|
|
101
|
+
timeout: 2000,
|
|
102
|
+
validateStatus: (status) => status === 200 || status === 404,
|
|
103
|
+
});
|
|
104
|
+
if (res.status === 404 ||
|
|
105
|
+
!res.data.Events ||
|
|
106
|
+
res.data.Events.length === 0) {
|
|
107
|
+
return false; // No events scheduled
|
|
108
|
+
}
|
|
109
|
+
// Look for Preempt event type
|
|
110
|
+
const preemptEvent = res.data.Events.find((e) => e.EventType === 'Preempt');
|
|
111
|
+
return !!preemptEvent;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Check GCP Preemptible VM metadata for preemption signal
|
|
115
|
+
*/
|
|
116
|
+
async checkGcpPreemption() {
|
|
117
|
+
const res = await axios.get(`${GCP_METADATA_URL}/computeMetadata/v1/instance/scheduling/preempted`, {
|
|
118
|
+
headers: {
|
|
119
|
+
'Metadata-Flavor': 'Google',
|
|
120
|
+
},
|
|
121
|
+
timeout: 2000,
|
|
122
|
+
validateStatus: () => true,
|
|
123
|
+
});
|
|
124
|
+
return res.data === 'true' || res.data === true;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=preemption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preemption.js","sourceRoot":"","sources":["../../src/daemon/preemption.ts"],"names":[],"mappings":"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"}
|