Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

initial global btrfs option #1039

Merged
merged 13 commits into from
Feb 28, 2024
Merged

initial global btrfs option #1039

merged 13 commits into from
Feb 28, 2024

Conversation

jreidinger
Copy link
Contributor

@jreidinger jreidinger commented Feb 14, 2024

Problem

Follow up of:

Right now Btrfs snapshots are shown in the UI as an special kind of filesystem type for the root volume in the table of file-systems.

But later we realized is something more relevant because it affects what you can do regarding booting (no separate /boot partition, for example), the volume sizes or the approach to btrfs subvolumes.

Solution

Make btrfs with snapshots as global option that modify how root volume looks like.

Testing

  • Added a new unit test
  • Tested manually

Screenshots

How it looks for product that require btrfs with snapshots

btrfs-required

Edit form for root when btrfs is not with snapshots
btrfs-multi

Edit form for root when btrfs is with snapshots
btrfs-only

Global option for btrfs with snapshots
btrfs_with_snapshot

@jreidinger jreidinger marked this pull request as draft February 14, 2024 21:34
@jreidinger
Copy link
Contributor Author

First screenshot. I plan to improve locations. But open questions are:

  1. should btrfs stay with that "with snapshot" type? or global option kills it?
  2. is wording good enough?

btrfs_with_snapshot

@coveralls
Copy link

coveralls commented Feb 14, 2024

Coverage Status

coverage: 74.129% (-0.2%) from 74.279%
when pulling 6d9e302 on global_snapshots
into 76c930c on master.

@ancorgs
Copy link
Contributor

ancorgs commented Feb 15, 2024

1. should btrfs stay with that "with snapshot" type? or global option kills it?

1a. If you refer to the table, don't put too much work on it, we need to rework it anyway.
1b. If you refer to the form to edit the entry, then "btrfs with snapshots" should be the only option (ie. not even editable) if snapshots are chosen above and should not be an option otherwise.

2. is wording good enough?

  1. IMHO, the second sentence in the screenshots is the useful part. I would get rid of the first sentence. So final result could be something like this (very preliminary version): "Allows to boot to a previous version of the system after configuration changes or software upgrades". But likely @mvidner or @shundhammer can help better. My point is that I will explain nothing about the root volume and that stuff. I would likely not mention the impact in size either, since the "auto-size" thingy should already make that obvious.

@joseivanlopez
Copy link
Contributor

We already have a short explanation in the filesystem selector: "Allows rolling back any change done to the system and restoring its previous state", see https://github.com/openSUSE/agama/blob/master/web/src/components/storage/VolumeForm.jsx#L212.

Maybe we could reuse it.

@jreidinger

This comment was marked as outdated.

@ancorgs
Copy link
Contributor

ancorgs commented Feb 15, 2024

About the translation from settings to UI that was being discussed on IRC:

  • Whether snapshots are enabled or not is dictated by the property Snapshots of the root volume.
  • Whether the user can change the default value of that property or not is dictated by the property SnapshotsConfigurable of the outline corresponding to the root volume.

So:

If Snapshots is true and SnapshotsConfigurable is false, then the property Filesystem is surely set to "btrfs" (otherwise the product settings make no sense) and snapshots are mandatory. Not sure how to represent that in the UI, I guess the switcher makes no sense and a sentence should be presented instead.

If Snapshots is false and SnapshotsConfigurable is false, then it's impossible to configure snapshots. Not sure how to represent that in the UI, I guess the switcher makes no sense and we should likely show nothing regarding snapshots. Anyways, this case is theoretical.

Last but not least, if SnapshotsConfigurable is true the switcher is there and allows to:

  • Select true:
    • Sets Snapshots to true for the root volume
    • Sets the fstype of the root volume to btrfs
    • Gives not option to change the fstype in the edit form of the root volume. Instead it shows a sentence like "Btrfs with snapshots" or "Using btrfs to provide snapshots" or something similar.
  • Select false:
    • Sets Snapshots to false for the root volume
    • In the edit form of the root volume, allows to use any of the values specified at the property Filesystems of the outline corresponding to the root volume. Of course, "btrfs with snapshots" is not an option there.

As a cherry on top, during a recent conversation with @dgdavid we concluded the explanation could be extended a bit to "Uses btrfs for the root file system allowing to boot to a previous version of the system after configuration changes or software upgrades".

const initialChecked = rootVolume !== undefined && rootVolume.fsType === "Btrfs" && rootVolume.snapshots;
const [isChecked, setIsChecked] = useState(initialChecked);

