zededa:eve-app-volumes
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| zededa:eve-app-volumes [2026/07/06 14:22] – mc | zededa:eve-app-volumes [2026/07/06 18:53] (current) – mc | ||
|---|---|---|---|
| Line 5: | Line 5: | ||
| This page stays at the **controller/ | This page stays at the **controller/ | ||
| - | Sources: [[https:// | + | Sources: [[https:// |
| ===== 1. What a volume is ===== | ===== 1. What a volume is ===== | ||
| - | A **volume | + | A **volume/drive** is a storage object |
| * The app's rootfs / OS disk (built from a Content Tree / image) — drive type **HDD** | * The app's rootfs / OS disk (built from a Content Tree / image) — drive type **HDD** | ||
| * A blank data disk for app data — drive type **HDD_EMPTY** | * A blank data disk for app data — drive type **HDD_EMPTY** | ||
| - | * A shared/ | + | * A shared/ |
| A volume can be: | A volume can be: | ||
| - | * **Implicit** — created automatically as part of an app instance' | + | * **Implicit** — an entry in the '' |
| - | * **Explicit** — created ahead of time as its own standalone | + | * **Explicit** — a standalone |
| - | ==== Standalone Volume Instance | + | **Important layering note:** everything on this page — '' |
| - | When adding a standalone Volume Instance via the GUI, **Type** is one of: | + | ===== 2. Key fields ===== |
| - | * **Content Tree** — image-backed. An **Image** field appears | + | ==== Standalone Volume Instance |
| - | * **Block Storage** — blank. No Image field. Instead a **Max Storage Size** field appears (value + unit, e.g. Bytes). This is the standalone-object equivalent of '' | + | |
| - | Both types also require: | + | Created independently of any app, targets an edge node or cluster directly. |
| - | * **Access Mode**: '' | + | ^ GUI field ^ TF field ^ Notes ^ |
| - | * **Edge Node**: the target | + | | Type | '' |
| - | * Optional: **Label**, **Encrypted** | + | | Access Mode | '' |
| + | | Max Storage Size | '' | ||
| + | | Edge Node | '' | ||
| + | | (cluster | ||
| + | | Encrypted | '' | ||
| + | | Label | '' | ||
| - | **Important layering note:** everything on this page — '' | + | ==== App-attached image/drive ('' |
| - | ===== 2. Key fields (controller/ | + | This is the actual, confirmed schema — nested inside '' |
| - | ^ Field ^ Where it shows up ^ What it does ^ | + | ^ Field ^ Notes ^ |
| - | | Drive Type ('' | + | | '' |
| - | | Max Size ('' | + | | '' |
| - | | Preserve ('' | + | | '' |
| - | | Allow Storage Resize | + | | '' |
| - | | Volume Label ('' | + | | '' |
| - | | Mount Path ('' | + | | '' |
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | ==== App-level version field ==== | ||
| + | |||
| + | * '' | ||
| ===== 3. What's required to configure — GUI vs Terraform ===== | ===== 3. What's required to configure — GUI vs Terraform ===== | ||
| Line 51: | Line 63: | ||
| * Standalone volume instances: **Library > Volume Instances > +** (Add Volume Instance). Set Type (Content Tree or Block Storage), Access Mode, target Edge Node, and either Image (Content Tree) or Max Storage Size (Block Storage). | * Standalone volume instances: **Library > Volume Instances > +** (Add Volume Instance). Set Type (Content Tree or Block Storage), Access Mode, target Edge Node, and either Image (Content Tree) or Max Storage Size (Block Storage). | ||
| * Implicit volumes are created inline while adding a drive to an app instance instead — no separate object. | * Implicit volumes are created inline while adding a drive to an app instance instead — no separate object. | ||
| - | * On the app instance's **Drives pane**, define per drive: Drive Type, Image, Mount Path, Max Size, Preserve, Encrypted, and (for explicit volumes) Volume Label. | + | * On the app's **Drives pane** |
| - | * Editing Drives on an **existing** app instance triggers a **Purge & Update** — the app purges and comes back online. Data on that drive is wiped unless Preserve was set. | + | * Editing Drives on an **existing** app instance triggers a **Purge & Update** |
| ==== Terraform (zededa/ | ==== Terraform (zededa/ | ||
| - | * Resource: '' | + | * Standalone volume: '' |
| - | * Drive block fields: '' | + | * App + attached volume: '' |
| - | * App-instance-level field: | + | * To attach a standalone volume instance to an app, reference its '' |
| - | * Standalone volume instances can also be managed as their own resource/ | + | * Bump '' |
| ==== ZCLI ==== | ==== ZCLI ==== | ||
| Line 65: | Line 77: | ||
| * Explicit volume: '' | * Explicit volume: '' | ||
| * Update: '' | * Update: '' | ||
| - | * App-instance-level resize permission is passed the same way as the GUI/TF flag, camelCase in JSON: ''" | ||
| - | ===== 4. Step-by-step: | + | ===== 4. Step-by-step: |
| - | This is the common case: a single image-backed drive that serves as both the app's rootfs and its data storage, sized larger than the image itself so there's room to grow later. | + | This is the real, confirmed pattern: a standalone |
| - | + | ||
| - | ==== Via GUI ==== | + | |
| - | + | ||
| - | - Go to **Edge Applications > Marketplace**, select or create the edge app. | + | |
| - | - Deploy the app: **Edge Applications > Deploy**, pick the target edge node. | + | |
| - | - On the **Drives pane**, add the drive: | + | |
| - | - Drive Type: **HDD** | + | |
| - | - Image: select the app' | + | |
| - | - Mount Path: '' | + | |
| - | - Max Size: set this **above** the image' | + | |
| - | - Preserve: enable if this disk's contents should survive a future purge | + | |
| - | - Complete networking/ | + | |
| - | - Confirm in **Edge Node > App Instances** that the instance reaches '' | + | |
| ==== Via Terraform ==== | ==== Via Terraform ==== | ||
| <code hcl> | <code hcl> | ||
| - | resource "zedcloud_application_instance" "example" { | + | # 1. Standalone persistent volume, targeting a specific edge node |
| - | | + | resource "zedcloud_volume_instance" "tf_demo_vol1_cont_persist" { |
| - | | + | |
| - | | + | accessmode |
| - | | + | cleartext |
| + | label = " | ||
| + | | ||
| + | | ||
| + | | ||
| + | type = " | ||
| - | | + | |
| - | | + | |
| - | imagename | + | |
| - | mountpath | + | |
| - | maxsize | + | |
| - | preserve | + | |
| } | } | ||
| + | } | ||
| - | | + | # 2. App that attaches the volume above as its second drive |
| + | resource " | ||
| + | name = " | ||
| + | title = " | ||
| + | networks = 1 | ||
| + | manifest { | ||
| + | ac_kind | ||
| + | ac_version = " | ||
| + | name = " | ||
| + | owner { | ||
| + | user = " | ||
| + | company = " | ||
| + | website = " | ||
| + | email | ||
| + | } | ||
| + | desc { | ||
| + | app_category = " | ||
| + | category | ||
| + | logo = { | ||
| + | url = " | ||
| + | } | ||
| + | } | ||
| + | images { | ||
| + | # first drive: the app's own container image | ||
| + | imagename | ||
| + | cleartext | ||
| + | ignorepurge | ||
| + | imageformat = " | ||
| + | } | ||
| + | images { | ||
| + | # second drive: attach the standalone persistent volume from above | ||
| + | volumelabel = zedcloud_volume_instance.tf_demo_vol1_cont_persist.label | ||
| + | imageformat = " | ||
| + | mountpath | ||
| + | cleartext | ||
| + | drvtype | ||
| + | ignorepurge = true | ||
| + | preserve | ||
| + | maxsize | ||
| + | target | ||
| + | } | ||
| + | interfaces { | ||
| + | name = " | ||
| + | type = " | ||
| + | directattach = false | ||
| + | privateip | ||
| + | acls { | ||
| + | matches { | ||
| + | type = " | ||
| + | value = " | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | vmmode | ||
| + | enablevnc = true | ||
| + | resources { | ||
| + | name = " | ||
| + | value = " | ||
| + | } | ||
| + | resources { | ||
| + | name = " | ||
| + | value = 2 | ||
| + | } | ||
| + | resources { | ||
| + | name = " | ||
| + | value = 2097152 | ||
| + | } | ||
| + | configuration { | ||
| + | custom_config { | ||
| + | add = true | ||
| + | name = " | ||
| + | override = true | ||
| + | template = "" | ||
| + | } | ||
| + | } | ||
| + | app_type | ||
| + | deployment_type | ||
| + | cpu_pinning_enabled = false | ||
| + | } | ||
| + | user_defined_version = " | ||
| + | origin_type | ||
| + | project_access_list | ||
| } | } | ||
| </ | </ | ||
| - '' | - '' | ||
| - | - Verify state: | + | - Confirm in the GUI that the app instance reaches |
| - | ===== 5. Step-by-step: | + | ===== 5. Step-by-step: |
| - | **Important: | + | **Important: |
| - | + | ||
| - | ==== Via GUI ==== | + | |
| - | + | ||
| - | - Confirm the drive you're growing has **Preserve** set (if you need to keep its data). | + | |
| - | - Go to **Edge Applications > App Instances**, | + | |
| - | - If not already enabled, enable **Allow Storage Resize** at the app instance level. | + | |
| - | - On the Drives pane, raise the **Max Size** field for the HDD drive. | + | |
| - | - Save. The GUI will show a **Purge and update** notification — confirm it. | + | |
| - | - Wait for the app instance to purge and come back '' | + | |
| - | - Log into the guest and grow the filesystem to use the new space (EVE resizes the backing volume, not the guest' | + | |
| ==== Via Terraform ==== | ==== Via Terraform ==== | ||
| + | |||
| + | - Raise '' | ||
| + | - **Bump '' | ||
| + | - '' | ||
| + | - Confirm the app redeploys and the drive reflects the new size. | ||
| <code hcl> | <code hcl> | ||
| - | resource " | + | images |
| - | | + | |
| - | + | | |
| - | | + | |
| - | drvtype | + | |
| - | | + | drvtype |
| - | | + | |
| - | maxsize | + | preserve |
| - | preserve | + | |
| - | | + | |
| - | + | ||
| - | allow_storage_resize | + | |
| } | } | ||
| + | # ... | ||
| + | user_defined_version = " | ||
| </ | </ | ||
| - | - '' | + | If the volume is instead a standalone |
| - | - Confirm | + | |
| - | ==== Guest-side step (both paths) | + | ==== Guest-side step ==== |
| - | Raising | + | Mounting the volume at '' |
| + | * **Raw/ | ||
| + | * **Existing filesystem, size increased via '' | ||
| + | |||
| + | Reference commands if a manual resize turns out to be needed: | ||
| * Linux ext4: '' | * Linux ext4: '' | ||
| * Linux xfs: '' | * Linux xfs: '' | ||
| * Windows: Disk Management > right-click volume > Extend Volume | * Windows: Disk Management > right-click volume > Extend Volume | ||
| - | ===== 6. Other use case: HDD_EMPTY (blank data disk) ===== | + | ===== 6. Other use case: HDD_EMPTY (blank data disk, no attached content) ===== |
| - | **HDD_EMPTY** is a second, complementary pattern rather than an alternative to the above: | + | **HDD_EMPTY** is the drive-type equivalent of a standalone '' |
| - | + | ||
| - | * No image, no content tree, no hash to verify — the app-instance config just declares | + | |
| - | * Arrives to the guest as a raw, unformatted block device. The guest OS (or first-boot cloud-init) has to partition and format it itself. | + | |
| - | * Typically mounted at a data path (e.g. ''/ | + | |
| - | * Same '' | + | |
| - | + | ||
| - | <code hcl> | + | |
| - | drives { | + | |
| - | drvtype | + | |
| - | maxsize | + | |
| - | preserve | + | |
| - | mountpath | + | |
| - | } | + | |
| - | </ | + | |
| - | Use this when you want the OS/app image to stay a fixed, replaceable artifact | + | * No '' |
| + | * Arrives | ||
| + | * Use this over a standalone volume instance when the data disk is specific | ||
| ===== 7. Open questions / to verify before relying on this in production ===== | ===== 7. Open questions / to verify before relying on this in production ===== | ||
| - | * Exact ordering requirement | + | * Exact semantic split between '' |
| + | * Whether '' | ||
| + | * Full set of valid values for '' | ||
| + | * Full set of valid '' | ||
| * Whether any current EVE-OS version auto-grows the guest filesystem on boot after a resize (e.g., via cloud-init growpart module) — not confirmed; assume manual step is required unless verified for your specific image. | * Whether any current EVE-OS version auto-grows the guest filesystem on boot after a resize (e.g., via cloud-init growpart module) — not confirmed; assume manual step is required unless verified for your specific image. | ||
| - | * How '' | + | * How '' |
| - | * This page is entirely about **app instance drives**. It does not cover the underlying ''/ | + | * This page is entirely about **app-attached volumes**. It does not cover the underlying ''/ |
zededa/eve-app-volumes.1783347760.txt.gz · Last modified: by mc
