mirror of
https://github.com/siderolabs/talos.git
synced 2025-10-10 15:11:15 +02:00
Fixes #4815 This implements the following steps: * machine configuration updates * pulling and unpacking system extension images * validating, listing system extensions * re-packing system extensions * preserving installed extensions in `/etc/extensions.yaml` Once extension is enabled, raw information can be queried with: ``` $ talosctl -n 172.20.0.2 cat /etc/extensions.yaml layers: - image: 000.ghcr.io-smira-gvisor-c927b54-dirty.sqsh metadata: name: gvisor version: 20220117.0-v1.0.0 author: Andrew Rynhard description: | This system extension provides gVisor using containerd's runtime handler. compatibility: talos: version: '> v0.15.0-alpha.1' ``` This was tested with the `gvisor` system extension. Signed-off-by: Andrey Smirnov <andrey.smirnov@talos-systems.com>
48 lines
1.0 KiB
Go
48 lines
1.0 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 extensions
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"sort"
|
|
)
|
|
|
|
// List prepared unpacked extensions under rootPath.
|
|
func List(rootPath string) ([]*Extension, error) {
|
|
items, err := os.ReadDir(rootPath)
|
|
if err != nil {
|
|
if os.IsNotExist(err) {
|
|
return nil, nil
|
|
}
|
|
|
|
return nil, err
|
|
}
|
|
|
|
if len(items) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
sort.Slice(items, func(i, j int) bool { return items[i].Name() < items[j].Name() })
|
|
|
|
result := make([]*Extension, 0, len(items))
|
|
|
|
for _, item := range items {
|
|
if !item.IsDir() {
|
|
return nil, fmt.Errorf("unexpected non-directory entry: %q", item.Name())
|
|
}
|
|
|
|
ext, err := Load(filepath.Join(rootPath, item.Name()))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error loading extension %s: %w", item.Name(), err)
|
|
}
|
|
|
|
result = append(result, ext)
|
|
}
|
|
|
|
return result, nil
|
|
}
|