if (rootVolume === undefined) { // no root volume is probably some error or still loading
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NP: I think it is better putting the comment in the line above

} else { // strange situation, should not happen
return (<></>);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since React 18, this is no longer needed.

Now React allows returning undefined, and this is the default return value from a JavaScript function when you returns nothing. See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function#description.

web/src/components/storage/ProposalSettingsSection.jsx Outdated Show resolved Hide resolved
@jreidinger jreidinger force-pushed the global_snapshots branch 9 times, most recently from d2fa735 to 3aa43e0 Compare February 16, 2024 22:14
@jreidinger

This comment was marked as resolved.

@jreidinger jreidinger marked this pull request as ready for review February 26, 2024 18:27
Copy link
Contributor

@dgdavid dgdavid left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In general changes looks good. Just a few minor comments.

Regard to screenshots in the PR description, as agreed in IRC we can go ahead without updating them to the latest changes introduced in #1045.

}) => {
const rootVolume = (settings.volumes || []).find((i) => i.mountPath === "/");

const initialChecked = rootVolume !== undefined && rootVolume.fsType === "Btrfs" && rootVolume.snapshots;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not for now, but I think we should go for something similar to https://github.com/openSUSE/agama/blob/76c930c06e1ea4bb24fa11c023cd9a94e09337fd/web/src/client/storage.js#L55-L58 for having the Fstypes in a "constant".

const forcedSnapshots = !configurableSnapshots && rootVolume.fsType === "Btrfs" && rootVolume.snapshots;

const SnapshotsToggle = () => {
const explanation = _("Uses btrfs for the root file system allowing to boot to a previous version of the system after configuration changes or software upgrades.");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thinking it twice, the second point can be postponed for another PR in which we should extract that Description component wrapping the span with dangerousSetInnerHTML attribute. Using a meaningful name, of course.

@ancorgs, ^^^

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeap, having in translatable string html tags is definitively something nice....changing name will happen in few minutes

@@ -237,11 +296,28 @@ export default function ProposalSettingsSection({
onChange({ encryptionPassword: password, encryptionMethod: method });
};

const changeBtrfsSnapshots = ({ value, settings }) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NP: I'd use active instead of value.

@dgdavid
Copy link
Contributor

dgdavid commented Feb 26, 2024

Also, do not forget to add an entry in the .changes file

Copy link
Contributor

@dgdavid dgdavid left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

web/src/components/storage/utils.js Outdated Show resolved Hide resolved
web/src/components/storage/utils.test.js Outdated Show resolved Hide resolved
Copy link
Contributor

@ancorgs ancorgs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@jreidinger jreidinger merged commit 2244bab into master Feb 28, 2024
2 checks passed
@jreidinger jreidinger deleted the global_snapshots branch February 28, 2024 09:04
@imobachgs imobachgs mentioned this pull request May 17, 2024
imobachgs added a commit that referenced this pull request May 17, 2024
Prepare for releasing Agama 8. It includes the following pull requests:

* #884
* #886
* #914
* #918
* #956
* #957
* #958
* #959
* #960
* #961
* #962
* #963
* #964
* #965
* #966
* #969
* #970
* #976
* #977
* #978
* #979
* #980
* #981
* #983
* #984
* #985
* #986
* #988
* #991
* #992
* #995
* #996
* #997
* #999
* #1003
* #1004
* #1006
* #1007
* #1008
* #1009
* #1010
* #1011
* #1012
* #1014
* #1015
* #1016
* #1017
* #1020
* #1022
* #1023
* #1024
* #1025
* #1027
* #1028
* #1029
* #1030
* #1031
* #1032
* #1033
* #1034
* #1035
* #1036
* #1038
* #1039
* #1041
* #1042
* #1043
* #1045
* #1046
* #1047
* #1048
* #1052
* #1054
* #1056
* #1057
* #1060
* #1061
* #1062
* #1063
* #1064
* #1066
* #1067
* #1068
* #1069
* #1071
* #1072
* #1073
* #1074
* #1075
* #1079
* #1080
* #1081
* #1082
* #1085
* #1086
* #1087
* #1088
* #1089
* #1090
* #1091
* #1092
* #1093
* #1094
* #1095
* #1096
* #1097
* #1098
* #1099
* #1100
* #1102
* #1103
* #1104
* #1105
* #1106
* #1109
* #1110
* #1111
* #1112
* #1114
* #1116
* #1117
* #1118
* #1119
* #1120
* #1121
* #1122
* #1123
* #1125
* #1126
* #1127
* #1128
* #1129
* #1130
* #1131
* #1132
* #1133
* #1134
* #1135
* #1136
* #1138
* #1139
* #1140
* #1141
* #1142
* #1143
* #1144
* #1145
* #1146
* #1147
* #1148
* #1149
* #1151
* #1152
* #1153
* #1154
* #1155
* #1156
* #1157
* #1158
* #1160
* #1161
* #1162
* #1163
* #1164
* #1165
* #1166
* #1167
* #1168
* #1169
* #1170
* #1171
* #1172
* #1173
* #1174
* #1175
* #1177
* #1178
* #1180
* #1181
* #1182
* #1183
* #1184
* #1185
* #1187
* #1188
* #1189
* #1190
* #1191
* #1192
* #1193
* #1194
* #1195
* #1196
* #1198
* #1199
* #1200
* #1201
* #1203
* #1204
* #1205
* #1206
* #1207
* #1208
* #1209
* #1210
* #1211
* #1212
* #1213
* #1214
* #1215
* #1216
* #1217
* #1219
* #1220
* #1221
* #1222
* #1223
* #1224
* #1225
* #1226
* #1227
* #1229
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants