1
0
mirror of https://github.com/containers/bootc.git synced 2026-02-05 15:45:53 +01:00

Release 1.7.0

Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This commit is contained in:
bootc-actions-token[bot]
2025-08-21 18:35:44 +00:00
committed by Chris Kyrouac
parent 0bb24c03d2
commit ae8930b1ad
21 changed files with 206 additions and 239 deletions

2
Cargo.lock generated
View File

@@ -232,7 +232,7 @@ dependencies = [
[[package]]
name = "bootc-lib"
version = "1.6.0"
version = "1.7.0"
dependencies = [
"anstream",
"anstyle",

View File

@@ -15,7 +15,7 @@ platforms = ["*-unknown-linux-gnu"]
[dependencies]
# Internal crates
bootc-lib = { version = "1.6", path = "../lib" }
bootc-lib = { version = "1.7", path = "../lib" }
bootc-utils = { package = "bootc-internal-utils", path = "../utils", version = "0.0.0" }
# Workspace dependencies

View File

@@ -6,7 +6,7 @@ name = "bootc-lib"
repository = "https://github.com/bootc-dev/bootc"
# The intention is we'll follow semver here, even though this
# project isn't actually published as a crate.
version = "1.6.0"
version = "1.7.0"
# In general we try to keep this pinned to what's in the latest RHEL9.
# However right now, we bumped to 1.82 as that's what composefs-rs uses.
rust-version = "1.82.0"

View File

@@ -1,12 +1,8 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Host",
"description": "The core host definition",
"type": "object",
"required": [
"apiVersion",
"kind"
],
"properties": {
"apiVersion": {
"type": "string"
@@ -15,55 +11,43 @@
"type": "string"
},
"metadata": {
"default": {},
"allOf": [
{
"$ref": "#/definitions/ObjectMeta"
}
]
"$ref": "#/$defs/ObjectMeta",
"default": {}
},
"spec": {
"description": "The spec",
"$ref": "#/$defs/HostSpec",
"default": {
"bootOrder": "default",
"image": null
},
"allOf": [
{
"$ref": "#/definitions/HostSpec"
}
]
}
},
"status": {
"description": "The status",
"$ref": "#/$defs/HostStatus",
"default": {
"booted": null,
"rollback": null,
"rollbackQueued": false,
"staged": null,
"type": null
},
"allOf": [
{
"$ref": "#/definitions/HostStatus"
}
]
}
}
},
"definitions": {
"required": [
"apiVersion",
"kind"
],
"$defs": {
"BootEntry": {
"description": "A bootable entry",
"type": "object",
"required": [
"incompatible",
"pinned"
],
"properties": {
"cachedUpdate": {
"description": "The last fetched cached update metadata",
"anyOf": [
{
"$ref": "#/definitions/ImageStatus"
"$ref": "#/$defs/ImageStatus"
},
{
"type": "null"
@@ -74,7 +58,7 @@
"description": "The image reference",
"anyOf": [
{
"$ref": "#/definitions/ImageStatus"
"$ref": "#/$defs/ImageStatus"
},
{
"type": "null"
@@ -89,7 +73,7 @@
"description": "If this boot entry is ostree based, the corresponding state",
"anyOf": [
{
"$ref": "#/definitions/BootEntryOstree"
"$ref": "#/$defs/BootEntryOstree"
},
{
"type": "null"
@@ -100,28 +84,32 @@
"description": "Whether this entry will be subject to garbage collection",
"type": "boolean"
},
"softRebootCapable": {
"description": "This is true if (relative to the booted system) this is a possible target for a soft reboot",
"type": "boolean",
"default": false
},
"store": {
"description": "The container storage backend",
"default": null,
"anyOf": [
{
"$ref": "#/definitions/Store"
"$ref": "#/$defs/Store"
},
{
"type": "null"
}
]
],
"default": null
}
}
},
"required": [
"incompatible",
"pinned"
]
},
"BootEntryOstree": {
"description": "A bootable entry",
"type": "object",
"required": [
"checksum",
"deploySerial",
"stateroot"
],
"properties": {
"checksum": {
"description": "The ostree commit checksum",
@@ -131,13 +119,18 @@
"description": "The deployment serial",
"type": "integer",
"format": "uint32",
"minimum": 0.0
"minimum": 0
},
"stateroot": {
"description": "The name of the storage for /etc and /var content",
"type": "string"
}
}
},
"required": [
"stateroot",
"checksum",
"deploySerial"
]
},
"BootOrder": {
"description": "Configuration for system boot ordering.",
@@ -145,16 +138,12 @@
{
"description": "The staged or booted deployment will be booted next",
"type": "string",
"enum": [
"default"
]
"const": "default"
},
{
"description": "The rollback deployment will be booted next",
"type": "string",
"enum": [
"rollback"
]
"const": "rollback"
}
]
},
@@ -164,18 +153,14 @@
"properties": {
"bootOrder": {
"description": "If set, and there is a rollback deployment, it will be set for the next boot.",
"default": "default",
"allOf": [
{
"$ref": "#/definitions/BootOrder"
}
]
"$ref": "#/$defs/BootOrder",
"default": "default"
},
"image": {
"description": "The host image",
"anyOf": [
{
"$ref": "#/definitions/ImageReference"
"$ref": "#/$defs/ImageReference"
},
{
"type": "null"
@@ -192,7 +177,7 @@
"description": "The booted image; this will be unset if the host is not bootc compatible.",
"anyOf": [
{
"$ref": "#/definitions/BootEntry"
"$ref": "#/$defs/BootEntry"
},
{
"type": "null"
@@ -203,14 +188,14 @@
"description": "Other deployments (i.e. pinned)",
"type": "array",
"items": {
"$ref": "#/definitions/BootEntry"
"$ref": "#/$defs/BootEntry"
}
},
"rollback": {
"description": "The previously booted image",
"anyOf": [
{
"$ref": "#/definitions/BootEntry"
"$ref": "#/$defs/BootEntry"
},
{
"type": "null"
@@ -219,14 +204,14 @@
},
"rollbackQueued": {
"description": "Set to true if the rollback entry is queued for the next boot.",
"default": false,
"type": "boolean"
"type": "boolean",
"default": false
},
"staged": {
"description": "The staged image for the next boot",
"anyOf": [
{
"$ref": "#/definitions/BootEntry"
"$ref": "#/$defs/BootEntry"
},
{
"type": "null"
@@ -237,7 +222,7 @@
"description": "The detected type of system",
"anyOf": [
{
"$ref": "#/definitions/HostType"
"$ref": "#/$defs/HostType"
},
{
"type": "null"
@@ -247,24 +232,18 @@
}
},
"HostType": {
"description": "The detected type of running system. Note that this is not exhaustive and new variants may be added in the future.",
"description": "The detected type of running system. Note that this is not exhaustive\nand new variants may be added in the future.",
"oneOf": [
{
"description": "The current system is deployed in a bootc compatible way.",
"type": "string",
"enum": [
"bootcHost"
]
"const": "bootcHost"
}
]
},
"ImageReference": {
"description": "A container image reference with attached transport and signature verification",
"type": "object",
"required": [
"image",
"transport"
],
"properties": {
"image": {
"description": "The container image reference",
@@ -274,7 +253,7 @@
"description": "Signature verification type",
"anyOf": [
{
"$ref": "#/definitions/ImageSignature"
"$ref": "#/$defs/ImageSignature"
},
{
"type": "null"
@@ -285,7 +264,11 @@
"description": "The container image transport",
"type": "string"
}
}
},
"required": [
"image",
"transport"
]
},
"ImageSignature": {
"description": "An image signature",
@@ -293,40 +276,31 @@
{
"description": "Fetches will use the named ostree remote for signature verification of the ostree commit.",
"type": "object",
"required": [
"ostreeRemote"
],
"properties": {
"ostreeRemote": {
"type": "string"
}
},
"additionalProperties": false
"additionalProperties": false,
"required": [
"ostreeRemote"
]
},
{
"description": "Fetches will defer to the `containers-policy.json`, but we make a best effort to reject `default: insecureAcceptAnything` policy.",
"type": "string",
"enum": [
"containerPolicy"
]
"const": "containerPolicy"
},
{
"description": "No signature verification will be performed",
"type": "string",
"enum": [
"insecure"
]
"const": "insecure"
}
]
},
"ImageStatus": {
"description": "The status of the booted image",
"type": "object",
"required": [
"architecture",
"image",
"imageDigest"
],
"properties": {
"architecture": {
"description": "The hardware architecture of this image",
@@ -334,11 +308,7 @@
},
"image": {
"description": "The currently booted image",
"allOf": [
{
"$ref": "#/definitions/ImageReference"
}
]
"$ref": "#/$defs/ImageReference"
},
"imageDigest": {
"description": "The digest of the fetched image (e.g. sha256:a0...);",
@@ -359,7 +329,12 @@
"null"
]
}
}
},
"required": [
"image",
"imageDigest",
"architecture"
]
},
"ObjectMeta": {
"type": "object",
@@ -402,9 +377,7 @@
{
"description": "Use the ostree-container storage backend.",
"type": "string",
"enum": [
"ostreeContainer"
]
"const": "ostreeContainer"
}
]
}

View File

@@ -19,7 +19,7 @@ part of a build process; it will error if any problems are detected.
# OPTIONS
**\--rootfs**=*ROOTFS* \[default: /\]
**\--rootfs** *\<ROOTFS\>* \[default: /\]
: Operate on the provided rootfs
@@ -34,7 +34,7 @@ part of a build process; it will error if any problems are detected.
reasonably human friendly. However, there is no commitment to
maintaining this exact format; do not parse it via code or scripts
**\--skip**=*SKIP*
**\--skip** *\<SKIP\>*
: Skip checking the targeted lints, by name. Use \`\--list\` to
discover the set of available lints.
@@ -53,4 +53,4 @@ part of a build process; it will error if any problems are detected.
# VERSION
v1.6.0
v1.7.0

View File

@@ -30,4 +30,4 @@ bootc-container-help(8)
# VERSION
v1.6.0
v1.7.0

View File

@@ -22,7 +22,7 @@ Only changes to the \`spec\` section are honored.
# OPTIONS
**-f**, **\--filename**=*FILENAME*
**-f**, **\--filename** *\<FILENAME\>*
: Use filename to edit system specification
@@ -36,4 +36,4 @@ Only changes to the \`spec\` section are honored.
# VERSION
v1.6.0
v1.7.0

View File

@@ -27,4 +27,4 @@ your code is using \`bootc install to-filesystem\` from the start.
# VERSION
v1.6.0
v1.7.0

View File

@@ -24,4 +24,4 @@ to-filesystem\`
# VERSION
v1.6.0
v1.7.0

View File

@@ -27,4 +27,4 @@ string-valued filesystem name suitable for passing to \`mkfs.\$type\`.
# VERSION
v1.6.0
v1.7.0

View File

@@ -32,7 +32,7 @@ more complex such as RAID, LVM, LUKS etc.
: Automatically wipe all existing data on device
**\--block-setup**=*BLOCK_SETUP*
**\--block-setup** *\<BLOCK_SETUP\>*
: Target root block device setup.
@@ -42,21 +42,21 @@ more complex such as RAID, LVM, LUKS etc.
\
\[*possible values: *direct, tpm2-luks\]
**\--filesystem**=*FILESYSTEM*
**\--filesystem** *\<FILESYSTEM\>*
: Target root filesystem type\
\
\[*possible values: *xfs, ext4, btrfs\]
**\--root-size**=*ROOT_SIZE*
**\--root-size** *\<ROOT_SIZE\>*
: Size of the root partition (default specifier: M). Allowed
specifiers: M (mebibytes), G (gibibytes), T (tebibytes).
By default, all remaining space on the disk will be used.
**\--source-imgref**=*SOURCE_IMGREF*
**\--source-imgref** *\<SOURCE_IMGREF\>*
: Install the system from an explicitly given source.
@@ -67,12 +67,12 @@ more complex such as RAID, LVM, LUKS etc.
behaviour explained in the previous paragraph. See skopeo(1) for
accepted formats.
**\--target-transport**=*TARGET_TRANSPORT* \[default: registry\]
**\--target-transport** *\<TARGET_TRANSPORT\>* \[default: registry\]
: The transport; e.g. oci, oci-archive, containers-storage. Defaults
to \`registry\`
**\--target-imgref**=*TARGET_IMGREF*
**\--target-imgref** *\<TARGET_IMGREF\>*
: Specify the image to fetch for subsequent updates
@@ -102,13 +102,13 @@ more complex such as RAID, LVM, LUKS etc.
This is currently necessary to install \*from\* a system with
SELinux disabled but where the target does have SELinux enabled.
**\--karg**=*KARG*
**\--karg** *\<KARG\>*
: Add a kernel argument. This option can be provided multiple times.
Example: \--karg=nosmt \--karg=console=ttyS0,114800n8
**\--root-ssh-authorized-keys**=*ROOT_SSH_AUTHORIZED_KEYS*
**\--root-ssh-authorized-keys** *\<ROOT_SSH_AUTHORIZED_KEYS\>*
: The path to an \`authorized_keys\` that will be injected into the
\`root\` account.
@@ -128,7 +128,7 @@ more complex such as RAID, LVM, LUKS etc.
\- All bootloader types will be installed - Changes to the system
firmware will be skipped
**\--bound-images**=*BOUND_IMAGES* \[default: stored\]
**\--bound-images** *\<BOUND_IMAGES\>* \[default: stored\]
: How should logically bound images be retrieved\
@@ -141,7 +141,7 @@ more complex such as RAID, LVM, LUKS etc.
- pull: Bound images will be pulled and stored directly in the
target\'s bootc container storage
**\--stateroot**=*STATEROOT*
**\--stateroot** *\<STATEROOT\>*
: The stateroot name to use. Defaults to \`default\`
@@ -160,4 +160,4 @@ more complex such as RAID, LVM, LUKS etc.
# VERSION
v1.6.0
v1.7.0

View File

@@ -26,7 +26,7 @@ to be cleaned up if desired when rebooted into the new root.
# OPTIONS
**\--replace**=*REPLACE* \[default: alongside\]
**\--replace** *\<REPLACE\>* \[default: alongside\]
: Configure how existing data is treated\
@@ -42,7 +42,7 @@ to be cleaned up if desired when rebooted into the new root.
However, the running system (and all files) will remain in place
until reboot
**\--source-imgref**=*SOURCE_IMGREF*
**\--source-imgref** *\<SOURCE_IMGREF\>*
: Install the system from an explicitly given source.
@@ -53,12 +53,12 @@ to be cleaned up if desired when rebooted into the new root.
behaviour explained in the previous paragraph. See skopeo(1) for
accepted formats.
**\--target-transport**=*TARGET_TRANSPORT* \[default: registry\]
**\--target-transport** *\<TARGET_TRANSPORT\>* \[default: registry\]
: The transport; e.g. oci, oci-archive, containers-storage. Defaults
to \`registry\`
**\--target-imgref**=*TARGET_IMGREF*
**\--target-imgref** *\<TARGET_IMGREF\>*
: Specify the image to fetch for subsequent updates
@@ -88,13 +88,13 @@ to be cleaned up if desired when rebooted into the new root.
This is currently necessary to install \*from\* a system with
SELinux disabled but where the target does have SELinux enabled.
**\--karg**=*KARG*
**\--karg** *\<KARG\>*
: Add a kernel argument. This option can be provided multiple times.
Example: \--karg=nosmt \--karg=console=ttyS0,114800n8
**\--root-ssh-authorized-keys**=*ROOT_SSH_AUTHORIZED_KEYS*
**\--root-ssh-authorized-keys** *\<ROOT_SSH_AUTHORIZED_KEYS\>*
: The path to an \`authorized_keys\` that will be injected into the
\`root\` account.
@@ -114,7 +114,7 @@ to be cleaned up if desired when rebooted into the new root.
\- All bootloader types will be installed - Changes to the system
firmware will be skipped
**\--bound-images**=*BOUND_IMAGES* \[default: stored\]
**\--bound-images** *\<BOUND_IMAGES\>* \[default: stored\]
: How should logically bound images be retrieved\
@@ -127,7 +127,7 @@ to be cleaned up if desired when rebooted into the new root.
- pull: Bound images will be pulled and stored directly in the
target\'s bootc container storage
**\--stateroot**=*STATEROOT*
**\--stateroot** *\<STATEROOT\>*
: The stateroot name to use. Defaults to \`default\`
@@ -152,4 +152,4 @@ to be cleaned up if desired when rebooted into the new root.
# VERSION
v1.6.0
v1.7.0

View File

@@ -27,21 +27,21 @@ is currently expected to be empty by default.
# OPTIONS
**\--root-mount-spec**=*ROOT_MOUNT_SPEC*
**\--root-mount-spec** *\<ROOT_MOUNT_SPEC\>*
: Source device specification for the root filesystem. For example,
UUID=2e9f4241-229b-4202-8429-62d2302382e1
If not provided, the UUID of the target filesystem will be used.
**\--boot-mount-spec**=*BOOT_MOUNT_SPEC*
**\--boot-mount-spec** *\<BOOT_MOUNT_SPEC\>*
: Mount specification for the /boot filesystem.
This is optional. If \`/boot\` is detected as a mounted partition,
then its UUID will be used.
**\--replace**=*REPLACE*
**\--replace** *\<REPLACE\>*
: Initialize the system in-place; at the moment, only one mode for
this is implemented. In the future, it may also be supported to set
@@ -71,7 +71,7 @@ is currently expected to be empty by default.
readonly. This option skips those operations. It is then the
responsibility of the invoking code to perform those operations
**\--source-imgref**=*SOURCE_IMGREF*
**\--source-imgref** *\<SOURCE_IMGREF\>*
: Install the system from an explicitly given source.
@@ -82,12 +82,12 @@ is currently expected to be empty by default.
behaviour explained in the previous paragraph. See skopeo(1) for
accepted formats.
**\--target-transport**=*TARGET_TRANSPORT* \[default: registry\]
**\--target-transport** *\<TARGET_TRANSPORT\>* \[default: registry\]
: The transport; e.g. oci, oci-archive, containers-storage. Defaults
to \`registry\`
**\--target-imgref**=*TARGET_IMGREF*
**\--target-imgref** *\<TARGET_IMGREF\>*
: Specify the image to fetch for subsequent updates
@@ -117,13 +117,13 @@ is currently expected to be empty by default.
This is currently necessary to install \*from\* a system with
SELinux disabled but where the target does have SELinux enabled.
**\--karg**=*KARG*
**\--karg** *\<KARG\>*
: Add a kernel argument. This option can be provided multiple times.
Example: \--karg=nosmt \--karg=console=ttyS0,114800n8
**\--root-ssh-authorized-keys**=*ROOT_SSH_AUTHORIZED_KEYS*
**\--root-ssh-authorized-keys** *\<ROOT_SSH_AUTHORIZED_KEYS\>*
: The path to an \`authorized_keys\` that will be injected into the
\`root\` account.
@@ -143,7 +143,7 @@ is currently expected to be empty by default.
\- All bootloader types will be installed - Changes to the system
firmware will be skipped
**\--bound-images**=*BOUND_IMAGES* \[default: stored\]
**\--bound-images** *\<BOUND_IMAGES\>* \[default: stored\]
: How should logically bound images be retrieved\
@@ -156,7 +156,7 @@ is currently expected to be empty by default.
- pull: Bound images will be pulled and stored directly in the
target\'s bootc container storage
**\--stateroot**=*STATEROOT*
**\--stateroot** *\<STATEROOT\>*
: The stateroot name to use. Defaults to \`default\`
@@ -173,4 +173,4 @@ is currently expected to be empty by default.
# VERSION
v1.6.0
v1.7.0

View File

@@ -71,4 +71,4 @@ bootc-install-help(8)
# VERSION
v1.6.0
v1.7.0

View File

@@ -45,7 +45,7 @@ rollback invocation.
Note on Rollbacks and the \`/etc\` Directory:
When you perform a rollback (e.g., with \`bootc rollback\`), any changes
made to files in the \`/etc\` directory won't carry over to the
made to files in the \`/etc\` directory won\'t carry over to the
rolled-back deployment. The \`/etc\` files will revert to their state
from that previous deployment instead.
@@ -55,4 +55,4 @@ happen when new deployments are created.
# VERSION
v1.6.0
v1.7.0

View File

@@ -29,7 +29,7 @@ not \`null\`.
# OPTIONS
**\--format**=*FORMAT*
**\--format** *\<FORMAT\>*
: The output format\
@@ -42,7 +42,7 @@ not \`null\`.
- json: Output in JSON format
**\--format-version**=*FORMAT_VERSION*
**\--format-version** *\<FORMAT_VERSION\>*
: The desired format version. There is currently one supported
version, which is exposed as both \`0\` and \`1\`. Pass this option
@@ -63,4 +63,4 @@ not \`null\`.
# VERSION
v1.6.0
v1.7.0

View File

@@ -38,7 +38,7 @@ updates via container image tags; for example,
will detect the case where no kernel changes are queued, and perform
a userspace-only restart.
**\--transport**=*TRANSPORT* \[default: registry\]
**\--transport** *\<TRANSPORT\>* \[default: registry\]
: The transport; e.g. oci, oci-archive, containers-storage. Defaults
to \`registry\`
@@ -65,4 +65,4 @@ updates via container image tags; for example,
# VERSION
v1.6.0
v1.7.0

View File

@@ -53,4 +53,4 @@ the update in addition.
# VERSION
v1.6.0
v1.7.0

View File

@@ -39,4 +39,4 @@ unmount\".
# VERSION
v1.6.0
v1.7.0

View File

@@ -72,4 +72,4 @@ bootc-help(8)
# VERSION
v1.6.0
v1.7.0

View File

@@ -1,239 +1,233 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Event",
"description": "An event emitted as JSON.",
"oneOf": [
{
"type": "object",
"required": [
"type",
"version"
],
"properties": {
"type": {
"type": "string",
"enum": [
"Start"
]
"const": "Start"
},
"version": {
"description": "The semantic version of the progress protocol.",
"type": "string"
}
}
},
"required": [
"type",
"version"
]
},
{
"description": "An incremental update to a container image layer download",
"type": "object",
"required": [
"bytes",
"bytes_cached",
"bytes_total",
"description",
"id",
"steps",
"steps_cached",
"steps_total",
"subtasks",
"task",
"type"
],
"properties": {
"bytes": {
"description": "The number of bytes already fetched.",
"type": "integer",
"format": "uint64",
"minimum": 0.0
"minimum": 0
},
"bytes_cached": {
"bytesCached": {
"description": "The number of bytes fetched by a previous run.",
"type": "integer",
"format": "uint64",
"minimum": 0.0
"minimum": 0
},
"bytes_total": {
"bytesTotal": {
"description": "Total number of bytes. If zero, then this should be considered \"unspecified\".",
"type": "integer",
"format": "uint64",
"minimum": 0.0
"minimum": 0
},
"description": {
"description": "A human readable description of the task if i18n is not available.",
"type": "string"
},
"id": {
"description": "A human and machine readable unique identifier for the task (e.g., the image name). For tasks that only happen once, it can be set to the same value as task.",
"description": "A human and machine readable unique identifier for the task\n(e.g., the image name). For tasks that only happen once,\nit can be set to the same value as task.",
"type": "string"
},
"steps": {
"description": "The initial position of progress.",
"type": "integer",
"format": "uint64",
"minimum": 0.0
"minimum": 0
},
"steps_cached": {
"stepsCached": {
"description": "The number of steps fetched by a previous run.",
"type": "integer",
"format": "uint64",
"minimum": 0.0
"minimum": 0
},
"steps_total": {
"stepsTotal": {
"description": "The total number of steps (e.g. container image layers, RPMs)",
"type": "integer",
"format": "uint64",
"minimum": 0.0
"minimum": 0
},
"subtasks": {
"description": "The currently running subtasks.",
"type": "array",
"items": {
"$ref": "#/definitions/SubTaskBytes"
"$ref": "#/$defs/SubTaskBytes"
}
},
"task": {
"description": "A machine readable type (e.g., pulling) for the task (used for i18n and UI customization).",
"description": "A machine readable type (e.g., pulling) for the task (used for i18n\nand UI customization).",
"type": "string"
},
"type": {
"type": "string",
"enum": [
"ProgressBytes"
]
"const": "ProgressBytes"
}
}
},
"required": [
"type",
"task",
"description",
"id",
"bytesCached",
"bytes",
"bytesTotal",
"stepsCached",
"steps",
"stepsTotal",
"subtasks"
]
},
{
"description": "An incremental update with discrete steps",
"type": "object",
"required": [
"description",
"id",
"steps",
"steps_cached",
"steps_total",
"subtasks",
"task",
"type"
],
"properties": {
"description": {
"description": "A human readable description of the task if i18n is not available.",
"type": "string"
},
"id": {
"description": "A human and machine readable unique identifier for the task (e.g., the image name). For tasks that only happen once, it can be set to the same value as task.",
"description": "A human and machine readable unique identifier for the task\n(e.g., the image name). For tasks that only happen once,\nit can be set to the same value as task.",
"type": "string"
},
"steps": {
"description": "The initial position of progress.",
"type": "integer",
"format": "uint64",
"minimum": 0.0
"minimum": 0
},
"steps_cached": {
"stepsCached": {
"description": "The number of steps fetched by a previous run.",
"type": "integer",
"format": "uint64",
"minimum": 0.0
"minimum": 0
},
"steps_total": {
"stepsTotal": {
"description": "The total number of steps (e.g. container image layers, RPMs)",
"type": "integer",
"format": "uint64",
"minimum": 0.0
"minimum": 0
},
"subtasks": {
"description": "The currently running subtasks.",
"type": "array",
"items": {
"$ref": "#/definitions/SubTaskStep"
"$ref": "#/$defs/SubTaskStep"
}
},
"task": {
"description": "A machine readable type (e.g., pulling) for the task (used for i18n and UI customization).",
"description": "A machine readable type (e.g., pulling) for the task (used for i18n\nand UI customization).",
"type": "string"
},
"type": {
"type": "string",
"enum": [
"ProgressSteps"
]
"const": "ProgressSteps"
}
}
}
],
"definitions": {
"SubTaskBytes": {
"description": "An incremental update to e.g. a container image layer download. The first time a given \"subtask\" name is seen, a new progress bar should be created. If bytes == bytes_total, then the subtask is considered complete.",
"type": "object",
},
"required": [
"bytes",
"bytesCached",
"bytesTotal",
"type",
"task",
"description",
"id",
"subtask"
],
"stepsCached",
"steps",
"stepsTotal",
"subtasks"
]
}
],
"$defs": {
"SubTaskBytes": {
"description": "An incremental update to e.g. a container image layer download.\nThe first time a given \"subtask\" name is seen, a new progress bar should be created.\nIf bytes == bytes_total, then the subtask is considered complete.",
"type": "object",
"properties": {
"bytes": {
"description": "Updated byte level progress",
"type": "integer",
"format": "uint64",
"minimum": 0.0
"minimum": 0
},
"bytesCached": {
"description": "The number of bytes fetched by a previous run (e.g., zstd_chunked).",
"type": "integer",
"format": "uint64",
"minimum": 0.0
"minimum": 0
},
"bytesTotal": {
"description": "Total number of bytes",
"type": "integer",
"format": "uint64",
"minimum": 0.0
"minimum": 0
},
"description": {
"description": "A human readable description of the task if i18n is not available. (e.g., \"OSTree Chunk:\", \"Derived Layer:\")",
"description": "A human readable description of the task if i18n is not available.\n(e.g., \"OSTree Chunk:\", \"Derived Layer:\")",
"type": "string"
},
"id": {
"description": "A human and machine readable identifier for the task (e.g., ostree chunk/layer hash).",
"description": "A human and machine readable identifier for the task\n(e.g., ostree chunk/layer hash).",
"type": "string"
},
"subtask": {
"description": "A machine readable type for the task (used for i18n). (e.g., \"ostree_chunk\", \"ostree_derived\")",
"description": "A machine readable type for the task (used for i18n).\n(e.g., \"ostree_chunk\", \"ostree_derived\")",
"type": "string"
}
}
},
"required": [
"subtask",
"description",
"id",
"bytesCached",
"bytes",
"bytesTotal"
]
},
"SubTaskStep": {
"description": "Marks the beginning and end of a dictrete step",
"type": "object",
"required": [
"completed",
"description",
"id",
"subtask"
],
"properties": {
"completed": {
"description": "Starts as false when beginning to execute and turns true when completed.",
"type": "boolean"
},
"description": {
"description": "A human readable description of the task if i18n is not available. (e.g., \"OSTree Chunk:\", \"Derived Layer:\")",
"description": "A human readable description of the task if i18n is not available.\n(e.g., \"OSTree Chunk:\", \"Derived Layer:\")",
"type": "string"
},
"id": {
"description": "A human and machine readable identifier for the task (e.g., ostree chunk/layer hash).",
"description": "A human and machine readable identifier for the task\n(e.g., ostree chunk/layer hash).",
"type": "string"
},
"subtask": {
"description": "A machine readable type for the task (used for i18n). (e.g., \"ostree_chunk\", \"ostree_derived\")",
"description": "A machine readable type for the task (used for i18n).\n(e.g., \"ostree_chunk\", \"ostree_derived\")",
"type": "string"
}
}
},
"required": [
"subtask",
"description",
"id",
"completed"
]
}
}
}