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.
Files changed (68) hide show
  1. package/dist/cli/commands/config/edit.js +15 -0
  2. package/dist/cli/commands/config/edit.js.map +1 -1
  3. package/dist/cli/commands/config/list.js +53 -18
  4. package/dist/cli/commands/config/list.js.map +1 -1
  5. package/dist/cli/commands/config/new.js +21 -0
  6. package/dist/cli/commands/config/new.js.map +1 -1
  7. package/dist/cli/commands/config/remove.js +10 -0
  8. package/dist/cli/commands/config/remove.js.map +1 -1
  9. package/dist/cli/commands/credentials/delete.js +10 -0
  10. package/dist/cli/commands/credentials/delete.js.map +1 -1
  11. package/dist/cli/commands/credentials/edit.js +16 -0
  12. package/dist/cli/commands/credentials/edit.js.map +1 -1
  13. package/dist/cli/commands/credentials/list.js +35 -13
  14. package/dist/cli/commands/credentials/list.js.map +1 -1
  15. package/dist/cli/commands/credentials/new.js +25 -0
  16. package/dist/cli/commands/credentials/new.js.map +1 -1
  17. package/dist/cli/commands/daemon/index.js +8 -6
  18. package/dist/cli/commands/daemon/index.js.map +1 -1
  19. package/dist/cli/commands/list.js +70 -19
  20. package/dist/cli/commands/list.js.map +1 -1
  21. package/dist/cli/commands/login.js +10 -0
  22. package/dist/cli/commands/login.js.map +1 -1
  23. package/dist/cli/commands/logs.js +95 -10
  24. package/dist/cli/commands/logs.js.map +1 -1
  25. package/dist/cli/commands/run.js +110 -0
  26. package/dist/cli/commands/run.js.map +1 -0
  27. package/dist/cli/commands/serve.js +15 -0
  28. package/dist/cli/commands/serve.js.map +1 -0
  29. package/dist/cli/commands/status.js +113 -0
  30. package/dist/cli/commands/status.js.map +1 -0
  31. package/dist/cli/commands/terminate.js +122 -8
  32. package/dist/cli/commands/terminate.js.map +1 -1
  33. package/dist/cli/commands/upgrade.js +66 -8
  34. package/dist/cli/commands/upgrade.js.map +1 -1
  35. package/dist/cli/index.js +6 -4
  36. package/dist/cli/index.js.map +1 -1
  37. package/dist/cli/services/api-client.js +51 -49
  38. package/dist/cli/services/api-client.js.map +1 -1
  39. package/dist/cli/services/config.js +2 -0
  40. package/dist/cli/services/config.js.map +1 -1
  41. package/dist/cli/services/non-interactive.js +3 -3
  42. package/dist/cli/services/non-interactive.js.map +1 -1
  43. package/dist/cli/services/oauth.js +4 -5
  44. package/dist/cli/services/oauth.js.map +1 -1
  45. package/dist/cli/utils/env-parser.js +27 -0
  46. package/dist/cli/utils/env-parser.js.map +1 -0
  47. package/dist/cli/utils/output.js +42 -0
  48. package/dist/cli/utils/output.js.map +1 -1
  49. package/dist/daemon/cluster.js +122 -17
  50. package/dist/daemon/cluster.js.map +1 -1
  51. package/dist/daemon/docker.js +62 -21
  52. package/dist/daemon/docker.js.map +1 -1
  53. package/dist/daemon/preemption.js +127 -0
  54. package/dist/daemon/preemption.js.map +1 -0
  55. package/dist/daemon/server.js +128 -16
  56. package/dist/daemon/server.js.map +1 -1
  57. package/dist/shared/assets/clouds/azure/regions-per-type.json +21584 -1117
  58. package/dist/shared/id-generator.js +20 -0
  59. package/dist/shared/id-generator.js.map +1 -0
  60. package/dist/shared/types.js +5 -1
  61. package/dist/shared/types.js.map +1 -1
  62. package/package.json +16 -8
  63. package/dist/cli/commands/daemon/start.js +0 -32
  64. package/dist/cli/commands/daemon/start.js.map +0 -1
  65. package/dist/cli/commands/job.js +0 -71
  66. package/dist/cli/commands/job.js.map +0 -1
  67. package/dist/cli/commands/new.js +0 -15
  68. package/dist/cli/commands/new.js.map +0 -1
@@ -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;AAEpC,qCAAqC;AAErC,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,OAAe,CAAC;IAC7D,UAAU,CAAC,OAAO,CAAC,CAAC;IACpB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,GAAG,CAAC;QACT,IAAI;QACJ,KAAK,EAAE,MAAM;KACd,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/cli/utils/output.ts"],"names":[],"mappings":"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"}
@@ -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
- export class ClusterCoordinator {
12
- constructor(clusterSecret, conductorUrl) {
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.clusterSecret = clusterSecret;
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 cluster coordination
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
- clusterId: props.clusterId,
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
- clusterId: this.daemonProps.clusterId,
83
- clusterSecret: this.clusterSecret,
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 cluster VMs from DNS
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 cluster via DNS TXT records
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
- * Stop cluster coordination
207
+ * Detect which cloud provider we're running on via metadata endpoints
199
208
  */
200
- stop() {
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":"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"}
1
+ {"version":3,"file":"cluster.js","sourceRoot":"","sources":["../../src/daemon/cluster.ts"],"names":[],"mappings":"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"}
@@ -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 APP_PORT = 8088;
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(clusterId, imageName, domain, deploymentType) {
17
+ async runFromImage(props) {
18
+ const { githubUsername, githubToken, image } = props;
18
19
  try {
19
- log.info('Pulling Docker image', { imageName });
20
- // Pull image
21
- const stream = await docker.pull(imageName);
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
- else
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', { imageName });
58
+ log.info('Image pulled successfully', { image });
31
59
  // Run container
32
- await this.runContainer(imageName, clusterId, domain, deploymentType);
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(imageName, clusterId, domain, deploymentType) {
43
- this.containerName = `anycloud-${clusterId}`;
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
- imageName,
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 ? {} : { [`${APP_PORT}/tcp`]: {} };
82
+ const exposedPorts = isJob ? {} : { [`${DEFAULT_SERVER_PORT}/tcp`]: {} };
54
83
  const portBindings = isJob
55
84
  ? {}
56
- : { [`${APP_PORT}/tcp`]: [{ HostPort: String(APP_PORT) }] };
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: imageName,
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":"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"}
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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"}