@kapeta/local-cluster-service 0.0.0-96f91ef
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/.eslintrc.cjs +25 -0
- package/.github/workflows/check-license.yml +17 -0
- package/.github/workflows/main.yml +26 -0
- package/.prettierignore +4 -0
- package/.vscode/launch.json +19 -0
- package/CHANGELOG.md +920 -0
- package/LICENSE +38 -0
- package/README.md +36 -0
- package/definitions.d.ts +35 -0
- package/dist/cjs/index.d.ts +34 -0
- package/dist/cjs/index.js +263 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/src/RepositoryWatcher.d.ts +30 -0
- package/dist/cjs/src/RepositoryWatcher.js +332 -0
- package/dist/cjs/src/ai/aiClient.d.ts +20 -0
- package/dist/cjs/src/ai/aiClient.js +74 -0
- package/dist/cjs/src/ai/routes.d.ts +7 -0
- package/dist/cjs/src/ai/routes.js +37 -0
- package/dist/cjs/src/ai/transform.d.ts +11 -0
- package/dist/cjs/src/ai/transform.js +239 -0
- package/dist/cjs/src/ai/types.d.ts +40 -0
- package/dist/cjs/src/ai/types.js +2 -0
- package/dist/cjs/src/api.d.ts +7 -0
- package/dist/cjs/src/api.js +29 -0
- package/dist/cjs/src/assetManager.d.ts +41 -0
- package/dist/cjs/src/assetManager.js +274 -0
- package/dist/cjs/src/assets/routes.d.ts +7 -0
- package/dist/cjs/src/assets/routes.js +165 -0
- package/dist/cjs/src/attachments/routes.d.ts +7 -0
- package/dist/cjs/src/attachments/routes.js +72 -0
- package/dist/cjs/src/authManager.d.ts +16 -0
- package/dist/cjs/src/authManager.js +64 -0
- package/dist/cjs/src/cacheManager.d.ts +20 -0
- package/dist/cjs/src/cacheManager.js +51 -0
- package/dist/cjs/src/clusterService.d.ts +44 -0
- package/dist/cjs/src/clusterService.js +120 -0
- package/dist/cjs/src/codeGeneratorManager.d.ts +14 -0
- package/dist/cjs/src/codeGeneratorManager.js +93 -0
- package/dist/cjs/src/config/routes.d.ts +7 -0
- package/dist/cjs/src/config/routes.js +160 -0
- package/dist/cjs/src/configManager.d.ts +42 -0
- package/dist/cjs/src/configManager.js +136 -0
- package/dist/cjs/src/containerManager.d.ts +148 -0
- package/dist/cjs/src/containerManager.js +958 -0
- package/dist/cjs/src/definitionsManager.d.ts +20 -0
- package/dist/cjs/src/definitionsManager.js +171 -0
- package/dist/cjs/src/filesystem/routes.d.ts +7 -0
- package/dist/cjs/src/filesystem/routes.js +105 -0
- package/dist/cjs/src/filesystemManager.d.ts +27 -0
- package/dist/cjs/src/filesystemManager.js +118 -0
- package/dist/cjs/src/identities/routes.d.ts +7 -0
- package/dist/cjs/src/identities/routes.js +37 -0
- package/dist/cjs/src/instanceManager.d.ts +69 -0
- package/dist/cjs/src/instanceManager.js +910 -0
- package/dist/cjs/src/instances/routes.d.ts +7 -0
- package/dist/cjs/src/instances/routes.js +179 -0
- package/dist/cjs/src/middleware/cors.d.ts +6 -0
- package/dist/cjs/src/middleware/cors.js +14 -0
- package/dist/cjs/src/middleware/kapeta.d.ts +15 -0
- package/dist/cjs/src/middleware/kapeta.js +28 -0
- package/dist/cjs/src/middleware/stringBody.d.ts +9 -0
- package/dist/cjs/src/middleware/stringBody.js +18 -0
- package/dist/cjs/src/networkManager.d.ts +37 -0
- package/dist/cjs/src/networkManager.js +119 -0
- package/dist/cjs/src/operatorManager.d.ts +41 -0
- package/dist/cjs/src/operatorManager.js +211 -0
- package/dist/cjs/src/progressListener.d.ts +31 -0
- package/dist/cjs/src/progressListener.js +133 -0
- package/dist/cjs/src/providerManager.d.ts +11 -0
- package/dist/cjs/src/providerManager.js +84 -0
- package/dist/cjs/src/providers/routes.d.ts +7 -0
- package/dist/cjs/src/providers/routes.js +46 -0
- package/dist/cjs/src/proxy/routes.d.ts +7 -0
- package/dist/cjs/src/proxy/routes.js +115 -0
- package/dist/cjs/src/proxy/types/rest.d.ts +10 -0
- package/dist/cjs/src/proxy/types/rest.js +123 -0
- package/dist/cjs/src/proxy/types/web.d.ts +8 -0
- package/dist/cjs/src/proxy/types/web.js +61 -0
- package/dist/cjs/src/repositoryManager.d.ts +35 -0
- package/dist/cjs/src/repositoryManager.js +247 -0
- package/dist/cjs/src/serviceManager.d.ts +36 -0
- package/dist/cjs/src/serviceManager.js +106 -0
- package/dist/cjs/src/socketManager.d.ts +32 -0
- package/dist/cjs/src/socketManager.js +125 -0
- package/dist/cjs/src/storageService.d.ts +21 -0
- package/dist/cjs/src/storageService.js +81 -0
- package/dist/cjs/src/taskManager.d.ts +70 -0
- package/dist/cjs/src/taskManager.js +181 -0
- package/dist/cjs/src/tasks/routes.d.ts +7 -0
- package/dist/cjs/src/tasks/routes.js +39 -0
- package/dist/cjs/src/traffic/routes.d.ts +7 -0
- package/dist/cjs/src/traffic/routes.js +22 -0
- package/dist/cjs/src/types.d.ts +99 -0
- package/dist/cjs/src/types.js +39 -0
- package/dist/cjs/src/utils/BlockInstanceRunner.d.ts +28 -0
- package/dist/cjs/src/utils/BlockInstanceRunner.js +432 -0
- package/dist/cjs/src/utils/DefaultProviderInstaller.d.ts +15 -0
- package/dist/cjs/src/utils/DefaultProviderInstaller.js +136 -0
- package/dist/cjs/src/utils/InternalConfigProvider.d.ts +38 -0
- package/dist/cjs/src/utils/InternalConfigProvider.js +146 -0
- package/dist/cjs/src/utils/LogData.d.ts +23 -0
- package/dist/cjs/src/utils/LogData.js +46 -0
- package/dist/cjs/src/utils/commandLineUtils.d.ts +8 -0
- package/dist/cjs/src/utils/commandLineUtils.js +39 -0
- package/dist/cjs/src/utils/pathTemplateParser.d.ts +30 -0
- package/dist/cjs/src/utils/pathTemplateParser.js +135 -0
- package/dist/cjs/src/utils/utils.d.ts +40 -0
- package/dist/cjs/src/utils/utils.js +148 -0
- package/dist/cjs/start.d.ts +5 -0
- package/dist/cjs/start.js +17 -0
- package/dist/cjs/test/proxy/types/rest.test.d.ts +5 -0
- package/dist/cjs/test/proxy/types/rest.test.js +48 -0
- package/dist/cjs/test/utils/pathTemplateParser.test.d.ts +5 -0
- package/dist/cjs/test/utils/pathTemplateParser.test.js +27 -0
- package/dist/esm/index.d.ts +34 -0
- package/dist/esm/index.js +263 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/src/RepositoryWatcher.d.ts +30 -0
- package/dist/esm/src/RepositoryWatcher.js +332 -0
- package/dist/esm/src/ai/aiClient.d.ts +20 -0
- package/dist/esm/src/ai/aiClient.js +74 -0
- package/dist/esm/src/ai/routes.d.ts +7 -0
- package/dist/esm/src/ai/routes.js +37 -0
- package/dist/esm/src/ai/transform.d.ts +11 -0
- package/dist/esm/src/ai/transform.js +239 -0
- package/dist/esm/src/ai/types.d.ts +40 -0
- package/dist/esm/src/ai/types.js +2 -0
- package/dist/esm/src/api.d.ts +7 -0
- package/dist/esm/src/api.js +29 -0
- package/dist/esm/src/assetManager.d.ts +41 -0
- package/dist/esm/src/assetManager.js +274 -0
- package/dist/esm/src/assets/routes.d.ts +7 -0
- package/dist/esm/src/assets/routes.js +165 -0
- package/dist/esm/src/attachments/routes.d.ts +7 -0
- package/dist/esm/src/attachments/routes.js +72 -0
- package/dist/esm/src/authManager.d.ts +16 -0
- package/dist/esm/src/authManager.js +64 -0
- package/dist/esm/src/cacheManager.d.ts +20 -0
- package/dist/esm/src/cacheManager.js +51 -0
- package/dist/esm/src/clusterService.d.ts +44 -0
- package/dist/esm/src/clusterService.js +120 -0
- package/dist/esm/src/codeGeneratorManager.d.ts +14 -0
- package/dist/esm/src/codeGeneratorManager.js +93 -0
- package/dist/esm/src/config/routes.d.ts +7 -0
- package/dist/esm/src/config/routes.js +160 -0
- package/dist/esm/src/configManager.d.ts +42 -0
- package/dist/esm/src/configManager.js +136 -0
- package/dist/esm/src/containerManager.d.ts +148 -0
- package/dist/esm/src/containerManager.js +958 -0
- package/dist/esm/src/definitionsManager.d.ts +20 -0
- package/dist/esm/src/definitionsManager.js +171 -0
- package/dist/esm/src/filesystem/routes.d.ts +7 -0
- package/dist/esm/src/filesystem/routes.js +105 -0
- package/dist/esm/src/filesystemManager.d.ts +27 -0
- package/dist/esm/src/filesystemManager.js +118 -0
- package/dist/esm/src/identities/routes.d.ts +7 -0
- package/dist/esm/src/identities/routes.js +37 -0
- package/dist/esm/src/instanceManager.d.ts +69 -0
- package/dist/esm/src/instanceManager.js +910 -0
- package/dist/esm/src/instances/routes.d.ts +7 -0
- package/dist/esm/src/instances/routes.js +179 -0
- package/dist/esm/src/middleware/cors.d.ts +6 -0
- package/dist/esm/src/middleware/cors.js +14 -0
- package/dist/esm/src/middleware/kapeta.d.ts +15 -0
- package/dist/esm/src/middleware/kapeta.js +28 -0
- package/dist/esm/src/middleware/stringBody.d.ts +9 -0
- package/dist/esm/src/middleware/stringBody.js +18 -0
- package/dist/esm/src/networkManager.d.ts +37 -0
- package/dist/esm/src/networkManager.js +119 -0
- package/dist/esm/src/operatorManager.d.ts +41 -0
- package/dist/esm/src/operatorManager.js +211 -0
- package/dist/esm/src/progressListener.d.ts +31 -0
- package/dist/esm/src/progressListener.js +133 -0
- package/dist/esm/src/providerManager.d.ts +11 -0
- package/dist/esm/src/providerManager.js +84 -0
- package/dist/esm/src/providers/routes.d.ts +7 -0
- package/dist/esm/src/providers/routes.js +46 -0
- package/dist/esm/src/proxy/routes.d.ts +7 -0
- package/dist/esm/src/proxy/routes.js +115 -0
- package/dist/esm/src/proxy/types/rest.d.ts +10 -0
- package/dist/esm/src/proxy/types/rest.js +123 -0
- package/dist/esm/src/proxy/types/web.d.ts +8 -0
- package/dist/esm/src/proxy/types/web.js +61 -0
- package/dist/esm/src/repositoryManager.d.ts +35 -0
- package/dist/esm/src/repositoryManager.js +247 -0
- package/dist/esm/src/serviceManager.d.ts +36 -0
- package/dist/esm/src/serviceManager.js +106 -0
- package/dist/esm/src/socketManager.d.ts +32 -0
- package/dist/esm/src/socketManager.js +125 -0
- package/dist/esm/src/storageService.d.ts +21 -0
- package/dist/esm/src/storageService.js +81 -0
- package/dist/esm/src/taskManager.d.ts +70 -0
- package/dist/esm/src/taskManager.js +181 -0
- package/dist/esm/src/tasks/routes.d.ts +7 -0
- package/dist/esm/src/tasks/routes.js +39 -0
- package/dist/esm/src/traffic/routes.d.ts +7 -0
- package/dist/esm/src/traffic/routes.js +22 -0
- package/dist/esm/src/types.d.ts +99 -0
- package/dist/esm/src/types.js +39 -0
- package/dist/esm/src/utils/BlockInstanceRunner.d.ts +28 -0
- package/dist/esm/src/utils/BlockInstanceRunner.js +432 -0
- package/dist/esm/src/utils/DefaultProviderInstaller.d.ts +15 -0
- package/dist/esm/src/utils/DefaultProviderInstaller.js +136 -0
- package/dist/esm/src/utils/InternalConfigProvider.d.ts +38 -0
- package/dist/esm/src/utils/InternalConfigProvider.js +146 -0
- package/dist/esm/src/utils/LogData.d.ts +23 -0
- package/dist/esm/src/utils/LogData.js +46 -0
- package/dist/esm/src/utils/commandLineUtils.d.ts +8 -0
- package/dist/esm/src/utils/commandLineUtils.js +39 -0
- package/dist/esm/src/utils/pathTemplateParser.d.ts +30 -0
- package/dist/esm/src/utils/pathTemplateParser.js +135 -0
- package/dist/esm/src/utils/utils.d.ts +40 -0
- package/dist/esm/src/utils/utils.js +148 -0
- package/dist/esm/start.d.ts +5 -0
- package/dist/esm/start.js +17 -0
- package/dist/esm/test/proxy/types/rest.test.d.ts +5 -0
- package/dist/esm/test/proxy/types/rest.test.js +48 -0
- package/dist/esm/test/utils/pathTemplateParser.test.d.ts +5 -0
- package/dist/esm/test/utils/pathTemplateParser.test.js +27 -0
- package/index.ts +280 -0
- package/jest.config.js +8 -0
- package/package.json +134 -0
- package/src/RepositoryWatcher.ts +363 -0
- package/src/ai/aiClient.ts +93 -0
- package/src/ai/routes.ts +39 -0
- package/src/ai/transform.ts +275 -0
- package/src/ai/types.ts +45 -0
- package/src/api.ts +32 -0
- package/src/assetManager.ts +355 -0
- package/src/assets/routes.ts +183 -0
- package/src/attachments/routes.ts +79 -0
- package/src/authManager.ts +67 -0
- package/src/cacheManager.ts +59 -0
- package/src/clusterService.ts +142 -0
- package/src/codeGeneratorManager.ts +109 -0
- package/src/config/routes.ts +201 -0
- package/src/configManager.ts +180 -0
- package/src/containerManager.ts +1178 -0
- package/src/definitionsManager.ts +212 -0
- package/src/filesystem/routes.ts +123 -0
- package/src/filesystemManager.ts +133 -0
- package/src/identities/routes.ts +38 -0
- package/src/instanceManager.ts +1160 -0
- package/src/instances/routes.ts +203 -0
- package/src/middleware/cors.ts +14 -0
- package/src/middleware/kapeta.ts +41 -0
- package/src/middleware/stringBody.ts +21 -0
- package/src/networkManager.ts +148 -0
- package/src/operatorManager.ts +294 -0
- package/src/progressListener.ts +151 -0
- package/src/providerManager.ts +97 -0
- package/src/providers/routes.ts +51 -0
- package/src/proxy/routes.ts +153 -0
- package/src/proxy/types/rest.ts +172 -0
- package/src/proxy/types/web.ts +70 -0
- package/src/repositoryManager.ts +291 -0
- package/src/serviceManager.ts +133 -0
- package/src/socketManager.ts +138 -0
- package/src/storageService.ts +97 -0
- package/src/taskManager.ts +247 -0
- package/src/tasks/routes.ts +43 -0
- package/src/traffic/routes.ts +23 -0
- package/src/types.ts +112 -0
- package/src/utils/BlockInstanceRunner.ts +577 -0
- package/src/utils/DefaultProviderInstaller.ts +150 -0
- package/src/utils/InternalConfigProvider.ts +214 -0
- package/src/utils/LogData.ts +50 -0
- package/src/utils/commandLineUtils.ts +45 -0
- package/src/utils/pathTemplateParser.ts +157 -0
- package/src/utils/utils.ts +155 -0
- package/start.ts +14 -0
- package/test/proxy/types/rest.test.ts +54 -0
- package/test/utils/pathTemplateParser.test.ts +29 -0
- package/tsconfig.json +15 -0
package/src/types.ts
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2023 Kapeta Inc.
|
3
|
+
* SPDX-License-Identifier: BUSL-1.1
|
4
|
+
*/
|
5
|
+
|
6
|
+
import express from 'express';
|
7
|
+
import { Connection, Resource } from '@kapeta/schemas';
|
8
|
+
import { StringBodyRequest } from './middleware/stringBody';
|
9
|
+
import { KapetaRequest } from './middleware/kapeta';
|
10
|
+
|
11
|
+
export const KIND_RESOURCE_OPERATOR = 'core/resource-type-operator';
|
12
|
+
export const KIND_BLOCK_TYPE = 'core/block-type';
|
13
|
+
export const KIND_BLOCK_TYPE_OPERATOR = 'core/block-type-operator';
|
14
|
+
export const KIND_BLOCK_TYPE_EXECUTABLE = 'core/block-type-executable';
|
15
|
+
|
16
|
+
export type StringMap = { [key: string]: string };
|
17
|
+
export type AnyMap = { [key: string]: any };
|
18
|
+
export type SourceOfChange = 'user' | 'filesystem';
|
19
|
+
export type WatchEventName = 'add' | 'addDir' | 'change' | 'unlink' | 'unlinkDir';
|
20
|
+
export type LogLevel = 'ERROR' | 'WARN' | 'INFO' | 'DEBUG' | 'TRACE' | 'FATAL';
|
21
|
+
export type LogSource = 'stdout' | 'stderr';
|
22
|
+
export type EnvironmentType = 'docker' | 'process';
|
23
|
+
|
24
|
+
export const DOCKER_HOST_INTERNAL = 'host.docker.internal';
|
25
|
+
|
26
|
+
export interface LogEntry {
|
27
|
+
source: LogSource;
|
28
|
+
level: LogLevel;
|
29
|
+
message: string;
|
30
|
+
time: number;
|
31
|
+
}
|
32
|
+
|
33
|
+
export interface BlockProcessParams {
|
34
|
+
id: string;
|
35
|
+
ref: string;
|
36
|
+
configuration?: AnyMap;
|
37
|
+
}
|
38
|
+
|
39
|
+
export enum InstanceType {
|
40
|
+
DOCKER = 'docker',
|
41
|
+
LOCAL = 'local',
|
42
|
+
UNKNOWN = 'unknown',
|
43
|
+
}
|
44
|
+
export enum InstanceOwner {
|
45
|
+
INTERNAL = 'internal',
|
46
|
+
EXTERNAL = 'external',
|
47
|
+
}
|
48
|
+
|
49
|
+
export enum InstanceStatus {
|
50
|
+
STOPPED = 'stopped',
|
51
|
+
STARTING = 'starting',
|
52
|
+
BUSY = 'busy',
|
53
|
+
READY = 'ready',
|
54
|
+
STOPPING = 'stopping',
|
55
|
+
UNHEALTHY = 'unhealthy',
|
56
|
+
FAILED = 'failed',
|
57
|
+
}
|
58
|
+
|
59
|
+
export enum DesiredInstanceStatus {
|
60
|
+
STOP = 'stop',
|
61
|
+
RUN = 'run',
|
62
|
+
EXTERNAL = 'external',
|
63
|
+
}
|
64
|
+
|
65
|
+
export type ProcessInfo = {
|
66
|
+
type: InstanceType;
|
67
|
+
pid?: number | string | null;
|
68
|
+
portType?: string;
|
69
|
+
};
|
70
|
+
|
71
|
+
export type InstanceInfo = {
|
72
|
+
systemId: string;
|
73
|
+
instanceId: string;
|
74
|
+
ref: string;
|
75
|
+
name: string;
|
76
|
+
type: InstanceType;
|
77
|
+
owner: InstanceOwner;
|
78
|
+
status: InstanceStatus;
|
79
|
+
errorMessage?: string;
|
80
|
+
desiredStatus: DesiredInstanceStatus;
|
81
|
+
address?: string;
|
82
|
+
|
83
|
+
startedAt?: number;
|
84
|
+
health?: string | null;
|
85
|
+
pid?: number | string | null;
|
86
|
+
portType?: string;
|
87
|
+
};
|
88
|
+
|
89
|
+
export type ProxyRequestHandler = (req: StringBodyRequest, res: express.Response, info: ProxyRequestInfo) => void;
|
90
|
+
|
91
|
+
export interface ProxyRequestInfo {
|
92
|
+
address: string;
|
93
|
+
connection: Connection;
|
94
|
+
providerResource: Resource;
|
95
|
+
consumerResource: Resource;
|
96
|
+
consumerPath: string;
|
97
|
+
}
|
98
|
+
|
99
|
+
export interface SimpleResponse {
|
100
|
+
code: number;
|
101
|
+
headers: StringMap;
|
102
|
+
body: any;
|
103
|
+
}
|
104
|
+
|
105
|
+
export interface SimpleRequest {
|
106
|
+
method: string;
|
107
|
+
url: string;
|
108
|
+
headers: StringMap;
|
109
|
+
body: any;
|
110
|
+
}
|
111
|
+
|
112
|
+
export type KapetaBodyRequest = KapetaRequest & StringBodyRequest;
|
@@ -0,0 +1,577 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2023 Kapeta Inc.
|
3
|
+
* SPDX-License-Identifier: BUSL-1.1
|
4
|
+
*/
|
5
|
+
|
6
|
+
import FSExtra from 'fs-extra';
|
7
|
+
import ClusterConfig, { DefinitionInfo } from '@kapeta/local-cluster-config';
|
8
|
+
import { getDockerHostIp, getBlockInstanceContainerName, getOperatorInstancePorts, readYML, toPortInfo } from './utils';
|
9
|
+
import { KapetaURI, parseKapetaUri, normalizeKapetaUri } from '@kapeta/nodejs-utils';
|
10
|
+
import { DEFAULT_PORT_TYPE, HTTP_PORT_TYPE, HTTP_PORTS, serviceManager } from '../serviceManager';
|
11
|
+
import {
|
12
|
+
COMPOSE_LABEL_PROJECT,
|
13
|
+
COMPOSE_LABEL_SERVICE,
|
14
|
+
CONTAINER_LABEL_PORT_PREFIX,
|
15
|
+
containerManager,
|
16
|
+
DockerMounts,
|
17
|
+
toLocalBindVolume,
|
18
|
+
} from '../containerManager';
|
19
|
+
import { LogData } from './LogData';
|
20
|
+
import { clusterService } from '../clusterService';
|
21
|
+
import {
|
22
|
+
AnyMap,
|
23
|
+
BlockProcessParams,
|
24
|
+
DOCKER_HOST_INTERNAL,
|
25
|
+
InstanceType,
|
26
|
+
KIND_BLOCK_TYPE_OPERATOR,
|
27
|
+
ProcessInfo,
|
28
|
+
StringMap,
|
29
|
+
} from '../types';
|
30
|
+
import { definitionsManager } from '../definitionsManager';
|
31
|
+
import Docker from 'dockerode';
|
32
|
+
import OS from 'node:os';
|
33
|
+
import Path from 'node:path';
|
34
|
+
import { taskManager } from '../taskManager';
|
35
|
+
import { LocalDevContainer, LocalInstance } from '@kapeta/schemas';
|
36
|
+
import { createInternalConfigProvider } from './InternalConfigProvider';
|
37
|
+
import { resolveKapetaVariables, writeConfigTemplates } from '@kapeta/config-mapper';
|
38
|
+
|
39
|
+
const KAPETA_SYSTEM_ID = 'KAPETA_SYSTEM_ID';
|
40
|
+
const KAPETA_BLOCK_REF = 'KAPETA_BLOCK_REF';
|
41
|
+
const KAPETA_INSTANCE_ID = 'KAPETA_INSTANCE_ID';
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Needed when running local docker containers as part of plan
|
45
|
+
* @type {string[]}
|
46
|
+
*/
|
47
|
+
const DOCKER_ENV_VARS = [
|
48
|
+
`KAPETA_LOCAL_SERVER=0.0.0.0`,
|
49
|
+
`KAPETA_LOCAL_CLUSTER_HOST=${DOCKER_HOST_INTERNAL}`,
|
50
|
+
`KAPETA_ENVIRONMENT_TYPE=docker`,
|
51
|
+
];
|
52
|
+
|
53
|
+
async function getProvider(uri: KapetaURI) {
|
54
|
+
const providers = await definitionsManager.getProviderDefinitions();
|
55
|
+
return providers.find((provider) => {
|
56
|
+
const ref = `${provider.definition.metadata.name}:${provider.version}`;
|
57
|
+
return parseKapetaUri(ref).id === uri.id;
|
58
|
+
});
|
59
|
+
}
|
60
|
+
|
61
|
+
export function resolvePortType(portType: string) {
|
62
|
+
if (portType && HTTP_PORTS.includes(portType.toLowerCase())) {
|
63
|
+
return HTTP_PORT_TYPE;
|
64
|
+
}
|
65
|
+
return portType;
|
66
|
+
}
|
67
|
+
|
68
|
+
/**
|
69
|
+
* Get the port types for a non-operator block instance
|
70
|
+
*/
|
71
|
+
function getServiceProviderPorts(assetVersion: DefinitionInfo, providerVersion: DefinitionInfo): string[] {
|
72
|
+
const out =
|
73
|
+
assetVersion.definition?.spec?.providers
|
74
|
+
?.filter((provider: any) => {
|
75
|
+
// We only support HTTP provider ports for now. Need to figure out how to handle other types
|
76
|
+
return HTTP_PORTS.includes(provider.spec?.port?.type?.toLowerCase());
|
77
|
+
})
|
78
|
+
?.map((provider: any) => {
|
79
|
+
return resolvePortType(provider.spec?.port?.type?.toLowerCase());
|
80
|
+
})
|
81
|
+
.filter((t: any) => !!t) ?? [];
|
82
|
+
|
83
|
+
if (out.length === 0) {
|
84
|
+
if (providerVersion.definition.spec?.defaultPort?.type) {
|
85
|
+
return [resolvePortType(providerVersion.definition.spec?.defaultPort?.type)];
|
86
|
+
}
|
87
|
+
return [resolvePortType(DEFAULT_PORT_TYPE)];
|
88
|
+
}
|
89
|
+
// Duplicated port types are not allowed
|
90
|
+
return Array.from(new Set<string>(out));
|
91
|
+
}
|
92
|
+
|
93
|
+
export class BlockInstanceRunner {
|
94
|
+
private readonly _systemId: string;
|
95
|
+
|
96
|
+
constructor(systemId: string) {
|
97
|
+
/**
|
98
|
+
*
|
99
|
+
* @type {string}
|
100
|
+
* @private
|
101
|
+
*/
|
102
|
+
this._systemId = normalizeKapetaUri(systemId);
|
103
|
+
}
|
104
|
+
|
105
|
+
/**
|
106
|
+
* Start a block
|
107
|
+
*
|
108
|
+
*/
|
109
|
+
async start(blockRef: string, instanceId: string, configuration: AnyMap): Promise<ProcessInfo> {
|
110
|
+
return this._execute({
|
111
|
+
ref: blockRef,
|
112
|
+
id: instanceId,
|
113
|
+
configuration,
|
114
|
+
});
|
115
|
+
}
|
116
|
+
|
117
|
+
private async _execute(blockInstance: BlockProcessParams): Promise<ProcessInfo> {
|
118
|
+
const blockUri = parseKapetaUri(blockInstance.ref);
|
119
|
+
|
120
|
+
if (!blockUri.version) {
|
121
|
+
blockUri.version = 'local';
|
122
|
+
}
|
123
|
+
|
124
|
+
const assetVersion = await definitionsManager.getDefinition(blockUri.id);
|
125
|
+
|
126
|
+
if (!assetVersion) {
|
127
|
+
throw new Error(`Block definition not found: ${blockUri.id}`);
|
128
|
+
}
|
129
|
+
|
130
|
+
const kindUri = parseKapetaUri(assetVersion.definition.kind);
|
131
|
+
|
132
|
+
const providerVersion = await getProvider(kindUri);
|
133
|
+
|
134
|
+
if (!providerVersion) {
|
135
|
+
throw new Error(`Kind not found: ${kindUri.id}`);
|
136
|
+
}
|
137
|
+
|
138
|
+
const baseDir = ClusterConfig.getRepositoryAssetPath(blockUri.handle, blockUri.name, blockUri.version);
|
139
|
+
const realBaseDir = await FSExtra.realpath(baseDir);
|
140
|
+
const internalConfigProvider = await createInternalConfigProvider(
|
141
|
+
this._systemId,
|
142
|
+
blockInstance.id,
|
143
|
+
assetVersion
|
144
|
+
);
|
145
|
+
|
146
|
+
// Resolve the environment variables
|
147
|
+
const envVars = await resolveKapetaVariables(realBaseDir, internalConfigProvider);
|
148
|
+
|
149
|
+
// Write out the config templates if they exist
|
150
|
+
await writeConfigTemplates(envVars, realBaseDir);
|
151
|
+
|
152
|
+
let processInfo: ProcessInfo;
|
153
|
+
|
154
|
+
if (providerVersion.definition.kind === KIND_BLOCK_TYPE_OPERATOR) {
|
155
|
+
processInfo = await this._startOperatorProcess(blockInstance, blockUri, providerVersion, envVars);
|
156
|
+
} else {
|
157
|
+
//We need a port type to know how to connect to the block consistently
|
158
|
+
const portTypes = getServiceProviderPorts(assetVersion, providerVersion);
|
159
|
+
|
160
|
+
if (blockUri.version === 'local') {
|
161
|
+
processInfo = await this._startLocalProcess(blockInstance, blockUri, envVars, assetVersion);
|
162
|
+
} else {
|
163
|
+
processInfo = await this._startDockerProcess(blockInstance, blockUri, envVars, assetVersion);
|
164
|
+
}
|
165
|
+
|
166
|
+
if (portTypes.length > 0) {
|
167
|
+
processInfo.portType = portTypes[0];
|
168
|
+
}
|
169
|
+
}
|
170
|
+
|
171
|
+
return processInfo;
|
172
|
+
}
|
173
|
+
|
174
|
+
/**
|
175
|
+
* Starts local process
|
176
|
+
*/
|
177
|
+
private async _startLocalProcess(
|
178
|
+
blockInstance: BlockProcessParams,
|
179
|
+
blockInfo: KapetaURI,
|
180
|
+
env: StringMap,
|
181
|
+
assetVersion: DefinitionInfo
|
182
|
+
): Promise<ProcessInfo> {
|
183
|
+
const baseDir = ClusterConfig.getRepositoryAssetPath(blockInfo.handle, blockInfo.name, blockInfo.version);
|
184
|
+
|
185
|
+
if (!FSExtra.existsSync(baseDir)) {
|
186
|
+
throw new Error(
|
187
|
+
`Local block not registered correctly - expected symlink here: ${baseDir}.\n` +
|
188
|
+
`Make sure you've run "kap registry link" in your local directory to connect it to Kapeta`
|
189
|
+
);
|
190
|
+
}
|
191
|
+
|
192
|
+
if (!assetVersion.definition.spec?.target?.kind) {
|
193
|
+
throw new Error('Missing target kind in block definition');
|
194
|
+
}
|
195
|
+
|
196
|
+
const realLocalPath = await FSExtra.realpath(baseDir);
|
197
|
+
|
198
|
+
const kindUri = parseKapetaUri(assetVersion.definition.kind);
|
199
|
+
|
200
|
+
const providerVersion = await getProvider(kindUri);
|
201
|
+
|
202
|
+
if (!providerVersion) {
|
203
|
+
throw new Error(`Block type not found: ${kindUri.id}`);
|
204
|
+
}
|
205
|
+
|
206
|
+
const targetKindUri = parseKapetaUri(assetVersion.definition.spec?.target?.kind);
|
207
|
+
|
208
|
+
const targetVersion = await getProvider(targetKindUri);
|
209
|
+
|
210
|
+
if (!targetVersion) {
|
211
|
+
throw new Error(`Target not found: ${targetKindUri.id}`);
|
212
|
+
}
|
213
|
+
|
214
|
+
const localContainer = targetVersion.definition.spec.local as LocalDevContainer;
|
215
|
+
|
216
|
+
if (!localContainer) {
|
217
|
+
throw new Error(`Missing local container information from target: ${targetKindUri.id}`);
|
218
|
+
}
|
219
|
+
|
220
|
+
let dockerImage = localContainer.image;
|
221
|
+
const isDockerImage = !localContainer.type || localContainer.type.toLowerCase() === 'docker';
|
222
|
+
const isDockerFile = Boolean(localContainer.type && localContainer.type.toLowerCase() === 'dockerfile');
|
223
|
+
if (isDockerImage && !dockerImage) {
|
224
|
+
throw new Error(`Missing docker image information: ${JSON.stringify(localContainer)}`);
|
225
|
+
}
|
226
|
+
|
227
|
+
if (isDockerFile) {
|
228
|
+
dockerImage = blockInfo.fullName + ':local';
|
229
|
+
const dockerFile = Path.join(realLocalPath, localContainer.file ?? 'Dockerfile');
|
230
|
+
if (!FSExtra.existsSync(dockerFile)) {
|
231
|
+
throw new Error(`Dockerfile not found at: ${dockerFile}`);
|
232
|
+
}
|
233
|
+
const task = containerManager.buildDockerImage(dockerFile, blockInfo.fullName + ':local');
|
234
|
+
await task.wait();
|
235
|
+
}
|
236
|
+
|
237
|
+
const containerName = await getBlockInstanceContainerName(this._systemId, blockInstance.id, targetKindUri.id);
|
238
|
+
const startCmd = localContainer.handlers?.onCreate ? localContainer.handlers.onCreate : '';
|
239
|
+
const dockerOpts = localContainer.options ?? {};
|
240
|
+
const homeDir = localContainer.userHome ? localContainer.userHome : '/root';
|
241
|
+
const workingDir = localContainer.workingDir ? localContainer.workingDir : '/workspace';
|
242
|
+
|
243
|
+
const customHostConfigs = localContainer.HostConfig ?? {};
|
244
|
+
const Binds = customHostConfigs.Binds ?? [];
|
245
|
+
delete customHostConfigs.Binds;
|
246
|
+
const customLabels = localContainer.Labels ?? {};
|
247
|
+
const customEnvs = localContainer.Env ?? [];
|
248
|
+
delete localContainer.HostConfig;
|
249
|
+
delete localContainer.Labels;
|
250
|
+
delete localContainer.Env;
|
251
|
+
|
252
|
+
const { PortBindings, ExposedPorts, addonEnv } = await this.getServiceBlockPortBindings(
|
253
|
+
blockInstance,
|
254
|
+
assetVersion,
|
255
|
+
providerVersion
|
256
|
+
);
|
257
|
+
|
258
|
+
let HealthCheck = undefined;
|
259
|
+
if (localContainer.healthcheck) {
|
260
|
+
HealthCheck = containerManager.toDockerHealth({ cmd: localContainer.healthcheck });
|
261
|
+
}
|
262
|
+
|
263
|
+
const Mounts = isDockerImage
|
264
|
+
? // For docker images we mount the local directory to the working directory
|
265
|
+
containerManager.toDockerMounts({
|
266
|
+
[workingDir]: toLocalBindVolume(realLocalPath),
|
267
|
+
})
|
268
|
+
: // For dockerfiles we don't mount anything
|
269
|
+
[];
|
270
|
+
|
271
|
+
const systemUri = parseKapetaUri(this._systemId);
|
272
|
+
|
273
|
+
return this.ensureContainer({
|
274
|
+
...dockerOpts,
|
275
|
+
Image: dockerImage,
|
276
|
+
name: containerName,
|
277
|
+
WorkingDir: workingDir,
|
278
|
+
Labels: {
|
279
|
+
...customLabels,
|
280
|
+
instance: blockInstance.id,
|
281
|
+
[COMPOSE_LABEL_PROJECT]: systemUri.id.replace(/[^a-z0-9]/gi, '_'),
|
282
|
+
[COMPOSE_LABEL_SERVICE]: blockInfo.id.replace(/[^a-z0-9]/gi, '_'),
|
283
|
+
},
|
284
|
+
HealthCheck,
|
285
|
+
ExposedPorts,
|
286
|
+
Cmd: startCmd ? startCmd.split(/\s+/g) : [],
|
287
|
+
Env: [
|
288
|
+
...customEnvs,
|
289
|
+
...DOCKER_ENV_VARS,
|
290
|
+
`KAPETA_LOCAL_CLUSTER_PORT=${clusterService.getClusterServicePort()}`,
|
291
|
+
...Object.entries({
|
292
|
+
...env,
|
293
|
+
...addonEnv,
|
294
|
+
}).map(([key, value]) => `${key}=${value}`),
|
295
|
+
],
|
296
|
+
HostConfig: {
|
297
|
+
...customHostConfigs,
|
298
|
+
Binds: [
|
299
|
+
`${toLocalBindVolume(ClusterConfig.getKapetaBasedir())}:${homeDir}/.kapeta`,
|
300
|
+
...Binds.map((bind: string) => {
|
301
|
+
let [host, container] = bind.split(':');
|
302
|
+
if (host.startsWith('~')) {
|
303
|
+
host = OS.homedir() + host.substring(1);
|
304
|
+
}
|
305
|
+
|
306
|
+
if (container.startsWith('~')) {
|
307
|
+
container = homeDir + container.substring(1);
|
308
|
+
}
|
309
|
+
|
310
|
+
return `${toLocalBindVolume(host)}:${container}`;
|
311
|
+
}),
|
312
|
+
],
|
313
|
+
PortBindings,
|
314
|
+
Mounts,
|
315
|
+
},
|
316
|
+
});
|
317
|
+
}
|
318
|
+
|
319
|
+
private async _startDockerProcess(
|
320
|
+
blockInstance: BlockProcessParams,
|
321
|
+
blockInfo: KapetaURI,
|
322
|
+
env: StringMap,
|
323
|
+
assetVersion: DefinitionInfo
|
324
|
+
) {
|
325
|
+
const { versionFile } = ClusterConfig.getRepositoryAssetInfoPath(
|
326
|
+
blockInfo.handle,
|
327
|
+
blockInfo.name,
|
328
|
+
blockInfo.version
|
329
|
+
);
|
330
|
+
|
331
|
+
const versionYml = versionFile;
|
332
|
+
if (!FSExtra.existsSync(versionYml)) {
|
333
|
+
throw new Error(`Did not find version info at the expected path: ${versionYml}`);
|
334
|
+
}
|
335
|
+
|
336
|
+
const versionInfo = readYML(versionYml);
|
337
|
+
|
338
|
+
if (versionInfo?.artifact?.type !== 'docker') {
|
339
|
+
throw new Error(`Unsupported artifact type: ${versionInfo?.artifact?.type}`);
|
340
|
+
}
|
341
|
+
const dockerImage = versionInfo?.artifact?.details?.primary;
|
342
|
+
if (!dockerImage) {
|
343
|
+
throw new Error(`Missing docker image information: ${JSON.stringify(versionInfo?.artifact?.details)}`);
|
344
|
+
}
|
345
|
+
|
346
|
+
const kindUri = parseKapetaUri(assetVersion.definition.kind);
|
347
|
+
|
348
|
+
const providerVersion = await getProvider(kindUri);
|
349
|
+
|
350
|
+
if (!providerVersion) {
|
351
|
+
throw new Error(`Block type not found: ${kindUri.id}`);
|
352
|
+
}
|
353
|
+
|
354
|
+
const { PortBindings, ExposedPorts, addonEnv } = await this.getServiceBlockPortBindings(
|
355
|
+
blockInstance,
|
356
|
+
assetVersion,
|
357
|
+
providerVersion
|
358
|
+
);
|
359
|
+
|
360
|
+
const containerName = await getBlockInstanceContainerName(this._systemId, blockInstance.id, kindUri.id);
|
361
|
+
|
362
|
+
// For windows we need to default to root
|
363
|
+
const innerHome = process.platform === 'win32' ? '/root/.kapeta' : ClusterConfig.getKapetaBasedir();
|
364
|
+
const systemUri = parseKapetaUri(this._systemId);
|
365
|
+
|
366
|
+
return this.ensureContainer({
|
367
|
+
Image: dockerImage,
|
368
|
+
name: containerName,
|
369
|
+
ExposedPorts,
|
370
|
+
Labels: {
|
371
|
+
instance: blockInstance.id,
|
372
|
+
[COMPOSE_LABEL_PROJECT]: systemUri.id.replace(/[^a-z0-9]/gi, '_'),
|
373
|
+
[COMPOSE_LABEL_SERVICE]: blockInfo.id.replace(/[^a-z0-9]/gi, '_'),
|
374
|
+
},
|
375
|
+
Env: [
|
376
|
+
...DOCKER_ENV_VARS,
|
377
|
+
`KAPETA_LOCAL_CLUSTER_PORT=${clusterService.getClusterServicePort()}`,
|
378
|
+
...Object.entries({
|
379
|
+
...env,
|
380
|
+
...addonEnv,
|
381
|
+
}).map(([key, value]) => `${key}=${value}`),
|
382
|
+
],
|
383
|
+
HostConfig: {
|
384
|
+
Binds: [`${toLocalBindVolume(ClusterConfig.getKapetaBasedir())}:${innerHome}`],
|
385
|
+
PortBindings,
|
386
|
+
},
|
387
|
+
});
|
388
|
+
}
|
389
|
+
|
390
|
+
private async _startOperatorProcess(
|
391
|
+
blockInstance: BlockProcessParams,
|
392
|
+
blockUri: KapetaURI,
|
393
|
+
providerDefinition: DefinitionInfo,
|
394
|
+
env: StringMap
|
395
|
+
) {
|
396
|
+
const { assetFile } = ClusterConfig.getRepositoryAssetInfoPath(
|
397
|
+
blockUri.handle,
|
398
|
+
blockUri.name,
|
399
|
+
blockUri.version
|
400
|
+
);
|
401
|
+
|
402
|
+
const kapetaYmlPath = assetFile;
|
403
|
+
if (!FSExtra.existsSync(kapetaYmlPath)) {
|
404
|
+
throw new Error(`Did not find kapeta.yml at the expected path: ${kapetaYmlPath}`);
|
405
|
+
}
|
406
|
+
|
407
|
+
const spec = providerDefinition.definition.spec;
|
408
|
+
const providerRef = `${providerDefinition.definition.metadata.name}:${providerDefinition.version}`;
|
409
|
+
|
410
|
+
if (!spec?.local?.image) {
|
411
|
+
throw new Error(`Provider did not have local image: ${providerRef}`);
|
412
|
+
}
|
413
|
+
|
414
|
+
const local = spec.local as LocalInstance;
|
415
|
+
|
416
|
+
const dockerImage = local.image;
|
417
|
+
const operatorUri = local.singleton ? parseKapetaUri(providerRef) : blockUri;
|
418
|
+
const operatorId = local.singleton ? providerRef : blockInstance.id;
|
419
|
+
const operatorRef = local.singleton ? providerRef : blockInstance.ref;
|
420
|
+
|
421
|
+
if (local.singleton && env) {
|
422
|
+
env[KAPETA_BLOCK_REF] = operatorRef;
|
423
|
+
env[KAPETA_INSTANCE_ID] = operatorId;
|
424
|
+
}
|
425
|
+
|
426
|
+
const containerName = await getBlockInstanceContainerName(this._systemId, blockInstance.id, providerRef);
|
427
|
+
|
428
|
+
const task = taskManager.add(
|
429
|
+
`container:start:${containerName}`,
|
430
|
+
async () => {
|
431
|
+
const logs = new LogData();
|
432
|
+
const hostIp = getDockerHostIp();
|
433
|
+
|
434
|
+
const ExposedPorts: AnyMap = {};
|
435
|
+
const addonEnv: StringMap = {};
|
436
|
+
const PortBindings: AnyMap = {};
|
437
|
+
let HealthCheck = undefined;
|
438
|
+
let Mounts: DockerMounts[] = [];
|
439
|
+
const instancePorts = await getOperatorInstancePorts(this._systemId, operatorId, local);
|
440
|
+
const labels: { [key: string]: string } = {};
|
441
|
+
instancePorts.forEach((portInfo) => {
|
442
|
+
const dockerPort = `${portInfo.port}/${portInfo.protocol}`;
|
443
|
+
ExposedPorts[dockerPort] = {};
|
444
|
+
addonEnv[`KAPETA_LOCAL_SERVER_PORT_${portInfo.portType.toUpperCase()}`] = `${portInfo.port}`;
|
445
|
+
|
446
|
+
PortBindings[dockerPort] = [
|
447
|
+
{
|
448
|
+
HostIp: hostIp,
|
449
|
+
HostPort: `${portInfo.hostPort}`,
|
450
|
+
},
|
451
|
+
];
|
452
|
+
|
453
|
+
labels[CONTAINER_LABEL_PORT_PREFIX + portInfo.hostPort] = portInfo.portType;
|
454
|
+
});
|
455
|
+
|
456
|
+
if (local.env) {
|
457
|
+
Object.entries(local.env).forEach(([key, value]) => {
|
458
|
+
addonEnv[key] = value as string;
|
459
|
+
});
|
460
|
+
}
|
461
|
+
|
462
|
+
if (local.mounts) {
|
463
|
+
Mounts = await containerManager.createVolumes(this._systemId, operatorUri.id, local.mounts);
|
464
|
+
}
|
465
|
+
|
466
|
+
if (local.health) {
|
467
|
+
HealthCheck = containerManager.toDockerHealth(local.health);
|
468
|
+
}
|
469
|
+
|
470
|
+
// For windows we need to default to root
|
471
|
+
const innerHome = process.platform === 'win32' ? '/root/.kapeta' : ClusterConfig.getKapetaBasedir();
|
472
|
+
|
473
|
+
const Binds = local.singleton
|
474
|
+
? [`${toLocalBindVolume(ClusterConfig.getKapetaBasedir())}:${innerHome}`]
|
475
|
+
: [
|
476
|
+
`${toLocalBindVolume(kapetaYmlPath)}:/kapeta.yml:ro`,
|
477
|
+
`${toLocalBindVolume(ClusterConfig.getKapetaBasedir())}:${innerHome}`,
|
478
|
+
];
|
479
|
+
|
480
|
+
const systemUri = parseKapetaUri(this._systemId);
|
481
|
+
|
482
|
+
console.log(
|
483
|
+
`Ensuring container for operator block: ${containerName} [singleton: ${!!local.singleton}]`
|
484
|
+
);
|
485
|
+
|
486
|
+
logs.addLog(`Ensuring container for operator block: ${containerName}`);
|
487
|
+
const out = await this.ensureContainer({
|
488
|
+
Image: dockerImage,
|
489
|
+
name: containerName,
|
490
|
+
ExposedPorts,
|
491
|
+
HealthCheck,
|
492
|
+
HostConfig: {
|
493
|
+
Binds,
|
494
|
+
PortBindings,
|
495
|
+
Mounts,
|
496
|
+
},
|
497
|
+
Labels: {
|
498
|
+
...labels,
|
499
|
+
instance: operatorId,
|
500
|
+
[COMPOSE_LABEL_PROJECT]: systemUri.id.replace(/[^a-z0-9]/gi, '_'),
|
501
|
+
[COMPOSE_LABEL_SERVICE]: operatorUri.id.replace(/[^a-z0-9]/gi, '_'),
|
502
|
+
},
|
503
|
+
Env: [
|
504
|
+
`KAPETA_INSTANCE_NAME=${operatorRef}`,
|
505
|
+
`KAPETA_LOCAL_CLUSTER_PORT=${clusterService.getClusterServicePort()}`,
|
506
|
+
...DOCKER_ENV_VARS,
|
507
|
+
...Object.entries({
|
508
|
+
...env,
|
509
|
+
...addonEnv,
|
510
|
+
}).map(([key, value]) => `${key}=${value}`),
|
511
|
+
],
|
512
|
+
});
|
513
|
+
|
514
|
+
const portTypes = local.ports ? Object.keys(local.ports) : [];
|
515
|
+
if (portTypes.length > 0) {
|
516
|
+
out.portType = portTypes[0];
|
517
|
+
}
|
518
|
+
|
519
|
+
return out;
|
520
|
+
},
|
521
|
+
{
|
522
|
+
name: `Starting container for ${providerRef}`,
|
523
|
+
systemId: this._systemId,
|
524
|
+
}
|
525
|
+
);
|
526
|
+
|
527
|
+
return task.wait();
|
528
|
+
}
|
529
|
+
|
530
|
+
/**
|
531
|
+
* Get the port bindings for a non-operator block
|
532
|
+
*/
|
533
|
+
private async getServiceBlockPortBindings(
|
534
|
+
blockInstance: BlockProcessParams,
|
535
|
+
assetVersion: DefinitionInfo,
|
536
|
+
providerVersion: DefinitionInfo
|
537
|
+
) {
|
538
|
+
const hostIp = getDockerHostIp();
|
539
|
+
const ExposedPorts: AnyMap = {};
|
540
|
+
const addonEnv: StringMap = {};
|
541
|
+
const PortBindings: AnyMap = {};
|
542
|
+
|
543
|
+
const portTypes = getServiceProviderPorts(assetVersion, providerVersion);
|
544
|
+
let port = 80;
|
545
|
+
const promises = portTypes.map(async (portType) => {
|
546
|
+
const publicPort = await serviceManager.ensureServicePort(this._systemId, blockInstance.id, portType);
|
547
|
+
const thisPort = port++; //TODO: Not sure how we should handle multiple ports or non-HTTP ports
|
548
|
+
const dockerPort = `${thisPort}/tcp`;
|
549
|
+
ExposedPorts[dockerPort] = {};
|
550
|
+
addonEnv[`KAPETA_LOCAL_SERVER_PORT_${portType.toUpperCase()}`] = '' + thisPort;
|
551
|
+
|
552
|
+
PortBindings[dockerPort] = [
|
553
|
+
{
|
554
|
+
HostIp: hostIp,
|
555
|
+
HostPort: `${publicPort}`,
|
556
|
+
},
|
557
|
+
];
|
558
|
+
});
|
559
|
+
|
560
|
+
await Promise.all(promises);
|
561
|
+
|
562
|
+
return { PortBindings, ExposedPorts, addonEnv };
|
563
|
+
}
|
564
|
+
|
565
|
+
private async ensureContainer(opts: any) {
|
566
|
+
const container = await containerManager.ensureContainer(opts);
|
567
|
+
|
568
|
+
return this._handleContainer(container);
|
569
|
+
}
|
570
|
+
|
571
|
+
private async _handleContainer(container: Docker.Container): Promise<ProcessInfo> {
|
572
|
+
return {
|
573
|
+
type: InstanceType.DOCKER,
|
574
|
+
pid: container.id,
|
575
|
+
};
|
576
|
+
}
|
577
|
+
}
|