Skip to content

Package: DevicePackageManagementServiceImpl

DevicePackageManagementServiceImpl

nameinstructionbranchcomplexitylinemethod
DevicePackageManagementServiceImpl()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
downloadExec(KapuaId, KapuaId, DevicePackageDownloadRequest, DevicePackageDownloadOptions)
M: 259 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 61 C: 0
0%
M: 1 C: 0
0%
downloadExec(KapuaId, KapuaId, DevicePackageDownloadRequest, Long)
M: 13 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
downloadStatus(KapuaId, KapuaId, Long)
M: 99 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 25 C: 0
0%
M: 1 C: 0
0%
downloadStop(KapuaId, KapuaId, Long)
M: 96 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 26 C: 0
0%
M: 1 C: 0
0%
getInstalled(KapuaId, KapuaId, Long)
M: 99 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 25 C: 0
0%
M: 1 C: 0
0%
installExec(KapuaId, KapuaId, DevicePackageInstallRequest, DevicePackageInstallOptions)
M: 155 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 40 C: 0
0%
M: 1 C: 0
0%
installExec(KapuaId, KapuaId, DevicePackageInstallRequest, Long)
M: 13 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
installStatus(KapuaId, KapuaId, Long)
M: 99 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 25 C: 0
0%
M: 1 C: 0
0%
lambda$downloadStatus$1(PackageResponseMessage)
M: 26 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 7 C: 0
0%
M: 1 C: 0
0%
lambda$getInstalled$0(PackageResponseMessage)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
lambda$installStatus$2(PackageResponseMessage)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
lambda$uninstallStatus$3(PackageResponseMessage)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
static {...}
M: 11 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
uninstallExec(KapuaId, KapuaId, DevicePackageUninstallRequest, DevicePackageUninstallOptions)
M: 155 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 40 C: 0
0%
M: 1 C: 0
0%
uninstallExec(KapuaId, KapuaId, DevicePackageUninstallRequest, Long)
M: 13 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
uninstallStatus(KapuaId, KapuaId, Long)
M: 99 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 25 C: 0
0%
M: 1 C: 0
0%
verifyOverflowPackageFields(DevicePackageDownloadRequest)
M: 23 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2016, 2022 Eurotech and/or its affiliates and others
3: *
4: * This program and the accompanying materials are made
5: * available under the terms of the Eclipse Public License 2.0
6: * which is available at https://www.eclipse.org/legal/epl-2.0/
7: *
8: * SPDX-License-Identifier: EPL-2.0
9: *
10: * Contributors:
11: * Eurotech - initial API and implementation
12: *******************************************************************************/
13: package org.eclipse.kapua.service.device.management.packages.internal;
14:
15: import com.google.common.base.MoreObjects;
16: import org.eclipse.kapua.KapuaException;
17: import org.eclipse.kapua.KapuaIllegalArgumentException;
18: import org.eclipse.kapua.commons.model.id.IdGenerator;
19: import org.eclipse.kapua.commons.model.id.KapuaEid;
20: import org.eclipse.kapua.commons.util.ArgumentValidator;
21: import org.eclipse.kapua.locator.KapuaProvider;
22: import org.eclipse.kapua.model.domain.Actions;
23: import org.eclipse.kapua.model.id.KapuaId;
24: import org.eclipse.kapua.service.device.management.DeviceManagementDomains;
25: import org.eclipse.kapua.service.device.management.commons.AbstractDeviceManagementServiceImpl;
26: import org.eclipse.kapua.service.device.management.commons.call.DeviceCallBuilder;
27: import org.eclipse.kapua.service.device.management.message.KapuaMethod;
28: import org.eclipse.kapua.service.device.management.packages.DevicePackageFactory;
29: import org.eclipse.kapua.service.device.management.packages.DevicePackageManagementService;
30: import org.eclipse.kapua.service.device.management.packages.internal.setting.PackageManagementServiceSetting;
31: import org.eclipse.kapua.service.device.management.packages.internal.setting.PackageManagementServiceSettingKeys;
32: import org.eclipse.kapua.service.device.management.packages.message.internal.PackageAppProperties;
33: import org.eclipse.kapua.service.device.management.packages.message.internal.PackageRequestChannel;
34: import org.eclipse.kapua.service.device.management.packages.message.internal.PackageRequestMessage;
35: import org.eclipse.kapua.service.device.management.packages.message.internal.PackageRequestPayload;
36: import org.eclipse.kapua.service.device.management.packages.message.internal.PackageResource;
37: import org.eclipse.kapua.service.device.management.packages.message.internal.PackageResponseMessage;
38: import org.eclipse.kapua.service.device.management.packages.message.internal.PackageResponsePayload;
39: import org.eclipse.kapua.service.device.management.packages.model.DevicePackages;
40: import org.eclipse.kapua.service.device.management.packages.model.download.AdvancedPackageDownloadOptions;
41: import org.eclipse.kapua.service.device.management.packages.model.download.DevicePackageDownloadOperation;
42: import org.eclipse.kapua.service.device.management.packages.model.download.DevicePackageDownloadOptions;
43: import org.eclipse.kapua.service.device.management.packages.model.download.DevicePackageDownloadRequest;
44: import org.eclipse.kapua.service.device.management.packages.model.download.internal.DevicePackageDownloadOperationImpl;
45: import org.eclipse.kapua.service.device.management.packages.model.install.DevicePackageInstallOperation;
46: import org.eclipse.kapua.service.device.management.packages.model.install.DevicePackageInstallOptions;
47: import org.eclipse.kapua.service.device.management.packages.model.install.DevicePackageInstallRequest;
48: import org.eclipse.kapua.service.device.management.packages.model.uninstall.DevicePackageUninstallOperation;
49: import org.eclipse.kapua.service.device.management.packages.model.uninstall.DevicePackageUninstallOptions;
50: import org.eclipse.kapua.service.device.management.packages.model.uninstall.DevicePackageUninstallRequest;
51: import org.slf4j.Logger;
52: import org.slf4j.LoggerFactory;
53:
54: import java.net.MalformedURLException;
55: import java.util.Date;
56:
57: /**
58: * {@link DevicePackageManagementService} implementation.
59: *
60: * @since 1.0.0
61: */
62: @KapuaProvider
63: public class DevicePackageManagementServiceImpl extends AbstractDeviceManagementServiceImpl implements DevicePackageManagementService {
64:
65: private static final Logger LOG = LoggerFactory.getLogger(DevicePackageManagementServiceImpl.class);
66:
67: private static final PackageManagementServiceSetting PACKAGE_MANAGEMENT_SERVICE_SETTING = PackageManagementServiceSetting.getInstance();
68:
69: private static final DevicePackageFactory DEVICE_PACKAGE_FACTORY = LOCATOR.getFactory(DevicePackageFactory.class);
70:
71: private static final String SCOPE_ID = "scopeId";
72: private static final String DEVICE_ID = "deviceId";
73:
74: //
75: // Installed
76: //
77:
78: @Override
79: public DevicePackages getInstalled(KapuaId scopeId, KapuaId deviceId, Long timeout) throws KapuaException {
80: //
81: // Argument Validation
82: ArgumentValidator.notNull(scopeId, SCOPE_ID);
83: ArgumentValidator.notNull(deviceId, DEVICE_ID);
84:
85: //
86: // Check Access
87: AUTHORIZATION_SERVICE.checkPermission(PERMISSION_FACTORY.newPermission(DeviceManagementDomains.DEVICE_MANAGEMENT_DOMAIN, Actions.read, scopeId));
88:
89: //
90: // Prepare the request
91: PackageRequestChannel packageRequestChannel = new PackageRequestChannel();
92: packageRequestChannel.setAppName(PackageAppProperties.APP_NAME);
93: packageRequestChannel.setVersion(PackageAppProperties.APP_VERSION);
94: packageRequestChannel.setMethod(KapuaMethod.READ);
95: packageRequestChannel.setPackageResource(null);
96:
97: PackageRequestPayload packageRequestPayload = new PackageRequestPayload();
98:
99: PackageRequestMessage packageRequestMessage = new PackageRequestMessage();
100: packageRequestMessage.setScopeId(scopeId);
101: packageRequestMessage.setDeviceId(deviceId);
102: packageRequestMessage.setCapturedOn(new Date());
103: packageRequestMessage.setPayload(packageRequestPayload);
104: packageRequestMessage.setChannel(packageRequestChannel);
105:
106: //
107: // Build request
108: DeviceCallBuilder<PackageRequestChannel, PackageRequestPayload, PackageRequestMessage, PackageResponseMessage> packageDeviceCallBuilder =
109: DeviceCallBuilder
110: .newBuilder()
111: .withRequestMessage(packageRequestMessage)
112: .withTimeoutOrDefault(timeout);
113:
114: //
115: // Do get
116: PackageResponseMessage responseMessage;
117: try {
118: responseMessage = packageDeviceCallBuilder.send();
119: } catch (Exception e) {
120: LOG.error("Error while getting DevicePackages {} for Device {}. Error: {}", deviceId, e.getMessage(), e);
121: throw e;
122: }
123:
124: //
125: // Create event
126: createDeviceEvent(scopeId, deviceId, packageRequestMessage, responseMessage);
127:
128: //
129: // Check response
130: return checkResponseAcceptedOrThrowError(responseMessage, () -> responseMessage.getPayload().getDevicePackages());
131: }
132:
133: //
134: // Download
135: //
136:
137: @Override
138: public KapuaId downloadExec(KapuaId scopeId, KapuaId deviceId, DevicePackageDownloadRequest packageDownloadRequest, Long timeout) throws KapuaException {
139: DevicePackageDownloadOptions packageDownloadOptions = DEVICE_PACKAGE_FACTORY.newPackageDownloadOptions();
140: packageDownloadOptions.setTimeout(timeout);
141:
142: return downloadExec(scopeId, deviceId, packageDownloadRequest, packageDownloadOptions);
143: }
144:
145: @Override
146: public KapuaId downloadExec(KapuaId scopeId, KapuaId deviceId, DevicePackageDownloadRequest packageDownloadRequest, DevicePackageDownloadOptions packageDownloadOptions) throws KapuaException {
147: //
148: // Argument Validation
149: ArgumentValidator.notNull(scopeId, SCOPE_ID);
150: ArgumentValidator.notNull(deviceId, DEVICE_ID);
151: ArgumentValidator.notNull(packageDownloadRequest, "packageDownloadRequest");
152: ArgumentValidator.notNull(packageDownloadRequest.getUri(), "packageDownloadRequest.uri");
153: ArgumentValidator.notNull(packageDownloadRequest.getName(), "packageDownloadRequest.name");
154: ArgumentValidator.notNull(packageDownloadRequest.getVersion(), "packageDownloadRequest.version");
155: ArgumentValidator.notNull(packageDownloadOptions, "packageDownloadOptions");
156:
157: try {
158: packageDownloadRequest.getUri().toURL();
159: } catch (MalformedURLException | IllegalArgumentException ignored) {
160: throw new KapuaIllegalArgumentException("packageDownloadRequest.uri", packageDownloadRequest.getUri().toString());
161: }
162: verifyOverflowPackageFields(packageDownloadRequest);
163:
164: //
165: // Check Access
166: AUTHORIZATION_SERVICE.checkPermission(PERMISSION_FACTORY.newPermission(DeviceManagementDomains.DEVICE_MANAGEMENT_DOMAIN, Actions.write, scopeId));
167:
168: //
169: // Generate requestId
170: KapuaId operationId = new KapuaEid(IdGenerator.generate());
171:
172: //
173: // Prepare the request
174: PackageRequestChannel packageRequestChannel = new PackageRequestChannel();
175: packageRequestChannel.setAppName(PackageAppProperties.APP_NAME);
176: packageRequestChannel.setVersion(PackageAppProperties.APP_VERSION);
177: packageRequestChannel.setMethod(KapuaMethod.EXECUTE);
178: packageRequestChannel.setPackageResource(PackageResource.DOWNLOAD);
179:
180: PackageRequestPayload packageRequestPayload = new PackageRequestPayload();
181:
182: // Basic options
183: packageRequestPayload.setOperationId(operationId);
184: packageRequestPayload.setPackageDownloadURI(packageDownloadRequest.getUri());
185: packageRequestPayload.setPackageDownloadName(packageDownloadRequest.getName());
186: packageRequestPayload.setPackageDownloadVersion(packageDownloadRequest.getVersion());
187: packageRequestPayload.setPackageDownloadUsername(packageDownloadRequest.getUsername());
188: packageRequestPayload.setPackageDownloadPassword(packageDownloadRequest.getPassword());
189: packageRequestPayload.setPackageDownloadFileHash(packageDownloadRequest.getFileHash());
190: packageRequestPayload.setPackageDownloadFileType(packageDownloadRequest.getFileType());
191: packageRequestPayload.setPackageDownloadnstall(packageDownloadRequest.getInstall());
192: packageRequestPayload.setReboot(packageDownloadRequest.getReboot());
193: packageRequestPayload.setRebootDelay(packageDownloadRequest.getRebootDelay());
194:
195: // Advanced ones
196: AdvancedPackageDownloadOptions advancedOptions = packageDownloadRequest.getAdvancedOptions();
197:
198: packageRequestPayload.setPackageDownloadRestart(advancedOptions.getRestart());
199: packageRequestPayload.setPackageDownloadBlockSize(MoreObjects.firstNonNull(advancedOptions.getBlockSize(), PACKAGE_MANAGEMENT_SERVICE_SETTING.getInt(PackageManagementServiceSettingKeys.PACKAGE_MANAGEMENT_SERVICE_SETTING_DOWDLOAD_DEFAULT_BLOCK_SIZE)));
200: packageRequestPayload.setPackageDownloadBlockDelay(MoreObjects.firstNonNull(advancedOptions.getBlockDelay(), PACKAGE_MANAGEMENT_SERVICE_SETTING.getInt(PackageManagementServiceSettingKeys.PACKAGE_MANAGEMENT_SERVICE_SETTING_DOWDLOAD_DEFAULT_BLOCK_DELAY)));
201: packageRequestPayload.setPackageDownloadBlockTimeout(MoreObjects.firstNonNull(advancedOptions.getBlockTimeout(), PACKAGE_MANAGEMENT_SERVICE_SETTING.getInt(PackageManagementServiceSettingKeys.PACKAGE_MANAGEMENT_SERVICE_SETTING_DOWDLOAD_DEFAULT_BLOCK_TIMEOUT)));
202: packageRequestPayload.setPackageDownloadBlockSize(MoreObjects.firstNonNull(advancedOptions.getNotifyBlockSize(), PACKAGE_MANAGEMENT_SERVICE_SETTING.getInt(PackageManagementServiceSettingKeys.PACKAGE_MANAGEMENT_SERVICE_SETTING_DOWDLOAD_DEFAULT_NOTIFY_BLOCK_SIZE)));
203: packageRequestPayload.setPackageDownloadInstallVerifierURI(advancedOptions.getInstallVerifierURI());
204:
205: // Message
206: PackageRequestMessage packageRequestMessage = new PackageRequestMessage();
207: packageRequestMessage.setScopeId(scopeId);
208: packageRequestMessage.setDeviceId(deviceId);
209: packageRequestMessage.setCapturedOn(new Date());
210: packageRequestMessage.setPayload(packageRequestPayload);
211: packageRequestMessage.setChannel(packageRequestChannel);
212:
213: //
214: // Create device management operation
215: KapuaId deviceManagementOperationId = createManagementOperation(scopeId, deviceId, operationId, packageRequestMessage);
216:
217: //
218: // Build request
219: DeviceCallBuilder<PackageRequestChannel, PackageRequestPayload, PackageRequestMessage, PackageResponseMessage> packageDeviceCallBuilder =
220: DeviceCallBuilder
221: .newBuilder()
222: .withRequestMessage(packageRequestMessage)
223: .withTimeoutOrDefault(packageDownloadOptions.getTimeout());
224:
225: //
226: // Do exec
227: PackageResponseMessage responseMessage;
228: try {
229: responseMessage = packageDeviceCallBuilder.send();
230: } catch (Exception e) {
231: closeManagementOperation(scopeId, deviceId, operationId);
232: LOG.error("Error while executing DevicePackageDownloadRequest {} for Device {}. Error: {}", packageDownloadRequest.getUri(), deviceId, e.getMessage(), e);
233: throw e;
234: }
235:
236: //
237: // Create event
238: createDeviceEvent(scopeId, deviceId, packageRequestMessage, responseMessage);
239:
240: //
241: // Check response
242: try {
243: checkResponseAcceptedOrThrowError(responseMessage);
244: } catch (Exception e) {
245: closeManagementOperation(scopeId, deviceId, operationId, responseMessage);
246: throw e;
247: }
248:
249: //
250: // Return operation id
251: return deviceManagementOperationId;
252: }
253:
254: @Override
255: public DevicePackageDownloadOperation downloadStatus(KapuaId scopeId, KapuaId deviceId, Long timeout) throws KapuaException {
256: //
257: // Argument Validation
258: ArgumentValidator.notNull(scopeId, SCOPE_ID);
259: ArgumentValidator.notNull(deviceId, DEVICE_ID);
260:
261: //
262: // Check Access
263: AUTHORIZATION_SERVICE.checkPermission(PERMISSION_FACTORY.newPermission(DeviceManagementDomains.DEVICE_MANAGEMENT_DOMAIN, Actions.read, scopeId));
264:
265: //
266: // Prepare the request
267: PackageRequestChannel packageRequestChannel = new PackageRequestChannel();
268: packageRequestChannel.setAppName(PackageAppProperties.APP_NAME);
269: packageRequestChannel.setVersion(PackageAppProperties.APP_VERSION);
270: packageRequestChannel.setMethod(KapuaMethod.READ);
271: packageRequestChannel.setPackageResource(PackageResource.DOWNLOAD);
272:
273: PackageRequestPayload packageRequestPayload = new PackageRequestPayload();
274:
275: PackageRequestMessage packageRequestMessage = new PackageRequestMessage();
276: packageRequestMessage.setScopeId(scopeId);
277: packageRequestMessage.setDeviceId(deviceId);
278: packageRequestMessage.setCapturedOn(new Date());
279: packageRequestMessage.setPayload(packageRequestPayload);
280: packageRequestMessage.setChannel(packageRequestChannel);
281:
282: //
283: // Build request
284: DeviceCallBuilder<PackageRequestChannel, PackageRequestPayload, PackageRequestMessage, PackageResponseMessage> packageDeviceCallBuilder =
285: DeviceCallBuilder
286: .newBuilder()
287: .withRequestMessage(packageRequestMessage)
288: .withTimeoutOrDefault(timeout);
289:
290: //
291: // Do get
292: PackageResponseMessage responseMessage;
293: try {
294: responseMessage = packageDeviceCallBuilder.send();
295: } catch (Exception e) {
296: LOG.error("Error while getting DevicePackageDownloadOperation for Device {}. Error: {}", deviceId, e.getMessage(), e);
297: throw e;
298: }
299:
300: //
301: // Create event
302: createDeviceEvent(scopeId, deviceId, packageRequestMessage, responseMessage);
303:
304: //
305: // Check response
306: return checkResponseAcceptedOrThrowError(responseMessage, () -> {
307: PackageResponsePayload responsePayload = responseMessage.getPayload();
308:
309: DevicePackageDownloadOperation downloadOperation = new DevicePackageDownloadOperationImpl();
310: downloadOperation.setId(responsePayload.getPackageDownloadOperationId());
311: downloadOperation.setStatus(responsePayload.getPackageDownloadOperationStatus());
312: downloadOperation.setSize(responsePayload.getPackageDownloadOperationSize());
313: downloadOperation.setProgress(responsePayload.getPackageDownloadOperationProgress());
314:
315: return downloadOperation;
316: });
317: }
318:
319: @Override
320: public void downloadStop(KapuaId scopeId, KapuaId deviceId, Long timeout) throws KapuaException {
321: //
322: // Argument Validation
323: ArgumentValidator.notNull(scopeId, SCOPE_ID);
324: ArgumentValidator.notNull(deviceId, DEVICE_ID);
325:
326: //
327: // Check Access
328: AUTHORIZATION_SERVICE.checkPermission(PERMISSION_FACTORY.newPermission(DeviceManagementDomains.DEVICE_MANAGEMENT_DOMAIN, Actions.write, scopeId));
329:
330: //
331: // Prepare the request
332: PackageRequestChannel packageRequestChannel = new PackageRequestChannel();
333: packageRequestChannel.setAppName(PackageAppProperties.APP_NAME);
334: packageRequestChannel.setVersion(PackageAppProperties.APP_VERSION);
335: packageRequestChannel.setMethod(KapuaMethod.DELETE);
336: packageRequestChannel.setPackageResource(PackageResource.DOWNLOAD);
337:
338: PackageRequestPayload packageRequestPayload = new PackageRequestPayload();
339:
340: PackageRequestMessage packageRequestMessage = new PackageRequestMessage();
341: packageRequestMessage.setScopeId(scopeId);
342: packageRequestMessage.setDeviceId(deviceId);
343: packageRequestMessage.setCapturedOn(new Date());
344: packageRequestMessage.setPayload(packageRequestPayload);
345: packageRequestMessage.setChannel(packageRequestChannel);
346:
347: //
348: // Build request
349: DeviceCallBuilder<PackageRequestChannel, PackageRequestPayload, PackageRequestMessage, PackageResponseMessage> packageDeviceCallBuilder =
350: DeviceCallBuilder
351: .newBuilder()
352: .withRequestMessage(packageRequestMessage)
353: .withTimeoutOrDefault(timeout);
354:
355: //
356: // Do del
357: PackageResponseMessage responseMessage;
358: try {
359: responseMessage = packageDeviceCallBuilder.send();
360: } catch (Exception e) {
361: LOG.error("Error while stopping DevicePackageDownloadOperation for Device {}. Error: {}", deviceId, e.getMessage(), e);
362: throw e;
363: }
364:
365: //
366: // Create event
367: createDeviceEvent(scopeId, deviceId, packageRequestMessage, responseMessage);
368:
369: //
370: // Check response
371: checkResponseAcceptedOrThrowError(responseMessage);
372: }
373:
374: //
375: // Install
376: //
377:
378: @Override
379: public KapuaId installExec(KapuaId scopeId, KapuaId deviceId, DevicePackageInstallRequest packageInstallRequest, Long timeout) throws KapuaException {
380: DevicePackageInstallOptions packageInstallOptions = DEVICE_PACKAGE_FACTORY.newPackageInstallOptions();
381: packageInstallOptions.setTimeout(timeout);
382:
383: return installExec(scopeId, deviceId, packageInstallRequest, packageInstallOptions);
384: }
385:
386: @Override
387: public KapuaId installExec(KapuaId scopeId, KapuaId deviceId, DevicePackageInstallRequest deployInstallRequest, DevicePackageInstallOptions packageInstallOptions) throws KapuaException {
388: //
389: // Argument Validation
390: ArgumentValidator.notNull(scopeId, SCOPE_ID);
391: ArgumentValidator.notNull(deviceId, DEVICE_ID);
392: ArgumentValidator.notNull(deployInstallRequest, "deployInstallRequest");
393: ArgumentValidator.notNull(packageInstallOptions, "packageInstallOptions");
394:
395: //
396: // Check Access
397: AUTHORIZATION_SERVICE.checkPermission(PERMISSION_FACTORY.newPermission(DeviceManagementDomains.DEVICE_MANAGEMENT_DOMAIN, Actions.write, scopeId));
398:
399: //
400: // Generate requestId
401: KapuaId operationId = new KapuaEid(IdGenerator.generate());
402:
403: //
404: // Prepare the request
405: PackageRequestChannel packageRequestChannel = new PackageRequestChannel();
406: packageRequestChannel.setAppName(PackageAppProperties.APP_NAME);
407: packageRequestChannel.setVersion(PackageAppProperties.APP_VERSION);
408: packageRequestChannel.setMethod(KapuaMethod.EXECUTE);
409: packageRequestChannel.setPackageResource(PackageResource.INSTALL);
410:
411: PackageRequestPayload packageRequestPayload = new PackageRequestPayload();
412: packageRequestPayload.setOperationId(operationId);
413: packageRequestPayload.setPackageDownloadName(deployInstallRequest.getName());
414: packageRequestPayload.setPackageDownloadVersion(deployInstallRequest.getVersion());
415: packageRequestPayload.setReboot(deployInstallRequest.isReboot());
416: packageRequestPayload.setRebootDelay(deployInstallRequest.getRebootDelay());
417:
418: PackageRequestMessage packageRequestMessage = new PackageRequestMessage();
419: packageRequestMessage.setScopeId(scopeId);
420: packageRequestMessage.setDeviceId(deviceId);
421: packageRequestMessage.setCapturedOn(new Date());
422: packageRequestMessage.setPayload(packageRequestPayload);
423: packageRequestMessage.setChannel(packageRequestChannel);
424:
425: //
426: // Create device management operation
427: KapuaId deviceManagementOperationId = createManagementOperation(scopeId, deviceId, operationId, packageRequestMessage);
428:
429: //
430: // Build request
431: DeviceCallBuilder<PackageRequestChannel, PackageRequestPayload, PackageRequestMessage, PackageResponseMessage> packageDeviceCallBuilder =
432: DeviceCallBuilder
433: .newBuilder()
434: .withRequestMessage(packageRequestMessage)
435: .withTimeoutOrDefault(packageInstallOptions.getTimeout());
436:
437: //
438: // Do get
439: PackageResponseMessage responseMessage;
440: try {
441: responseMessage = packageDeviceCallBuilder.send();
442: } catch (Exception e) {
443: closeManagementOperation(scopeId, deviceId, operationId);
444: LOG.error("Error while executing DevicePackageInstallRequest {} for Device {}. Error: {}", deployInstallRequest.getName(), deviceId, e.getMessage(), e);
445: throw e;
446: }
447:
448: //
449: // Create event
450: createDeviceEvent(scopeId, deviceId, packageRequestMessage, responseMessage);
451:
452: //
453: // Check response
454: try {
455: checkResponseAcceptedOrThrowError(responseMessage);
456: } catch (Exception e) {
457: closeManagementOperation(scopeId, deviceId, operationId, responseMessage);
458: throw e;
459: }
460:
461: //
462: // Return operation id
463: return deviceManagementOperationId;
464: }
465:
466: @Override
467: public DevicePackageInstallOperation installStatus(KapuaId scopeId, KapuaId deviceId, Long timeout) throws KapuaException {
468: //
469: // Argument Validation
470: ArgumentValidator.notNull(scopeId, SCOPE_ID);
471: ArgumentValidator.notNull(deviceId, DEVICE_ID);
472:
473: //
474: // Check Access
475: AUTHORIZATION_SERVICE.checkPermission(PERMISSION_FACTORY.newPermission(DeviceManagementDomains.DEVICE_MANAGEMENT_DOMAIN, Actions.read, scopeId));
476:
477: //
478: // Prepare the request
479: PackageRequestChannel packageRequestChannel = new PackageRequestChannel();
480: packageRequestChannel.setAppName(PackageAppProperties.APP_NAME);
481: packageRequestChannel.setVersion(PackageAppProperties.APP_VERSION);
482: packageRequestChannel.setMethod(KapuaMethod.READ);
483: packageRequestChannel.setPackageResource(PackageResource.INSTALL);
484:
485: PackageRequestPayload packageRequestPayload = new PackageRequestPayload();
486:
487: PackageRequestMessage packageRequestMessage = new PackageRequestMessage();
488: packageRequestMessage.setScopeId(scopeId);
489: packageRequestMessage.setDeviceId(deviceId);
490: packageRequestMessage.setCapturedOn(new Date());
491: packageRequestMessage.setPayload(packageRequestPayload);
492: packageRequestMessage.setChannel(packageRequestChannel);
493:
494: //
495: // Build request
496: DeviceCallBuilder<PackageRequestChannel, PackageRequestPayload, PackageRequestMessage, PackageResponseMessage> packageDeviceCallBuilder =
497: DeviceCallBuilder
498: .newBuilder()
499: .withRequestMessage(packageRequestMessage)
500: .withTimeoutOrDefault(timeout);
501:
502: //
503: // Do get
504: PackageResponseMessage responseMessage;
505: try {
506: responseMessage = packageDeviceCallBuilder.send();
507: } catch (Exception e) {
508: LOG.error("Error while getting DevicePackageInstallOperation for Device {}. Error: {}", deviceId, e.getMessage(), e);
509: throw e;
510: }
511:
512: //
513: // Create event
514: createDeviceEvent(scopeId, deviceId, packageRequestMessage, responseMessage);
515:
516: //
517: // Check response
518: return checkResponseAcceptedOrThrowError(responseMessage, () -> responseMessage.getPayload().getDevicePackageInstallOperation());
519: }
520:
521: //
522: // Uninstall
523: //
524:
525: @Override
526: public KapuaId uninstallExec(KapuaId scopeId, KapuaId deviceId, DevicePackageUninstallRequest packageUninstallRequest, Long timeout) throws KapuaException {
527: DevicePackageUninstallOptions packageUninstallOptions = DEVICE_PACKAGE_FACTORY.newPackageUninstallOptions();
528: packageUninstallOptions.setTimeout(timeout);
529:
530: return uninstallExec(scopeId, deviceId, packageUninstallRequest, packageUninstallOptions);
531: }
532:
533: @Override
534: public KapuaId uninstallExec(KapuaId scopeId, KapuaId deviceId, DevicePackageUninstallRequest packageUninstallRequest, DevicePackageUninstallOptions packageUninstallOptions) throws KapuaException {
535: //
536: // Argument Validation
537: ArgumentValidator.notNull(scopeId, SCOPE_ID);
538: ArgumentValidator.notNull(deviceId, DEVICE_ID);
539: ArgumentValidator.notNull(packageUninstallRequest, "packageUninstallRequest");
540: ArgumentValidator.notNull(packageUninstallOptions, "packageUninstallOptions");
541:
542: //
543: // Check Access
544: AUTHORIZATION_SERVICE.checkPermission(PERMISSION_FACTORY.newPermission(DeviceManagementDomains.DEVICE_MANAGEMENT_DOMAIN, Actions.write, scopeId));
545:
546: //
547: // Generate requestId
548: KapuaId operationId = new KapuaEid(IdGenerator.generate());
549:
550: //
551: // Prepare the request
552: PackageRequestChannel packageRequestChannel = new PackageRequestChannel();
553: packageRequestChannel.setAppName(PackageAppProperties.APP_NAME);
554: packageRequestChannel.setVersion(PackageAppProperties.APP_VERSION);
555: packageRequestChannel.setMethod(KapuaMethod.EXECUTE);
556: packageRequestChannel.setPackageResource(PackageResource.UNINSTALL);
557:
558: PackageRequestPayload packageRequestPayload = new PackageRequestPayload();
559: packageRequestPayload.setOperationId(operationId);
560: packageRequestPayload.setPackageUninstallName(packageUninstallRequest.getName());
561: packageRequestPayload.setPackageUninstallVersion(packageUninstallRequest.getVersion());
562: packageRequestPayload.setReboot(packageUninstallRequest.isReboot());
563: packageRequestPayload.setRebootDelay(packageUninstallRequest.getRebootDelay());
564:
565: PackageRequestMessage packageRequestMessage = new PackageRequestMessage();
566: packageRequestMessage.setScopeId(scopeId);
567: packageRequestMessage.setDeviceId(deviceId);
568: packageRequestMessage.setCapturedOn(new Date());
569: packageRequestMessage.setPayload(packageRequestPayload);
570: packageRequestMessage.setChannel(packageRequestChannel);
571:
572: //
573: // Create device management operation
574: KapuaId deviceManagementOperationId = createManagementOperation(scopeId, deviceId, operationId, packageRequestMessage);
575:
576: //
577: // Build request
578: DeviceCallBuilder<PackageRequestChannel, PackageRequestPayload, PackageRequestMessage, PackageResponseMessage> packageDeviceCallBuilder =
579: DeviceCallBuilder
580: .newBuilder()
581: .withRequestMessage(packageRequestMessage)
582: .withTimeoutOrDefault(packageUninstallOptions.getTimeout());
583:
584: //
585: // Do uninstall
586: PackageResponseMessage responseMessage;
587: try {
588: responseMessage = packageDeviceCallBuilder.send();
589: } catch (Exception e) {
590: closeManagementOperation(scopeId, deviceId, operationId);
591: LOG.error("Error while executing DevicePackageUninstallRequest {} for Device {}. Error: {}", packageUninstallRequest.getName(), deviceId, e.getMessage(), e);
592: throw e;
593: }
594:
595: //
596: // Create event
597: createDeviceEvent(scopeId, deviceId, packageRequestMessage, responseMessage);
598:
599: //
600: // Check response
601: try {
602: checkResponseAcceptedOrThrowError(responseMessage);
603: } catch (Exception e) {
604: closeManagementOperation(scopeId, deviceId, operationId, responseMessage);
605: throw e;
606: }
607:
608: //
609: // Return operation id
610: return deviceManagementOperationId;
611: }
612:
613: @Override
614: public DevicePackageUninstallOperation uninstallStatus(KapuaId scopeId, KapuaId deviceId, Long timeout) throws KapuaException {
615: //
616: // Argument Validation
617: ArgumentValidator.notNull(scopeId, SCOPE_ID);
618: ArgumentValidator.notNull(deviceId, DEVICE_ID);
619:
620: //
621: // Check Access
622: AUTHORIZATION_SERVICE.checkPermission(PERMISSION_FACTORY.newPermission(DeviceManagementDomains.DEVICE_MANAGEMENT_DOMAIN, Actions.read, scopeId));
623:
624: //
625: // Prepare the request
626: PackageRequestChannel packageRequestChannel = new PackageRequestChannel();
627: packageRequestChannel.setAppName(PackageAppProperties.APP_NAME);
628: packageRequestChannel.setVersion(PackageAppProperties.APP_VERSION);
629: packageRequestChannel.setMethod(KapuaMethod.READ);
630: packageRequestChannel.setPackageResource(PackageResource.UNINSTALL);
631:
632: PackageRequestPayload packageRequestPayload = new PackageRequestPayload();
633:
634: PackageRequestMessage packageRequestMessage = new PackageRequestMessage();
635: packageRequestMessage.setScopeId(scopeId);
636: packageRequestMessage.setDeviceId(deviceId);
637: packageRequestMessage.setCapturedOn(new Date());
638: packageRequestMessage.setPayload(packageRequestPayload);
639: packageRequestMessage.setChannel(packageRequestChannel);
640:
641: //
642: // Build request
643: DeviceCallBuilder<PackageRequestChannel, PackageRequestPayload, PackageRequestMessage, PackageResponseMessage> packageDeviceCallBuilder =
644: DeviceCallBuilder
645: .newBuilder()
646: .withRequestMessage(packageRequestMessage)
647: .withTimeoutOrDefault(timeout);
648:
649: //
650: // Do get
651: PackageResponseMessage responseMessage;
652: try {
653: responseMessage = packageDeviceCallBuilder.send();
654: } catch (Exception e) {
655: LOG.error("Error while getting DevicePackageUninstallOperation for Device {}. Error: {}", deviceId, e.getMessage(), e);
656: throw e;
657: }
658:
659: //
660: // Create event
661: createDeviceEvent(scopeId, deviceId, packageRequestMessage, responseMessage);
662:
663: //
664: // Check response
665: return checkResponseAcceptedOrThrowError(responseMessage, () -> responseMessage.getPayload().getDevicePackageUninstallOperation());
666: }
667:
668: private void verifyOverflowPackageFields(DevicePackageDownloadRequest packageDownloadRequest) throws KapuaIllegalArgumentException {
669: ArgumentValidator.lengthRange(packageDownloadRequest.getUri().toString(), null, 2048, "packageDownloadRequest.uri");
670: ArgumentValidator.lengthRange(packageDownloadRequest.getName(), null, 256, "packageDownloadRequest.name");
671: ArgumentValidator.lengthRange(packageDownloadRequest.getVersion(), null, 256, "packageDownloadRequest.version");
672: }
673:
674:
675: }