diff --git a/quickstart/hono_commands.py b/quickstart/hono_commands.py index 97843236..e9e322be 100644 --- a/quickstart/hono_commands.py +++ b/quickstart/hono_commands.py @@ -53,7 +53,7 @@ def on_message(self, event): print('[got response]') response = json.loads(event.message.body) print(json.dumps(response, indent=2)) - if 200 <= response["status"] <= 299: + if response["status"] == 204: print('[ok]', command) else: print('[error]') diff --git a/quickstart/hono_commands_um.py b/quickstart/hono_commands_um.py deleted file mode 100644 index 9fe0b36b..00000000 --- a/quickstart/hono_commands_um.py +++ /dev/null @@ -1,237 +0,0 @@ -# Copyright (c) 2023 Contributors to the Eclipse Foundation -# -# See the NOTICE file(s) distributed with this work for additional -# information regarding copyright ownership. -# -# This program and the accompanying materials are made available under the -# terms of the Eclipse Public License 2.0 which is available at -# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 -# which is available at https://www.apache.org/licenses/LICENSE-2.0. -# -# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 - -import getopt -import json -import os -import signal -import sys -import threading -import time -import uuid - -from string import Template -from proton import Message -from proton.handlers import MessagingHandler -from proton.reactor import Container - -alpine_container_template = """ -{ -"id": "alpine", -"version": "latest", -"config": [ - { - "key": "image", - "value": "docker.io/library/alpine:latest" - }, - { - "key": "restartPolicy", - "value": "no" - } - ] -},""" - -containers_desired_state = Template(""" -{ - "topic": "$namespace/$name/things/live/messages/apply", - "headers": { - "content-type": "application/json", - "correlation-id": "$correlation_id", - "response-required": true - }, - "path": "/features/UpdateManager/inbox/messages/apply", - "value": { - "activityId": "$activity_id", - "desiredState": { - "domains": [ - { - "id": "containers", - "config": [], - "components": [ - { - "id": "influxdb", - "version": "2.7.1", - "config": [ - { - "key": "image", - "value": "docker.io/library/influxdb:$influxdb_version" - } - ] - }, - $alpine_container - { - "id": "hello-world", - "version": "latest", - "config": [ - { - "key": "image", - "value": "docker.io/library/hello-world:latest" - }, - { - "key": "restartPolicy", - "value": "no" - } - ] - } - ] - } - ] - } -} -} -""") - -containers_desired_state_clean_up = Template(""" -{ - "topic": "$namespace/$name/things/live/messages/apply", - "headers": { - "content-type": "application/json", - "correlation-id": "$correlation_id", - "response-required": true - }, - "path": "/features/UpdateManager/inbox/messages/apply", - "value": { - "activityId": "$activity_id", - "desiredState": { - "domains": [ - { - "id": "containers", - "config": [], - "components": [] - } - ] - } -} -} -""") - -um_refresh_state = Template(""" -{ - "topic": "$namespace/$name/things/live/messages/apply", - "headers": { - "content-type": "application/json", - "correlation-id": "$correlation_id", - "response-required": true - }, - "path": "/features/UpdateManager/inbox/messages/refresh", - "value": { - "activityId": "$activity_id", - } -} -""") - - -class CommandResponsesHandler(MessagingHandler): - def __init__(self, server, address): - super(CommandResponsesHandler, self).__init__() - self.server = server - self.address = address - - def on_start(self, event): - conn = event.container.connect(self.server, user="consumer@HONO", password="verysecret") - event.container.create_receiver(conn, self.address) - print('[connected]') - - def on_message(self, event): - print('[got response]') - response = json.loads(event.message.body) - print(json.dumps(response, indent=2)) - if response["status"] == 204: - print('[ok]', "um") - else: - print('[error]') - event.receiver.close() - event.connection.close() - - def on_connection_closed(self, event): - print('[connection closed]') - os.kill(os.getpid(), signal.SIGINT) - - -class CommandsInvoker(MessagingHandler): - def __init__(self, server, address): - super(CommandsInvoker, self).__init__() - self.server = server - self.address = address - - def on_start(self, event): - conn = event.container.connect(self.server, sasl_enabled=True, allowed_mechs="PLAIN", allow_insecure_mechs=True, - user="consumer@HONO", password="verysecret") - event.container.create_sender(conn, self.address) - - def on_sendable(self, event): - print('[sending command]') - correlation_id = str(uuid.uuid4()) - namespaced_id = device_id.split(':', 1) - activity_id = str(uuid.uuid4()) - - influxdb_version = "1.8.4" - alpine_container = alpine_container_template - if operation == "update": - influxdb_version = "1.8.5" - alpine_container = "" - if operation == "clean": - payload = containers_desired_state_clean_up.substitute(namespace=namespaced_id[0], - name=namespaced_id[1], - correlation_id=correlation_id, - activity_id=activity_id) - else: - payload = containers_desired_state.substitute(namespace=namespaced_id[0], name=namespaced_id[1], - correlation_id=correlation_id, - influxdb_version=influxdb_version, - alpine_container=alpine_container, - activity_id=activity_id) - print(json.dumps(json.loads(payload), indent=2)) - msg = Message(body=payload, address='{}/{}'.format(address, device_id), - content_type="application/json", - subject="um", reply_to=reply_to_address, correlation_id=correlation_id, id=str(uuid.uuid4())) - event.sender.send(msg) - event.sender.close() - event.connection.close() - print('[sent]') - - -# Parse command line args -options, reminder = getopt.getopt(sys.argv[1:], 't:d:o:') -opts_dict = dict(options) -tenant_id = os.environ.get("TENANT") or opts_dict['-t'] -device_id = os.environ.get("DEVICE_ID") or opts_dict['-d'] -operation = opts_dict['-o'] - -# AMQP global configurations -uri = 'amqps://hono.eclipseprojects.io:15671' -address = 'command/{}'.format(tenant_id) -reply_to_address = 'command_response/{}/replies'.format(tenant_id) -print('[starting] demo update manager app for tenant [{}], device [{}] at [{}]'.format(tenant_id, device_id, uri)) - -# Create command invoker and handler -response_handler = Container(CommandResponsesHandler(uri, reply_to_address)) -commands_invoker = Container(CommandsInvoker(uri, address)) -thread = threading.Thread(target=lambda: response_handler.run(), daemon=True) -thread.start() -# Give it some time to link -time.sleep(2) -# Send the command -commands_invoker.run() - - -def handler(signum, frame): - print('[stopping] demo update manager app for tenant [{}], device [{}] at [{}]'.format(tenant_id, device_id, uri)) - response_handler.stop() - thread.join(timeout=5) - print('[stopped]') - exit(0) - - -signal.signal(signal.SIGINT, handler) -while True: - pass diff --git a/quickstart/hono_events.py b/quickstart/hono_events.py index 1a61def8..ff9115c9 100644 --- a/quickstart/hono_events.py +++ b/quickstart/hono_events.py @@ -32,24 +32,16 @@ def on_start(self, event): print('[connected]') def on_message(self, event): + print('[event received]') if event.message.body is not None: - body = json.loads(event.message.body) - if topic_filter != "" and topic_filter != body['topic']: - return - print('[event received]') - print(json.dumps(body, indent=2)) + print(json.dumps(json.loads(event.message.body), indent=2)) else: - print('[empty event received]') + print('') # Parse command line args -options, reminder = getopt.getopt(sys.argv[1:], 't:f:') -opts_dict = dict(options) -tenant_id = os.environ.get("TENANT") or opts_dict['-t'] -if '-f' in opts_dict: - topic_filter = opts_dict['-f'] -else: - topic_filter = "" +options, reminder = getopt.getopt(sys.argv[1:], 't:') +tenant_id = os.environ.get("TENANT") or dict(options)['-t'] uri = 'amqps://hono.eclipseprojects.io:15671' address = 'event/{}'.format(tenant_id) diff --git a/web/site/content/docs/concepts/update-manager.md b/web/site/content/docs/concepts/update-manager.md deleted file mode 100755 index ed701aad..00000000 --- a/web/site/content/docs/concepts/update-manager.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: "Update manager" -type: docs -description: > - Empower the edge device for OTA updates. -weight: 2 ---- - -Update manager enables a lightweight core component which is capable to easily perform complex OTA update scenarios on a target device. The following capabilities are provided: - -* **Lightweight** - consists of a single core component which orchestrates the update process -* **Flexible deployment** - supports different deployment models - natively, as an executable or container -* **Unified API** - all domain agents utilize a unified Update Agent API for interacting with the Update Manager -* **MQTT Connectivity** - the connectivity and communication between the Update Manager and domain agent is MQTT-based -* **Multi-domain integration** - easily integrates, scales and performs complex update operations across multiple domains -* **Default update agents** - integrates with the Kanto provided out-of-the box domain update agent implementation for deployment of container into the Kanto container management -* **Pluggable architecture** - provides an extensible model for plug-in custom orchestration logic -* **Asynchronous updates** - asynchronous and independent update process across the different domains -* **Multi-staged updates** - the update process is organized into different stages -* **Configurable** - offers a variety of configuration options for connectivity, supported domains, message reporting and etc - -![Update manager](/kanto/images/docs/concepts/update-manager.png) - -### How it works - -The update process is initiated by sending the desired state specification as an MQTT message towards the device, which is handled by the Update Manager component. - -The desired state specification in the scope of the Update Manager is a JSON-based document, which consists of multiple component definitions per domain, representing the desired state to be applied on the target device. -A component in the same context means a single, atomic and updatable unit, for example, OCI-compliant container, software application or firmware image. - -Each domain agent is a separate and independent software component, which implements the Update Agent API for interaction with the Update Manager and manages the update logic for concrete domain. For example - container management. - -The Update Manager, operating as a coordinator, is responsible for processing the desired state specification, distributing the split specification across the different domain agents, orchestrating the update process via MQTT-based commands, collecting and consolidating the feedback responses from the domain update agents, and reporting the final result of the update campaign to the backend. - -As extra features and capabilities, the Update Manager enables reboot of the host after the update process is completed and reporting of the current state of the system to the backend. diff --git a/web/site/content/docs/getting-started/install.md b/web/site/content/docs/getting-started/install.md index d586d8e7..36d17198 100644 --- a/web/site/content/docs/getting-started/install.md +++ b/web/site/content/docs/getting-started/install.md @@ -37,8 +37,7 @@ container-management.service \ software-update.service \ file-upload.service \ file-backup.service \ -system-metrics.service \ -kanto-update-manager.service +system-metrics.service ``` All listed services must be in an active running state. diff --git a/web/site/content/docs/how-to-guides/perform-ota-update.md b/web/site/content/docs/how-to-guides/perform-ota-update.md deleted file mode 100644 index 31bf4a7a..00000000 --- a/web/site/content/docs/how-to-guides/perform-ota-update.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -title: "Perform OTA update" -type: docs -description: > - Perform an OTA update on your edge device. -weight: 3 ---- - -By following the steps below you will publish a simple `Desired State` specification via a publicly available Eclipse Hono sandbox and then the specification will be handled by the Eclipse Kanto Update Manager, which will trigger an OTA update on -the edge device. - -A simple monitoring application will track the progress and the status of the update process. -### Before you begin - -To ensure that all steps in this guide can be executed, you need: - -* Debian-based linux distribution and the `apt` command line tool - -* If you don't have an installed and running Eclipse Kanto, follow {{% relrefn "install" %}} Install Eclipse Kanto {{% /relrefn %}} - -* If you don't have a connected Eclipse Kanto to Eclipse Hono sandbox, - follow {{% relrefn "hono" %}} Explore via Eclipse Hono {{% /relrefn %}} - -* The {{% refn "https://github.com/eclipse-kanto/kanto/blob/main/quickstart/hono_commands_um.py" %}} - update manager application {{% /refn %}} - - Navigate to the `quickstart` folder where the resources from the {{% relrefn "hono" %}} Explore via Eclipse Hono {{% /relrefn %}} - guide are located and execute the following script: - - ```shell - wget https://github.com/eclipse-kanto/kanto/raw/main/quickstart/hono_commands_um.py - -* Enable the `containers update agent` service of the `Container Management` by adding the ` "update_agent": {"enable": true}` property to the `container-management` service configuration (by default located at `/etc/container-management/config.json`) - and restart the service: - ```shell - systemctl restart container-management - ``` - -### Publish the `Desired State` specification - -First, start the monitoring application that requires the configured Eclipse Hono tenant (`-t`) and an optional filter parameter (`-f`). It will print all -received feedback events triggered by the device: - -```shell -python3 hono_events.py -t demo -f demo/device/things/live/messages/feedback -``` - -The starting point of the OTA update process is to publish the example `Desired State` specification: -```shell -python3 hono_commands_um.py -t demo -d demo:device -o apply -``` - -The `Desired State` specification in this case consists of single domain section definition for the containers domain and a three container components - `influxdb`, `hello-world` and `alpine` image. - -### Apply `Desired State` specification - -The Update Manager receives the published `Desired State` to the local Mosquitto broker, splits the specification (in this case into single domain) and then -distributes the processed specification to the domain agents which initiates the actual update process logic on the domain agents side. - -The update process is organized into multiple phases, which are triggered by sending specific `Desired State` commands (`DOWNLOAD/UPDATE/ACTIVATE`). - -In the example scenario, the three images for the three container components will be pulled (if not available in the cache locally), created as containers during the `UPDATING` phase and -started in the `ACTIVATING` phase. - -### Monitor OTA update progress - -During the OTA update, the progress can be tracked in the monitoring application fot the `Desired State` feedback messages, started in the prerequisite section above. - -The Update Manager reports at a time interval of a second the status of the active update process. For example: - -```json -{ - "activityId":"e5c858cc-2057-41b0-bd5f-83aee0aad22e", - "timestamp":1693201088401, - "desiredStateFeedback":{ - "status":"RUNNING", - "actions":[ - { - "component":{ - "id":"containers:alpine", - "version":"latest" - }, - "status":"UPDATE_SUCCESS", - "message":"New container instance is started." - }, - { - "component":{ - "id":"containers:hello-world", - "version":"latest" - }, - "status":"UPDATE_SUCCESS", - "message":"New container instance is started." - }, - { - "component":{ - "id":"containers:influxdb", - "version":"2.7.1" - }, - "status":"UPDATING", - "message":"New container created." - } - ] - } -} -``` - -### List containers - -After the update process is completed, list the installed containers by executing the command `kanto-cm list` to verify if the `Desired State` is applied correctly. - -The output of the command should display the info about the three containers, described in the `Desired State` specification. The `influxdb` is expected to be in `RUNNING` state and -the other containers in status `EXITED`. For example : - -```text -ID |Name |Image |Status |Finished At |Exit Code -|-------------------------------------|-------------|------------------------------------|----------------------|--------- -7fe6b689-eb76-476d-a730-c2f422d6e8ea |influxdb |docker.io/library/influxdb:1.8.4 |Running | |0 -c36523d7-8d17-4255-ae0c-37f11003f658 |hello-world |docker.io/library/hello-world:latest|Exited | |0 -9b99978b-2593-4736-bb52-7a07be4a7ed1 |alpine |docker.io/library/alpine:latest |Exited | |0 -``` - -### Update `Desired State` specification - -To update the existing `Desired State` run the command below. The update changes affect two containers - `alpine` and `influxdb`. Being not present in the updated `Desired State` specification, the `alpine` container will be removed from the system. The `influxdb` will be updated to version 1.8.5. The last container - `hello-world` is not affected and any events will be not reported from the container update agent for this particular container. - -```shell -python3 hono_commands_um.py -t demo -d demo:device -o update -``` - -### List updated containers - -After the update process of the existing `Desired State` is completed, list again the available containers to the verify the `Desired State` is updated correctly. - -The output of the command should display the info about the two containers, described in the `Desired State` specification. The `influxdb` is expected to be updated with the version 1.8.5 and in `RUNNING` state and `hello-world` container to be status `EXITED` with version unchanged. The `alpine` container must be removed and not displayed. - -```text -ID |Name |Image |Status |Finished At |Exit Code -|-------------------------------------|-------------|------------------------------------|----------------------|--------- -7fe6b689-eb76-476d-a730-c2f422d6e8ea |influxdb |docker.io/library/influxdb:1.8.5 |Running | |0 -c36523d7-8d17-4255-ae0c-37f11003f658 |hello-world |docker.io/library/hello-world:latest|Exited | |0 -``` - -### Remove all containers - -To remove all containers, publish an empty `Desired State` specification (with empty `components` section): -```shell -python3 hono_commands_um.py -t demo -d demo:device -o clean -``` - -As a final step, execute the command `kanto-cm list` to verify that the containers are actually removed from the Kanto container management. -The expected output is `No found containers.`. \ No newline at end of file diff --git a/web/site/content/docs/references/containers/container-config.md b/web/site/content/docs/references/containers/container-config.md index 28e9f87b..1ea413f8 100644 --- a/web/site/content/docs/references/containers/container-config.md +++ b/web/site/content/docs/references/containers/container-config.md @@ -34,7 +34,6 @@ To control all aspects of the container instance behavior. | path_in_container | string | | Path to the device in the container | | cgroup_permissions | string | rwm | Cgroup permissions for the device access, possible options are: r(read), w(write), m(mknod) and all combinations are possible | | privileged | bool | false | Grant root capabilities to all devices on the host system | -| extra_capabilities | string[] | | Add additional Linux capabilities to the container | | **Host resources - mount points** | | | | | source | string | | Path to the file or directory on the host that is referred from within the container | | destination | string | | Path to the file or directory that is mounted inside the container | @@ -119,7 +118,6 @@ Be aware that some combinations may require property removal "network_mode": "bridge", "privileged": false, "extra_hosts": [], - "extra_capabilities": [], "port_mappings": [ { "proto": "tcp", diff --git a/web/site/content/docs/references/containers/container-manager-config.md b/web/site/content/docs/references/containers/container-manager-config.md index a6bb2942..f2145cab 100644 --- a/web/site/content/docs/references/containers/container-manager-config.md +++ b/web/site/content/docs/references/containers/container-manager-config.md @@ -58,7 +58,7 @@ To control all aspects of the container manager behavior. | enable | bool | true | Permit the container manager digital twin representation | | home_dir | string | /var/lib/container-management | Home directory for the digital twin data | | features | string[] | ContainerFactory, SoftwareUpdatable, Metrics | Features that will be registered for the container manager digital twin, the possible values are: ContainerFactory, SoftwareUpdatable and Metrics | -| **Digital twin - connectivity (Deprecated since v0.1.0-M4, replaced by Local connectivity)** | | | | +| **Digital twin - connectivity** | | | | | broker_url | string | tcp://localhost:1883 | Address of the MQTT server/broker that the container manager will connect for the local communication, the format is: `scheme://host:port` | | keep_alive | int | 20000 | Keep alive duration in milliseconds for the MQTT requests | | disconnect_timeout | int | 250 | Disconnect timeout in milliseconds for the MQTT server/broker | @@ -68,26 +68,7 @@ To control all aspects of the container manager behavior. | acknowledge_timeout | int | 15000 | Acknowledge timeout in milliseconds for the MQTT requests | | subscribe_timeout | int | 15000 | Subscribe timeout in milliseconds for the MQTT requests | | unsubscribe_timeout | int | 5000 | Unsubscribe timeout in milliseconds for the MQTT requests | -| **Digital twin - connectivity - TLS (Deprecated since v0.1.0-M4, replaced by Local Connectivity - TLS)** | | | | -| root_ca | string | | PEM encoded CA certificates file | -| client_cert | string | | PEM encoded certificate file to authenticate to the MQTT server/broker | -| client_key | string | | PEM encoded unencrypted private key file to authenticate to the MQTT server/broker | -| **Update Agent** | | | | -| enable | bool | true | Permit the containers update agent service | -| domain | string | containers | The domain of the update agent, used as a prefix in MQTT topic handled by the update agent implementation | -| containers | string[] | | List of system (core) containers that shall not be updated/destroyed by the containers update agent | -| verbose_inventory_report | bool | false | Includes extensive, verbose key-value properties in containers software nodes for the current state report. If not set, only valuable and non-default key-value parameters are reported | -| **Local connectivity** | | | | -| broker_url | string | tcp://localhost:1883 | Address of the MQTT server/broker that the container manager will connect for the local communication, the format is: `scheme://host:port` | -| keep_alive | string | 20s | Keep alive duration for the MQTT requests, duration string format, e.g. 1h2m3s5ms | -| disconnect_timeout | string | 250ms | Disconnect timeout for the MQTT server/broker, duration string format, e.g. 1h2m3s5ms | -| client_username | string | | Username that is a part of the credentials | -| client_password | string | | Password that is a part of the credentials | -| connect_timeout | string | 30s | Connect timeout for the MQTT server/broker, duration string format, e.g. 1h2m3s5ms | -| acknowledge_timeout | string | 15s | Acknowledge timeout for the MQTT requests, duration string format, e.g. 1h2m3s5ms | -| subscribe_timeout | string | 15s | Subscribe timeout for the MQTT requests, duration string format, e.g. 1h2m3s5ms | -| unsubscribe_timeout | string | 5s | Unsubscribe timeout for the MQTT requests, duration string format, e.g. 1h2m3s5ms | -| **Local connectivity - TLS** | | | | +| **Digital twin - connectivity - TLS** | | | | | root_ca | string | | PEM encoded CA certificates file | | client_cert | string | | PEM encoded certificate file to authenticate to the MQTT server/broker | | client_key | string | | PEM encoded unencrypted private key file to authenticate to the MQTT server/broker | @@ -192,30 +173,22 @@ Be aware that in the registry configuration the host (used as a key) has to be s "ContainerFactory", "SoftwareUpdatable", "Metrics" - ] - }, - "update_agent": { - "enable": true, - "domain": "containers", - "system_containers": [ - "my-core-container-that-is-auto-deployed-and-updatable-only-through-firmware-update" ], - "verbose_inventory_report": false, - }, - "connection": { - "broker_url": "tcp://localhost:1883", - "keep_alive": "20s", - "disconnect_timeout": "250ms", - "client_username": "", - "client_password": "", - "connect_timeout": "30s", - "acknowledge_timeout": "15s", - "subscribe_timeout": "15s", - "unsubscribe_timeout": "5s", - "transport": { - "root_ca": "", - "client_cert": "", - "client_key": "" + "connection": { + "broker_url": "tcp://localhost:1883", + "keep_alive": 20000, + "disconnect_timeout": 250, + "client_username": "", + "client_password": "", + "connect_timeout": 30000, + "acknowledge_timeout": 15000, + "subscribe_timeout": 15000, + "unsubscribe_timeout": 5000, + "transport": { + "root_ca": "", + "client_cert": "", + "client_key": "" + } } }, "log": { diff --git a/web/site/content/docs/references/update-manager-config.md b/web/site/content/docs/references/update-manager-config.md deleted file mode 100755 index f0fba723..00000000 --- a/web/site/content/docs/references/update-manager-config.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: "Update manager configuration" -type: docs -description: > - Customize the update manager. -weight: 6 ---- - -### Properties - -To control all aspects of the update manager. - -| Property | Type | Default | Description | -| - | - | - | - | -| **General** | | | | -| domain | string | device | The domain of the update manager, used as MQTT topic prefix | -| domains | string | containers| A comma-separated list of domains handled by the update manager. This configuration option is available only as a flag, but not inside the JSON config file. In JSON config file, the keys inside the Domain agents structure serve as domain names. | -| phaseTimeout | string | 10m | Timeout as duration string for completing an Update Orchestration phase | -| rebootAfter | string | 30s | Time period as duration string to wait before a reboot process is initiated after successful update operation | -| rebootEnabled | bool | true | Enable the reboot process after successful update operation | -| reportFeedbackInterval | string | 1m | Time interval as duration string for reporting intermediate desired state feedback messages during an active update operation | -| currentStateDelay | string | 30s | Time interval as duration string for reporting current state messages | -| thingsEnabled | bool | true | Specify whether the Update Manager will behave as a thing's feature | -| **Domain agents** | | | Holds a map structure (_agents_) with update agent configurations where each map key is treated as domain name | -| readTimeout | string | 1m | Timeout as duration string for reading the current state for the domain | -| rebootRequired | bool | false | Require a reboot for the domain after successful update | -| **Local connectivity** | | | | -| broker | string | tcp://localhost:1883 | Address of the MQTT server/broker that the container manager will connect for the local communication, the format is: `scheme://host:port` | -| keepAlive | string | 20s | Keep alive duration for the MQTT requests as duration string | -| disconnectTimeout | string | 250ms | Disconnect timeout for the MQTT server/broker as duration string | -| username | string | | Username that is a part of the credentials | -| password | string | | Password that is a part of the credentials | -| acknowledgeTimeout | string | 15s | Acknowledge timeout for the MQTT requests as duration string | -| connectTimeout | string | 30s | Connect timeout for the MQTT server/broker as duration string | -| subscribeTimeout | string | 15s | Subscribe timeout for the MQTT requests as duration string | -| unsubscribeTimeout | string | 5s | Unsubscribe timeout for the MQTT requests as duration string | -| **Logging** | | | | -| logFile | string | | Path to the file where the update manager’s log messages are written | -| logLevel | string | INFO | All log messages at this or a higher level will be logged, the log levels in descending order are: ERROR, WARN, INFO, DEBUG and TRACE | -| logFileCount | int | 5 | Log file maximum rotations count | -| logFileMaxAge | int | 28 | Log file rotations maximum age in days, use 0 to not remove old log files | -| logFileSize | int | 2 | Log file size in MB before it gets rotated | - -### Example - -An example for configuring the update manager with two domains - `containers` and `custom-domain`, report feedback interval at 30 seconds, and log, written to custom log file `update-manager.log` with -log level `DEBUG`. - -```json -{ - "log": { - "logFile": "update-manager.log", - "logLevel": "DEBUG" - }, - "agents": { - "containers": { - "readTimeout": "30s" - }, - "custom-domain": { - "rebootRequired": true - } - }, - "reportFeedbackInterval": "30s" -} -``` - -### Template - -The configuration can be further adjusted according to the use case. -The following template illustrates all possible properties with their default values. - -```json -{ - "domain": "device", - "agents": { - "containers": { - "rebootRequired": false, - "readTimeout": "1m" - } - }, - "log": { - "logFile": "", - "logLevel": "INFO", - "logFileCount": 5, - "logFileMaxAge": 28, - "logFileSize": 2 - }, - "connection": { - "broker": "tcp://localhost:1883", - "keepAlive": "20s", - "acknowledgeTimeout": "15s", - "username": "", - "password": "", - "connectTimeout": "30a", - "disconnectTimeout": "250ms", - "subscribeTimeout": "15s", - "unsubscribeTimeout": "5s" - }, - "phaseTimeout": "10m", - "rebootAfter": "30s", - "rebootEnabled": true, - "reportFeedbackInterval": "1m", - "currentStateDelay": "30s", - "thingsEnabled": true -} -``` diff --git a/web/site/static/images/docs/concepts/update-manager.odg b/web/site/static/images/docs/concepts/update-manager.odg deleted file mode 100755 index 7d067495..00000000 Binary files a/web/site/static/images/docs/concepts/update-manager.odg and /dev/null differ diff --git a/web/site/static/images/docs/concepts/update-manager.png b/web/site/static/images/docs/concepts/update-manager.png deleted file mode 100644 index e0fe8ca2..00000000 Binary files a/web/site/static/images/docs/concepts/update-manager.png and /dev/null differ