Skip to content

Commit 3b30cbf

Browse files
committed
Option to upgrade packages and reboot if required
This will run "apt upgrade" or "dnf upgrade" on the first boot, to make sure that all packages are updated to the latest version. It adds to the initial startup time and to the size of the diffdisk, so it is better to update the basedisk with a newer cloud release. Signed-off-by: Anders F Björklund <anders.f.bjorklund@gmail.com>
1 parent 5c2ccc1 commit 3b30cbf

File tree

8 files changed

+42
-0
lines changed

8 files changed

+42
-0
lines changed

examples/default.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,11 @@ caCerts:
166166
# YOUR-ORGS-TRUSTED-CA-CERT-HERE
167167
# -----END CERTIFICATE-----
168168

169+
# Upgrade the instance on first boot
170+
# Reboot after upgrade if required
171+
# 🟢 Builtin default: false
172+
upgradePackages: null
173+
169174
containerd:
170175
# Enable system-wide (aka rootful) containerd and its dependencies (BuildKit, Stargz Snapshotter)
171176
# Note that `nerdctl.lima` only works in rootless mode; you have to use `lima sudo nerdctl ...`
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#!/bin/sh
2+
set -eux
3+
4+
# Check if cloud-init forgot to reboot_if_required
5+
# (only implemented for apt at the moment, not dnf)
6+
7+
if command -v dnf >/dev/null 2>&1; then
8+
# dnf-utils needs to be installed, for needs-restarting
9+
if dnf needs-restarting -h >/dev/null 2>&1; then
10+
# needs-restarting returns "false" if needed (!)
11+
if ! dnf needs-restarting -r >/dev/null 2>&1; then
12+
systemctl reboot
13+
fi
14+
fi
15+
fi

pkg/cidata/cidata.TEMPLATE.d/user-data

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ growpart:
55
mode: auto
66
devices: ['/']
77

8+
{{- if .UpgradePackages }}
9+
package_update: true
10+
package_upgrade: true
11+
package_reboot_if_required: true
12+
{{- end }}
13+
814
{{- if or (eq .MountType "9p") (eq .MountType "virtiofs") }}
915
{{- if .Mounts }}
1016
mounts:

pkg/cidata/cidata.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ func GenerateISO9660(instDir, name string, y *limayaml.LimaYAML, udpDNSLocalPort
128128
UID: uid,
129129
Home: fmt.Sprintf("/home/%s.linux", u.Username),
130130
GuestInstallPrefix: *y.GuestInstallPrefix,
131+
UpgradePackages: *y.UpgradePackages,
131132
Containerd: Containerd{System: *y.Containerd.System, User: *y.Containerd.User},
132133
SlirpNICName: networks.SlirpNICName,
133134

pkg/cidata/template.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ type TemplateArgs struct {
6363
MountType string
6464
Disks []Disk
6565
GuestInstallPrefix string
66+
UpgradePackages bool
6667
Containerd Containerd
6768
Networks []Network
6869
SlirpNICName string

pkg/limayaml/defaults.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,16 @@ func FillDefault(y, d, o *LimaYAML, filePath string) {
444444
y.GuestInstallPrefix = ptr.Of(defaultGuestInstallPrefix())
445445
}
446446

447+
if y.UpgradePackages == nil {
448+
y.UpgradePackages = d.UpgradePackages
449+
}
450+
if o.UpgradePackages != nil {
451+
y.UpgradePackages = o.UpgradePackages
452+
}
453+
if y.UpgradePackages == nil {
454+
y.UpgradePackages = ptr.Of(false)
455+
}
456+
447457
if y.Containerd.System == nil {
448458
y.Containerd.System = d.Containerd.System
449459
}

pkg/limayaml/defaults_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ func TestFillDefault(t *testing.T) {
7373
Memory: ptr.Of(defaultMemoryAsString()),
7474
Disk: ptr.Of(defaultDiskSizeAsString()),
7575
GuestInstallPrefix: ptr.Of(defaultGuestInstallPrefix()),
76+
UpgradePackages: ptr.Of(false),
7677
Containerd: Containerd{
7778
System: ptr.Of(false),
7879
User: ptr.Of(true),
@@ -309,6 +310,7 @@ func TestFillDefault(t *testing.T) {
309310
{Name: "data"},
310311
},
311312
GuestInstallPrefix: ptr.Of("/opt"),
313+
UpgradePackages: ptr.Of(true),
312314
Containerd: Containerd{
313315
System: ptr.Of(true),
314316
User: ptr.Of(false),
@@ -498,6 +500,7 @@ func TestFillDefault(t *testing.T) {
498500
{Name: "test"},
499501
},
500502
GuestInstallPrefix: ptr.Of("/usr"),
503+
UpgradePackages: ptr.Of(true),
501504
Containerd: Containerd{
502505
System: ptr.Of(true),
503506
User: ptr.Of(false),

pkg/limayaml/limayaml.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type LimaYAML struct {
2323
Audio Audio `yaml:"audio,omitempty" json:"audio,omitempty"`
2424
Video Video `yaml:"video,omitempty" json:"video,omitempty"`
2525
Provision []Provision `yaml:"provision,omitempty" json:"provision,omitempty"`
26+
UpgradePackages *bool `yaml:"upgradePackages,omitempty" json:"upgradePackages,omitempty"`
2627
Containerd Containerd `yaml:"containerd,omitempty" json:"containerd,omitempty"`
2728
GuestInstallPrefix *string `yaml:"guestInstallPrefix,omitempty" json:"guestInstallPrefix,omitempty"`
2829
Probes []Probe `yaml:"probes,omitempty" json:"probes,omitempty"`

0 commit comments

Comments
 (0)