@alwaysai/device-agent 0.0.12 → 0.0.14
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.map +1 -1
- package/lib/application-control/backup.js +11 -5
- package/lib/application-control/backup.js.map +1 -1
- package/lib/application-control/config.d.ts +12 -4
- package/lib/application-control/config.d.ts.map +1 -1
- package/lib/application-control/config.js +59 -16
- package/lib/application-control/config.js.map +1 -1
- package/lib/application-control/environment-variables.d.ts.map +1 -1
- package/lib/application-control/environment-variables.js.map +1 -1
- package/lib/application-control/index.d.ts +5 -5
- package/lib/application-control/index.d.ts.map +1 -1
- package/lib/application-control/index.js +4 -6
- package/lib/application-control/index.js.map +1 -1
- package/lib/application-control/install.d.ts +1 -1
- package/lib/application-control/install.d.ts.map +1 -1
- package/lib/application-control/install.js +58 -57
- package/lib/application-control/install.js.map +1 -1
- package/lib/application-control/models.d.ts +7 -5
- package/lib/application-control/models.d.ts.map +1 -1
- package/lib/application-control/models.js +78 -57
- package/lib/application-control/models.js.map +1 -1
- package/lib/application-control/status.d.ts +0 -6
- package/lib/application-control/status.d.ts.map +1 -1
- package/lib/application-control/status.js +21 -33
- package/lib/application-control/status.js.map +1 -1
- package/lib/application-control/utils.d.ts +3 -2
- package/lib/application-control/utils.d.ts.map +1 -1
- package/lib/application-control/utils.js +54 -34
- package/lib/application-control/utils.js.map +1 -1
- package/lib/cloud-connection/app-install-status.d.ts +16 -0
- package/lib/cloud-connection/app-install-status.d.ts.map +1 -0
- package/lib/cloud-connection/app-install-status.js +53 -0
- package/lib/cloud-connection/app-install-status.js.map +1 -0
- package/lib/cloud-connection/bootstrap-provision.d.ts +2 -0
- package/lib/cloud-connection/bootstrap-provision.d.ts.map +1 -0
- package/lib/cloud-connection/bootstrap-provision.js +34 -0
- package/lib/cloud-connection/bootstrap-provision.js.map +1 -0
- package/lib/cloud-connection/cmd-status.d.ts +16 -0
- package/lib/cloud-connection/cmd-status.d.ts.map +1 -0
- package/lib/cloud-connection/cmd-status.js +49 -0
- package/lib/cloud-connection/cmd-status.js.map +1 -0
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts +21 -34
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.js +211 -387
- package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
- package/lib/cloud-connection/device-agent.d.ts.map +1 -1
- package/lib/cloud-connection/device-agent.js +22 -26
- package/lib/cloud-connection/device-agent.js.map +1 -1
- package/lib/cloud-connection/live-updates-handler.d.ts +34 -0
- package/lib/cloud-connection/live-updates-handler.d.ts.map +1 -0
- package/lib/cloud-connection/live-updates-handler.js +167 -0
- package/lib/cloud-connection/live-updates-handler.js.map +1 -0
- package/lib/cloud-connection/messages.d.ts +14 -0
- package/lib/cloud-connection/messages.d.ts.map +1 -0
- package/lib/cloud-connection/messages.js +38 -0
- package/lib/cloud-connection/messages.js.map +1 -0
- package/lib/cloud-connection/passthrough-handler.d.ts +11 -0
- package/lib/cloud-connection/passthrough-handler.d.ts.map +1 -0
- package/lib/cloud-connection/passthrough-handler.js +59 -0
- package/lib/cloud-connection/passthrough-handler.js.map +1 -0
- package/lib/cloud-connection/publisher.d.ts +15 -0
- package/lib/cloud-connection/publisher.d.ts.map +1 -0
- package/lib/cloud-connection/publisher.js +58 -0
- package/lib/cloud-connection/publisher.js.map +1 -0
- package/lib/cloud-connection/shadow-handler.d.ts +33 -0
- package/lib/cloud-connection/shadow-handler.d.ts.map +1 -0
- package/lib/cloud-connection/shadow-handler.js +108 -0
- package/lib/cloud-connection/shadow-handler.js.map +1 -0
- package/lib/cloud-connection/shadow-handler.test.d.ts +2 -0
- package/lib/cloud-connection/shadow-handler.test.d.ts.map +1 -0
- package/lib/cloud-connection/shadow-handler.test.js +321 -0
- package/lib/cloud-connection/shadow-handler.test.js.map +1 -0
- package/lib/cloud-connection/shadow.d.ts +16 -0
- package/lib/cloud-connection/shadow.d.ts.map +1 -0
- package/lib/cloud-connection/shadow.js +36 -0
- package/lib/cloud-connection/shadow.js.map +1 -0
- package/lib/device-control/device-control.d.ts.map +1 -1
- package/lib/device-control/device-control.js +1 -0
- package/lib/device-control/device-control.js.map +1 -1
- package/lib/docker/docker-cmd.js +1 -1
- package/lib/docker/docker-compose-cmd.d.ts.map +1 -1
- package/lib/docker/docker-compose-cmd.js +1 -1
- package/lib/docker/docker-compose-cmd.js.map +1 -1
- package/lib/endpoints.js +10 -10
- package/lib/endpoints.js.map +1 -1
- package/lib/environment.d.ts +1 -0
- package/lib/environment.d.ts.map +1 -1
- package/lib/environment.js +2 -1
- package/lib/environment.js.map +1 -1
- package/lib/infrastructure/agent-config.d.ts +15 -58
- package/lib/infrastructure/agent-config.d.ts.map +1 -1
- package/lib/infrastructure/agent-config.js +22 -15
- package/lib/infrastructure/agent-config.js.map +1 -1
- package/lib/infrastructure/agent-config.test.js +25 -23
- package/lib/infrastructure/agent-config.test.js.map +1 -1
- package/lib/infrastructure/system-id.d.ts +2 -0
- package/lib/infrastructure/system-id.d.ts.map +1 -0
- package/lib/infrastructure/system-id.js +21 -0
- package/lib/infrastructure/system-id.js.map +1 -0
- package/lib/infrastructure/tokens-and-device-cfg.d.ts +4 -0
- package/lib/infrastructure/tokens-and-device-cfg.d.ts.map +1 -0
- package/lib/infrastructure/tokens-and-device-cfg.js +27 -0
- package/lib/infrastructure/tokens-and-device-cfg.js.map +1 -0
- package/lib/infrastructure/urls.d.ts.map +1 -1
- package/lib/infrastructure/urls.js +3 -3
- package/lib/infrastructure/urls.js.map +1 -1
- package/lib/local-connection/rabbitmq-connection.d.ts +4 -0
- package/lib/local-connection/rabbitmq-connection.d.ts.map +1 -0
- package/lib/local-connection/rabbitmq-connection.js +58 -0
- package/lib/local-connection/rabbitmq-connection.js.map +1 -0
- package/lib/root.d.ts.map +1 -1
- package/lib/root.js +2 -7
- package/lib/root.js.map +1 -1
- package/lib/subcommands/app/app.d.ts +2 -1
- package/lib/subcommands/app/app.d.ts.map +1 -1
- package/lib/subcommands/app/app.js +112 -77
- package/lib/subcommands/app/app.js.map +1 -1
- package/lib/subcommands/app/index.js +2 -2
- package/lib/subcommands/device/clean.d.ts +2 -0
- package/lib/subcommands/device/clean.d.ts.map +1 -0
- package/lib/subcommands/device/clean.js +29 -0
- package/lib/subcommands/device/clean.js.map +1 -0
- package/lib/subcommands/device/device.d.ts +1 -1
- package/lib/subcommands/device/device.d.ts.map +1 -1
- package/lib/subcommands/device/device.js +44 -33
- package/lib/subcommands/device/device.js.map +1 -1
- package/lib/subcommands/device/index.d.ts.map +1 -1
- package/lib/subcommands/device/index.js +2 -1
- package/lib/subcommands/device/index.js.map +1 -1
- package/lib/subcommands/get-model-package.js +5 -5
- package/lib/subcommands/index.d.ts +0 -1
- package/lib/subcommands/index.d.ts.map +1 -1
- package/lib/subcommands/index.js +1 -1
- package/lib/subcommands/login.d.ts +0 -1
- package/lib/subcommands/login.d.ts.map +1 -1
- package/lib/subcommands/login.js +6 -14
- package/lib/subcommands/login.js.map +1 -1
- package/lib/util/clean-certs.d.ts +2 -0
- package/lib/util/clean-certs.d.ts.map +1 -0
- package/lib/util/clean-certs.js +16 -0
- package/lib/util/clean-certs.js.map +1 -0
- package/lib/util/directories.d.ts +16 -15
- package/lib/util/directories.d.ts.map +1 -1
- package/lib/util/directories.js +45 -26
- package/lib/util/directories.js.map +1 -1
- package/lib/util/fetch-with-timeout.d.ts +4 -0
- package/lib/util/fetch-with-timeout.d.ts.map +1 -0
- package/lib/util/fetch-with-timeout.js +15 -0
- package/lib/util/fetch-with-timeout.js.map +1 -0
- package/lib/util/get-device-id.d.ts +1 -1
- package/lib/util/get-device-id.d.ts.map +1 -1
- package/lib/util/get-device-id.js +14 -19
- package/lib/util/get-device-id.js.map +1 -1
- package/lib/util/http-client.d.ts +1 -1
- package/lib/util/http-client.d.ts.map +1 -1
- package/lib/util/http-client.js +10 -8
- package/lib/util/http-client.js.map +1 -1
- package/lib/util/logger.d.ts.map +1 -1
- package/lib/util/logger.js +4 -5
- package/lib/util/logger.js.map +1 -1
- package/lib/util/require-logged-in-and-paid-plan.d.ts +2 -0
- package/lib/util/require-logged-in-and-paid-plan.d.ts.map +1 -0
- package/lib/util/require-logged-in-and-paid-plan.js +18 -0
- package/lib/util/require-logged-in-and-paid-plan.js.map +1 -0
- package/lib/util/run-in-dir.d.ts.map +1 -1
- package/lib/util/run-in-dir.js +1 -0
- package/lib/util/run-in-dir.js.map +1 -1
- package/lib/util/timer.d.ts +2 -0
- package/lib/util/timer.d.ts.map +1 -0
- package/lib/util/timer.js +6 -0
- package/lib/util/timer.js.map +1 -0
- package/package.json +32 -35
- package/readme.md +100 -89
- package/src/application-control/backup.ts +11 -6
- package/src/application-control/config.ts +75 -13
- package/src/application-control/environment-variables.ts +3 -3
- package/src/application-control/index.ts +18 -11
- package/src/application-control/install.ts +82 -78
- package/src/application-control/models.ts +104 -72
- package/src/application-control/status.ts +29 -40
- package/src/application-control/utils.ts +66 -38
- package/src/cloud-connection/app-install-status.ts +62 -0
- package/src/cloud-connection/bootstrap-provision.ts +40 -0
- package/src/cloud-connection/cmd-status.ts +52 -0
- package/src/cloud-connection/device-agent-cloud-connection.ts +302 -526
- package/src/cloud-connection/device-agent.ts +31 -38
- package/src/cloud-connection/live-updates-handler.ts +226 -0
- package/src/cloud-connection/messages.ts +39 -0
- package/src/cloud-connection/passthrough-handler.ts +67 -0
- package/src/cloud-connection/publisher.ts +86 -0
- package/src/cloud-connection/shadow-handler.test.ts +361 -0
- package/src/cloud-connection/shadow-handler.ts +175 -0
- package/src/cloud-connection/shadow.ts +50 -0
- package/src/device-control/device-control.ts +1 -0
- package/src/docker/docker-cmd.ts +1 -1
- package/src/docker/docker-compose-cmd.ts +5 -2
- package/src/endpoints.ts +9 -9
- package/src/environment.ts +11 -3
- package/src/infrastructure/agent-config.test.ts +33 -29
- package/src/infrastructure/agent-config.ts +57 -22
- package/src/infrastructure/system-id.ts +18 -0
- package/src/infrastructure/tokens-and-device-cfg.ts +34 -0
- package/src/infrastructure/urls.ts +4 -2
- package/src/local-connection/rabbitmq-connection.ts +53 -0
- package/src/root.ts +2 -8
- package/src/subcommands/app/app.ts +119 -83
- package/src/subcommands/app/index.ts +3 -3
- package/src/subcommands/device/clean.ts +26 -0
- package/src/subcommands/device/device.ts +67 -54
- package/src/subcommands/device/index.ts +2 -1
- package/src/subcommands/get-model-package.ts +5 -5
- package/src/subcommands/index.ts +1 -1
- package/src/subcommands/login.ts +6 -14
- package/src/util/clean-certs.ts +12 -0
- package/src/util/directories.ts +68 -52
- package/src/util/fetch-with-timeout.ts +18 -0
- package/src/util/get-device-id.ts +16 -18
- package/src/util/http-client.ts +18 -13
- package/src/util/logger.ts +6 -6
- package/src/util/require-logged-in-and-paid-plan.ts +16 -0
- package/src/util/run-in-dir.ts +2 -1
- package/src/util/timer.ts +1 -0
- package/lib/infrastructure/certificates-and-tokens.d.ts +0 -6
- package/lib/infrastructure/certificates-and-tokens.d.ts.map +0 -1
- package/lib/infrastructure/certificates-and-tokens.js +0 -43
- package/lib/infrastructure/certificates-and-tokens.js.map +0 -1
- package/src/infrastructure/certificates-and-tokens.ts +0 -53
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import * as tempy from 'tempy';
|
|
2
2
|
import { AgentConfigFile } from './agent-config';
|
|
3
3
|
|
|
4
|
-
const mockAgentModeGetter = jest.fn().mockReturnValue(undefined);
|
|
5
|
-
jest.mock('../environment', () => ({
|
|
6
|
-
get ALWAYSAI_DEVICE_AGENT_MODE() {
|
|
7
|
-
return mockAgentModeGetter();
|
|
8
|
-
},
|
|
9
|
-
}));
|
|
10
|
-
|
|
11
4
|
const configFile = AgentConfigFile(tempy.directory());
|
|
12
5
|
|
|
13
6
|
describe('Test Agent Config', () => {
|
|
@@ -21,9 +14,13 @@ describe('Test Agent Config', () => {
|
|
|
21
14
|
expect(apps).toEqual([]);
|
|
22
15
|
const app = await configFile.getApp({ projectId: 'wrong-id' });
|
|
23
16
|
expect(app).toBeNull();
|
|
24
|
-
const present = await configFile.isAppPresent({
|
|
17
|
+
const present = await configFile.isAppPresent({
|
|
18
|
+
projectId: 'another-id'
|
|
19
|
+
});
|
|
25
20
|
expect(present).toBeFalsy();
|
|
26
|
-
const ready = await configFile.isAppReady({
|
|
21
|
+
const ready = await configFile.isAppReady({
|
|
22
|
+
projectId: 'yet-another-id'
|
|
23
|
+
});
|
|
27
24
|
expect(ready).toBeFalsy();
|
|
28
25
|
});
|
|
29
26
|
|
|
@@ -37,8 +34,8 @@ describe('Test Agent Config', () => {
|
|
|
37
34
|
{
|
|
38
35
|
projectId,
|
|
39
36
|
version,
|
|
40
|
-
ready: false
|
|
41
|
-
}
|
|
37
|
+
ready: false
|
|
38
|
+
}
|
|
42
39
|
]);
|
|
43
40
|
const readyApps = await configFile.getReadyApps();
|
|
44
41
|
expect(readyApps).toEqual([]);
|
|
@@ -46,7 +43,7 @@ describe('Test Agent Config', () => {
|
|
|
46
43
|
expect(app).toEqual({
|
|
47
44
|
projectId,
|
|
48
45
|
version,
|
|
49
|
-
ready: false
|
|
46
|
+
ready: false
|
|
50
47
|
});
|
|
51
48
|
const present = await configFile.isAppPresent({ projectId });
|
|
52
49
|
expect(present).toBeTruthy();
|
|
@@ -65,22 +62,22 @@ describe('Test Agent Config', () => {
|
|
|
65
62
|
{
|
|
66
63
|
projectId,
|
|
67
64
|
version,
|
|
68
|
-
ready: true
|
|
69
|
-
}
|
|
65
|
+
ready: true
|
|
66
|
+
}
|
|
70
67
|
]);
|
|
71
68
|
const readyApps = await configFile.getReadyApps();
|
|
72
69
|
expect(readyApps).toEqual([
|
|
73
70
|
{
|
|
74
71
|
projectId,
|
|
75
72
|
version,
|
|
76
|
-
ready: true
|
|
77
|
-
}
|
|
73
|
+
ready: true
|
|
74
|
+
}
|
|
78
75
|
]);
|
|
79
76
|
const app = await configFile.getApp({ projectId });
|
|
80
77
|
expect(app).toEqual({
|
|
81
78
|
projectId,
|
|
82
79
|
version,
|
|
83
|
-
ready: true
|
|
80
|
+
ready: true
|
|
84
81
|
});
|
|
85
82
|
const appVersion = await configFile.getAppVersion({ projectId });
|
|
86
83
|
expect(appVersion).toEqual(version);
|
|
@@ -103,9 +100,13 @@ describe('Test Agent Config', () => {
|
|
|
103
100
|
expect(apps).toEqual([]);
|
|
104
101
|
const app = await configFile.getApp({ projectId: 'wrong-id' });
|
|
105
102
|
expect(app).toBeNull();
|
|
106
|
-
const present = await configFile.isAppPresent({
|
|
103
|
+
const present = await configFile.isAppPresent({
|
|
104
|
+
projectId: 'another-id'
|
|
105
|
+
});
|
|
107
106
|
expect(present).toBeFalsy();
|
|
108
|
-
const ready = await configFile.isAppReady({
|
|
107
|
+
const ready = await configFile.isAppReady({
|
|
108
|
+
projectId: 'yet-another-id'
|
|
109
|
+
});
|
|
109
110
|
expect(ready).toBeFalsy();
|
|
110
111
|
});
|
|
111
112
|
|
|
@@ -129,9 +130,9 @@ describe('Test Agent Config', () => {
|
|
|
129
130
|
version,
|
|
130
131
|
ready: true,
|
|
131
132
|
backup: {
|
|
132
|
-
version
|
|
133
|
-
}
|
|
134
|
-
}
|
|
133
|
+
version
|
|
134
|
+
}
|
|
135
|
+
}
|
|
135
136
|
]);
|
|
136
137
|
const app = await configFile.getApp({ projectId });
|
|
137
138
|
expect(app).toEqual({
|
|
@@ -139,8 +140,8 @@ describe('Test Agent Config', () => {
|
|
|
139
140
|
version,
|
|
140
141
|
ready: true,
|
|
141
142
|
backup: {
|
|
142
|
-
version
|
|
143
|
-
}
|
|
143
|
+
version
|
|
144
|
+
}
|
|
144
145
|
});
|
|
145
146
|
const backup2 = await configFile.getAppBackup({ projectId });
|
|
146
147
|
expect(backup2).toEqual({ version });
|
|
@@ -168,15 +169,17 @@ describe('Test Agent Config', () => {
|
|
|
168
169
|
|
|
169
170
|
// test to see if app has backup
|
|
170
171
|
await configFile.setAppBackup({ projectId });
|
|
171
|
-
const expectedBackupVersion = (
|
|
172
|
-
|
|
172
|
+
const expectedBackupVersion = (
|
|
173
|
+
await configFile.getAppBackup({ projectId })
|
|
174
|
+
)?.version;
|
|
173
175
|
expect(expectedBackupVersion).toEqual(version1);
|
|
174
176
|
expect(await configFile.getAppVersion({ projectId })).toEqual(version1);
|
|
175
177
|
|
|
176
178
|
// simulate second version install
|
|
177
179
|
await configFile.setAppInstalling({ projectId, version: version2 });
|
|
178
|
-
const newExpectedBackupVersion = (
|
|
179
|
-
|
|
180
|
+
const newExpectedBackupVersion = (
|
|
181
|
+
await configFile.getAppBackup({ projectId })
|
|
182
|
+
)?.version;
|
|
180
183
|
expect(newExpectedBackupVersion).toEqual(version1);
|
|
181
184
|
await configFile.setAppInstalled({ projectId, version: version2 });
|
|
182
185
|
expect(await configFile.getAppVersion({ projectId })).toEqual(version2);
|
|
@@ -190,7 +193,8 @@ describe('Test Agent Config', () => {
|
|
|
190
193
|
|
|
191
194
|
// test final state of rolled-back app
|
|
192
195
|
await configFile.setAppInstalled({ projectId, version: version1 });
|
|
193
|
-
const finalBackupVersion = (await configFile.getAppBackup({ projectId }))
|
|
196
|
+
const finalBackupVersion = (await configFile.getAppBackup({ projectId }))
|
|
197
|
+
?.version;
|
|
194
198
|
expect(finalBackupVersion).toEqual(version1);
|
|
195
199
|
expect(await configFile.isAppReady({ projectId })).toEqual(true);
|
|
196
200
|
expect(await configFile.getAppVersion({ projectId })).toEqual(version1);
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
ConfigFileSchema,
|
|
3
|
+
ConfigFileSchemaReturnType
|
|
4
|
+
} from '@alwaysai/config-nodejs';
|
|
5
|
+
import Ajv, { JSONSchemaType } from 'ajv';
|
|
3
6
|
import { homedir } from 'os';
|
|
4
7
|
import { join } from 'path';
|
|
5
8
|
|
|
@@ -33,34 +36,56 @@ const schema: JSONSchemaType<AgentConfig> = {
|
|
|
33
36
|
type: 'object',
|
|
34
37
|
nullable: true,
|
|
35
38
|
properties: {
|
|
36
|
-
version: { type: 'string' }
|
|
39
|
+
version: { type: 'string' }
|
|
37
40
|
},
|
|
38
41
|
required: ['version'],
|
|
39
|
-
additionalProperties: true
|
|
40
|
-
}
|
|
42
|
+
additionalProperties: true
|
|
43
|
+
}
|
|
41
44
|
},
|
|
42
45
|
required: ['projectId', 'version', 'ready'],
|
|
43
|
-
additionalProperties: true
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
+
additionalProperties: true
|
|
47
|
+
}
|
|
48
|
+
}
|
|
46
49
|
},
|
|
47
50
|
required: ['applications'],
|
|
48
|
-
additionalProperties: true
|
|
51
|
+
additionalProperties: true
|
|
49
52
|
};
|
|
50
53
|
|
|
54
|
+
const ajv = new Ajv();
|
|
55
|
+
const validateFunction = ajv.compile(schema);
|
|
56
|
+
|
|
51
57
|
const ALWAYSAI_CONFIG_DIR = join(homedir(), '.config', 'alwaysai');
|
|
52
58
|
|
|
53
59
|
const AGENT_CONFIG_FILE_NAME = 'alwaysai.agent.json';
|
|
54
60
|
|
|
55
|
-
export
|
|
61
|
+
export interface AgentJsonFileReturnType
|
|
62
|
+
extends ConfigFileSchemaReturnType<AgentConfig> {
|
|
63
|
+
name: string;
|
|
64
|
+
getApps: () => Promise<InstalledAppConfig[]>;
|
|
65
|
+
getReadyApps;
|
|
66
|
+
getApp;
|
|
67
|
+
isAppPresent;
|
|
68
|
+
isAppReady;
|
|
69
|
+
removeApp;
|
|
70
|
+
setAppInstalling;
|
|
71
|
+
setAppInstalled;
|
|
72
|
+
setAppUninstalled;
|
|
73
|
+
getAppVersion;
|
|
74
|
+
setAppBackup;
|
|
75
|
+
getAppBackup;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function AgentConfigFile(
|
|
79
|
+
dir = ALWAYSAI_CONFIG_DIR
|
|
80
|
+
): AgentJsonFileReturnType {
|
|
56
81
|
const path = join(dir, AGENT_CONFIG_FILE_NAME);
|
|
57
82
|
const initialValue: AgentConfig = {
|
|
58
|
-
applications: []
|
|
83
|
+
applications: []
|
|
59
84
|
};
|
|
60
85
|
const configFile = ConfigFileSchema({
|
|
61
86
|
path,
|
|
62
|
-
|
|
63
|
-
initialValue
|
|
87
|
+
validateFunction,
|
|
88
|
+
initialValue
|
|
64
89
|
});
|
|
65
90
|
|
|
66
91
|
return {
|
|
@@ -77,19 +102,21 @@ export function AgentConfigFile(dir = ALWAYSAI_CONFIG_DIR) {
|
|
|
77
102
|
setAppUninstalled,
|
|
78
103
|
getAppVersion,
|
|
79
104
|
setAppBackup,
|
|
80
|
-
getAppBackup
|
|
105
|
+
getAppBackup
|
|
81
106
|
};
|
|
82
107
|
|
|
83
108
|
async function getApps() {
|
|
84
109
|
const config = configFile.read();
|
|
85
|
-
return config.applications;
|
|
110
|
+
return config && config.applications ? config.applications : [];
|
|
86
111
|
}
|
|
87
112
|
|
|
88
113
|
async function getReadyApps() {
|
|
89
114
|
const config = configFile.read();
|
|
90
|
-
return config.applications
|
|
91
|
-
|
|
92
|
-
|
|
115
|
+
return config && config.applications
|
|
116
|
+
? config.applications.filter((app) => {
|
|
117
|
+
return app.ready;
|
|
118
|
+
})
|
|
119
|
+
: [];
|
|
93
120
|
}
|
|
94
121
|
|
|
95
122
|
async function getApp(props: { projectId: string }) {
|
|
@@ -124,6 +151,8 @@ export function AgentConfigFile(dir = ALWAYSAI_CONFIG_DIR) {
|
|
|
124
151
|
async function removeApp(props: { projectId: string }) {
|
|
125
152
|
const { projectId } = props;
|
|
126
153
|
const config = configFile.read();
|
|
154
|
+
if (!config) return;
|
|
155
|
+
|
|
127
156
|
const newList = config.applications.filter((app) => {
|
|
128
157
|
return app.projectId !== projectId;
|
|
129
158
|
});
|
|
@@ -131,7 +160,10 @@ export function AgentConfigFile(dir = ALWAYSAI_CONFIG_DIR) {
|
|
|
131
160
|
configFile.write(config);
|
|
132
161
|
}
|
|
133
162
|
|
|
134
|
-
async function setAppInstalling(props: {
|
|
163
|
+
async function setAppInstalling(props: {
|
|
164
|
+
projectId: string;
|
|
165
|
+
version: string;
|
|
166
|
+
}) {
|
|
135
167
|
const { projectId, version } = props;
|
|
136
168
|
|
|
137
169
|
const app = await getApp({ projectId });
|
|
@@ -147,13 +179,16 @@ export function AgentConfigFile(dir = ALWAYSAI_CONFIG_DIR) {
|
|
|
147
179
|
config.applications.push({
|
|
148
180
|
projectId,
|
|
149
181
|
version,
|
|
150
|
-
ready: false
|
|
182
|
+
ready: false
|
|
151
183
|
});
|
|
152
184
|
configFile.write(config);
|
|
153
185
|
}
|
|
154
186
|
}
|
|
155
187
|
|
|
156
|
-
async function setAppInstalled(props: {
|
|
188
|
+
async function setAppInstalled(props: {
|
|
189
|
+
projectId: string;
|
|
190
|
+
version: string;
|
|
191
|
+
}) {
|
|
157
192
|
const { projectId, version } = props;
|
|
158
193
|
const app = await getApp({ projectId });
|
|
159
194
|
if (app) {
|
|
@@ -165,7 +200,7 @@ export function AgentConfigFile(dir = ALWAYSAI_CONFIG_DIR) {
|
|
|
165
200
|
// NOTE: we should never be setting an app as installed
|
|
166
201
|
// if it doesn't exist (setAppInstalling was never called)
|
|
167
202
|
throw new Error(
|
|
168
|
-
`App ${projectId} was not previously configured and could not be set to installed
|
|
203
|
+
`App ${projectId} was not previously configured and could not be set to installed!`
|
|
169
204
|
);
|
|
170
205
|
}
|
|
171
206
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SystemId } from 'alwaysai/lib/constants';
|
|
2
|
+
import { DeviceConfigFile } from 'alwaysai/lib/core/device';
|
|
3
|
+
import { ALWAYSAI_SYSTEM_ID } from 'alwaysai/lib/environment';
|
|
4
|
+
|
|
5
|
+
export function getSystemId() {
|
|
6
|
+
if (ALWAYSAI_SYSTEM_ID) {
|
|
7
|
+
// When the env var is set return the overridden value without updating the config file.
|
|
8
|
+
// This prevents one-off commands from having side effects.
|
|
9
|
+
if (Object.keys(SystemId).includes(ALWAYSAI_SYSTEM_ID)) {
|
|
10
|
+
return ALWAYSAI_SYSTEM_ID as SystemId;
|
|
11
|
+
}
|
|
12
|
+
throw new Error(`Invalid ALWAYSAI_SYSTEM_ID: ${ALWAYSAI_SYSTEM_ID}`);
|
|
13
|
+
}
|
|
14
|
+
const maybeConfig = DeviceConfigFile().readIfExists();
|
|
15
|
+
const systemId =
|
|
16
|
+
maybeConfig && maybeConfig.systemId ? maybeConfig.systemId : 'production';
|
|
17
|
+
return systemId;
|
|
18
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { LOCAL_AAI_CFG_DIR } from 'alwaysai/lib/constants';
|
|
2
|
+
import { logger } from '../util/logger';
|
|
3
|
+
import { microServiceHttpClient } from '../util/http-client';
|
|
4
|
+
import { requireLoggedInAndPaidPlan } from '../util/require-logged-in-and-paid-plan';
|
|
5
|
+
import {
|
|
6
|
+
DeviceTokens,
|
|
7
|
+
writeOrValidateDeviceCfgFile,
|
|
8
|
+
writeTokens
|
|
9
|
+
} from 'alwaysai/lib/core/device';
|
|
10
|
+
import { JsSpawner } from 'alwaysai/lib/util';
|
|
11
|
+
|
|
12
|
+
// NOTE: This closely follows the flow of deviceCheckAndUpdateComponent in the CLI
|
|
13
|
+
export async function writeTokenAndDeviceCfg(props: { deviceUuid: string }) {
|
|
14
|
+
const { deviceUuid } = props;
|
|
15
|
+
await requireLoggedInAndPaidPlan();
|
|
16
|
+
const { accessToken, refreshToken, idToken } = await microServiceHttpClient(
|
|
17
|
+
'token-service',
|
|
18
|
+
'create-device-tokens',
|
|
19
|
+
'POST',
|
|
20
|
+
JSON.stringify({})
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
const tokens: DeviceTokens = {
|
|
24
|
+
deviceId: deviceUuid,
|
|
25
|
+
accessToken,
|
|
26
|
+
refreshToken,
|
|
27
|
+
idToken
|
|
28
|
+
};
|
|
29
|
+
const tokenSpawner = JsSpawner({ path: LOCAL_AAI_CFG_DIR });
|
|
30
|
+
await writeTokens({ spawner: tokenSpawner, tokens });
|
|
31
|
+
await writeOrValidateDeviceCfgFile({ spawner: tokenSpawner, deviceUuid });
|
|
32
|
+
|
|
33
|
+
logger.info('Updated tokens and certificate');
|
|
34
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CliTerseError } from '@alwaysai/alwayscli';
|
|
2
|
-
import { getSystemId } from '
|
|
2
|
+
import { getSystemId } from './system-id';
|
|
3
3
|
|
|
4
4
|
export function getIoTCoreEndpointUrl() {
|
|
5
5
|
let iotCoreEndpointUrl = '';
|
|
@@ -15,7 +15,9 @@ export function getIoTCoreEndpointUrl() {
|
|
|
15
15
|
iotCoreEndpointUrl = 'a3tzi5g7sq5zsj-ats.iot.us-west-2.amazonaws.com';
|
|
16
16
|
break;
|
|
17
17
|
default:
|
|
18
|
-
throw new CliTerseError(
|
|
18
|
+
throw new CliTerseError(
|
|
19
|
+
`Remote deployment not supported on ${getSystemId()}!`
|
|
20
|
+
);
|
|
19
21
|
}
|
|
20
22
|
return iotCoreEndpointUrl;
|
|
21
23
|
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { JsSpawner } from 'alwaysai/lib/util';
|
|
2
|
+
import { logger } from '../util/logger';
|
|
3
|
+
import sleep from '../util/sleep';
|
|
4
|
+
|
|
5
|
+
export async function checkRabbitMQContainerRunning() {
|
|
6
|
+
const spawner = JsSpawner();
|
|
7
|
+
return await spawner.run({
|
|
8
|
+
exe: 'docker',
|
|
9
|
+
args: ['ps', '-q', '--filter', 'ancestor=rabbitmq']
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export async function setupRabbitMQContainer() {
|
|
14
|
+
const spawner = JsSpawner();
|
|
15
|
+
const rabbitMqContainerRunning = await checkRabbitMQContainerRunning();
|
|
16
|
+
logger.debug('Checking for running RabbitMQ container');
|
|
17
|
+
if (!rabbitMqContainerRunning) {
|
|
18
|
+
logger.debug('Setting up RabbitMQ container');
|
|
19
|
+
await spawner.run({
|
|
20
|
+
exe: 'docker',
|
|
21
|
+
args: [
|
|
22
|
+
'run',
|
|
23
|
+
'--rm',
|
|
24
|
+
'-p',
|
|
25
|
+
'5672:5672',
|
|
26
|
+
'-d',
|
|
27
|
+
'--hostname',
|
|
28
|
+
'my-rabbit',
|
|
29
|
+
'rabbitmq'
|
|
30
|
+
]
|
|
31
|
+
});
|
|
32
|
+
await sleep(8000);
|
|
33
|
+
while (!(await checkRabbitMQContainerRunning())) {
|
|
34
|
+
await sleep(5000);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function stopRabbitMQContainer() {
|
|
40
|
+
const spawner = JsSpawner();
|
|
41
|
+
const rabbitMqContainer = await spawner.run({
|
|
42
|
+
exe: 'docker',
|
|
43
|
+
args: ['ps', '-q', '--filter', 'ancestor=rabbitmq']
|
|
44
|
+
});
|
|
45
|
+
if (!rabbitMqContainer) {
|
|
46
|
+
logger.debug('No RabbitMQ container running');
|
|
47
|
+
} else {
|
|
48
|
+
await spawner.run({
|
|
49
|
+
exe: 'docker',
|
|
50
|
+
args: ['stop', `${rabbitMqContainer}`]
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
package/src/root.ts
CHANGED
|
@@ -1,18 +1,12 @@
|
|
|
1
|
+
// eslint-disable-next-line
|
|
1
2
|
const winston = require('winston');
|
|
2
3
|
|
|
3
4
|
import { CliBranch } from '@alwaysai/alwayscli';
|
|
4
5
|
|
|
5
6
|
import { subcommands } from './subcommands';
|
|
6
|
-
import { ALWAYSAI_LOG_LEVEL } from './environment';
|
|
7
|
-
|
|
8
|
-
winston.configure({
|
|
9
|
-
level: ALWAYSAI_LOG_LEVEL || 'info',
|
|
10
|
-
transports: [new winston.transports.Console()],
|
|
11
|
-
format: winston.format.simple(),
|
|
12
|
-
});
|
|
13
7
|
|
|
14
8
|
export const root = CliBranch({
|
|
15
9
|
name: 'aai-agent',
|
|
16
10
|
description: 'Manage your alwaysAI production device',
|
|
17
|
-
subcommands
|
|
11
|
+
subcommands
|
|
18
12
|
});
|