Skip to content

Commit 035eaef

Browse files
committed
Adapters with IRuntimeAdapter interface
1 parent dc52d15 commit 035eaef

File tree

16 files changed

+1437
-584
lines changed

16 files changed

+1437
-584
lines changed

package.json

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,8 @@
104104
"workspaces": {
105105
"packages": [
106106
"packages/*",
107-
"packages/reference-apps/*",
108107
"bdd/"
109108
],
110-
"refapps": [
111-
"packages/reference-apps/*"
112-
],
113-
"modules": [
114-
"packages/*"
115-
],
116109
"bdd": [
117110
"bdd/"
118111
]

packages/adapter-docker/src/docker-instance-adapter.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
InstanceConfig,
1212
RunnerContainerConfiguration,
1313
InstanceLimits,
14-
STHConfiguration,
14+
DockerAdapterConfiguration,
1515
} from "@scramjet/types";
1616
import path from "path";
1717
import { DockerodeDockerHelper } from "./dockerode-docker-helper";
@@ -32,6 +32,7 @@ IComponent {
3232
private dockerHelper: IDockerHelper;
3333
private _limits?: InstanceLimits = {};
3434
private resources: DockerAdapterResources = {};
35+
3536
id: string = "";
3637

3738
logger: IObjectLogger;
@@ -41,7 +42,7 @@ IComponent {
4142
get limits() { return this._limits || {} as InstanceLimits; }
4243
private set limits(value: InstanceLimits) { this._limits = value; }
4344

44-
constructor(_sthConfig: STHConfiguration, id: string = "") {
45+
constructor(_config: DockerAdapterConfiguration, id: string = "") {
4546
this.dockerHelper = new DockerodeDockerHelper();
4647

4748
this.logger = new ObjLogger(this, { id });
Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,39 @@
1+
import { DockerAdapterConfiguration, IInstanceAdapter, IRuntimeAdapter, ISequenceAdapter } from "@scramjet/types";
12
import { DockerodeDockerHelper } from "./dockerode-docker-helper";
3+
import { DockerSequenceAdapter } from "./docker-sequence-adapter";
4+
import { DockerInstanceAdapter } from "./docker-instance-adapter";
25

36
/**
47
* Adapter module must provide SequenceAdapter, InstanceAdapter classes, init method and name field.
58
*/
6-
export { DockerSequenceAdapter as SequenceAdapter } from "./docker-sequence-adapter";
7-
export { DockerInstanceAdapter as InstanceAdapter } from "./docker-instance-adapter";
9+
export default class DockerAdapter implements IRuntimeAdapter {
10+
name = "docker";
811

9-
export const init = async (..._args: any[]) => {
10-
return await DockerodeDockerHelper.isDockerConfigured() ? {} : { error: "Docker initialization failed" };
11-
};
12+
#_instanceAdapter: IInstanceAdapter;
13+
#_sequenceAdapter: ISequenceAdapter;
1214

13-
export const name = "docker";
15+
get instanceAdapter() {
16+
return this.#_instanceAdapter;
17+
}
18+
19+
get sequenceAdapter() {
20+
return this.#_sequenceAdapter;
21+
}
22+
23+
config: DockerAdapterConfiguration;
24+
25+
constructor(config: DockerAdapterConfiguration) {
26+
this.config = config;
27+
28+
this.#_instanceAdapter = new DockerInstanceAdapter(this.config);
29+
this.#_sequenceAdapter = new DockerSequenceAdapter(this.config);
30+
}
31+
32+
getSequenceAdapter(): ISequenceAdapter {
33+
return this.#_sequenceAdapter;
34+
}
35+
36+
async init(): Promise<{ error?: string }> {
37+
return await DockerodeDockerHelper.isDockerConfigured() ? {} : { error: "Docker initialization failed" };
38+
}
39+
}

packages/adapter-k8s/src/index.ts

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,41 @@
1+
import { IInstanceAdapter, IRuntimeAdapter, ISequenceAdapter, K8SAdapterConfiguration } from "@scramjet/types";
2+
import { KubernetesInstanceAdapter } from "./kubernetes-instance-adapter";
3+
import { KubernetesSequenceAdapter } from "./kubernetes-sequence-adapter";
4+
15
/**
26
* Adapter module must provide SequenceAdapter, InstanceAdapter classes, init method and name field.
37
*/
48
export { KubernetesSequenceAdapter as SequenceAdapter } from "./kubernetes-sequence-adapter";
59
export { KubernetesInstanceAdapter as InstanceAdapter } from "./kubernetes-instance-adapter";
610

7-
export const init = async (..._args: any[]) => {
8-
return Promise.resolve({ });
9-
};
11+
export default class KubernetesAdapter implements IRuntimeAdapter {
12+
name = "kubernetes";
13+
14+
#_instanceAdapter: IInstanceAdapter;
15+
#_sequenceAdapter: ISequenceAdapter;
16+
17+
get instanceAdapter() {
18+
return this.#_instanceAdapter;
19+
}
20+
21+
get sequenceAdapter() {
22+
return this.#_sequenceAdapter;
23+
}
24+
25+
config: K8SAdapterConfiguration;
26+
27+
constructor(config: K8SAdapterConfiguration) {
28+
this.config = config;
29+
30+
this.#_instanceAdapter = new KubernetesInstanceAdapter(this.config);
31+
this.#_sequenceAdapter = new KubernetesSequenceAdapter(this.config);
32+
}
33+
34+
getSequenceAdapter(): ISequenceAdapter {
35+
return this.#_sequenceAdapter;
36+
}
1037

11-
export const name = "kubernetes";
38+
async init(): Promise<{ error?: string }> {
39+
return Promise.resolve({});
40+
}
41+
}

packages/adapter-k8s/src/kubernetes-instance-adapter.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import path from "path";
1515
import { ObjLogger } from "@scramjet/obj-logger";
1616
import { createReadStream } from "fs";
1717
import { KubernetesClientAdapter } from "./kubernetes-client-adapter";
18-
import { adapterConfigDecoder } from "./kubernetes-config-decoder";
18+
//import { adapterConfigDecoder } from "./kubernetes-config-decoder";
1919
import { getRunnerEnvEntries } from "@scramjet/adapters-utils";
2020
import { PassThrough } from "stream";
2121
import { RunnerExitCode } from "@scramjet/symbols";
@@ -42,13 +42,13 @@ IComponent {
4242
constructor(config: K8SAdapterConfiguration) {
4343
// @TODO this is a redundant check (it was already checked in sequence adapter)
4444
// We should move this to config service decoding: https://github.com/scramjetorg/transform-hub/issues/279
45-
const decodedAdapterConfig = adapterConfigDecoder.decode(config);
45+
// const decodedAdapterConfig = adapterConfigDecoder.decode(config);
4646

47-
if (!decodedAdapterConfig.isOk()) {
48-
throw new Error("Invalid Kubernetes Adapter configuration");
49-
}
47+
// if (!decodedAdapterConfig.isOk()) {
48+
// throw new Error("Invalid Kubernetes Adapter configuration");
49+
// }
5050

51-
this.adapterConfig = decodedAdapterConfig.value;
51+
this.adapterConfig = config;//decodedAdapterConfig.value;
5252
this.logger = new ObjLogger(this);
5353
}
5454

packages/adapter-k8s/src/kubernetes-sequence-adapter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class KubernetesSequenceAdapter implements ISequenceAdapter {
5757

5858
private adapterConfig: K8SAdapterConfiguration;
5959

60-
constructor(config: KubernetesSequenceAdapter) {
60+
constructor(config: K8SAdapterConfiguration) {
6161
const decodedAdapterConfig = adapterConfigDecoder.decode(config);
6262

6363
if (!decodedAdapterConfig.isOk()) {
Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,43 @@
1+
import { IInstanceAdapter, IRuntimeAdapter, ISequenceAdapter, ProcessAdapterConfiguration } from "@scramjet/types";
2+
import { ProcessInstanceAdapter } from "./process-instance-adapter";
3+
import { ProcessSequenceAdapter } from "./process-sequence-adapter";
4+
15
/**
2-
* Adapter module must provide SequenceAdapter, InstanceAdapter classes, init method and name field.
6+
* Adapter class must implement IRuntimeAdapter Interface.
37
*/
4-
export { ProcessSequenceAdapter as SequenceAdapter } from "./process-sequence-adapter";
5-
export { ProcessInstanceAdapter as InstanceAdapter } from "./process-instance-adapter";
68

7-
export const init = async (config: any) => {
8-
if (!config.sequencesRoot) {
9-
return Promise.reject({ error: "No 'sequencesRoot' in config" });
9+
export default class ProcessAdapter implements IRuntimeAdapter {
10+
name = "process";
11+
12+
#_instanceAdapter: IInstanceAdapter;
13+
#_sequenceAdapter: ISequenceAdapter;
14+
15+
get instanceAdapter() {
16+
return this.#_instanceAdapter;
17+
}
18+
19+
get sequenceAdapter() {
20+
return this.#_sequenceAdapter;
21+
}
22+
23+
config: ProcessAdapterConfiguration;
24+
25+
constructor(config: ProcessAdapterConfiguration) {
26+
this.config = config;
27+
28+
this.#_instanceAdapter = new ProcessInstanceAdapter(this.config);
29+
this.#_sequenceAdapter = new ProcessSequenceAdapter(this.config);
1030
}
1131

12-
return Promise.resolve({});
13-
};
32+
getSequenceAdapter(): ISequenceAdapter {
33+
return this.#_sequenceAdapter;
34+
}
35+
36+
init(): Promise<{ error?: string }> {
37+
if (!this.config.sequencesRoot) {
38+
return Promise.reject({ error: "No 'sequencesRoot' in config" });
39+
}
1440

15-
export const name = "process";
41+
return Promise.resolve({});
42+
}
43+
}

packages/adapter-process/src/process-instance-adapter.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { STHConfiguration,
1+
import {
22
ExitCode,
33
InstanceConfig,
44
InstanceLimits,
55
IObjectLogger,
66
MonitoringMessageData,
77
SequenceConfig,
8-
IInstanceAdapter
8+
IInstanceAdapter,
9+
ProcessAdapterConfiguration
910
} from "@scramjet/types";
1011
import { ObjLogger } from "@scramjet/obj-logger";
1112
import { streamToString } from "@scramjet/utility";
@@ -22,7 +23,7 @@ const gotPython = "\n _ \n __ _____ _ __ ___
2223
*/
2324
class ProcessInstanceAdapter implements IInstanceAdapter {
2425
logger: IObjectLogger;
25-
sthConfig: STHConfiguration;
26+
config: ProcessAdapterConfiguration;
2627

2728
private runnerProcess?: ChildProcess;
2829
private crashLogStreams?: Promise<string[]>;
@@ -34,9 +35,9 @@ class ProcessInstanceAdapter implements IInstanceAdapter {
3435
this.logger.warn("Limits are not yet supported in process runner");
3536
}
3637

37-
constructor(config: STHConfiguration) {
38+
constructor(config: ProcessAdapterConfiguration) {
3839
this.logger = new ObjLogger(this);
39-
this.sthConfig = config;
40+
this.config = config;
4041
}
4142

4243
async init(): Promise<void> {
@@ -71,7 +72,7 @@ class ProcessInstanceAdapter implements IInstanceAdapter {
7172
this.logger.trace(gotPython);
7273
const runnerPath = path.resolve(__dirname, require.resolve("@scramjet/python-runner"));
7374

74-
if (this.sthConfig.debug)
75+
if (this.config.debug)
7576
debugFlags = ["-m", "pdb", "-c", "continue"];
7677

7778
return [
@@ -82,7 +83,7 @@ class ProcessInstanceAdapter implements IInstanceAdapter {
8283
"./python-runner-startup.log",
8384
];
8485
}
85-
if (this.sthConfig.debug)
86+
if (this.config.debug)
8687
debugFlags = ["--inspect-brk=9229"];
8788

8889
return [

packages/adapters-utils/package.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@scramjet/adapters-utils",
3-
"version": "0.34.4",
3+
"version": "0.35.0",
44
"description": "This package is part of Scramjet Transform Hub. This module holds the docker adapters utilized by Scramjet Transform Hub",
55
"main": "./src/index.ts",
66
"scripts": {
@@ -15,21 +15,21 @@
1515
"author": "Scramjet <open-source@scramjet.org>",
1616
"license": "AGPL-3.0",
1717
"dependencies": {
18-
"@scramjet/model": "^0.34.4",
19-
"@scramjet/obj-logger": "^0.34.4",
20-
"@scramjet/pre-runner": "^0.34.4",
21-
"@scramjet/python-runner": "^0.34.4",
22-
"@scramjet/runner": "^0.34.4",
23-
"@scramjet/sth-config": "^0.34.4",
24-
"@scramjet/symbols": "^0.34.4",
25-
"@scramjet/utility": "^0.34.4",
18+
"@scramjet/model": "^0.35.0",
19+
"@scramjet/obj-logger": "^0.35.0",
20+
"@scramjet/pre-runner": "^0.35.0",
21+
"@scramjet/python-runner": "^0.35.0",
22+
"@scramjet/runner": "^0.35.0",
23+
"@scramjet/sth-config": "^0.35.0",
24+
"@scramjet/symbols": "^0.35.0",
25+
"@scramjet/utility": "^0.35.0",
2626
"scramjet": "^4.36.9",
2727
"shell-escape": "^0.2.0",
2828
"systeminformation": "^5.12.7",
2929
"ts.data.json": "^2.2.0"
3030
},
3131
"devDependencies": {
32-
"@scramjet/types": "^0.34.4",
32+
"@scramjet/types": "^0.35.0",
3333
"@types/js-yaml": "4.0.5",
3434
"@types/node": "15.12.5",
3535
"@types/request": "2.48.8",

packages/host/src/lib/adapter-manager.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
import { ObjLogger } from "@scramjet/obj-logger";
22
import { IRuntimeAdapter, InstanceRequirements, STHConfiguration } from "@scramjet/types";
33

4+
export type InitializedRuntimeAdapter = IRuntimeAdapter & {
5+
pkgName: string;
6+
status: "ready" | { error?: string };
7+
};
8+
49
export class AdapterManager {
5-
adapters: { [key: string]: IRuntimeAdapter } = {};
10+
adapters: { [key: string]: InitializedRuntimeAdapter } = {};
611
sthConfig: STHConfiguration;
712

813
logger = new ObjLogger(this);
@@ -23,13 +28,18 @@ export class AdapterManager {
2328
Object.keys(this.sthConfig.adapters).map(
2429
async (pkgName) => {
2530
const typedPkgName = pkgName as unknown as keyof STHConfiguration["adapters"];
26-
const adapter = Object.assign(await import(pkgName), { pkgName }) as IRuntimeAdapter;
31+
const config = this.sthConfig.adapters[typedPkgName]!;
32+
33+
const adapter = Object.assign(
34+
new (await import(pkgName)).default(config),
35+
{ pkgName }
36+
) as InitializedRuntimeAdapter;
2737

2838
if (!AdapterManager.validateAdapter(adapter)) {
2939
throw new Error(`Invalid adapter provided ${adapter.pkgName}`);
3040
}
3141

32-
adapter.config = this.sthConfig.adapters[typedPkgName]!;
42+
adapter.config = config;
3343
adapter.status = await this.initAdapter(adapter);
3444

3545
if (adapter.status !== "ready") {
@@ -63,7 +73,7 @@ export class AdapterManager {
6373
* @returns {boolean} True if required fields are available.
6474
*/
6575
static validateAdapter(adapter: IRuntimeAdapter): boolean {
66-
return !!(adapter.name.trim() && ["SequenceAdapter", "InstanceAdapter", "init"].every((className: string) => className in adapter));
76+
return !!(adapter.name?.trim() && ["sequenceAdapter", "instanceAdapter", "init"].every((className: string) => className in adapter));
6777
}
6878

6979
/**
@@ -73,7 +83,7 @@ export class AdapterManager {
7383
* @returns Object with error field if initialization failed, "ready" otherwise.
7484
*/
7585
async initAdapter(adapter: IRuntimeAdapter): Promise<{ error?: string } | "ready"> {
76-
const initResult = await adapter.init(adapter.config);
86+
const initResult = await adapter.init();
7787

7888
return initResult.error ? initResult : Promise.resolve("ready");
7989
}
@@ -84,7 +94,7 @@ export class AdapterManager {
8494
* @param {string} pkgName Adapter package name.
8595
* @returns {IRuntimeAdapter} Adapter
8696
*/
87-
getAdapterByName(pkgName: string): IRuntimeAdapter | undefined {
97+
getAdapterByName(pkgName: string): InitializedRuntimeAdapter | undefined {
8898
return Object.values(this.adapters).find(a => a.pkgName === pkgName);
8999
}
90100

0 commit comments

Comments
 (0)