@kadi.build/deploy-ability 0.0.1
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/README.md +523 -0
- package/dist/constants.d.ts +82 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +82 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors/certificate-error.d.ts +95 -0
- package/dist/errors/certificate-error.d.ts.map +1 -0
- package/dist/errors/certificate-error.js +111 -0
- package/dist/errors/certificate-error.js.map +1 -0
- package/dist/errors/deployment-error.d.ts +122 -0
- package/dist/errors/deployment-error.d.ts.map +1 -0
- package/dist/errors/deployment-error.js +185 -0
- package/dist/errors/deployment-error.js.map +1 -0
- package/dist/errors/index.d.ts +13 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +18 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/profile-error.d.ts +106 -0
- package/dist/errors/profile-error.d.ts.map +1 -0
- package/dist/errors/profile-error.js +127 -0
- package/dist/errors/profile-error.js.map +1 -0
- package/dist/errors/provider-error.d.ts +104 -0
- package/dist/errors/provider-error.d.ts.map +1 -0
- package/dist/errors/provider-error.js +120 -0
- package/dist/errors/provider-error.js.map +1 -0
- package/dist/errors/wallet-error.d.ts +131 -0
- package/dist/errors/wallet-error.d.ts.map +1 -0
- package/dist/errors/wallet-error.js +154 -0
- package/dist/errors/wallet-error.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/targets/akash/bid-selectors.d.ts +251 -0
- package/dist/targets/akash/bid-selectors.d.ts.map +1 -0
- package/dist/targets/akash/bid-selectors.js +322 -0
- package/dist/targets/akash/bid-selectors.js.map +1 -0
- package/dist/targets/akash/bid-types.d.ts +297 -0
- package/dist/targets/akash/bid-types.d.ts.map +1 -0
- package/dist/targets/akash/bid-types.js +89 -0
- package/dist/targets/akash/bid-types.js.map +1 -0
- package/dist/targets/akash/blockchain-client.d.ts +577 -0
- package/dist/targets/akash/blockchain-client.d.ts.map +1 -0
- package/dist/targets/akash/blockchain-client.js +803 -0
- package/dist/targets/akash/blockchain-client.js.map +1 -0
- package/dist/targets/akash/certificate-manager.d.ts +228 -0
- package/dist/targets/akash/certificate-manager.d.ts.map +1 -0
- package/dist/targets/akash/certificate-manager.js +395 -0
- package/dist/targets/akash/certificate-manager.js.map +1 -0
- package/dist/targets/akash/constants.d.ts +231 -0
- package/dist/targets/akash/constants.d.ts.map +1 -0
- package/dist/targets/akash/constants.js +225 -0
- package/dist/targets/akash/constants.js.map +1 -0
- package/dist/targets/akash/deployer.d.ts +136 -0
- package/dist/targets/akash/deployer.d.ts.map +1 -0
- package/dist/targets/akash/deployer.js +599 -0
- package/dist/targets/akash/deployer.js.map +1 -0
- package/dist/targets/akash/environment.d.ts +241 -0
- package/dist/targets/akash/environment.d.ts.map +1 -0
- package/dist/targets/akash/environment.js +245 -0
- package/dist/targets/akash/environment.js.map +1 -0
- package/dist/targets/akash/index.d.ts +1113 -0
- package/dist/targets/akash/index.d.ts.map +1 -0
- package/dist/targets/akash/index.js +909 -0
- package/dist/targets/akash/index.js.map +1 -0
- package/dist/targets/akash/lease-monitor.d.ts +51 -0
- package/dist/targets/akash/lease-monitor.d.ts.map +1 -0
- package/dist/targets/akash/lease-monitor.js +110 -0
- package/dist/targets/akash/lease-monitor.js.map +1 -0
- package/dist/targets/akash/logs.d.ts +71 -0
- package/dist/targets/akash/logs.d.ts.map +1 -0
- package/dist/targets/akash/logs.js +311 -0
- package/dist/targets/akash/logs.js.map +1 -0
- package/dist/targets/akash/logs.types.d.ts +102 -0
- package/dist/targets/akash/logs.types.d.ts.map +1 -0
- package/dist/targets/akash/logs.types.js +9 -0
- package/dist/targets/akash/logs.types.js.map +1 -0
- package/dist/targets/akash/pricing.d.ts +247 -0
- package/dist/targets/akash/pricing.d.ts.map +1 -0
- package/dist/targets/akash/pricing.js +246 -0
- package/dist/targets/akash/pricing.js.map +1 -0
- package/dist/targets/akash/provider-client.d.ts +114 -0
- package/dist/targets/akash/provider-client.d.ts.map +1 -0
- package/dist/targets/akash/provider-client.js +318 -0
- package/dist/targets/akash/provider-client.js.map +1 -0
- package/dist/targets/akash/provider-metadata.d.ts +228 -0
- package/dist/targets/akash/provider-metadata.d.ts.map +1 -0
- package/dist/targets/akash/provider-metadata.js +14 -0
- package/dist/targets/akash/provider-metadata.js.map +1 -0
- package/dist/targets/akash/provider-service.d.ts +133 -0
- package/dist/targets/akash/provider-service.d.ts.map +1 -0
- package/dist/targets/akash/provider-service.js +391 -0
- package/dist/targets/akash/provider-service.js.map +1 -0
- package/dist/targets/akash/query-client.d.ts +125 -0
- package/dist/targets/akash/query-client.d.ts.map +1 -0
- package/dist/targets/akash/query-client.js +332 -0
- package/dist/targets/akash/query-client.js.map +1 -0
- package/dist/targets/akash/sdl-generator.d.ts +31 -0
- package/dist/targets/akash/sdl-generator.d.ts.map +1 -0
- package/dist/targets/akash/sdl-generator.js +279 -0
- package/dist/targets/akash/sdl-generator.js.map +1 -0
- package/dist/targets/akash/types.d.ts +285 -0
- package/dist/targets/akash/types.d.ts.map +1 -0
- package/dist/targets/akash/types.js +54 -0
- package/dist/targets/akash/types.js.map +1 -0
- package/dist/targets/akash/wallet-manager.d.ts +526 -0
- package/dist/targets/akash/wallet-manager.d.ts.map +1 -0
- package/dist/targets/akash/wallet-manager.js +953 -0
- package/dist/targets/akash/wallet-manager.js.map +1 -0
- package/dist/targets/local/compose-generator.d.ts +244 -0
- package/dist/targets/local/compose-generator.d.ts.map +1 -0
- package/dist/targets/local/compose-generator.js +324 -0
- package/dist/targets/local/compose-generator.js.map +1 -0
- package/dist/targets/local/deployer.d.ts +82 -0
- package/dist/targets/local/deployer.d.ts.map +1 -0
- package/dist/targets/local/deployer.js +367 -0
- package/dist/targets/local/deployer.js.map +1 -0
- package/dist/targets/local/engine-manager.d.ts +155 -0
- package/dist/targets/local/engine-manager.d.ts.map +1 -0
- package/dist/targets/local/engine-manager.js +250 -0
- package/dist/targets/local/engine-manager.js.map +1 -0
- package/dist/targets/local/index.d.ts +40 -0
- package/dist/targets/local/index.d.ts.map +1 -0
- package/dist/targets/local/index.js +43 -0
- package/dist/targets/local/index.js.map +1 -0
- package/dist/targets/local/network-manager.d.ts +160 -0
- package/dist/targets/local/network-manager.d.ts.map +1 -0
- package/dist/targets/local/network-manager.js +337 -0
- package/dist/targets/local/network-manager.js.map +1 -0
- package/dist/targets/local/types.d.ts +327 -0
- package/dist/targets/local/types.d.ts.map +1 -0
- package/dist/targets/local/types.js +9 -0
- package/dist/targets/local/types.js.map +1 -0
- package/dist/types/common.d.ts +585 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +13 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/options.d.ts +329 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +10 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/profiles.d.ts +329 -0
- package/dist/types/profiles.d.ts.map +1 -0
- package/dist/types/profiles.js +27 -0
- package/dist/types/profiles.js.map +1 -0
- package/dist/types/results.d.ts +443 -0
- package/dist/types/results.d.ts.map +1 -0
- package/dist/types/results.js +64 -0
- package/dist/types/results.js.map +1 -0
- package/dist/types/validators.d.ts +118 -0
- package/dist/types/validators.d.ts.map +1 -0
- package/dist/types/validators.js +198 -0
- package/dist/types/validators.js.map +1 -0
- package/dist/utils/command-runner.d.ts +128 -0
- package/dist/utils/command-runner.d.ts.map +1 -0
- package/dist/utils/command-runner.js +210 -0
- package/dist/utils/command-runner.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +68 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +93 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/profile-loader.d.ts +76 -0
- package/dist/utils/profile-loader.d.ts.map +1 -0
- package/dist/utils/profile-loader.js +194 -0
- package/dist/utils/profile-loader.js.map +1 -0
- package/dist/utils/registry/index.d.ts +27 -0
- package/dist/utils/registry/index.d.ts.map +1 -0
- package/dist/utils/registry/index.js +29 -0
- package/dist/utils/registry/index.js.map +1 -0
- package/dist/utils/registry/manager.d.ts +319 -0
- package/dist/utils/registry/manager.d.ts.map +1 -0
- package/dist/utils/registry/manager.js +671 -0
- package/dist/utils/registry/manager.js.map +1 -0
- package/dist/utils/registry/setup.d.ts +135 -0
- package/dist/utils/registry/setup.d.ts.map +1 -0
- package/dist/utils/registry/setup.js +207 -0
- package/dist/utils/registry/setup.js.map +1 -0
- package/dist/utils/registry/transformer.d.ts +92 -0
- package/dist/utils/registry/transformer.d.ts.map +1 -0
- package/dist/utils/registry/transformer.js +131 -0
- package/dist/utils/registry/transformer.js.map +1 -0
- package/dist/utils/registry/types.d.ts +241 -0
- package/dist/utils/registry/types.d.ts.map +1 -0
- package/dist/utils/registry/types.js +10 -0
- package/dist/utils/registry/types.js.map +1 -0
- package/docs/EXAMPLES.md +293 -0
- package/docs/PLACEMENT.md +433 -0
- package/docs/STORAGE.md +318 -0
- package/docs/building-provider-reliability-tracker.md +2581 -0
- package/package.json +109 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Deployment Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Main orchestration logic for local Docker/Podman deployments.
|
|
5
|
+
* Coordinates engine management, network setup, compose generation,
|
|
6
|
+
* and container orchestration.
|
|
7
|
+
*
|
|
8
|
+
* This module ties together all the local deployment components:
|
|
9
|
+
* - Engine verification and startup
|
|
10
|
+
* - Network creation
|
|
11
|
+
* - Compose file generation
|
|
12
|
+
* - Container deployment
|
|
13
|
+
*
|
|
14
|
+
* @module targets/local/deployer
|
|
15
|
+
*/
|
|
16
|
+
import { type LocalDeploymentOptions, type LocalDeploymentResult } from '../../types/index.js';
|
|
17
|
+
/**
|
|
18
|
+
* Performs a local deployment using Docker or Podman Compose
|
|
19
|
+
*
|
|
20
|
+
* This is the main orchestration function that executes a complete
|
|
21
|
+
* local deployment workflow:
|
|
22
|
+
*
|
|
23
|
+
* 1. **Profile Loading** - Load and validate deployment profile from agent.json
|
|
24
|
+
* 2. **Engine Verification** - Ensure container engine is running (auto-start Podman if needed)
|
|
25
|
+
* 3. **Network Setup** - Create required Docker network for inter-service communication
|
|
26
|
+
* 4. **Compose Generation** - Generate docker-compose.yml from service configurations
|
|
27
|
+
* 5. **File Writing** - Write compose file to disk
|
|
28
|
+
* 6. **Container Deployment** - Execute `docker compose up -d` to start services
|
|
29
|
+
*
|
|
30
|
+
* **Dry Run Mode:**
|
|
31
|
+
* When `dryRun: true` is set, all validation and generation steps are performed,
|
|
32
|
+
* but no actual deployment occurs. The generated compose file is returned in the
|
|
33
|
+
* result for inspection.
|
|
34
|
+
*
|
|
35
|
+
* **Progress Tracking:**
|
|
36
|
+
* Provide an `onProgress` callback to receive real-time updates about deployment
|
|
37
|
+
* progress. Events include phase, message, and optional metadata.
|
|
38
|
+
*
|
|
39
|
+
* @param options - Local deployment options
|
|
40
|
+
* @returns Result with deployment information or error
|
|
41
|
+
*
|
|
42
|
+
* @example Basic Usage
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const result = await deployLocal({
|
|
45
|
+
* projectRoot: '/path/to/project',
|
|
46
|
+
* profile: 'local-dev'
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
* if (result.success) {
|
|
50
|
+
* console.log('Deployed services:', result.data.services);
|
|
51
|
+
* console.log('Endpoints:', result.data.endpoints);
|
|
52
|
+
* } else {
|
|
53
|
+
* console.error('Deployment failed:', result.error.getUserMessage());
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @example With Progress Tracking
|
|
58
|
+
* ```typescript
|
|
59
|
+
* const result = await deployLocal({
|
|
60
|
+
* projectRoot: process.cwd(),
|
|
61
|
+
* profile: 'production-local',
|
|
62
|
+
* onProgress: (event) => {
|
|
63
|
+
* console.log(`[${event.phase}] ${event.message}`);
|
|
64
|
+
* }
|
|
65
|
+
* });
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* @example Dry Run
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const result = await deployLocal({
|
|
71
|
+
* projectRoot: process.cwd(),
|
|
72
|
+
* dryRun: true
|
|
73
|
+
* });
|
|
74
|
+
*
|
|
75
|
+
* if (result.success) {
|
|
76
|
+
* console.log('Generated compose file:');
|
|
77
|
+
* console.log(result.data.composeFile);
|
|
78
|
+
* }
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export declare function deployLocal(options: LocalDeploymentOptions): Promise<LocalDeploymentResult>;
|
|
82
|
+
//# sourceMappingURL=deployer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployer.d.ts","sourceRoot":"","sources":["../../../src/targets/local/deployer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,sBAAsB,CAAC;AAqF9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CA0UhC"}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Deployment Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Main orchestration logic for local Docker/Podman deployments.
|
|
5
|
+
* Coordinates engine management, network setup, compose generation,
|
|
6
|
+
* and container orchestration.
|
|
7
|
+
*
|
|
8
|
+
* This module ties together all the local deployment components:
|
|
9
|
+
* - Engine verification and startup
|
|
10
|
+
* - Network creation
|
|
11
|
+
* - Compose file generation
|
|
12
|
+
* - Container deployment
|
|
13
|
+
*
|
|
14
|
+
* @module targets/local/deployer
|
|
15
|
+
*/
|
|
16
|
+
import debug from 'debug';
|
|
17
|
+
import fs from 'node:fs/promises';
|
|
18
|
+
import path from 'node:path';
|
|
19
|
+
import { success, failure, } from '../../types/index.js';
|
|
20
|
+
import { DeploymentError } from '../../errors/index.js';
|
|
21
|
+
import { loadProfile } from '../../utils/profile-loader.js';
|
|
22
|
+
import { runCommand } from '../../utils/command-runner.js';
|
|
23
|
+
import { ensureEngineRunning } from './engine-manager.js';
|
|
24
|
+
import { ensureNetwork } from './network-manager.js';
|
|
25
|
+
import { generateComposeYAML, } from './compose-generator.js';
|
|
26
|
+
/**
|
|
27
|
+
* Debug logger for deployment orchestration
|
|
28
|
+
*/
|
|
29
|
+
const log = debug('deploy-ability:local:deploy');
|
|
30
|
+
/**
|
|
31
|
+
* Default network name for KADI deployments
|
|
32
|
+
*/
|
|
33
|
+
const DEFAULT_NETWORK = 'kadi-net';
|
|
34
|
+
/**
|
|
35
|
+
* Default compose file name
|
|
36
|
+
*/
|
|
37
|
+
const DEFAULT_COMPOSE_FILE = 'docker-compose.yml';
|
|
38
|
+
/**
|
|
39
|
+
* Maps local deployment phase to general deployment phase
|
|
40
|
+
*
|
|
41
|
+
* @param phase - Local deployment phase
|
|
42
|
+
* @returns General deployment phase
|
|
43
|
+
*
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
function mapLocalPhaseToDeploymentPhase(phase) {
|
|
47
|
+
switch (phase) {
|
|
48
|
+
case 'profile':
|
|
49
|
+
return 'loading-profile';
|
|
50
|
+
case 'engine':
|
|
51
|
+
case 'network':
|
|
52
|
+
return 'initializing';
|
|
53
|
+
case 'compose':
|
|
54
|
+
case 'deploy':
|
|
55
|
+
return 'creating-deployment';
|
|
56
|
+
case 'complete':
|
|
57
|
+
return 'completed';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Emits a progress event if onProgress callback is provided
|
|
62
|
+
*
|
|
63
|
+
* Converts local deployment phases to general deployment phases
|
|
64
|
+
* for compatibility with the common progress callback interface.
|
|
65
|
+
*
|
|
66
|
+
* @param options - Deployment options
|
|
67
|
+
* @param phase - Local deployment phase
|
|
68
|
+
* @param message - Progress message
|
|
69
|
+
* @param progress - Optional progress percentage (0-100)
|
|
70
|
+
*
|
|
71
|
+
* @internal
|
|
72
|
+
*/
|
|
73
|
+
function emitProgress(options, phase, message, progress) {
|
|
74
|
+
if (options.onProgress) {
|
|
75
|
+
log('Progress: %s - %s', phase, message);
|
|
76
|
+
options.onProgress({
|
|
77
|
+
phase: mapLocalPhaseToDeploymentPhase(phase),
|
|
78
|
+
message,
|
|
79
|
+
progress,
|
|
80
|
+
data: {
|
|
81
|
+
localPhase: phase,
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Performs a local deployment using Docker or Podman Compose
|
|
88
|
+
*
|
|
89
|
+
* This is the main orchestration function that executes a complete
|
|
90
|
+
* local deployment workflow:
|
|
91
|
+
*
|
|
92
|
+
* 1. **Profile Loading** - Load and validate deployment profile from agent.json
|
|
93
|
+
* 2. **Engine Verification** - Ensure container engine is running (auto-start Podman if needed)
|
|
94
|
+
* 3. **Network Setup** - Create required Docker network for inter-service communication
|
|
95
|
+
* 4. **Compose Generation** - Generate docker-compose.yml from service configurations
|
|
96
|
+
* 5. **File Writing** - Write compose file to disk
|
|
97
|
+
* 6. **Container Deployment** - Execute `docker compose up -d` to start services
|
|
98
|
+
*
|
|
99
|
+
* **Dry Run Mode:**
|
|
100
|
+
* When `dryRun: true` is set, all validation and generation steps are performed,
|
|
101
|
+
* but no actual deployment occurs. The generated compose file is returned in the
|
|
102
|
+
* result for inspection.
|
|
103
|
+
*
|
|
104
|
+
* **Progress Tracking:**
|
|
105
|
+
* Provide an `onProgress` callback to receive real-time updates about deployment
|
|
106
|
+
* progress. Events include phase, message, and optional metadata.
|
|
107
|
+
*
|
|
108
|
+
* @param options - Local deployment options
|
|
109
|
+
* @returns Result with deployment information or error
|
|
110
|
+
*
|
|
111
|
+
* @example Basic Usage
|
|
112
|
+
* ```typescript
|
|
113
|
+
* const result = await deployLocal({
|
|
114
|
+
* projectRoot: '/path/to/project',
|
|
115
|
+
* profile: 'local-dev'
|
|
116
|
+
* });
|
|
117
|
+
*
|
|
118
|
+
* if (result.success) {
|
|
119
|
+
* console.log('Deployed services:', result.data.services);
|
|
120
|
+
* console.log('Endpoints:', result.data.endpoints);
|
|
121
|
+
* } else {
|
|
122
|
+
* console.error('Deployment failed:', result.error.getUserMessage());
|
|
123
|
+
* }
|
|
124
|
+
* ```
|
|
125
|
+
*
|
|
126
|
+
* @example With Progress Tracking
|
|
127
|
+
* ```typescript
|
|
128
|
+
* const result = await deployLocal({
|
|
129
|
+
* projectRoot: process.cwd(),
|
|
130
|
+
* profile: 'production-local',
|
|
131
|
+
* onProgress: (event) => {
|
|
132
|
+
* console.log(`[${event.phase}] ${event.message}`);
|
|
133
|
+
* }
|
|
134
|
+
* });
|
|
135
|
+
* ```
|
|
136
|
+
*
|
|
137
|
+
* @example Dry Run
|
|
138
|
+
* ```typescript
|
|
139
|
+
* const result = await deployLocal({
|
|
140
|
+
* projectRoot: process.cwd(),
|
|
141
|
+
* dryRun: true
|
|
142
|
+
* });
|
|
143
|
+
*
|
|
144
|
+
* if (result.success) {
|
|
145
|
+
* console.log('Generated compose file:');
|
|
146
|
+
* console.log(result.data.composeFile);
|
|
147
|
+
* }
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
export async function deployLocal(options) {
|
|
151
|
+
const { projectRoot, profile: profileName, engine: engineOverride, network: networkOverride, composeOutputPath: composePathOverride, dryRun = false, verbose = false, logger, } = options;
|
|
152
|
+
log('Starting local deployment');
|
|
153
|
+
log('Project root: %s', projectRoot);
|
|
154
|
+
log('Profile: %s', profileName || '(default)');
|
|
155
|
+
log('Dry run: %s', dryRun);
|
|
156
|
+
// -------------------------------------------------------------------------
|
|
157
|
+
// Phase 1: Load and validate deployment profile
|
|
158
|
+
// -------------------------------------------------------------------------
|
|
159
|
+
emitProgress(options, 'profile', 'Loading deployment profile');
|
|
160
|
+
let loadedProfile;
|
|
161
|
+
try {
|
|
162
|
+
loadedProfile = await loadProfile(projectRoot, profileName, logger);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
log('Profile loading failed: %s', error.message);
|
|
166
|
+
return failure(new DeploymentError(`Failed to load deployment profile: ${error.message}`, 'PROFILE_LOAD_ERROR', {
|
|
167
|
+
projectRoot,
|
|
168
|
+
profileName,
|
|
169
|
+
error: error.message,
|
|
170
|
+
}, true, 'Check that agent.json exists and has valid deploy configuration', 'error', error));
|
|
171
|
+
}
|
|
172
|
+
const { name: selectedProfileName, profile } = loadedProfile;
|
|
173
|
+
// Validate this is a local profile
|
|
174
|
+
if (profile.target !== 'local') {
|
|
175
|
+
log('Profile is not a local target: %s', profile.target);
|
|
176
|
+
return failure(new DeploymentError(`Profile "${selectedProfileName}" is not a local deployment profile (target: "${profile.target}")`, 'PROFILE_INVALID', {
|
|
177
|
+
profileName: selectedProfileName,
|
|
178
|
+
target: profile.target,
|
|
179
|
+
}, true, 'Select a profile with target: "local"', 'error'));
|
|
180
|
+
}
|
|
181
|
+
// Extract configuration with overrides
|
|
182
|
+
const engine = engineOverride ?? profile.engine ?? 'docker';
|
|
183
|
+
const networkName = networkOverride ?? profile.network ?? DEFAULT_NETWORK;
|
|
184
|
+
const composePath = composePathOverride ?? path.join(projectRoot, DEFAULT_COMPOSE_FILE);
|
|
185
|
+
log('Configuration: engine=%s network=%s', engine, networkName);
|
|
186
|
+
const serviceNames = Object.keys(profile.services);
|
|
187
|
+
log('Services to deploy: %s', serviceNames.join(', '));
|
|
188
|
+
// -------------------------------------------------------------------------
|
|
189
|
+
// Phase 2: Dry run - preview without executing
|
|
190
|
+
// -------------------------------------------------------------------------
|
|
191
|
+
if (dryRun) {
|
|
192
|
+
log('Dry run mode - generating preview');
|
|
193
|
+
emitProgress(options, 'compose', 'Generating compose file (dry run)');
|
|
194
|
+
const composeResult = generateComposeYAML(profile.services, {
|
|
195
|
+
networkName,
|
|
196
|
+
containerPrefix: 'kadi',
|
|
197
|
+
});
|
|
198
|
+
if (!composeResult.success) {
|
|
199
|
+
log('Compose generation failed: %s', composeResult.error.message);
|
|
200
|
+
return failure(composeResult.error);
|
|
201
|
+
}
|
|
202
|
+
log('Dry run complete - returning preview data');
|
|
203
|
+
return success({
|
|
204
|
+
dryRun: true,
|
|
205
|
+
profile: selectedProfileName,
|
|
206
|
+
engine,
|
|
207
|
+
services: serviceNames,
|
|
208
|
+
composeFile: composeResult.data,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
// -------------------------------------------------------------------------
|
|
212
|
+
// Phase 3: Ensure container engine is running
|
|
213
|
+
// -------------------------------------------------------------------------
|
|
214
|
+
emitProgress(options, 'engine', `Ensuring ${engine} is running`);
|
|
215
|
+
const engineResult = await ensureEngineRunning(engine, {
|
|
216
|
+
timeout: 60_000,
|
|
217
|
+
autoStart: true,
|
|
218
|
+
});
|
|
219
|
+
if (!engineResult.success) {
|
|
220
|
+
log('Engine check failed: %s', engineResult.error.message);
|
|
221
|
+
logger?.error(`❌ ${engine} is not available`);
|
|
222
|
+
return failure(engineResult.error);
|
|
223
|
+
}
|
|
224
|
+
log('Engine ready (autoStarted=%s)', engineResult.data.autoStarted);
|
|
225
|
+
// -------------------------------------------------------------------------
|
|
226
|
+
// Phase 4: Create or verify network
|
|
227
|
+
// -------------------------------------------------------------------------
|
|
228
|
+
emitProgress(options, 'network', `Setting up network: ${networkName}`);
|
|
229
|
+
const networkResult = await ensureNetwork(engine, networkName, {
|
|
230
|
+
timeout: 30_000,
|
|
231
|
+
driver: 'bridge',
|
|
232
|
+
});
|
|
233
|
+
if (!networkResult.success) {
|
|
234
|
+
log('Network setup failed: %s', networkResult.error.message);
|
|
235
|
+
logger?.error(`❌ Failed to create network ${networkName}`);
|
|
236
|
+
return failure(networkResult.error);
|
|
237
|
+
}
|
|
238
|
+
log('Network ready (preexisting=%s)', networkResult.data.preexisting);
|
|
239
|
+
// -------------------------------------------------------------------------
|
|
240
|
+
// Phase 5: Generate Docker Compose file
|
|
241
|
+
// -------------------------------------------------------------------------
|
|
242
|
+
emitProgress(options, 'compose', 'Generating docker-compose.yml');
|
|
243
|
+
const composeOptions = {
|
|
244
|
+
version: '3.9',
|
|
245
|
+
networkName,
|
|
246
|
+
containerPrefix: 'kadi',
|
|
247
|
+
tty: true,
|
|
248
|
+
stdinOpen: true,
|
|
249
|
+
};
|
|
250
|
+
const composeResult = generateComposeYAML(profile.services, composeOptions);
|
|
251
|
+
if (!composeResult.success) {
|
|
252
|
+
log('Compose generation failed: %s', composeResult.error.message);
|
|
253
|
+
logger?.error('❌ Failed to generate docker-compose.yml');
|
|
254
|
+
return failure(composeResult.error);
|
|
255
|
+
}
|
|
256
|
+
log('Compose file generated: %d bytes', composeResult.data.length);
|
|
257
|
+
// -------------------------------------------------------------------------
|
|
258
|
+
// Phase 6: Write compose file to disk
|
|
259
|
+
// -------------------------------------------------------------------------
|
|
260
|
+
emitProgress(options, 'compose', `Writing compose file to ${composePath}`);
|
|
261
|
+
try {
|
|
262
|
+
await fs.writeFile(composePath, composeResult.data, 'utf8');
|
|
263
|
+
log('Compose file written to: %s', composePath);
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
log('Failed to write compose file: %s', error.message);
|
|
267
|
+
return failure(new DeploymentError(`Failed to write docker-compose.yml to ${composePath}`, 'FILE_WRITE_ERROR', {
|
|
268
|
+
path: composePath,
|
|
269
|
+
error: error.message,
|
|
270
|
+
}, true, 'Check file permissions and disk space', 'error', error));
|
|
271
|
+
}
|
|
272
|
+
// -------------------------------------------------------------------------
|
|
273
|
+
// Phase 7: Deploy services with docker compose
|
|
274
|
+
// -------------------------------------------------------------------------
|
|
275
|
+
emitProgress(options, 'deploy', 'Starting services');
|
|
276
|
+
// Use -d flag for detached mode (background)
|
|
277
|
+
const composeUpCommand = `${engine} compose up -d`;
|
|
278
|
+
log('Executing: %s', composeUpCommand);
|
|
279
|
+
const deployResult = await runCommand(composeUpCommand, {
|
|
280
|
+
cwd: projectRoot,
|
|
281
|
+
timeout: 300_000, // 5 minutes for container pulls
|
|
282
|
+
silent: !verbose,
|
|
283
|
+
});
|
|
284
|
+
if (!deployResult.success) {
|
|
285
|
+
log('Deployment failed: %s', deployResult.error.message);
|
|
286
|
+
logger?.error('❌ Deployment failed');
|
|
287
|
+
return failure(new DeploymentError('Failed to start services with docker compose', 'COMPOSE_UP_FAILED', {
|
|
288
|
+
engine,
|
|
289
|
+
command: composeUpCommand,
|
|
290
|
+
error: deployResult.error.message,
|
|
291
|
+
exitCode: deployResult.error.context.exitCode,
|
|
292
|
+
}, true, 'Check docker compose output for errors, ensure images exist', 'error', deployResult.error));
|
|
293
|
+
}
|
|
294
|
+
log('Deployment completed successfully');
|
|
295
|
+
// -------------------------------------------------------------------------
|
|
296
|
+
// Phase 8: Extract container information
|
|
297
|
+
// -------------------------------------------------------------------------
|
|
298
|
+
emitProgress(options, 'complete', 'Getting container information');
|
|
299
|
+
// Get container IDs from docker compose ps
|
|
300
|
+
const psCommand = `${engine} compose ps --quiet`;
|
|
301
|
+
log('Getting container IDs: %s', psCommand);
|
|
302
|
+
const psResult = await runCommand(psCommand, {
|
|
303
|
+
cwd: projectRoot,
|
|
304
|
+
timeout: 30_000,
|
|
305
|
+
silent: true,
|
|
306
|
+
});
|
|
307
|
+
const containersMap = {};
|
|
308
|
+
if (psResult.success) {
|
|
309
|
+
const containerIds = psResult.data.stdout.trim().split('\n').filter(id => id);
|
|
310
|
+
log('Found %d containers', containerIds.length);
|
|
311
|
+
// Map container IDs to service names
|
|
312
|
+
// Get full container info to match names
|
|
313
|
+
for (const containerId of containerIds) {
|
|
314
|
+
const inspectCmd = `${engine} inspect ${containerId} --format '{{.Name}}'`;
|
|
315
|
+
const inspectResult = await runCommand(inspectCmd, {
|
|
316
|
+
timeout: 10_000,
|
|
317
|
+
silent: true,
|
|
318
|
+
});
|
|
319
|
+
if (inspectResult.success) {
|
|
320
|
+
const containerName = inspectResult.data.stdout.trim().replace(/^\//, ''); // Remove leading /
|
|
321
|
+
// Match container name to service name
|
|
322
|
+
// Container names are typically: kadi-{serviceName} or {project}_{serviceName}_1
|
|
323
|
+
for (const serviceName of serviceNames) {
|
|
324
|
+
if (containerName.includes(serviceName)) {
|
|
325
|
+
containersMap[serviceName] = containerId.substring(0, 12); // Short ID
|
|
326
|
+
log('Mapped service %s to container %s', serviceName, containerId.substring(0, 12));
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
log('Failed to get container IDs: %s', psResult.error.message);
|
|
335
|
+
// Non-fatal - continue without container IDs
|
|
336
|
+
}
|
|
337
|
+
// -------------------------------------------------------------------------
|
|
338
|
+
// Phase 9: Build endpoint information
|
|
339
|
+
// -------------------------------------------------------------------------
|
|
340
|
+
// Extract endpoints from service configurations
|
|
341
|
+
const endpointsMap = {};
|
|
342
|
+
for (const [serviceName, serviceConfig] of Object.entries(profile.services)) {
|
|
343
|
+
const config = serviceConfig;
|
|
344
|
+
if (config.expose) {
|
|
345
|
+
for (const portConfig of config.expose) {
|
|
346
|
+
const externalPort = portConfig.as ?? portConfig.port;
|
|
347
|
+
// Use first exposed port as primary endpoint for this service
|
|
348
|
+
if (!endpointsMap[serviceName]) {
|
|
349
|
+
endpointsMap[serviceName] = `http://localhost:${externalPort}`;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
log('Endpoints: %o', endpointsMap);
|
|
355
|
+
log('Containers: %o', containersMap);
|
|
356
|
+
return success({
|
|
357
|
+
profile: selectedProfileName,
|
|
358
|
+
engine,
|
|
359
|
+
network: networkResult.data.name,
|
|
360
|
+
services: serviceNames,
|
|
361
|
+
containers: containersMap,
|
|
362
|
+
endpoints: endpointsMap,
|
|
363
|
+
composePath,
|
|
364
|
+
deployedAt: new Date(),
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=deployer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployer.js","sourceRoot":"","sources":["../../../src/targets/local/deployer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container Engine Management Module
|
|
3
|
+
*
|
|
4
|
+
* Manages Docker and Podman container engine lifecycle, ensuring engines
|
|
5
|
+
* are running and accessible before deployment operations.
|
|
6
|
+
*
|
|
7
|
+
* Key Features:
|
|
8
|
+
* - Automatic Podman VM startup on macOS/Windows
|
|
9
|
+
* - Health checks and connectivity verification
|
|
10
|
+
* - Structured error handling with recovery suggestions
|
|
11
|
+
* - Type-safe Result returns (no throwing)
|
|
12
|
+
*
|
|
13
|
+
* @module targets/local/engine-manager
|
|
14
|
+
*/
|
|
15
|
+
import { type Result, type ContainerEngine } from '../../types/index.js';
|
|
16
|
+
import { DeploymentError } from '../../errors/index.js';
|
|
17
|
+
import { type CommandOptions } from '../../utils/command-runner.js';
|
|
18
|
+
/**
|
|
19
|
+
* Container engine information
|
|
20
|
+
*
|
|
21
|
+
* Returned after successful engine verification, providing
|
|
22
|
+
* structured data about the running engine.
|
|
23
|
+
*/
|
|
24
|
+
export interface EngineInfo {
|
|
25
|
+
/**
|
|
26
|
+
* Engine type
|
|
27
|
+
*/
|
|
28
|
+
readonly engine: ContainerEngine;
|
|
29
|
+
/**
|
|
30
|
+
* Whether engine is running
|
|
31
|
+
*/
|
|
32
|
+
readonly running: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Engine version string
|
|
35
|
+
*/
|
|
36
|
+
readonly version?: string;
|
|
37
|
+
/**
|
|
38
|
+
* Whether this engine was auto-started by us
|
|
39
|
+
*/
|
|
40
|
+
readonly autoStarted: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Platform the engine is running on
|
|
43
|
+
*/
|
|
44
|
+
readonly platform?: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Options for engine verification
|
|
48
|
+
*/
|
|
49
|
+
export interface EngineCheckOptions {
|
|
50
|
+
/**
|
|
51
|
+
* Timeout for engine operations in milliseconds
|
|
52
|
+
* @default 30000 (30 seconds)
|
|
53
|
+
*/
|
|
54
|
+
readonly timeout?: number;
|
|
55
|
+
/**
|
|
56
|
+
* Whether to attempt auto-starting the engine
|
|
57
|
+
* @default true
|
|
58
|
+
*/
|
|
59
|
+
readonly autoStart?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Command execution options
|
|
62
|
+
*/
|
|
63
|
+
readonly commandOptions?: CommandOptions;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Checks if a container engine is running and accessible
|
|
67
|
+
*
|
|
68
|
+
* Performs a health check by running `docker info` or `podman info`.
|
|
69
|
+
* Returns structured engine information if successful.
|
|
70
|
+
*
|
|
71
|
+
* **Does NOT auto-start the engine** - use `ensureEngineRunning` for that.
|
|
72
|
+
*
|
|
73
|
+
* @param engine - Container engine to check
|
|
74
|
+
* @param options - Check options
|
|
75
|
+
* @returns Result with engine info or error
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* const result = await checkEngineRunning('docker');
|
|
80
|
+
*
|
|
81
|
+
* if (result.success) {
|
|
82
|
+
* console.log(`Docker is running: v${result.data.version}`);
|
|
83
|
+
* } else {
|
|
84
|
+
* console.error('Docker not available:', result.error.message);
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare function checkEngineRunning(engine: ContainerEngine, options?: EngineCheckOptions): Promise<Result<EngineInfo, DeploymentError>>;
|
|
89
|
+
/**
|
|
90
|
+
* Ensures a container engine is running and accessible
|
|
91
|
+
*
|
|
92
|
+
* This is the main entry point for engine management. It will:
|
|
93
|
+
*
|
|
94
|
+
* **For Docker:**
|
|
95
|
+
* - Check if Docker daemon is running
|
|
96
|
+
* - Return error if not (cannot auto-start Docker)
|
|
97
|
+
* - Provide clear instructions for manual startup
|
|
98
|
+
*
|
|
99
|
+
* **For Podman:**
|
|
100
|
+
* - Check if Podman socket is available
|
|
101
|
+
* - Automatically start Podman VM if not running (macOS/Windows)
|
|
102
|
+
* - Wait for VM to become ready
|
|
103
|
+
* - Return error if auto-start fails
|
|
104
|
+
*
|
|
105
|
+
* This eliminates common "connection refused" errors and provides
|
|
106
|
+
* a better developer experience, especially with Podman's VM architecture.
|
|
107
|
+
*
|
|
108
|
+
* @param engine - Container engine to ensure is running
|
|
109
|
+
* @param options - Engine check options
|
|
110
|
+
* @returns Result with engine info or error
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* const result = await ensureEngineRunning('podman', { autoStart: true });
|
|
115
|
+
*
|
|
116
|
+
* if (result.success) {
|
|
117
|
+
* console.log('Engine ready:', result.data);
|
|
118
|
+
* if (result.data.autoStarted) {
|
|
119
|
+
* console.log('Podman VM was automatically started');
|
|
120
|
+
* }
|
|
121
|
+
* } else {
|
|
122
|
+
* console.error('Engine error:', result.error.getUserMessage());
|
|
123
|
+
* console.error('Suggestion:', result.error.suggestion);
|
|
124
|
+
* }
|
|
125
|
+
* ```
|
|
126
|
+
*
|
|
127
|
+
* @example With custom timeout
|
|
128
|
+
* ```typescript
|
|
129
|
+
* const result = await ensureEngineRunning('docker', {
|
|
130
|
+
* timeout: 10_000,
|
|
131
|
+
* autoStart: false
|
|
132
|
+
* });
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
export declare function ensureEngineRunning(engine: ContainerEngine, options?: EngineCheckOptions): Promise<Result<EngineInfo, DeploymentError>>;
|
|
136
|
+
/**
|
|
137
|
+
* Gets version information for a container engine
|
|
138
|
+
*
|
|
139
|
+
* Convenience function to extract just the version string from an engine.
|
|
140
|
+
*
|
|
141
|
+
* @param engine - Container engine to check
|
|
142
|
+
* @param options - Check options
|
|
143
|
+
* @returns Result with version string or error
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```typescript
|
|
147
|
+
* const result = await getEngineVersion('docker');
|
|
148
|
+
*
|
|
149
|
+
* if (result.success) {
|
|
150
|
+
* console.log('Docker version:', result.data);
|
|
151
|
+
* }
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
export declare function getEngineVersion(engine: ContainerEngine, options?: EngineCheckOptions): Promise<Result<string, DeploymentError>>;
|
|
155
|
+
//# sourceMappingURL=engine-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-manager.d.ts","sourceRoot":"","sources":["../../../src/targets/local/engine-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EACL,KAAK,MAAM,EAGX,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAOhF;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAyD9C;AA+ED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CA4D9C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAqB1C"}
|