talos/internal/pkg/cache/cache.go
Noel Georgi 939c555f9a
fix: imager disk image-cache generator
Move things around so `talosctl` is not dependent on `go-blockdevice`.

Signed-off-by: Noel Georgi <git@frezbo.dev>
2024-11-26 21:47:08 +05:30

60 lines
1.6 KiB
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// Package cache provides methods to install an image cache
package cache
import (
"fmt"
"os"
"github.com/siderolabs/go-blockdevice/v2/blkid"
"github.com/siderolabs/go-copy/copy"
"github.com/siderolabs/talos/internal/app/machined/pkg/runtime/v1alpha1/bootloader/mount"
"github.com/siderolabs/talos/internal/pkg/partition"
"github.com/siderolabs/talos/pkg/machinery/constants"
)
// InstallOptions contains the options for installing the cache.
type InstallOptions struct {
// The disk where cache partition is present.
CacheDisk string
// Source of the cache from where it will be copied.
CachePath string
// Optional: blkid probe result.
BlkidInfo *blkid.Info
}
// Install installs the cache to the given disk.
func (i *InstallOptions) Install() error {
tempMountDir, err := os.MkdirTemp("", "talos-image-cache-install")
if err != nil {
return fmt.Errorf("creating temporary directory for talos-image-cache-install: %w", err)
}
defer os.RemoveAll(tempMountDir) //nolint:errcheck
return mount.PartitionOp(
i.CacheDisk,
[]mount.Spec{
{
PartitionLabel: constants.ImageCachePartitionLabel,
FilesystemType: partition.FileSystemTypeExt4,
MountTarget: tempMountDir,
},
},
func() error {
return copy.Dir(i.CachePath, tempMountDir)
},
[]blkid.ProbeOption{
// installation happens with locked blockdevice
blkid.WithSkipLocking(true),
},
nil,
nil,
i.BlkidInfo,
)
}