diff --git a/products.d/tumbleweed.yaml b/products.d/tumbleweed.yaml
index 6c5f0426a2..590008e631 100644
--- a/products.d/tumbleweed.yaml
+++ b/products.d/tumbleweed.yaml
@@ -154,10 +154,12 @@ storage:
- mount_path: "swap"
filesystem: swap
size:
- auto: false
- min: 1 GiB
- max: 2 GiB
+ auto: true
outline:
+ auto_size:
+ base_min: 1 GiB
+ base_max: 2 GiB
+ adjust_by_ram: true
required: false
filesystems:
- swap
diff --git a/service/lib/agama/dbus/storage/volume_conversion/to_dbus.rb b/service/lib/agama/dbus/storage/volume_conversion/to_dbus.rb
index dd03df6dd8..3f586f7d2e 100644
--- a/service/lib/agama/dbus/storage/volume_conversion/to_dbus.rb
+++ b/service/lib/agama/dbus/storage/volume_conversion/to_dbus.rb
@@ -70,6 +70,7 @@ def outline_conversion(target)
"Required" => outline.required?,
"FsTypes" => outline.filesystems.map(&:to_human_string),
"SupportAutoSize" => outline.adaptive_sizes?,
+ "AdjustByRam" => outline.adjust_by_ram?,
"SnapshotsConfigurable" => outline.snapshots_configurable?,
"SnapshotsAffectSizes" => outline.snapshots_affect_sizes?,
"SizeRelevantVolumes" => outline.size_relevant_volumes
diff --git a/web/src/client/storage.js b/web/src/client/storage.js
index 66a92956bf..488862d9a1 100644
--- a/web/src/client/storage.js
+++ b/web/src/client/storage.js
@@ -300,6 +300,7 @@ class ProposalManager {
* @property {boolean} required
* @property {string[]} fsTypes
* @property {boolean} supportAutoSize
+ * @property {boolean} adjustByRam
* @property {boolean} snapshotsConfigurable
* @property {boolean} snapshotsAffectSizes
* @property {string[]} sizeRelevantVolumes
@@ -543,6 +544,7 @@ class ProposalManager {
required: dbusOutline.Required.v,
fsTypes: dbusOutline.FsTypes.v.map(val => val.v),
supportAutoSize: dbusOutline.SupportAutoSize.v,
+ adjustByRam: dbusOutline.AdjustByRam.v,
snapshotsConfigurable: dbusOutline.SnapshotsConfigurable.v,
snapshotsAffectSizes: dbusOutline.SnapshotsAffectSizes.v,
sizeRelevantVolumes: dbusOutline.SizeRelevantVolumes.v.map(val => val.v)
diff --git a/web/src/components/storage/ProposalVolumes.jsx b/web/src/components/storage/ProposalVolumes.jsx
index be080ece93..4015589800 100644
--- a/web/src/components/storage/ProposalVolumes.jsx
+++ b/web/src/components/storage/ProposalVolumes.jsx
@@ -46,10 +46,10 @@ import { noop } from "~/utils";
* @returns {(ReactComponent|null)} component to display (can be `null`)
*/
const AutoCalculatedHint = (volume) => {
- // no hint, the size is not affected by snapshots or other volumes
- const { snapshotsAffectSizes = false, sizeRelevantVolumes = [] } = volume.outline;
+ const { snapshotsAffectSizes = false, sizeRelevantVolumes = [], adjustByRam } = volume.outline;
- if (!snapshotsAffectSizes && sizeRelevantVolumes.length === 0) {
+ // no hint, the size is not affected by known criteria
+ if (!snapshotsAffectSizes && !adjustByRam && sizeRelevantVolumes.length === 0) {
return null;
}
@@ -65,6 +65,8 @@ const AutoCalculatedHint = (volume) => {
// TRANSLATORS: list item, this affects the computed partition size limits
// %s is replaced by a list of the volumes (like "/home, /boot")
{sprintf(_("Presence of other volumes (%s)"), sizeRelevantVolumes.join(", "))}}
+ {adjustByRam &&
+ {_("The amount of RAM in the system")}}
>
);
diff --git a/web/src/components/storage/VolumeForm.jsx b/web/src/components/storage/VolumeForm.jsx
index b93f3bae11..b106d9925d 100644
--- a/web/src/components/storage/VolumeForm.jsx
+++ b/web/src/components/storage/VolumeForm.jsx
@@ -310,6 +310,10 @@ const SizeAuto = ({ volume }) => {
// TRANSLATORS: conjunction for merging two list items
volume.outline.sizeRelevantVolumes.join(_(", "))));
+ if (volume.outline.adjustByRam)
+ // TRANSLATORS: item which affects the final computed partition size
+ conditions.push(_("the amount of RAM in the system"));
+
// TRANSLATORS: the %s is replaced by the items which affect the computed size
const conditionsText = sprintf(_("The final size depends on %s."),
// TRANSLATORS: conjunction for merging two texts