App Updates
This reference defines the contract between Nexigon and the app integrations
on devices: the dev.nexigon.apps.config and dev.nexigon.apps.status
properties and the nexigon.apps.check command. An app integration installs,
updates, and removes the apps on a device independently of its system, such as
the Rugix Apps integration of Nexigon Agent.
To deploy an app, follow Application Workloads.
The contract follows the update model of system updates: Nexigon Hub stores the desired state, and the device converges toward it and reports its progress. It reuses the maintenance windows, retry policies, and spreads of OTA updates.
The contract is unstable and may still change in incompatible ways.
Interface
| Name | Kind | Usage | Purpose |
|---|---|---|---|
dev.nexigon.apps.config | Protected property | Written by operators | Desired state of the device apps |
dev.nexigon.apps.status | Property | Written by the device | Actual state of the device apps |
nexigon.apps.check | Device command | Registered by the device, run by operators | Requests an immediate check |
Configuration Property
dev.nexigon.apps.config lists the apps that the integration manages under
apps, by app name. The integration leaves installed apps that the property
does not list untouched.
{
"window": { "ranges": [{ "start": "02:00", "end": "05:00" }] },
"apps": {
"controller": { "path": "acme/controller/stable" },
"historian": {
"path": "acme/historian/pkg_v_3sLgP9eKd7XwHn2QaRt5Zm",
"hold": true
},
"legacy-bridge": { "state": "removed" }
}
}The policies hold, window, retry, spread, and gc apply to every app
that does not set its own. Except for gc, they have the same format and
meaning as in
dev.nexigon.ota.config.
They govern version changes. A change of an app’s state applies at the next
check, regardless of the policies.
| Field | Description |
|---|---|
apps | Managed apps by name. Each app has the fields below. |
hold | Holds all apps at their current versions while true. The device neither installs nor activates new versions. |
window | Maintenance window restricting when the device switches a running app to a new version. |
retry | Retry policy for failed attempts. |
spread | Spread of updates across devices. The position of a device depends on the target version of each app. |
gc | Removal of old versions after an update. See Old Versions. |
| App Field | Description |
|---|---|
path | Version path in the format <repository>/<package>/<version>. Without a path, the integration only applies state to an installed app. |
asset | Filename of the bundle to install. {arch} stands for the architecture of the device. See Bundle Selection for the default. |
state | Desired state: running (default), stopped, or removed. |
hold, window, retry, spread, and gc | Policies of the app, which replace those of the configuration. For example, "hold": false exempts the app from a hold of all apps. |
rollout | Rollout number. Integrations ignore its value. Changing it starts a new round of attempts of the app on devices whose attempts failed. |
The desired states have these effects:
running: The app is installed and its workload runs.stopped: The app is installed but deactivated. Its workload does not run, also not after a reboot. Version changes of a stopped app install the new version without starting it.removed: The app is uninstalled, including its persistent data.
Removing an app from apps ends its management but leaves it installed. To
uninstall an app, set its state to removed.
Device profiles apply the property as a JSON merge patch, so a profile can add,
change, or remove a single app without repeating the others. For example, a profile setting
{ "apps": { "historian": null } } ends the management of historian on the
devices that apply the profile.
Bundle Selection
A package version can contain bundles of an app for several architectures. The
integration installs the bundle for the architecture of the device, which it
reports as arch in the status. Nexigon Agent uses Rust’s architecture names,
such as x86_64, aarch64, or arm.
Without asset, the integration installs <app>-<arch>.rugixb, or
<app>.rugixb if the version has no bundle for the architecture. Use the
second name for bundles that run on every architecture. For example, a version
of the controller app for two architectures contains:
controller-x86_64.rugixb
controller-aarch64.rugixb
If the version has no matching bundle, the app is blocked with the code
no-asset.
Check Cycle
The integration checks the apps periodically, after the device connects, when
an attempt is due, and when someone runs the nexigon.apps.check command. For
each managed app, a check performs these steps:
- Apply the desired state. A
removedapp is uninstalled, astoppedapp is stopped, and arunningapp is started. An app that starts while its target version is installed starts with the target version. - Resolve the path to the target version.
- Unless a hold, a spread, or a retry policy defers the update, install the bundle of the target version without interrupting the app.
- Switch the app to the new version, unless the maintenance window is closed while the app runs. A closed window leaves the installed version waiting for the window.
- Remove old versions of the app, as the
gcpolicy defines. - Publish the status.
The device records the package version of every installation, so it knows which version an app runs without relying on the previous status. If the target version is still installed from an earlier update, the device switches back to it without downloading it again.
Old Versions
After switching an app to a new version, the integration removes old versions of the app to free storage. It keeps the running version and the most recent previously running versions. An installed version that has not run yet stays until it or a newer version runs.
{
"gc": { "keep": 1 },
"apps": {
"historian": { "path": "acme/historian/stable", "gc": { "keep": 3 } }
}
}| Field | Description |
|---|---|
keep | Number of previously running versions to keep. Defaults to the integration’s default. Nexigon Agent keeps 1 unless its configuration sets gc.keep. |
Keeping more versions makes switching back faster and works without a connection to the repository, at the cost of storage.
Status Property
The integration publishes dev.nexigon.apps.status to report the status of
every managed and every installed app.
{
"capabilities": ["hold", "asset", "window", "retry", "spread", "gc"],
"configVersion": 12,
"arch": "aarch64",
"runtime": { "name": "rugix", "version": "1.4.0" },
"apps": {
"controller": {
"managed": true,
"config": { "path": "acme/controller/stable", "state": "running" },
"state": "blocked",
"blocked": { "code": "window" },
"generation": 3,
"currentVersionId": "pkg_v_7Hq2mWbXc9RtLpZ3sNfE1k",
"targetVersionId": "pkg_v_3sLgP9eKd7XwHn2QaRt5Zm",
"asset": "controller-aarch64.rugixb",
"failureCount": 0,
"workload": { "state": "running" }
},
"debug-shell": {
"managed": false,
"generation": 1,
"workload": { "state": "stopped" }
}
}
}| Field | Description |
|---|---|
capabilities | Optional features that the integration supports: hold, asset, window, retry, spread, and gc. |
configVersion | Version of dev.nexigon.apps.config that the integration last read. |
lastError | Why the integration cannot apply the configuration, for example because the property is invalid. |
arch | Architecture of the device, which selects the bundles it installs. |
runtime | Runtime that installs and runs the apps, with its name and version. |
apps | Status of every managed and every installed app, by name. |
| App Field | Description |
|---|---|
managed | Whether dev.nexigon.apps.config lists the app. |
config | Effective configuration of the app, including the policies that apply to it. |
state | State of the app’s update process. |
blocked | Present when state is blocked. Contains a code and an optional human-readable message. |
generation | Installation of the app that runs, or that runs when the app starts. |
currentVersionId | Package version of generation. Absent when the integration did not install it. |
targetVersionId | Package version that the configured path resolves to. |
asset | Filename of the bundle that the integration installs from the target version. |
failureCount | Consecutive failed attempts for the target version. Resets when the target version or the effective configuration of the app changes. |
lastError | Error message of the last failure. |
nextAttemptAt | Earliest time of the next attempt, while the app waits for a spread, a maintenance window, a retry delay, or a retry cooldown. |
workload | Live status of the app’s workload: running, unhealthy, stopped, failed, or unknown, with a message for unhealthy and failed. |
States
| State | Meaning |
|---|---|
idle | No path is configured. |
installing | A new version is being downloaded and installed without interrupting the app. |
activating | The app is switching to the installed version. |
removing | The app is being uninstalled. |
completed | The app has the target version and its desired state, or it has been uninstalled as desired. |
failed | The last attempt failed. lastError explains why. |
blocked | An update is available but cannot proceed yet. See blocked for the reason. |
If activating a new version fails, Rugix Apps restores the previous version, and
the app reports failed while it keeps running the previous version.
Blocked Codes
| Code | Meaning |
|---|---|
hold | The configuration holds the app at its current version. |
spread | The device waits for its turn in a spread or is outside the released percentage. |
window | The device waits for its maintenance window. The new version may already be installed. |
no-asset | The target version has no bundle for the device’s architecture or no available asset with the filename in asset. |
Requesting a Retry
The integration writes the status with the version it read last
(compare-and-swap). Other writers may only remove the failureCount and
nextAttemptAt of an app, which requests a new attempt at the next check.
Retry Update in the web interface does this.
Sidex Schema
The properties Sidex schema defines the property formats:
schemaproperties
Types related to device properties.
AppUpdateConfig
- Unstable (feature
app_updates)
App update configuration (dev.nexigon.apps.config).
Desired state of the apps on a device. The integration manages the apps listed
in apps and leaves other installed apps untouched. Removing an app from
apps ends its management without uninstalling it. To uninstall an app, set
its state to removed.
The policies hold, window, retry, spread, and gc apply to every app
that does not set its own. They govern version changes. Changes of an app's
state apply at the next check.
Fields (JSON object)
appsoptionalManaged apps by name.
object<string, ManagedAppConfig>
Keys
stringValues
ManagedAppConfig
Fields (JSON object)
pathoptionalVersion path in the format
<repository>/<package>/<version>.<version>is a tag or a version ID. A tag tracks the version the tag points to. A version ID pins a single version. Without a path, the integration does not install or update the app and only appliesstateto an installed app.stringassetoptionalFilename of the bundle that the device installs from a version.
{arch}stands for the architecture of the device. Defaults to<app>-{arch}.rugixb, or to<app>.rugixbif the version has no bundle for the architecture.stringstateoptionalDesired state of the app. Defaults to
running.AppDesiredState
Casesexternally
Running→"running"The app is installed and its workload runs.
Value: "running"Stopped→"stopped"The app is installed but deactivated, so that its workload does not run, also not after a reboot.
Value: "stopped"Removed→"removed"The app is uninstalled, including its persistent data.
Value: "removed"
holdoptionalHold the app at its current version.
booleanwindowoptionalMaintenance window restricting when updates of the app are activated.
OtaUpdateWindow
Fields (JSON object)
rangesrequiredTime ranges in which updates can be activated.
An empty list never allows activation.
array<OtaUpdateWindowRange>
Items
OtaUpdateWindowRange
Fields (JSON object)
daysoptionalDays on which the range starts.
Defaults to every day.
array<Weekday>
Items
Weekday
Casesexternally
Monday→"monday"Value: "monday"Tuesday→"tuesday"Value: "tuesday"Wednesday→"wednesday"Value: "wednesday"Thursday→"thursday"Value: "thursday"Friday→"friday"Value: "friday"Saturday→"saturday"Value: "saturday"Sunday→"sunday"Value: "sunday"
startrequiredStart of the range (inclusive).
TimeOfDay
Wraps
stringendrequiredEnd of the range (exclusive).
An end at or before the start lies on the following day. A range whose end equals its start therefore spans 24 hours.
TimeOfDay
Wraps
string
retryoptionalRetry policy for failed update attempts of the app.
OtaUpdateRetryPolicy
Fields (JSON object)
maxAttempts(frommax_attempts)optionalMaximum number of failed attempts for a version.
Unlimited when absent.
integerinitialDelaySecs(frominitial_delay_secs)optionalDelay before the first retry in seconds.
integermaxDelaySecs(frommax_delay_secs)optionalMaximum delay between attempts in seconds.
integercooldownSecs(fromcooldown_secs)optionalTime in seconds after reaching
max_attemptsbefore the failure count resets and a new round of attempts begins.Without a cooldown, the device stops attempting the version until the version of the configuration changes or the failure count is cleared.
integer
spreadoptionalSpreading of updates of the app across devices.
OtaUpdateSpread
Fields (JSON object)
durationSecs(fromduration_secs)optionalTime over which updates are spread, in seconds.
integerstartAt(fromstart_at)optionalStart of the spread over time.
Defaults to the time at which the tag in the configured path was assigned to its current version. Without an explicit start, updates to versions configured by version ID are not spread over time.
TimestamppercentageoptionalShare of devices that may update, in percent.
Raising the percentage only adds devices. Without
duration_secs, it releases the update to the given share right away. Withduration_secs, it caps the share of the spread over time.number
gcoptionalRemoval of old versions of the app after an update.
AppGcPolicy
Fields (JSON object)
keepoptionalNumber of previously running versions to keep.
Defaults to the integration's default, usually 1.
integer
rolloutoptionalRollout number.
Integrations ignore its value. Changing it changes the app's configuration, which starts a new round of attempts on devices whose attempts failed.
integer
holdoptionalHold all apps at their current versions.
While set, the device neither installs nor activates new versions. An update in progress completes. Defaults to false.
booleanwindowoptionalMaintenance window restricting when updates are activated.
Outside the window, the device may download and install a new version of a running app without activating it. Updates can be activated at any time when absent.
OtaUpdateWindow
Fields (JSON object)
rangesrequiredTime ranges in which updates can be activated.
An empty list never allows activation.
array<OtaUpdateWindowRange>
Items
OtaUpdateWindowRange
Fields (JSON object)
daysoptionalDays on which the range starts.
Defaults to every day.
array<Weekday>
Items
Weekday
Casesexternally
Monday→"monday"Value: "monday"Tuesday→"tuesday"Value: "tuesday"Wednesday→"wednesday"Value: "wednesday"Thursday→"thursday"Value: "thursday"Friday→"friday"Value: "friday"Saturday→"saturday"Value: "saturday"Sunday→"sunday"Value: "sunday"
startrequiredStart of the range (inclusive).
TimeOfDay
Wraps
stringendrequiredEnd of the range (exclusive).
An end at or before the start lies on the following day. A range whose end equals its start therefore spans 24 hours.
TimeOfDay
Wraps
string
retryoptionalRetry policy for failed update attempts.
OtaUpdateRetryPolicy
Fields (JSON object)
maxAttempts(frommax_attempts)optionalMaximum number of failed attempts for a version.
Unlimited when absent.
integerinitialDelaySecs(frominitial_delay_secs)optionalDelay before the first retry in seconds.
integermaxDelaySecs(frommax_delay_secs)optionalMaximum delay between attempts in seconds.
integercooldownSecs(fromcooldown_secs)optionalTime in seconds after reaching
max_attemptsbefore the failure count resets and a new round of attempts begins.Without a cooldown, the device stops attempting the version until the version of the configuration changes or the failure count is cleared.
integer
spreadoptionalSpreading of updates across devices.
Devices update without waiting when absent.
OtaUpdateSpread
Fields (JSON object)
durationSecs(fromduration_secs)optionalTime over which updates are spread, in seconds.
integerstartAt(fromstart_at)optionalStart of the spread over time.
Defaults to the time at which the tag in the configured path was assigned to its current version. Without an explicit start, updates to versions configured by version ID are not spread over time.
TimestamppercentageoptionalShare of devices that may update, in percent.
Raising the percentage only adds devices. Without
duration_secs, it releases the update to the given share right away. Withduration_secs, it caps the share of the spread over time.number
gcoptionalRemoval of old versions after an update.
AppGcPolicy
Fields (JSON object)
keepoptionalNumber of previously running versions to keep.
Defaults to the integration's default, usually 1.
integer
ManagedAppConfig
- Unstable (feature
app_updates)
Desired state of a managed app.
A policy set here replaces the policy of the configuration for this app.
Fields (JSON object)
pathoptionalVersion path in the format
<repository>/<package>/<version>.<version>is a tag or a version ID. A tag tracks the version the tag points to. A version ID pins a single version. Without a path, the integration does not install or update the app and only appliesstateto an installed app.stringassetoptionalFilename of the bundle that the device installs from a version.
{arch}stands for the architecture of the device. Defaults to<app>-{arch}.rugixb, or to<app>.rugixbif the version has no bundle for the architecture.stringstateoptionalDesired state of the app. Defaults to
running.AppDesiredState
Casesexternally
Running→"running"The app is installed and its workload runs.
Value: "running"Stopped→"stopped"The app is installed but deactivated, so that its workload does not run, also not after a reboot.
Value: "stopped"Removed→"removed"The app is uninstalled, including its persistent data.
Value: "removed"
holdoptionalHold the app at its current version.
booleanwindowoptionalMaintenance window restricting when updates of the app are activated.
OtaUpdateWindow
Fields (JSON object)
rangesrequiredTime ranges in which updates can be activated.
An empty list never allows activation.
array<OtaUpdateWindowRange>
Items
OtaUpdateWindowRange
Fields (JSON object)
daysoptionalDays on which the range starts.
Defaults to every day.
array<Weekday>
Items
Weekday
Casesexternally
Monday→"monday"Value: "monday"Tuesday→"tuesday"Value: "tuesday"Wednesday→"wednesday"Value: "wednesday"Thursday→"thursday"Value: "thursday"Friday→"friday"Value: "friday"Saturday→"saturday"Value: "saturday"Sunday→"sunday"Value: "sunday"
startrequiredStart of the range (inclusive).
TimeOfDay
Wraps
stringendrequiredEnd of the range (exclusive).
An end at or before the start lies on the following day. A range whose end equals its start therefore spans 24 hours.
TimeOfDay
Wraps
string
retryoptionalRetry policy for failed update attempts of the app.
OtaUpdateRetryPolicy
Fields (JSON object)
maxAttempts(frommax_attempts)optionalMaximum number of failed attempts for a version.
Unlimited when absent.
integerinitialDelaySecs(frominitial_delay_secs)optionalDelay before the first retry in seconds.
integermaxDelaySecs(frommax_delay_secs)optionalMaximum delay between attempts in seconds.
integercooldownSecs(fromcooldown_secs)optionalTime in seconds after reaching
max_attemptsbefore the failure count resets and a new round of attempts begins.Without a cooldown, the device stops attempting the version until the version of the configuration changes or the failure count is cleared.
integer
spreadoptionalSpreading of updates of the app across devices.
OtaUpdateSpread
Fields (JSON object)
durationSecs(fromduration_secs)optionalTime over which updates are spread, in seconds.
integerstartAt(fromstart_at)optionalStart of the spread over time.
Defaults to the time at which the tag in the configured path was assigned to its current version. Without an explicit start, updates to versions configured by version ID are not spread over time.
TimestamppercentageoptionalShare of devices that may update, in percent.
Raising the percentage only adds devices. Without
duration_secs, it releases the update to the given share right away. Withduration_secs, it caps the share of the spread over time.number
gcoptionalRemoval of old versions of the app after an update.
AppGcPolicy
Fields (JSON object)
keepoptionalNumber of previously running versions to keep.
Defaults to the integration's default, usually 1.
integer
rolloutoptionalRollout number.
Integrations ignore its value. Changing it changes the app's configuration, which starts a new round of attempts on devices whose attempts failed.
integer
AppDesiredState
- Unstable (feature
app_updates)
Desired state of a managed app.
Casesexternally
Running→"running"The app is installed and its workload runs.
Value: "running"Stopped→"stopped"The app is installed but deactivated, so that its workload does not run, also not after a reboot.
Value: "stopped"Removed→"removed"The app is uninstalled, including its persistent data.
Value: "removed"
AppGcPolicy
- Unstable (feature
app_updates)
Removal of old versions of an app.
After switching an app to a new version, the integration removes old versions to free storage. It keeps the running version and the most recent previously running versions, to which the app can switch back without downloading them again.
Fields (JSON object)
keepoptionalNumber of previously running versions to keep.
Defaults to the integration's default, usually 1.
integer
AppUpdateStatus
- Unstable (feature
app_updates)
App update status (dev.nexigon.apps.status).
Actual state of the apps on a device, published by its app integration.
The integration writes the status with the version it read last
(compare-and-swap), so that it does not overwrite concurrent changes. Other
writers may only clear the failure_count and next_attempt_at of an app,
which requests a new attempt.
Fields (JSON object)
capabilitiesoptionalOptional features of the app update contract that the integration supports.
array<AppUpdateCapability>
Items
AppUpdateCapability
Casesexternally
Window→"window"The integration honors
window.Value: "window"Retry→"retry"The integration honors
retryand resets the failure count of an app when its configuration changes.Value: "retry"Spread→"spread"The integration honors
spread.Value: "spread"Hold→"hold"The integration honors
hold.Value: "hold"Asset→"asset"The integration honors
asset.Value: "asset"Gc→"gc"The integration honors
gc.Value: "gc"
configVersion(fromconfig_version)optionalVersion of the
dev.nexigon.apps.configproperty that the integration last read.Absent when the property does not exist. The version changes with every write to the device's own value and whenever a profile revision that sets the property is applied to the device, even with an unchanged value.
integer (i64)lastError(fromlast_error)optionalWhy the integration cannot apply the configuration, if it cannot.
stringarchoptionalArchitecture of the device, which selects the bundles it installs.
stringruntimeoptionalRuntime that installs and runs apps on the device.
AppRuntime
Fields (JSON object)
namerequiredName of the runtime, such as
rugix.stringversionoptionalVersion of the runtime.
string
appsrequiredManaged and installed apps by name.
object<string, AppStatus>
Keys
stringValues
AppStatus
Fields (JSON object)
managedrequiredWhether
dev.nexigon.apps.configlists the app.booleanconfigoptionalEffective configuration of the app, including the policies that apply to it.
ManagedAppConfig
Fields (JSON object)
pathoptionalVersion path in the format
<repository>/<package>/<version>.<version>is a tag or a version ID. A tag tracks the version the tag points to. A version ID pins a single version. Without a path, the integration does not install or update the app and only appliesstateto an installed app.stringassetoptionalFilename of the bundle that the device installs from a version.
{arch}stands for the architecture of the device. Defaults to<app>-{arch}.rugixb, or to<app>.rugixbif the version has no bundle for the architecture.stringstateoptionalDesired state of the app. Defaults to
running.AppDesiredState
Casesexternally
Running→"running"The app is installed and its workload runs.
Value: "running"Stopped→"stopped"The app is installed but deactivated, so that its workload does not run, also not after a reboot.
Value: "stopped"Removed→"removed"The app is uninstalled, including its persistent data.
Value: "removed"
holdoptionalHold the app at its current version.
booleanwindowoptionalMaintenance window restricting when updates of the app are activated.
OtaUpdateWindow
Fields (JSON object)
rangesrequiredTime ranges in which updates can be activated.
An empty list never allows activation.
array<OtaUpdateWindowRange>
Items
OtaUpdateWindowRange
Fields (JSON object)
daysoptionalDays on which the range starts.
Defaults to every day.
array<Weekday>
Items
Weekday
Casesexternally
Monday→"monday"Value: "monday"Tuesday→"tuesday"Value: "tuesday"Wednesday→"wednesday"Value: "wednesday"Thursday→"thursday"Value: "thursday"Friday→"friday"Value: "friday"Saturday→"saturday"Value: "saturday"Sunday→"sunday"Value: "sunday"
startrequiredStart of the range (inclusive).
TimeOfDay
Wraps
stringendrequiredEnd of the range (exclusive).
An end at or before the start lies on the following day. A range whose end equals its start therefore spans 24 hours.
TimeOfDay
Wraps
string
retryoptionalRetry policy for failed update attempts of the app.
OtaUpdateRetryPolicy
Fields (JSON object)
maxAttempts(frommax_attempts)optionalMaximum number of failed attempts for a version.
Unlimited when absent.
integerinitialDelaySecs(frominitial_delay_secs)optionalDelay before the first retry in seconds.
integermaxDelaySecs(frommax_delay_secs)optionalMaximum delay between attempts in seconds.
integercooldownSecs(fromcooldown_secs)optionalTime in seconds after reaching
max_attemptsbefore the failure count resets and a new round of attempts begins.Without a cooldown, the device stops attempting the version until the version of the configuration changes or the failure count is cleared.
integer
spreadoptionalSpreading of updates of the app across devices.
OtaUpdateSpread
Fields (JSON object)
durationSecs(fromduration_secs)optionalTime over which updates are spread, in seconds.
integerstartAt(fromstart_at)optionalStart of the spread over time.
Defaults to the time at which the tag in the configured path was assigned to its current version. Without an explicit start, updates to versions configured by version ID are not spread over time.
TimestamppercentageoptionalShare of devices that may update, in percent.
Raising the percentage only adds devices. Without
duration_secs, it releases the update to the given share right away. Withduration_secs, it caps the share of the spread over time.number
gcoptionalRemoval of old versions of the app after an update.
AppGcPolicy
Fields (JSON object)
keepoptionalNumber of previously running versions to keep.
Defaults to the integration's default, usually 1.
integer
rolloutoptionalRollout number.
Integrations ignore its value. Changing it changes the app's configuration, which starts a new round of attempts on devices whose attempts failed.
integer
stateoptionalCurrent state of the app's update process.
AppUpdateState
Casesexternally
Idle→"idle"No path is configured.
Value: "idle"Installing→"installing"A new version is being downloaded and installed without interrupting the app.
Value: "installing"Activating→"activating"The app is switching to the installed version.
Value: "activating"Removing→"removing"The app is being uninstalled.
Value: "removing"Completed→"completed"The app has the target version and its desired state, or it has been uninstalled as desired.
Value: "completed"Failed→"failed"The last attempt failed.
Value: "failed"Blocked→"blocked"An update is available but cannot proceed yet. See
blockedfor the reason.Value: "blocked"
blockedoptionalWhy the update is blocked. Present when
stateisblocked.AppUpdateBlocked
Fields (JSON object)
coderequiredMachine-readable reason in kebab case.
Nexigon defines these codes:
hold: The configuration holds the app at its current version.spread: The device waits for its turn in a spread or is outside the released percentage.window: The device waits for its maintenance window. The new version may already be installed.no-asset: The target version has no bundle for the device's architecture or no available asset with the filename inconfig.asset.
stringmessageoptionalHuman-readable explanation.
string
generationoptionalGeneration of the app that runs, or that runs when the app starts.
integer (i64)currentVersionId(fromcurrent_version_id)optionalPackage version of
generation.Absent when the integration did not install the generation.
PackageVersionIdstringtargetVersionId(fromtarget_version_id)optionalPackage version that the configured path resolves to.
PackageVersionIdstringassetoptionalFilename of the bundle selected from the target version.
stringfailureCount(fromfailure_count)optionalNumber of consecutive failed attempts for the target version.
Resets to zero when the target version or the effective configuration of the app changes, when the retry cooldown ends, when an update succeeds, or when another writer clears it.
integerlastError(fromlast_error)optionalError message of the last failure, if any.
stringnextAttemptAt(fromnext_attempt_at)optionalEarliest time of the next attempt.
Set while the app waits for a spread, a maintenance window, a retry delay, or a retry cooldown.
TimestampworkloadoptionalLive status of the app's workload, as reported by the runtime.
AppWorkloadStatus
Casesinternally — tag field
stateRunning→"running"The workload runs.
{ "state": "running" }Unhealthy→"unhealthy"The workload runs but reports a problem.
{ "state": "unhealthy", ...<payload fields> } — or "content" for non-object payloadsAppWorkloadMessage
Fields (JSON object)
messagerequiredHuman-readable explanation.
string
Stopped→"stopped"The workload does not run.
{ "state": "stopped" }Failed→"failed"The workload failed.
{ "state": "failed", ...<payload fields> } — or "content" for non-object payloadsAppWorkloadMessage
Fields (JSON object)
messagerequiredHuman-readable explanation.
string
Unknown→"unknown"The runtime cannot determine the workload's status.
{ "state": "unknown" }
AppRuntime
- Unstable (feature
app_updates)
Runtime that installs and runs apps on a device, such as Rugix Apps.
Fields (JSON object)
namerequiredName of the runtime, such as
rugix.stringversionoptionalVersion of the runtime.
string
AppStatus
- Unstable (feature
app_updates)
Status of an app on a device.
Fields (JSON object)
managedrequiredWhether
dev.nexigon.apps.configlists the app.booleanconfigoptionalEffective configuration of the app, including the policies that apply to it.
ManagedAppConfig
Fields (JSON object)
pathoptionalVersion path in the format
<repository>/<package>/<version>.<version>is a tag or a version ID. A tag tracks the version the tag points to. A version ID pins a single version. Without a path, the integration does not install or update the app and only appliesstateto an installed app.stringassetoptionalFilename of the bundle that the device installs from a version.
{arch}stands for the architecture of the device. Defaults to<app>-{arch}.rugixb, or to<app>.rugixbif the version has no bundle for the architecture.stringstateoptionalDesired state of the app. Defaults to
running.AppDesiredState
Casesexternally
Running→"running"The app is installed and its workload runs.
Value: "running"Stopped→"stopped"The app is installed but deactivated, so that its workload does not run, also not after a reboot.
Value: "stopped"Removed→"removed"The app is uninstalled, including its persistent data.
Value: "removed"
holdoptionalHold the app at its current version.
booleanwindowoptionalMaintenance window restricting when updates of the app are activated.
OtaUpdateWindow
Fields (JSON object)
rangesrequiredTime ranges in which updates can be activated.
An empty list never allows activation.
array<OtaUpdateWindowRange>
Items
OtaUpdateWindowRange
Fields (JSON object)
daysoptionalDays on which the range starts.
Defaults to every day.
array<Weekday>
Items
Weekday
Casesexternally
Monday→"monday"Value: "monday"Tuesday→"tuesday"Value: "tuesday"Wednesday→"wednesday"Value: "wednesday"Thursday→"thursday"Value: "thursday"Friday→"friday"Value: "friday"Saturday→"saturday"Value: "saturday"Sunday→"sunday"Value: "sunday"
startrequiredStart of the range (inclusive).
TimeOfDay
Wraps
stringendrequiredEnd of the range (exclusive).
An end at or before the start lies on the following day. A range whose end equals its start therefore spans 24 hours.
TimeOfDay
Wraps
string
retryoptionalRetry policy for failed update attempts of the app.
OtaUpdateRetryPolicy
Fields (JSON object)
maxAttempts(frommax_attempts)optionalMaximum number of failed attempts for a version.
Unlimited when absent.
integerinitialDelaySecs(frominitial_delay_secs)optionalDelay before the first retry in seconds.
integermaxDelaySecs(frommax_delay_secs)optionalMaximum delay between attempts in seconds.
integercooldownSecs(fromcooldown_secs)optionalTime in seconds after reaching
max_attemptsbefore the failure count resets and a new round of attempts begins.Without a cooldown, the device stops attempting the version until the version of the configuration changes or the failure count is cleared.
integer
spreadoptionalSpreading of updates of the app across devices.
OtaUpdateSpread
Fields (JSON object)
durationSecs(fromduration_secs)optionalTime over which updates are spread, in seconds.
integerstartAt(fromstart_at)optionalStart of the spread over time.
Defaults to the time at which the tag in the configured path was assigned to its current version. Without an explicit start, updates to versions configured by version ID are not spread over time.
TimestamppercentageoptionalShare of devices that may update, in percent.
Raising the percentage only adds devices. Without
duration_secs, it releases the update to the given share right away. Withduration_secs, it caps the share of the spread over time.number
gcoptionalRemoval of old versions of the app after an update.
AppGcPolicy
Fields (JSON object)
keepoptionalNumber of previously running versions to keep.
Defaults to the integration's default, usually 1.
integer
rolloutoptionalRollout number.
Integrations ignore its value. Changing it changes the app's configuration, which starts a new round of attempts on devices whose attempts failed.
integer
stateoptionalCurrent state of the app's update process.
AppUpdateState
Casesexternally
Idle→"idle"No path is configured.
Value: "idle"Installing→"installing"A new version is being downloaded and installed without interrupting the app.
Value: "installing"Activating→"activating"The app is switching to the installed version.
Value: "activating"Removing→"removing"The app is being uninstalled.
Value: "removing"Completed→"completed"The app has the target version and its desired state, or it has been uninstalled as desired.
Value: "completed"Failed→"failed"The last attempt failed.
Value: "failed"Blocked→"blocked"An update is available but cannot proceed yet. See
blockedfor the reason.Value: "blocked"
blockedoptionalWhy the update is blocked. Present when
stateisblocked.AppUpdateBlocked
Fields (JSON object)
coderequiredMachine-readable reason in kebab case.
Nexigon defines these codes:
hold: The configuration holds the app at its current version.spread: The device waits for its turn in a spread or is outside the released percentage.window: The device waits for its maintenance window. The new version may already be installed.no-asset: The target version has no bundle for the device's architecture or no available asset with the filename inconfig.asset.
stringmessageoptionalHuman-readable explanation.
string
generationoptionalGeneration of the app that runs, or that runs when the app starts.
integer (i64)currentVersionId(fromcurrent_version_id)optionalPackage version of
generation.Absent when the integration did not install the generation.
PackageVersionIdstringtargetVersionId(fromtarget_version_id)optionalPackage version that the configured path resolves to.
PackageVersionIdstringassetoptionalFilename of the bundle selected from the target version.
stringfailureCount(fromfailure_count)optionalNumber of consecutive failed attempts for the target version.
Resets to zero when the target version or the effective configuration of the app changes, when the retry cooldown ends, when an update succeeds, or when another writer clears it.
integerlastError(fromlast_error)optionalError message of the last failure, if any.
stringnextAttemptAt(fromnext_attempt_at)optionalEarliest time of the next attempt.
Set while the app waits for a spread, a maintenance window, a retry delay, or a retry cooldown.
TimestampworkloadoptionalLive status of the app's workload, as reported by the runtime.
AppWorkloadStatus
Casesinternally — tag field
stateRunning→"running"The workload runs.
{ "state": "running" }Unhealthy→"unhealthy"The workload runs but reports a problem.
{ "state": "unhealthy", ...<payload fields> } — or "content" for non-object payloadsAppWorkloadMessage
Fields (JSON object)
messagerequiredHuman-readable explanation.
string
Stopped→"stopped"The workload does not run.
{ "state": "stopped" }Failed→"failed"The workload failed.
{ "state": "failed", ...<payload fields> } — or "content" for non-object payloadsAppWorkloadMessage
Fields (JSON object)
messagerequiredHuman-readable explanation.
string
Unknown→"unknown"The runtime cannot determine the workload's status.
{ "state": "unknown" }
AppUpdateCapability
- Unstable (feature
app_updates)
Optional feature of the app update contract.
Casesexternally
Window→"window"The integration honors
window.Value: "window"Retry→"retry"The integration honors
retryand resets the failure count of an app when its configuration changes.Value: "retry"Spread→"spread"The integration honors
spread.Value: "spread"Hold→"hold"The integration honors
hold.Value: "hold"Asset→"asset"The integration honors
asset.Value: "asset"Gc→"gc"The integration honors
gc.Value: "gc"
AppUpdateState
- Unstable (feature
app_updates)
State of an app's update process.
The resting states are idle, completed, failed, and blocked.
Casesexternally
Idle→"idle"No path is configured.
Value: "idle"Installing→"installing"A new version is being downloaded and installed without interrupting the app.
Value: "installing"Activating→"activating"The app is switching to the installed version.
Value: "activating"Removing→"removing"The app is being uninstalled.
Value: "removing"Completed→"completed"The app has the target version and its desired state, or it has been uninstalled as desired.
Value: "completed"Failed→"failed"The last attempt failed.
Value: "failed"Blocked→"blocked"An update is available but cannot proceed yet. See
blockedfor the reason.Value: "blocked"
AppUpdateBlocked
- Unstable (feature
app_updates)
Information about a blocked app update.
Fields (JSON object)
coderequiredMachine-readable reason in kebab case.
Nexigon defines these codes:
hold: The configuration holds the app at its current version.spread: The device waits for its turn in a spread or is outside the released percentage.window: The device waits for its maintenance window. The new version may already be installed.no-asset: The target version has no bundle for the device's architecture or no available asset with the filename inconfig.asset.
stringmessageoptionalHuman-readable explanation.
string
AppWorkloadStatus
- Unstable (feature
app_updates)
Live status of an app's workload.
Casesinternally — tag field state
Running→"running"The workload runs.
{ "state": "running" }Unhealthy→"unhealthy"The workload runs but reports a problem.
{ "state": "unhealthy", ...<payload fields> } — or "content" for non-object payloadsAppWorkloadMessage
Fields (JSON object)
messagerequiredHuman-readable explanation.
string
Stopped→"stopped"The workload does not run.
{ "state": "stopped" }Failed→"failed"The workload failed.
{ "state": "failed", ...<payload fields> } — or "content" for non-object payloadsAppWorkloadMessage
Fields (JSON object)
messagerequiredHuman-readable explanation.
string
Unknown→"unknown"The runtime cannot determine the workload's status.
{ "state": "unknown" }
AppWorkloadMessage
- Unstable (feature
app_updates)
Explanation of an app's workload status.
Fields (JSON object)
messagerequiredHuman-readable explanation.
string