@alwaysai/device-agent 0.1.0 → 0.1.2
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/config.d.ts +0 -1
- package/lib/application-control/config.d.ts.map +1 -1
- package/lib/application-control/config.js +15 -29
- package/lib/application-control/config.js.map +1 -1
- package/lib/application-control/environment-variables.d.ts +7 -3
- package/lib/application-control/environment-variables.d.ts.map +1 -1
- package/lib/application-control/environment-variables.js +71 -35
- package/lib/application-control/environment-variables.js.map +1 -1
- package/lib/application-control/environment-variables.test.d.ts +2 -0
- package/lib/application-control/environment-variables.test.d.ts.map +1 -0
- package/lib/application-control/environment-variables.test.js +163 -0
- package/lib/application-control/environment-variables.test.js.map +1 -0
- package/lib/application-control/index.d.ts +3 -3
- package/lib/application-control/index.d.ts.map +1 -1
- package/lib/application-control/index.js +1 -3
- package/lib/application-control/index.js.map +1 -1
- package/lib/application-control/models.d.ts +0 -1
- package/lib/application-control/models.d.ts.map +1 -1
- package/lib/application-control/models.js +12 -26
- package/lib/application-control/models.js.map +1 -1
- package/lib/application-control/status.d.ts +3 -0
- package/lib/application-control/status.d.ts.map +1 -1
- package/lib/application-control/status.js +19 -1
- package/lib/application-control/status.js.map +1 -1
- package/lib/application-control/utils.d.ts.map +1 -1
- package/lib/application-control/utils.js +2 -2
- package/lib/application-control/utils.js.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts +6 -3
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.js +205 -151
- package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
- package/lib/cloud-connection/live-updates-handler.d.ts +3 -0
- package/lib/cloud-connection/live-updates-handler.d.ts.map +1 -1
- package/lib/cloud-connection/live-updates-handler.js +23 -7
- package/lib/cloud-connection/live-updates-handler.js.map +1 -1
- package/lib/cloud-connection/live-updates-handler.test.d.ts +2 -0
- package/lib/cloud-connection/live-updates-handler.test.d.ts.map +1 -0
- package/lib/cloud-connection/live-updates-handler.test.js +57 -0
- package/lib/cloud-connection/live-updates-handler.test.js.map +1 -0
- package/lib/cloud-connection/passthrough-handler.d.ts.map +1 -1
- package/lib/cloud-connection/passthrough-handler.js +6 -3
- package/lib/cloud-connection/passthrough-handler.js.map +1 -1
- package/lib/cloud-connection/shadow-handler.d.ts +11 -3
- package/lib/cloud-connection/shadow-handler.d.ts.map +1 -1
- package/lib/cloud-connection/shadow-handler.js +22 -7
- package/lib/cloud-connection/shadow-handler.js.map +1 -1
- package/lib/cloud-connection/shadow-handler.test.js +313 -228
- package/lib/cloud-connection/shadow-handler.test.js.map +1 -1
- package/lib/cloud-connection/shadow.js +1 -1
- package/lib/cloud-connection/shadow.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 +3 -1
- package/lib/infrastructure/agent-config.d.ts.map +1 -1
- package/lib/subcommands/app/env-vars.d.ts +1 -1
- package/lib/subcommands/app/env-vars.d.ts.map +1 -1
- package/lib/subcommands/app/env-vars.js +32 -5
- package/lib/subcommands/app/env-vars.js.map +1 -1
- package/lib/subcommands/app/index.d.ts.map +1 -1
- package/lib/subcommands/app/index.js +4 -1
- package/lib/subcommands/app/index.js.map +1 -1
- package/lib/subcommands/app/models.d.ts.map +1 -1
- package/lib/subcommands/app/models.js +6 -1
- package/lib/subcommands/app/models.js.map +1 -1
- package/lib/subcommands/app/shadow.d.ts +7 -0
- package/lib/subcommands/app/shadow.d.ts.map +1 -0
- package/lib/subcommands/app/shadow.js +48 -0
- package/lib/subcommands/app/shadow.js.map +1 -0
- package/lib/subcommands/app/version.js +2 -2
- package/lib/subcommands/app/version.js.map +1 -1
- package/lib/util/cloud-mode-ready.d.ts +2 -0
- package/lib/util/cloud-mode-ready.d.ts.map +1 -0
- package/lib/util/cloud-mode-ready.js +22 -0
- package/lib/util/cloud-mode-ready.js.map +1 -0
- package/package.json +1 -1
- package/readme.md +2 -2
- package/src/application-control/config.ts +30 -31
- package/src/application-control/environment-variables.test.ts +171 -0
- package/src/application-control/environment-variables.ts +102 -43
- package/src/application-control/index.ts +3 -9
- package/src/application-control/models.ts +14 -29
- package/src/application-control/status.ts +20 -0
- package/src/application-control/utils.ts +4 -2
- package/src/cloud-connection/device-agent-cloud-connection.ts +222 -153
- package/src/cloud-connection/live-updates-handler.test.ts +68 -0
- package/src/cloud-connection/live-updates-handler.ts +30 -7
- package/src/cloud-connection/passthrough-handler.ts +10 -3
- package/src/cloud-connection/shadow-handler.test.ts +329 -239
- package/src/cloud-connection/shadow-handler.ts +38 -12
- package/src/cloud-connection/shadow.ts +1 -1
- package/src/environment.ts +2 -0
- package/src/infrastructure/agent-config.ts +1 -1
- package/src/subcommands/app/env-vars.ts +38 -8
- package/src/subcommands/app/index.ts +4 -1
- package/src/subcommands/app/models.ts +10 -1
- package/src/subcommands/app/shadow.ts +48 -0
- package/src/subcommands/app/version.ts +2 -2
- package/src/util/cloud-mode-ready.ts +23 -0
|
@@ -30,7 +30,7 @@ describe('Test Shadow Handler', () => {
|
|
|
30
30
|
}).toThrow(Error);
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
-
test('ignore message from self', async () => {
|
|
33
|
+
test('ignore update delta message from self', async () => {
|
|
34
34
|
const ogAppCfg1: AppConfig = {
|
|
35
35
|
scripts: {
|
|
36
36
|
start: 'python app.py'
|
|
@@ -55,263 +55,372 @@ describe('Test Shadow Handler', () => {
|
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
57
|
|
|
58
|
-
const
|
|
58
|
+
const updates = await shadowHandler.handleShadowTopic({
|
|
59
59
|
topic: shadowHandler.shadowTopics.projects.updateDelta,
|
|
60
60
|
payload,
|
|
61
61
|
clientToken: clientId
|
|
62
62
|
});
|
|
63
|
-
expect(
|
|
63
|
+
expect(updates.length).toBe(0);
|
|
64
64
|
});
|
|
65
65
|
|
|
66
|
-
test('handle shadow
|
|
67
|
-
const ogAppCfg1: AppConfig = {
|
|
68
|
-
scripts: {
|
|
69
|
-
start: 'python app.py'
|
|
70
|
-
},
|
|
71
|
-
models: {
|
|
72
|
-
'alwaysai/mobilenet_ssd': 3
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
|
|
77
|
-
const appCfg1: AppConfig = {
|
|
78
|
-
scripts: {
|
|
79
|
-
start: 'python app.py'
|
|
80
|
-
},
|
|
81
|
-
models: {
|
|
82
|
-
'alwaysai/yolo_v3': 4
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
|
|
66
|
+
test('handle project shadow empty delta', async () => {
|
|
86
67
|
const payload = {
|
|
87
|
-
|
|
88
|
-
[projectId1]: {
|
|
89
|
-
appConfig: JSON.stringify(appCfg1)
|
|
90
|
-
}
|
|
91
|
-
}
|
|
68
|
+
[projectId1]: {}
|
|
92
69
|
};
|
|
93
70
|
|
|
94
|
-
const
|
|
95
|
-
topic: shadowHandler.shadowTopics.projects.
|
|
71
|
+
const updates = await shadowHandler.handleShadowTopic({
|
|
72
|
+
topic: shadowHandler.shadowTopics.projects.updateDelta,
|
|
96
73
|
payload,
|
|
97
74
|
clientToken: ''
|
|
98
75
|
});
|
|
99
|
-
expect(
|
|
100
|
-
expect(appCfgUpdates[0]).toEqual({
|
|
101
|
-
projectId: projectId1,
|
|
102
|
-
newAppCfg: appCfg1,
|
|
103
|
-
updatedModels: {
|
|
104
|
-
'alwaysai/yolo_v3': 4
|
|
105
|
-
}
|
|
106
|
-
});
|
|
76
|
+
expect(updates.length).toBe(0);
|
|
107
77
|
});
|
|
108
78
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
79
|
+
describe('handle project shadow app cfg', () => {
|
|
80
|
+
test('handle project shadow app cfg get response with updated models', async () => {
|
|
81
|
+
const ogAppCfg1: AppConfig = {
|
|
82
|
+
scripts: {
|
|
83
|
+
start: 'python app.py'
|
|
84
|
+
},
|
|
85
|
+
models: {
|
|
86
|
+
'alwaysai/mobilenet_ssd': 3
|
|
87
|
+
}
|
|
88
|
+
};
|
|
119
89
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
90
|
+
jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
|
|
91
|
+
const appCfg1: AppConfig = {
|
|
92
|
+
scripts: {
|
|
93
|
+
start: 'python app.py'
|
|
94
|
+
},
|
|
95
|
+
models: {
|
|
96
|
+
'alwaysai/yolo_v3': 4
|
|
97
|
+
}
|
|
98
|
+
};
|
|
123
99
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
100
|
+
const payload = {
|
|
101
|
+
delta: {
|
|
102
|
+
[projectId1]: {
|
|
103
|
+
appConfig: JSON.stringify(appCfg1)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const updates = await shadowHandler.handleShadowTopic({
|
|
109
|
+
topic: shadowHandler.shadowTopics.projects.getAccepted,
|
|
110
|
+
payload,
|
|
111
|
+
clientToken: ''
|
|
112
|
+
});
|
|
113
|
+
expect(updates.length).toBe(1);
|
|
114
|
+
expect(updates[0]).toEqual({
|
|
115
|
+
projectId: projectId1,
|
|
116
|
+
appCfgUpdate: {
|
|
117
|
+
newAppCfg: appCfg1,
|
|
118
|
+
updatedModels: {
|
|
119
|
+
'alwaysai/yolo_v3': 4
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
});
|
|
128
123
|
});
|
|
129
|
-
expect(appCfgUpdates.length).toBe(0);
|
|
130
|
-
});
|
|
131
124
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
125
|
+
test('handle project shadow app cfg delta with updated models', async () => {
|
|
126
|
+
const ogAppCfg1: AppConfig = {
|
|
127
|
+
scripts: {
|
|
128
|
+
start: 'python app.py'
|
|
129
|
+
},
|
|
130
|
+
models: {
|
|
131
|
+
'alwaysai/mobilenet_ssd': 2
|
|
132
|
+
}
|
|
133
|
+
};
|
|
141
134
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
135
|
+
jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
|
|
136
|
+
const appCfg1: AppConfig = {
|
|
137
|
+
scripts: {
|
|
138
|
+
start: 'python app.py'
|
|
139
|
+
},
|
|
140
|
+
models: {
|
|
141
|
+
'alwaysai/mobilenet_ssd': 3,
|
|
142
|
+
'alwaysai/yolo_v4': 5
|
|
143
|
+
}
|
|
144
|
+
};
|
|
152
145
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
146
|
+
const payload = {
|
|
147
|
+
[projectId1]: {
|
|
148
|
+
appConfig: JSON.stringify(appCfg1)
|
|
149
|
+
}
|
|
150
|
+
};
|
|
158
151
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
152
|
+
const updates = await shadowHandler.handleShadowTopic({
|
|
153
|
+
topic: shadowHandler.shadowTopics.projects.updateDelta,
|
|
154
|
+
payload,
|
|
155
|
+
clientToken: ''
|
|
156
|
+
});
|
|
157
|
+
expect(updates.length).toBe(1);
|
|
158
|
+
expect(updates[0]).toEqual({
|
|
159
|
+
projectId: projectId1,
|
|
160
|
+
appCfgUpdate: {
|
|
161
|
+
newAppCfg: appCfg1,
|
|
162
|
+
updatedModels: {
|
|
163
|
+
'alwaysai/mobilenet_ssd': 3,
|
|
164
|
+
'alwaysai/yolo_v4': 5
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
});
|
|
172
168
|
});
|
|
173
|
-
});
|
|
174
169
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
170
|
+
test('handle project shadow app cfg delta with updated models for two apps', async () => {
|
|
171
|
+
const ogAppCfg1: AppConfig = {
|
|
172
|
+
scripts: {
|
|
173
|
+
start: 'python app.py'
|
|
174
|
+
},
|
|
175
|
+
models: {
|
|
176
|
+
'alwaysai/mobilenet_ssd': 2
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
jest.mocked(readAppCfgFile).mockResolvedValueOnce(ogAppCfg1);
|
|
180
|
+
const ogAppCfg2: AppConfig = {
|
|
181
|
+
scripts: {
|
|
182
|
+
start: 'python app.py'
|
|
183
|
+
},
|
|
184
|
+
models: {
|
|
185
|
+
'alwaysai/yolo_v4': 5
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
jest.mocked(readAppCfgFile).mockResolvedValueOnce(ogAppCfg2);
|
|
194
189
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
190
|
+
const appCfg1: AppConfig = {
|
|
191
|
+
scripts: {
|
|
192
|
+
start: 'python app.py'
|
|
193
|
+
},
|
|
194
|
+
models: {
|
|
195
|
+
'alwaysai/mobilenet_ssd': 3,
|
|
196
|
+
'alwaysai/yolo_v4': 5
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
const appCfg2: AppConfig = {
|
|
200
|
+
scripts: {
|
|
201
|
+
start: 'python app.py'
|
|
202
|
+
},
|
|
203
|
+
models: {
|
|
204
|
+
'alwaysai/yolo_v4': 5,
|
|
205
|
+
'alwaysai/human_pose': 7
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
const payload = {
|
|
209
|
+
[projectId1]: {
|
|
210
|
+
appConfig: JSON.stringify(appCfg1)
|
|
211
|
+
},
|
|
212
|
+
[projectId2]: {
|
|
213
|
+
appConfig: JSON.stringify(appCfg2)
|
|
214
|
+
}
|
|
215
|
+
};
|
|
221
216
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
217
|
+
const updates = await shadowHandler.handleShadowTopic({
|
|
218
|
+
topic: shadowHandler.shadowTopics.projects.updateDelta,
|
|
219
|
+
payload,
|
|
220
|
+
clientToken: ''
|
|
221
|
+
});
|
|
222
|
+
expect(updates.length).toBe(2);
|
|
223
|
+
expect(updates[0]).toEqual({
|
|
224
|
+
projectId: projectId1,
|
|
225
|
+
appCfgUpdate: {
|
|
226
|
+
newAppCfg: appCfg1,
|
|
227
|
+
updatedModels: {
|
|
228
|
+
'alwaysai/mobilenet_ssd': 3,
|
|
229
|
+
'alwaysai/yolo_v4': 5
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
expect(updates[1]).toEqual({
|
|
234
|
+
projectId: projectId2,
|
|
235
|
+
appCfgUpdate: {
|
|
236
|
+
newAppCfg: appCfg2,
|
|
237
|
+
updatedModels: {
|
|
238
|
+
'alwaysai/human_pose': 7
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
});
|
|
226
242
|
});
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
}
|
|
243
|
+
|
|
244
|
+
test('handle project shadow app cfg delta with updated analytics', async () => {
|
|
245
|
+
const ogAppCfg1: AppConfig = {
|
|
246
|
+
scripts: {
|
|
247
|
+
start: 'python app.py'
|
|
248
|
+
},
|
|
249
|
+
models: {}
|
|
250
|
+
};
|
|
251
|
+
jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
|
|
252
|
+
|
|
253
|
+
const appCfg1: AppConfig = {
|
|
254
|
+
scripts: {
|
|
255
|
+
start: 'python app.py'
|
|
256
|
+
},
|
|
257
|
+
models: {},
|
|
258
|
+
analytics: {
|
|
259
|
+
enable_cloud_publish: true
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
const payload = {
|
|
264
|
+
[projectId1]: {
|
|
265
|
+
appConfig: JSON.stringify(appCfg1)
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
const updates = await shadowHandler.handleShadowTopic({
|
|
270
|
+
topic: shadowHandler.shadowTopics.projects.updateDelta,
|
|
271
|
+
payload,
|
|
272
|
+
clientToken: ''
|
|
273
|
+
});
|
|
274
|
+
expect(updates.length).toBe(1);
|
|
275
|
+
expect(updates[0]).toEqual({
|
|
276
|
+
projectId: projectId1,
|
|
277
|
+
appCfgUpdate: {
|
|
278
|
+
newAppCfg: appCfg1
|
|
279
|
+
}
|
|
280
|
+
});
|
|
235
281
|
});
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
282
|
+
|
|
283
|
+
test('handle project shadow app cfg delta with invalid app config', async () => {
|
|
284
|
+
const ogAppCfg1: AppConfig = {
|
|
285
|
+
scripts: {
|
|
286
|
+
start: 'python app.py'
|
|
287
|
+
},
|
|
288
|
+
models: {
|
|
289
|
+
'alwaysai/mobilenet_ssd': 2
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
|
|
294
|
+
const appCfg1 = {
|
|
295
|
+
scripts: {
|
|
296
|
+
start: 'python app.py'
|
|
297
|
+
},
|
|
298
|
+
models: {
|
|
299
|
+
'alwaysai/mobilenet_ssd': '3', // string instead of int
|
|
300
|
+
'alwaysai/yolo_v4': '5' // string instead of int
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
const payload = {
|
|
305
|
+
[projectId1]: {
|
|
306
|
+
appConfig: JSON.stringify(appCfg1)
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
const updates = await shadowHandler.handleShadowTopic({
|
|
311
|
+
topic: shadowHandler.shadowTopics.projects.updateDelta,
|
|
312
|
+
payload,
|
|
313
|
+
clientToken: ''
|
|
314
|
+
});
|
|
315
|
+
expect(updates.length).toBe(0);
|
|
242
316
|
});
|
|
243
317
|
});
|
|
244
318
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
319
|
+
describe('handle project shadow env vars', () => {
|
|
320
|
+
test('handle project shadow env vars get response with delta', async () => {
|
|
321
|
+
const envVars1 = {
|
|
322
|
+
VAR0: 'value0'
|
|
323
|
+
};
|
|
324
|
+
const payload = {
|
|
325
|
+
delta: {
|
|
326
|
+
[projectId1]: {
|
|
327
|
+
envVars: envVars1
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
};
|
|
253
331
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
332
|
+
const updates = await shadowHandler.handleShadowTopic({
|
|
333
|
+
topic: shadowHandler.shadowTopics.projects.getAccepted,
|
|
334
|
+
payload,
|
|
335
|
+
clientToken: ''
|
|
336
|
+
});
|
|
337
|
+
expect(updates.length).toBe(1);
|
|
338
|
+
expect(updates[0]).toEqual({
|
|
339
|
+
projectId: projectId1,
|
|
340
|
+
envVarUpdate: {
|
|
341
|
+
envVars: envVars1
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
});
|
|
263
345
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
}
|
|
268
|
-
|
|
346
|
+
test('handle project shadow env vars update delta', async () => {
|
|
347
|
+
const envVars1 = {
|
|
348
|
+
VAR1: 'value1'
|
|
349
|
+
};
|
|
350
|
+
const payload = {
|
|
351
|
+
[projectId1]: {
|
|
352
|
+
envVars: envVars1
|
|
353
|
+
}
|
|
354
|
+
};
|
|
269
355
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
356
|
+
const updates = await shadowHandler.handleShadowTopic({
|
|
357
|
+
topic: shadowHandler.shadowTopics.projects.updateDelta,
|
|
358
|
+
payload,
|
|
359
|
+
clientToken: ''
|
|
360
|
+
});
|
|
361
|
+
expect(updates.length).toBe(1);
|
|
362
|
+
expect(updates[0]).toEqual({
|
|
363
|
+
projectId: projectId1,
|
|
364
|
+
envVarUpdate: {
|
|
365
|
+
envVars: envVars1
|
|
366
|
+
}
|
|
367
|
+
});
|
|
274
368
|
});
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
369
|
+
|
|
370
|
+
test('handle project shadow env vars update delta for two projects', async () => {
|
|
371
|
+
const envVars1 = {
|
|
372
|
+
VAR1: 'value1'
|
|
373
|
+
};
|
|
374
|
+
const envVars2 = {
|
|
375
|
+
VAR2: null
|
|
376
|
+
};
|
|
377
|
+
const payload = {
|
|
378
|
+
[projectId1]: {
|
|
379
|
+
envVars: envVars1
|
|
380
|
+
},
|
|
381
|
+
[projectId2]: {
|
|
382
|
+
envVars: envVars2
|
|
383
|
+
}
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
const updates = await shadowHandler.handleShadowTopic({
|
|
387
|
+
topic: shadowHandler.shadowTopics.projects.updateDelta,
|
|
388
|
+
payload,
|
|
389
|
+
clientToken: ''
|
|
390
|
+
});
|
|
391
|
+
expect(updates.length).toBe(2);
|
|
392
|
+
expect(updates[0]).toEqual({
|
|
393
|
+
projectId: projectId1,
|
|
394
|
+
envVarUpdate: {
|
|
395
|
+
envVars: envVars1
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
expect(updates[1]).toEqual({
|
|
399
|
+
projectId: projectId2,
|
|
400
|
+
envVarUpdate: {
|
|
401
|
+
envVars: envVars2
|
|
402
|
+
}
|
|
403
|
+
});
|
|
279
404
|
});
|
|
280
405
|
});
|
|
281
406
|
|
|
282
|
-
test('
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
|
|
293
|
-
const appCfg1 = {
|
|
294
|
-
scripts: {
|
|
295
|
-
start: 'python app.py'
|
|
407
|
+
test('clear project shadow', async () => {
|
|
408
|
+
shadowHandler.clearAppConfig(projectId1);
|
|
409
|
+
const packet = {
|
|
410
|
+
state: {
|
|
411
|
+
desired: {
|
|
412
|
+
[projectId1]: null
|
|
413
|
+
},
|
|
414
|
+
reported: {
|
|
415
|
+
[projectId1]: null
|
|
416
|
+
}
|
|
296
417
|
},
|
|
297
|
-
|
|
298
|
-
'alwaysai/mobilenet_ssd': '3',
|
|
299
|
-
'alwaysai/yolo_v4': '5'
|
|
300
|
-
}
|
|
301
|
-
};
|
|
302
|
-
|
|
303
|
-
const payload = {
|
|
304
|
-
[projectId1]: {
|
|
305
|
-
appConfig: JSON.stringify(appCfg1)
|
|
306
|
-
}
|
|
418
|
+
clientToken: clientId
|
|
307
419
|
};
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
clientToken: ''
|
|
313
|
-
});
|
|
314
|
-
expect(appCfgUpdates.length).toBe(0);
|
|
420
|
+
expect(jest.mocked(publisher.publish)).toBeCalledWith(
|
|
421
|
+
shadowHandler.shadowTopics.projects.update,
|
|
422
|
+
JSON.stringify(packet)
|
|
423
|
+
);
|
|
315
424
|
});
|
|
316
425
|
|
|
317
426
|
test.skip('publish app config', async () => {
|
|
@@ -324,7 +433,7 @@ describe('Test Shadow Handler', () => {
|
|
|
324
433
|
};
|
|
325
434
|
jest.mocked(readAppCfgFile).mockResolvedValue(testAppCfg);
|
|
326
435
|
|
|
327
|
-
await shadowHandler.
|
|
436
|
+
await shadowHandler.updateProjectShadow(projectId1);
|
|
328
437
|
expect(jest.mocked(readAppCfgFile)).toBeCalledWith({ projectId1 });
|
|
329
438
|
const packet = {
|
|
330
439
|
state: {
|
|
@@ -349,23 +458,4 @@ describe('Test Shadow Handler', () => {
|
|
|
349
458
|
})
|
|
350
459
|
);
|
|
351
460
|
});
|
|
352
|
-
|
|
353
|
-
test('clear project shadow', async () => {
|
|
354
|
-
shadowHandler.clearAppConfig(projectId1);
|
|
355
|
-
const packet = {
|
|
356
|
-
state: {
|
|
357
|
-
desired: {
|
|
358
|
-
[projectId1]: null
|
|
359
|
-
},
|
|
360
|
-
reported: {
|
|
361
|
-
[projectId1]: null
|
|
362
|
-
}
|
|
363
|
-
},
|
|
364
|
-
clientToken: clientId
|
|
365
|
-
};
|
|
366
|
-
expect(jest.mocked(publisher.publish)).toBeCalledWith(
|
|
367
|
-
shadowHandler.shadowTopics.projects.update,
|
|
368
|
-
JSON.stringify(packet)
|
|
369
|
-
);
|
|
370
|
-
});
|
|
371
461
|
});
|