@alwaysai/device-agent 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/application-control/backup.d.ts +8 -0
- package/lib/application-control/backup.d.ts.map +1 -0
- package/lib/application-control/backup.js +34 -0
- package/lib/application-control/backup.js.map +1 -0
- package/lib/application-control/environment-variables.d.ts +9 -0
- package/lib/application-control/environment-variables.d.ts.map +1 -0
- package/lib/application-control/environment-variables.js +82 -0
- package/lib/application-control/environment-variables.js.map +1 -0
- package/lib/application-control/index.d.ts +9 -0
- package/lib/application-control/index.d.ts.map +1 -0
- package/lib/application-control/index.js +27 -0
- package/lib/application-control/index.js.map +1 -0
- package/lib/application-control/install.d.ts +16 -0
- package/lib/application-control/install.d.ts.map +1 -0
- package/lib/application-control/install.js +117 -0
- package/lib/application-control/install.js.map +1 -0
- package/lib/application-control/models.d.ts +8 -0
- package/lib/application-control/models.d.ts.map +1 -1
- package/lib/application-control/models.js +44 -11
- package/lib/application-control/models.js.map +1 -1
- package/lib/application-control/status.d.ts +26 -0
- package/lib/application-control/status.d.ts.map +1 -0
- package/lib/application-control/status.js +138 -0
- package/lib/application-control/status.js.map +1 -0
- package/lib/application-control/types.d.ts +5 -0
- package/lib/application-control/types.d.ts.map +1 -0
- package/lib/{util/spawner → application-control}/types.js +0 -0
- package/lib/{util/spawner → application-control}/types.js.map +1 -1
- package/lib/application-control/utils.d.ts +2 -9
- package/lib/application-control/utils.d.ts.map +1 -1
- package/lib/application-control/utils.js +14 -29
- package/lib/application-control/utils.js.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts +16 -1
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.js +239 -9
- package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
- package/lib/docker/docker-cmd.js +2 -2
- package/lib/docker/docker-cmd.js.map +1 -1
- package/lib/docker/docker-compose-cmd.js +2 -2
- package/lib/docker/docker-compose-cmd.js.map +1 -1
- package/lib/environment.d.ts +2 -0
- package/lib/environment.d.ts.map +1 -1
- package/lib/environment.js +3 -1
- package/lib/environment.js.map +1 -1
- package/lib/index.js +10 -8
- package/lib/index.js.map +1 -1
- package/lib/infrastructure/agent-config.d.ts +73 -0
- package/lib/infrastructure/agent-config.d.ts.map +1 -0
- package/lib/infrastructure/agent-config.js +186 -0
- package/lib/infrastructure/agent-config.js.map +1 -0
- package/lib/infrastructure/agent-config.test.d.ts +2 -0
- package/lib/infrastructure/agent-config.test.d.ts.map +1 -0
- package/lib/infrastructure/agent-config.test.js +135 -0
- package/lib/infrastructure/agent-config.test.js.map +1 -0
- package/lib/infrastructure/certificates-and-tokens.d.ts +6 -0
- package/lib/infrastructure/certificates-and-tokens.d.ts.map +1 -0
- package/lib/infrastructure/certificates-and-tokens.js +69 -0
- package/lib/infrastructure/certificates-and-tokens.js.map +1 -0
- package/lib/{util → infrastructure}/urls.d.ts +0 -0
- package/lib/infrastructure/urls.d.ts.map +1 -0
- package/lib/{util → infrastructure}/urls.js +3 -3
- package/lib/infrastructure/urls.js.map +1 -0
- package/lib/root.js +3 -3
- package/lib/root.js.map +1 -1
- package/lib/subcommands/app/app.d.ts +31 -14
- package/lib/subcommands/app/app.d.ts.map +1 -1
- package/lib/subcommands/app/app.js +117 -62
- package/lib/subcommands/app/app.js.map +1 -1
- package/lib/subcommands/app/index.d.ts.map +1 -1
- package/lib/subcommands/app/index.js +6 -1
- package/lib/subcommands/app/index.js.map +1 -1
- package/lib/subcommands/device/device.d.ts +6 -0
- package/lib/subcommands/device/device.d.ts.map +1 -0
- package/lib/subcommands/device/device.js +62 -0
- package/lib/subcommands/device/device.js.map +1 -0
- package/lib/subcommands/device/index.d.ts +2 -0
- package/lib/subcommands/device/index.d.ts.map +1 -0
- package/lib/subcommands/device/index.js +11 -0
- package/lib/subcommands/device/index.js.map +1 -0
- package/lib/subcommands/get-model-package.d.ts +5 -0
- package/lib/subcommands/get-model-package.d.ts.map +1 -0
- package/lib/subcommands/get-model-package.js +51 -0
- package/lib/subcommands/get-model-package.js.map +1 -0
- package/lib/subcommands/index.d.ts +8 -1
- package/lib/subcommands/index.d.ts.map +1 -1
- package/lib/subcommands/index.js +6 -6
- package/lib/subcommands/index.js.map +1 -1
- package/lib/subcommands/login.d.ts +3 -2
- package/lib/subcommands/login.d.ts.map +1 -1
- package/lib/subcommands/login.js +11 -4
- package/lib/subcommands/login.js.map +1 -1
- package/lib/util/copy-dir.js +3 -3
- package/lib/util/copy-dir.js.map +1 -1
- package/lib/util/directories.d.ts +1 -1
- package/lib/util/directories.d.ts.map +1 -1
- package/lib/util/directories.js +9 -14
- package/lib/util/directories.js.map +1 -1
- package/lib/util/get-device-id.d.ts +2 -0
- package/lib/util/get-device-id.d.ts.map +1 -0
- package/lib/util/get-device-id.js +24 -0
- package/lib/util/get-device-id.js.map +1 -0
- package/package.json +19 -14
- package/readme.md +176 -72
- package/src/application-control/backup.ts +32 -0
- package/src/application-control/environment-variables.ts +81 -0
- package/src/application-control/index.ts +40 -0
- package/src/application-control/install.ts +126 -0
- package/src/application-control/models.ts +51 -11
- package/src/application-control/status.ts +156 -0
- package/src/application-control/types.ts +1 -0
- package/src/application-control/utils.ts +12 -27
- package/src/cloud-connection/device-agent-cloud-connection.ts +280 -13
- package/src/docker/docker-cmd.ts +1 -1
- package/src/docker/docker-compose-cmd.ts +1 -1
- package/src/environment.ts +2 -0
- package/src/index.ts +10 -7
- package/src/infrastructure/agent-config.test.ts +143 -0
- package/src/infrastructure/agent-config.ts +217 -0
- package/src/infrastructure/certificates-and-tokens.ts +71 -0
- package/src/{util → infrastructure}/urls.ts +1 -1
- package/src/root.ts +3 -3
- package/src/subcommands/app/app.ts +135 -62
- package/src/subcommands/app/index.ts +11 -1
- package/src/subcommands/device/device.ts +63 -0
- package/src/subcommands/device/index.ts +8 -0
- package/src/subcommands/get-model-package.ts +60 -0
- package/src/subcommands/index.ts +5 -5
- package/src/subcommands/login.ts +11 -4
- package/src/util/copy-dir.ts +1 -1
- package/src/util/directories.ts +12 -17
- package/src/util/get-device-id.ts +22 -0
- package/lib/application-control/application-control.d.ts +0 -46
- package/lib/application-control/application-control.d.ts.map +0 -1
- package/lib/application-control/application-control.js +0 -234
- package/lib/application-control/application-control.js.map +0 -1
- package/lib/constants.d.ts +0 -17
- package/lib/constants.d.ts.map +0 -1
- package/lib/constants.js +0 -24
- package/lib/constants.js.map +0 -1
- package/lib/subcommands/device-control.d.ts +0 -2
- package/lib/subcommands/device-control.d.ts.map +0 -1
- package/lib/subcommands/device-control.js +0 -19
- package/lib/subcommands/device-control.js.map +0 -1
- package/lib/subcommands/test-app.d.ts +0 -2
- package/lib/subcommands/test-app.d.ts.map +0 -1
- package/lib/subcommands/test-app.js +0 -29
- package/lib/subcommands/test-app.js.map +0 -1
- package/lib/util/spawner/gnu-spawner.d.ts +0 -9
- package/lib/util/spawner/gnu-spawner.d.ts.map +0 -1
- package/lib/util/spawner/gnu-spawner.js +0 -102
- package/lib/util/spawner/gnu-spawner.js.map +0 -1
- package/lib/util/spawner/js-spawner.d.ts +0 -5
- package/lib/util/spawner/js-spawner.d.ts.map +0 -1
- package/lib/util/spawner/js-spawner.js +0 -89
- package/lib/util/spawner/js-spawner.js.map +0 -1
- package/lib/util/spawner/types.d.ts +0 -28
- package/lib/util/spawner/types.d.ts.map +0 -1
- package/lib/util/spawner-base/index.d.ts +0 -17
- package/lib/util/spawner-base/index.d.ts.map +0 -1
- package/lib/util/spawner-base/index.js +0 -30
- package/lib/util/spawner-base/index.js.map +0 -1
- package/lib/util/spawner-base/run-foreground-sync.d.ts +0 -3
- package/lib/util/spawner-base/run-foreground-sync.d.ts.map +0 -1
- package/lib/util/spawner-base/run-foreground-sync.js +0 -18
- package/lib/util/spawner-base/run-foreground-sync.js.map +0 -1
- package/lib/util/spawner-base/run-foreground.d.ts +0 -3
- package/lib/util/spawner-base/run-foreground.d.ts.map +0 -1
- package/lib/util/spawner-base/run-foreground.js +0 -49
- package/lib/util/spawner-base/run-foreground.js.map +0 -1
- package/lib/util/spawner-base/run-streaming.d.ts +0 -4
- package/lib/util/spawner-base/run-streaming.d.ts.map +0 -1
- package/lib/util/spawner-base/run-streaming.js +0 -35
- package/lib/util/spawner-base/run-streaming.js.map +0 -1
- package/lib/util/spawner-base/run.d.ts +0 -4
- package/lib/util/spawner-base/run.d.ts.map +0 -1
- package/lib/util/spawner-base/run.js +0 -56
- package/lib/util/spawner-base/run.js.map +0 -1
- package/lib/util/urls.d.ts.map +0 -1
- package/lib/util/urls.js.map +0 -1
- package/lib/web/index.html +0 -229
- package/lib/web/static/Karla.css +0 -18
- package/lib/web/static/bootstrap-4.3.1.min.css +0 -7
- package/lib/web/static/bootstrap-4.3.1.min.js +0 -7
- package/lib/web/static/favicon.ico +0 -0
- package/lib/web/static/jquery-3.3.1.slim.min.js +0 -2
- package/lib/web/static/popper-1.14.7.min.js +0 -5
- package/lib/web/web-interface.d.ts +0 -2
- package/lib/web/web-interface.d.ts.map +0 -1
- package/lib/web/web-interface.js +0 -74
- package/lib/web/web-interface.js.map +0 -1
- package/src/application-control/application-control.ts +0 -273
- package/src/constants.ts +0 -32
- package/src/subcommands/device-control.ts +0 -16
- package/src/subcommands/test-app.ts +0 -30
- package/src/util/spawner/gnu-spawner.ts +0 -114
- package/src/util/spawner/js-spawner.ts +0 -110
- package/src/util/spawner/types.ts +0 -28
- package/src/util/spawner-base/index.ts +0 -28
- package/src/util/spawner-base/run-foreground-sync.ts +0 -16
- package/src/util/spawner-base/run-foreground.ts +0 -49
- package/src/util/spawner-base/run-streaming.ts +0 -40
- package/src/util/spawner-base/run.ts +0 -60
- package/src/web/index.html +0 -229
- package/src/web/static/Karla.css +0 -18
- package/src/web/static/bootstrap-4.3.1.min.css +0 -7
- package/src/web/static/bootstrap-4.3.1.min.js +0 -7
- package/src/web/static/favicon.ico +0 -0
- package/src/web/static/jquery-3.3.1.slim.min.js +0 -2
- package/src/web/static/popper-1.14.7.min.js +0 -5
- package/src/web/web-interface.ts +0 -89
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/application-control/backup.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,UAAU,SAAS,CAAC;AAEjC,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBAQjE;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBAa7D"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rollbackApp = exports.createAppBackup = exports.BACKUP_EXT = void 0;
|
|
4
|
+
const rimraf = require("rimraf");
|
|
5
|
+
const copy_dir_1 = require("../util/copy-dir");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
const agent_config_1 = require("../infrastructure/agent-config");
|
|
8
|
+
exports.BACKUP_EXT = '.bak';
|
|
9
|
+
async function createAppBackup(props) {
|
|
10
|
+
const { projectId } = props;
|
|
11
|
+
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
12
|
+
const backupAppDir = `${appDir}${exports.BACKUP_EXT}`;
|
|
13
|
+
rimraf.sync(backupAppDir);
|
|
14
|
+
await (0, copy_dir_1.copyDir)({ srcPath: appDir, destPath: backupAppDir });
|
|
15
|
+
await (0, agent_config_1.AgentConfigFile)().setAppBackup({ projectId });
|
|
16
|
+
console.log(`Backed up app ${projectId} to ${backupAppDir}`);
|
|
17
|
+
}
|
|
18
|
+
exports.createAppBackup = createAppBackup;
|
|
19
|
+
async function rollbackApp(props) {
|
|
20
|
+
const { projectId } = props;
|
|
21
|
+
const config = await (0, agent_config_1.AgentConfigFile)().getAppBackup({ projectId });
|
|
22
|
+
if (!config) {
|
|
23
|
+
throw new Error(`Backup doesn't exist for ${projectId}`);
|
|
24
|
+
}
|
|
25
|
+
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
26
|
+
const backupAppDir = `${appDir}${exports.BACKUP_EXT}`;
|
|
27
|
+
rimraf.sync(appDir);
|
|
28
|
+
await (0, copy_dir_1.copyDir)({ srcPath: backupAppDir, destPath: appDir });
|
|
29
|
+
await (0, utils_1.buildApp)({ appDir });
|
|
30
|
+
await (0, agent_config_1.AgentConfigFile)().setAppInstalled({ projectId, version: config.version });
|
|
31
|
+
console.log(`Rolled back app ${projectId} to ${config.version}`);
|
|
32
|
+
}
|
|
33
|
+
exports.rollbackApp = rollbackApp;
|
|
34
|
+
//# sourceMappingURL=backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/application-control/backup.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AAEjC,+CAA2C;AAC3C,mCAA8C;AAC9C,iEAAiE;AAEpD,QAAA,UAAU,GAAG,MAAM,CAAC;AAE1B,KAAK,UAAU,eAAe,CAAC,KAA4B;IAChE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,GAAG,MAAM,GAAG,kBAAU,EAAE,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1B,MAAM,IAAA,kBAAO,EAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAA,8BAAe,GAAE,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,iBAAiB,SAAS,OAAO,YAAY,EAAE,CAAC,CAAC;AAC/D,CAAC;AARD,0CAQC;AAEM,KAAK,UAAU,WAAW,CAAC,KAA4B;IAC5D,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAe,GAAE,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,IAAI,KAAK,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC;KAC1D;IACD,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,GAAG,MAAM,GAAG,kBAAU,EAAE,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,IAAA,kBAAO,EAAC,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAA,gBAAQ,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3B,MAAM,IAAA,8BAAe,GAAE,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AACnE,CAAC;AAbD,kCAaC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment-variables.d.ts","sourceRoot":"","sources":["../../src/application-control/environment-variables.ts"],"names":[],"mappings":"AAMA,wBAAsB,MAAM,CAAC,KAAK,EAAE;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,iBAmCA;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,eAiC5D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAllEnvs = exports.setEnv = void 0;
|
|
4
|
+
const util_1 = require("alwaysai/lib/util");
|
|
5
|
+
const docker_compose_1 = require("docker-compose");
|
|
6
|
+
const yaml_1 = require("yaml");
|
|
7
|
+
const agent_config_1 = require("../infrastructure/agent-config");
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
async function setEnv(props) {
|
|
10
|
+
const { projectId, vars } = props;
|
|
11
|
+
if (!(0, agent_config_1.AgentConfigFile)().isAppReady({ projectId })) {
|
|
12
|
+
throw new Error(`App ${projectId} is not ready!`);
|
|
13
|
+
}
|
|
14
|
+
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
15
|
+
const spawner = (0, util_1.JsSpawner)({ path: appDir });
|
|
16
|
+
const composeContents = await spawner.readFile('docker-compose.yaml');
|
|
17
|
+
const composeParsed = (0, yaml_1.parse)(composeContents);
|
|
18
|
+
if ('services' in composeParsed) {
|
|
19
|
+
let services = Object.keys(composeParsed['services']);
|
|
20
|
+
if (props.service) {
|
|
21
|
+
console.log(services);
|
|
22
|
+
if (services.includes(props.service)) {
|
|
23
|
+
services = [props.service];
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
throw new Error(`Service ${props.service} not found in ${services}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
for (const s of services) {
|
|
30
|
+
const service = composeParsed['services'][s];
|
|
31
|
+
// The environment field overrides the env files, so by appending to
|
|
32
|
+
// the environment list we can assure the value will be used
|
|
33
|
+
if ('environment' in service) {
|
|
34
|
+
const environment = service['environment'];
|
|
35
|
+
composeParsed['services'][s]['environment'] = environment.concat(vars);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
composeParsed['services'][s]['environment'] = vars;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const composeOutput = (0, yaml_1.stringify)(composeParsed);
|
|
43
|
+
// Validate new contents
|
|
44
|
+
await docker_compose_1.default.config({ cwd: appDir, configAsString: composeOutput });
|
|
45
|
+
await spawner.writeFile('docker-compose.yaml', composeOutput);
|
|
46
|
+
}
|
|
47
|
+
exports.setEnv = setEnv;
|
|
48
|
+
async function getAllEnvs(props) {
|
|
49
|
+
const { projectId } = props;
|
|
50
|
+
if (!(0, agent_config_1.AgentConfigFile)().isAppReady({ projectId })) {
|
|
51
|
+
throw new Error(`App ${projectId} is not ready!`);
|
|
52
|
+
}
|
|
53
|
+
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
54
|
+
const spawner = (0, util_1.JsSpawner)({ path: appDir });
|
|
55
|
+
const envVars = {};
|
|
56
|
+
const composeContents = await spawner.readFile('docker-compose.yaml');
|
|
57
|
+
const composeParsed = (0, yaml_1.parse)(composeContents);
|
|
58
|
+
if ('services' in composeParsed) {
|
|
59
|
+
const services = Object.keys(composeParsed['services']);
|
|
60
|
+
for (const s of services) {
|
|
61
|
+
envVars[s] = [];
|
|
62
|
+
const service = composeParsed['services'][s];
|
|
63
|
+
if ('env_file' in service) {
|
|
64
|
+
const envFiles = service['env_file'];
|
|
65
|
+
for (const ef of envFiles) {
|
|
66
|
+
envVars[s] = envVars[s].concat((await spawner.readFile(ef)).split('\n'));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if ('environment' in service) {
|
|
70
|
+
const environment = service['environment'];
|
|
71
|
+
envVars[s] = envVars[s].concat(environment);
|
|
72
|
+
}
|
|
73
|
+
// Filter out empty lines and comment lines
|
|
74
|
+
envVars[s] = envVars[s].filter((v) => {
|
|
75
|
+
return v !== '' && !v.includes('#');
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return envVars;
|
|
80
|
+
}
|
|
81
|
+
exports.getAllEnvs = getAllEnvs;
|
|
82
|
+
//# sourceMappingURL=environment-variables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment-variables.js","sourceRoot":"","sources":["../../src/application-control/environment-variables.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { installApp, uninstallApp } from './install';
|
|
2
|
+
import { rollbackApp } from './backup';
|
|
3
|
+
import { listAppReleases, listAppLatestRelease, getAppStatus, startApp, getAppLogs, stopApp, restartApp } from './status';
|
|
4
|
+
import { ModelDetails } from './types';
|
|
5
|
+
import { getAllEnvs, setEnv } from './environment-variables';
|
|
6
|
+
export { installApp, uninstallApp, rollbackApp, listAppReleases, listAppLatestRelease, getAppStatus, startApp, getAppLogs, stopApp, restartApp, ModelDetails, getAllEnvs, setEnv, };
|
|
7
|
+
import { addModel, getAppModels, removeModel, replaceModels, updateModels } from './models';
|
|
8
|
+
export { addModel, getAppModels, removeModel, replaceModels, updateModels };
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/application-control/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,OAAO,EACP,UAAU,EACX,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EACL,UAAU,EACV,YAAY,EACZ,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,OAAO,EACP,UAAU,EACV,YAAY,EACZ,UAAU,EACV,MAAM,GACP,CAAC;AAGF,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.updateModels = exports.replaceModels = exports.removeModel = exports.getAppModels = exports.addModel = exports.setEnv = exports.getAllEnvs = exports.restartApp = exports.stopApp = exports.getAppLogs = exports.startApp = exports.getAppStatus = exports.listAppLatestRelease = exports.listAppReleases = exports.rollbackApp = exports.uninstallApp = exports.installApp = void 0;
|
|
4
|
+
const install_1 = require("./install");
|
|
5
|
+
Object.defineProperty(exports, "installApp", { enumerable: true, get: function () { return install_1.installApp; } });
|
|
6
|
+
Object.defineProperty(exports, "uninstallApp", { enumerable: true, get: function () { return install_1.uninstallApp; } });
|
|
7
|
+
const backup_1 = require("./backup");
|
|
8
|
+
Object.defineProperty(exports, "rollbackApp", { enumerable: true, get: function () { return backup_1.rollbackApp; } });
|
|
9
|
+
const status_1 = require("./status");
|
|
10
|
+
Object.defineProperty(exports, "listAppReleases", { enumerable: true, get: function () { return status_1.listAppReleases; } });
|
|
11
|
+
Object.defineProperty(exports, "listAppLatestRelease", { enumerable: true, get: function () { return status_1.listAppLatestRelease; } });
|
|
12
|
+
Object.defineProperty(exports, "getAppStatus", { enumerable: true, get: function () { return status_1.getAppStatus; } });
|
|
13
|
+
Object.defineProperty(exports, "startApp", { enumerable: true, get: function () { return status_1.startApp; } });
|
|
14
|
+
Object.defineProperty(exports, "getAppLogs", { enumerable: true, get: function () { return status_1.getAppLogs; } });
|
|
15
|
+
Object.defineProperty(exports, "stopApp", { enumerable: true, get: function () { return status_1.stopApp; } });
|
|
16
|
+
Object.defineProperty(exports, "restartApp", { enumerable: true, get: function () { return status_1.restartApp; } });
|
|
17
|
+
const environment_variables_1 = require("./environment-variables");
|
|
18
|
+
Object.defineProperty(exports, "getAllEnvs", { enumerable: true, get: function () { return environment_variables_1.getAllEnvs; } });
|
|
19
|
+
Object.defineProperty(exports, "setEnv", { enumerable: true, get: function () { return environment_variables_1.setEnv; } });
|
|
20
|
+
// CLI-mode only
|
|
21
|
+
const models_1 = require("./models");
|
|
22
|
+
Object.defineProperty(exports, "addModel", { enumerable: true, get: function () { return models_1.addModel; } });
|
|
23
|
+
Object.defineProperty(exports, "getAppModels", { enumerable: true, get: function () { return models_1.getAppModels; } });
|
|
24
|
+
Object.defineProperty(exports, "removeModel", { enumerable: true, get: function () { return models_1.removeModel; } });
|
|
25
|
+
Object.defineProperty(exports, "replaceModels", { enumerable: true, get: function () { return models_1.replaceModels; } });
|
|
26
|
+
Object.defineProperty(exports, "updateModels", { enumerable: true, get: function () { return models_1.updateModels; } });
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/application-control/index.ts"],"names":[],"mappings":";;;AAAA,uCAAqD;AAenD,2FAfO,oBAAU,OAeP;AACV,6FAhBmB,sBAAY,OAgBnB;AAfd,qCAAuC;AAgBrC,4FAhBO,oBAAW,OAgBP;AAfb,qCAQkB;AAQhB,gGAfA,wBAAe,OAeA;AACf,qGAfA,6BAAoB,OAeA;AACpB,6FAfA,qBAAY,OAeA;AACZ,yFAfA,iBAAQ,OAeA;AACR,2FAfA,mBAAU,OAeA;AACV,wFAfA,gBAAO,OAeA;AACP,2FAfA,mBAAU,OAeA;AAZZ,mEAA6D;AAc3D,2FAdO,kCAAU,OAcP;AACV,uFAfmB,8BAAM,OAenB;AAGR,gBAAgB;AAChB,qCAMkB;AAET,yFAPP,iBAAQ,OAOO;AAAE,6FANjB,qBAAY,OAMiB;AAAE,4FAL/B,oBAAW,OAK+B;AAAE,8FAJ5C,sBAAa,OAI4C;AAAE,6FAH3D,qBAAY,OAG2D"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AppDetails } from '@alwaysai/device-agent-schemas';
|
|
2
|
+
export declare function getInstalledApps(): Promise<AppDetails[]>;
|
|
3
|
+
export declare type InstallAppProps = {
|
|
4
|
+
projectId: string;
|
|
5
|
+
releaseHash: string;
|
|
6
|
+
presignedAppUrl?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function installAppPackage({ localDest, presignedUrl }: {
|
|
9
|
+
localDest: any;
|
|
10
|
+
presignedUrl: any;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
export declare function installApp(props: InstallAppProps): Promise<void>;
|
|
13
|
+
export declare function uninstallApp(props: {
|
|
14
|
+
projectId: string;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/application-control/install.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAK5D,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAQ9D;AAED,oBAAY,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE;;;CAAA,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBlF;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DtE;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB9E"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.uninstallApp = exports.installApp = exports.installAppPackage = exports.getInstalledApps = void 0;
|
|
4
|
+
const rimraf = require("rimraf");
|
|
5
|
+
const fs = require("fs");
|
|
6
|
+
const path = require("path");
|
|
7
|
+
const node_fetch_1 = require("node-fetch");
|
|
8
|
+
const util_1 = require("alwaysai/lib/util");
|
|
9
|
+
const run_cli_cmd_1 = require("../util/run-cli-cmd");
|
|
10
|
+
const utils_1 = require("./utils");
|
|
11
|
+
const backup_1 = require("./backup");
|
|
12
|
+
const status_1 = require("./status");
|
|
13
|
+
const agent_config_1 = require("../infrastructure/agent-config");
|
|
14
|
+
async function getInstalledApps() {
|
|
15
|
+
const apps = await (0, agent_config_1.AgentConfigFile)().getApps();
|
|
16
|
+
const appDetails = [];
|
|
17
|
+
for (const app of apps) {
|
|
18
|
+
const { projectId, version } = app;
|
|
19
|
+
appDetails.push({ projectId, version });
|
|
20
|
+
}
|
|
21
|
+
return appDetails;
|
|
22
|
+
}
|
|
23
|
+
exports.getInstalledApps = getInstalledApps;
|
|
24
|
+
async function installAppPackage({ localDest, presignedUrl }) {
|
|
25
|
+
const response = await (0, node_fetch_1.default)(presignedUrl);
|
|
26
|
+
if (response.status !== 200) {
|
|
27
|
+
// If the URL is invalid; I think we shouldn't get here with the new changes
|
|
28
|
+
throw new Error(`Status Code: ${response.status}, ${response.statusText}. Response: ${response.body}`);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Write the app package to the hash directory
|
|
32
|
+
*/
|
|
33
|
+
const stream = response.body.pipe(fs.createWriteStream(localDest));
|
|
34
|
+
await new Promise((resolve, reject) => {
|
|
35
|
+
stream.on('finish', resolve);
|
|
36
|
+
stream.on('error', reject);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
exports.installAppPackage = installAppPackage;
|
|
40
|
+
async function installApp(props) {
|
|
41
|
+
const { projectId, releaseHash, presignedAppUrl } = props;
|
|
42
|
+
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
43
|
+
const spawner = (0, util_1.JsSpawner)();
|
|
44
|
+
if (await (0, agent_config_1.AgentConfigFile)().isAppPresent({ projectId })) {
|
|
45
|
+
if (!(await (0, agent_config_1.AgentConfigFile)().isAppReady({ projectId }))) {
|
|
46
|
+
throw new Error('Application already has installation in progress!');
|
|
47
|
+
}
|
|
48
|
+
await (0, agent_config_1.AgentConfigFile)().setAppInstalling({ projectId, version: releaseHash });
|
|
49
|
+
console.log('Application is already installed, updating');
|
|
50
|
+
await (0, backup_1.createAppBackup)({ projectId });
|
|
51
|
+
await spawner.rimraf(appDir);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
await (0, agent_config_1.AgentConfigFile)().setAppInstalling({ projectId, version: releaseHash });
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Prep directory and fetch the app package
|
|
58
|
+
*/
|
|
59
|
+
await spawner.mkdirp(appDir);
|
|
60
|
+
const localDest = path.join(appDir, `${path.basename(releaseHash)}.tgz`);
|
|
61
|
+
if (!presignedAppUrl) {
|
|
62
|
+
// Download the application using the CLI
|
|
63
|
+
await (0, run_cli_cmd_1.runCliCmd)({
|
|
64
|
+
cmd: [
|
|
65
|
+
'release',
|
|
66
|
+
'pull',
|
|
67
|
+
'--yes',
|
|
68
|
+
'--project',
|
|
69
|
+
projectId,
|
|
70
|
+
'--releaseHash',
|
|
71
|
+
releaseHash,
|
|
72
|
+
],
|
|
73
|
+
cwd: appDir,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
await installAppPackage({ localDest, presignedUrl: presignedAppUrl });
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Unpack app package
|
|
81
|
+
*/
|
|
82
|
+
await spawner.untar(fs.createReadStream(localDest), appDir);
|
|
83
|
+
console.log(`Unpacked application to ${appDir}`);
|
|
84
|
+
/**
|
|
85
|
+
* Build app
|
|
86
|
+
* ToDo: migrate the model pull to use MQTT workflow
|
|
87
|
+
*/
|
|
88
|
+
await (0, utils_1.buildApp)({ appDir });
|
|
89
|
+
/**
|
|
90
|
+
* Remove tar file
|
|
91
|
+
*/
|
|
92
|
+
await spawner.rimraf(localDest);
|
|
93
|
+
await (0, agent_config_1.AgentConfigFile)().setAppInstalled({ projectId, version: releaseHash });
|
|
94
|
+
console.log(`Installed ${projectId} to ${appDir}`);
|
|
95
|
+
}
|
|
96
|
+
exports.installApp = installApp;
|
|
97
|
+
async function uninstallApp(props) {
|
|
98
|
+
const { projectId } = props;
|
|
99
|
+
if (!(await (0, agent_config_1.AgentConfigFile)().isAppPresent({ projectId }))) {
|
|
100
|
+
console.log(`Application ${projectId} not installed`);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
await (0, status_1.stopApp)({ projectId });
|
|
105
|
+
}
|
|
106
|
+
catch (_a) {
|
|
107
|
+
console.log('Failed to stop app, may be left running...');
|
|
108
|
+
}
|
|
109
|
+
await (0, agent_config_1.AgentConfigFile)().setAppUninstalled({ projectId });
|
|
110
|
+
// Delete application directory and backup
|
|
111
|
+
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
112
|
+
rimraf.sync(appDir);
|
|
113
|
+
rimraf.sync(`${appDir}${backup_1.BACKUP_EXT}`);
|
|
114
|
+
console.log('Uninstalled', projectId);
|
|
115
|
+
}
|
|
116
|
+
exports.uninstallApp = uninstallApp;
|
|
117
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/application-control/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { ModelDetails } from './types';
|
|
2
|
+
export declare function getAppModels(props: {
|
|
3
|
+
projectId: string;
|
|
4
|
+
}): Promise<ModelDetails[]>;
|
|
1
5
|
export declare function addModel(props: {
|
|
2
6
|
projectId: string;
|
|
3
7
|
modelId: string;
|
|
@@ -6,6 +10,10 @@ export declare function removeModel(props: {
|
|
|
6
10
|
projectId: string;
|
|
7
11
|
modelId: string;
|
|
8
12
|
}): Promise<void>;
|
|
13
|
+
export declare function replaceModels(props: {
|
|
14
|
+
projectId: string;
|
|
15
|
+
modelIds: string[];
|
|
16
|
+
}): Promise<void>;
|
|
9
17
|
export declare function updateModels(props: {
|
|
10
18
|
projectId: string;
|
|
11
19
|
}): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/application-control/models.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/application-control/models.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,wBAAsB,YAAY,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,2BAkB9D;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,iBAU3E;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,iBAS9E;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,iBAgBnF;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBAU9D"}
|
|
@@ -1,14 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.updateModels = exports.removeModel = exports.addModel = void 0;
|
|
3
|
+
exports.updateModels = exports.replaceModels = exports.removeModel = exports.addModel = exports.getAppModels = void 0;
|
|
4
|
+
const util_1 = require("alwaysai/lib/util");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
4
7
|
const run_cli_cmd_1 = require("../util/run-cli-cmd");
|
|
5
8
|
const utils_1 = require("./utils");
|
|
9
|
+
async function getAppModels(props) {
|
|
10
|
+
const { projectId } = props;
|
|
11
|
+
await (0, utils_1.requireAppInstalled)({ projectId });
|
|
12
|
+
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
13
|
+
const appCfgPath = (0, path_1.join)(appDir, 'alwaysai.app.json');
|
|
14
|
+
if (!(0, fs_1.existsSync)(appCfgPath)) {
|
|
15
|
+
throw new Error('Application config not found!');
|
|
16
|
+
}
|
|
17
|
+
const appCfg = JSON.parse(await (0, util_1.JsSpawner)().readFile(appCfgPath));
|
|
18
|
+
const modelDetails = [];
|
|
19
|
+
if (!('models' in appCfg)) {
|
|
20
|
+
return modelDetails;
|
|
21
|
+
}
|
|
22
|
+
for (const model in appCfg['models']) {
|
|
23
|
+
modelDetails.push({ modelId: model, version: appCfg['models'][model] });
|
|
24
|
+
}
|
|
25
|
+
return modelDetails;
|
|
26
|
+
}
|
|
27
|
+
exports.getAppModels = getAppModels;
|
|
6
28
|
async function addModel(props) {
|
|
7
29
|
const { projectId, modelId } = props;
|
|
30
|
+
await (0, utils_1.requireAppInstalled)({ projectId });
|
|
8
31
|
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
9
|
-
if (!(await (0, utils_1.isAppInstalled)({ appDir }))) {
|
|
10
|
-
throw new Error('Application is not installed');
|
|
11
|
-
}
|
|
12
32
|
await (0, run_cli_cmd_1.runCliCmd)({
|
|
13
33
|
cmd: ['app', 'models', 'add', modelId],
|
|
14
34
|
cwd: appDir,
|
|
@@ -18,22 +38,35 @@ async function addModel(props) {
|
|
|
18
38
|
exports.addModel = addModel;
|
|
19
39
|
async function removeModel(props) {
|
|
20
40
|
const { projectId, modelId } = props;
|
|
41
|
+
await (0, utils_1.requireAppInstalled)({ projectId });
|
|
21
42
|
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
22
|
-
if (!(await (0, utils_1.isAppInstalled)({ appDir }))) {
|
|
23
|
-
throw new Error('Application is not installed');
|
|
24
|
-
}
|
|
25
43
|
await (0, run_cli_cmd_1.runCliCmd)({
|
|
26
|
-
cmd: ['app', 'models', 'remove', modelId],
|
|
44
|
+
cmd: ['app', 'models', 'remove', modelId, '--purge'],
|
|
27
45
|
cwd: appDir,
|
|
28
46
|
});
|
|
29
47
|
}
|
|
30
48
|
exports.removeModel = removeModel;
|
|
49
|
+
async function replaceModels(props) {
|
|
50
|
+
const { projectId, modelIds } = props;
|
|
51
|
+
await (0, utils_1.requireAppInstalled)({ projectId });
|
|
52
|
+
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
53
|
+
await (0, run_cli_cmd_1.runCliCmd)({
|
|
54
|
+
cmd: ['app', 'models', 'remove-all', '--purge'],
|
|
55
|
+
cwd: appDir,
|
|
56
|
+
});
|
|
57
|
+
for (const modelId of modelIds) {
|
|
58
|
+
await (0, run_cli_cmd_1.runCliCmd)({
|
|
59
|
+
cmd: ['app', 'models', 'add', modelId],
|
|
60
|
+
cwd: appDir,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
await (0, utils_1.buildApp)({ appDir });
|
|
64
|
+
}
|
|
65
|
+
exports.replaceModels = replaceModels;
|
|
31
66
|
async function updateModels(props) {
|
|
32
67
|
const { projectId } = props;
|
|
68
|
+
await (0, utils_1.requireAppInstalled)({ projectId });
|
|
33
69
|
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
34
|
-
if (!(await (0, utils_1.isAppInstalled)({ appDir }))) {
|
|
35
|
-
throw new Error('Application is not installed');
|
|
36
|
-
}
|
|
37
70
|
await (0, run_cli_cmd_1.runCliCmd)({
|
|
38
71
|
cmd: ['app', 'models', 'update'],
|
|
39
72
|
cwd: appDir,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/application-control/models.ts"],"names":[],"mappings":";;;AAAA,qDAAgD;
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/application-control/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { AppState } from '@alwaysai/device-agent-schemas';
|
|
3
|
+
export declare function listAppReleases(props: {
|
|
4
|
+
projectId: string;
|
|
5
|
+
}): Promise<import("alwaysai/lib/infrastructure").ReleaseHistoryArray>;
|
|
6
|
+
export declare function listAppLatestRelease(props: {
|
|
7
|
+
projectId: string;
|
|
8
|
+
}): Promise<string | undefined>;
|
|
9
|
+
export declare function getAppStatus(props: {
|
|
10
|
+
projectId: string;
|
|
11
|
+
}): Promise<AppState>;
|
|
12
|
+
export declare function getAppLogs(props: {
|
|
13
|
+
projectId: string;
|
|
14
|
+
services?: string[];
|
|
15
|
+
}): Promise<NodeJS.ReadableStream>;
|
|
16
|
+
export declare function startApp(props: {
|
|
17
|
+
projectId: string;
|
|
18
|
+
dockerLoginToken?: string;
|
|
19
|
+
}): Promise<void>;
|
|
20
|
+
export declare function stopApp(props: {
|
|
21
|
+
projectId: string;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
export declare function restartApp(props: {
|
|
24
|
+
projectId: string;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/application-control/status.ts"],"names":[],"mappings":";AAMA,OAAO,EAAgC,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAGxF,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,sEAIjE;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,+BAOtE;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuDlF;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAuBjC;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhB;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAezE;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5E"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.restartApp = exports.stopApp = exports.startApp = exports.getAppLogs = exports.getAppStatus = exports.listAppLatestRelease = exports.listAppReleases = void 0;
|
|
4
|
+
const docker_compose_1 = require("docker-compose");
|
|
5
|
+
const infrastructure_1 = require("alwaysai/lib/infrastructure");
|
|
6
|
+
const util_1 = require("alwaysai/lib/util");
|
|
7
|
+
const docker_cmd_1 = require("../docker/docker-cmd");
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
const agent_config_1 = require("../infrastructure/agent-config");
|
|
10
|
+
async function listAppReleases(props) {
|
|
11
|
+
const { projectId } = props;
|
|
12
|
+
const releaseHistory = await (0, infrastructure_1.fetchAppReleaseHistory)(projectId);
|
|
13
|
+
return releaseHistory;
|
|
14
|
+
}
|
|
15
|
+
exports.listAppReleases = listAppReleases;
|
|
16
|
+
async function listAppLatestRelease(props) {
|
|
17
|
+
const { projectId } = props;
|
|
18
|
+
const releaseHistory = await (0, infrastructure_1.fetchAppReleaseHistory)(projectId);
|
|
19
|
+
if (releaseHistory.length >= 1) {
|
|
20
|
+
return releaseHistory[0]['releaseHash'];
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
exports.listAppLatestRelease = listAppLatestRelease;
|
|
25
|
+
async function getAppStatus(props) {
|
|
26
|
+
const { projectId } = props;
|
|
27
|
+
if (!(await (0, agent_config_1.AgentConfigFile)().isAppPresent({ projectId }))) {
|
|
28
|
+
throw new Error('Application is not installed');
|
|
29
|
+
}
|
|
30
|
+
const appDetails = {
|
|
31
|
+
projectId,
|
|
32
|
+
version: await (0, agent_config_1.AgentConfigFile)().getAppVersion({ projectId }),
|
|
33
|
+
};
|
|
34
|
+
if (!(await (0, agent_config_1.AgentConfigFile)().isAppReady({ projectId }))) {
|
|
35
|
+
// App is being installed or updated
|
|
36
|
+
return { appDetails, services: [] };
|
|
37
|
+
}
|
|
38
|
+
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
39
|
+
// Check if app is running
|
|
40
|
+
const output = await docker_compose_1.default.ps({ cwd: appDir });
|
|
41
|
+
if (output.exitCode !== 0) {
|
|
42
|
+
throw new Error(`Failed to get application status! stdout=${output.out} stderr=${output.err}`);
|
|
43
|
+
}
|
|
44
|
+
const services = [];
|
|
45
|
+
if (output.data.services.length === 0) {
|
|
46
|
+
// If the app has never been started (or has an empty docker-compose.yaml)
|
|
47
|
+
// the list will be empty.
|
|
48
|
+
services.push({ name: '', state: 'Stopped' });
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
for (const service of output.data.services) {
|
|
52
|
+
// Container name has the format:
|
|
53
|
+
// <projectId>_name_<number>
|
|
54
|
+
const matchProjectId = new RegExp(`^${projectId}`);
|
|
55
|
+
const name = service.name
|
|
56
|
+
.replace(matchProjectId, '')
|
|
57
|
+
.replace(/\d+$/, '')
|
|
58
|
+
.replace(/_/g, '');
|
|
59
|
+
let state;
|
|
60
|
+
if (service.state.includes('Up')) {
|
|
61
|
+
state = 'Up';
|
|
62
|
+
}
|
|
63
|
+
else if (service.state.includes('Stopped') || service.state.includes('Exit')) {
|
|
64
|
+
state = 'Stopped';
|
|
65
|
+
}
|
|
66
|
+
else if (service.state.includes('Restarting')) {
|
|
67
|
+
state = 'Restarting';
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
throw new Error(`Unknown state for service! (${service.state})`);
|
|
71
|
+
}
|
|
72
|
+
services.push({ name, state });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { appDetails, services };
|
|
76
|
+
}
|
|
77
|
+
exports.getAppStatus = getAppStatus;
|
|
78
|
+
async function getAppLogs(props) {
|
|
79
|
+
const { projectId, services } = props;
|
|
80
|
+
await (0, utils_1.requireAppInstalled)({ projectId });
|
|
81
|
+
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
82
|
+
const serviceList = services
|
|
83
|
+
? services
|
|
84
|
+
: await (async function () {
|
|
85
|
+
const appStatus = await getAppStatus({ projectId });
|
|
86
|
+
const services = [];
|
|
87
|
+
for (const service of appStatus.services) {
|
|
88
|
+
services.push(service.name);
|
|
89
|
+
}
|
|
90
|
+
return services;
|
|
91
|
+
})();
|
|
92
|
+
// Use direct command with spawner in order to get a readable stream
|
|
93
|
+
return await (0, util_1.JsSpawner)().runStreaming({
|
|
94
|
+
exe: 'docker-compose',
|
|
95
|
+
args: ['logs', '-f', ...serviceList],
|
|
96
|
+
cwd: appDir,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
exports.getAppLogs = getAppLogs;
|
|
100
|
+
async function startApp(props) {
|
|
101
|
+
const { projectId, dockerLoginToken } = props;
|
|
102
|
+
await (0, utils_1.requireAppInstalled)({ projectId });
|
|
103
|
+
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
104
|
+
if (dockerLoginToken !== undefined) {
|
|
105
|
+
const result = await (0, docker_cmd_1.runDockerLogin)({ token: dockerLoginToken });
|
|
106
|
+
console.log(result);
|
|
107
|
+
}
|
|
108
|
+
// TODO: Check if app is running
|
|
109
|
+
// Start app
|
|
110
|
+
const upOut = await docker_compose_1.default.upAll({ cwd: appDir });
|
|
111
|
+
console.log(upOut);
|
|
112
|
+
if (upOut.exitCode !== 0) {
|
|
113
|
+
throw new Error(`Failed to start application! stdout=${upOut.out} stderr=${upOut.err}`);
|
|
114
|
+
}
|
|
115
|
+
console.log('Started', projectId);
|
|
116
|
+
}
|
|
117
|
+
exports.startApp = startApp;
|
|
118
|
+
async function stopApp(props) {
|
|
119
|
+
const { projectId } = props;
|
|
120
|
+
await (0, utils_1.requireAppInstalled)({ projectId });
|
|
121
|
+
const appDir = (0, utils_1.getAppDir)(projectId);
|
|
122
|
+
// TODO: Check if app is running
|
|
123
|
+
// Stop app
|
|
124
|
+
const output = await docker_compose_1.default.down({ cwd: appDir });
|
|
125
|
+
console.log(output);
|
|
126
|
+
if (output.exitCode !== 0) {
|
|
127
|
+
throw new Error(`Failed to stop application! stdout=${output.out} stderr=${output.err}`);
|
|
128
|
+
}
|
|
129
|
+
console.log('Stopped', projectId);
|
|
130
|
+
}
|
|
131
|
+
exports.stopApp = stopApp;
|
|
132
|
+
async function restartApp(props) {
|
|
133
|
+
const { projectId } = props;
|
|
134
|
+
await stopApp({ projectId });
|
|
135
|
+
await startApp({ projectId });
|
|
136
|
+
}
|
|
137
|
+
exports.restartApp = restartApp;
|
|
138
|
+
//# sourceMappingURL=status.js.map
|