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/daemon/server.js
CHANGED
|
@@ -7,17 +7,17 @@ import { log } from './logger.js';
|
|
|
7
7
|
import { generateSelfSignedCert } from './cert.js';
|
|
8
8
|
import { DockerManager } from './docker.js';
|
|
9
9
|
import { MetricsCollector } from './metrics.js';
|
|
10
|
-
import {
|
|
11
|
-
const CONTROL_PORT = 4142;
|
|
10
|
+
import { Coordinator } from './cluster.js';
|
|
11
|
+
export const CONTROL_PORT = 4142;
|
|
12
12
|
let dockerManager;
|
|
13
13
|
let metricsCollector;
|
|
14
14
|
let clusterCoordinator;
|
|
15
15
|
/**
|
|
16
|
-
* Middleware to authenticate requests with
|
|
16
|
+
* Middleware to authenticate requests with deployment secret
|
|
17
17
|
*/
|
|
18
|
-
function authenticateRequest(
|
|
18
|
+
function authenticateRequest(deploymentSecret) {
|
|
19
19
|
return (req, res, next) => {
|
|
20
|
-
const providedSecret = req.headers[
|
|
20
|
+
const providedSecret = req.headers[deploymentSecret.toLowerCase()];
|
|
21
21
|
if (providedSecret !== 'true') {
|
|
22
22
|
log.warn('Unauthorized request', { path: req.path, ip: req.ip });
|
|
23
23
|
return res.status(401).json({ error: 'Unauthorized' });
|
|
@@ -25,18 +25,22 @@ function authenticateRequest(clusterSecret) {
|
|
|
25
25
|
next();
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
|
+
// ============================================================================
|
|
29
|
+
// Application Factory
|
|
30
|
+
// ============================================================================
|
|
28
31
|
/**
|
|
29
|
-
*
|
|
32
|
+
* Creates and configures the Express application.
|
|
33
|
+
* Exported for testability - doesn't start the server.
|
|
30
34
|
*/
|
|
31
|
-
export
|
|
35
|
+
export function createApp(deploymentSecret, conductorUrl) {
|
|
32
36
|
const app = express();
|
|
33
37
|
app.use(express.json({ limit: '100mb' }));
|
|
34
38
|
// Authentication middleware
|
|
35
|
-
app.use(authenticateRequest(
|
|
39
|
+
app.use(authenticateRequest(deploymentSecret));
|
|
36
40
|
// Initialize managers
|
|
37
41
|
dockerManager = new DockerManager();
|
|
38
42
|
metricsCollector = new MetricsCollector();
|
|
39
|
-
clusterCoordinator = new
|
|
43
|
+
clusterCoordinator = new Coordinator(deploymentSecret, conductorUrl);
|
|
40
44
|
/**
|
|
41
45
|
* GET /health
|
|
42
46
|
* Basic health check - is the daemon alive?
|
|
@@ -45,10 +49,10 @@ export async function startServer(clusterSecret, conductorUrl) {
|
|
|
45
49
|
res.json({ status: 'healthy', timestamp: Date.now() });
|
|
46
50
|
});
|
|
47
51
|
/**
|
|
48
|
-
* GET /
|
|
52
|
+
* GET /deploymentHealth
|
|
49
53
|
* Check if the application container is running and healthy
|
|
50
54
|
*/
|
|
51
|
-
app.get('/
|
|
55
|
+
app.get('/deploymentHealth', async (req, res) => {
|
|
52
56
|
try {
|
|
53
57
|
const isHealthy = await dockerManager.isContainerHealthy();
|
|
54
58
|
const metrics = await metricsCollector.collect();
|
|
@@ -69,6 +73,25 @@ export async function startServer(clusterSecret, conductorUrl) {
|
|
|
69
73
|
res.status(500).json({ status: 'error', error: String(error) });
|
|
70
74
|
}
|
|
71
75
|
});
|
|
76
|
+
/**
|
|
77
|
+
* GET /logs
|
|
78
|
+
* Get Docker container logs
|
|
79
|
+
*/
|
|
80
|
+
app.get('/logs', async (req, res) => {
|
|
81
|
+
try {
|
|
82
|
+
const tail = req.query.tail ? parseInt(req.query.tail) : 100;
|
|
83
|
+
log.info('Fetching container logs', { tail });
|
|
84
|
+
const logs = await dockerManager.getLogs(tail);
|
|
85
|
+
res.json(logs);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
log.error('Failed to fetch logs', error);
|
|
89
|
+
const errorResponse = {
|
|
90
|
+
error: error instanceof Error ? error.message : String(error),
|
|
91
|
+
};
|
|
92
|
+
res.status(500).json(errorResponse);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
72
95
|
/**
|
|
73
96
|
* POST /start
|
|
74
97
|
* Receive deployment configuration and start the container
|
|
@@ -77,21 +100,24 @@ export async function startServer(clusterSecret, conductorUrl) {
|
|
|
77
100
|
try {
|
|
78
101
|
const props = req.body;
|
|
79
102
|
log.info('Received start command', {
|
|
80
|
-
|
|
103
|
+
id: props.id,
|
|
81
104
|
image: props.image,
|
|
82
105
|
});
|
|
83
106
|
if (!props.image) {
|
|
84
107
|
throw new Error('Image parameter is required');
|
|
85
108
|
}
|
|
86
109
|
// Pull and run container from image
|
|
87
|
-
await dockerManager.runFromImage(props
|
|
88
|
-
// Start
|
|
110
|
+
await dockerManager.runFromImage(props);
|
|
111
|
+
// Start deployment coordination (metrics, scaling, etc.)
|
|
89
112
|
await clusterCoordinator.start(props);
|
|
90
|
-
res.
|
|
113
|
+
res.sendStatus(200);
|
|
91
114
|
}
|
|
92
115
|
catch (error) {
|
|
93
116
|
log.error('Failed to start', error);
|
|
94
|
-
|
|
117
|
+
const errorResponse = {
|
|
118
|
+
error: error instanceof Error ? error.message : String(error),
|
|
119
|
+
};
|
|
120
|
+
res.status(500).json(errorResponse);
|
|
95
121
|
}
|
|
96
122
|
});
|
|
97
123
|
/**
|
|
@@ -101,10 +127,82 @@ export async function startServer(clusterSecret, conductorUrl) {
|
|
|
101
127
|
log.error('Unhandled error', err);
|
|
102
128
|
res.status(500).json({ error: err.message });
|
|
103
129
|
});
|
|
130
|
+
return app;
|
|
131
|
+
}
|
|
132
|
+
// ============================================================================
|
|
133
|
+
// Process-Level Error Handlers
|
|
134
|
+
// ============================================================================
|
|
135
|
+
/**
|
|
136
|
+
* Sets up process-level error handlers for graceful degradation.
|
|
137
|
+
* Exported for testability.
|
|
138
|
+
*/
|
|
139
|
+
export function setupProcessHandlers() {
|
|
140
|
+
// Process-level error handlers to prevent crashes
|
|
141
|
+
process.on('uncaughtException', (error) => {
|
|
142
|
+
log.error('Uncaught exception - shutting down gracefully', {
|
|
143
|
+
error: error.message,
|
|
144
|
+
stack: error.stack,
|
|
145
|
+
});
|
|
146
|
+
// For uncaught exceptions, we should exit as the process is in an unknown state
|
|
147
|
+
// Give time for logs to flush
|
|
148
|
+
setTimeout(() => {
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}, 1000);
|
|
151
|
+
});
|
|
152
|
+
process.on('unhandledRejection', (reason) => {
|
|
153
|
+
log.warn('Unhandled promise rejection', {
|
|
154
|
+
reason: String(reason),
|
|
155
|
+
});
|
|
156
|
+
// Log but don't exit - might be a background task
|
|
157
|
+
// Note: Future Node.js versions will exit on unhandled rejections
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// ============================================================================
|
|
161
|
+
// Cluster Coordinator Access
|
|
162
|
+
// ============================================================================
|
|
163
|
+
/**
|
|
164
|
+
* Get the cluster coordinator instance.
|
|
165
|
+
* Exported for shutdown sequence.
|
|
166
|
+
*/
|
|
167
|
+
export function getCoordinator() {
|
|
168
|
+
return clusterCoordinator;
|
|
169
|
+
}
|
|
170
|
+
// ============================================================================
|
|
171
|
+
// Server Startup
|
|
172
|
+
// ============================================================================
|
|
173
|
+
/**
|
|
174
|
+
* Start the daemon HTTPS server.
|
|
175
|
+
* Used by CLI for backwards compatibility.
|
|
176
|
+
*/
|
|
177
|
+
export async function startServer(deploymentSecret, conductorUrl) {
|
|
178
|
+
// Setup process handlers first
|
|
179
|
+
setupProcessHandlers();
|
|
180
|
+
const app = createApp(deploymentSecret, conductorUrl);
|
|
104
181
|
// Generate self-signed SSL certificate
|
|
105
182
|
const { cert, key } = generateSelfSignedCert();
|
|
106
183
|
// Start HTTPS server
|
|
107
184
|
const server = https.createServer({ cert, key }, app);
|
|
185
|
+
// Graceful shutdown handlers
|
|
186
|
+
const shutdown = async () => {
|
|
187
|
+
log.info('Shutdown signal received, shutting down gracefully');
|
|
188
|
+
// Stop coordinator intervals
|
|
189
|
+
const coordinator = getCoordinator();
|
|
190
|
+
if (coordinator) {
|
|
191
|
+
await coordinator.stop();
|
|
192
|
+
}
|
|
193
|
+
// Close server
|
|
194
|
+
server.close(() => {
|
|
195
|
+
log.info('HTTPS server closed');
|
|
196
|
+
process.exit(0);
|
|
197
|
+
});
|
|
198
|
+
// Force exit if graceful shutdown takes too long
|
|
199
|
+
setTimeout(() => {
|
|
200
|
+
log.error('Graceful shutdown timed out, forcing exit');
|
|
201
|
+
process.exit(1);
|
|
202
|
+
}, 10000);
|
|
203
|
+
};
|
|
204
|
+
process.on('SIGTERM', shutdown);
|
|
205
|
+
process.on('SIGINT', shutdown);
|
|
108
206
|
await new Promise((resolve) => {
|
|
109
207
|
server.listen(CONTROL_PORT, () => {
|
|
110
208
|
log.info(`Daemon control port listening on https://0.0.0.0:${CONTROL_PORT}`);
|
|
@@ -112,4 +210,18 @@ export async function startServer(clusterSecret, conductorUrl) {
|
|
|
112
210
|
});
|
|
113
211
|
});
|
|
114
212
|
}
|
|
213
|
+
// ============================================================================
|
|
214
|
+
// Server Startup (only when run directly)
|
|
215
|
+
// ============================================================================
|
|
216
|
+
// Only start server if this file is run directly (not imported)
|
|
217
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
218
|
+
// Parse command line arguments
|
|
219
|
+
const deploymentSecret = process.argv[2];
|
|
220
|
+
const conductorUrl = process.argv[3];
|
|
221
|
+
if (!deploymentSecret || !conductorUrl) {
|
|
222
|
+
console.error('Usage: node server.js <deploymentSecret> <conductorUrl>');
|
|
223
|
+
process.exit(1);
|
|
224
|
+
}
|
|
225
|
+
await startServer(deploymentSecret, conductorUrl);
|
|
226
|
+
}
|
|
115
227
|
//# sourceMappingURL=server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,OAA4C,MAAM,SAAS,CAAC;AACnE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
|